From 919dbcb4cf4364741a0055850e36a8895704382c Mon Sep 17 00:00:00 2001 From: gsinghpal Date: Tue, 31 Mar 2026 22:32:42 -0400 Subject: [PATCH] feat: add WC Price and Odoo Price columns to product mapping UI Added woo_price field to woo.product.map model, populated during fetch. Search endpoint now returns both odoo_price and woo_price for side-by-side comparison in the mapped products table. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../controllers/product_search.py | 4 ++++ .../fusion_woocommerce/models/woo_instance.py | 14 ++++++++++++++ .../fusion_woocommerce/models/woo_product_map.py | 1 + .../static/src/xml/product_mapping.xml | 10 ++++++++++ 4 files changed, 29 insertions(+) diff --git a/fusion-woo-odoo/fusion_woocommerce/controllers/product_search.py b/fusion-woo-odoo/fusion_woocommerce/controllers/product_search.py index 026e75e6..f09f2997 100644 --- a/fusion-woo-odoo/fusion_woocommerce/controllers/product_search.py +++ b/fusion-woo-odoo/fusion_woocommerce/controllers/product_search.py @@ -140,6 +140,10 @@ class WooProductSearchController(http.Controller): 'odoo_product_id': m.product_id.id if m.product_id else False, 'odoo_product_name': m.product_id.name if m.product_id else '', 'odoo_default_code': m.product_id.default_code or '' if m.product_id else '', + 'odoo_price': m.product_id.list_price if m.product_id else 0.0, + 'woo_price': m.woo_price or 0.0, + 'sync_price': m.sync_price, + 'sync_inventory': m.sync_inventory, 'instance_id': m.instance_id.id if m.instance_id else False, 'instance_name': m.instance_id.name if m.instance_id else '', } diff --git a/fusion-woo-odoo/fusion_woocommerce/models/woo_instance.py b/fusion-woo-odoo/fusion_woocommerce/models/woo_instance.py index 8919a583..bd0c8387 100644 --- a/fusion-woo-odoo/fusion_woocommerce/models/woo_instance.py +++ b/fusion-woo-odoo/fusion_woocommerce/models/woo_instance.py @@ -196,12 +196,19 @@ class WooInstance(models.Model): match_state = 'mapped' auto_matched += 1 + wc_price = 0.0 + try: + wc_price = float(wc_prod.get('regular_price') or wc_prod.get('price') or 0) + except (ValueError, TypeError): + pass + ProductMap.create({ 'instance_id': self.id, 'product_id': odoo_product.id if odoo_product else False, 'woo_product_id': wc_id, 'woo_product_name': wc_name, 'woo_sku': wc_sku, + 'woo_price': wc_price, 'woo_product_type': wc_type if wc_type in ('simple', 'variable', 'grouped', 'external') else 'simple', 'state': match_state, 'company_id': self.company_id.id, @@ -239,12 +246,19 @@ class WooInstance(models.Model): var_state = 'mapped' auto_matched += 1 + var_price = 0.0 + try: + var_price = float(var.get('regular_price') or var.get('price') or 0) + except (ValueError, TypeError): + pass + ProductMap.create({ 'instance_id': self.id, 'product_id': var_product.id if var_product else False, 'woo_product_id': var_id, 'woo_product_name': var_name, 'woo_sku': var_sku, + 'woo_price': var_price, 'woo_product_type': 'simple', 'woo_parent_id': wc_id, 'is_variation': True, diff --git a/fusion-woo-odoo/fusion_woocommerce/models/woo_product_map.py b/fusion-woo-odoo/fusion_woocommerce/models/woo_product_map.py index 773bd68e..928881f1 100644 --- a/fusion-woo-odoo/fusion_woocommerce/models/woo_product_map.py +++ b/fusion-woo-odoo/fusion_woocommerce/models/woo_product_map.py @@ -25,6 +25,7 @@ class WooProductMap(models.Model): ('grouped', 'Grouped'), ('external', 'External'), ]) + woo_price = fields.Float(string='WC Price', digits='Product Price') woo_parent_id = fields.Integer() is_variation = fields.Boolean() sync_price = fields.Boolean(default=True) diff --git a/fusion-woo-odoo/fusion_woocommerce/static/src/xml/product_mapping.xml b/fusion-woo-odoo/fusion_woocommerce/static/src/xml/product_mapping.xml index d6d7dbd5..d8941005 100644 --- a/fusion-woo-odoo/fusion_woocommerce/static/src/xml/product_mapping.xml +++ b/fusion-woo-odoo/fusion_woocommerce/static/src/xml/product_mapping.xml @@ -130,6 +130,8 @@ WooCommerce Product SKU Odoo Product + WC Price + Odoo Price Instance Price Sync Inventory Sync @@ -146,6 +148,14 @@ + + $ + + + + $ + +