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