[FIX] website_sale_aplicoop: fix home delivery draft flow

This commit is contained in:
snt 2026-04-08 00:07:43 +02:00
parent 135967019e
commit e9809b90e9
2 changed files with 33 additions and 124 deletions

View file

@ -892,8 +892,8 @@ class AplicoopWebsiteSale(WebsiteSale):
if not items:
raise ValueError("No items in cart")
# Get delivery flag
is_delivery = data.get("is_delivery", False)
# Get delivery flag (normalize to strict boolean)
is_delivery = self._to_bool(data.get("is_delivery", False))
_logger.info(
"_validate_confirm_json: Valid request for order %d with %d items (is_delivery=%s)",
@ -904,6 +904,23 @@ class AplicoopWebsiteSale(WebsiteSale):
return order_id, group_order, current_user, items, is_delivery
def _to_bool(self, value):
"""Convert common JSON/form boolean representations to bool.
Accepts booleans, numeric values and common string variants.
"""
if isinstance(value, bool):
return value
if isinstance(value, (int, float)):
return value != 0
if isinstance(value, str):
normalized = value.strip().lower()
if normalized in {"1", "true", "t", "yes", "y", "on"}:
return True
if normalized in {"0", "false", "f", "no", "n", "off", ""}:
return False
return bool(value)
def _process_cart_items(self, items, group_order, pricelist=None):
"""Process cart items and build sale.order line data.
@ -1351,6 +1368,7 @@ class AplicoopWebsiteSale(WebsiteSale):
sale_order_lines,
existing_drafts,
order_id,
is_delivery=False,
):
"""Replace existing draft (if any) with new lines, else create it.
@ -1370,11 +1388,9 @@ class AplicoopWebsiteSale(WebsiteSale):
consumer_group_id,
)
# commitment_date comes directly from group_order
# commitment_date comes directly from selected flow
commitment_date = (
group_order.delivery_date
if group_order.home_delivery
else group_order.pickup_date
group_order.delivery_date if is_delivery else group_order.pickup_date
)
if existing_drafts:
@ -1390,7 +1406,7 @@ class AplicoopWebsiteSale(WebsiteSale):
"group_order_id": order_id,
"pickup_day": group_order.pickup_day,
"pickup_date": group_order.pickup_date,
"home_delivery": group_order.home_delivery,
"home_delivery": is_delivery,
"consumer_group_id": consumer_group_id,
"commitment_date": commitment_date,
}
@ -1404,7 +1420,7 @@ class AplicoopWebsiteSale(WebsiteSale):
"group_order_id": order_id,
"pickup_day": group_order.pickup_day,
"pickup_date": group_order.pickup_date,
"home_delivery": group_order.home_delivery,
"home_delivery": is_delivery,
"consumer_group_id": consumer_group_id,
"commitment_date": commitment_date,
}
@ -2615,6 +2631,7 @@ class AplicoopWebsiteSale(WebsiteSale):
# Get cart items
items = data.get("items", [])
is_delivery = self._to_bool(data.get("is_delivery", False))
if not items:
_logger.warning(
@ -2658,6 +2675,7 @@ class AplicoopWebsiteSale(WebsiteSale):
sale_order_lines,
existing_drafts,
order_id,
is_delivery=is_delivery,
)
_logger.info(
@ -2777,9 +2795,9 @@ class AplicoopWebsiteSale(WebsiteSale):
# If delivery, use delivery_date; otherwise use pickup_date
commitment_date = None
if is_delivery and group_order.delivery_date:
commitment_date = group_order.delivery_date.isoformat()
commitment_date = group_order.delivery_date
elif group_order.pickup_date:
commitment_date = group_order.pickup_date.isoformat()
commitment_date = group_order.pickup_date
# Create or update sale.order using helper
sale_order = self._create_or_update_sale_order(

View file

@ -1737,6 +1737,11 @@
items: items,
};
var deliveryCheckbox = document.getElementById("home-delivery-checkbox");
if (deliveryCheckbox) {
orderData.is_delivery = !!deliveryCheckbox.checked;
}
var xhr = new XMLHttpRequest();
xhr.open("POST", "/eskaera/save-order", true);
xhr.setRequestHeader("Content-Type", "application/json");
@ -1795,120 +1800,6 @@
xhr.send(JSON.stringify(orderData));
},
_confirmOrder: function () {
console.log("=== _confirmOrder started ===");
console.log("orderId:", this.orderId);
// IMPORTANT: Read cart directly from localStorage, not from this.cart
// because home_delivery.js updates localStorage directly
var cartKey = "eskaera_" + this.orderId + "_cart";
var storedCart = localStorage.getItem(cartKey);
console.log("localStorage[" + cartKey + "]:", storedCart);
// Parse cart from localStorage (more reliable than this.cart)
var cart = storedCart ? JSON.parse(storedCart) : this.cart;
console.log("Parsed cart from localStorage:", cart);
var self = this;
var items = [];
Object.keys(cart).forEach(function (productId) {
var item = cart[productId];
console.log("Processing cart item: productId=" + productId + ", item=", item);
items.push({
product_id: productId,
product_name: item.name,
quantity: item.qty,
unit_price: item.price,
});
});
console.log("Items to send to server:", items);
console.log("Total items count:", items.length);
// Check if home delivery is enabled
var deliveryCheckbox = document.getElementById("home-delivery-checkbox");
var isDelivery = deliveryCheckbox ? deliveryCheckbox.checked : false;
var orderData = {
order_id: this.orderId,
items: items,
is_delivery: isDelivery,
};
var xhr = new XMLHttpRequest();
xhr.open("POST", "/eskaera/confirm", true);
xhr.setRequestHeader("Content-Type", "application/json");
console.log("Sending request to /eskaera/confirm with data:", orderData);
xhr.onload = function () {
if (xhr.status === 200) {
try {
var data = JSON.parse(xhr.responseText);
console.log("Response:", data);
var labels = self._getLabels();
if (data.success) {
var message =
data.message || labels.order_confirmed || "Order confirmed";
self._showNotification("✓ " + message, "success", 4000);
// Clear cart from localStorage
localStorage.removeItem("eskaera_" + self.orderId + "_cart");
console.log("Cart cleared from localStorage after confirmation");
// Save confirmation message in sessionStorage to display on eskaera page
sessionStorage.setItem("confirmation_message", message);
// Wait a moment before redirecting to let user see the message
setTimeout(function () {
window.location.href = data.redirect_url || "/eskaera";
}, 4000);
} else {
var unknownErrorMsg =
labels.error_unknown || labels.error_unknown || "Unknown error";
self._showNotification(
"Error: " + (data.error || unknownErrorMsg),
"danger"
);
}
} catch (e) {
console.error("Error parsing response:", e);
var labels = self._getLabels();
self._showNotification(
labels.error_processing_response || "Error processing response",
"danger"
);
}
} else {
if (self._isClosedOrderResponse(xhr)) {
self._clearCurrentOrderCartSilently();
self._updateCartDisplay();
return;
}
try {
var errorData = JSON.parse(xhr.responseText);
console.error("HTTP error:", xhr.status, errorData);
self._showNotification(
"Error " + xhr.status + ": " + (errorData.error || "Request error"),
"danger"
);
} catch (e) {
console.error("HTTP error:", xhr.status, xhr.responseText);
self._showNotification(
"Error confirming order (HTTP " + xhr.status + ")",
"danger"
);
}
}
};
xhr.onerror = function () {
console.error("Error:", xhr);
var labels = self._getLabels();
self._showNotification(labels.connection_error || "Connection error", "danger");
};
xhr.send(JSON.stringify(orderData));
},
escapeHtml: function (text) {
var div = document.createElement("div");
div.textContent = text;