From 130a5ff6c4116301a4b83952ebdc95068ff8dbc2 Mon Sep 17 00:00:00 2001 From: snt Date: Thu, 26 Feb 2026 15:12:06 +0100 Subject: [PATCH] =?UTF-8?q?[FIX]=20website=5Fsale=5Faplicoop:=20Arreglar?= =?UTF-8?q?=20bot=C3=B3n=20Home=20Delivery=20en=20shop=20(a=C3=B1adir/remo?= =?UTF-8?q?ver=20producto=20de=20entrega=20al=20carrito)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controllers/website_sale.py | 17 +++ .../static/src/js/home_delivery.js | 105 ++++++++++-------- .../views/website_templates.xml | 9 +- 3 files changed, 79 insertions(+), 52 deletions(-) diff --git a/website_sale_aplicoop/controllers/website_sale.py b/website_sale_aplicoop/controllers/website_sale.py index 3568580..9158b79 100644 --- a/website_sale_aplicoop/controllers/website_sale.py +++ b/website_sale_aplicoop/controllers/website_sale.py @@ -1463,6 +1463,18 @@ class AplicoopWebsiteSale(WebsiteSale): session_key = f"eskaera_{order_id}" cart = request.session.get(session_key, {}) + # Get delivery product from group_order (configured per group order) + delivery_product = group_order.delivery_product_id + delivery_product_id = delivery_product.id if delivery_product else None + # Get translated product name based on current language + if delivery_product: + delivery_product_translated = delivery_product.with_context( + lang=request.env.lang + ) + delivery_product_name = delivery_product_translated.name + else: + delivery_product_name = "Home Delivery" + # Get translated labels for JavaScript (same as checkout) labels = self.get_checkout_labels() @@ -1482,6 +1494,11 @@ class AplicoopWebsiteSale(WebsiteSale): "product_supplier_info": product_supplier_info, "product_price_info": product_price_info, "product_display_info": product_display_info, + "delivery_product_id": delivery_product_id, + "delivery_product_name": delivery_product_name, + "delivery_product_price": ( + delivery_product.list_price if delivery_product else 5.74 + ), "labels": labels, "labels_json": json.dumps(labels, ensure_ascii=False), "lazy_loading_enabled": lazy_loading_enabled, diff --git a/website_sale_aplicoop/static/src/js/home_delivery.js b/website_sale_aplicoop/static/src/js/home_delivery.js index d04f12f..54676d4 100644 --- a/website_sale_aplicoop/static/src/js/home_delivery.js +++ b/website_sale_aplicoop/static/src/js/home_delivery.js @@ -14,10 +14,13 @@ homeDeliveryEnabled: false, init: function () { - // Get delivery product info from data attributes + // Get delivery product info from data attributes (from checkout or shop page) var checkoutPage = document.querySelector(".eskaera-checkout-page"); - if (checkoutPage) { - this.deliveryProductId = checkoutPage.getAttribute("data-delivery-product-id"); + var shopPage = document.querySelector(".eskaera-shop-page"); + var page = checkoutPage || shopPage; + + if (page) { + this.deliveryProductId = page.getAttribute("data-delivery-product-id"); console.log( "[HomeDelivery] deliveryProductId from attribute:", this.deliveryProductId, @@ -25,13 +28,13 @@ typeof this.deliveryProductId ); - var price = checkoutPage.getAttribute("data-delivery-product-price"); + var price = page.getAttribute("data-delivery-product-price"); if (price) { this.deliveryProductPrice = parseFloat(price); } // Get translated product name from data attribute (auto-translated by Odoo server) - var productName = checkoutPage.getAttribute("data-delivery-product-name"); + var productName = page.getAttribute("data-delivery-product-name"); if (productName) { this.deliveryProductName = productName; console.log( @@ -41,13 +44,15 @@ } // Check if home delivery is enabled for this order - var homeDeliveryAttr = checkoutPage.getAttribute("data-home-delivery-enabled"); + var homeDeliveryAttr = page.getAttribute("data-home-delivery-enabled"); this.homeDeliveryEnabled = homeDeliveryAttr === "true" || homeDeliveryAttr === "True"; console.log("[HomeDelivery] Home delivery enabled:", this.homeDeliveryEnabled); - // Show/hide home delivery section based on configuration - this.toggleHomeDeliverySection(); + // Show/hide home delivery section based on configuration (only on checkout) + if (checkoutPage) { + this.toggleHomeDeliverySection(); + } } // Get order ID from confirm button @@ -73,6 +78,52 @@ // Check if delivery product is already in cart on page load this.checkDeliveryInCart(); + + // Vincular botón Home Delivery en el shop (cart header) + this.bindShopHomeDeliveryButton(); + }, + + bindShopHomeDeliveryButton: function () { + var self = this; + var homeDeliveryBtn = document.getElementById("home-delivery-btn"); + + if (homeDeliveryBtn) { + console.log("[HomeDelivery] Binding shop home delivery button"); + + homeDeliveryBtn.addEventListener("click", function () { + var cart = self.getCart(); + var isInCart = cart[self.deliveryProductId]; + + if (isInCart) { + // Remove delivery product + console.log("[HomeDelivery] Removing delivery product from shop cart"); + self.removeDeliveryProduct(); + homeDeliveryBtn.classList.remove("active", "btn-warning"); + homeDeliveryBtn.classList.add("btn-outline-warning"); + } else { + // Add delivery product + console.log("[HomeDelivery] Adding delivery product from shop cart"); + self.addDeliveryProduct(); + homeDeliveryBtn.classList.remove("btn-outline-warning"); + homeDeliveryBtn.classList.add("active", "btn-warning"); + } + + // Trigger cart reload to update UI + if (typeof window.renderCheckoutSummary === "function") { + window.renderCheckoutSummary(); + } + }); + + // Set initial button state + var cart = self.getCart(); + if (cart[self.deliveryProductId]) { + homeDeliveryBtn.classList.add("active", "btn-warning"); + homeDeliveryBtn.classList.remove("btn-outline-warning"); + } else { + homeDeliveryBtn.classList.add("btn-outline-warning"); + homeDeliveryBtn.classList.remove("active", "btn-warning"); + } + } }, toggleHomeDeliverySection: function () { @@ -133,48 +184,10 @@ localStorage.setItem(cartKey, JSON.stringify(cart)); // Re-render checkout summary without reloading - var self = this; setTimeout(function () { // Use the global function from checkout_labels.js if (typeof window.renderCheckoutSummary === "function") { window.renderCheckoutSummary(); - - // Vincular botón Entrega a Casa en carrito (shop) - var homeDeliveryBtn = document.getElementById("home-delivery-btn"); - if (homeDeliveryBtn) { - homeDeliveryBtn.addEventListener("click", function () { - // Simular click en checkbox de checkout si existe - if (checkbox) { - checkbox.checked = !checkbox.checked; - var event = new Event("change", { bubbles: true }); - checkbox.dispatchEvent(event); - } else { - // Alternar home delivery en localStorage/cart - // Aquí puedes implementar lógica para shop - console.log("[HomeDelivery] Toggle home delivery from cart header"); - // TODO: Actualizar carrito y mostrar info - } - }); - } - } - // Cargar borrador automáticamente al entrar en shop - var cartPage = document.querySelector(".eskaera-shop-page"); - if (cartPage) { - var orderId = cartPage.getAttribute("data-order-id") || this.orderId; - var cartKey = "eskaera_" + orderId + "_cart"; - var savedCart = localStorage.getItem(cartKey); - if (savedCart) { - try { - var cart = JSON.parse(savedCart); - var event = new CustomEvent("cartLoaded", { detail: { cart: cart } }); - document.dispatchEvent(event); - console.log("[SHOP AUTO-LOAD] Cart loaded from localStorage"); - } catch (e) { - console.error("[SHOP AUTO-LOAD] Error parsing cart:", e); - } - } else { - console.log("[SHOP AUTO-LOAD] No cart found in localStorage"); - } } }, 50); }, diff --git a/website_sale_aplicoop/views/website_templates.xml b/website_sale_aplicoop/views/website_templates.xml index d0f5bd0..31f1de2 100644 --- a/website_sale_aplicoop/views/website_templates.xml +++ b/website_sale_aplicoop/views/website_templates.xml @@ -212,7 +212,7 @@