From 27b672660a3209ed9febfd5345a19ca026e5541f Mon Sep 17 00:00:00 2001 From: Xavi Hermoso Date: Sun, 24 Nov 2024 18:47:43 +0000 Subject: [PATCH] Update purchase requisition state when purchase request state is updated Closes #13599 --- modules/purchase_requisition/__init__.py | 1 - modules/purchase_requisition/purchase.py | 56 ++++++------------- .../tests/scenario_purchase_requisition.rst | 17 +++++- 3 files changed, 30 insertions(+), 44 deletions(-) diff --git a/modules/purchase_requisition/__init__.py b/modules/purchase_requisition/__init__.py index 06abaa2fa7..5ea079d6d5 100644 --- a/modules/purchase_requisition/__init__.py +++ b/modules/purchase_requisition/__init__.py @@ -14,7 +14,6 @@ def register(): purchase.PurchaseRequisitionLine, purchase.Configuration, purchase.ConfigurationSequence, - purchase.Purchase, module='purchase_requisition', type_='model') Pool.register( purchase.HandlePurchaseCancellationException, diff --git a/modules/purchase_requisition/purchase.py b/modules/purchase_requisition/purchase.py index 4c536a8ffb..59c24422f7 100644 --- a/modules/purchase_requisition/purchase.py +++ b/modules/purchase_requisition/purchase.py @@ -16,7 +16,7 @@ from trytond.modules.currency.fields import Monetary from trytond.modules.product import price_digits, round_price from trytond.pool import Pool, PoolMeta from trytond.pyson import Bool, Eval, Id, If -from trytond.tools import firstline, grouped_slice +from trytond.tools import firstline from trytond.transaction import Transaction from trytond.wizard import Wizard @@ -418,7 +418,7 @@ class PurchaseRequisition(Workflow, ModelSQL, ModelView): def is_done(self): return all( - r.purchase and r.purchase.state in {'cancelled', 'confirmed'} + r.state in {'purchased', 'done', 'cancelled'} for l in self.lines for r in l.purchase_requests) @@ -658,6 +658,20 @@ class PurchaseRequest(metaclass=PoolMeta): return self.origin.requisition.currency return currency + @classmethod + def update_state(cls, requests): + pool = Pool() + Requisition = pool.get('purchase.requisition') + RequisitionLine = pool.get('purchase.requisition.line') + + super().update_state(requests) + + if requisitions := { + r.origin.requisition for r in requests + if isinstance(r.origin, RequisitionLine) and r.origin.id >= 0}: + requisitions = Requisition.browse(requisitions) + Requisition.__queue__.process(requisitions) + class HandlePurchaseCancellationException(metaclass=PoolMeta): __name__ = 'purchase.request.handle.purchase.cancellation' @@ -708,41 +722,3 @@ class CreatePurchase(Wizard): key_values['unit_price'], line.unit)) return line - - -class Purchase(metaclass=PoolMeta): - __name__ = 'purchase.purchase' - - @classmethod - def _process_requisition(cls, purchases): - pool = Pool() - Request = pool.get('purchase.request') - Requisition = pool.get('purchase.requisition') - - requests = [] - for sub_purchases in grouped_slice(purchases): - requests.append(Request.search([ - ('purchase_line.purchase.id', 'in', - [x.id for x in sub_purchases]), - ('origin', 'like', 'purchase.requisition.line,%'), - ])) - requests = list(chain(*requests)) - - if requests: - requisition_ids = list(set(req.origin.requisition - for req in requests)) - Requisition.process(Requisition.browse(requisition_ids)) - - @classmethod - @ModelView.button - @Workflow.transition('confirmed') - def confirm(cls, purchases): - super(Purchase, cls).confirm(purchases) - cls._process_requisition(purchases) - - @classmethod - @ModelView.button - @Workflow.transition('cancelled') - def cancel(cls, purchases): - super(Purchase, cls).cancel(purchases) - cls._process_requisition(purchases) diff --git a/modules/purchase_requisition/tests/scenario_purchase_requisition.rst b/modules/purchase_requisition/tests/scenario_purchase_requisition.rst index 60b1075658..8f8b397f81 100644 --- a/modules/purchase_requisition/tests/scenario_purchase_requisition.rst +++ b/modules/purchase_requisition/tests/scenario_purchase_requisition.rst @@ -220,7 +220,7 @@ Cancel the purchase order:: 'exception' >>> requisition.reload() >>> requisition.state - 'done' + 'processing' Handle request exception:: @@ -237,7 +237,7 @@ Handle request exception:: 'purchased' >>> requisition.reload() >>> requisition.state - 'processing' + 'done' Confirm the purchase order:: @@ -248,7 +248,7 @@ Confirm the purchase order:: >>> purchase.click('quote') >>> requisition.reload() >>> requisition.state - 'processing' + 'done' >>> purchase.click('confirm') >>> purchase.reload() >>> purchase.state @@ -316,6 +316,17 @@ Create purchase requisition with two different suppliers:: >>> purchase.click('confirm') >>> requisition.reload() >>> requisition.state + 'processing' + >>> pr = pr[1] + >>> pr.state + 'exception' + >>> handle_exception = Wizard( + ... 'purchase.request.handle.purchase.cancellation', [pr]) + >>> handle_exception.execute('cancel_request') + >>> pr.state + 'cancelled' + >>> requisition.reload() + >>> requisition.state 'done' Create purchase requisition then cancel::