From 291ceb9bfd11adf1d9ac1b7ba084b7497b977eab Mon Sep 17 00:00:00 2001 From: Luis Ernesto Portillo Zaldivar Date: Mon, 14 Jul 2025 08:03:25 -0600 Subject: [PATCH 1/8] feat(#7): Crear plan de desarrollo para gestion de muestras --- documents/plans/ISSUE7_PLAN.md | 50 ++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 documents/plans/ISSUE7_PLAN.md diff --git a/documents/plans/ISSUE7_PLAN.md b/documents/plans/ISSUE7_PLAN.md new file mode 100644 index 0000000..297559d --- /dev/null +++ b/documents/plans/ISSUE7_PLAN.md @@ -0,0 +1,50 @@ +# Plan de Actividades: Issue #7 - Gestión de Muestras de Laboratorio + +## Objetivo + +Extender el modelo de Lotes/Números de Serie de Odoo (`stock.lot`) para representar y gestionar las **Muestras de Laboratorio**. Esto permitirá la trazabilidad completa de la muestra desde su recolección hasta el análisis. + +## 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'). + +- [ ] **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. + +- [ ] **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. + +- [ ] **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. + +- [ ] **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`. + +- [ ] **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. + +- [ ] **(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 From ade39f9310b90c776cdf6a4bc860a551c779064a Mon Sep 17 00:00:00 2001 From: Luis Ernesto Portillo Zaldivar Date: Mon, 14 Jul 2025 08:12:43 -0600 Subject: [PATCH 2/8] feat(#7): Extender stock.lot para gestion de muestras --- lims_management/models/__init__.py | 7 +++-- .../__pycache__/__init__.cpython-312.pyc | Bin 287 -> 320 bytes .../__pycache__/stock_lot.cpython-312.pyc | Bin 0 -> 1176 bytes lims_management/models/stock_lot.py | 29 ++++++++++++++++++ 4 files changed, 33 insertions(+), 3 deletions(-) create mode 100644 lims_management/models/__pycache__/stock_lot.cpython-312.pyc create mode 100644 lims_management/models/stock_lot.py diff --git a/lims_management/models/__init__.py b/lims_management/models/__init__.py index 4ffd5f7..5b09e9e 100644 --- a/lims_management/models/__init__.py +++ b/lims_management/models/__init__.py @@ -1,5 +1,6 @@ # -*- coding: utf-8 -*- -from . import partner -from . import product from . import analysis_range -from . import sale_order \ No newline at end of file +from . import product +from . import partner +from . import sale_order +from . import stock_lot diff --git a/lims_management/models/__pycache__/__init__.cpython-312.pyc b/lims_management/models/__pycache__/__init__.cpython-312.pyc index 51f1d6557bbc98485406e20e5a35a9de312b7a04..03e48105f3c13e4c35712710173907af41ecae8d 100644 GIT binary patch delta 166 zcmbQwbbyKXG%qg~0}$NgFU^=Vkynz@VWPTebP7WXYYsy$YZNOZLnWIg`%6Zk5>3Wi ze2IC9IhDnk#qmXndFiP@5%z+j{FKt<5->Bds3b472*~6rPRvP-&o4>=^Eiu3@{_aU ybMj04G}$K36Jsi3pSaOmjR$BZ$lPKPAn}2jk&*E!gUnq9Q81FY#~@w=av1<*5H4Z> delta 134 zcmX@WG@pt0G%qg~0}uqQD9Nat$ScWcGEv=BzLHgw?Ij~nSd;M}X+|c%)a2XPU%HlAI1LB5YTz0}v+A#$9@ci?8zxVv!v)|idu>j=yV7KlSGXQ*6 zhyKd;z>f(DIsgN#`5@5hTA{kU{U6=vI z#E*n|*CRfT8cN+?n-_kPnhqeKu3=Euu~yIMfEf3aRQu#~$NEZUSxa%615p!V6%>xN*=ijV3fCpb|xG1@LYONRBCD#^Kjnl@1 ztCYw2NTG3G!ja37gPf~qmNLXCYdbX*G=1V~!i+fc!nt^Wk!ZY$7!L^(x$B5~B;@g) z+lR-z2sYE>*imQfv=lR}Mcg~C&T{f*VPYB}FN_Nj^2s=5n6P+2Ugg{%4_hSSaXAg* zqglvO)t`Z4dy@J-X>gB*&J^Or&C2&IM1-{h$Xl}{F4PouW+axDJi#2LhWz=dnX`Sp z5j{q;!l+3pS=pAXi^TR#wKmI&O0fXC_U`#hYeNSXFLbI))zu^C-VaUA zPp@rr7DqberE=FA?%F%M_R;m6vE7`%@@)`o-`_V4b?v=f`}l9ujzf!gJ9LSz9-DYS za%TS8+VJS&t&hW_?}kUe19Qxj-gbGtXpT6~tE}A5rs`&eK{2IFO?cYa?6ex|G~<0r uo3I^;HmpqiNa~P+m87Y0isBub#bp_7g~$c>V%aD>!NZ literal 0 HcmV?d00001 diff --git a/lims_management/models/stock_lot.py b/lims_management/models/stock_lot.py new file mode 100644 index 0000000..8ca95bf --- /dev/null +++ b/lims_management/models/stock_lot.py @@ -0,0 +1,29 @@ +# -*- coding: utf-8 -*- +from odoo import models, fields + +class StockLot(models.Model): + _inherit = 'stock.lot' + + is_lab_sample = fields.Boolean(string='Is a Laboratory Sample') + + patient_id = fields.Many2one( + 'res.partner', + string='Patient', + domain="[('is_patient', '=', True)]" + ) + + request_id = fields.Many2one( + 'sale.order', + string='Lab Request', + domain="[('is_lab_request', '=', True)]" + ) + + collection_date = fields.Datetime(string='Collection Date') + + container_type = fields.Selection([ + ('serum_tube', 'Serum Tube'), + ('edta_tube', 'EDTA Tube'), + ('swab', 'Swab'), + ('urine', 'Urine Container'), + ('other', 'Other') + ], string='Container Type') From 87dd5705485b5843e4efaf60386e9eb02bb52737 Mon Sep 17 00:00:00 2001 From: Luis Ernesto Portillo Zaldivar Date: Mon, 14 Jul 2025 08:15:58 -0600 Subject: [PATCH 3/8] =?UTF-8?q?feat(#7):=20A=C3=B1adir=20vistas=20y=20dato?= =?UTF-8?q?s=20para=20gestion=20de=20muestras?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Se añaden las vistas de lista y formulario para las muestras de laboratorio, junto con un producto de servicio por defecto. Se deshabilita temporalmente la carga de datos de demostración en init_odoo.py para estabilizar el entorno de validación. --- init_odoo.py | 67 ++++++++++++----------- lims_management/__manifest__.py | 2 + lims_management/data/product_data.xml | 15 +++++ lims_management/views/stock_lot_views.xml | 49 +++++++++++++++++ 4 files changed, 100 insertions(+), 33 deletions(-) create mode 100644 lims_management/data/product_data.xml create mode 100644 lims_management/views/stock_lot_views.xml diff --git a/init_odoo.py b/init_odoo.py index 5c0d251..213a73d 100644 --- a/init_odoo.py +++ b/init_odoo.py @@ -35,6 +35,7 @@ odoo_command = [ "-c", ODOO_CONF, "-d", DB_NAME, "-i", MODULES_TO_INSTALL, + "--without-demo=all", "--stop-after-init" ] @@ -57,47 +58,47 @@ try: print(f"Odoo falló con código de salida {result.returncode}") sys.exit(result.returncode) - print("Inicialización de Odoo completada exitosamente.") + # print("Inicialización de Odoo completada exitosamente.") - # --- Lógica para crear datos de demostración personalizados --- - print("Creando solicitudes de laboratorio de demostración...") - sys.stdout.flush() + # # --- Lógica para crear datos de demostración personalizados --- + # print("Creando solicitudes de laboratorio de demostración...") + # sys.stdout.flush() - with open("/app/create_lab_requests.py", "r") as f: - script_content = f.read() + # with open("/app/create_lab_requests.py", "r") as f: + # script_content = f.read() - # Reutilizamos el entorno de Odoo para ejecutar un script - create_requests_command = f""" - odoo shell -c {ODOO_CONF} -d {DB_NAME} <<'EOF' -{script_content} -EOF - """ + # # Reutilizamos el entorno de Odoo para ejecutar un script + # create_requests_command = f""" + # odoo shell -c {ODOO_CONF} -d {DB_NAME} <<'EOF' + # {script_content} + # EOF + # """ - try: - result = subprocess.run( - create_requests_command, - shell=True, - capture_output=True, - text=True, - check=False - ) + # try: + # result = subprocess.run( + # create_requests_command, + # shell=True, + # capture_output=True, + # text=True, + # check=False + # ) - print("--- Create Lab Requests stdout ---") - print(result.stdout) - print("--- Create Lab Requests stderr ---") - print(result.stderr) - sys.stdout.flush() + # print("--- Create Lab Requests stdout ---") + # print(result.stdout) + # print("--- Create Lab Requests stderr ---") + # print(result.stderr) + # sys.stdout.flush() - if result.returncode != 0: - print(f"Fallo al crear las solicitudes de laboratorio con código de salida {result.returncode}") - sys.exit(result.returncode) + # if result.returncode != 0: + # print(f"Fallo al crear las solicitudes de laboratorio con código de salida {result.returncode}") + # sys.exit(result.returncode) - print("Solicitudes de laboratorio de demostración creadas exitosamente.") - sys.exit(0) + # print("Solicitudes de laboratorio de demostración creadas exitosamente.") + # sys.exit(0) - except Exception as e: - print(f"Ocurrió un error inesperado al crear las solicitudes de laboratorio: {e}") - sys.exit(1) + # except Exception as e: + # print(f"Ocurrió un error inesperado al crear las solicitudes de laboratorio: {e}") + # sys.exit(1) except FileNotFoundError: print("Error: El comando 'odoo' no se encontró. Asegúrate de que la imagen del contenedor es correcta y odoo está en el PATH.") diff --git a/lims_management/__manifest__.py b/lims_management/__manifest__.py index b17245a..a58432f 100644 --- a/lims_management/__manifest__.py +++ b/lims_management/__manifest__.py @@ -22,9 +22,11 @@ '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', + 'views/stock_lot_views.xml', 'views/menus.xml', ], 'demo': [ diff --git a/lims_management/data/product_data.xml b/lims_management/data/product_data.xml new file mode 100644 index 0000000..4327b0c --- /dev/null +++ b/lims_management/data/product_data.xml @@ -0,0 +1,15 @@ + + + + + + Lab Sample + service + order + + + LAB-SAMPLE + + + + diff --git a/lims_management/views/stock_lot_views.xml b/lims_management/views/stock_lot_views.xml new file mode 100644 index 0000000..738ed94 --- /dev/null +++ b/lims_management/views/stock_lot_views.xml @@ -0,0 +1,49 @@ + + + + + + + lab.sample.list + stock.lot + + + + + + + + + + + + + + lab.sample.form + stock.lot + +
+ +
+

+ +

+
+ + + + + + + + + + + +
+
+
+
+ +
+
From bbd65ed929bb1cadf05bb84ae809b287071775dd Mon Sep 17 00:00:00 2001 From: Luis Ernesto Portillo Zaldivar Date: Mon, 14 Jul 2025 08:39:39 -0600 Subject: [PATCH 4/8] feat(#7): Anadir menu para gestion de muestras --- lims_management/views/menus.xml | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/lims_management/views/menus.xml b/lims_management/views/menus.xml index 678716b..f65623d 100644 --- a/lims_management/views/menus.xml +++ b/lims_management/views/menus.xml @@ -75,6 +75,34 @@ action="action_lims_lab_request" sequence="15"/> + + + Muestras de Laboratorio + stock.lot + list,form + + [('is_lab_sample', '=', True)] + + +

+ Crea una nueva muestra de laboratorio +

+
+
+ + + + Date: Mon, 14 Jul 2025 08:41:00 -0600 Subject: [PATCH 5/8] feat(#7): Anadir permisos para gestion de muestras --- lims_management/security/ir.model.access.csv | 1 + 1 file changed, 1 insertion(+) diff --git a/lims_management/security/ir.model.access.csv b/lims_management/security/ir.model.access.csv index a326f43..9d946ac 100644 --- a/lims_management/security/ir.model.access.csv +++ b/lims_management/security/ir.model.access.csv @@ -1,3 +1,4 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink access_lims_analysis_range_user,lims.analysis.range.user,model_lims_analysis_range,base.group_user,1,1,1,1 access_sale_order_receptionist,sale.order.receptionist,sale.model_sale_order,group_lims_receptionist,1,1,1,0 +access_stock_lot_user,stock.lot.user,stock.model_stock_lot,base.group_user,1,1,1,1 From 25841b75f33d43f5c85c13edcaa78a345b134465 Mon Sep 17 00:00:00 2001 From: Luis Ernesto Portillo Zaldivar Date: Mon, 14 Jul 2025 08:41:40 -0600 Subject: [PATCH 6/8] chore(#7): Restaurar script de inicializacion --- init_odoo.py | 69 ++++++++++++++++++++++++++-------------------------- 1 file changed, 34 insertions(+), 35 deletions(-) diff --git a/init_odoo.py b/init_odoo.py index 213a73d..d1c5a08 100644 --- a/init_odoo.py +++ b/init_odoo.py @@ -35,7 +35,6 @@ odoo_command = [ "-c", ODOO_CONF, "-d", DB_NAME, "-i", MODULES_TO_INSTALL, - "--without-demo=all", "--stop-after-init" ] @@ -58,51 +57,51 @@ try: print(f"Odoo falló con código de salida {result.returncode}") sys.exit(result.returncode) - # print("Inicialización de Odoo completada exitosamente.") + print("Inicialización de Odoo completada exitosamente.") - # # --- Lógica para crear datos de demostración personalizados --- - # print("Creando solicitudes de laboratorio de demostración...") - # sys.stdout.flush() + # --- Lógica para crear datos de demostración personalizados --- + print("Creando solicitudes de laboratorio de demostración...") + sys.stdout.flush() - # with open("/app/create_lab_requests.py", "r") as f: - # script_content = f.read() + with open("/app/create_lab_requests.py", "r") as f: + script_content = f.read() - # # Reutilizamos el entorno de Odoo para ejecutar un script - # create_requests_command = f""" - # odoo shell -c {ODOO_CONF} -d {DB_NAME} <<'EOF' - # {script_content} - # EOF - # """ + # Reutilizamos el entorno de Odoo para ejecutar un script + create_requests_command = f""" + odoo shell -c {ODOO_CONF} -d {DB_NAME} <<'EOF' +{script_content} +EOF + """ - # try: - # result = subprocess.run( - # create_requests_command, - # shell=True, - # capture_output=True, - # text=True, - # check=False - # ) + try: + result = subprocess.run( + create_requests_command, + shell=True, + capture_output=True, + text=True, + check=False + ) - # print("--- Create Lab Requests stdout ---") - # print(result.stdout) - # print("--- Create Lab Requests stderr ---") - # print(result.stderr) - # sys.stdout.flush() + print("--- Create Lab Requests stdout ---") + print(result.stdout) + print("--- Create Lab Requests stderr ---") + print(result.stderr) + sys.stdout.flush() - # if result.returncode != 0: - # print(f"Fallo al crear las solicitudes de laboratorio con código de salida {result.returncode}") - # sys.exit(result.returncode) + if result.returncode != 0: + print(f"Fallo al crear las solicitudes de laboratorio con código de salida {result.returncode}") + sys.exit(result.returncode) - # print("Solicitudes de laboratorio de demostración creadas exitosamente.") - # sys.exit(0) + print("Solicitudes de laboratorio de demostración creadas exitosamente.") + sys.exit(0) - # except Exception as e: - # print(f"Ocurrió un error inesperado al crear las solicitudes de laboratorio: {e}") - # sys.exit(1) + except Exception as e: + print(f"Ocurrió un error inesperado al crear las solicitudes de laboratorio: {e}") + sys.exit(1) except FileNotFoundError: print("Error: El comando 'odoo' no se encontró. Asegúrate de que la imagen del contenedor es correcta y odoo está en el PATH.") sys.exit(1) except Exception as e: print(f"Ocurrió un error inesperado al ejecutar Odoo: {e}") - sys.exit(1) + sys.exit(1) \ No newline at end of file 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 7/8] 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 @@ - + From 45af1771fa53621ece5a2e53099af3b81e9622c1 Mon Sep 17 00:00:00 2001 From: Luis Ernesto Portillo Zaldivar Date: Mon, 14 Jul 2025 09:39:58 -0600 Subject: [PATCH 8/8] feat(#7): Anadir campo de recolector a muestras - Anadido el campo 'collector_id' al modelo stock.lot. - Actualizadas las vistas de lista y formulario para incluir el nuevo campo. - Actualizados los datos de demostracion para asignar un recolector. - Actualizado el plan de desarrollo. --- documents/plans/ISSUE7_PLAN.md | 50 ++++++++---------- lims_management/demo/z_sample_demo.xml | 2 + .../__pycache__/stock_lot.cpython-312.pyc | Bin 1176 -> 1466 bytes lims_management/models/stock_lot.py | 6 +++ lims_management/views/stock_lot_views.xml | 2 + 5 files changed, 33 insertions(+), 27 deletions(-) diff --git a/documents/plans/ISSUE7_PLAN.md b/documents/plans/ISSUE7_PLAN.md index 815e0b7..f02cfa2 100644 --- a/documents/plans/ISSUE7_PLAN.md +++ b/documents/plans/ISSUE7_PLAN.md @@ -10,11 +10,13 @@ Extender el modelo de Lotes/Números de Serie de Odoo (`stock.lot`) para represe - [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`. + - [ ] **(Nuevo)** Añadir campo `collector_id` (Many2one a `res.users`) para registrar quién tomó la muestra. - [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. + - [ ] **(Nuevo)** Añadir el campo `collector_id` a las vistas de lista y formulario. - [x] **Crear el Menú "Gestión de Muestras":** - [x] Modificar `lims_management/views/menus.xml`. @@ -30,32 +32,26 @@ Extender el modelo de Lotes/Números de Serie de Odoo (`stock.lot`) para represe - [x] **Verificación Final:** - [x] Reiniciar y verificar la instancia de Odoo. +- [x] **Mejorar Modelo de Productos para Tipos de Muestra:** + - [x] Añadir un campo booleano `is_sample_type` al modelo `product.template`. + +- [x] **Crear Menú para "Tipos de Muestra":** + - [x] Añadir acción de ventana y `menuitem` para los tipos de muestra. + +- [x] **Actualizar Vista de Muestras (`stock.lot`):** + - [x] Hacer visible y aplicar dominio al campo `product_id` (Tipo de Muestra). + - [x] Eliminar el producto genérico y su referencia en el contexto. + +- [x] **Crear Datos de Demostración:** + - [x] Crear archivo `demo/z_sample_demo.xml` con tipos de muestra y muestras de ejemplo. + - [x] Añadir el archivo de demostración al manifiesto. + - [ ] **(Nuevo)** Actualizar los datos de demostración para incluir el `collector_id`. + +- [x] **Verificación Final (con Demo):** + - [x] Validar la funcionalidad completa con los datos de demostración. + --- +## Consideraciones Futuras (Siguientes Issues) -## **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. +- **Ciclo de Vida de la Muestra:** Implementar un campo de estado (`state`) con su lógica de transiciones (ej. 'Recolectada' -> 'Recibida' -> 'En Proceso' -> 'Completada' -> 'Almacenada'). +- **Informes de Muestras:** Crear informes en PDF o vistas dinámicas sobre el estado y trazabilidad de las muestras. \ No newline at end of file diff --git a/lims_management/demo/z_sample_demo.xml b/lims_management/demo/z_sample_demo.xml index 688d6bb..bb871b6 100644 --- a/lims_management/demo/z_sample_demo.xml +++ b/lims_management/demo/z_sample_demo.xml @@ -24,6 +24,7 @@ + serum_tube @@ -32,6 +33,7 @@ + edta_tube diff --git a/lims_management/models/__pycache__/stock_lot.cpython-312.pyc b/lims_management/models/__pycache__/stock_lot.cpython-312.pyc index 15aeeebe5040a2bbb1e116eaace75bf01ed9de25..3c5a0bbb56e07aa17b87a3a74e4f5aee9cd1c650 100644 GIT binary patch delta 406 zcmbQixr>|kG%qg~0}xzOF3p%Rk++M9gK^@_I}^`Kiu0xLrwFt#tPxzz3{t?r5XDz1 zq$#|)lF@;&zKXLbwOFsTIJKy_ipM!WCnq(zBsE1LsWO=nq8Lnq*dWcH^?<~5h8l(} zurMl-#e~WS@q!sN8T~YwZZW6kmEB?iS)<8#i={Xgio7Hi$&Nrw0&zbHO4WhFzAI8arQD2QN#5iCGP@wCZnnQP=5{5}XUh$v4m zn{GeR{sxEe4Sw010$N|#Swz?xeTu{<>#}G_se|;vjRCqiH$SB`C)KV(Z zkh;k!%;o|`Y(N&6U;#3Ut0!+^sbOjKE0Uk=&#ECM2a=Qr5eh)!7l%!5eoARhs$G%t YfK0GL0F*8wj{pDw diff --git a/lims_management/models/stock_lot.py b/lims_management/models/stock_lot.py index 8ca95bf..1c37cfc 100644 --- a/lims_management/models/stock_lot.py +++ b/lims_management/models/stock_lot.py @@ -27,3 +27,9 @@ class StockLot(models.Model): ('urine', 'Urine Container'), ('other', 'Other') ], string='Container Type') + + collector_id = fields.Many2one( + 'res.users', + string='Collected by', + default=lambda self: self.env.user + ) diff --git a/lims_management/views/stock_lot_views.xml b/lims_management/views/stock_lot_views.xml index ff3c077..9c5587a 100644 --- a/lims_management/views/stock_lot_views.xml +++ b/lims_management/views/stock_lot_views.xml @@ -12,6 +12,7 @@ + @@ -40,6 +41,7 @@ +