From ed848863f95373cf72ec7cba62fcd42a9d47e429 Mon Sep 17 00:00:00 2001 From: Marc Durepos Date: Wed, 15 Jan 2025 15:52:03 -0500 Subject: [PATCH] working on purchase_customer_requisition --- .../models/purchase_order_line.py | 76 ++++++++++++------- .../tests/test_purchase_order.py | 55 ++++++++++---- 2 files changed, 89 insertions(+), 42 deletions(-) diff --git a/purchase_customer_requisition/models/purchase_order_line.py b/purchase_customer_requisition/models/purchase_order_line.py index ef5609c..10d1989 100644 --- a/purchase_customer_requisition/models/purchase_order_line.py +++ b/purchase_customer_requisition/models/purchase_order_line.py @@ -4,15 +4,12 @@ from odoo import models, fields, api class PurchaseOrderLine(models.Model): _inherit = "purchase.order.line" - customer_ids = fields.Many2many( - # related='order_id.requisition_id.customer_ids', - string="Customers", - store=True, - help="Customers associated with this purchase order line", - ) - requisition_id = fields.Many2one( - related="order_id.requisition_id", string="Purchase Requisition", store=True + comodel_name="purchase.requisition", + string="Agreement", + store=True, + compute="_compute_requisition_id", + inverse="_inverse_requisition_id", ) requisition_name = fields.Char( @@ -20,13 +17,49 @@ class PurchaseOrderLine(models.Model): string="Agreement", ) - def _get_product_purchase_description(self, product_lang): - name = super()._get_product_purchase_description(product_lang) - if self.requisition_id: - name = f"[REQ/{self.requisition_id.name}] {name}" - if self.customer_ids: - name = f"[{', '.join(self.customer_ids.mapped('name'))}] {name}" - return name + @api.model_create_multi + def create(self, vals_list): + return super().create(vals_list) + + @api.depends("order_id.requisition_id", "product_id") + def _compute_requisition_id(self): + for line in self: + customer = line.sale_order_id.partner_id + domain = [ + ("requisition_id.vendor_id", "=", line.order_id.partner_id.id), + ("product_id", "=", line.product_id.id), + ] + requisition = self.order_id.requisition_id + if customer: + domain += [ + "|", + ("requisition_id.customer_ids", "in", [customer.id]), + ("requisition_id.customer_ids", "=", False), + ] + else: + domain += [ + "|", + ( + "requisition_id", + "=", + requisition.id, + ), + ("requisition_id.customer_ids", "=", False), + ] + requisition_lines = self.env["purchase.requisition.line"].search(domain) + # If the current order's requisition_id is in the possible lines, use it + if line.order_id.requisition_id and requisition_lines: + line.requisition_id = requisition_lines.filtered( + lambda req_line: req_line.requisition_id + == line.order_id.requisition_id + ) + if not line.requisition_id and requisition_lines: + line.requisition_id = requisition_lines[0] + else: + line.requisition_id = False + + def _inverse_requisition_id(self): + pass @api.model def _prepare_purchase_order_line( @@ -48,19 +81,6 @@ class PurchaseOrderLine(models.Model): res["product_qty"] = product_qty return res - @api.model_create_multi - def create(self, vals_list): - lines = super().create(vals_list) - for line in lines: - if line.name: - name = line.name - if line.requisition_id: - name = f"[REQ/{line.requisition_id.name}] {name}" - if line.customer_ids: - name = f"[{', '.join(line.customer_ids.mapped('name'))}] {name}" - line.name = name - return lines - def _find_candidate( self, product_id, diff --git a/purchase_customer_requisition/tests/test_purchase_order.py b/purchase_customer_requisition/tests/test_purchase_order.py index 2692980..c0e6f6a 100644 --- a/purchase_customer_requisition/tests/test_purchase_order.py +++ b/purchase_customer_requisition/tests/test_purchase_order.py @@ -8,34 +8,59 @@ class TestPurchaseOrder(TransactionCase): @classmethod def setUpClass(cls): super().setUpClass() + cls.mto_route = cls.env.ref("stock.route_warehouse0_mto") + cls.buy_route = cls.env.ref("purchase_stock.route_warehouse0_buy") + cls.mto_route.active = True cls.supplier = cls.env.ref("base.res_partner_18") cls.client_1 = cls.env.ref("base.res_partner_2") cls.client_2 = cls.env.ref("base.res_partner_3") cls.client_3 = cls.env.ref("base.res_partner_4") - cls.product_1 = cls.env.ref("product.product_delivery_01") - cls.product_2 = cls.env.ref("product.product_delivery_02") + cls.product_1 = cls.env["product.product"].create( + { + "name": "SuperProduct", + "is_storable": True, + "route_ids": [(6, 0, (cls.mto_route + cls.buy_route).ids)], + "seller_ids": [ + ( + 0, + 0, + { + "partner_id": cls.supplier.id, + }, + ) + ], + } + ) - cls.env["stock.rule"].search( - [ - ("action", "=", "pull"), - ( - "location_dest_id", - "=", - cls.env.ref("stock.stock_location_customers").id, - ), - ] - ).write({"procure_method": "mts_else_mto"}) + cls.product_2 = cls.env["product.product"].create( + { + "name": "SuperProduct2", + "is_storable": True, + "route_ids": [(6, 0, (cls.mto_route + cls.buy_route).ids)], + "seller_ids": [ + ( + 0, + 0, + { + "partner_id": cls.supplier.id, + }, + ) + ], + } + ) cls.env["product.supplierinfo"].create( [ { "partner_id": cls.supplier.id, "product_id": cls.product_1.id, + "product_tmpl_id": cls.product_1.product_tmpl_id.id, "price": 2000, }, { "partner_id": cls.supplier.id, "product_id": cls.product_2.id, + "product_tmpl_id": cls.product_1.product_tmpl_id.id, "price": 3000, }, ] @@ -44,7 +69,7 @@ class TestPurchaseOrder(TransactionCase): cls.agreement_1 = cls.env["purchase.requisition"].create( { "name": "ATRACK 123", - "vendor_id": 1, + "vendor_id": cls.supplier.id, "customer_ids": [Command.set([cls.client_1.id, cls.client_2.id])], "line_ids": [ Command.create( @@ -70,7 +95,7 @@ class TestPurchaseOrder(TransactionCase): cls.agreement_2 = cls.env["purchase.requisition"].create( { "name": "ATRACK 456", - "vendor_id": 1, + "vendor_id": cls.supplier.id, "customer_ids": [Command.set([cls.client_3.id])], "line_ids": [ Command.create( @@ -104,4 +129,6 @@ class TestPurchaseOrder(TransactionCase): sale_order.action_confirm() purchase_line = sale_order.order_line[0].purchase_line_ids + self.assertTrue(purchase_line) + self.assertEqual(purchase_line.order_id.partner_id, self.supplier) self.assertEqual(purchase_line.requisition_id, self.agreement_1)