Compare commits
No commits in common. "27097004fb103bf666aebdc164635e4f0e3cea1d" and "9d614ed79eb640930836da99432007e4de8ad6d7" have entirely different histories.
27097004fb
...
9d614ed79e
6 changed files with 6 additions and 318 deletions
|
|
@ -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)
|
||||
var reloadCartBtn = document.getElementById("reload-cart-btn");
|
||||
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)
|
||||
var clearCartBtns = [
|
||||
document.getElementById("clear-cart-btn"),
|
||||
|
|
@ -1599,17 +1553,6 @@
|
|||
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();
|
||||
xhr.open("POST", "/eskaera/save-order", true);
|
||||
xhr.setRequestHeader("Content-Type", "application/json");
|
||||
|
|
|
|||
|
|
@ -15,4 +15,3 @@ from . import test_pricing_with_pricelist # noqa: F401
|
|||
from . import test_portal_sale_order_creation # noqa: F401
|
||||
from . import test_cron_picking_batch # noqa: F401
|
||||
from . import test_group_order_status_endpoint # noqa: F401
|
||||
from . import test_home_delivery # noqa: F401
|
||||
|
|
|
|||
|
|
@ -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",
|
||||
)
|
||||
|
|
@ -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
|
||||
self.group_order = self.env["group.order"].create(
|
||||
{
|
||||
|
|
@ -714,7 +704,7 @@ class TestConfirmEskaera_Integration(TransactionCase):
|
|||
"end_date": date.today() + timedelta(days=7),
|
||||
"cutoff_day": "3",
|
||||
"pickup_day": "5",
|
||||
"delivery_product_id": self.delivery_product.id,
|
||||
"home_delivery": True,
|
||||
}
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
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):
|
||||
"""Test that save_eskaera_draft() propagates home_delivery correctly."""
|
||||
# Create a group order with home delivery enabled via delivery_product_id
|
||||
# (home_delivery is a computed field derived from delivery_product_id)
|
||||
# Create a group order with home_delivery=True
|
||||
group_order_home = self.env["group.order"].create(
|
||||
{
|
||||
"name": "Test Group Order with Home Delivery",
|
||||
|
|
@ -227,7 +217,7 @@ class TestSaveOrderEndpoints(TransactionCase):
|
|||
"period": "weekly",
|
||||
"pickup_day": "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",
|
||||
}
|
||||
)
|
||||
|
|
@ -372,7 +362,7 @@ class TestSaveOrderEndpoints(TransactionCase):
|
|||
"period": "weekly",
|
||||
"pickup_day": "5",
|
||||
"pickup_date": datetime.now().date() + timedelta(days=12),
|
||||
"delivery_product_id": self.delivery_product.id,
|
||||
"home_delivery": True,
|
||||
"cutoff_day": "0",
|
||||
}
|
||||
)
|
||||
|
|
|
|||
|
|
@ -503,17 +503,16 @@
|
|||
</t>
|
||||
</div>
|
||||
<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-body">
|
||||
<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>
|
||||
</div>
|
||||
<div id="delivery-info-alert" class="alert alert-info mt-3 d-none">
|
||||
<p class="mb-2">
|
||||
<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
|
||||
<t t-esc="day_names[(int(group_order.pickup_day) + 1) % 7]" />
|
||||
<t t-esc="group_order.delivery_date.strftime('%d/%m/%Y')" />
|
||||
|
|
@ -526,7 +525,6 @@
|
|||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</t>
|
||||
<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">
|
||||
<i class="fa fa-save" aria-hidden="true" t-translation="off" />
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue