[FIX] website_sale_aplicoop: fix home delivery draft flow
This commit is contained in:
parent
135967019e
commit
e9809b90e9
2 changed files with 33 additions and 124 deletions
|
|
@ -892,8 +892,8 @@ class AplicoopWebsiteSale(WebsiteSale):
|
||||||
if not items:
|
if not items:
|
||||||
raise ValueError("No items in cart")
|
raise ValueError("No items in cart")
|
||||||
|
|
||||||
# Get delivery flag
|
# Get delivery flag (normalize to strict boolean)
|
||||||
is_delivery = data.get("is_delivery", False)
|
is_delivery = self._to_bool(data.get("is_delivery", False))
|
||||||
|
|
||||||
_logger.info(
|
_logger.info(
|
||||||
"_validate_confirm_json: Valid request for order %d with %d items (is_delivery=%s)",
|
"_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
|
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):
|
def _process_cart_items(self, items, group_order, pricelist=None):
|
||||||
"""Process cart items and build sale.order line data.
|
"""Process cart items and build sale.order line data.
|
||||||
|
|
||||||
|
|
@ -1351,6 +1368,7 @@ class AplicoopWebsiteSale(WebsiteSale):
|
||||||
sale_order_lines,
|
sale_order_lines,
|
||||||
existing_drafts,
|
existing_drafts,
|
||||||
order_id,
|
order_id,
|
||||||
|
is_delivery=False,
|
||||||
):
|
):
|
||||||
"""Replace existing draft (if any) with new lines, else create it.
|
"""Replace existing draft (if any) with new lines, else create it.
|
||||||
|
|
||||||
|
|
@ -1370,11 +1388,9 @@ class AplicoopWebsiteSale(WebsiteSale):
|
||||||
consumer_group_id,
|
consumer_group_id,
|
||||||
)
|
)
|
||||||
|
|
||||||
# commitment_date comes directly from group_order
|
# commitment_date comes directly from selected flow
|
||||||
commitment_date = (
|
commitment_date = (
|
||||||
group_order.delivery_date
|
group_order.delivery_date if is_delivery else group_order.pickup_date
|
||||||
if group_order.home_delivery
|
|
||||||
else group_order.pickup_date
|
|
||||||
)
|
)
|
||||||
|
|
||||||
if existing_drafts:
|
if existing_drafts:
|
||||||
|
|
@ -1390,7 +1406,7 @@ class AplicoopWebsiteSale(WebsiteSale):
|
||||||
"group_order_id": order_id,
|
"group_order_id": order_id,
|
||||||
"pickup_day": group_order.pickup_day,
|
"pickup_day": group_order.pickup_day,
|
||||||
"pickup_date": group_order.pickup_date,
|
"pickup_date": group_order.pickup_date,
|
||||||
"home_delivery": group_order.home_delivery,
|
"home_delivery": is_delivery,
|
||||||
"consumer_group_id": consumer_group_id,
|
"consumer_group_id": consumer_group_id,
|
||||||
"commitment_date": commitment_date,
|
"commitment_date": commitment_date,
|
||||||
}
|
}
|
||||||
|
|
@ -1404,7 +1420,7 @@ class AplicoopWebsiteSale(WebsiteSale):
|
||||||
"group_order_id": order_id,
|
"group_order_id": order_id,
|
||||||
"pickup_day": group_order.pickup_day,
|
"pickup_day": group_order.pickup_day,
|
||||||
"pickup_date": group_order.pickup_date,
|
"pickup_date": group_order.pickup_date,
|
||||||
"home_delivery": group_order.home_delivery,
|
"home_delivery": is_delivery,
|
||||||
"consumer_group_id": consumer_group_id,
|
"consumer_group_id": consumer_group_id,
|
||||||
"commitment_date": commitment_date,
|
"commitment_date": commitment_date,
|
||||||
}
|
}
|
||||||
|
|
@ -2615,6 +2631,7 @@ class AplicoopWebsiteSale(WebsiteSale):
|
||||||
|
|
||||||
# Get cart items
|
# Get cart items
|
||||||
items = data.get("items", [])
|
items = data.get("items", [])
|
||||||
|
is_delivery = self._to_bool(data.get("is_delivery", False))
|
||||||
|
|
||||||
if not items:
|
if not items:
|
||||||
_logger.warning(
|
_logger.warning(
|
||||||
|
|
@ -2658,6 +2675,7 @@ class AplicoopWebsiteSale(WebsiteSale):
|
||||||
sale_order_lines,
|
sale_order_lines,
|
||||||
existing_drafts,
|
existing_drafts,
|
||||||
order_id,
|
order_id,
|
||||||
|
is_delivery=is_delivery,
|
||||||
)
|
)
|
||||||
|
|
||||||
_logger.info(
|
_logger.info(
|
||||||
|
|
@ -2777,9 +2795,9 @@ class AplicoopWebsiteSale(WebsiteSale):
|
||||||
# If delivery, use delivery_date; otherwise use pickup_date
|
# If delivery, use delivery_date; otherwise use pickup_date
|
||||||
commitment_date = None
|
commitment_date = None
|
||||||
if is_delivery and group_order.delivery_date:
|
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:
|
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
|
# Create or update sale.order using helper
|
||||||
sale_order = self._create_or_update_sale_order(
|
sale_order = self._create_or_update_sale_order(
|
||||||
|
|
|
||||||
|
|
@ -1737,6 +1737,11 @@
|
||||||
items: items,
|
items: items,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
var deliveryCheckbox = document.getElementById("home-delivery-checkbox");
|
||||||
|
if (deliveryCheckbox) {
|
||||||
|
orderData.is_delivery = !!deliveryCheckbox.checked;
|
||||||
|
}
|
||||||
|
|
||||||
var xhr = new XMLHttpRequest();
|
var xhr = new XMLHttpRequest();
|
||||||
xhr.open("POST", "/eskaera/save-order", true);
|
xhr.open("POST", "/eskaera/save-order", true);
|
||||||
xhr.setRequestHeader("Content-Type", "application/json");
|
xhr.setRequestHeader("Content-Type", "application/json");
|
||||||
|
|
@ -1795,120 +1800,6 @@
|
||||||
xhr.send(JSON.stringify(orderData));
|
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) {
|
escapeHtml: function (text) {
|
||||||
var div = document.createElement("div");
|
var div = document.createElement("div");
|
||||||
div.textContent = text;
|
div.textContent = text;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue