Update purchase requisition state when purchase request state is updated
Closes #13599
This commit is contained in:
@@ -14,7 +14,6 @@ def register():
|
||||
purchase.PurchaseRequisitionLine,
|
||||
purchase.Configuration,
|
||||
purchase.ConfigurationSequence,
|
||||
purchase.Purchase,
|
||||
module='purchase_requisition', type_='model')
|
||||
Pool.register(
|
||||
purchase.HandlePurchaseCancellationException,
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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::
|
||||
|
||||
Reference in New Issue
Block a user