From a047cd1a02931e92a080e5ed6f4f67e15a4c0c78 Mon Sep 17 00:00:00 2001 From: Luis Ernesto Portillo Zaldivar Date: Mon, 14 Jul 2025 09:09:24 -0600 Subject: [PATCH] feat(#7): Implementar feedback de gestion de muestras - Anadido catalogo de Tipos de Muestra. - Mejorada la vista de Muestras para seleccionar el tipo. - Creados datos de demostracion para tipos de muestra y muestras. --- documents/plans/ISSUE7_PLAN.md | 83 ++++++++++-------- lims_management/__manifest__.py | 2 +- lims_management/data/product_data.xml | 15 ---- lims_management/demo/z_sample_demo.xml | 39 ++++++++ .../__pycache__/product.cpython-312.pyc | Bin 1230 -> 1401 bytes lims_management/models/product.py | 5 ++ lims_management/views/menus.xml | 28 +++++- lims_management/views/stock_lot_views.xml | 7 +- 8 files changed, 123 insertions(+), 56 deletions(-) delete mode 100644 lims_management/data/product_data.xml create mode 100644 lims_management/demo/z_sample_demo.xml diff --git a/documents/plans/ISSUE7_PLAN.md b/documents/plans/ISSUE7_PLAN.md index 297559d..815e0b7 100644 --- a/documents/plans/ISSUE7_PLAN.md +++ b/documents/plans/ISSUE7_PLAN.md @@ -6,45 +6,56 @@ Extender el modelo de Lotes/Números de Serie de Odoo (`stock.lot`) para represe ## TODO -- [ ] **Extender el Modelo de Lote/Número de Serie (`stock.lot`):** - - [ ] Crear el archivo `lims_management/models/stock_lot.py`. - - [ ] Heredar del modelo `stock.lot`. - - [ ] Añadir un campo booleano `is_lab_sample` para identificar los registros que son muestras de laboratorio. - - [ ] Añadir un campo `patient_id` (Many2one a `res.partner`) para vincular la muestra al paciente. - - [ ] Añadir un campo `request_id` (Many2one a `sale.order`) para vincular la muestra a la solicitud de laboratorio correspondiente. - - [ ] Añadir un campo `collection_date` (Datetime) para registrar la fecha y hora de la toma de la muestra. - - [ ] Añadir un campo `container_type` (Selection) para el tipo de recipiente (ej. 'Tubo de suero', 'Tubo EDTA', 'Hisopo', 'Orina'). +- [x] **Extender el Modelo de Lote/Número de Serie (`stock.lot`):** + - [x] Crear el archivo `lims_management/models/stock_lot.py`. + - [x] Heredar del modelo `stock.lot`. + - [x] Añadir campos: `is_lab_sample`, `patient_id`, `request_id`, `collection_date`, `container_type`. -- [ ] **Adaptar las Vistas de Lote/Número de Serie:** - - [ ] Crear el archivo `lims_management/views/stock_lot_views.xml`. - - [ ] Crear una nueva vista de lista (`list`) para las muestras, mostrando campos clave como el número de muestra (`name`), paciente, fecha de recolección y tipo de recipiente. - - [ ] Crear una nueva vista de formulario (`form`) para el registro de muestras, incluyendo todos los campos nuevos. - - [ ] Asegurarse de que el campo `product_id` (requerido por `stock.lot`) se gestione adecuadamente. Se puede crear un producto de servicio genérico llamado "Muestra de Laboratorio" y asignarlo por defecto. +- [x] **Adaptar las Vistas de Lote/Número de Serie:** + - [x] Crear el archivo `lims_management/views/stock_lot_views.xml`. + - [x] Crear vistas de lista y formulario para las muestras. + - [x] Crear un producto de servicio por defecto para las muestras. -- [ ] **Crear el Menú "Gestión de Muestras":** - - [ ] Modificar `lims_management/views/menus.xml`. - - [ ] Crear una nueva acción de ventana (`ir.actions.act_window`) para el modelo `stock.lot`. - - [ ] Establecer un dominio en la acción para mostrar solo los registros que son muestras de laboratorio (`is_lab_sample = True`). - - [ ] En el `context` de la acción, establecer `default_is_lab_sample = True` y, si se decide, el `default_product_id`. - - [ ] Crear un `menuitem` para "Muestras" o "Gestión de Muestras" dentro del menú principal del LIMS. +- [x] **Crear el Menú "Gestión de Muestras":** + - [x] Modificar `lims_management/views/menus.xml`. + - [x] Crear acción de ventana y `menuitem` para `stock.lot` con el dominio y contexto adecuados. -- [ ] **Establecer Permisos y Reglas de Dominio:** - - [ ] Modificar `lims_management/security/ir.model.access.csv` para asegurar que los usuarios del LIMS tengan permisos para crear, leer, escribir y eliminar registros en `stock.lot`. - - [ ] Aplicar un dominio al campo `patient_id` en la vista de muestra para que solo muestre contactos que estén marcados como pacientes. +- [x] **Establecer Permisos y Reglas de Dominio:** + - [x] Modificar `lims_management/security/ir.model.access.csv` para dar permisos sobre `stock.lot`. + - [x] Añadir dominios en las vistas para los campos relacionales. -- [ ] **Actualizar el Manifiesto (`__manifest__.py`):** - - [ ] Añadir el nuevo archivo de modelo (`stock_lot.py`) al `__init__.py` correspondiente. - - [ ] Añadir el nuevo archivo de vistas (`stock_lot_views.xml`) a la clave `data` en `__manifest__.py`. +- [x] **Actualizar el Manifiesto (`__manifest__.py`):** + - [x] Añadir nuevos archivos de modelos, vistas y datos al manifiesto. -- [ ] **Verificación Final:** - - [ ] Reiniciar la instancia de Odoo (`docker-compose down -v` y `docker-compose up -d`). - - [ ] Revisar los logs de `odoo_init` en busca de errores de instalación o actualización. - - [ ] Verificar la funcionalidad en la interfaz de Odoo: - - Navegar al nuevo menú "Muestras". - - Crear una nueva muestra, asociarla a un paciente y (si la funcionalidad de solicitud ya existiera) a una solicitud. - - Confirmar que la lista de muestras solo muestra los registros correctos. +- [x] **Verificación Final:** + - [x] Reiniciar y verificar la instancia de Odoo. -- [ ] **(Opcional) Crear Datos de Demostración:** - - [ ] Crear un archivo `demo/z_sample_demo.xml`. - - [ ] Definir al menos dos muestras de ejemplo, vinculadas a los pacientes de demostración. - - [ ] Añadir el archivo a la clave `demo` en `__manifest__.py`. \ No newline at end of file +--- + +## **Nuevas Tareas (Feedback)** + +- [ ] **Mejorar Modelo de Productos para Tipos de Muestra:** + - [ ] Añadir un campo booleano `is_sample_type` al modelo `product.template` en `lims_management/models/product.py`. + +- [ ] **Crear Menú para "Tipos de Muestra":** + - [ ] En `lims_management/views/menus.xml`, añadir una nueva acción de ventana y un `menuitem` en "Configuración". + - [ ] La acción debe mostrar los productos que tengan `is_sample_type = True`. + - [ ] El `context` de la acción debe preestablecer `default_is_sample_type = True` y `default_type = 'service'`. + +- [ ] **Actualizar Vista de Muestras (`stock.lot`):** + - [ ] En `lims_management/views/stock_lot_views.xml`, hacer visible el campo `product_id` (Tipo de Muestra). + - [ ] Aplicar un dominio al campo `product_id` para que solo muestre productos con `is_sample_type = True`. + - [ ] Eliminar el `default_product_id` del contexto de la acción de la muestra. + - [ ] Eliminar el producto genérico "Lab Sample" del archivo de datos. + +- [ ] **Crear Datos de Demostración:** + - [ ] Crear el archivo `lims_management/demo/z_sample_demo.xml`. + - [ ] Añadir registros de `product.template` para diferentes tipos de muestra (ej. "Tubo de Suero", "Tubo EDTA"). + - [ ] Añadir registros de `stock.lot` que representen muestras reales, usando los pacientes y los nuevos tipos de muestra de demostración. + - [ ] Añadir el nuevo archivo de demostración al `__manifest__.py`. + +- [ ] **Verificación Final (con Demo):** + - [ ] Reactivar temporalmente la carga de datos de demostración en `init_odoo.py`. + - [ ] Reiniciar la instancia (`docker-compose down -v` y `docker-compose up -d`). + - [ ] Revisar logs y verificar la funcionalidad completa en la interfaz de Odoo. + - [ ] Desactivar nuevamente la carga de datos de demostración al finalizar. diff --git a/lims_management/__manifest__.py b/lims_management/__manifest__.py index a58432f..6de926c 100644 --- a/lims_management/__manifest__.py +++ b/lims_management/__manifest__.py @@ -22,7 +22,6 @@ 'security/ir.model.access.csv', 'data/ir_sequence.xml', 'data/product_category.xml', - 'data/product_data.xml', 'views/partner_views.xml', 'views/analysis_views.xml', 'views/sale_order_views.xml', @@ -32,6 +31,7 @@ 'demo': [ 'demo/z_lims_demo.xml', 'demo/z_analysis_demo.xml', + 'demo/z_sample_demo.xml', ], 'installable': True, 'application': True, diff --git a/lims_management/data/product_data.xml b/lims_management/data/product_data.xml deleted file mode 100644 index 4327b0c..0000000 --- a/lims_management/data/product_data.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - Lab Sample - service - order - - - LAB-SAMPLE - - - - diff --git a/lims_management/demo/z_sample_demo.xml b/lims_management/demo/z_sample_demo.xml new file mode 100644 index 0000000..688d6bb --- /dev/null +++ b/lims_management/demo/z_sample_demo.xml @@ -0,0 +1,39 @@ + + + + + + Tubo de Suero (Tapa Roja) + + service + + + Tubo EDTA (Tapa Morada) + + service + + + Contenedor de Orina + + service + + + + + SAM-2025-00001 + + + + + serum_tube + + + SAM-2025-00002 + + + + + edta_tube + + + diff --git a/lims_management/models/__pycache__/product.cpython-312.pyc b/lims_management/models/__pycache__/product.cpython-312.pyc index b04b7884ebab6dc50fa20d493aabeacb959715b3..15c2049da44dbd2c864c2b1e27c3fc87c366bafe 100644 GIT binary patch delta 303 zcmX@d`IC$HG%qg~0}wRHlx94d$lJwuXX1>lI!p|yELmW2kQ@S}@TBmrVOh-t5sBih zSDZePOB)_Oqp%`LBa(-S(VrE`yk)EF>-((Kvc>=fi zGK=FOvhg5&lb11jGqz0r#GEVB;QxV#K}=;r*z~xGaX0uCZ}5hFVPzI$YxFCUpPbC1 z;VcJqagjWTPyiCYIBar(j>$>2D^dn>8G*Q10!VydW@Kc1&LIDVMV66mLfZ74i8)^x IfK0GX03;|@!~g&Q delta 114 zcmey#b&iwwG%qg~0}z~FR+3>ek++L+%fuO5St@xnc{f)wZee8h)8w7p%{*_iC5ty> z&g52>T$V=vBDu+YtQu0XKy5{GAVMBU{Nk|5%}*)KNwq6dnjF9?CM?0oHX&_#&cvLr J3_vDWApml79{~UW diff --git a/lims_management/models/product.py b/lims_management/models/product.py index 248a0d4..40f24a7 100644 --- a/lims_management/models/product.py +++ b/lims_management/models/product.py @@ -26,3 +26,8 @@ class ProductTemplate(models.Model): 'analysis_id', string="Rangos de Referencia" ) + + is_sample_type = fields.Boolean( + string="Is a Sample Type", + help="Check if this product represents a type of laboratory sample container." + ) diff --git a/lims_management/views/menus.xml b/lims_management/views/menus.xml index f65623d..c7f58cd 100644 --- a/lims_management/views/menus.xml +++ b/lims_management/views/menus.xml @@ -85,8 +85,7 @@ (0, 0, {'view_mode': 'form', 'view_id': ref('view_lab_sample_form')})]"/> [('is_lab_sample', '=', True)]

@@ -136,5 +135,30 @@ parent="lims_menu_config" action="action_lims_analysis_catalog" sequence="10"/> + + + + Tipos de Muestra + product.template + kanban,form + [('is_sample_type', '=', True)] + + +

+ Crea un nuevo tipo de muestra +

+
+ + + + diff --git a/lims_management/views/stock_lot_views.xml b/lims_management/views/stock_lot_views.xml index 738ed94..ff3c077 100644 --- a/lims_management/views/stock_lot_views.xml +++ b/lims_management/views/stock_lot_views.xml @@ -10,9 +10,9 @@ + -
@@ -33,7 +33,10 @@ - +