[FIX] website_sale_aplicoop: invalidate stale carts on closed group orders

This commit is contained in:
snt 2026-03-30 17:39:15 +02:00
parent 89c008441e
commit c345699bf4
4 changed files with 329 additions and 23 deletions

View file

@ -1372,6 +1372,21 @@ class AplicoopWebsiteSale(WebsiteSale):
raise ValueError(f"Invalid JSON: {str(e)}") from e
return data
def _build_group_order_unavailable_response(self, group_order, status=403):
"""Build a consistent JSON response when a group order is not open."""
return request.make_response(
json.dumps(
{
"error": request.env._("Order is not available"),
"code": "group_order_not_open",
"order_state": group_order.state if group_order else False,
"action": "clear_cart",
}
),
[("Content-Type", "application/json")],
status=status,
)
def _find_recent_draft_order(self, partner_id, order_id):
"""Find most recent draft sale.order for partner and group_order in current week.
@ -2018,6 +2033,66 @@ class AplicoopWebsiteSale(WebsiteSale):
"website_sale_aplicoop.eskaera_checkout", template_context
)
@http.route(
["/eskaera/check-status"],
type="http",
auth="user",
website=True,
methods=["POST"],
csrf=False,
)
def check_group_order_status(self, **post):
"""Return status information for a group.order.
Intended for frontend proactive cart invalidation when the order
changed state between visits.
"""
try:
data = self._decode_json_body()
except ValueError as e:
return request.make_response(
json.dumps({"error": str(e)}),
[("Content-Type", "application/json")],
status=400,
)
order_id = data.get("order_id")
if not order_id:
return request.make_response(
json.dumps({"error": "order_id is required"}),
[("Content-Type", "application/json")],
status=400,
)
try:
order_id = int(order_id)
except (TypeError, ValueError):
return request.make_response(
json.dumps({"error": f"Invalid order_id format: {order_id}"}),
[("Content-Type", "application/json")],
status=400,
)
group_order = request.env["group.order"].sudo().browse(order_id)
if not group_order.exists():
return request.make_response(
json.dumps({"error": f"Order {order_id} not found"}),
[("Content-Type", "application/json")],
status=404,
)
response_data = {
"success": True,
"order_id": group_order.id,
"state": group_order.state,
"is_open": group_order.state == "open",
"action": "clear_cart" if group_order.state != "open" else "none",
}
return request.make_response(
json.dumps(response_data),
[("Content-Type", "application/json")],
)
@http.route(
["/eskaera/save-cart"],
type="http",
@ -2068,6 +2143,9 @@ class AplicoopWebsiteSale(WebsiteSale):
status=400,
)
if group_order.state != "open":
return self._build_group_order_unavailable_response(group_order)
current_user = request.env.user
if not current_user.partner_id:
return request.make_response(
@ -2188,6 +2266,9 @@ class AplicoopWebsiteSale(WebsiteSale):
status=400,
)
if group_order.state != "open":
return self._build_group_order_unavailable_response(group_order)
current_user = request.env.user
if not current_user.partner_id:
return request.make_response(
@ -2343,6 +2424,9 @@ class AplicoopWebsiteSale(WebsiteSale):
status=400,
)
if group_order.state != "open":
return self._build_group_order_unavailable_response(group_order)
current_user = request.env.user
# Validate that the user has a partner_id