Files
Odoo-Modules/fusion-woo-odoo/fusion_woocommerce/models/stock_picking.py
gsinghpal 9c2c043de9 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>
2026-03-31 21:01:48 -04:00

58 lines
2.3 KiB
Python

import logging
from odoo import models, fields
_logger = logging.getLogger(__name__)
class StockPicking(models.Model):
_inherit = 'stock.picking'
woo_tracking_number = fields.Char(string='WC Tracking Number')
woo_carrier_id = fields.Many2one('woo.shipping.carrier', string='WC Shipping Carrier')
woo_shipment_ids = fields.One2many('woo.shipment', 'picking_id', string='WC Shipments')
is_woo_delivery = fields.Boolean(compute='_compute_is_woo_delivery', string='Is WC Delivery')
def _compute_is_woo_delivery(self):
for picking in self:
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