diff --git a/website_sale_aplicoop/controllers/website_sale.py b/website_sale_aplicoop/controllers/website_sale.py index 7da04ec..e7c1503 100644 --- a/website_sale_aplicoop/controllers/website_sale.py +++ b/website_sale_aplicoop/controllers/website_sale.py @@ -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( diff --git a/website_sale_aplicoop/static/src/js/website_sale.js b/website_sale_aplicoop/static/src/js/website_sale.js index 545ef99..9e194a6 100644 --- a/website_sale_aplicoop/static/src/js/website_sale.js +++ b/website_sale_aplicoop/static/src/js/website_sale.js @@ -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;