93 lines
3.0 KiB
Python
93 lines
3.0 KiB
Python
import logging
|
|
|
|
from odoo import api, fields, models
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
|
|
class WooCustomer(models.Model):
|
|
_name = 'woo.customer'
|
|
_description = 'WooCommerce Customer'
|
|
_rec_name = 'woo_email'
|
|
|
|
instance_id = fields.Many2one('woo.instance', required=True, ondelete='cascade')
|
|
partner_id = fields.Many2one('res.partner', required=True)
|
|
woo_customer_id = fields.Integer(index=True)
|
|
woo_email = fields.Char()
|
|
last_synced = fields.Datetime()
|
|
company_id = fields.Many2one(
|
|
'res.company', required=True, default=lambda self: self.env.company,
|
|
)
|
|
|
|
# ------------------------------------------------------------------
|
|
# Helpers (Task 25)
|
|
# ------------------------------------------------------------------
|
|
|
|
@api.model
|
|
def _find_or_create(self, instance, email, wc_data=None):
|
|
"""Find or create a woo.customer + res.partner for the given email.
|
|
|
|
Args:
|
|
instance: woo.instance record
|
|
email: customer email address
|
|
wc_data: optional dict with full WC customer payload
|
|
|
|
Returns:
|
|
woo.customer record
|
|
"""
|
|
email = (email or '').strip().lower()
|
|
if not email:
|
|
return self.browse()
|
|
|
|
wc_customer_id = (wc_data or {}).get('id', 0)
|
|
|
|
# Check existing link
|
|
if wc_customer_id:
|
|
existing = self.search([
|
|
('instance_id', '=', instance.id),
|
|
('woo_customer_id', '=', wc_customer_id),
|
|
], limit=1)
|
|
if existing:
|
|
return existing
|
|
|
|
# Check by email
|
|
existing = self.search([
|
|
('instance_id', '=', instance.id),
|
|
('woo_email', '=ilike', email),
|
|
], limit=1)
|
|
if existing:
|
|
if wc_customer_id and not existing.woo_customer_id:
|
|
existing.woo_customer_id = wc_customer_id
|
|
return existing
|
|
|
|
# Find or create partner
|
|
partner = self.env['res.partner'].search([
|
|
('email', '=ilike', email),
|
|
'|', ('company_id', '=', instance.company_id.id), ('company_id', '=', False),
|
|
], limit=1)
|
|
|
|
if not partner:
|
|
billing = (wc_data or {}).get('billing', {})
|
|
partner_vals = instance._prepare_partner_vals(billing) if billing else {
|
|
'name': email.split('@')[0].title(),
|
|
'email': email,
|
|
'company_id': instance.company_id.id,
|
|
}
|
|
partner = self.env['res.partner'].create(partner_vals)
|
|
|
|
# Create woo.customer link
|
|
woo_cust = self.create({
|
|
'instance_id': instance.id,
|
|
'partner_id': partner.id,
|
|
'woo_customer_id': wc_customer_id,
|
|
'woo_email': email,
|
|
'last_synced': fields.Datetime.now(),
|
|
'company_id': instance.company_id.id,
|
|
})
|
|
|
|
instance._log_sync(
|
|
'customer', 'woo_to_odoo', partner.display_name,
|
|
'success', f'Customer created from WC (email: {email})',
|
|
)
|
|
return woo_cust
|