feat: implement order sync lifecycle (WC→Odoo SO/invoice, shipping push, completion push)
- Replace _sync_orders placeholder with full WC order import pipeline - Add _sync_order_from_wc, _find_or_create_customer, _prepare_sale_order_vals, _prepare_order_line_vals, _prepare_shipping_line_vals helpers - Add push methods on woo.order: action_push_shipping, action_push_completed, action_push_invoice_pdf, action_push_delivery_pdf, _push_messages_to_wc - Override stock.picking button_validate to auto-create shipment records and push tracking/delivery PDFs to WooCommerce Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,5 +1,9 @@
|
||||
import logging
|
||||
|
||||
from odoo import models, fields
|
||||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class StockPicking(models.Model):
|
||||
_inherit = 'stock.picking'
|
||||
@@ -14,3 +18,40 @@ class StockPicking(models.Model):
|
||||
picking.is_woo_delivery = bool(picking.woo_shipment_ids) or bool(
|
||||
picking.sale_id and picking.sale_id.woo_bind_ids
|
||||
)
|
||||
|
||||
def button_validate(self):
|
||||
"""Override to auto-create shipment and push tracking to WC."""
|
||||
res = super().button_validate()
|
||||
for picking in self:
|
||||
if not picking.sale_id or not picking.sale_id.woo_bind_ids:
|
||||
continue
|
||||
woo_order = picking.sale_id.woo_bind_ids[0]
|
||||
# Create shipment record
|
||||
shipment_vals = {
|
||||
'order_id': woo_order.id,
|
||||
'picking_id': picking.id,
|
||||
'carrier_id': picking.woo_carrier_id.id if picking.woo_carrier_id else False,
|
||||
'tracking_number': picking.woo_tracking_number or '',
|
||||
'shipped_date': fields.Datetime.now(),
|
||||
'is_backorder': bool(picking.backorder_ids),
|
||||
'company_id': picking.company_id.id,
|
||||
}
|
||||
shipment = self.env['woo.shipment'].create(shipment_vals)
|
||||
|
||||
# Auto-push to WC if tracking number is set
|
||||
if picking.woo_tracking_number:
|
||||
try:
|
||||
woo_order.action_push_shipping(
|
||||
picking.woo_tracking_number,
|
||||
picking.woo_carrier_id.id if picking.woo_carrier_id else False,
|
||||
)
|
||||
shipment.synced_to_woo = True
|
||||
except Exception as e:
|
||||
_logger.error("Failed to push shipping to WC: %s", e)
|
||||
|
||||
# Push delivery PDF
|
||||
try:
|
||||
woo_order.action_push_delivery_pdf(picking)
|
||||
except Exception as e:
|
||||
_logger.warning("Failed to push delivery PDF to WC: %s", e)
|
||||
return res
|
||||
|
||||
Reference in New Issue
Block a user