purchase_delivery_carrier: integrate with delivery_carrier_partner_account
This commit is contained in:
parent
056d438413
commit
064983d18a
7 changed files with 105 additions and 29 deletions
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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",
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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)",
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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>
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue