From e47ddb6265411d8c31c9b52f5e3ca8694a46918f Mon Sep 17 00:00:00 2001 From: "chafique.delli" Date: Fri, 14 Oct 2022 12:53:57 +0200 Subject: [PATCH] [14.0][IMP] purchase_sale_inter_company: the sale order is updated when the purchase order is modified --- purchase_sale_inter_company/__manifest__.py | 11 +++-- .../models/purchase_order.py | 49 ++++++++++++++----- .../tests/test_inter_company_purchase_sale.py | 12 +++++ .../views/purchase_view.xml | 17 +++++++ .../odoo/addons/purchase_sale_inter_company | 1 + setup/purchase_sale_inter_company/setup.py | 6 +++ 6 files changed, 82 insertions(+), 14 deletions(-) create mode 100644 purchase_sale_inter_company/views/purchase_view.xml create mode 120000 setup/purchase_sale_inter_company/odoo/addons/purchase_sale_inter_company create mode 100644 setup/purchase_sale_inter_company/setup.py diff --git a/purchase_sale_inter_company/__manifest__.py b/purchase_sale_inter_company/__manifest__.py index d5f07441f9f..25872121d25 100644 --- a/purchase_sale_inter_company/__manifest__.py +++ b/purchase_sale_inter_company/__manifest__.py @@ -6,12 +6,17 @@ { "name": "Inter Company Module for Purchase to Sale Order", "summary": "Intercompany PO/SO rules", - "version": "15.0.1.0.0", + "version": "16.0.1.0.0", "category": "Purchase Management", "website": "https://github.com/OCA/multi-company", "author": "Odoo SA, Akretion, Tecnativa, Odoo Community Association (OCA)", "license": "AGPL-3", "installable": True, - "depends": ["sale", "purchase", "account_invoice_inter_company"], - "data": ["views/res_config_view.xml"], + "depends": [ + "sale", + "purchase", + "account_invoice_inter_company", + "base_view_inheritance_extension", + ], + "data": ["views/res_config_view.xml", "views/purchase_view.xml"], } diff --git a/purchase_sale_inter_company/models/purchase_order.py b/purchase_sale_inter_company/models/purchase_order.py index c229d7d25b1..4cab13c5528 100644 --- a/purchase_sale_inter_company/models/purchase_order.py +++ b/purchase_sale_inter_company/models/purchase_order.py @@ -3,13 +3,20 @@ # Copyright 2018-2019 Tecnativa - Carlos Dauden # License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl). -from odoo import _, models +from odoo import _, fields, models from odoo.exceptions import UserError class PurchaseOrder(models.Model): _inherit = "purchase.order" + intercompany_sale_id = fields.Many2one( + comodel_name="sale.order", + string="Destination Sale Order", + readonly=True, + copy=False, + ) + def button_approve(self, force=False): """Generate inter company sale order base on conditions.""" res = super().button_approve(force) @@ -81,16 +88,28 @@ def _inter_company_create_sale_order(self, dest_company): "purchase price list currency." ) ) + # if a sale order has already been generated + # delete it and force the same number + force_number = False + if self.intercompany_sale_id and self.intercompany_sale_id.state in [ + "draft", + "cancel", + ]: + force_number = self.intercompany_sale_id.name + self.intercompany_sale_id.with_context(force_delete=True).unlink() # create the SO and generate its lines from the PO lines sale_order_data = self._prepare_sale_order_data( self.name, company_partner, dest_company, self.dest_address_id ) + if force_number: + sale_order_data["name"] = force_number sale_order = ( self.env["sale.order"] .with_user(intercompany_user.id) .sudo() .create(sale_order_data) ) + self.write({"intercompany_sale_id": sale_order.id}) for purchase_line in self.order_line: sale_line_data = self._prepare_sale_order_line_data( purchase_line, dest_company, sale_order @@ -165,14 +184,22 @@ def _prepare_sale_order_line_data(self, purchase_line, dest_company, sale_order) return new_line._convert_to_write(new_line._cache) def button_cancel(self): - sale_orders = ( - self.env["sale.order"] - .sudo() - .search([("auto_purchase_order_id", "in", self.ids)]) - ) - for so in sale_orders: - if so.state not in ["draft", "sent", "cancel"]: - raise UserError(_("You can't cancel an order that is %s") % so.state) - sale_orders.action_cancel() - self.write({"partner_ref": False}) + if self.intercompany_sale_id: + if self.intercompany_sale_id.state not in ["draft", "sent", "cancel"]: + raise UserError( + _( + "You can not cancel your purchase order {}.\n" + "The sale order {} at your supplier {} that is linked " + "to your purchase order, is in the state {}.\n" + "In order to cancel your purchase order, you must first " + "ask your supplier to cancel his sale order." + ).format( + self.name, + self.intercompany_sale_id.name, + self.partner_id.name, + self.intercompany_sale_id.state, + ) + ) + self.intercompany_sale_id.sudo().action_cancel() + self.write({"partner_ref": False}) return super().button_cancel() diff --git a/purchase_sale_inter_company/tests/test_inter_company_purchase_sale.py b/purchase_sale_inter_company/tests/test_inter_company_purchase_sale.py index 3859c78641e..7a0463ebe16 100644 --- a/purchase_sale_inter_company/tests/test_inter_company_purchase_sale.py +++ b/purchase_sale_inter_company/tests/test_inter_company_purchase_sale.py @@ -167,3 +167,15 @@ def test_po_with_contact_as_partner(self): self.assertEqual(len(sale), 1) self.assertEqual(sale.state, "sale") self.assertEqual(sale.partner_id, self.partner_company_a) + + def test_update_po(self): + self.company_b.sale_auto_validation = False + old_sale = self._approve_po() + old_sale_name = old_sale.name + self.purchase_company_a.button_cancel() + self.purchase_company_a.order_line.product_qty = 5.0 + self.company_b.sale_auto_validation = True + new_sale = self._approve_po() + self.assertEqual(new_sale.order_line.product_uom_qty, 5.0) + self.assertEqual(new_sale.state, "sale") + self.assertEqual(new_sale.name, old_sale_name) diff --git a/purchase_sale_inter_company/views/purchase_view.xml b/purchase_sale_inter_company/views/purchase_view.xml new file mode 100644 index 00000000000..8cd60919776 --- /dev/null +++ b/purchase_sale_inter_company/views/purchase_view.xml @@ -0,0 +1,17 @@ + + + + purchase.order + + + + + + + + ['|', ('state', 'in', ('done', 'cancel')), ('intercompany_sale_id', '!=', False), ('state', '=', 'purchase')] + + + + + diff --git a/setup/purchase_sale_inter_company/odoo/addons/purchase_sale_inter_company b/setup/purchase_sale_inter_company/odoo/addons/purchase_sale_inter_company new file mode 120000 index 00000000000..c0d14518beb --- /dev/null +++ b/setup/purchase_sale_inter_company/odoo/addons/purchase_sale_inter_company @@ -0,0 +1 @@ +../../../../purchase_sale_inter_company \ No newline at end of file diff --git a/setup/purchase_sale_inter_company/setup.py b/setup/purchase_sale_inter_company/setup.py new file mode 100644 index 00000000000..28c57bb6403 --- /dev/null +++ b/setup/purchase_sale_inter_company/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +)