288 lines
10 KiB
Python
288 lines
10 KiB
Python
# The COPYRIGHT file at the top level of
|
|
# this repository contains the full copyright notices and license terms.
|
|
from trytond.model import ModelSQL, fields
|
|
from trytond.pool import Pool, PoolMeta
|
|
from trytond.pyson import Eval, Id
|
|
from trytond.transaction import Transaction
|
|
from trytond.modules.company.model import CompanyValueMixin
|
|
from trytond.tools.multivalue import migrate_property
|
|
from sql import Literal
|
|
|
|
|
|
config_names = ['load_sequence', 'load_order_sequence']
|
|
|
|
|
|
def default_sequence(name):
|
|
@classmethod
|
|
def default(cls):
|
|
pool = Pool()
|
|
ModelData = pool.get('ir.model.data')
|
|
try:
|
|
return ModelData.get_id('carrier_load', name)
|
|
except KeyError:
|
|
return None
|
|
return default
|
|
|
|
|
|
def default_func(field_name):
|
|
@classmethod
|
|
def default(cls, **pattern):
|
|
return getattr(
|
|
cls.multivalue_model(field_name),
|
|
'default_%s' % field_name, lambda: None)()
|
|
return default
|
|
|
|
|
|
def get_states_model(model):
|
|
pool = Pool()
|
|
Model = pool.get(model)
|
|
states = Model.fields_get(['state'])['state']['selection']
|
|
return [state for state in states if state[0] != 'cancelled']
|
|
|
|
|
|
class Configuration(metaclass=PoolMeta):
|
|
__name__ = 'carrier.configuration'
|
|
|
|
load_sequence = fields.MultiValue(
|
|
fields.Many2One('ir.sequence', 'Load Sequence', required=True,
|
|
domain=[
|
|
('company', 'in',
|
|
[Eval('context', {}).get('company', -1), None]),
|
|
('sequence_type', '=', Id('carrier_load',
|
|
'sequence_type_load'))
|
|
]))
|
|
load_order_sequence = fields.MultiValue(
|
|
fields.Many2One('ir.sequence', 'Load order Sequence', required=True,
|
|
domain=[
|
|
('company', 'in',
|
|
[Eval('context', {}).get('company', -1), None]),
|
|
('sequence_type', '=', Id('carrier_load',
|
|
'sequence_type_load_order'))
|
|
]))
|
|
load_purchasable = fields.Boolean('Load purchasable')
|
|
cmr_template = fields.Many2One('carrier.load.cmr.template', 'CMR Template')
|
|
cmr_copies = fields.Integer('CMR copies', required=True)
|
|
road_note_instructions = fields.Text('Road note instructions', translate=True)
|
|
road_note_copies = fields.Integer('Road note copies', required=True)
|
|
road_note_header = fields.Text('Road note header', translate=True)
|
|
road_note_footer = fields.Text('Road note footer', translate=True)
|
|
vehicle_required = fields.Boolean('Vehicle required')
|
|
trailer_required = fields.Boolean('Trailer required')
|
|
shipment_internal_state = fields.MultiValue(
|
|
fields.Selection('get_shipment_internal_state',
|
|
"Shipment Internal State", sort=False))
|
|
shipment_out_state = fields.MultiValue(
|
|
fields.Selection('get_shipment_out_state', "Shipment Out State",
|
|
sort=False))
|
|
sale_state = fields.MultiValue(
|
|
fields.Selection('get_sale_states', "Sale State", sort=False))
|
|
|
|
@classmethod
|
|
def __register__(cls, module_name):
|
|
pool = Pool()
|
|
cursor = Transaction().connection.cursor()
|
|
table = cls.__table_handler__(module_name)
|
|
sql_table = cls.__table__()
|
|
CMRTemplate = pool.get('carrier.load.cmr.template')
|
|
CMRTemplateLine = pool.get('carrier.load.cmr.template.line')
|
|
cmr_template = CMRTemplate.__table__()
|
|
cmr_tline = CMRTemplateLine.__table__()
|
|
|
|
cmr_instructions = table.column_exist('cmr_instructions')
|
|
|
|
super().__register__(module_name)
|
|
|
|
# From 5.0 create default cmr template
|
|
if cmr_instructions:
|
|
cursor.execute(*cmr_template.insert(columns=[
|
|
cmr_template.create_date,
|
|
cmr_template.write_date,
|
|
cmr_template.create_uid,
|
|
cmr_template.write_uid,
|
|
cmr_template.name,
|
|
cmr_template.active],
|
|
values=sql_table.select(
|
|
sql_table.create_date,
|
|
sql_table.write_date,
|
|
sql_table.create_uid,
|
|
sql_table.write_uid,
|
|
Literal('(Default)'),
|
|
Literal(True))))
|
|
cursor.execute(*cmr_template.select(
|
|
cmr_template.id))
|
|
template = cursor.fetchone()
|
|
if template:
|
|
template, = template
|
|
cursor.execute(*cmr_tline.insert(columns=[
|
|
cmr_tline.create_date,
|
|
cmr_tline.write_date,
|
|
cmr_tline.create_uid,
|
|
cmr_tline.write_uid,
|
|
cmr_tline.template,
|
|
cmr_tline.section,
|
|
cmr_tline.text],
|
|
values=sql_table.select(
|
|
sql_table.create_date,
|
|
sql_table.write_date,
|
|
sql_table.create_uid,
|
|
sql_table.write_uid,
|
|
Literal(template),
|
|
Literal('13'),
|
|
sql_table.cmr_instructions)))
|
|
cursor.execute(*cmr_tline.insert(columns=[
|
|
cmr_tline.create_date,
|
|
cmr_tline.write_date,
|
|
cmr_tline.create_uid,
|
|
cmr_tline.write_uid,
|
|
cmr_tline.template,
|
|
cmr_tline.section,
|
|
cmr_tline.text],
|
|
values=sql_table.select(
|
|
sql_table.create_date,
|
|
sql_table.write_date,
|
|
sql_table.create_uid,
|
|
sql_table.write_uid,
|
|
Literal(template),
|
|
Literal('head-right'),
|
|
Literal('${record.shipment and record.shipment.number}'
|
|
))))
|
|
cursor.execute(*sql_table.update(
|
|
[sql_table.cmr_template], [template]))
|
|
table.drop_column('cmr_instructions')
|
|
|
|
@classmethod
|
|
def multivalue_model(cls, field):
|
|
pool = Pool()
|
|
if field in config_names:
|
|
return pool.get('carrier.configuration.sequence')
|
|
|
|
fields_states = ['shipment_internal_state', 'shipment_out_state',
|
|
'sale_state']
|
|
if field in fields_states:
|
|
return pool.get('carrier.configuration.states')
|
|
|
|
return super(Configuration, cls).multivalue_model(field)
|
|
|
|
@classmethod
|
|
def default_load_purchasable(cls):
|
|
return False
|
|
|
|
@staticmethod
|
|
def default_cmr_copies():
|
|
return 3
|
|
|
|
@staticmethod
|
|
def default_road_note_copies():
|
|
return 3
|
|
|
|
default_load_sequence = default_func('load_sequence')
|
|
default_load_order_sequence = default_func('load_order_sequence')
|
|
|
|
@staticmethod
|
|
def default_vehicle_required():
|
|
return True
|
|
|
|
@staticmethod
|
|
def default_trailer_required():
|
|
return False
|
|
|
|
@classmethod
|
|
def get_shipment_internal_state(cls):
|
|
pool = Pool()
|
|
States = pool.get('carrier.configuration.states')
|
|
return States.get_shipment_internal_state()
|
|
|
|
@classmethod
|
|
def get_shipment_out_state(cls):
|
|
pool = Pool()
|
|
States = pool.get('carrier.configuration.states')
|
|
return States.get_shipment_out_state()
|
|
|
|
@classmethod
|
|
def get_sale_states(cls):
|
|
pool = Pool()
|
|
States = pool.get('carrier.configuration.states')
|
|
return States.get_sale_states()
|
|
|
|
default_shipment_internal_state = default_func('shipment_internal_state')
|
|
default_shipment_out_state = default_func('shipment_out_state')
|
|
default_sale_state = default_func('sale_state')
|
|
|
|
|
|
class ConfigurationSequence(ModelSQL, CompanyValueMixin):
|
|
'''Carrier Configuration Sequence'''
|
|
__name__ = 'carrier.configuration.sequence'
|
|
|
|
load_sequence = fields.Many2One('ir.sequence', 'Load Sequence',
|
|
domain=[
|
|
('company', 'in',
|
|
[Eval('context', {}).get('company', -1), None]),
|
|
('sequence_type', '=', Id('carrier_load',
|
|
'sequence_type_load'))
|
|
], required=True)
|
|
load_order_sequence = fields.Many2One('ir.sequence', 'Load order Sequence',
|
|
domain=[
|
|
('company', 'in',
|
|
[Eval('context', {}).get('company', -1), None]),
|
|
('sequence_type', '=', Id('carrier_load',
|
|
'sequence_type_load_order'))
|
|
], required=True)
|
|
|
|
default_load_sequence = default_sequence('sequence_load')
|
|
default_load_order_sequence = default_sequence('sequence_load_order')
|
|
|
|
@classmethod
|
|
def __register__(cls, module_name):
|
|
table_h = cls.__table_handler__(module_name)
|
|
exist = table_h.table_exist(cls._table)
|
|
|
|
super(ConfigurationSequence, cls).__register__(module_name)
|
|
|
|
if not exist:
|
|
cls._migrate_property([], [], [])
|
|
|
|
@classmethod
|
|
def _migrate_property(cls, field_names, value_names, fields):
|
|
field_names.extend(config_names)
|
|
value_names.extend(config_names)
|
|
fields.append('company')
|
|
migrate_property(
|
|
'carrier.configuration', field_names, cls, value_names)
|
|
|
|
|
|
class ConfigurationStates(ModelSQL, CompanyValueMixin):
|
|
'''Stock Configuration States'''
|
|
__name__ = 'carrier.configuration.states'
|
|
|
|
shipment_internal_state = fields.Selection('get_shipment_internal_state',
|
|
"Shipment Internal State", sort=False)
|
|
shipment_out_state = fields.Selection('get_shipment_out_state',
|
|
"Shipment Out State", sort=False)
|
|
sale_state = fields.Selection('get_sale_states', "Sale State", sort=False)
|
|
|
|
@staticmethod
|
|
def default_shipment_internal_state():
|
|
return 'done'
|
|
|
|
@classmethod
|
|
def get_shipment_internal_state(cls):
|
|
states = get_states_model('stock.shipment.internal')
|
|
return [state for state in states if state[0] != 'request']
|
|
|
|
@staticmethod
|
|
def default_shipment_out_state():
|
|
return 'packed'
|
|
|
|
@classmethod
|
|
def get_shipment_out_state(cls):
|
|
return get_states_model('stock.shipment.out')
|
|
|
|
@staticmethod
|
|
def default_sale_state():
|
|
return 'quotation'
|
|
|
|
@classmethod
|
|
def get_sale_states(cls):
|
|
states = get_states_model('sale.sale')
|
|
return [state for state in states if state[0] != 'done']
|