diff --git a/delivery_carrier_partner_account/models/sales_order.py b/delivery_carrier_partner_account/models/sales_order.py
index 949eba2..4b886e3 100644
--- a/delivery_carrier_partner_account/models/sales_order.py
+++ b/delivery_carrier_partner_account/models/sales_order.py
@@ -11,21 +11,25 @@ class SalesOrder(models.Model):
)
sender_id = fields.Many2one(
comodel_name="res.partner",
- related="company_id.partner_id",
+ related="warehouse_id.partner_id",
)
@api.model
- def write(self, values):
- res = super().write(values)
- # If carrier account ID changes for a confirmed order, change it on its
- # pending pickings as well.
- if "carrier_account_id" in values:
+ 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")
+ 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
diff --git a/purchase_delivery_carrier/__manifest__.py b/purchase_delivery_carrier/__manifest__.py
index 5320bad..e472db4 100644
--- a/purchase_delivery_carrier/__manifest__.py
+++ b/purchase_delivery_carrier/__manifest__.py
@@ -25,7 +25,7 @@
"author": "Bemade Inc.",
"website": "http://www.bemade.org",
"license": "LGPL-3",
- "depends": ["purchase", "delivery", "stock"],
+ "depends": ["purchase", "delivery", "stock", "delivery_carrier_partner_account"],
"data": [
"views/purchase_order_views.xml",
"views/res_partner_views.xml",
diff --git a/purchase_delivery_carrier/models/purchase_order.py b/purchase_delivery_carrier/models/purchase_order.py
index d081f10..ab32b5f 100644
--- a/purchase_delivery_carrier/models/purchase_order.py
+++ b/purchase_delivery_carrier/models/purchase_order.py
@@ -2,25 +2,85 @@ from odoo import models, fields, api
class PurchaseOrder(models.Model):
- _inherit = "purchase.order"
+ _inherit = ["purchase.order", "carrier.account.mixin"]
+ _name = "purchase.order"
- delivery_carrier_id = fields.Many2one(
- comodel_name="delivery.carrier",
- string="Delivery Carrier",
- compute="_compute_delivery_carrier_id",
- inverse="_inverse_delivery_carrier_id",
- store=True,
+ recipient_id = fields.Many2one(
+ comodel_name="res.partner",
+ string="Recipient",
+ related="picking_type_id.warehouse_id.partner_id",
)
- @api.depends("partner_id")
- def _compute_delivery_carrier_id(self):
- for rec in self:
- rec.delivery_carrier_id = rec.partner_id.delivery_carrier_id
+ sender_id = fields.Many2one(
+ comodel_name="res.partner",
+ string="Sender",
+ related="partner_id",
+ )
- def _inverse_delivery_carrier_id(self):
- pass
+ @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
+
+ # 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):
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
diff --git a/purchase_delivery_carrier/models/res_partner.py b/purchase_delivery_carrier/models/res_partner.py
index c26bbbd..ee19750 100644
--- a/purchase_delivery_carrier/models/res_partner.py
+++ b/purchase_delivery_carrier/models/res_partner.py
@@ -4,7 +4,12 @@ from odoo import models, fields, api
class ResPartner(models.Model):
_inherit = "res.partner"
- delivery_carrier_id = fields.Many2one(
+ purchase_delivery_carrier_id = fields.Many2one(
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)",
)
diff --git a/purchase_delivery_carrier/tests/test_purchase_delivery.py b/purchase_delivery_carrier/tests/test_purchase_delivery.py
index 8067a96..7d55652 100644
--- a/purchase_delivery_carrier/tests/test_purchase_delivery.py
+++ b/purchase_delivery_carrier/tests/test_purchase_delivery.py
@@ -13,7 +13,7 @@ class TestPurchaseDelivery(TransactionCase):
cls.partner_1 = cls.env["res.partner"].create(
{
"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(
@@ -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):
purchase_order = self.env["purchase.order"].create(
@@ -57,7 +57,7 @@ class TestPurchaseDelivery(TransactionCase):
"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):
purchase_order = self.env["purchase.order"].create(
diff --git a/purchase_delivery_carrier/views/purchase_order_views.xml b/purchase_delivery_carrier/views/purchase_order_views.xml
index 50b3e90..5074dec 100644
--- a/purchase_delivery_carrier/views/purchase_order_views.xml
+++ b/purchase_delivery_carrier/views/purchase_order_views.xml
@@ -6,7 +6,13 @@
-
+
+
+
+
diff --git a/purchase_delivery_carrier/views/res_partner_views.xml b/purchase_delivery_carrier/views/res_partner_views.xml
index e4942e3..914659a 100644
--- a/purchase_delivery_carrier/views/res_partner_views.xml
+++ b/purchase_delivery_carrier/views/res_partner_views.xml
@@ -6,7 +6,8 @@
-
+
+