Compute lot trace document using sql expression

This commit is contained in:
Sergi Almacellas Abellana
2024-07-22 12:24:34 +02:00
parent d83ed4e37c
commit 47392d8a04
2 changed files with 66 additions and 47 deletions
+19 -10
View File
@@ -1,6 +1,8 @@
# 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 sql import Null
from sql import Cast, Null
from sql.conditionals import Case
from sql.operators import Concat
from trytond.model import Check, fields
from trytond.pool import Pool, PoolMeta
@@ -151,8 +153,9 @@ class LotTrace(metaclass=PoolMeta):
production_output = fields.Many2One('production', "Production Output")
@classmethod
def _columns(cls, move):
return super()._columns(move) + [
def _columns(cls, tables):
move = tables['move']
return super()._columns(tables) + [
move.production_input.as_('production_input'),
move.production_output.as_('production_output'),
]
@@ -164,13 +167,19 @@ class LotTrace(metaclass=PoolMeta):
return super().get_documents() + [
('production', Model.get_name('production'))]
def get_document(self, name):
document = super().get_document(name)
if self.production_input:
document = str(self.production_input)
elif self.production_output:
document = str(self.production_output)
return document
@classmethod
def get_document(cls, tables):
document = super().get_document(tables)
sql_type = cls.document.sql_type().base
move = tables['move']
return Case(
((move.production_input != Null),
Concat('production,',
Cast(move.production_input, sql_type))),
((move.production_output != Null),
Concat('production,',
Cast(move.production_output, sql_type))),
else_=document)
def _get_upward_traces(self):
traces = super()._get_upward_traces()
+47 -37
View File
@@ -5,8 +5,10 @@ from collections import defaultdict
from copy import copy
from functools import wraps
from sql import Column, Null
from sql import Cast, Column, Null
from sql.conditionals import Case
from sql.functions import CharLength
from sql.operators import Concat
from trytond.i18n import gettext
from trytond.model import (
@@ -195,10 +197,7 @@ class LotTrace(ModelSQL, ModelView):
company = fields.Many2One('company.company', "Company")
date = fields.Date("Date")
shipment = fields.Reference("Shipment", 'get_shipments')
origin = fields.Reference("Origin", 'get_origins')
document = fields.Function(
fields.Reference("Document", 'get_documents'), 'get_document')
document = fields.Reference("Document", 'get_documents')
upward_traces = fields.Function(
fields.Many2Many(
@@ -216,16 +215,38 @@ class LotTrace(ModelSQL, ModelView):
@classmethod
def table_query(cls):
pool = Pool()
Move = pool.get('stock.move')
move = Move.__table__()
return (
move.select(
*cls._columns(move),
where=(move.lot != Null) & (move.state == 'done')))
from_item, tables = cls._joins()
query = from_item.select(
*cls._columns(tables),
where=cls._where(tables))
return query
@classmethod
def _columns(cls, move):
def _joins(cls):
pool = Pool()
Move = pool.get('stock.move')
InventoryLine = pool.get('stock.inventory.line')
move = Move.__table__()
inventory_line = InventoryLine.__table__()
tables = {}
tables['move'] = move
tables['inventory_line'] = inventory_line
inventory_line_id = Move.origin.sql_id(move.origin, Move)
from_item = (move.join(inventory_line, type_='LEFT',
condition=(move.origin.like(InventoryLine.__name__ + '%')
& (inventory_line.id == inventory_line_id))))
return from_item, tables
@classmethod
def _where(cls, tables):
move = tables['move']
return (move.lot != Null) & (move.state == 'done')
@classmethod
def _columns(cls, tables):
move = tables['move']
return [
move.id.as_('id'),
move.create_uid.as_('create_uid'),
@@ -240,41 +261,30 @@ class LotTrace(ModelSQL, ModelView):
move.unit.as_('unit'),
move.company.as_('company'),
move.effective_date.as_('date'),
move.shipment.as_('shipment'),
move.origin.as_('origin'),
cls.get_document(tables).as_('document'),
]
def get_rec_name(self, name):
return self.document.rec_name if self.document else str(self.id)
@classmethod
def get_shipments(cls):
pool = Pool()
Move = pool.get('stock.move')
return Move.get_shipment()
@classmethod
def get_origins(cls):
pool = Pool()
Move = pool.get('stock.move')
return Move.get_origin()
@classmethod
def get_documents(cls):
pool = Pool()
Model = pool.get('ir.model')
return cls.get_shipments() + [
Move = pool.get('stock.move')
return Move.get_origin() + [
('stock.inventory', Model.get_name('stock.inventory'))]
def get_document(self, name):
pool = Pool()
InventoryLine = pool.get('stock.inventory.line')
document = None
if self.shipment:
document = str(self.shipment)
elif isinstance(self.origin, InventoryLine):
document = str(self.origin.inventory)
return str(document) if document else None
@classmethod
def get_document(cls, tables):
move = tables['move']
inventory_line = tables['inventory_line']
sql_type = cls.document.sql_type().base
return Case(
((inventory_line.id != Null),
Concat('stock.inventory,',
Cast(inventory_line.inventory, sql_type))),
else_=move.shipment)
@classmethod
def _is_trace_move(cls, move):