Files
tryton/modules/sale_supply/purchase.py
T

127 lines
4.3 KiB
Python
Raw Normal View History

2014-12-02 12:56:01 +01:00
# This file is part of Tryton. The COPYRIGHT file at the top level of
# this repository contains the full copyright notices and license terms.
2018-07-27 09:26:36 +02:00
from functools import wraps
2013-02-26 20:50:05 +01:00
from trytond.model import ModelView, Workflow, fields
2013-02-26 20:50:05 +01:00
from trytond.pool import Pool, PoolMeta
2014-07-17 18:59:54 +02:00
from trytond.tools import grouped_slice
from trytond.transaction import Transaction, without_check_access
2013-02-26 20:50:05 +01:00
2020-03-01 12:33:54 +01:00
class Request(metaclass=PoolMeta):
2013-02-26 20:50:05 +01:00
__name__ = 'purchase.request'
sale_lines = fields.One2Many(
'sale.line', 'purchase_request', "Sale Lines", readonly=True)
2013-02-26 20:50:05 +01:00
@classmethod
def _get_origin(cls):
2020-03-01 12:33:54 +01:00
return super()._get_origin() | {'sale.sale'}
2013-02-26 20:50:05 +01:00
@classmethod
def copy(cls, requests, default=None):
default = default.copy() if default is not None else {}
default.setdefault('sale_lines')
return super().copy(requests, default=default)
2013-02-26 20:50:05 +01:00
@classmethod
def delete(cls, requests):
pool = Pool()
Sale = pool.get('sale.sale')
2013-03-12 10:26:36 +01:00
SaleLine = pool.get('sale.line')
2022-03-09 00:57:17 +01:00
transaction = Transaction()
context = transaction.context
2013-02-26 20:50:05 +01:00
with without_check_access():
reqs = cls.browse(requests)
2018-07-27 09:26:36 +02:00
sales = set(r.origin for r in reqs if isinstance(r.origin, Sale))
sale_lines = [l for r in reqs for l in r.sale_lines]
2013-03-12 10:26:36 +01:00
if sale_lines:
SaleLine.write(sale_lines, {
'purchase_request': None,
})
2013-02-26 20:50:05 +01:00
2020-03-01 12:33:54 +01:00
super().delete(requests)
2013-02-26 20:50:05 +01:00
2018-07-27 09:26:36 +02:00
if sales:
2022-03-09 00:57:17 +01:00
with transaction.set_context(
queue_batch=context.get('queue_batch', True)):
Sale.__queue__.process(sales)
2018-07-27 09:26:36 +02:00
def process_sale_supply(func):
@wraps(func)
def wrapper(cls, purchases):
pool = Pool()
Request = pool.get('purchase.request')
Sale = pool.get('sale.sale')
2022-03-09 00:57:17 +01:00
transaction = Transaction()
context = transaction.context
2018-07-27 09:26:36 +02:00
sales = set()
with without_check_access():
2018-07-27 09:26:36 +02:00
for sub_purchases in grouped_slice(purchases):
ids = [x.id for x in sub_purchases]
requests = Request.search([
('purchase_line.purchase.id', 'in', ids),
('origin', 'like', 'sale.sale,%'),
])
sales.update(r.origin.id for r in requests)
func(cls, purchases)
if sales:
2022-03-09 00:57:17 +01:00
with transaction.set_context(
queue_batch=context.get('queue_batch', True)):
Sale.__queue__.process(sales)
2018-07-27 09:26:36 +02:00
return wrapper
2013-02-26 20:50:05 +01:00
2018-06-26 19:11:55 +02:00
class Purchase(metaclass=PoolMeta):
2013-02-26 20:50:05 +01:00
__name__ = 'purchase.purchase'
@classmethod
@ModelView.button
2018-07-27 09:26:36 +02:00
@process_sale_supply
2013-05-22 19:03:25 +02:00
def process(cls, purchases):
super(Purchase, cls).process(purchases)
2013-02-26 20:50:05 +01:00
@classmethod
@ModelView.button
@Workflow.transition('cancelled')
2018-07-27 09:26:36 +02:00
@process_sale_supply
2013-02-26 20:50:05 +01:00
def cancel(cls, purchases):
super(Purchase, cls).cancel(purchases)
2018-06-26 19:11:55 +02:00
class HandlePurchaseCancellationException(metaclass=PoolMeta):
__name__ = 'purchase.request.handle.purchase.cancellation'
def transition_cancel_request(self):
pool = Pool()
SaleLine = pool.get('sale.line')
Move = pool.get('stock.move')
Shipment = pool.get('stock.shipment.out')
next_state = super(HandlePurchaseCancellationException,
self).transition_cancel_request()
moves = []
shipments = set()
for sub_ids in grouped_slice(list(map(int, self.records))):
sale_lines = SaleLine.search([
('purchase_request', 'in', sub_ids),
])
for sale_line in sale_lines:
moves.extend(sale_line.moves)
for shipment in sale_line.sale.shipments:
if shipment.state in ['draft', 'waiting']:
shipments.add(shipment)
if moves:
shipments_waiting = [s for s in shipments if s.state == 'waiting']
Shipment.draft(shipments) # clear inventory moves
Move.cancel(moves)
Shipment.wait([
s for s in shipments_waiting
if any(m.state != 'cancelled' for m in s.outgoing_moves)])
Shipment.cancel([
s for s in shipments_waiting
if all(m.state == 'cancelled' for m in s.outgoing_moves)])
return next_state