- 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>
58 lines
2.3 KiB
Python
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
|