From cfaa06d2caf7352371350fc7ef103f1e3d89f1c0 Mon Sep 17 00:00:00 2001 From: Jared Kipe Date: Fri, 6 Mar 2020 11:20:27 -0800 Subject: [PATCH] IMP `connector_opencart` Add field `opencart_sku` on `product.template` to let you pre-make products and link them up. Improved partner matching and added some logging for the testing phase. Added menu item Connectors->Opencart-Products to find and fix mapping easily. Allow deleting `product.template` even with bindings so that you could re-make the binding. --- connector_opencart/__manifest__.py | 1 + connector_opencart/models/product/common.py | 5 +- connector_opencart/models/product/importer.py | 11 +++- .../models/sale_order/importer.py | 53 ++++++++++++++----- .../views/opencart_product_views.xml | 28 ++++++++++ connector_opencart/views/product_views.xml | 15 ++++++ 6 files changed, 98 insertions(+), 15 deletions(-) create mode 100644 connector_opencart/views/product_views.xml diff --git a/connector_opencart/__manifest__.py b/connector_opencart/__manifest__.py index c6ea2bb9..630a5319 100644 --- a/connector_opencart/__manifest__.py +++ b/connector_opencart/__manifest__.py @@ -22,6 +22,7 @@ 'views/delivery_views.xml', 'views/opencart_backend_views.xml', 'views/opencart_product_views.xml', + 'views/product_views.xml', ], 'installable': True, 'application': False, diff --git a/connector_opencart/models/product/common.py b/connector_opencart/models/product/common.py index c4afcaa7..8e0a9c0c 100644 --- a/connector_opencart/models/product/common.py +++ b/connector_opencart/models/product/common.py @@ -12,7 +12,7 @@ class OpencartProductTemplate(models.Model): odoo_id = fields.Many2one('product.template', string='Product', required=True, - ondelete='restrict') + ondelete='cascade') # cascade so that you can delete an Odoo product that was created by connector opencart_attribute_value_ids = fields.One2many('opencart.product.template.attribute.value', 'opencart_product_tmpl_id', string='Opencart Product Attribute Values') @@ -34,7 +34,7 @@ class OpencartProductTemplate(models.Model): if reentry: raise RetryableJobError('Product imported, but selected option is not available.') if not opencart_attribute_value.odoo_id: - raise RetryableJobError('Order Product has option (%s) "%s" that is not mapped to an Odoo Attribute Value.' % (opencart_attribute_value.external_id, opencart_attribute_value.opencart_name)) + raise RetryableJobError('Order Product (%s) has option (%s) "%s" that is not mapped to an Odoo Attribute Value.' % (self, opencart_attribute_value.external_id, opencart_attribute_value.opencart_name)) selected_attribute_values += opencart_attribute_value.odoo_id # Now that we know what options are selected, we can load a variant with those options return self.odoo_id._create_product_variant(selected_attribute_values) @@ -43,6 +43,7 @@ class OpencartProductTemplate(models.Model): class ProductTemplate(models.Model): _inherit = 'product.template' + opencart_sku = fields.Char('Opencart SKU') opencart_bind_ids = fields.One2many('opencart.product.template', 'odoo_id', string='Opencart Bindings') diff --git a/connector_opencart/models/product/importer.py b/connector_opencart/models/product/importer.py index b45a6ce0..d0e68c45 100644 --- a/connector_opencart/models/product/importer.py +++ b/connector_opencart/models/product/importer.py @@ -23,6 +23,10 @@ class ProductImportMapper(Component): def product_type(self, record): return {'type': 'product' if record.get('shipping') else 'service'} + @mapping + def opencart_sku(self, record): + return {'opencart_sku': (record.get('sku') or '').strip()} + @only_create @mapping def existing_product(self, record): @@ -30,7 +34,12 @@ class ProductImportMapper(Component): template = product_template.browse() if record.get('sku'): - template = product_template.search([('default_code', '=', record.get('sku'))], limit=1) + sku = (record.get('sku') or '').strip() + # Try to match our own field + template = product_template.search([('opencart_sku', '=', sku)], limit=1) + if not template: + # Try to match the default_code + template = product_template.search([('default_code', '=', record.get('sku'))], limit=1) if not template and record.get('model'): template = product_template.search([('default_code', '=', record.get('model'))], limit=1) if not template and record.get('name'): diff --git a/connector_opencart/models/sale_order/importer.py b/connector_opencart/models/sale_order/importer.py index eb47874d..f97691d9 100644 --- a/connector_opencart/models/sale_order/importer.py +++ b/connector_opencart/models/sale_order/importer.py @@ -9,6 +9,9 @@ from odoo.addons.component.core import Component from odoo.addons.connector.components.mapper import mapping from odoo.exceptions import ValidationError +import logging +_logger = logging.getLogger(__name__) + class SaleOrderBatchImporter(Component): _name = 'opencart.sale.order.batch.importer' @@ -184,14 +187,21 @@ class SaleOrderImporter(Component): return self.env['res.partner'].create(values) def _partner_matches(self, partner, values): + _logger.warn('_partner_matches partner: ' + str(partner) + ' values: ' + str(values)) for key, value in values.items(): + if key in ('active', 'parent_id'): + continue + if key == 'state_id': if value != partner.state_id.id: + _logger.warn(' return false for state_id value: ' + str(value) + ' partner.state_id.id: ' + str(partner.state_id.id)) return False elif key == 'country_id': if value != partner.country_id.id: + _logger.warn(' return false for country_id value: ' + str(value) + ' partner.country_id.id: ' + str(partner.country_id.id)) return False elif bool(value) and value != getattr(partner, key): + _logger.warn(' return false for ' + str(key) + ' : ' + str(value) + ' partner value: ' + str(getattr(partner, key))) return False return True @@ -232,13 +242,13 @@ class SaleOrderImporter(Component): ], limit=1) return { - 'email': email, - 'name': name, - 'phone': phone, - 'street': street, - 'street2': street2, - 'zip': zip_, - 'city': city, + 'email': email.strip(), + 'name': name.strip(), + 'phone': phone.strip(), + 'street': street.strip(), + 'street2': street2.strip(), + 'zip': zip_.strip(), + 'city': city.strip(), 'state_id': state.id, 'country_id': country.id, } @@ -247,9 +257,18 @@ class SaleOrderImporter(Component): record = self.opencart_record partner_values = self._get_partner_values() - partner = self.env['res.partner'].search([ + partners = self.env['res.partner'].search([ ('email', '=', partner_values['email']), - ], limit=1) + ]) + + partner = None + for possible in partners: + if self._partner_matches(possible, partner_values): + _logger.warn('matched partner: ' + str(possible)) + partner = possible + break + if not partner and partners: + partner = partners[0] if not partner: # create partner. @@ -260,18 +279,28 @@ class SaleOrderImporter(Component): partner_values['active'] = False shipping_partner = self._create_partner(copy(partner_values)) else: + _logger.warn('same shipping partner') shipping_partner = partner invoice_values = self._get_partner_values(info_string='payment_') if (not self._partner_matches(partner, invoice_values) and not self._partner_matches(shipping_partner, invoice_values)): - partner_values['parent_id'] = partner.id - partner_values['active'] = False - invoice_partner = self._create_partner(copy(invoice_values)) + # Try to find existing invoice address.... + for possible in partners: + if self._partner_matches(possible, invoice_values): + _logger.warn('matched invoice partner: ' + str(possible)) + invoice_partner = possible + break + else: + partner_values['parent_id'] = partner.id + partner_values['active'] = False + invoice_partner = self._create_partner(copy(invoice_values)) elif self._partner_matches(partner, invoice_values): + _logger.warn('same invoice partner') invoice_partner = partner elif self._partner_matches(shipping_partner, invoice_values): + _logger.warn('same invoice shipping partner') invoice_partner = shipping_partner self.partner = partner diff --git a/connector_opencart/views/opencart_product_views.xml b/connector_opencart/views/opencart_product_views.xml index db349957..fec97208 100644 --- a/connector_opencart/views/opencart_product_views.xml +++ b/connector_opencart/views/opencart_product_views.xml @@ -25,4 +25,32 @@ + + opencart.product.template.tree + opencart.product.template + + + + + + + + + + + + + Opencart Products + opencart.product.template + form + tree,form + + + + + \ No newline at end of file diff --git a/connector_opencart/views/product_views.xml b/connector_opencart/views/product_views.xml new file mode 100644 index 00000000..3ccc3955 --- /dev/null +++ b/connector_opencart/views/product_views.xml @@ -0,0 +1,15 @@ + + + + + product.template.product.form.inherit + product.template + + + + + + + + + \ No newline at end of file