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 e9321af0..6156d5b6 100644 --- a/fusion-woo-odoo/fusion_woocommerce/models/woo_product_map.py +++ b/fusion-woo-odoo/fusion_woocommerce/models/woo_product_map.py @@ -207,10 +207,12 @@ class WooProductMap(models.Model): except Exception as e: raise UserError("Failed to convert WC product to variable: %s" % str(e)) + # Build WC attribute ID lookup + wc_attr_id_map = {a['name'].upper(): a['id'] for a in wc_attributes} + # Step 3: Create a WC variation for each Odoo variant created = 0 for variant in variants: - # Check if variation already mapped existing = self.search([ ('instance_id', '=', inst.id), ('product_id', '=', variant.id), @@ -219,13 +221,17 @@ class WooProductMap(models.Model): if existing: continue - # Build variation attributes + # Build variation attributes with WC IDs var_attributes = [] for ptav in variant.product_template_attribute_value_ids: - var_attributes.append({ - 'name': ptav.attribute_id.name, - 'option': ptav.name, - }) + attr_name = ptav.attribute_id.name + wc_aid = wc_attr_id_map.get(attr_name.upper(), 0) + entry = {'option': ptav.name} + if wc_aid: + entry['id'] = wc_aid + else: + entry['name'] = attr_name + var_attributes.append(entry) var_data = { 'regular_price': str(variant.list_price), diff --git a/fusion-woo-odoo/fusion_woocommerce/wizard/woo_product_create.py b/fusion-woo-odoo/fusion_woocommerce/wizard/woo_product_create.py index 724e4940..2259e6df 100644 --- a/fusion-woo-odoo/fusion_woocommerce/wizard/woo_product_create.py +++ b/fusion-woo-odoo/fusion_woocommerce/wizard/woo_product_create.py @@ -585,6 +585,9 @@ class WooProductCreateWizard(models.TransientModel): 'company_id': inst.company_id.id, }) + # Build WC attribute ID lookup + wc_attr_id_map = {a['name'].upper(): a['id'] for a in wc_attributes} + # Create variations variation_count = 0 for line in self.variant_line_ids: @@ -592,13 +595,17 @@ class WooProductCreateWizard(models.TransientModel): continue variant = line.product_id - # Build variation attributes + # Build variation attributes with WC IDs var_attributes = [] for ptav in variant.product_template_attribute_value_ids: - var_attributes.append({ - 'name': ptav.attribute_id.name, - 'option': ptav.name, - }) + attr_name = ptav.attribute_id.name + wc_aid = wc_attr_id_map.get(attr_name.upper(), 0) + entry = {'option': ptav.name} + if wc_aid: + entry['id'] = wc_aid + else: + entry['name'] = attr_name + var_attributes.append(entry) var_data = { 'regular_price': str(line.sale_price), diff --git a/fusion-woo-odoo/fusion_woocommerce/wizard/woo_variant_push.py b/fusion-woo-odoo/fusion_woocommerce/wizard/woo_variant_push.py index 964dda24..62d757a3 100644 --- a/fusion-woo-odoo/fusion_woocommerce/wizard/woo_variant_push.py +++ b/fusion-woo-odoo/fusion_woocommerce/wizard/woo_variant_push.py @@ -108,6 +108,11 @@ class WooVariantPushWizard(models.TransientModel): 'options': wc_terms, }) + # Build a lookup: Odoo attribute name → WC attribute ID + wc_attr_id_map = {} + for wc_attr in wc_attributes: + wc_attr_id_map[wc_attr['name'].upper()] = wc_attr['id'] + # Step 2: Update product as variable with attributes + set default # Default attribute = first included variant's attribute values default_attrs = [] @@ -234,13 +239,17 @@ class WooVariantPushWizard(models.TransientModel): if not wc_var_id: continue - # Build variation attributes from Odoo + # Build variation attributes with WC attribute IDs var_attributes = [] for ptav in variant.product_template_attribute_value_ids: - var_attributes.append({ - 'name': ptav.attribute_id.name, - 'option': ptav.name, - }) + attr_name = ptav.attribute_id.name + wc_attr_id = wc_attr_id_map.get(attr_name.upper(), 0) + attr_entry = {'option': ptav.name} + if wc_attr_id: + attr_entry['id'] = wc_attr_id + else: + attr_entry['name'] = attr_name + var_attributes.append(attr_entry) var_data = { 'regular_price': str(line.regular_price),