Upgrade from last changes in 3.8 branch

This commit is contained in:
Raimon Esteve 2018-09-20 12:08:31 +02:00
parent e849db551b
commit 38ba6d60f9
20 changed files with 612 additions and 117 deletions

View File

@ -6,21 +6,27 @@ from . import systemlogics
from . import location
from . import product
from . import stock
from . import configuration
def register():
Pool.register(
systemlogics.SystemLogicsModula,
systemlogics.SystemLogicsModulaEXPOrdiniFile,
systemlogics.SystemLogicsModulaImportEXPOrdiniFileStart,
location.Location,
product.Product,
stock.ShipmentIn,
stock.ShipmentOut,
stock.ShipmentOutReturn,
stock.ShipmentOutSystemlogicsModulaExportStart,
stock.ShipmentOutSystemlogicsModulaCheckStart,
stock.ShipmentInternal,
product.SystemlogicsModulaArticoliResult,
configuration.Configuration,
module='systemlogics_modula', type_='model')
Pool.register(
systemlogics.SystemLogicsModulaImportEXPOrdiniFile,
stock.ShipmentOutSystemlogicsModulaExport,
stock.ShipmentOutSystemlogicsModulaCheck,
product.SystemlogicsModulaArticoli,
module='systemlogics_modula', type_='wizard')

26
configuration.py Normal file
View File

@ -0,0 +1,26 @@
# The COPYRIGHT file at the top level of this repository contains the full
# copyright notices and license terms.
from trytond.model import fields
from trytond.pool import PoolMeta
__all__ = ['Configuration']
class Configuration(metaclass=PoolMeta):
__name__ = 'stock.configuration'
try_generate_systemlogics_modula = fields.Boolean(
'Try Generate SystemLogic Modula',
help="Try generate SystemLogic Modula files")
slice_systemlogics_modula = fields.Integer(
'Cron Slice SystemLogics Modula',
help=("Number of blocs of shipments to generate the systemlogics "
"modula file. If 0 or null it will be all."))
@staticmethod
def default_try_generate_systemlogics_modula():
return True
@staticmethod
def default_slice_systemlogics_modula():
return 100

13
configuration.xml Normal file
View File

@ -0,0 +1,13 @@
<?xml version="1.0"?>
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
this repository contains the full copyright notices and license terms. -->
<tryton>
<data>
<record model="ir.ui.view" id="stock_configuration_view_form">
<field name="model">stock.configuration</field>
<field name="inherit"
ref="stock.stock_configuration_view_form"/>
<field name="name">configuration_form</field>
</record>
</data>
</tryton>

View File

@ -162,6 +162,10 @@ msgctxt "model:ir.action,name:wizard_shipment_out_export"
msgid "Export Systemlogics Modula"
msgstr "Exporta Systemlogics Modula"
msgctxt "model:ir.action,name:wizard_shipment_out_check"
msgid "Check Systemlogics Modula"
msgstr "Comprovar Systemlogics Modula"
msgctxt "model:ir.action,name:wizard_systemlogics_modula_articoli"
msgid "Export Products Modula"
msgstr "Exporta productes Modula"
@ -262,6 +266,10 @@ msgctxt "view:stock.shipment.out.systemlogics.modula.export.start:"
msgid "Export Shipments Out to Modula"
msgstr "Exporta albarans client a Modula"
msgctxt "view:stock.shipment.out.systemlogics.modula.check.start:"
msgid "Check Shipments Out to Modula"
msgstr "Comprovar albarans client a Modula"
msgctxt "view:systemlogics.modula.articoli.result:"
msgid "Export Product XML Modula"
msgstr "Exportar XML productes Modula"
@ -288,6 +296,11 @@ msgctxt ""
msgid "Export"
msgstr "Exporta"
msgctxt ""
"wizard_button:stock.shipment.out.systemlogics.modula.check,start,check:"
msgid "Check"
msgstr "Comprova"
msgctxt "wizard_button:systemlogics.modula.articoli,result,end:"
msgid "Close"
msgstr "Tanca"

View File

@ -162,6 +162,10 @@ msgctxt "model:ir.action,name:wizard_shipment_out_export"
msgid "Export Systemlogics Modula"
msgstr "Exportar Systemlogics Modula"
msgctxt "model:ir.action,name:wizard_shipment_out_check"
msgid "Check Systemlogics Modula"
msgstr "Comprobar Systemlogics Modula"
msgctxt "model:ir.action,name:wizard_systemlogics_modula_articoli"
msgid "Export Products Modula"
msgstr "Exportar productos Modula"
@ -262,6 +266,10 @@ msgctxt "view:stock.shipment.out.systemlogics.modula.export.start:"
msgid "Export Shipments Out to Modula"
msgstr "Exportar albaranes cliente a Modula"
msgctxt "view:stock.shipment.out.systemlogics.modula.check.start:"
msgid "Check Shipments Out to Modula"
msgstr "Comprobar albaranes cliente a Modula"
msgctxt "view:systemlogics.modula.articoli.result:"
msgid "Export Product XML Modula"
msgstr "Exportar productos XML Modula"
@ -288,6 +296,11 @@ msgctxt ""
msgid "Export"
msgstr "Exportar"
msgctxt ""
"wizard_button:stock.shipment.out.systemlogics.modula.check,start,check:"
msgid "Check"
msgstr "Comprobar"
msgctxt "wizard_button:systemlogics.modula.articoli,result,end:"
msgid "Close"
msgstr "Cerrar"

View File

@ -39,5 +39,90 @@ The COPYRIGHT file at the top level of this repository contains the full copyrig
<field name="action" ref="wizard_shipment_out_export"/>
<field name="group" ref="group_systemlogics_modula"/>
</record>
<!-- stock.shipment.out check wizard -->
<record model="ir.ui.view" id="shipment_out_check_form">
<field name="model">stock.shipment.out.systemlogics.modula.check.start</field>
<field name="type">form</field>
<field name="name">shipment_out_check_form</field>
</record>
<record model="ir.action.wizard" id="wizard_shipment_out_check">
<field name="name">Check Systemlogics Modula</field>
<field name="wiz_name">stock.shipment.out.systemlogics.modula.check</field>
<field name="model">stock.shipment.out</field>
</record>
<record model="ir.action.keyword" id="shipment_out_check_keyword">
<field name="keyword">form_action</field>
<field name="model">stock.shipment.out,-1</field>
<field name="action" ref="wizard_shipment_out_check"/>
</record>
<record model="ir.action-res.group"
id="action_group_wizard_shipment_out_check">
<field name="action" ref="wizard_shipment_out_check"/>
<field name="group" ref="group_systemlogics_modula"/>
</record>
<!-- user cron shipment out check systemlogics modula -->
<record model="res.user" id="user_stock_check_systemlogics_modula">
<field name="login">user_stock_check_systemlogics_modula</field>
<field name="name">Cron Check SystemLogics Modula</field>
<field name="active" eval="False"/>
</record>
<record model="res.user-res.group" id="user_stock_check_systemlogics_modula_stock_force_assignment_group">
<field name="user" ref="user_stock_check_systemlogics_modula"/>
<field name="group" ref="stock.group_stock_force_assignment"/>
</record>
<record model="res.user-res.group" id="user_stock_check_systemlogics_modula_stock_group">
<field name="user" ref="user_stock_check_systemlogics_modula"/>
<field name="group" ref="stock.group_stock"/>
</record>
<record model="ir.cron" id="cron_shipment_out_check_systemlogics_modula">
<field name="name">Check SystemLogic Modula for Out Shipments</field>
<field name="request_user" ref="res.user_admin"/>
<field name="user" ref="user_stock_check_systemlogics_modula"/>
<field name="active" eval="True"/>
<field name="interval_number" eval="5"/>
<field name="interval_type">minutes</field>
<field name="number_calls" eval="-1"/>
<field name="repeat_missed" eval="False"/>
<field name="model">stock.shipment.out</field>
<field name="function">check_systemlogics_modula_scheduler</field>
</record>
<!-- user cron shipment out generate systemlogics modula -->
<record model="res.user" id="user_stock_generate_systemlogics_modula">
<field name="login">user_stock_generate_systemlogics_modula</field>
<field name="name">Cron Generate SystemLogics Modula</field>
<field name="active" eval="False"/>
</record>
<record model="res.user-res.group" id="user_stock_generate_systemlogics_modula_stock_force_assignment_group">
<field name="user" ref="user_stock_generate_systemlogics_modula"/>
<field name="group" ref="stock.group_stock_force_assignment"/>
</record>
<record model="res.user-res.group" id="user_stock_generate_systemlogics_modula_stock_group">
<field name="user" ref="user_stock_generate_systemlogics_modula"/>
<field name="group" ref="stock.group_stock"/>
</record>
<record model="ir.cron" id="cron_shipment_out_generate_systemlogics_modula">
<field name="name">Generate SystemLogic Modula for Out Shipments</field>
<field name="request_user" ref="res.user_admin"/>
<field name="user" ref="user_stock_generate_systemlogics_modula"/>
<field name="active" eval="True"/>
<field name="interval_number" eval="1"/>
<field name="interval_type">hours</field>
<field name="number_calls" eval="-1"/>
<field name="repeat_missed" eval="False"/>
<field name="model">stock.shipment.out</field>
<field name="function">generate_systemlogics_modula_scheduler</field>
</record>
<record model="ir.ui.view" id="shipment_out_view_tree">
<field name="model">stock.shipment.out</field>
<field name="inherit" ref="stock.shipment_out_view_tree"/>
<field name="name">shipment_out_tree</field>
</record>
</data>
</tryton>

275
stock.py
View File

@ -6,9 +6,14 @@ from trytond.model import ModelView, fields
from trytond.transaction import Transaction
from trytond.pyson import Eval
from trytond.wizard import Wizard, StateView, Button, StateTransition
from trytond.tools import grouped_slice
import logging
__all__ = ['ShipmentIn', 'ShipmentOut', 'ShipmentOutReturn', 'ShipmentInternal',
'ShipmentOutSystemlogicsModulaExportStart', 'ShipmentOutSystemlogicsModulaExport']
'ShipmentOutSystemlogicsModulaExportStart', 'ShipmentOutSystemlogicsModulaExport',
'ShipmentOutSystemlogicsModulaCheckStart', 'ShipmentOutSystemlogicsModulaCheck']
logger = logging.getLogger(__name__)
class ShipmentIn(metaclass=PoolMeta):
@ -75,72 +80,193 @@ class ShipmentOut(metaclass=PoolMeta):
systemlogics_modula = fields.Boolean('SystemLogics Modula')
systemlogics_modula_completed = fields.Boolean(
'SystemLogics Modula Completed')
systemlogics_modula_sended = fields.Boolean('SystemLogics Modula Sended')
ship_create_date = fields.Function(fields.DateTime('Create Date'),
'get_ship_create_date')
@staticmethod
def default_systemlogics_modula():
return False
@staticmethod
def default_systemlogics_modula_completed():
return False
@staticmethod
def default_systemlogics_modula_sended():
return False
def get_ship_create_date(self, name):
return self.create_date
@classmethod
def copy(cls, shipments, default=None):
if default is None:
default = {}
default = default.copy()
default['systemlogics_modula'] = None
default['systemlogics_modula_completed'] = None
default['systemlogics_modula'] = False
default['systemlogics_modula_completed'] = False
default['systemlogics_modula_sended'] = False
return super(ShipmentOut, cls).copy(shipments, default=default)
@classmethod
def generate_systemlogics_modula(cls, shipments):
'''Active System Logics process when a move from location is systemlogics marked'''
def generate_systemlogics_modula_file(cls, shipments):
SystemLogicsModula = Pool().get('systemlogics.modula')
s_completed = [] # shipments completed
s_incompleted = [] # shipments incompleted
for s in shipments:
if hasattr(s, 'review'):
if s.review:
# Force not get a rollback to generate XML file
shipment_ids = [s.id for s in shipments]
Transaction().commit()
# Search shipment ID to sure not have a rollback
shipments = cls.search([
('id', 'in', shipment_ids),
], order=[('systemlogics_modula_completed', 'DESC')])
SystemLogicsModula.imp_ordini(
shipments, template='IMP_ORDINI_OUT', type_='P')
@classmethod
def check_systemlogics_modula(cls, shipments):
pool = Pool()
Configuration = pool.get('stock.configuration')
config = Configuration(1)
if not (Transaction().context.get('generate_systemlogics_modula',
config.try_generate_systemlogics_modula)):
return
to_write = []
values = {
'systemlogics_modula': True
}
for shipment in shipments:
if hasattr(shipment, 'review'):
if shipment.review:
continue
systemLogics = False
completed = True
for move in s.inventory_moves:
for move in shipment.inventory_moves:
if move.from_location.systemlogics_modula:
systemLogics = True
else:
completed = False
if systemLogics:
values = values.copy()
if completed:
s_completed.append(s)
values['systemlogics_modula_completed'] = True
else:
s_incompleted.append(s)
values['systemlogics_modula_completed'] = False
to_write.extend(([shipment], values))
if to_write:
cls.write(*to_write)
if s_completed or s_incompleted:
if s_completed:
cls.write(s_completed, {
'systemlogics_modula': True,
'systemlogics_modula_completed': True,
})
if s_incompleted:
cls.write(s_incompleted, {
'systemlogics_modula': True,
'systemlogics_modula_completed': False,
})
@classmethod
def generate_systemlogics_modula(cls, shipments):
'''Generate SystemLogics Modula'''
Configuration = Pool().get('stock.configuration')
# Force not get a rollback to generate XML file
shipment_ids = [s.id for s in (s_completed + s_incompleted)]
Transaction().commit()
# Search shipment ID to sure not have a rollback
shipments = cls.search([
('id', 'in', shipment_ids),
], order=[('systemlogics_modula_completed', 'DESC')])
SystemLogicsModula.imp_ordini(
shipments, template='IMP_ORDINI_OUT', type_='P')
config = Configuration(1)
if not (Transaction().context.get('generate_systemlogics_modula',
config.try_generate_systemlogics_modula)):
return
to_write = []
shipments_modula = []
value = {
'systemlogics_modula_sended': True
}
for shipment in shipments:
if hasattr(shipment, 'review'):
if shipment.review:
continue
shipments_modula.append(shipment)
to_write.extend(([shipment], value))
if shipments_modula:
cls.write(*to_write)
cls.generate_systemlogics_modula_file(shipments_modula)
@classmethod
def assign(cls, shipments):
super(ShipmentOut, cls).assign(shipments)
# control generate systemlogics module with context
if Transaction().context.get('generate_systemlogics_modula', True):
cls.generate_systemlogics_modula(shipments)
assigned = [s for s in shipments if s.state == 'assigned']
cls.check_systemlogics_modula(assigned)
cls.generate_systemlogics_modula(assigned)
@classmethod
def check_systemlogics_modula_scheduler(cls, args=None):
'''
This method is intended to be called from ir.cron
args: warehouse ids [ids]
'''
pool = Pool()
Configuration = pool.get('stock.configuration')
config = Configuration(1)
domain = [
('state', '=', 'assigned'),
]
if args:
domain.append(
('warehouse', 'in', args),
)
shipments = cls.search(domain)
len_ships = len(shipments)
logger.info(
'Scheduler Try Check Systemlogics Modula. Total: %s' % (
len_ships))
if len_ships:
blocs = 1
slice_systemlogics_modula = (config.slice_systemlogics_modula or
len_ships)
with Transaction().set_context(generate_systemlogics_modula=True):
for sub_shipments in grouped_slice(shipments,
slice_systemlogics_modula):
logger.info('Start bloc %s of %s.' % (
blocs, len_ships/slice_systemlogics_modula))
cls.check_systemlogics_modula(list(sub_shipments))
logger.info('End bloc %s.' % blocs)
blocs += 1
logger.info('End Scheduler Try Check Systemlogics Modula.')
@classmethod
def generate_systemlogics_modula_scheduler(cls, args=None):
'''
This method is intended to be called from ir.cron
args: warehouse ids [ids]
'''
pool = Pool()
Configuration = pool.get('stock.configuration')
config = Configuration(1)
domain = [
('state', '=', 'assigned'),
('systemlogics_modula', '=', True),
('systemlogics_modula_sended', '=', False),
]
if args:
domain.append(
('warehouse', 'in', args),
)
shipments = cls.search(domain)
len_ships = len(shipments)
logger.info(
'Scheduler Try generate Systemlogics Modula. Total: %s' % (
len_ships))
if len_ships:
blocs = 1
slice_systemlogics_modula = (config.slice_systemlogics_modula or
len_ships)
with Transaction().set_context(generate_systemlogics_modula=True):
for sub_shipments in grouped_slice(shipments,
slice_systemlogics_modula):
logger.info('Start bloc %s of %s.' % (
blocs, len_ships/slice_systemlogics_modula))
cls.generate_systemlogics_modula(list(sub_shipments))
logger.info('End bloc %s.' % blocs)
blocs += 1
logger.info('End Scheduler Try generate Systemlogics Modula.')
class ShipmentOutReturn(metaclass=PoolMeta):
@ -245,7 +371,7 @@ class ShipmentInternal(metaclass=PoolMeta):
('id', 'in', extract_shipments_ids),
])
SystemLogicsModula.imp_ordini(
ext_shipments, template='IMP_ORDINI_IN', type_='P')
ext_shipments, template='IMP_ORDINI_INTERNAL', type_='P')
if deposit_shipments_ids:
# Search shipment ID to sure not have a rollback
dep_shipments = cls.search([
@ -264,23 +390,25 @@ class ShipmentOutSystemlogicsModulaExportStart(ModelView):
'Customer shipments export Systemlogics Modula Start'
__name__ = 'stock.shipment.out.systemlogics.modula.export.start'
shipments = fields.Many2Many('stock.shipment.out', None, None, 'Shipments',
domain=[
('state', 'in', ['assigned']),
required=True, domain=[
('state', '=', 'assigned'),
('systemlogics_modula', '=', True),
('systemlogics_modula_sended', '=', False),
],
states={
'required': True,
},
help='Assigned customer shipments to export Systemlogics Modula.')
@staticmethod
def default_shipments():
@classmethod
def default_shipments(cls):
ShipmentOut = Pool().get('stock.shipment.out')
active_ids = Transaction().context.get('active_ids', [])
shipments = ShipmentOut.search([
('id', 'in', active_ids),
('state', 'in', ['assigned']),
])
domain = []
domain.extend(cls.shipments.domain)
if active_ids:
domain.append(
('id', 'in', active_ids)
)
shipments = ShipmentOut.search(domain)
return [s.id for s in shipments]
@ -298,7 +426,54 @@ class ShipmentOutSystemlogicsModulaExport(Wizard):
def transition_export(self):
ShipmentOut = Pool().get('stock.shipment.out')
shipments = self.start.shipments
shipments = list(self.start.shipments)
if shipments:
ShipmentOut.generate_systemlogics_modula(shipments)
with Transaction().set_context(generate_systemlogics_modula=True):
ShipmentOut.generate_systemlogics_modula(shipments)
return 'end'
class ShipmentOutSystemlogicsModulaCheckStart(ModelView):
'Customer shipments check Systemlogics Modula Start'
__name__ = 'stock.shipment.out.systemlogics.modula.check.start'
shipments = fields.Many2Many('stock.shipment.out', None, None, 'Shipments',
required=True, domain=[
('state', '=', 'assigned'),
],
help='Assigned customer shipments to check Systemlogics Modula.')
@staticmethod
def default_shipments():
ShipmentOut = Pool().get('stock.shipment.out')
active_ids = Transaction().context.get('active_ids', [])
domain = [
('state', '=', 'assigned'),
]
if active_ids:
domain.append(
('id', 'in', active_ids)
)
shipments = ShipmentOut.search(domain)
return [s.id for s in shipments]
class ShipmentOutSystemlogicsModulaCheck(Wizard):
'Customer shipments check Systemlogics Modula'
__name__ = 'stock.shipment.out.systemlogics.modula.check'
start = StateView('stock.shipment.out.systemlogics.modula.check.start',
'systemlogics_modula.shipment_out_check_form', [
Button('Cancel', 'end', 'tryton-cancel'),
Button('Check', 'check', 'tryton-ok', True),
])
check = StateTransition()
def transition_check(self):
ShipmentOut = Pool().get('stock.shipment.out')
shipments = list(self.start.shipments)
if shipments:
with Transaction().set_context(generate_systemlogics_modula=True):
ShipmentOut.check_systemlogics_modula(shipments)
return 'end'

View File

@ -2,7 +2,8 @@
#The COPYRIGHT file at the top level of this repository contains
#the full copyright notices and license terms.
from trytond.pool import Pool
from trytond.model import ModelView, ModelSQL, fields
from trytond.model import ModelView, ModelSQL, fields, Unique
from trytond.wizard import Wizard, StateTransition, StateView, Button
from trytond.pyson import Eval
from trytond.transaction import Transaction
from trytond.rpc import RPC
@ -16,7 +17,9 @@ import logging
import datetime
import tempfile
__all__ = ['SystemLogicsModula', 'SystemLogicsModulaEXPOrdiniFile']
__all__ = ['SystemLogicsModula', 'SystemLogicsModulaEXPOrdiniFile',
'SystemLogicsModulaImportEXPOrdiniFile',
'SystemLogicsModulaImportEXPOrdiniFileStart']
loader = genshi.template.TemplateLoader(
os.path.join(os.path.dirname(__file__), 'template'),
@ -224,31 +227,25 @@ class SystemLogicsModula(ModelSQL, ModelView):
EXPOrdiniFile = Pool().get('systemlogics.modula.exp.ordini.file')
logger.info('Start read SystemLogics Module files')
modulas = cls.search([
('name', '=', 'EXP_ORDINI'),
])
vlist = []
to_delete = []
for modula in modulas:
to_process = []
for modula in cls.search([('name', '=', 'EXP_ORDINI')]):
try:
filenames = os.listdir(modula.path)
except OSError:
except OSError as e:
logger.warning('Error reading path: %s' % e)
continue
exp_ordini_files = [f.name for f in EXPOrdiniFile.search([
('name', 'in', filenames)])]
for filename in filenames:
fullname = '%s/%s' % (modula.path, filename)
values = {}
exp_ordini_file = EXPOrdiniFile.search([
('name', '=', filename)
])
if exp_ordini_file:
to_delete.append(fullname)
if filename in exp_ordini_files:
to_process.append(fullname)
continue
try:
content = open(fullname, 'r').read()
except IOError:
except IOError as e:
logger.warning('Error reading file %s: %s' % (fullname, e))
continue
values['name'] = filename
@ -256,15 +253,18 @@ class SystemLogicsModula(ModelSQL, ModelView):
values['content'] = content
values['state'] = 'pending'
vlist.append(values)
to_delete.append(fullname)
to_process.append(fullname)
ordini_files = EXPOrdiniFile.create(vlist)
EXPOrdiniFile.process_export_ordini(ordini_files)
for filename in to_delete:
Transaction().commit()
for filename in to_process:
try:
os.remove(filename)
except OSError:
pass
logger.info('Loaded SystemLogics Module %s files' % (len(to_delete)))
logger.info('Loaded SystemLogics Module %s files' % (len(to_process)))
class SystemLogicsModulaEXPOrdiniFile(ModelSQL, ModelView):
@ -284,14 +284,15 @@ class SystemLogicsModulaEXPOrdiniFile(ModelSQL, ModelView):
@classmethod
def __setup__(cls):
super(SystemLogicsModulaEXPOrdiniFile, cls).__setup__()
cls._sql_constraints += [
('name_uniq', 'UNIQUE(name)', 'Name must be unique.'),
t = cls.__table__()
cls._sql_constraints = [
('name_uniq', Unique(t, t.name), 'Name must be unique.'),
]
cls._buttons.update({
'process_export_ordini': {
'invisible': ~Eval('state').in_(['pending', 'failed']),
},
})
'process_export_ordini': {
'invisible': ~Eval('state').in_(['pending', 'failed']),
},
})
@classmethod
def default_state(cls):
@ -325,20 +326,20 @@ class SystemLogicsModulaEXPOrdiniFile(ModelSQL, ModelView):
continue
quantities = {}
moves = []
move_ids = []
for o in dom.getElementsByTagName('EXP_ORDINI_RIGHE'):
move = {}
id_ = (o.getElementsByTagName('RIG_HOSTINF')[0]
.firstChild.data)
moves.append(id_)
id_ = int(o.getElementsByTagName(
'RIG_HOSTINF')[0].firstChild.data)
move_ids.append(id_)
quantities[int(id_)] = float(
o.getElementsByTagName('RIG_QTAE')
[0].firstChild.data.replace(',', '.'))
moves = Move.search([
('id', 'in', moves)
])
for move in moves:
for move in Move.search([('id', 'in', move_ids)]):
# TODO process shipment out and internal
if (not move.shipment
or move.shipment.__name__ != 'stock.shipment.out'):
continue
if (quantities[move.id] == move.quantity
and move.shipment.state == 'assigned'):
to_do.append(move)
@ -368,3 +369,24 @@ class SystemLogicsModulaEXPOrdiniFile(ModelSQL, ModelView):
cls.write(done_ordini_files, {'state': 'done'})
if fail_ordini_files:
cls.write(fail_ordini_files, {'state': 'failed'})
class SystemLogicsModulaImportEXPOrdiniFileStart(ModelView):
'SystemLogcics Modula Import EXP Ordini File Start'
__name__ = 'systemlogics.modula.import.exp.ordini.file.start'
class SystemLogicsModulaImportEXPOrdiniFile(Wizard):
'SystemLogics Modula Import EXP Ordini File'
__name__ = "systemlogics.modula.import.exp.ordini.file"
start = StateView('systemlogics.modula.import.exp.ordini.file.start',
'systemlogics_modula.systemlogics_modula_import_exp_ordini_file_start', [
Button('Cancel', 'end', 'tryton-cancel'),
Button('Import', 'import_', 'tryton-ok', default=True),
])
import_ = StateTransition()
def transition_import_(self):
SystemLogicsModula = Pool().get('systemlogics.modula')
SystemLogicsModula.export_ordini_file()
return 'end'

View File

@ -19,6 +19,22 @@ The COPYRIGHT file at the top level of this repository contains the full copyrig
<field name="group" ref="group_systemlogics_modula"/>
</record>
<!-- systemlogics.user -->
<record model="res.user" id="user_systemlogics_modula">
<field name="login">user_cron_internal_systemlogics_modula</field>
<field name="name">Cron SystemLogics Modula</field>
<field name="signature"></field>
<field name="active" eval="False"/>
</record>
<record model="res.user-res.group" id="user_systemlogics_modula_admin_group">
<field name="user" ref="user_systemlogics_modula"/>
<field name="group" ref="group_systemlogics_modula"/>
</record>
<record model="res.user-res.group" id="user_systemlogics_modula_stock_admin_group">
<field name="user" ref="user_systemlogics_modula"/>
<field name="group" ref="stock.group_stock_admin"/>
</record>
<!-- Menus -->
<menuitem parent="stock.menu_configuration"
name="SystemLogics Modula" id="menu_systemlogics_modula_configuration"/>
@ -110,17 +126,37 @@ The COPYRIGHT file at the top level of this repository contains the full copyrig
<field name="act_window" ref="act_systemlogics_modula_exp_ordini_file"/>
</record>
<menuitem
id="menu_systemlogics_modula_exp_ordini_file"
parent="menu_systemlogics_modula"
action="act_systemlogics_modula_exp_ordini_file"
name="EXP Ordini Files"/>
<menuitem id="menu_systemlogics_modula_exp_ordini_file" parent="menu_systemlogics_modula"
action="act_systemlogics_modula_exp_ordini_file" name="EXP Ordini Files"/>
<record model="ir.ui.menu-res.group" id="menu_systemlogics_exp_ordini_file_group_modula">
<field name="menu" ref="menu_systemlogics_modula_exp_ordini_file"/>
<field name="group" ref="group_systemlogics_modula"/>
</record>
<!-- Import EXP Ordini File -->
<record model="ir.ui.view" id="systemlogics_modula_import_exp_ordini_file_start">
<field name="model">systemlogics.modula.import.exp.ordini.file.start</field>
<field name="type">form</field>
<field name="name">systemlogics_modula_import_exp_ordini_file_start</field>
</record>
<record model="ir.action.wizard" id="wizard_systemlogics_modula_import_exp_ordini_file_start">
<field name="name">Import EXP Ordini File</field>
<field name="wiz_name">systemlogics.modula.import.exp.ordini.file</field>
</record>
<menuitem id="menu_systemlogics_modula_import_exp_ordini_file" parent="menu_systemlogics_modula_exp_ordini_file"
action="wizard_systemlogics_modula_import_exp_ordini_file_start" name="Import Export Ordini Files"
sequence="20"/>
<record model="ir.ui.menu-res.group" id="menu_systemlogics_modula_exp_ordini_file_group_modula">
<field name="menu" ref="menu_systemlogics_modula_import_exp_ordini_file"/>
<field name="group" ref="group_systemlogics_modula"/>
</record>
<!-- CRON for systemlogics.modula -->
<record model="ir.cron" id="cron_export_ordini_file">
<field name="name">Export Ordini Files</field>
<field name="request_user" ref="res.user_admin"/>
<field name="user" ref="res.user_trigger"/>
<field name="user" ref="user_systemlogics_modula"/>
<field name="active" eval="True"/>
<field name="interval_number">1</field>
<field name="interval_type">days</field>
@ -201,14 +237,6 @@ The COPYRIGHT file at the top level of this repository contains the full copyrig
<field name="perm_create" eval="False"/>
<field name="perm_delete" eval="False"/>
</record>
<record model="ir.model.access" id="access_systemlogics_modula_exp_ordini_file_modula_admin">
<field name="model" search="[('model', '=', 'systemlogics.modula.exp.ordini.file')]"/>
<field name="group" ref="group_systemlogics_modula_admin"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_delete" eval="True"/>
</record>
<record model="ir.model.access" id="access_systemlogics_modula_exp_ordini_file_modula">
<field name="model" search="[('model', '=', 'systemlogics.modula.exp.ordini.file')]"/>
<field name="group" ref="group_systemlogics_modula"/>

View File

@ -8,7 +8,8 @@
<ORD_CLIENTE></ORD_CLIENTE>
<ORD_SPEDIZIONE></ORD_SPEDIZIONE>
<ORD_GEST_PKL></ORD_GEST_PKL>
<IMP_ORDINI_RIGHE py:for="move in shipment.moves">
<py:for each="move in shipment.moves">
<IMP_ORDINI_RIGHE py:if="(move.from_location.systemlogics_modula and type_ == 'P') or (move.to_location.systemlogics_modula and type_ == 'V')">
<RIG_ORDINE>${shipment.number}</RIG_ORDINE>
<RIG_ARTICOLO>${move.product.code or move.product.rec_name}</RIG_ARTICOLO>
<RIG_SUB1/>
@ -20,5 +21,6 @@
<RIG_PRIO>0</RIG_PRIO>
<RIG_REQ_NOTE/>
</IMP_ORDINI_RIGHE>
</py:for>
</IMP_ORDINI>
</SYSTORE_ORDINI>

View File

@ -1,7 +1,7 @@
<?xml version="1.0" encoding="Windows-1252"?>
<SYSTORE_ORDINI xmlns:py="http://genshi.edgewall.org/">
<IMP_ORDINI py:for="shipment in shipments">
<ORD_ORDINE>${shipment.number}</ORD_ORDINE>
<ORD_ORDINE>${shipment.code}</ORD_ORDINE>
<ORD_DES>${shipment.reference and shipment.reference[:50]}</ORD_DES>
<ORD_TIPOOP>${type_}</ORD_TIPOOP> <!-- P: Extracion / V: Deposito -->
<ORD_PRIOHOST>${datetime.datetime.now().strftime("%Y%m%d%H%M%s")[:16]}</ORD_PRIOHOST> <!-- fechaHora AAAAMMGGHHPPPPPP -->
@ -10,7 +10,7 @@
<ORD_GEST_PKL></ORD_GEST_PKL>
<py:for each="move in shipment.inventory_moves">
<IMP_ORDINI_RIGHE py:if="move.from_location.systemlogics_modula">
<RIG_ORDINE>${shipment.number}</RIG_ORDINE>
<RIG_ORDINE>${shipment.code}</RIG_ORDINE>
<RIG_ARTICOLO>${move.product.code or move.product.rec_name}</RIG_ARTICOLO>
<RIG_SUB1/>
<RIG_SUB2/>
@ -23,7 +23,7 @@
</IMP_ORDINI_RIGHE>
</py:for>
<IMP_ORDINI_RIGHE py:if="not shipment.systemlogics_modula_completed">
<RIG_ORDINE>${shipment.number}</RIG_ORDINE>
<RIG_ORDINE>${shipment.code}</RIG_ORDINE>
<RIG_ARTICOLO>${systemlogic.not_completed or'Not completed'}</RIG_ARTICOLO>
<RIG_SUB1/>
<RIG_SUB2/>

23
tests/exp_ordini.xml Normal file
View File

@ -0,0 +1,23 @@
<?xml version="1.0" standalone="yes"?>
<SYSTORE>
<EXP_ORDINI>
<ORD_ORDINE>2</ORD_ORDINE>
<ORD_DES />
<ORD_TIPOOP>P</ORD_TIPOOP>
<EXP_ORDINI_RIGHE>
<RIG_ORDINE>2</RIG_ORDINE>
<RIG_ARTICOLO>P2</RIG_ARTICOLO>
<RIG_SUB1 />
<RIG_SUB2 />
<RIG_STAMATE />
<RIG_TIPOCONF />
<RIG_HOSTINF>6</RIG_HOSTINF>
<RIG_QTAR>1,000</RIG_QTAR>
<RIG_QTAE>1,000</RIG_QTAE>
<RIG_REQ_NOTE />
<RIG_NOTE_STAMPA />
<RIG_HOSTCAUS />
<RIG_HOSTRIF />
</EXP_ORDINI_RIGHE>
</EXP_ORDINI>
</SYSTORE>

View File

@ -5,16 +5,19 @@ Systemlogics Modula Scenario
Imports::
>>> import datetime
>>> import os
>>> from dateutil.relativedelta import relativedelta
>>> from decimal import Decimal
>>> from proteus import config, Model, Wizard
>>> from trytond.tests.tools import activate_modules
>>> from trytond.modules.company.tests.tools import create_company, \
... get_company
>>> from trytond.modules.systemlogics_modula.tests.tools \
... import read_file
>>> today = datetime.date.today()
>>> yesterday = today - relativedelta(days=1)
Install SystemLogics Modula Module::
Install stock Module::
>>> config = activate_modules('systemlogics_modula')
@ -52,6 +55,10 @@ Create product::
>>> template.list_price = Decimal('20')
>>> template.save()
>>> product, = template.products
>>> product.code = 'P1'
>>> product.cost_price = Decimal('8')
>>> product.code = 'P1'
>>> product.save()
>>> product2 = Product()
>>> template = ProductTemplate()
@ -62,6 +69,9 @@ Create product::
>>> template.list_price = Decimal('20')
>>> template.save()
>>> product2, = template.products
>>> product2.cost_price = Decimal('8')
>>> product2.code = 'P2'
>>> product2.save()
Get stock locations::
@ -169,13 +179,13 @@ Create Shipment Out::
>>> shipment_out.systemlogics_modula == False
True
>>> shipment_out = ShipmentOut()
>>> shipment_out.planned_date = today
>>> shipment_out.customer = customer
>>> shipment_out.warehouse = warehouse_loc
>>> shipment_out.company = company
>>> shipment_out.outgoing_moves.extend([StockMove()])
>>> for move in shipment_out.outgoing_moves:
>>> shipment_out2 = ShipmentOut()
>>> shipment_out2.planned_date = today
>>> shipment_out2.customer = customer
>>> shipment_out2.warehouse = warehouse_loc
>>> shipment_out2.company = company
>>> shipment_out2.outgoing_moves.extend([StockMove()])
>>> for move in shipment_out2.outgoing_moves:
... move.product = product2
... move.uom = unit
... move.quantity = 1
@ -184,15 +194,15 @@ Create Shipment Out::
... move.company = company
... move.unit_price = Decimal('1')
... move.currency = company.currency
>>> shipment_out.save()
>>> shipment_out.click('wait')
>>> inventory_move, = shipment_out.inventory_moves
>>> shipment_out2.save()
>>> shipment_out2.click('wait')
>>> inventory_move, = shipment_out2.inventory_moves
>>> inventory_move.from_location = modula_loc
>>> inventory_move.save()
>>> shipment_out.reload()
>>> shipment_out.click('assign_try')
>>> shipment_out2.reload()
>>> shipment_out2.click('assign_try')
True
>>> shipment_out.systemlogics_modula == True
>>> shipment_out2.systemlogics_modula == True
True
Create Shipment Out Return::
@ -270,3 +280,19 @@ Create Shipment Internal::
>>> shipment_internal.reload()
>>> shipment_internal.systemlogics_modula == True
True
Import EXP Ordini::
>>> EXPOrdiniFile = Model.get('systemlogics.modula.exp.ordini.file')
>>> ordine_file = os.path.join(os.path.dirname(__file__), 'exp_ordini.xml')
>>> exp_ordini_file = EXPOrdiniFile()
>>> exp_ordini_file.name = 'EXP_ORDINI1.XML'
>>> exp_ordini_file.modula = sm_exp_ordini
>>> exp_ordini_file.content = read_file(ordine_file).decode('utf-8')
>>> exp_ordini_file.save()
>>> exp_ordini_file.click('process_export_ordini')
>>> exp_ordini_file.state == 'done'
True
>>> shipment_out2.reload()
>>> shipment_out2.state == 'packed'
True

13
tests/tools.py Normal file
View File

@ -0,0 +1,13 @@
# The COPYRIGHT file at the top level of this repository contains the full
# copyright notices and license terms.
__all__ = ['read_file']
def read_file(filename):
with open(filename) as f:
data = f.read()
# On python3 we must cast to bytes with valid encoding
if bytes != str:
data = bytes(data, encoding=f.encoding)
return data

View File

@ -13,3 +13,4 @@ xml:
location.xml
product.xml
shipment.xml
configuration.xml

View File

@ -0,0 +1,12 @@
<?xml version="1.0"?>
<!-- The COPYRIGHT file at the top level of this repository contains the full
copyright notices and license terms. -->
<data>
<xpath expr="/form/field[@name='shipment_internal_sequence']"
position="after">
<label name="try_generate_systemlogics_modula"/>
<field name="try_generate_systemlogics_modula"/>
<label name="slice_systemlogics_modula"/>
<field name="slice_systemlogics_modula"/>
</xpath>
</data>

View File

@ -0,0 +1,6 @@
<?xml version="1.0"?>
<!-- This file is part systemlogics_modula module for Tryton.
The COPYRIGHT file at the top level of this repository contains the full copyright notices and license terms. -->
<form>
<field name="shipments" colspan="4"/>
</form>

View File

@ -0,0 +1,14 @@
<?xml version="1.0"?>
<!-- This file is part stock_shipment_out_autoassign module for Tryton.
The COPYRIGHT file at the top level of this repository contains the full copyright notices and license terms. -->
<data>
<xpath expr="/tree/field[@name='planned_date']" position="before">
<field name="ship_create_date" widget="date"/>
</xpath>
<xpath expr="/tree/field[@name='state']" position="after">
<field name="systemlogics_modula" tree_invisible="1"/>
<field name="systemlogics_modula_completed" tree_invisible="1"/>
<field name="systemlogics_modula_sended" tree_invisible="1"/>
</xpath>
</data>

View File

@ -12,6 +12,6 @@ The COPYRIGHT file at the top level of this repository contains the full copyrig
<label name="state"/>
<field name="state"/>
<group col="4" colspan="2" id="buttons">
<button name="process_export_ordini" string="Process" icon="tryton-go-next"/>
<button name="process_export_ordini" icon="tryton-go-next"/>
</group>
</form>

View File

@ -0,0 +1,17 @@
<?xml version="1.0"?>
<!-- This file is part of the carrier_send_shipments_seur module for Tryton.
The COPYRIGHT file at the top level of this repository contains the full
copyright notices and license terms. -->
<form>
<image name="tryton-dialog-information" xexpand="0"
xfill="0"/>
<group col="1" id="import">
<label
string="Import EXP Ordini Files."
id="send"
yalign="0.0" xalign="0.0" xexpand="1"/>
<label string="Note that this operation may take a few minutes."
id="operation"
yalign="0.0" xalign="0.0" xexpand="1"/>
</group>
</form>