purchase_delivery_carrier: integrate with delivery_carrier_partner_account

This commit is contained in:
Marc Durepos 2025-01-16 16:02:03 -05:00
parent 056d438413
commit 064983d18a
7 changed files with 105 additions and 29 deletions

View file

@ -11,21 +11,25 @@ class SalesOrder(models.Model):
) )
sender_id = fields.Many2one( sender_id = fields.Many2one(
comodel_name="res.partner", comodel_name="res.partner",
related="company_id.partner_id", related="warehouse_id.partner_id",
) )
@api.model @api.model
def write(self, values): def write(self, vals):
res = super().write(values) res = super().write(vals)
# If carrier account ID changes for a confirmed order, change it on its if (
# pending pickings as well. "carrier_account_id" in vals
if "carrier_account_id" in values: or "carrier_id" in vals
or "delivery_billing_mode" in vals
):
for rec in self.filtered( for rec in self.filtered(
lambda order: order.state not in ["draft", "sent"] lambda order: order.state not in ["draft", "sent"]
): ):
for picking in rec.picking_ids.filtered( for picking in rec.picking_ids.filtered(
lambda pick: pick.state not in ("done", "cancel") lambda pick: pick.state not in ["done", "cancel"]
): ):
picking.carrier_id = rec.carrier_id
picking.delivery_billing_mode = rec.delivery_billing_mode
picking.carrier_account_id = rec.carrier_account_id picking.carrier_account_id = rec.carrier_account_id
return res return res

View file

@ -25,7 +25,7 @@
"author": "Bemade Inc.", "author": "Bemade Inc.",
"website": "http://www.bemade.org", "website": "http://www.bemade.org",
"license": "LGPL-3", "license": "LGPL-3",
"depends": ["purchase", "delivery", "stock"], "depends": ["purchase", "delivery", "stock", "delivery_carrier_partner_account"],
"data": [ "data": [
"views/purchase_order_views.xml", "views/purchase_order_views.xml",
"views/res_partner_views.xml", "views/res_partner_views.xml",

View file

@ -2,25 +2,85 @@ from odoo import models, fields, api
class PurchaseOrder(models.Model): class PurchaseOrder(models.Model):
_inherit = "purchase.order" _inherit = ["purchase.order", "carrier.account.mixin"]
_name = "purchase.order"
delivery_carrier_id = fields.Many2one( recipient_id = fields.Many2one(
comodel_name="delivery.carrier", comodel_name="res.partner",
string="Delivery Carrier", string="Recipient",
compute="_compute_delivery_carrier_id", related="picking_type_id.warehouse_id.partner_id",
inverse="_inverse_delivery_carrier_id",
store=True,
) )
@api.depends("partner_id") sender_id = fields.Many2one(
def _compute_delivery_carrier_id(self): comodel_name="res.partner",
for rec in self: string="Sender",
rec.delivery_carrier_id = rec.partner_id.delivery_carrier_id related="partner_id",
)
def _inverse_delivery_carrier_id(self): @api.model_create_multi
pass 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
# Set the carrier account for any orders where the vendor has a default and the
# order's carrier account is not already set
for rec in res.filtered(
lambda order: order.carrier_id
and order.partner_id.purchase_delivery_carrier_account_id
and not order.carrier_account_id
):
rec.carrier_account_id = rec.partner_id.purchase_delivery_carrier_account_id
# 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
and order.carrier_account_id
and not order.delivery_billing_mode
):
if rec.carrier_account_id in (
self.sender_id.carrier_account_ids
| self.sender_id.commercial_partner_id.carrier_account_ids
):
rec.delivery_billing_mode = "prepaid"
elif rec.carrier_account_id in (
self.recipient_id.carrier_account_ids
| self.recipient_id.commercial_partner_id.carrier_account_ids
):
rec.delivery_billing_mode = "collect"
else:
rec.delivery_billing_mode = "third party"
return res
def write(self, vals):
res = super().write(vals)
if (
"carrier_account_id" in vals
or "carrier_id" in vals
or "delivery_billing_mode" in vals
):
for rec in self.filtered(
lambda order: order.state not in ["draft", "sent"]
):
for picking in rec.picking_ids.filtered(
lambda pick: pick.state not in ["done", "cancel"]
):
picking.carrier_id = rec.carrier_id
picking.delivery_billing_mode = rec.delivery_billing_mode
picking.carrier_account_id = rec.carrier_account_id
return res
def _prepare_picking(self): def _prepare_picking(self):
res = super()._prepare_picking() res = super()._prepare_picking()
res.update(carrier_id=self.delivery_carrier_id.id) res.update(
carrier_id=self.carrier_id.id,
delivery_billing_mode=self.delivery_billing_mode,
carrier_account_id=self.carrier_account_id.id,
)
return res return res

View file

@ -4,7 +4,12 @@ from odoo import models, fields, api
class ResPartner(models.Model): class ResPartner(models.Model):
_inherit = "res.partner" _inherit = "res.partner"
delivery_carrier_id = fields.Many2one( purchase_delivery_carrier_id = fields.Many2one(
comodel_name="delivery.carrier", comodel_name="delivery.carrier",
string="Default Carrier", string="Default Carrier (Inbound)",
)
purchase_delivery_carrier_account_id = fields.Many2one(
comodel_name="delivery.carrier.account",
string="Default Carrier Account (Inbound)",
) )

View file

@ -13,7 +13,7 @@ class TestPurchaseDelivery(TransactionCase):
cls.partner_1 = cls.env["res.partner"].create( cls.partner_1 = cls.env["res.partner"].create(
{ {
"name": "Test 1", "name": "Test 1",
"delivery_carrier_id": cls.carrier_1.id, "purchase_delivery_carrier_id": cls.carrier_1.id,
} }
) )
cls.partner_2 = cls.env["res.partner"].create( cls.partner_2 = cls.env["res.partner"].create(
@ -49,7 +49,7 @@ class TestPurchaseDelivery(TransactionCase):
} }
) )
self.assertEqual(purchase_order.delivery_carrier_id, self.carrier_1) self.assertEqual(purchase_order.carrier_id, self.carrier_1)
def test_carrier_not_set_on_purchase_order_when_default_is_not_set(self): def test_carrier_not_set_on_purchase_order_when_default_is_not_set(self):
purchase_order = self.env["purchase.order"].create( purchase_order = self.env["purchase.order"].create(
@ -57,7 +57,7 @@ class TestPurchaseDelivery(TransactionCase):
"partner_id": self.partner_2.id, "partner_id": self.partner_2.id,
} }
) )
self.assertFalse(purchase_order.delivery_carrier_id) self.assertFalse(purchase_order.carrier_id)
def test_carrier_trickles_down_to_picking(self): def test_carrier_trickles_down_to_picking(self):
purchase_order = self.env["purchase.order"].create( purchase_order = self.env["purchase.order"].create(

View file

@ -6,7 +6,13 @@
<field name="inherit_id" ref="purchase.purchase_order_form"/> <field name="inherit_id" ref="purchase.purchase_order_form"/>
<field name="arch" type="xml"> <field name="arch" type="xml">
<group name="other_info"> <group name="other_info">
<field name="delivery_carrier_id"/> <field name="valid_carrier_account_ids" invisible="1"/>
<field name="carrier_id"/>
<field name="delivery_billing_mode"/>
<field name="carrier_account_id"
domain="[('id', 'in', valid_carrier_account_ids)]"
readonly="not delivery_billing_mode or delivery_billing_mode == 'no charge'"
/>
</group> </group>
</field> </field>

View file

@ -6,7 +6,8 @@
<field name="inherit_id" ref="purchase.view_partner_property_form"/> <field name="inherit_id" ref="purchase.view_partner_property_form"/>
<field name="arch" type="xml"> <field name="arch" type="xml">
<group name="purchase" position="inside"> <group name="purchase" position="inside">
<field name="delivery_carrier_id"/> <field name="purchase_delivery_carrier_id"/>
<field name="purchase_delivery_carrier_account_id"/>
</group> </group>
</field> </field>
</record> </record>