diff --git a/picking_policy_per_customer/models/sale_order.py b/picking_policy_per_customer/models/sale_order.py index 604eed0..3b8a2bd 100644 --- a/picking_policy_per_customer/models/sale_order.py +++ b/picking_policy_per_customer/models/sale_order.py @@ -2,20 +2,27 @@ from odoo import api, models class SaleOrder(models.Model): - _inherit = 'sale.order' + _inherit = "sale.order" - @api.onchange('partner_id') + @api.onchange("partner_id") def _onchange_partner_id(self): - if self.partner_id and self.partner_id.picking_policy: - self.picking_policy = self.partner_id.picking_policy - else: - self.picking_policy = self.env['ir.config_parameter'].sudo().get_param('sale.default_picking_policy', 'direct') + self.picking_policy = ( + self.partner_id + and self.partner_id.picking_policy + or self.parnter_id.commercial_partner_id.picking_policy + ) or self.env["ir.config_parameter"].sudo().get_param( + "sale.default_picking_policy", "direct" + ) @api.model_create_multi def create(self, vals_list): for vals in vals_list: - if vals.get('partner_id'): - partner = self.env['res.partner'].browse(vals['partner_id']) - if partner.picking_policy: - vals['picking_policy'] = partner.picking_policy - return super().create(vals_list) \ No newline at end of file + if vals.get("partner_id"): + partner = self.env["res.partner"].browse(vals["partner_id"]) + partner_picking_policy = ( + partner.picking_policy + or partner.commercial_partner_id.picking_policy + ) + if partner_picking_policy: + vals["picking_policy"] = partner_picking_policy + return super().create(vals_list) diff --git a/purchase_delivery_carrier/models/purchase_order.py b/purchase_delivery_carrier/models/purchase_order.py index c122635..b09b491 100644 --- a/purchase_delivery_carrier/models/purchase_order.py +++ b/purchase_delivery_carrier/models/purchase_order.py @@ -20,49 +20,70 @@ class PurchaseOrder(models.Model): @api.model_create_multi def create(self, vals_list): res = super().create(vals_list) - # Set the carrier for any orders where the vendor has a default set and the - # order's carrier is not already set - for rec in res.filtered( - lambda order: order.partner_id.purchase_delivery_carrier_id - and not order.carrier_id - ): - rec.carrier_id = rec.partner_id.purchase_delivery_carrier_id + for rec in res: + carrier_id = rec.carrier_id + account_id = rec.carrier_account_id + billing_mode = rec.delivery_billing_mode + + if not carrier_id and rec.sender_id.purchase_delivery_carrier_id: + carrier_id = rec.sender_id.purchase_delivery_carrier_id + + if carrier_id: - # If the carrier is set, but not the account, try to set it - for rec in res.filtered( - lambda order: order.carrier_id and not order.carrier_account_id - ): - # A matching supplier default is a match only if the carrier is the same - if ( - rec.partner_id.purchase_delivery_carrier_account_id - and rec.partner_id.purchase_delivery_carrier_account_id.delivery_carrier_id - == rec.carrier_id - ): - rec.carrier_account_id = ( - rec.partner_id.purchase_delivery_carrier_account_id - ) - else: - # Search for an account matching the carrier on the recipient def _predicate(account): - return account.delivery_carrier_id == rec.carrier_id + return account.delivery_carrier_id == carrier_id - recipient_accounts = rec.recipient_id.carrier_account_ids.filtered( - _predicate - ) - if recipient_accounts: - rec.carrier_account_id = recipient_accounts[0] - continue - else: - sender_accounts = rec.sender_id.carrier_account_ids.filtered( + sender_accounts = ( + rec.sender_id.commercial_partner_id.carrier_account_ids.filtered( _predicate ) - if sender_accounts: - rec.carrier_account_id = sender_accounts[0] + ) + recipient_accounts = ( + rec.recipient_id.commercial_partner_id.carrier_account_ids.filtered( + _predicate + ) + ) + if not account_id: + if ( + rec.partner_id.purchase_delivery_carrier_account_id + and rec.partner_id.purchase_delivery_carrier_account_id.delivery_carrier_id + == carrier_id + ): + account_id = rec.partner_id.purchase_delivery_carrier_account_id + else: + # Search for an account matching the carrier on the recipient + if recipient_accounts: + account_id = recipient_accounts[0] + continue + else: + if sender_accounts: + account_id = sender_accounts[0] + if account_id and not billing_mode: + if account_id in sender_accounts: + billing_mode = "ppc" + elif account_id in recipient_accounts: + billing_mode = "collect" + else: + billing_mode = "third party" + if any( + [ + account_id != rec.carrier_account_id, + billing_mode != rec.delivery_billing_mode, + carrier_id != rec.carrier_id, + ] + ): + rec.write( + { + "carrier_id": carrier_id.id, + "carrier_account_id": account_id.id, + "delivery_billing_mode": billing_mode, + } + ) # Based on who owns the carrier account, set the delivery billing mode if it is # not already set for rec in res.filtered( - lambda order: order.carrier_account_id + lambda order: order.carrier_id and order.carrier_account_id and not order.delivery_billing_mode ):