picking_policy_per_customer: consider the commercial_partner_id as well
This commit is contained in:
parent
af90b2c9f6
commit
38b32ff892
2 changed files with 73 additions and 45 deletions
|
|
@ -2,20 +2,27 @@ from odoo import api, models
|
||||||
|
|
||||||
|
|
||||||
class SaleOrder(models.Model):
|
class SaleOrder(models.Model):
|
||||||
_inherit = 'sale.order'
|
_inherit = "sale.order"
|
||||||
|
|
||||||
@api.onchange('partner_id')
|
@api.onchange("partner_id")
|
||||||
def _onchange_partner_id(self):
|
def _onchange_partner_id(self):
|
||||||
if self.partner_id and self.partner_id.picking_policy:
|
self.picking_policy = (
|
||||||
self.picking_policy = self.partner_id.picking_policy
|
self.partner_id
|
||||||
else:
|
and self.partner_id.picking_policy
|
||||||
self.picking_policy = self.env['ir.config_parameter'].sudo().get_param('sale.default_picking_policy', 'direct')
|
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
|
@api.model_create_multi
|
||||||
def create(self, vals_list):
|
def create(self, vals_list):
|
||||||
for vals in vals_list:
|
for vals in vals_list:
|
||||||
if vals.get('partner_id'):
|
if vals.get("partner_id"):
|
||||||
partner = self.env['res.partner'].browse(vals['partner_id'])
|
partner = self.env["res.partner"].browse(vals["partner_id"])
|
||||||
if partner.picking_policy:
|
partner_picking_policy = (
|
||||||
vals['picking_policy'] = 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)
|
return super().create(vals_list)
|
||||||
|
|
@ -20,49 +20,70 @@ class PurchaseOrder(models.Model):
|
||||||
@api.model_create_multi
|
@api.model_create_multi
|
||||||
def create(self, vals_list):
|
def create(self, vals_list):
|
||||||
res = super().create(vals_list)
|
res = super().create(vals_list)
|
||||||
# Set the carrier for any orders where the vendor has a default set and the
|
for rec in res:
|
||||||
# order's carrier is not already set
|
carrier_id = rec.carrier_id
|
||||||
for rec in res.filtered(
|
account_id = rec.carrier_account_id
|
||||||
lambda order: order.partner_id.purchase_delivery_carrier_id
|
billing_mode = rec.delivery_billing_mode
|
||||||
and not order.carrier_id
|
|
||||||
):
|
if not carrier_id and rec.sender_id.purchase_delivery_carrier_id:
|
||||||
rec.carrier_id = rec.partner_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):
|
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(
|
sender_accounts = (
|
||||||
_predicate
|
rec.sender_id.commercial_partner_id.carrier_account_ids.filtered(
|
||||||
)
|
|
||||||
if recipient_accounts:
|
|
||||||
rec.carrier_account_id = recipient_accounts[0]
|
|
||||||
continue
|
|
||||||
else:
|
|
||||||
sender_accounts = rec.sender_id.carrier_account_ids.filtered(
|
|
||||||
_predicate
|
_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
|
# Based on who owns the carrier account, set the delivery billing mode if it is
|
||||||
# not already set
|
# not already set
|
||||||
for rec in res.filtered(
|
for rec in res.filtered(
|
||||||
lambda order: order.carrier_account_id
|
lambda order: order.carrier_id
|
||||||
and order.carrier_account_id
|
and order.carrier_account_id
|
||||||
and not order.delivery_billing_mode
|
and not order.delivery_billing_mode
|
||||||
):
|
):
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue