purchase_customer_requisition: removing agreement from a line recomputes pricing

This commit is contained in:
Marc Durepos 2025-01-16 12:02:42 -05:00
parent 1122f71628
commit 35e04f678c
4 changed files with 37 additions and 12 deletions

View file

@ -18,7 +18,6 @@
"purchase_requisition",
],
"data": [
"security/ir.model.access.csv",
"views/purchase_views.xml",
"views/purchase_requisition_views.xml",
],

View file

@ -1,7 +1,5 @@
from odoo import models, fields, api
import logging
_logger = logging.getLogger(__name__)
from odoo.addons.purchase.models.purchase_order_line import PurchaseOrderLine as BasePOL
class PurchaseOrderLine(models.Model):
@ -28,6 +26,21 @@ class PurchaseOrderLine(models.Model):
line.price_unit = line.requisition_line_id.price_unit
return res
def _compute_price_unit_and_date_planned_and_name(self):
super()._compute_price_unit_and_date_planned_and_name()
po_lines_with_requisition = self.filtered("requisition_id")
for line in po_lines_with_requisition:
line.price_unit = line.requisition_line_id.price_unit
po_lines_without_requisition = self - po_lines_with_requisition
to_compute_basic = self.env["purchase.order.line"]
for line in po_lines_without_requisition:
po_agreement_customers = line.order_id.requisition_id.customer_ids
customer = line._get_customer()
if po_agreement_customers and customer not in po_agreement_customers:
to_compute_basic |= line
func = BasePOL._compute_price_unit_and_date_planned_and_name
func(to_compute_basic)
@api.depends("requisition_id")
def _compute_requisition_line_id(self):
for line in self:
@ -39,11 +52,7 @@ class PurchaseOrderLine(models.Model):
@api.depends("order_id.requisition_id", "product_id")
def _compute_requisition_id(self):
for line in self:
customer = line.sale_order_id.partner_id or line.group_id.partner_id
if not customer:
sale_order = line.move_dest_ids.group_id.sale_id
if len(sale_order) == 1:
customer = sale_order.partner_id
customer = self._get_customer()
domain = [
"|",
("requisition_id.vendor_id", "=", line.order_id.partner_id.id),
@ -83,8 +92,17 @@ class PurchaseOrderLine(models.Model):
req_id = requisition_lines[0].requisition_id
line.requisition_id = req_id
def _get_customer(self):
self.ensure_one()
customer = self.sale_order_id.partner_id or self.group_id.partner_id
if not customer:
sale_order = self.move_dest_ids.group_id.sale_id
if len(sale_order) == 1:
customer = sale_order.partner_id
return customer
def _inverse_requisition_id(self):
pass
self._compute_price_unit_and_date_planned_and_name()
def _find_candidate(
self,

View file

@ -1 +0,0 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink

View file

@ -1,7 +1,7 @@
from odoo.addons.sale_purchase_inter_company_rules.models.purchase_order import (
purchase_order,
)
from odoo.tests import TransactionCase, tagged
from odoo.tests import TransactionCase, tagged, Form
from odoo import Command, fields
from datetime import timedelta
@ -169,3 +169,12 @@ class TestPurchaseOrder(TransactionCase):
self.assertEqual(purchase_order.order_line[0].price_unit, 1000)
self.assertEqual(purchase_order.order_line[1].price_unit, 1500)
def test_removing_line_agreement_recomputes_pricing(self):
purchase_order = self._generate_2_sales_1_purchase_clients_1_3()
purchase_order.requisition_id = False
line = purchase_order.order_line[0]
line.requisition_id = False
self.assertEqual(purchase_order.order_line[0].price_unit, 3000)