From 7451a35a5d15e75f07dc4b90d0a38abc2239bf5f Mon Sep 17 00:00:00 2001 From: "Adrien Guilliams (adgu)" Date: Wed, 13 Dec 2023 12:32:27 +0000 Subject: [PATCH] [FIX] point_of_sale: disabled commercial fields in child partner Prior to this commit, a user was able to modify the commercial fields of a partner in the POS. This is not wanted and not possible in the backend. This commit adapts it to the backend behavior. closes odoo/odoo#146475 X-original-commit: 0c55915172f06864c6f29d59d3057fbe0ff42bb5 Related: odoo/enterprise#52885 Signed-off-by: Robin Heinz (rhe) Signed-off-by: Adrien Guilliams (adgu) --- addons/point_of_sale/models/pos_session.py | 1 + .../partner_editor/partner_editor.js | 7 ++++++ .../partner_editor/partner_editor.scss | 5 ++++ .../partner_editor/partner_editor.xml | 19 +++++++++----- .../static/src/app/store/pos_store.js | 25 +++++++++++++------ 5 files changed, 43 insertions(+), 14 deletions(-) diff --git a/addons/point_of_sale/models/pos_session.py b/addons/point_of_sale/models/pos_session.py index 1f35766eb85..0c9f6979129 100644 --- a/addons/point_of_sale/models/pos_session.py +++ b/addons/point_of_sale/models/pos_session.py @@ -1686,6 +1686,7 @@ class PosSession(models.Model): loaded_data['pos_has_valid_product'] = self._pos_has_valid_product() loaded_data['pos_special_products_ids'] = self.env['pos.config']._get_special_products().ids loaded_data['open_orders'] = self.env['pos.order'].search([('session_id', '=', self.id), ('state', '=', 'draft')]).export_for_ui() + loaded_data['partner_commercial_fields'] = self.env['res.partner']._commercial_fields() @api.model def _pos_ui_models_to_load(self): diff --git a/addons/point_of_sale/static/src/app/screens/partner_list/partner_editor/partner_editor.js b/addons/point_of_sale/static/src/app/screens/partner_list/partner_editor/partner_editor.js index 7c5d92133e3..70d17a9685b 100644 --- a/addons/point_of_sale/static/src/app/screens/partner_list/partner_editor/partner_editor.js +++ b/addons/point_of_sale/static/src/app/screens/partner_list/partner_editor/partner_editor.js @@ -139,4 +139,11 @@ export class PartnerDetailsEdit extends Component { img.src = url; }); } + + isFieldCommercialAndPartnerIsChild(field) { + return ( + this.pos.isChildPartner(this.props.partner) && + this.pos.partner_commercial_fields.includes(field) + ); + } } diff --git a/addons/point_of_sale/static/src/app/screens/partner_list/partner_editor/partner_editor.scss b/addons/point_of_sale/static/src/app/screens/partner_list/partner_editor/partner_editor.scss index 6ed28dcf7e1..57e5ad1e049 100644 --- a/addons/point_of_sale/static/src/app/screens/partner_list/partner_editor/partner_editor.scss +++ b/addons/point_of_sale/static/src/app/screens/partner_list/partner_editor/partner_editor.scss @@ -21,3 +21,8 @@ cursor: pointer; } } + +.partner-details input:disabled{ + color: #999999; // Lighter text color + border-color: #cccccc; // Lighter border color +} diff --git a/addons/point_of_sale/static/src/app/screens/partner_list/partner_editor/partner_editor.xml b/addons/point_of_sale/static/src/app/screens/partner_list/partner_editor/partner_editor.xml index 099d9f086e0..86cfbf782e0 100644 --- a/addons/point_of_sale/static/src/app/screens/partner_list/partner_editor/partner_editor.xml +++ b/addons/point_of_sale/static/src/app/screens/partner_list/partner_editor/partner_editor.xml @@ -19,13 +19,20 @@
-
-
-
-
- +
diff --git a/addons/point_of_sale/static/src/app/store/pos_store.js b/addons/point_of_sale/static/src/app/store/pos_store.js index 479df47d83d..8d66a36c73a 100644 --- a/addons/point_of_sale/static/src/app/store/pos_store.js +++ b/addons/point_of_sale/static/src/app/store/pos_store.js @@ -279,6 +279,7 @@ export class PosStore extends Reactive { this.base_url = loadedData["base_url"]; this.pos_has_valid_product = loadedData["pos_has_valid_product"]; this.db.addProductIdsToNotDisplay(loadedData["pos_special_products_ids"]); + this.partner_commercial_fields = loadedData["partner_commercial_fields"]; await this._loadPosPrinters(loadedData["pos.printer"]); this.open_orders_json = loadedData["open_orders"]; } @@ -665,7 +666,9 @@ export class PosStore extends Reactive { } } } - if(!missingProductIds.size) return; + if (!missingProductIds.size) { + return; + } const products = await this.orm.call( "pos.session", "get_pos_ui_product_product_by_params", @@ -675,13 +678,15 @@ export class PosStore extends Reactive { this._loadProductProduct(products); } async _loadMissingPricelistItems(products) { - if(!products.length) return; - const product_tmpl_ids = products.map(product => product.product_tmpl_id[0]); - const product_ids = products.map(product => product.id); + if (!products.length) { + return; + } + const product_tmpl_ids = products.map((product) => product.product_tmpl_id[0]); + const product_ids = products.map((product) => product.id); const pricelistItems = await this.orm.call( - 'pos.session', - 'get_pos_ui_product_pricelist_item_by_product', + "pos.session", + "get_pos_ui_product_pricelist_item_by_product", [odoo.pos_session_id, product_tmpl_ids, product_ids] ); @@ -691,9 +696,9 @@ export class PosStore extends Reactive { // E.g. The order in the items should be: [product-pricelist-item, product-template-pricelist-item, category-pricelist-item, global-pricelist-item]. // for reference check order of the Product Pricelist Item model for (const pricelist of this.pricelists) { - const itemIds = new Set(pricelist.items.map(item => item.id)); + const itemIds = new Set(pricelist.items.map((item) => item.id)); - const _pricelistItems = pricelistItems.filter(item => { + const _pricelistItems = pricelistItems.filter((item) => { return item.pricelist_id[0] === pricelist.id && !itemIds.has(item.id); }); pricelist.items = [..._pricelistItems, ...pricelist.items]; @@ -1945,6 +1950,10 @@ export class PosStore extends Reactive { header: this.config.receipt_header, }; } + + isChildPartner(partner) { + return partner.parent_name; + } } PosStore.prototype.electronic_payment_interfaces = {};