From d51d3b5d697056ff97c920f8e47344c25ee15b89 Mon Sep 17 00:00:00 2001 From: Luis Ernesto Portillo Zaldivar Date: Thu, 17 Jul 2025 11:17:26 -0600 Subject: [PATCH] feat(#71): Implementar dashboards para administrador del laboratorio MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 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 --- dashboard_analysis.md | 78 +++++ lims_management/__manifest__.py | 1 + .../__pycache__/partner.cpython-312.pyc | Bin 4720 -> 5978 bytes lims_management/models/lims_test.py | 15 + lims_management/models/partner.py | 39 +++ lims_management/views/dashboard_views.xml | 321 ++++++++++++++++++ lims_management/views/menus.xml | 45 +++ 7 files changed, 499 insertions(+) create mode 100644 dashboard_analysis.md create mode 100644 lims_management/views/dashboard_views.xml diff --git a/dashboard_analysis.md b/dashboard_analysis.md new file mode 100644 index 0000000..54479fd --- /dev/null +++ b/dashboard_analysis.md @@ -0,0 +1,78 @@ +# Análisis de Dashboards para LIMS - Issue #71 + +## Dashboards Implementables sin Módulos Adicionales ni Cambios Estructurales + +### 1. ✅ Dashboard de Estado de Órdenes +**Factibilidad**: Alta +- Usar vistas graph y pivot nativas de Odoo +- Datos disponibles: sale.order con is_lab_request=True +- Métricas: órdenes por estado, por fecha, por paciente + +### 2. ✅ Dashboard de Productividad de Técnicos +**Factibilidad**: Alta +- Datos disponibles: lims.test (technician_id, state, create_date, validation_date) +- Métricas: pruebas procesadas por técnico, tiempos promedio, estados + +### 3. ✅ Dashboard de Muestras +**Factibilidad**: Alta +- Datos disponibles: stock.lot con is_lab_sample=True +- Métricas: muestras por estado, rechazos, re-muestreos + +### 4. ✅ Dashboard de Parámetros Fuera de Rango +**Factibilidad**: Alta +- Datos disponibles: lims.result (is_out_of_range, is_critical) +- Métricas: resultados críticos, fuera de rango por parámetro + +### 5. ✅ Dashboard de Análisis Más Solicitados +**Factibilidad**: Alta +- Datos disponibles: sale.order.line con productos is_analysis=True +- Métricas: top análisis, tendencias por período + +### 6. ⚠️ Dashboard de Tiempos de Respuesta +**Factibilidad**: Media +- Requiere campos calculados (no almacenados actualmente) +- Necesitaría agregar campos store=True para métricas de tiempo + +### 7. ❌ Dashboard de Facturación +**Factibilidad**: Baja +- Requiere módulo account (facturación) +- No está en las dependencias actuales + +### 8. ❌ Dashboard de Inventario de Reactivos +**Factibilidad**: Baja +- Requiere configuración adicional de stock +- No hay modelo específico para reactivos + +## Implementación Técnica + +### Herramientas Disponibles en Odoo 18: +1. **Vistas Graph**: Gráficos de barras, líneas, pie +2. **Vistas Pivot**: Tablas dinámicas +3. **Vistas Cohort**: Análisis de cohortes +4. **Filtros y Agrupaciones**: Para segmentar datos +5. **Acciones de Servidor**: Para cálculos complejos + +### Estructura Propuesta: +```xml + + +``` + +## Recomendación + +Sugiero comenzar con los 5 dashboards marcados con ✅ ya que: +1. Utilizan datos existentes +2. No requieren cambios en modelos +3. Usan herramientas nativas de Odoo +4. Proveen valor inmediato al administrador + +Orden de implementación sugerido: +1. Dashboard de Estado de Órdenes (más básico) +2. Dashboard de Productividad de Técnicos +3. Dashboard de Muestras +4. Dashboard de Parámetros Fuera de Rango +5. Dashboard de Análisis Más Solicitados \ No newline at end of file diff --git a/lims_management/__manifest__.py b/lims_management/__manifest__.py index 16f9d1f..d188b78 100644 --- a/lims_management/__manifest__.py +++ b/lims_management/__manifest__.py @@ -45,6 +45,7 @@ 'views/analysis_parameter_views.xml', 'views/product_template_parameter_config_views.xml', 'views/parameter_dashboard_views.xml', + 'views/dashboard_views.xml', 'views/menus.xml', 'views/lims_config_views.xml', 'report/sample_label_report.xml', diff --git a/lims_management/models/__pycache__/partner.cpython-312.pyc b/lims_management/models/__pycache__/partner.cpython-312.pyc index 0b833d5c24e2bacf7b0c5c62270b4fef5cd1c0ec..3134b6ca18f7fa66ae060457bdb075fa07f2d84b 100644 GIT binary patch delta 1869 zcmb`IUrbw79LMjy{og`MODUzaaNB}#*$OQ%kiq5@29h~kz(i#+_1bgO6-v9E+a?<_ zi-ycS?4j(aKzwlev;?xa^uY&xFj-<^eA%1}q}c=d##@>C!o%YE-Tr~b`Q~}}<$Hdg z-|zhS{myL*ZTW8VFSWHshK}F9yL!n}ziR%2{pkL_ne{utSv{f*vVFs%dSpipTaHaN zadF;EBXVvvZF0rPSu4j#>N#b>>Rja7Qf;!OD4P;xu8x2iYDStZZDqB3EGlE{=4%ERwD42%&fZ)Xk_meVpYeJzwZ!m45 zenlOE-cX>g2o!Y)`a*&JB2d&J=nn->6oI13AakHO5ef_xiK5EnKr;{u3>JZ+DnKpZML-q0o4m&p&hcZgZ*sF|Y=V~ts2#+di+k#l;N8E>RiG))t7kvH`Y@`aYqTvsot5j*dqd*~6j#D+EHpj*?Fs7gd#MZ%P5N<>>l;*{u0 zL|;X&QDP_&V})esZnthwWGbPW3IakXsVxz66}f{fRr9;3u4?|Rnz?2bY>Qo^Vmy+L zi@X%)p{`2JC0cX-15p-HCdo?)9x!$7!MnoE)a=Zug+&xyY-HB-|eBD&hG5Q6MOqkgLD10+wbml_Wa+| zT}Nj?S#!5d$m*WddG~whfpIWr)ep1&lW^-{Fj{H^?yyoa{9Zy`NYZeceV^Q;Hb|bE znsQp>1j`;LQzpTq6zwbxT(ll3S_DgCN{W)tOffc?dv5CEOh@`eM$Ek(&?EZwL0|Hw zl!&8JDvW3nhStdNVJST!pPPehg8XD&G6W%mof2BfIm@Z>S0GV6dP&6i3`lJf$D*+W zK2ImgqsSX(q_`AG#gYl-etF$wf}TmjO5gDi#GNERTSg_N>3L%$nUGUhj3s1z3Rbi& zB#{&k7w-~YNXJt#3^&CWfYye?k+>+!5h)%IhXoeDPQ5bxd7LS}B;}ohfyXJ|Ao03& zztx-7ZrAaT>iB1j!KW?Q7)#5;j^Q8s|Ef1wC)wr6f`h26ms_mMGoN1k_~JvW_p!#e z&oybf{!}qqe*sisfLyV@N;{FWUTJ`uDBB(AN9b|Wap^RUk|CR~;X{^f&N|lItM0!U I&=^Ah0q^&$b^rhX delta 716 zcmZva&ubGw6vuZqHBB0`rb#x5%_iM8wdpDiwT0r(SnZ+cL8MiX1xeSPAx((8_;wW$ zK@T}7f>`F@5AZKY4odz3?}BI9qZh%G9(wWQytQe1a1P&n^XBuuZ{ILM?bn?0C7GO% z#9G~Zxbrf(t9&QrPrnuNG)&^bXwfvy^s_zrU&c(y5*us(k5l`R9@(cRLrNLB3?rJO zNBYqNw=~VuLQ^&~g3q>3ZV$21mmVLQ(y6Z0+dnXKVL@%g4I^5l+R&bs4pkIHgJoWi zk})&zBk#x{8GR;`GJh2-5uNvAE?MMS{Py7E(KDp7 zAew=J5*1>|P{DXkh=oCs~N}ZhL*MwFFFO+RUD*Wd$qco4?ijc>Xo6Ngmf$uP= z*}yEHt?{K)OW^NQD{`WY;5drTzonO}Ga@u1VW%MBThL^FgNhr}*b=;T#SFbu>se8g|F>JezeojfO#BRb)MU5^E67 zjjsk!a4zo(PpfbFSJmZra+gSzf5_ce@t;HXPwc`ymp + + + + + + sale.order.lab.dashboard.graph + sale.order + + + + + + + + + + sale.order.lab.dashboard.pivot + sale.order + + + + + + + + + + + Estado de Órdenes + sale.order + graph,pivot,tree,form + [('is_lab_request', '=', True)] + {'search_default_group_by_state': 1} + +

+ No hay órdenes de laboratorio registradas +

+

+ Este dashboard muestra el estado actual de todas las órdenes de laboratorio. +

+
+
+ + + + + + lims.test.technician.productivity.graph + lims.test + + + + + + + + + + + lims.test.technician.productivity.pivot + lims.test + + + + + + + + + + + Productividad de Técnicos + lims.test + graph,pivot,tree,form + {'search_default_group_by_technician': 1, 'search_default_this_month': 1} + +

+ No hay pruebas registradas +

+

+ Este dashboard muestra la productividad de cada técnico del laboratorio. +

+
+
+ + + + + + stock.lot.sample.status.graph + stock.lot + + + + + + + + + + stock.lot.sample.type.pivot + stock.lot + + + + + + + + + + + Dashboard de Muestras + stock.lot + graph,pivot,tree,form + [('is_lab_sample', '=', True)] + {'search_default_group_by_state': 1} + +

+ No hay muestras registradas +

+

+ Este dashboard muestra el estado de todas las muestras del laboratorio. +

+
+
+ + + + + + lims.result.out.of.range.graph + lims.result + + + + + + + + + + + lims.result.critical.pivot + lims.result + + + + + + + + + + + + Parámetros Fuera de Rango + lims.result + graph,pivot,tree,form + [('test_id.state', '=', 'validated')] + {'search_default_out_of_range': 1} + +

+ No hay resultados fuera de rango +

+

+ Este dashboard muestra los parámetros que están fuera de los rangos normales. +

+
+
+ + + + + + sale.order.line.top.analysis.graph + sale.order.line + + + + + + + + + + + sale.order.line.analysis.period.pivot + sale.order.line + + + + + + + + + + + + Análisis Más Solicitados + sale.order.line + graph,pivot,tree + [('order_id.is_lab_request', '=', True), ('product_id.is_analysis', '=', True)] + {'search_default_group_by_product': 1} + +

+ No hay análisis registrados +

+

+ Este dashboard muestra los análisis más solicitados en el laboratorio. +

+
+
+ + + + + + lims.test.gender.distribution.graph + lims.test + + + + + + + + + + lims.test.demographics.pivot + lims.test + + + + + + + + + + + Distribución Demográfica de Tests + lims.test + graph,pivot,tree + [('state', '=', 'validated')] + {'search_default_this_year': 1} + +

+ No hay tests validados +

+

+ Este dashboard muestra la distribución de tests por características demográficas de los pacientes. +

+
+
+ + + + + + lims.test.dashboard.search + lims.test + + + + + + + + + + + + + + + + + + + + + + + + + + + lims.result.dashboard.search + lims.result + + + + + + + + + + + + + + +
\ No newline at end of file diff --git a/lims_management/views/menus.xml b/lims_management/views/menus.xml index c8bd994..a726237 100644 --- a/lims_management/views/menus.xml +++ b/lims_management/views/menus.xml @@ -155,6 +155,51 @@ action="action_lims_result" sequence="30"/> + + + + + + + + + + + + + + + +