lims_analysis_sheet: add planifications by professional

This commit is contained in:
Sebastián Marró 2020-05-13 00:57:19 -03:00
parent 9fb7a6ab9e
commit e397bfb406
7 changed files with 410 additions and 3 deletions

View file

@ -33,6 +33,9 @@ def register():
planification.RelateTechniciansStart,
planification.RelateTechniciansResult,
planification.RelateTechniciansDetail4,
planification.PlanificationProfessional,
planification.PlanificationProfessionalContext,
planification.PlanificationProfessionalLine,
notebook.NotebookLine,
notebook.AddControlStart,
notebook.RepeatAnalysisStart,

View file

@ -203,6 +203,62 @@ msgctxt "field:lims.notebook.line,analysis_sheet:"
msgid "Analysis Sheet"
msgstr "Hoja de análisis"
msgctxt "field:lims.planification.professional,name:"
msgid "Name"
msgstr "Nombre"
msgctxt "field:lims.planification.professional,samples:"
msgid "# Samples"
msgstr "Cant. Muestras"
msgctxt "field:lims.planification.professional,samples_qty:"
msgid "# Samples"
msgstr "Cant. Muestras"
msgctxt "field:lims.planification.professional,sheets_process:"
msgid "# Sheets in process"
msgstr "Cant. Hojas en Proceso"
msgctxt "field:lims.planification.professional,sheets_queue:"
msgid "# Sheets in queue"
msgstr "Cant. Hojas en Cola"
msgctxt "field:lims.planification.professional.context,from_date:"
msgid "From Date"
msgstr "Desde la fecha"
msgctxt "field:lims.planification.professional.context,laboratory:"
msgid "Laboratory"
msgstr "Laboratorio"
msgctxt "field:lims.planification.professional.context,to_date:"
msgid "To Date"
msgstr "Hasta la fecha"
msgctxt "field:lims.planification.professional.line,date:"
msgid "Date"
msgstr "Fecha"
msgctxt "field:lims.planification.professional.line,laboratory:"
msgid "Laboratory"
msgstr "Laboratorio"
msgctxt "field:lims.planification.professional.line,professional:"
msgid "Professional"
msgstr "Profesional"
msgctxt "field:lims.planification.professional.line,samples_qty:"
msgid "# Samples"
msgstr "Cant. Muestras"
msgctxt "field:lims.planification.professional.line,state:"
msgid "State"
msgstr "Estado"
msgctxt "field:lims.planification.professional.line,template:"
msgid "Template"
msgstr "Plantilla"
msgctxt "field:lims.planification.relate_technicians.detail4,fraction:"
msgid "Fraction"
msgstr "Fracción"
@ -324,6 +380,14 @@ msgctxt "model:ir.action,name:act_analysis_sheet_list"
msgid "Analysis Sheets"
msgstr "Hojas de análisis"
msgctxt "model:ir.action,name:act_planification_professional_form"
msgid "Planifications by Professional"
msgstr "Planificaciones por Profesional"
msgctxt "model:ir.action,name:act_planification_professional_line_form"
msgid "Planifications by Professional - Sheets"
msgstr "Planificaciones por Profesional - Hojas"
msgctxt "model:ir.action,name:act_template_analysis_sheet_list"
msgid "Analysis Sheet Templates"
msgstr "Plantillas de Hoja de análisis"
@ -416,6 +480,10 @@ msgctxt "model:ir.ui.menu,name:menu_analysis_sheet_list"
msgid "Analysis Sheets"
msgstr "Hojas de análisis"
msgctxt "model:ir.ui.menu,name:menu_planification_professional"
msgid "Planifications by Professional"
msgstr "Planificaciones por Profesional"
msgctxt "model:ir.ui.menu,name:menu_template_analysis_sheet_list"
msgid "Analysis Sheet Templates"
msgstr "Plantillas de Hoja de análisis"
@ -452,6 +520,18 @@ msgctxt "model:lims.analysis_sheet.results_verification.start,name:"
msgid "Results Verification"
msgstr "Verificación de resultados"
msgctxt "model:lims.planification.professional,name:"
msgid "Planification Professional"
msgstr "Planificaciones por Profesional"
msgctxt "model:lims.planification.professional.context,name:"
msgid "Planification Professional Context"
msgstr "Planificaciones por Profesional Contexto"
msgctxt "model:lims.planification.professional.line,name:"
msgid "Planification Professional Line"
msgstr "Planificaciones por Profesional Línea"
msgctxt "model:lims.planification.relate_technicians.detail4,name:"
msgid "Fraction Detail"
msgstr "Detalle de fracción"
@ -788,6 +868,22 @@ msgctxt "selection:lims.interface,export_file_type:"
msgid "Text File"
msgstr "Archivo de texto"
msgctxt "selection:lims.planification.professional.line,state:"
msgid "Active"
msgstr "Activo"
msgctxt "selection:lims.planification.professional.line,state:"
msgid "Done"
msgstr "Realizado"
msgctxt "selection:lims.planification.professional.line,state:"
msgid "Draft"
msgstr "Borrador"
msgctxt "selection:lims.planification.professional.line,state:"
msgid "Validated"
msgstr "Validada"
msgctxt "selection:lims.planification.relate_technicians.result,grouping:"
msgid "Analysis sheet"
msgstr "Hoja de análisis"

View file

@ -1,17 +1,21 @@
# This file is part of lims_analysis_sheet module for Tryton.
# The COPYRIGHT file at the top level of this repository contains
# the full copyright notices and license terms.
from datetime import datetime
from datetime import datetime, time
from collections import defaultdict
from sql import Column, Literal
from trytond.model import ModelView, ModelSQL, fields
from trytond.wizard import Wizard, StateTransition, StateView, Button
from trytond.pool import Pool, PoolMeta
from trytond.pyson import Eval, Equal, Bool
from trytond.pyson import Eval, Equal, Bool, If
from trytond.transaction import Transaction
__all__ = ['Planification', 'SearchAnalysisSheetStart',
'SearchAnalysisSheetNext', 'SearchAnalysisSheet', 'RelateTechniciansStart',
'RelateTechniciansResult', 'RelateTechniciansDetail4', 'RelateTechnicians']
'RelateTechniciansResult', 'RelateTechniciansDetail4', 'RelateTechnicians',
'PlanificationProfessional', 'PlanificationProfessionalContext',
'PlanificationProfessionalLine']
class Planification(metaclass=PoolMeta):
@ -598,3 +602,229 @@ class RelateTechnicians(metaclass=PoolMeta):
details.append(x[0])
return PlanificationServiceDetail.browse(details)
class PlanificationProfessional(ModelSQL, ModelView):
'Planification Professional'
__name__ = 'lims.planification.professional'
name = fields.Char('Name')
sheets_queue = fields.Function(fields.Integer('# Sheets in queue'),
'get_professional')
sheets_process = fields.Function(fields.Integer('# Sheets in process'),
'get_professional')
samples_qty = fields.Function(fields.Integer('# Samples'),
'get_professional')
@classmethod
def __setup__(cls):
super(PlanificationProfessional, cls).__setup__()
cls._order.insert(0, ('name', 'ASC'))
@classmethod
def table_query(cls):
pool = Pool()
Professional = pool.get('lims.laboratory.professional')
Party = pool.get('party.party')
professional = Professional.__table__()
party = Party.__table__()
columns = []
for fname, field in cls._fields.items():
if hasattr(field, 'set'):
continue
if fname == 'name':
column = Column(party, 'name').as_(fname)
else:
column = Column(professional, fname).as_(fname)
columns.append(column)
return professional.join(
party, condition=professional.party == party.id).select(*columns)
@classmethod
def get_professional(cls, records, name):
pool = Pool()
Sheet = pool.get('lims.analysis_sheet')
res = defaultdict(int)
clause = [('state', 'in', ['draft', 'active'])]
context = Transaction().context
if context.get('laboratory'):
clause.append(('laboratory', '=', context.get('laboratory')))
if context.get('from_date'):
clause.append(('date', '>=', datetime.combine(
context.get('from_date'), time(0, 0))))
if context.get('to_date'):
clause.append(('date', '<=', datetime.combine(
context.get('to_date'), time(23, 59))))
sheets = Sheet.search(clause)
for sheet in sheets:
if name == 'sheets_queue' and sheet.state == 'draft':
res[sheet.professional.id] += 1
if name == 'sheets_process' and sheet.state == 'active':
res[sheet.professional.id] += 1
if name == 'samples_qty':
res[sheet.professional.id] += sheet.samples_qty
return res
def get_rec_name(self, name):
return self.name
class PlanificationProfessionalContext(ModelView):
'Planification Professional Context'
__name__ = 'lims.planification.professional.context'
laboratory = fields.Many2One('lims.laboratory', 'Laboratory')
from_date = fields.Date("From Date",
domain=[
If(Eval('to_date') & Eval('from_date'),
('from_date', '<=', Eval('to_date')),
()),
],
depends=['to_date'])
to_date = fields.Date("To Date",
domain=[
If(Eval('from_date') & Eval('to_date'),
('to_date', '>=', Eval('from_date')),
()),
],
depends=['from_date'])
@classmethod
def default_laboratory(cls):
return Transaction().context.get('laboratory')
@classmethod
def default_from_date(cls):
return Transaction().context.get('from_date')
@classmethod
def default_to_date(cls):
return Transaction().context.get('to_date')
class PlanificationProfessionalLine(ModelSQL, ModelView):
'Planification Professional Line'
__name__ = 'lims.planification.professional.line'
template = fields.Many2One('lims.template.analysis_sheet', 'Template')
laboratory = fields.Many2One('lims.laboratory', 'Laboratory')
professional = fields.Many2One('lims.laboratory.professional',
'Professional')
date = fields.DateTime('Date')
state = fields.Selection([
('draft', 'Draft'),
('active', 'Active'),
('validated', 'Validated'),
('done', 'Done'),
], 'State')
samples_qty = fields.Function(fields.Integer('# Samples'),
'get_samples_qty')
@classmethod
def __setup__(cls):
super(PlanificationProfessionalLine, cls).__setup__()
cls._order.insert(0, ('date', 'ASC'))
@classmethod
def table_query(cls):
pool = Pool()
Sheet = pool.get('lims.analysis_sheet')
Compilation = pool.get('lims.interface.compilation')
sheet = Sheet.__table__()
compilation = Compilation.__table__()
context = Transaction().context
where = Literal(True)
if context.get('laboratory'):
where &= sheet.laboratory == context.get('laboratory')
if context.get('from_date'):
where &= compilation.date_time >= datetime.combine(
context.get('from_date'), time(0, 0))
if context.get('to_date'):
where &= compilation.date_time <= datetime.combine(
context.get('to_date'), time(23, 59))
columns = []
for fname, field in cls._fields.items():
if hasattr(field, 'set'):
continue
if fname == 'date':
column = Column(compilation, 'date_time').as_(fname)
else:
column = Column(sheet, fname).as_(fname)
columns.append(column)
return sheet.join(compilation,
condition=sheet.compilation == compilation.id).select(*columns,
where=where)
def get_samples_qty(self, name):
pool = Pool()
Sheet = pool.get('lims.analysis_sheet')
sheet = Sheet(self.id)
return sheet.samples_qty
class PlanificationProfessionalSample(ModelSQL, ModelView):
'Planification Professional Sample'
__name__ = 'lims.planification.professional.sample'
template = fields.Many2One('lims.template.analysis_sheet', 'Template')
laboratory = fields.Many2One('lims.laboratory', 'Laboratory')
professional = fields.Many2One('lims.laboratory.professional',
'Professional')
date = fields.DateTime('Date')
state = fields.Selection([
('draft', 'Draft'),
('active', 'Active'),
('validated', 'Validated'),
('done', 'Done'),
], 'State')
samples_qty = fields.Function(fields.Integer('# Samples'),
'get_samples_qty')
@classmethod
def __setup__(cls):
super(PlanificationProfessionalLine, cls).__setup__()
cls._order.insert(0, ('date', 'ASC'))
@classmethod
def table_query(cls):
pool = Pool()
Sheet = pool.get('lims.analysis_sheet')
Compilation = pool.get('lims.interface.compilation')
sheet = Sheet.__table__()
compilation = Compilation.__table__()
context = Transaction().context
where = Literal(True)
if context.get('laboratory'):
where &= sheet.laboratory == context.get('laboratory')
if context.get('from_date'):
where &= compilation.date_time >= datetime.combine(
context.get('from_date'), time(0, 0))
if context.get('to_date'):
where &= compilation.date_time <= datetime.combine(
context.get('to_date'), time(23, 59))
columns = []
for fname, field in cls._fields.items():
if hasattr(field, 'set'):
continue
if fname == 'date':
column = Column(compilation, 'date_time').as_(fname)
else:
column = Column(sheet, fname).as_(fname)
columns.append(column)
return sheet.join(compilation,
condition=sheet.compilation == compilation.id).select(*columns,
where=where)
def get_samples_qty(self, name):
pool = Pool()
Sheet = pool.get('lims.analysis_sheet')
sheet = Sheet(self.id)
return sheet.samples_qty

View file

@ -58,5 +58,59 @@
<field name="name">planification_relate_technicians_detail4_list</field>
</record>
<!-- Planification Professional -->
<record model="ir.ui.view" id="planification_professional_view_list">
<field name="model">lims.planification.professional</field>
<field name="type">tree</field>
<field name="name">planification_professional_list</field>
</record>
<record model="ir.action.act_window" id="act_planification_professional_form">
<field name="name">Planifications by Professional</field>
<field name="res_model">lims.planification.professional</field>
<field name="context_model">lims.planification.professional.context</field>
</record>
<record model="ir.action.act_window.view"
id="act_planification_professional_form_view1">
<field name="sequence" eval="10"/>
<field name="view" ref="planification_professional_view_list"/>
<field name="act_window" ref="act_planification_professional_form"/>
</record>
<menuitem parent="lims.lims_planification_menu" action="act_planification_professional_form"
id="menu_planification_professional" name="Planifications by Professional"
sequence="5"/>
<record model="ir.ui.view" id="planification_professional_line_view_list">
<field name="model">lims.planification.professional.line</field>
<field name="type">tree</field>
<field name="name">planification_professional_line_list</field>
</record>
<record model="ir.action.act_window" id="act_planification_professional_line_form">
<field name="name">Planifications by Professional - Sheets</field>
<field name="res_model">lims.planification.professional.line</field>
<field name="context_model">lims.planification.professional.context</field>
<field name="domain" eval="[('professional', 'in', Eval('active_ids', [])), ('state', 'in', ['draft', 'active'])]"
pyson="1"/>
</record>
<record model="ir.action.act_window.view"
id="act_planification_professional_line_form_view1">
<field name="sequence" eval="10"/>
<field name="view" ref="planification_professional_line_view_list"/>
<field name="act_window" ref="act_planification_professional_line_form"/>
</record>
<record model="ir.action.keyword" id="act_planification_professional_line_form_keyword">
<field name="keyword">tree_open</field>
<field name="model">lims.planification.professional,-1</field>
<field name="action" ref="act_planification_professional_line_form"/>
</record>
<record model="ir.ui.view" id="planification_professional_context_view_form">
<field name="model">lims.planification.professional.context</field>
<field name="type">form</field>
<field name="name">planification_professional_context_form</field>
</record>
</data>
</tryton>

View file

@ -0,0 +1,9 @@
<?xml version="1.0"?>
<form col="6">
<label name="from_date"/>
<field name="from_date"/>
<label name="to_date"/>
<field name="to_date"/>
<label name="laboratory"/>
<field name="laboratory" widget="selection"/>
</form>

View file

@ -0,0 +1,8 @@
<?xml version="1.0"?>
<tree>
<field name="laboratory" expand="1"/>
<field name="template" expand="1"/>
<field name="date" widget="date"/>
<field name="state"/>
<field name="samples_qty"/>
</tree>

View file

@ -0,0 +1,7 @@
<?xml version="1.0"?>
<tree keyword_open="1">
<field name="name" expand="1"/>
<field name="sheets_queue"/>
<field name="sheets_process"/>
<field name="samples_qty"/>
</tree>