
- Dashboard de Estado de Órdenes: Vista gráfica y pivot de órdenes por estado - Dashboard de Productividad de Técnicos: Análisis de pruebas por técnico - Dashboard de Muestras: Estado y distribución de muestras por tipo - Dashboard de Parámetros Fuera de Rango: Identificación de resultados críticos - Dashboard de Análisis Más Solicitados: Top de análisis por período - Dashboard de Distribución Demográfica: Tests por género y rango de edad - Agregar campos computed age_range, patient_gender y patient_age_range - Configurar menú de Dashboards solo para administradores 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
321 lines
15 KiB
XML
321 lines
15 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<odoo>
|
|
<!-- ================================================================
|
|
DASHBOARD 1: Estado de Órdenes de Laboratorio
|
|
================================================================ -->
|
|
|
|
<!-- Vista Graph para Estado de Órdenes -->
|
|
<record id="view_lab_order_dashboard_graph" model="ir.ui.view">
|
|
<field name="name">sale.order.lab.dashboard.graph</field>
|
|
<field name="model">sale.order</field>
|
|
<field name="arch" type="xml">
|
|
<graph string="Estado de Órdenes" type="pie">
|
|
<field name="state"/>
|
|
</graph>
|
|
</field>
|
|
</record>
|
|
|
|
<!-- Vista Pivot para Estado de Órdenes -->
|
|
<record id="view_lab_order_dashboard_pivot" model="ir.ui.view">
|
|
<field name="name">sale.order.lab.dashboard.pivot</field>
|
|
<field name="model">sale.order</field>
|
|
<field name="arch" type="xml">
|
|
<pivot string="Análisis de Órdenes">
|
|
<field name="date_order" interval="month" type="col"/>
|
|
<field name="state" type="row"/>
|
|
</pivot>
|
|
</field>
|
|
</record>
|
|
|
|
<!-- Acción para Dashboard de Estado de Órdenes -->
|
|
<record id="action_lab_order_dashboard" model="ir.actions.act_window">
|
|
<field name="name">Estado de Órdenes</field>
|
|
<field name="res_model">sale.order</field>
|
|
<field name="view_mode">graph,pivot,tree,form</field>
|
|
<field name="domain">[('is_lab_request', '=', True)]</field>
|
|
<field name="context">{'search_default_group_by_state': 1}</field>
|
|
<field name="help" type="html">
|
|
<p class="o_view_nocontent_smiling_face">
|
|
No hay órdenes de laboratorio registradas
|
|
</p>
|
|
<p>
|
|
Este dashboard muestra el estado actual de todas las órdenes de laboratorio.
|
|
</p>
|
|
</field>
|
|
</record>
|
|
|
|
<!-- ================================================================
|
|
DASHBOARD 2: Productividad de Técnicos
|
|
================================================================ -->
|
|
|
|
<!-- Vista Graph para Productividad de Técnicos -->
|
|
<record id="view_test_technician_productivity_graph" model="ir.ui.view">
|
|
<field name="name">lims.test.technician.productivity.graph</field>
|
|
<field name="model">lims.test</field>
|
|
<field name="arch" type="xml">
|
|
<graph string="Productividad de Técnicos" type="bar">
|
|
<field name="technician_id"/>
|
|
<field name="state"/>
|
|
</graph>
|
|
</field>
|
|
</record>
|
|
|
|
<!-- Vista Pivot para Productividad de Técnicos -->
|
|
<record id="view_test_technician_productivity_pivot" model="ir.ui.view">
|
|
<field name="name">lims.test.technician.productivity.pivot</field>
|
|
<field name="model">lims.test</field>
|
|
<field name="arch" type="xml">
|
|
<pivot string="Análisis por Técnico">
|
|
<field name="technician_id" type="row"/>
|
|
<field name="state" type="col"/>
|
|
</pivot>
|
|
</field>
|
|
</record>
|
|
|
|
<!-- Acción para Dashboard de Productividad de Técnicos -->
|
|
<record id="action_technician_productivity_dashboard" model="ir.actions.act_window">
|
|
<field name="name">Productividad de Técnicos</field>
|
|
<field name="res_model">lims.test</field>
|
|
<field name="view_mode">graph,pivot,tree,form</field>
|
|
<field name="context">{'search_default_group_by_technician': 1, 'search_default_this_month': 1}</field>
|
|
<field name="help" type="html">
|
|
<p class="o_view_nocontent_smiling_face">
|
|
No hay pruebas registradas
|
|
</p>
|
|
<p>
|
|
Este dashboard muestra la productividad de cada técnico del laboratorio.
|
|
</p>
|
|
</field>
|
|
</record>
|
|
|
|
<!-- ================================================================
|
|
DASHBOARD 3: Estado de Muestras
|
|
================================================================ -->
|
|
|
|
<!-- Vista Graph para Estado de Muestras -->
|
|
<record id="view_sample_status_graph" model="ir.ui.view">
|
|
<field name="name">stock.lot.sample.status.graph</field>
|
|
<field name="model">stock.lot</field>
|
|
<field name="arch" type="xml">
|
|
<graph string="Estado de Muestras" type="pie">
|
|
<field name="state"/>
|
|
</graph>
|
|
</field>
|
|
</record>
|
|
|
|
<!-- Vista Pivot para Muestras por Tipo -->
|
|
<record id="view_sample_type_pivot" model="ir.ui.view">
|
|
<field name="name">stock.lot.sample.type.pivot</field>
|
|
<field name="model">stock.lot</field>
|
|
<field name="arch" type="xml">
|
|
<pivot string="Muestras por Tipo">
|
|
<field name="sample_type_product_id" type="row"/>
|
|
<field name="state" type="col"/>
|
|
</pivot>
|
|
</field>
|
|
</record>
|
|
|
|
<!-- Acción para Dashboard de Muestras -->
|
|
<record id="action_sample_dashboard" model="ir.actions.act_window">
|
|
<field name="name">Dashboard de Muestras</field>
|
|
<field name="res_model">stock.lot</field>
|
|
<field name="view_mode">graph,pivot,tree,form</field>
|
|
<field name="domain">[('is_lab_sample', '=', True)]</field>
|
|
<field name="context">{'search_default_group_by_state': 1}</field>
|
|
<field name="help" type="html">
|
|
<p class="o_view_nocontent_smiling_face">
|
|
No hay muestras registradas
|
|
</p>
|
|
<p>
|
|
Este dashboard muestra el estado de todas las muestras del laboratorio.
|
|
</p>
|
|
</field>
|
|
</record>
|
|
|
|
<!-- ================================================================
|
|
DASHBOARD 4: Parámetros Fuera de Rango
|
|
================================================================ -->
|
|
|
|
<!-- Vista Graph para Parámetros Fuera de Rango -->
|
|
<record id="view_result_out_of_range_graph" model="ir.ui.view">
|
|
<field name="name">lims.result.out.of.range.graph</field>
|
|
<field name="model">lims.result</field>
|
|
<field name="arch" type="xml">
|
|
<graph string="Parámetros Fuera de Rango" type="bar">
|
|
<field name="parameter_id"/>
|
|
<field name="is_out_of_range" type="measure"/>
|
|
</graph>
|
|
</field>
|
|
</record>
|
|
|
|
<!-- Vista Pivot para Resultados Críticos -->
|
|
<record id="view_result_critical_pivot" model="ir.ui.view">
|
|
<field name="name">lims.result.critical.pivot</field>
|
|
<field name="model">lims.result</field>
|
|
<field name="arch" type="xml">
|
|
<pivot string="Resultados Críticos">
|
|
<field name="parameter_id" type="row"/>
|
|
<field name="is_critical" type="col"/>
|
|
<field name="is_out_of_range" type="col"/>
|
|
</pivot>
|
|
</field>
|
|
</record>
|
|
|
|
<!-- Acción para Dashboard de Parámetros Fuera de Rango -->
|
|
<record id="action_out_of_range_dashboard" model="ir.actions.act_window">
|
|
<field name="name">Parámetros Fuera de Rango</field>
|
|
<field name="res_model">lims.result</field>
|
|
<field name="view_mode">graph,pivot,tree,form</field>
|
|
<field name="domain">[('test_id.state', '=', 'validated')]</field>
|
|
<field name="context">{'search_default_out_of_range': 1}</field>
|
|
<field name="help" type="html">
|
|
<p class="o_view_nocontent_smiling_face">
|
|
No hay resultados fuera de rango
|
|
</p>
|
|
<p>
|
|
Este dashboard muestra los parámetros que están fuera de los rangos normales.
|
|
</p>
|
|
</field>
|
|
</record>
|
|
|
|
<!-- ================================================================
|
|
DASHBOARD 5: Análisis Más Solicitados
|
|
================================================================ -->
|
|
|
|
<!-- Vista Graph para Top Análisis -->
|
|
<record id="view_top_analysis_graph" model="ir.ui.view">
|
|
<field name="name">sale.order.line.top.analysis.graph</field>
|
|
<field name="model">sale.order.line</field>
|
|
<field name="arch" type="xml">
|
|
<graph string="Análisis Más Solicitados" type="bar">
|
|
<field name="product_id"/>
|
|
<field name="product_uom_qty" type="measure"/>
|
|
</graph>
|
|
</field>
|
|
</record>
|
|
|
|
<!-- Vista Pivot para Análisis por Período -->
|
|
<record id="view_analysis_period_pivot" model="ir.ui.view">
|
|
<field name="name">sale.order.line.analysis.period.pivot</field>
|
|
<field name="model">sale.order.line</field>
|
|
<field name="arch" type="xml">
|
|
<pivot string="Análisis por Período">
|
|
<field name="create_date" interval="month" type="col"/>
|
|
<field name="product_id" type="row"/>
|
|
<field name="product_uom_qty" type="measure"/>
|
|
</pivot>
|
|
</field>
|
|
</record>
|
|
|
|
<!-- Acción para Dashboard de Análisis Más Solicitados -->
|
|
<record id="action_top_analysis_dashboard" model="ir.actions.act_window">
|
|
<field name="name">Análisis Más Solicitados</field>
|
|
<field name="res_model">sale.order.line</field>
|
|
<field name="view_mode">graph,pivot,tree</field>
|
|
<field name="domain">[('order_id.is_lab_request', '=', True), ('product_id.is_analysis', '=', True)]</field>
|
|
<field name="context">{'search_default_group_by_product': 1}</field>
|
|
<field name="help" type="html">
|
|
<p class="o_view_nocontent_smiling_face">
|
|
No hay análisis registrados
|
|
</p>
|
|
<p>
|
|
Este dashboard muestra los análisis más solicitados en el laboratorio.
|
|
</p>
|
|
</field>
|
|
</record>
|
|
|
|
<!-- ================================================================
|
|
DASHBOARD 6: Distribución de Tests por Demografía
|
|
================================================================ -->
|
|
|
|
<!-- Vista Graph para Distribución por Sexo -->
|
|
<record id="view_test_gender_distribution_graph" model="ir.ui.view">
|
|
<field name="name">lims.test.gender.distribution.graph</field>
|
|
<field name="model">lims.test</field>
|
|
<field name="arch" type="xml">
|
|
<graph string="Distribución por Género" type="pie">
|
|
<field name="patient_gender"/>
|
|
</graph>
|
|
</field>
|
|
</record>
|
|
|
|
<!-- Vista Pivot para Tests por Edad y Sexo -->
|
|
<record id="view_test_demographics_pivot" model="ir.ui.view">
|
|
<field name="name">lims.test.demographics.pivot</field>
|
|
<field name="model">lims.test</field>
|
|
<field name="arch" type="xml">
|
|
<pivot string="Tests por Demografía">
|
|
<field name="patient_age_range" type="row"/>
|
|
<field name="patient_gender" type="col"/>
|
|
</pivot>
|
|
</field>
|
|
</record>
|
|
|
|
<!-- Acción para Dashboard de Distribución Demográfica -->
|
|
<record id="action_test_demographics_dashboard" model="ir.actions.act_window">
|
|
<field name="name">Distribución Demográfica de Tests</field>
|
|
<field name="res_model">lims.test</field>
|
|
<field name="view_mode">graph,pivot,tree</field>
|
|
<field name="domain">[('state', '=', 'validated')]</field>
|
|
<field name="context">{'search_default_this_year': 1}</field>
|
|
<field name="help" type="html">
|
|
<p class="o_view_nocontent_smiling_face">
|
|
No hay tests validados
|
|
</p>
|
|
<p>
|
|
Este dashboard muestra la distribución de tests por características demográficas de los pacientes.
|
|
</p>
|
|
</field>
|
|
</record>
|
|
|
|
<!-- ================================================================
|
|
FILTROS DE BÚSQUEDA PARA DASHBOARDS
|
|
================================================================ -->
|
|
|
|
<!-- Filtros para Tests -->
|
|
<record id="view_lims_test_dashboard_search" model="ir.ui.view">
|
|
<field name="name">lims.test.dashboard.search</field>
|
|
<field name="model">lims.test</field>
|
|
<field name="arch" type="xml">
|
|
<search>
|
|
<!-- Filtros de Estado -->
|
|
<filter string="En Proceso" name="in_process" domain="[('state', '=', 'in_process')]"/>
|
|
<filter string="Validados" name="validated" domain="[('state', '=', 'validated')]"/>
|
|
|
|
<!-- Filtros de Tiempo -->
|
|
<filter string="Hoy" name="today" domain="[('create_date', '>=', datetime.datetime.now().replace(hour=0, minute=0, second=0))]"/>
|
|
<filter string="Esta Semana" name="this_week" domain="[('create_date', '>=', (datetime.datetime.now() - datetime.timedelta(days=7)).strftime('%Y-%m-%d'))]"/>
|
|
<filter string="Este Mes" name="this_month" domain="[('create_date', '>=', datetime.datetime.now().replace(day=1).strftime('%Y-%m-%d'))]"/>
|
|
<filter string="Este Año" name="this_year" domain="[('create_date', '>=', datetime.datetime.now().replace(month=1, day=1).strftime('%Y-%m-%d'))]"/>
|
|
|
|
<!-- Agrupaciones -->
|
|
<group expand="0" string="Agrupar Por">
|
|
<filter string="Técnico" name="group_by_technician" context="{'group_by': 'technician_id'}"/>
|
|
<filter string="Estado" name="group_by_state" context="{'group_by': 'state'}"/>
|
|
<filter string="Paciente" name="group_by_patient" context="{'group_by': 'patient_id'}"/>
|
|
<filter string="Análisis" name="group_by_product" context="{'group_by': 'product_id'}"/>
|
|
<filter string="Fecha" name="group_by_date" context="{'group_by': 'create_date:month'}"/>
|
|
</group>
|
|
</search>
|
|
</field>
|
|
</record>
|
|
|
|
<!-- Filtros para Resultados -->
|
|
<record id="view_lims_result_dashboard_search" model="ir.ui.view">
|
|
<field name="name">lims.result.dashboard.search</field>
|
|
<field name="model">lims.result</field>
|
|
<field name="arch" type="xml">
|
|
<search>
|
|
<!-- Filtros de Rango -->
|
|
<filter string="Fuera de Rango" name="out_of_range" domain="[('is_out_of_range', '=', True)]"/>
|
|
<filter string="Críticos" name="critical" domain="[('is_critical', '=', True)]"/>
|
|
|
|
<!-- Agrupaciones -->
|
|
<group expand="0" string="Agrupar Por">
|
|
<filter string="Parámetro" name="group_by_parameter" context="{'group_by': 'parameter_id'}"/>
|
|
</group>
|
|
</search>
|
|
</field>
|
|
</record>
|
|
|
|
</odoo> |