feat: move tax and pricelist mapping inline to Sync Settings tab

Tax mapping and pricelist mapping now live directly on the instance
form under Sync Settings. Added Fetch WC Tax Classes button that pulls
tax classes from WC API and auto-matches. Removed standalone menu items.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
gsinghpal
2026-04-01 16:58:01 -04:00
parent bc2bba14aa
commit 05c84d077d
4 changed files with 69 additions and 13 deletions

View File

@@ -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()

View File

@@ -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(

View File

@@ -83,6 +83,27 @@
<field name="sync_customers"/>
</group>
</group>
<separator string="Tax Mapping"/>
<div class="mb-2">
<button name="action_fetch_wc_tax_classes" type="object"
string="Fetch WC Tax Classes" class="oe_highlight"/>
</div>
<field name="tax_map_ids">
<list editable="bottom">
<field name="tax_id" string="Odoo Tax"
domain="[('type_tax_use', '=', 'sale')]"/>
<field name="woo_tax_class_name" string="WC Tax Class" readonly="1"/>
<field name="woo_tax_class" string="WC Slug" readonly="1"/>
</list>
</field>
<separator string="Pricelist Mapping"/>
<field name="pricelist_map_ids">
<list editable="bottom">
<field name="pricelist_id" string="Odoo Pricelist"/>
<field name="woo_role" string="WC Customer Role"/>
<field name="woo_role_name" string="WC Role Name"/>
</list>
</field>
</page>
<page string="Notifications" name="notifications">
<group>

View File

@@ -80,16 +80,6 @@
action="action_woo_shipping_carrier"
sequence="20"/>
<menuitem id="woo_menu_tax_map"
name="Tax Mapping"
parent="woo_menu_config"
action="action_woo_tax_map"
sequence="30"/>
<menuitem id="woo_menu_pricelist_map"
name="Price List Mapping"
parent="woo_menu_config"
action="action_woo_pricelist_map"
sequence="40"/>
<!-- Tax and Pricelist mapping moved inline to Instance → Sync Settings -->
</odoo>