CHANGES
This commit is contained in:
@@ -5,6 +5,7 @@ class WooCategoryMap(models.Model):
|
|||||||
_name = 'woo.category.map'
|
_name = 'woo.category.map'
|
||||||
_description = 'WooCommerce Category Mapping'
|
_description = 'WooCommerce Category Mapping'
|
||||||
_order = 'odoo_category_id'
|
_order = 'odoo_category_id'
|
||||||
|
_rec_name = 'woo_category_name'
|
||||||
|
|
||||||
instance_id = fields.Many2one('woo.instance', required=True, ondelete='cascade')
|
instance_id = fields.Many2one('woo.instance', required=True, ondelete='cascade')
|
||||||
odoo_category_id = fields.Many2one('product.category', string='Odoo Category')
|
odoo_category_id = fields.Many2one('product.category', string='Odoo Category')
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ _logger = logging.getLogger(__name__)
|
|||||||
class WooConflict(models.Model):
|
class WooConflict(models.Model):
|
||||||
_name = 'woo.conflict'
|
_name = 'woo.conflict'
|
||||||
_description = 'WooCommerce Sync Conflict'
|
_description = 'WooCommerce Sync Conflict'
|
||||||
|
_rec_name = 'field_name'
|
||||||
|
|
||||||
instance_id = fields.Many2one('woo.instance', required=True, ondelete='cascade')
|
instance_id = fields.Many2one('woo.instance', required=True, ondelete='cascade')
|
||||||
conflict_type = fields.Selection([
|
conflict_type = fields.Selection([
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ _logger = logging.getLogger(__name__)
|
|||||||
class WooCustomer(models.Model):
|
class WooCustomer(models.Model):
|
||||||
_name = 'woo.customer'
|
_name = 'woo.customer'
|
||||||
_description = 'WooCommerce Customer'
|
_description = 'WooCommerce Customer'
|
||||||
|
_rec_name = 'woo_email'
|
||||||
|
|
||||||
instance_id = fields.Many2one('woo.instance', required=True, ondelete='cascade')
|
instance_id = fields.Many2one('woo.instance', required=True, ondelete='cascade')
|
||||||
partner_id = fields.Many2one('res.partner', required=True)
|
partner_id = fields.Many2one('res.partner', required=True)
|
||||||
|
|||||||
@@ -686,13 +686,15 @@ class WooInstance(models.Model):
|
|||||||
|
|
||||||
# Create woo.order tracking record FIRST to prevent infinite retries
|
# Create woo.order tracking record FIRST to prevent infinite retries
|
||||||
# if action_confirm or invoicing fails later.
|
# if action_confirm or invoicing fails later.
|
||||||
|
wc_status = wc_order.get('status', '')
|
||||||
|
odoo_state = self.env['woo.order'].WC_STATUS_TO_STATE.get(wc_status, 'confirmed')
|
||||||
woo_order = self.env['woo.order'].create({
|
woo_order = self.env['woo.order'].create({
|
||||||
'instance_id': self.id,
|
'instance_id': self.id,
|
||||||
'sale_order_id': sale_order.id,
|
'sale_order_id': sale_order.id,
|
||||||
'woo_order_id': woo_order_id,
|
'woo_order_id': woo_order_id,
|
||||||
'woo_order_number': wc_order.get('number', str(woo_order_id)),
|
'woo_order_number': wc_order.get('number', str(woo_order_id)),
|
||||||
'woo_status': wc_order.get('status', ''),
|
'woo_status': wc_status if wc_status in dict(self.env['woo.order']._fields['woo_status'].selection) else False,
|
||||||
'state': 'confirmed',
|
'state': odoo_state,
|
||||||
'company_id': self.company_id.id,
|
'company_id': self.company_id.id,
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import base64
|
import base64
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
from odoo import fields, models
|
from odoo import api, fields, models
|
||||||
from odoo.exceptions import UserError
|
from odoo.exceptions import UserError
|
||||||
|
|
||||||
_logger = logging.getLogger(__name__)
|
_logger = logging.getLogger(__name__)
|
||||||
@@ -10,12 +10,25 @@ _logger = logging.getLogger(__name__)
|
|||||||
class WooOrder(models.Model):
|
class WooOrder(models.Model):
|
||||||
_name = 'woo.order'
|
_name = 'woo.order'
|
||||||
_description = 'WooCommerce Order'
|
_description = 'WooCommerce Order'
|
||||||
|
_inherit = ['mail.thread', 'mail.activity.mixin']
|
||||||
|
_rec_name = 'display_name'
|
||||||
|
_order = 'id desc'
|
||||||
|
|
||||||
|
display_name = fields.Char(compute='_compute_display_name', store=True)
|
||||||
instance_id = fields.Many2one('woo.instance', required=True, ondelete='cascade')
|
instance_id = fields.Many2one('woo.instance', required=True, ondelete='cascade')
|
||||||
sale_order_id = fields.Many2one('sale.order')
|
sale_order_id = fields.Many2one('sale.order')
|
||||||
woo_order_id = fields.Integer(index=True)
|
woo_order_id = fields.Integer(index=True)
|
||||||
woo_order_number = fields.Char()
|
woo_order_number = fields.Char(string='WC Order #')
|
||||||
woo_status = fields.Char()
|
woo_status = fields.Selection([
|
||||||
|
('pending', 'Pending Payment'),
|
||||||
|
('processing', 'Processing'),
|
||||||
|
('on-hold', 'On Hold'),
|
||||||
|
('completed', 'Completed'),
|
||||||
|
('cancelled', 'Cancelled'),
|
||||||
|
('refunded', 'Refunded'),
|
||||||
|
('failed', 'Failed'),
|
||||||
|
('trash', 'Trashed'),
|
||||||
|
], string='WC Status', tracking=True)
|
||||||
invoice_id = fields.Many2one('account.move')
|
invoice_id = fields.Many2one('account.move')
|
||||||
invoice_synced = fields.Boolean()
|
invoice_synced = fields.Boolean()
|
||||||
company_id = fields.Many2one(
|
company_id = fields.Many2one(
|
||||||
@@ -27,9 +40,123 @@ class WooOrder(models.Model):
|
|||||||
('shipped', 'Shipped'),
|
('shipped', 'Shipped'),
|
||||||
('completed', 'Completed'),
|
('completed', 'Completed'),
|
||||||
('cancelled', 'Cancelled'),
|
('cancelled', 'Cancelled'),
|
||||||
], default='new')
|
], default='new', tracking=True)
|
||||||
|
|
||||||
|
WC_STATUS_TO_STATE = {
|
||||||
|
'pending': 'new',
|
||||||
|
'on-hold': 'new',
|
||||||
|
'processing': 'confirmed',
|
||||||
|
'completed': 'completed',
|
||||||
|
'cancelled': 'cancelled',
|
||||||
|
'refunded': 'cancelled',
|
||||||
|
'failed': 'cancelled',
|
||||||
|
'trash': 'cancelled',
|
||||||
|
}
|
||||||
|
|
||||||
|
@api.onchange('woo_status')
|
||||||
|
def _onchange_woo_status(self):
|
||||||
|
if self.woo_status:
|
||||||
|
self.state = self.WC_STATUS_TO_STATE.get(self.woo_status, self.state)
|
||||||
|
|
||||||
|
def _set_woo_status(self, wc_status):
|
||||||
|
"""Set woo_status and auto-map to Odoo state."""
|
||||||
|
vals = {}
|
||||||
|
if wc_status:
|
||||||
|
vals['woo_status'] = wc_status
|
||||||
|
mapped_state = self.WC_STATUS_TO_STATE.get(wc_status)
|
||||||
|
if mapped_state:
|
||||||
|
vals['state'] = mapped_state
|
||||||
|
if vals:
|
||||||
|
self.write(vals)
|
||||||
shipment_ids = fields.One2many('woo.shipment', 'order_id')
|
shipment_ids = fields.One2many('woo.shipment', 'order_id')
|
||||||
|
|
||||||
|
delivery_count = fields.Integer(compute='_compute_delivery_count')
|
||||||
|
invoice_count = fields.Integer(compute='_compute_invoice_count')
|
||||||
|
|
||||||
|
@api.depends('woo_order_number', 'sale_order_id', 'sale_order_id.name')
|
||||||
|
def _compute_display_name(self):
|
||||||
|
for rec in self:
|
||||||
|
parts = []
|
||||||
|
if rec.woo_order_number:
|
||||||
|
parts.append('WC#%s' % rec.woo_order_number)
|
||||||
|
if rec.sale_order_id:
|
||||||
|
parts.append(rec.sale_order_id.name)
|
||||||
|
rec.display_name = ' — '.join(parts) if parts else 'WC Order #%s' % rec.id
|
||||||
|
|
||||||
|
@api.depends('sale_order_id')
|
||||||
|
def _compute_delivery_count(self):
|
||||||
|
for rec in self:
|
||||||
|
if rec.sale_order_id:
|
||||||
|
rec.delivery_count = self.env['stock.picking'].search_count([
|
||||||
|
('origin', '=', rec.sale_order_id.name),
|
||||||
|
])
|
||||||
|
else:
|
||||||
|
rec.delivery_count = 0
|
||||||
|
|
||||||
|
@api.depends('sale_order_id')
|
||||||
|
def _compute_invoice_count(self):
|
||||||
|
for rec in self:
|
||||||
|
if rec.sale_order_id:
|
||||||
|
rec.invoice_count = self.env['account.move'].search_count([
|
||||||
|
('invoice_origin', '=', rec.sale_order_id.name),
|
||||||
|
('move_type', 'in', ['out_invoice', 'out_refund']),
|
||||||
|
])
|
||||||
|
else:
|
||||||
|
rec.invoice_count = 0
|
||||||
|
|
||||||
|
def action_view_sale_order(self):
|
||||||
|
self.ensure_one()
|
||||||
|
if not self.sale_order_id:
|
||||||
|
return
|
||||||
|
return {
|
||||||
|
'type': 'ir.actions.act_window',
|
||||||
|
'res_model': 'sale.order',
|
||||||
|
'res_id': self.sale_order_id.id,
|
||||||
|
'views': [(False, 'form')],
|
||||||
|
}
|
||||||
|
|
||||||
|
def action_view_deliveries(self):
|
||||||
|
self.ensure_one()
|
||||||
|
pickings = self.env['stock.picking'].search([
|
||||||
|
('origin', '=', self.sale_order_id.name),
|
||||||
|
])
|
||||||
|
if len(pickings) == 1:
|
||||||
|
return {
|
||||||
|
'type': 'ir.actions.act_window',
|
||||||
|
'res_model': 'stock.picking',
|
||||||
|
'res_id': pickings.id,
|
||||||
|
'views': [(False, 'form')],
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
'type': 'ir.actions.act_window',
|
||||||
|
'name': 'Deliveries',
|
||||||
|
'res_model': 'stock.picking',
|
||||||
|
'view_mode': 'list,form',
|
||||||
|
'domain': [('origin', '=', self.sale_order_id.name)],
|
||||||
|
}
|
||||||
|
|
||||||
|
def action_view_invoices(self):
|
||||||
|
self.ensure_one()
|
||||||
|
invoices = self.env['account.move'].search([
|
||||||
|
('invoice_origin', '=', self.sale_order_id.name),
|
||||||
|
('move_type', 'in', ['out_invoice', 'out_refund']),
|
||||||
|
])
|
||||||
|
if len(invoices) == 1:
|
||||||
|
return {
|
||||||
|
'type': 'ir.actions.act_window',
|
||||||
|
'res_model': 'account.move',
|
||||||
|
'res_id': invoices.id,
|
||||||
|
'views': [(False, 'form')],
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
'type': 'ir.actions.act_window',
|
||||||
|
'name': 'Invoices',
|
||||||
|
'res_model': 'account.move',
|
||||||
|
'view_mode': 'list,form',
|
||||||
|
'domain': [('invoice_origin', '=', self.sale_order_id.name),
|
||||||
|
('move_type', 'in', ['out_invoice', 'out_refund'])],
|
||||||
|
}
|
||||||
|
|
||||||
# ------------------------------------------------------------------
|
# ------------------------------------------------------------------
|
||||||
# Push methods (Task 20)
|
# Push methods (Task 20)
|
||||||
# ------------------------------------------------------------------
|
# ------------------------------------------------------------------
|
||||||
@@ -58,7 +185,7 @@ class WooOrder(models.Model):
|
|||||||
update_data['meta_data'] = meta
|
update_data['meta_data'] = meta
|
||||||
|
|
||||||
client.update_order(self.woo_order_id, update_data)
|
client.update_order(self.woo_order_id, update_data)
|
||||||
self.woo_status = 'completed'
|
self._set_woo_status('completed')
|
||||||
self.state = 'shipped'
|
self.state = 'shipped'
|
||||||
|
|
||||||
self.instance_id._log_sync(
|
self.instance_id._log_sync(
|
||||||
@@ -71,8 +198,7 @@ class WooOrder(models.Model):
|
|||||||
self.ensure_one()
|
self.ensure_one()
|
||||||
client = self.instance_id._get_client()
|
client = self.instance_id._get_client()
|
||||||
client.update_order(self.woo_order_id, {'status': 'completed'})
|
client.update_order(self.woo_order_id, {'status': 'completed'})
|
||||||
self.woo_status = 'completed'
|
self._set_woo_status('completed')
|
||||||
self.state = 'completed'
|
|
||||||
|
|
||||||
self.instance_id._log_sync(
|
self.instance_id._log_sync(
|
||||||
'order', 'odoo_to_woo', self.sale_order_id.name,
|
'order', 'odoo_to_woo', self.sale_order_id.name,
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ from odoo import api, fields, models
|
|||||||
class WooPricelistMap(models.Model):
|
class WooPricelistMap(models.Model):
|
||||||
_name = 'woo.pricelist.map'
|
_name = 'woo.pricelist.map'
|
||||||
_description = 'WooCommerce Pricelist Mapping'
|
_description = 'WooCommerce Pricelist Mapping'
|
||||||
|
_rec_name = 'woo_role_name'
|
||||||
|
|
||||||
instance_id = fields.Many2one('woo.instance', required=True, ondelete='cascade')
|
instance_id = fields.Many2one('woo.instance', required=True, ondelete='cascade')
|
||||||
pricelist_id = fields.Many2one('product.pricelist', required=True)
|
pricelist_id = fields.Many2one('product.pricelist', required=True)
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ _logger = logging.getLogger(__name__)
|
|||||||
class WooProductMap(models.Model):
|
class WooProductMap(models.Model):
|
||||||
_name = 'woo.product.map'
|
_name = 'woo.product.map'
|
||||||
_description = 'WooCommerce Product Mapping'
|
_description = 'WooCommerce Product Mapping'
|
||||||
|
_rec_name = 'woo_product_name'
|
||||||
|
|
||||||
instance_id = fields.Many2one('woo.instance', required=True, ondelete='cascade')
|
instance_id = fields.Many2one('woo.instance', required=True, ondelete='cascade')
|
||||||
product_id = fields.Many2one('product.product')
|
product_id = fields.Many2one('product.product')
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ _logger = logging.getLogger(__name__)
|
|||||||
class WooReturn(models.Model):
|
class WooReturn(models.Model):
|
||||||
_name = 'woo.return'
|
_name = 'woo.return'
|
||||||
_description = 'WooCommerce Return'
|
_description = 'WooCommerce Return'
|
||||||
|
_rec_name = 'order_id'
|
||||||
|
|
||||||
instance_id = fields.Many2one('woo.instance', required=True, ondelete='cascade')
|
instance_id = fields.Many2one('woo.instance', required=True, ondelete='cascade')
|
||||||
order_id = fields.Many2one('woo.order', required=True)
|
order_id = fields.Many2one('woo.order', required=True)
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ from odoo import fields, models
|
|||||||
class WooShipment(models.Model):
|
class WooShipment(models.Model):
|
||||||
_name = 'woo.shipment'
|
_name = 'woo.shipment'
|
||||||
_description = 'WooCommerce Shipment'
|
_description = 'WooCommerce Shipment'
|
||||||
|
_rec_name = 'tracking_number'
|
||||||
|
|
||||||
order_id = fields.Many2one('woo.order', required=True, ondelete='cascade')
|
order_id = fields.Many2one('woo.order', required=True, ondelete='cascade')
|
||||||
picking_id = fields.Many2one('stock.picking')
|
picking_id = fields.Many2one('stock.picking')
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ class WooSyncLog(models.Model):
|
|||||||
_name = 'woo.sync.log'
|
_name = 'woo.sync.log'
|
||||||
_description = 'WooCommerce Sync Log'
|
_description = 'WooCommerce Sync Log'
|
||||||
_order = 'create_date desc'
|
_order = 'create_date desc'
|
||||||
|
_rec_name = 'record_ref'
|
||||||
|
|
||||||
instance_id = fields.Many2one('woo.instance', ondelete='cascade')
|
instance_id = fields.Many2one('woo.instance', ondelete='cascade')
|
||||||
sync_type = fields.Selection([
|
sync_type = fields.Selection([
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ from odoo import api, fields, models
|
|||||||
class WooTaxMap(models.Model):
|
class WooTaxMap(models.Model):
|
||||||
_name = 'woo.tax.map'
|
_name = 'woo.tax.map'
|
||||||
_description = 'WooCommerce Tax Mapping'
|
_description = 'WooCommerce Tax Mapping'
|
||||||
|
_rec_name = 'woo_tax_class_name'
|
||||||
|
|
||||||
instance_id = fields.Many2one('woo.instance', required=True, ondelete='cascade')
|
instance_id = fields.Many2one('woo.instance', required=True, ondelete='cascade')
|
||||||
tax_id = fields.Many2one('account.tax', string='Odoo Tax')
|
tax_id = fields.Many2one('account.tax', string='Odoo Tax')
|
||||||
|
|||||||
@@ -31,10 +31,32 @@
|
|||||||
statusbar_visible="new,confirmed,shipped,completed"/>
|
statusbar_visible="new,confirmed,shipped,completed"/>
|
||||||
</header>
|
</header>
|
||||||
<sheet>
|
<sheet>
|
||||||
|
<div class="oe_button_box" name="button_box">
|
||||||
|
<button name="action_view_sale_order" type="object"
|
||||||
|
class="oe_stat_button" icon="fa-file-text-o"
|
||||||
|
invisible="not sale_order_id">
|
||||||
|
<div class="o_stat_info">
|
||||||
|
<span class="o_stat_text">Sale Order</span>
|
||||||
|
</div>
|
||||||
|
</button>
|
||||||
|
<button name="action_view_deliveries" type="object"
|
||||||
|
class="oe_stat_button" icon="fa-truck"
|
||||||
|
invisible="delivery_count == 0">
|
||||||
|
<field name="delivery_count" widget="statinfo" string="Delivery"/>
|
||||||
|
</button>
|
||||||
|
<button name="action_view_invoices" type="object"
|
||||||
|
class="oe_stat_button" icon="fa-pencil-square-o"
|
||||||
|
invisible="invoice_count == 0">
|
||||||
|
<field name="invoice_count" widget="statinfo" string="Invoices"/>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
<div class="oe_title">
|
||||||
|
<h1>
|
||||||
|
<field name="woo_order_number" readonly="1" placeholder="WC Order #"/>
|
||||||
|
</h1>
|
||||||
|
</div>
|
||||||
<group>
|
<group>
|
||||||
<group string="WooCommerce">
|
<group string="WooCommerce">
|
||||||
<field name="woo_order_number"/>
|
|
||||||
<field name="woo_order_id"/>
|
|
||||||
<field name="woo_status"/>
|
<field name="woo_status"/>
|
||||||
<field name="instance_id"/>
|
<field name="instance_id"/>
|
||||||
</group>
|
</group>
|
||||||
@@ -60,6 +82,7 @@
|
|||||||
</page>
|
</page>
|
||||||
</notebook>
|
</notebook>
|
||||||
</sheet>
|
</sheet>
|
||||||
|
<chatter/>
|
||||||
</form>
|
</form>
|
||||||
</field>
|
</field>
|
||||||
</record>
|
</record>
|
||||||
|
|||||||
Reference in New Issue
Block a user