From d813f16662c995880f221587fdbc7b39cc842e1a Mon Sep 17 00:00:00 2001 From: Telmo Santos Date: Tue, 21 Jan 2025 07:49:36 +0100 Subject: [PATCH] Assign pricelist items based on categories --- .../models/pos_session.py | 43 +++++++++++++++++++ .../models/pos_session.py | 2 + .../static/src/js/PosGlobalState.esm.js | 9 +++- 3 files changed, 53 insertions(+), 1 deletion(-) create mode 100644 pos_partner_alternative_pricelist_load_background/models/pos_session.py diff --git a/pos_partner_alternative_pricelist_load_background/models/pos_session.py b/pos_partner_alternative_pricelist_load_background/models/pos_session.py new file mode 100644 index 0000000000..cde11c8e6c --- /dev/null +++ b/pos_partner_alternative_pricelist_load_background/models/pos_session.py @@ -0,0 +1,43 @@ +# Copyright 2024 Camptocamp +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). +from odoo import models + + +class POSSession(models.Model): + _inherit = "pos.session" + + def get_pos_ui_partner_pricelist_background(self, pricelist_id, product_ids): + params = self._loader_params_product_pricelist() + fnames = params["search_params"]["fields"] + pricelist_rec = self.env["product.pricelist"].browse(pricelist_id) + pricelist = pricelist_rec.read(fnames)[0] + pricelist["items"] = [] + + products = ( + self.env["product.product"].browse(product_ids) + | pricelist_rec.item_ids.product_id + ) + templates = products.product_tmpl_id | pricelist_rec.item_ids.product_tmpl_id + pricelist_item_domain = [ + ("pricelist_id", "=", pricelist_id), + "|", + ("product_tmpl_id", "=", False), + ("product_tmpl_id", "in", templates.ids), + "|", + ("product_id", "=", False), + ("product_id", "in", products.ids), + ] + breakpoint() + for item in self.env["product.pricelist.item"].search_read( + pricelist_item_domain, self._product_pricelist_item_fields() + ): + pricelist["items"].append(item) + + alternative_pricelists = [] + for alt_pricelist_rec in pricelist_rec.alternative_pricelist_ids: + alternative_pricelists += self.get_pos_ui_partner_pricelist_background( + alt_pricelist_rec.id, product_ids + ) + if alternative_pricelists: + return [pricelist] + alternative_pricelists + return [pricelist] diff --git a/pos_partner_pricelist_load_background/models/pos_session.py b/pos_partner_pricelist_load_background/models/pos_session.py index 1d66854f9a..d5e637f3ab 100644 --- a/pos_partner_pricelist_load_background/models/pos_session.py +++ b/pos_partner_pricelist_load_background/models/pos_session.py @@ -18,6 +18,7 @@ def get_pos_ui_partner_pricelist_background(self, pricelist_id, product_ids): | pricelist_rec.item_ids.product_id ) templates = products.product_tmpl_id | pricelist_rec.item_ids.product_tmpl_id + # TODO add also items with with products.categories pricelist_item_domain = [ ("pricelist_id", "=", pricelist_id), "|", @@ -27,6 +28,7 @@ def get_pos_ui_partner_pricelist_background(self, pricelist_id, product_ids): ("product_id", "=", False), ("product_id", "in", products.ids), ] + for item in self.env["product.pricelist.item"].search_read( pricelist_item_domain, self._product_pricelist_item_fields() ): diff --git a/pos_partner_pricelist_load_background/static/src/js/PosGlobalState.esm.js b/pos_partner_pricelist_load_background/static/src/js/PosGlobalState.esm.js index a7af57bc27..daf7252f52 100644 --- a/pos_partner_pricelist_load_background/static/src/js/PosGlobalState.esm.js +++ b/pos_partner_pricelist_load_background/static/src/js/PosGlobalState.esm.js @@ -26,13 +26,20 @@ const PosPartnerPricelistLoadBackgroundSPosGlobalState = (PosGlobalState) => pricelistItem ); } - if (pricelistItem.product_tmpl_id) { + else if (pricelistItem.product_tmpl_id) { for (const product of Object.values(this.db.product_by_id).filter( (x) => x.product_tmpl_id === pricelistItem.product_tmpl_id[0] )) { this._assignApplicableItems(pricelist, product, pricelistItem); } + } else { + for (const correspondingProduct of Object.values(this.db.product_by_id).filter( + (x) => x.categ_id + )) { + this._assignApplicableItems(pricelist, correspondingProduct, pricelistItem); + } } + } }