137 lines
4.7 KiB
Python
137 lines
4.7 KiB
Python
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
|
# this repository contains the full copyright notices and license terms.
|
|
from trytond.i18n import gettext
|
|
from trytond.model import ModelView, fields
|
|
from trytond.pool import Pool
|
|
from trytond.transaction import Transaction, check_access
|
|
from trytond.wizard import (
|
|
Button, StateAction, StateTransition, StateView, Wizard)
|
|
|
|
from .exceptions import SupplyWarning
|
|
|
|
|
|
class Supply(Wizard):
|
|
__name__ = 'stock.supply'
|
|
start = StateView(
|
|
'stock.supply.start',
|
|
'stock_supply.supply_start_view_form', [
|
|
Button('Cancel', 'end', 'tryton-cancel'),
|
|
Button('Create', 'create_', 'tryton-ok', default=True),
|
|
])
|
|
create_ = StateTransition()
|
|
internal = StateAction('stock.act_shipment_internal_form')
|
|
purchase = StateAction('purchase_request.act_purchase_request_form')
|
|
|
|
@classmethod
|
|
def types(cls):
|
|
return ['internal', 'purchase']
|
|
|
|
@classmethod
|
|
def next_action(cls, name):
|
|
types = cls.types()
|
|
try:
|
|
return types[types.index(name) + 1]
|
|
except IndexError:
|
|
return 'end'
|
|
|
|
def transition_create_(self):
|
|
pool = Pool()
|
|
Move = pool.get('stock.move')
|
|
ShipmentInternal = pool.get('stock.shipment.internal')
|
|
Date = pool.get('ir.date')
|
|
Warning = pool.get('res.user.warning')
|
|
|
|
if not Transaction().context.get('_skip_warnings'):
|
|
today = Date.today()
|
|
with check_access():
|
|
moves = Move.search([
|
|
('from_location.type', '=', 'supplier'),
|
|
('to_location.type', '=', 'storage'),
|
|
('state', '=', 'draft'),
|
|
('planned_date', '<', today),
|
|
], order=[], limit=1)
|
|
if moves:
|
|
name = '%s.supplier@%s' % (self.__name__, today)
|
|
if Warning.check(name):
|
|
raise SupplyWarning(name,
|
|
gettext('stock_supply.msg_late_supplier_moves'))
|
|
with check_access():
|
|
moves = Move.search([
|
|
('from_location.type', '=', 'storage'),
|
|
('to_location.type', '=', 'customer'),
|
|
('state', '=', 'draft'),
|
|
('planned_date', '<', today),
|
|
], order=[], limit=1)
|
|
if moves:
|
|
name = '%s..customer@%s' % (self.__name__, today)
|
|
if Warning.check(name):
|
|
raise SupplyWarning(name,
|
|
gettext('stock_supply.msg_late_customer_moves'))
|
|
|
|
first = True
|
|
created = False
|
|
while created or first:
|
|
created = False
|
|
for type_ in self.types():
|
|
created |= bool(getattr(self, 'generate_%s' % type_)(first))
|
|
first = False
|
|
|
|
# Remove transit split of request
|
|
with check_access():
|
|
shipments = ShipmentInternal.search([
|
|
('state', '=', 'request'),
|
|
])
|
|
Move.delete([m for s in shipments for m in s.moves
|
|
if m.from_location == s.transit_location])
|
|
for shipment in shipments:
|
|
Move.write([m for m in shipment.moves], {
|
|
'from_location': shipment.from_location.id,
|
|
'to_location': shipment.to_location.id,
|
|
'planned_date': shipment.planned_date,
|
|
})
|
|
|
|
return self.types()[0]
|
|
|
|
def generate_internal(self, clean):
|
|
pool = Pool()
|
|
ShipmentInternal = pool.get('stock.shipment.internal')
|
|
return ShipmentInternal.generate_internal_shipment(
|
|
clean=clean, warehouses=self.start.warehouses)
|
|
|
|
def transition_internal(self):
|
|
return self.next_action('internal')
|
|
|
|
@property
|
|
def _purchase_parameters(self):
|
|
return {
|
|
'warehouses': self.start.warehouses,
|
|
}
|
|
|
|
def generate_purchase(self, clean):
|
|
pool = Pool()
|
|
PurchaseRequest = pool.get('purchase.request')
|
|
PurchaseRequest.generate_requests(**self._purchase_parameters)
|
|
return False
|
|
|
|
def transition_purchase(self):
|
|
return self.next_action('purchase')
|
|
|
|
|
|
class SupplyStart(ModelView):
|
|
__name__ = 'stock.supply.start'
|
|
|
|
warehouses = fields.Many2Many(
|
|
'stock.location', None, None, "Warehouses",
|
|
domain=[
|
|
('type', '=', 'warehouse'),
|
|
],
|
|
help="If empty all warehouses are used.")
|
|
|
|
@classmethod
|
|
def default_warehouses(cls):
|
|
pool = Pool()
|
|
Location = pool.get('stock.location')
|
|
warehouse = Location.get_default_warehouse()
|
|
if warehouse:
|
|
return [warehouse]
|