diff --git a/fusion-woo-odoo/fusion_woocommerce/models/woo_instance.py b/fusion-woo-odoo/fusion_woocommerce/models/woo_instance.py index 617bfbb4..2fcbdb91 100644 --- a/fusion-woo-odoo/fusion_woocommerce/models/woo_instance.py +++ b/fusion-woo-odoo/fusion_woocommerce/models/woo_instance.py @@ -51,8 +51,10 @@ class WooInstance(models.Model): customer_ids = fields.One2many('woo.customer', 'instance_id') sync_log_ids = fields.One2many('woo.sync.log', 'instance_id') - # Category mapping + # Mappings category_map_ids = fields.One2many('woo.category.map', 'instance_id', string='Category Mappings') + tax_map_ids = fields.One2many('woo.tax.map', 'instance_id', string='Tax Mappings') + pricelist_map_ids = fields.One2many('woo.pricelist.map', 'instance_id', string='Pricelist Mappings') excluded_category_ids = fields.Many2many( 'product.category', string='Hidden Categories', help='Products in these categories will be hidden from the unmatched products list.' @@ -183,6 +185,49 @@ class WooInstance(models.Model): break return True + def action_fetch_wc_tax_classes(self): + """Fetch WooCommerce tax classes for mapping.""" + self.ensure_one() + client = self._get_client() + TaxMap = self.env['woo.tax.map'] + try: + tax_classes = client.get_tax_classes() + except Exception as e: + raise UserError('Failed to fetch WC tax classes: %s' % str(e)) + + for tc in tax_classes: + slug = tc.get('slug', '') + name = tc.get('name', '') + existing = TaxMap.search([ + ('instance_id', '=', self.id), + ('woo_tax_class', '=', slug), + ], limit=1) + if existing: + existing.woo_tax_class_name = name + else: + # Try to auto-match by name similarity + odoo_tax = False + if 'zero' in slug.lower() or 'exempt' in slug.lower(): + odoo_tax = self.env['account.tax'].search([ + ('type_tax_use', '=', 'sale'), + ('amount', '=', 0), + ('company_id', '=', self.company_id.id), + ], limit=1) + elif 'standard' in slug.lower(): + odoo_tax = self.env['account.tax'].search([ + ('type_tax_use', '=', 'sale'), + ('amount', '>', 0), + ('company_id', '=', self.company_id.id), + ], limit=1, order='amount desc') + TaxMap.create({ + 'instance_id': self.id, + 'tax_id': odoo_tax.id if odoo_tax else False, + 'woo_tax_class': slug, + 'woo_tax_class_name': name, + 'company_id': self.company_id.id, + }) + return True + def _get_client(self): """Return a WooApiClient instance for this WooCommerce connection.""" self.ensure_one() diff --git a/fusion-woo-odoo/fusion_woocommerce/models/woo_tax_map.py b/fusion-woo-odoo/fusion_woocommerce/models/woo_tax_map.py index 5d90d6fc..78360edf 100644 --- a/fusion-woo-odoo/fusion_woocommerce/models/woo_tax_map.py +++ b/fusion-woo-odoo/fusion_woocommerce/models/woo_tax_map.py @@ -6,7 +6,7 @@ class WooTaxMap(models.Model): _description = 'WooCommerce Tax Mapping' instance_id = fields.Many2one('woo.instance', required=True, ondelete='cascade') - tax_id = fields.Many2one('account.tax', required=True) + tax_id = fields.Many2one('account.tax', string='Odoo Tax') woo_tax_class = fields.Char(required=True) woo_tax_class_name = fields.Char() company_id = fields.Many2one( diff --git a/fusion-woo-odoo/fusion_woocommerce/views/woo_instance_views.xml b/fusion-woo-odoo/fusion_woocommerce/views/woo_instance_views.xml index ce56989a..62baeb66 100644 --- a/fusion-woo-odoo/fusion_woocommerce/views/woo_instance_views.xml +++ b/fusion-woo-odoo/fusion_woocommerce/views/woo_instance_views.xml @@ -83,6 +83,27 @@ + +
+
+ + + + + + + + + + + + + + + diff --git a/fusion-woo-odoo/fusion_woocommerce/views/woo_menus.xml b/fusion-woo-odoo/fusion_woocommerce/views/woo_menus.xml index cde94d29..6a27886d 100644 --- a/fusion-woo-odoo/fusion_woocommerce/views/woo_menus.xml +++ b/fusion-woo-odoo/fusion_woocommerce/views/woo_menus.xml @@ -80,16 +80,6 @@ action="action_woo_shipping_carrier" sequence="20"/> - - - +