112 lines
3.6 KiB
Python
Executable File
112 lines
3.6 KiB
Python
Executable File
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
|
# this repository contains the full copyright notices and license terms.
|
|
import datetime
|
|
|
|
from trytond.i18n import gettext
|
|
from trytond.modules.stock_supply.exceptions import SupplyWarning
|
|
from trytond.pool import Pool, PoolMeta
|
|
from trytond.pyson import Eval, If
|
|
from trytond.transaction import check_access
|
|
from trytond.wizard import StateAction
|
|
|
|
|
|
class OrderPoint(metaclass=PoolMeta):
|
|
__name__ = 'stock.order_point'
|
|
|
|
@classmethod
|
|
def __setup__(cls):
|
|
super(OrderPoint, cls).__setup__()
|
|
|
|
cls.product.domain = [
|
|
cls.product.domain,
|
|
If(Eval('type') == 'production',
|
|
('producible', '=', True),
|
|
()),
|
|
]
|
|
|
|
cls.warehouse_location.states['invisible'] &= (
|
|
Eval('type') != 'production')
|
|
cls.warehouse_location.states['required'] |= (
|
|
Eval('type') == 'production')
|
|
|
|
option = ('production', 'Production')
|
|
if option not in cls.type.selection:
|
|
cls.type.selection.append(option)
|
|
|
|
@classmethod
|
|
def _type2field(cls, type=None):
|
|
if type == 'production':
|
|
return 'warehouse_location'
|
|
result = super(OrderPoint, cls)._type2field(type=type)
|
|
if type is None:
|
|
result['production'] = 'warehouse_location'
|
|
return result
|
|
|
|
def get_location(self, name):
|
|
location = super(OrderPoint, self).get_location(name)
|
|
if self.type == 'production':
|
|
return self.warehouse_location.id
|
|
return location
|
|
|
|
|
|
class LocationLeadTime(metaclass=PoolMeta):
|
|
__name__ = 'stock.location.lead_time'
|
|
|
|
@classmethod
|
|
def _get_extra_lead_times(cls):
|
|
pool = Pool()
|
|
Configuration = pool.get('production.configuration')
|
|
config = Configuration(1)
|
|
supply_period = config.get_multivalue('supply_period')
|
|
extra = super(LocationLeadTime, cls)._get_extra_lead_times()
|
|
extra.append(supply_period or datetime.timedelta(0))
|
|
return extra
|
|
|
|
|
|
class StockSupply(metaclass=PoolMeta):
|
|
__name__ = 'stock.supply'
|
|
|
|
production = StateAction('stock_supply_production.act_production_request')
|
|
|
|
@classmethod
|
|
def types(cls):
|
|
return super(StockSupply, cls).types() + ['production']
|
|
|
|
def transition_create_(self):
|
|
pool = Pool()
|
|
Date = pool.get('ir.date')
|
|
Move = pool.get('stock.move')
|
|
Warning = pool.get('res.user.warning')
|
|
today = Date.today()
|
|
with check_access():
|
|
moves = Move.search([
|
|
('from_location.type', '=', 'production'),
|
|
('to_location.type', '=', 'storage'),
|
|
('state', '=', 'draft'),
|
|
('planned_date', '<', today),
|
|
], order=[])
|
|
if moves:
|
|
key = '%s@%s' % (self.__name__, today)
|
|
if Warning.check(key):
|
|
raise SupplyWarning(
|
|
key,
|
|
gettext('stock_supply_production.msg_late_productions'))
|
|
return super(StockSupply, self).transition_create_()
|
|
|
|
@property
|
|
def _production_parameters(self):
|
|
parameters = {}
|
|
# Use getattr because start is empty when run by cron
|
|
if getattr(self.start, 'warehouses', None):
|
|
parameters['warehouses'] = self.start.warehouses
|
|
return parameters
|
|
|
|
def generate_production(self, clean):
|
|
pool = Pool()
|
|
Production = pool.get('production')
|
|
return Production.generate_requests(
|
|
clean=clean, **self._production_parameters)
|
|
|
|
def transition_production(self):
|
|
return self.next_action('production')
|