Compare commits

..

No commits in common. "27097004fb103bf666aebdc164635e4f0e3cea1d" and "9d614ed79eb640930836da99432007e4de8ad6d7" have entirely different histories.

6 changed files with 6 additions and 318 deletions

View file

@ -806,30 +806,6 @@
}); });
} }
// On checkout page: apply sessionStorage delivery preference to checkbox.
// The shop-page toggle may have stored a "false" preference even though
// the checkbox is checked by default in the template.
var checkoutCheckbox = document.getElementById("home-delivery-checkbox");
if (checkoutCheckbox) {
var storedDeliveryPref = sessionStorage.getItem(
"eskaera_is_delivery_" + self.orderId
);
if (storedDeliveryPref !== null) {
checkoutCheckbox.checked = storedDeliveryPref === "true";
console.log(
"[CHECKOUT] Restored delivery checkbox from sessionStorage:",
checkoutCheckbox.checked
);
}
// Sync sessionStorage when user manually changes the checkbox
checkoutCheckbox.addEventListener("change", function () {
sessionStorage.setItem(
"eskaera_is_delivery_" + self.orderId,
this.checked ? "true" : "false"
);
});
}
// Button to reload from draft (in My Cart header - cart pages) // Button to reload from draft (in My Cart header - cart pages)
var reloadCartBtn = document.getElementById("reload-cart-btn"); var reloadCartBtn = document.getElementById("reload-cart-btn");
console.log("[_attachEventListeners] reload-cart-btn found:", !!reloadCartBtn); console.log("[_attachEventListeners] reload-cart-btn found:", !!reloadCartBtn);
@ -854,28 +830,6 @@
}); });
} }
// Home-delivery toggle button (shop sidebar)
var homeDeliveryBtn = document.getElementById("home-delivery-btn");
if (homeDeliveryBtn) {
// Restore persisted preference on page load
var storedDelivery = sessionStorage.getItem(
"eskaera_is_delivery_" + self.orderId
);
if (storedDelivery === "true") {
homeDeliveryBtn.classList.add("active");
}
homeDeliveryBtn.addEventListener("click", function (e) {
e.preventDefault();
var isNowActive = !homeDeliveryBtn.classList.contains("active");
homeDeliveryBtn.classList.toggle("active", isNowActive);
sessionStorage.setItem(
"eskaera_is_delivery_" + self.orderId,
isNowActive ? "true" : "false"
);
console.log("[HOME_DELIVERY_BTN] toggled to:", isNowActive);
});
}
// Buttons to clear cart (header + footer) // Buttons to clear cart (header + footer)
var clearCartBtns = [ var clearCartBtns = [
document.getElementById("clear-cart-btn"), document.getElementById("clear-cart-btn"),
@ -1599,17 +1553,6 @@
merge_action: "replace", merge_action: "replace",
}; };
// Include delivery preference: read from toggle button state,
// falling back to the page-level home-delivery-enabled attribute.
var deliveryBtn = document.getElementById("home-delivery-btn");
if (deliveryBtn) {
orderData.is_delivery = deliveryBtn.classList.contains("active");
} else {
var wrap = document.getElementById("wrap");
var enabledAttr = wrap && wrap.getAttribute("data-home-delivery-enabled");
orderData.is_delivery = enabledAttr === "true";
}
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");

View file

@ -15,4 +15,3 @@ from . import test_pricing_with_pricelist # noqa: F401
from . import test_portal_sale_order_creation # noqa: F401 from . import test_portal_sale_order_creation # noqa: F401
from . import test_cron_picking_batch # noqa: F401 from . import test_cron_picking_batch # noqa: F401
from . import test_group_order_status_endpoint # noqa: F401 from . import test_group_order_status_endpoint # noqa: F401
from . import test_home_delivery # noqa: F401

View file

@ -1,232 +0,0 @@
# Copyright 2026 Criptomart
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl)
"""Tests for home_delivery auto-computation on group.order.
Covers:
- group.order.home_delivery derives from delivery_product_id
- Recomputes correctly when product is set/cleared
- sale.order.home_delivery is set when effective delivery is requested
- _get_effective_delivery_context honours the computed flag
"""
from datetime import timedelta
from odoo import fields
from odoo.tests.common import TransactionCase
from ..controllers.website_sale import AplicoopWebsiteSale
class TestHomeDeliveryCompute(TransactionCase):
"""Unit tests for group.order.home_delivery computed field."""
def setUp(self):
super().setUp()
self.group = self.env["res.partner"].create(
{
"name": "Delivery Test Group",
"is_company": True,
"is_group": True,
}
)
self.delivery_product = self.env["product.product"].create(
{
"name": "Home Delivery Service",
"type": "service",
"list_price": 3.5,
}
)
self._base_vals = {
"name": "Delivery Test Order",
"group_ids": [(6, 0, [self.group.id])],
"type": "regular",
"period": "weekly",
"pickup_day": "3",
"cutoff_day": "1",
"start_date": fields.Date.today(),
"end_date": fields.Date.today() + timedelta(days=14),
}
def _make_group_order(self, **extra):
vals = dict(self._base_vals, **extra)
return self.env["group.order"].create(vals)
# --- compute correctness ---
def test_home_delivery_true_when_product_set(self):
order = self._make_group_order(delivery_product_id=self.delivery_product.id)
self.assertTrue(
order.home_delivery,
"home_delivery should be True when delivery_product_id is set",
)
def test_home_delivery_false_without_product(self):
order = self._make_group_order()
self.assertFalse(
order.home_delivery,
"home_delivery should be False when no delivery_product_id",
)
def test_home_delivery_recomputes_when_product_set(self):
order = self._make_group_order()
self.assertFalse(order.home_delivery)
order.delivery_product_id = self.delivery_product.id
self.assertTrue(
order.home_delivery,
"home_delivery should recompute to True after setting delivery_product_id",
)
def test_home_delivery_recomputes_when_product_cleared(self):
order = self._make_group_order(delivery_product_id=self.delivery_product.id)
self.assertTrue(order.home_delivery)
order.delivery_product_id = False
self.assertFalse(
order.home_delivery,
"home_delivery should recompute to False after clearing delivery_product_id",
)
def test_direct_write_to_home_delivery_is_overridden_by_compute(self):
"""Writing home_delivery directly must not stick — compute wins."""
order = self._make_group_order()
# Attempt to set home_delivery=True without a product
order.home_delivery = True
order.invalidate_recordset()
self.assertFalse(
order.home_delivery,
"Computed field must override any direct write without a delivery product",
)
class TestHomeDeliveryEffectiveContext(TransactionCase):
"""Tests for _get_effective_delivery_context and sale.order.home_delivery."""
def setUp(self):
super().setUp()
self.group = self.env["res.partner"].create(
{
"name": "Ctx Test Group",
"is_company": True,
"is_group": True,
}
)
self.member_partner = self.env["res.partner"].create(
{"name": "Ctx Member", "email": "ctx@test.com"}
)
self.group.member_ids = [(4, self.member_partner.id)]
self.user = self.env["res.users"].create(
{
"name": "Ctx User",
"login": "ctx_user@test.com",
"email": "ctx_user@test.com",
"partner_id": self.member_partner.id,
}
)
self.delivery_product = self.env["product.product"].create(
{"name": "Delivery Svc", "type": "service", "list_price": 2.0}
)
today = fields.Date.today()
self.group_order_with_delivery = self.env["group.order"].create(
{
"name": "GO With Delivery",
"group_ids": [(6, 0, [self.group.id])],
"type": "regular",
"period": "weekly",
"pickup_day": "4",
"cutoff_day": "1",
"start_date": today,
"end_date": today + timedelta(days=14),
"delivery_product_id": self.delivery_product.id,
}
)
self.group_order_with_delivery.action_open()
self.group_order_no_delivery = self.env["group.order"].create(
{
"name": "GO No Delivery",
"group_ids": [(6, 0, [self.group.id])],
"type": "regular",
"period": "weekly",
"pickup_day": "4",
"cutoff_day": "1",
"start_date": today,
"end_date": today + timedelta(days=14),
}
)
self.group_order_no_delivery.action_open()
self.controller = AplicoopWebsiteSale()
# --- _get_effective_delivery_context ---
def test_delivery_enabled_when_product_configured_and_requested(self):
effective, _ = self.controller._get_effective_delivery_context(
self.group_order_with_delivery, is_delivery=True
)
self.assertTrue(
effective,
"Delivery should be effective when group order has delivery product and user requests it",
)
def test_delivery_disabled_when_product_configured_but_not_requested(self):
effective, _ = self.controller._get_effective_delivery_context(
self.group_order_with_delivery, is_delivery=False
)
self.assertFalse(
effective,
"Delivery should not be effective when user did not request it",
)
def test_delivery_disabled_when_no_product_even_if_requested(self):
effective, _ = self.controller._get_effective_delivery_context(
self.group_order_no_delivery, is_delivery=True
)
self.assertFalse(
effective,
"Delivery should not be effective when group order has no delivery product",
)
# --- sale.order.home_delivery propagation ---
def test_sale_order_home_delivery_set_when_delivery_requested(self):
"""sale.order.home_delivery must be True when group order has product and user requests delivery."""
order_vals = {
"partner_id": self.member_partner.id,
"group_order_id": self.group_order_with_delivery.id,
"pickup_day": self.group_order_with_delivery.pickup_day,
"pickup_date": self.group_order_with_delivery.pickup_date,
"home_delivery": True,
"order_line": [],
"state": "draft",
}
sale_order = self.env["sale.order"].sudo().create(order_vals)
self.assertTrue(
sale_order.home_delivery,
"sale.order.home_delivery should be True when group order has delivery enabled",
)
def test_sale_order_home_delivery_false_without_group_order_product(self):
"""sale.order.home_delivery must be False when group order has no delivery product."""
order_vals = {
"partner_id": self.member_partner.id,
"group_order_id": self.group_order_no_delivery.id,
"pickup_day": self.group_order_no_delivery.pickup_day,
"pickup_date": self.group_order_no_delivery.pickup_date,
"home_delivery": self.group_order_no_delivery.home_delivery,
"order_line": [],
"state": "draft",
}
sale_order = self.env["sale.order"].sudo().create(order_vals)
self.assertFalse(
sale_order.home_delivery,
"sale.order.home_delivery should be False when group order has no delivery product",
)

View file

@ -694,16 +694,6 @@ class TestConfirmEskaera_Integration(TransactionCase):
} }
) )
# Delivery service product — home_delivery on group.order is computed
# from delivery_product_id, so we must set the product to enable delivery.
self.delivery_product = self.env["product.product"].create(
{
"name": "Integration Delivery Svc",
"type": "service",
"list_price": 0.0,
}
)
# Create test group order # Create test group order
self.group_order = self.env["group.order"].create( self.group_order = self.env["group.order"].create(
{ {
@ -714,7 +704,7 @@ class TestConfirmEskaera_Integration(TransactionCase):
"end_date": date.today() + timedelta(days=7), "end_date": date.today() + timedelta(days=7),
"cutoff_day": "3", "cutoff_day": "3",
"pickup_day": "5", "pickup_day": "5",
"delivery_product_id": self.delivery_product.id, "home_delivery": True,
} }
) )

View file

@ -96,15 +96,6 @@ class TestSaveOrderEndpoints(TransactionCase):
} }
) )
# Delivery service product (required to enable home_delivery on group.order)
self.delivery_product = self.env["product.product"].create(
{
"name": "Home Delivery Service",
"type": "service",
"list_price": 3.0,
}
)
# Associate product with group order # Associate product with group order
self.group_order.product_ids = [(4, self.product.id)] self.group_order.product_ids = [(4, self.product.id)]
@ -215,8 +206,7 @@ class TestSaveOrderEndpoints(TransactionCase):
def test_save_eskaera_draft_propagates_home_delivery(self): def test_save_eskaera_draft_propagates_home_delivery(self):
"""Test that save_eskaera_draft() propagates home_delivery correctly.""" """Test that save_eskaera_draft() propagates home_delivery correctly."""
# Create a group order with home delivery enabled via delivery_product_id # Create a group order with home_delivery=True
# (home_delivery is a computed field derived from delivery_product_id)
group_order_home = self.env["group.order"].create( group_order_home = self.env["group.order"].create(
{ {
"name": "Test Group Order with Home Delivery", "name": "Test Group Order with Home Delivery",
@ -227,7 +217,7 @@ class TestSaveOrderEndpoints(TransactionCase):
"period": "weekly", "period": "weekly",
"pickup_day": "3", "pickup_day": "3",
"pickup_date": datetime.now().date() + timedelta(days=3), "pickup_date": datetime.now().date() + timedelta(days=3),
"delivery_product_id": self.delivery_product.id, "home_delivery": True, # Enable home delivery
"cutoff_day": "0", "cutoff_day": "0",
} }
) )
@ -372,7 +362,7 @@ class TestSaveOrderEndpoints(TransactionCase):
"period": "weekly", "period": "weekly",
"pickup_day": "5", "pickup_day": "5",
"pickup_date": datetime.now().date() + timedelta(days=12), "pickup_date": datetime.now().date() + timedelta(days=12),
"delivery_product_id": self.delivery_product.id, "home_delivery": True,
"cutoff_day": "0", "cutoff_day": "0",
} }
) )

View file

@ -503,17 +503,16 @@
</t> </t>
</div> </div>
<div class="oe_structure oe_empty mb-4" data-name="After Summary" /> <div class="oe_structure oe_empty mb-4" data-name="After Summary" />
<t t-if="group_order.home_delivery">
<div class="card border-0 shadow-sm mb-4"> <div class="card border-0 shadow-sm mb-4">
<div class="card-body"> <div class="card-body">
<div class="form-check"> <div class="form-check">
<input type="checkbox" class="form-check-input" id="home-delivery-checkbox" name="home_delivery" checked="checked" /> <input type="checkbox" class="form-check-input" id="home-delivery-checkbox" name="home_delivery" />
<label class="form-check-label fw-bold" for="home-delivery-checkbox">Home Delivery</label> <label class="form-check-label fw-bold" for="home-delivery-checkbox">Home Delivery</label>
</div> </div>
<div id="delivery-info-alert" class="alert alert-info mt-3 d-none"> <div id="delivery-info-alert" class="alert alert-info mt-3 d-none">
<p class="mb-2"> <p class="mb-2">
<i class="fa fa-truck" aria-hidden="true" t-translation="off" /> <i class="fa fa-truck" aria-hidden="true" t-translation="off" />
<t t-if="group_order.delivery_date"> <t t-if="group_order.delivery_date and group_order.home_delivery">
<strong>Delivery Information:</strong> Your order will be delivered at <strong>Delivery Information:</strong> Your order will be delivered at
<t t-esc="day_names[(int(group_order.pickup_day) + 1) % 7]" /> <t t-esc="day_names[(int(group_order.pickup_day) + 1) % 7]" />
<t t-esc="group_order.delivery_date.strftime('%d/%m/%Y')" /> <t t-esc="group_order.delivery_date.strftime('%d/%m/%Y')" />
@ -526,7 +525,6 @@
</div> </div>
</div> </div>
</div> </div>
</t>
<div class="checkout-actions d-grid gap-3" id="checkout-form-labels"> <div class="checkout-actions d-grid gap-3" id="checkout-form-labels">
<button class="btn btn-success btn-lg" id="confirm-order-btn" t-attf-data-order-id="{{ group_order.id }}" t-att-data-confirmed-label="labels.get('order_saved_as_draft', 'Order saved as draft')" t-att-data-pickup-label="labels.get('pickup_day_label', 'Pickup Day')" t-att-aria-label="labels.get('save_order_as_draft', 'Save order as draft')" t-att-data-bs-title="labels.get('save_draft', 'Save Draft')" data-bs-toggle="tooltip"> <button class="btn btn-success btn-lg" id="confirm-order-btn" t-attf-data-order-id="{{ group_order.id }}" t-att-data-confirmed-label="labels.get('order_saved_as_draft', 'Order saved as draft')" t-att-data-pickup-label="labels.get('pickup_day_label', 'Pickup Day')" t-att-aria-label="labels.get('save_order_as_draft', 'Save order as draft')" t-att-data-bs-title="labels.get('save_draft', 'Save Draft')" data-bs-toggle="tooltip">
<i class="fa fa-save" aria-hidden="true" t-translation="off" /> <i class="fa fa-save" aria-hidden="true" t-translation="off" />