From 064983d18a4fce737a825ffede9a04f8e3d72505 Mon Sep 17 00:00:00 2001 From: Marc Durepos Date: Thu, 16 Jan 2025 16:02:03 -0500 Subject: [PATCH] purchase_delivery_carrier: integrate with delivery_carrier_partner_account --- .../models/sales_order.py | 18 ++-- purchase_delivery_carrier/__manifest__.py | 2 +- .../models/purchase_order.py | 88 ++++++++++++++++--- .../models/res_partner.py | 9 +- .../tests/test_purchase_delivery.py | 6 +- .../views/purchase_order_views.xml | 8 +- .../views/res_partner_views.xml | 3 +- 7 files changed, 105 insertions(+), 29 deletions(-) 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 @@ - + +