picking_policy_per_customer: consider the commercial_partner_id as well

This commit is contained in:
Marc Durepos 2025-01-18 09:12:18 -05:00
parent af90b2c9f6
commit 38b32ff892
2 changed files with 73 additions and 45 deletions

View file

@ -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)
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)

View file

@ -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
):