diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..12829c0 Binary files /dev/null and b/.gitignore differ diff --git a/GEMINI.md b/GEMINI.md index ce926f7..1c15ed2 100644 --- a/GEMINI.md +++ b/GEMINI.md @@ -21,10 +21,13 @@ tea issue create --title "Título del Issue" --description "Descripción detalla Para agregar un comentario a un issue existente, se utiliza el comando `comment` seguido del número del issue y el texto del comentario entre comillas. **Formato correcto:** + ```bash tea comment "Tu comentario aquí" ``` + **Ejemplo:** + ```bash tea comment 3 "Comentario de prueba" ``` @@ -37,22 +40,45 @@ tea comment 3 "Comentario de prueba" Debido a problemas de interpretación de comillas en el shell de ejecución, el uso de `git commit -m "mensaje"` puede fallar. Para evitar estos problemas, se debe pasar el mensaje del commit a través de la entrada estándar (`stdin`). +### Política de Mensajes de Commit + +**Es mandatorio que el título de cada commit referencie el número del issue que resuelve.** Esto se hace para mantener una trazabilidad clara entre el código y las tareas. + +**Formato del Título:** +``` +(#): +``` +- **``:** `feat` (nueva funcionalidad), `fix` (corrección de bug), `docs` (cambios en documentación), `style` (formato), `refactor`, `test`, `chore` (otras tareas). +- **`()`:** El número del issue entre paréntesis y precedido de `#`. + +**Ejemplo:** +``` +feat(#4): Agregar campos de género y fecha de nacimiento al paciente +``` + ### Método Recomendado Utiliza el comando `echo` y una tubería (`|`) para enviar el mensaje a `git commit -F -`. **Commit de una sola línea:** + ```bash -echo "feat(scope): Tu mensaje de commit conciso" | git commit -F - +echo "feat(#4): Tu mensaje de commit conciso" | git commit -F - ``` **Commit multilínea:** -Para mensajes de commit multilínea, la forma más segura es usar `printf` que maneja mejor los saltos de línea (`\n`): +Para mensajes de commit multilínea, la forma más segura es usar `printf` que maneja mejor los saltos de línea (` +`): + ```bash -printf "feat(scope): Título del commit\n\nCuerpo del mensaje con una descripción más detallada.\n\n- Un punto importante.\n- Otro punto importante.\n\nResolves: #123" | git commit -F - +printf "feat(#4): Título del commit + +Cuerpo del mensaje con descripción detallada." | git commit -F - ``` + Esto asegura que el formato del mensaje del commit se preserve correctamente. + --- ## Crear un Pull Request @@ -60,11 +86,13 @@ Esto asegura que el formato del mensaje del commit se preserve correctamente. Para crear un pull request (PR), se utiliza el comando `tea pulls create`. Debes especificar la rama base (hacia donde van los cambios) y la rama `head` (tu rama actual), junto con un título que referencie el issue que resuelve. **Formato del comando:** + ```bash tea pulls create --base "" --head "" --title "(#issue): Título descriptivo" ``` **Ejemplo:** + ```bash tea pulls create --base "dev" --head "feature/3-core-setup" --title "feat(#3): Actualiza instrucciones en GEMINI.md" ``` @@ -86,14 +114,29 @@ Al iniciar cada sesión de trabajo, es **mandatorio** leer los siguientes docume Para levantar la instancia efímera de Odoo 18 junto con la base de datos de PostgreSQL, se utiliza Docker Compose. -**Comando:** +**Comando de inicio:** ```bash docker-compose up -d ``` +Este comando levantará los servicios definidos en el archivo `docker-compose.yml` en modo "detached" (`-d`). -Este comando levantará los servicios definidos en el archivo `docker-compose.yml` en modo "detached" (`-d`), lo que significa que se ejecutarán en segundo plano. - -Para detener los servicios, utiliza: +**Comando de detención y limpieza:** +Para detener los servicios y asegurar un estado limpio, **siempre se deben eliminar los volúmenes**, a menos que se indique lo contrario. ```bash -docker-compose down -``` \ No newline at end of file +docker-compose down -v +``` + +### Verificación de la Inicialización + +Después de levantar la instancia, es **mandatorio** verificar los registros del contenedor de inicialización para confirmar que los módulos se instalaron o actualizaron correctamente. + +**Comando para ver los logs:** +```bash +docker-compose logs odoo_init +``` + +Busca errores en la salida. Si encuentras alguno, debes presentar un resumen del problema y sus posibles causas, como: +- **Dependencias faltantes:** Un módulo no se puede instalar porque requiere otro que no está presente. +- **Errores de sintaxis:** Problemas en archivos Python (`.py`) o XML (`.views`, `.xml`). +- **Permisos incorrectos:** Problemas de acceso a archivos o directorios. +- **Datos incorrectos:** Errores en los archivos de datos de demostración o iniciales. diff --git a/lims_management/__manifest__.py b/lims_management/__manifest__.py index 3e68aef..a4a94ac 100644 --- a/lims_management/__manifest__.py +++ b/lims_management/__manifest__.py @@ -16,13 +16,19 @@ 'website': "https://gitea.grupoconsiti.com/luis_portillo/clinical_laboratory", 'category': 'Industries', 'version': '18.0.1.0.0', - 'depends': ['base', 'sale_management', 'stock', 'account'], + 'depends': ['base'], 'data': [ 'security/lims_security.xml', 'security/ir.model.access.csv', + 'data/ir_sequence.xml', + 'views/partner_views.xml', 'views/menus.xml', ], + 'demo': [ + 'data/lims_demo.xml', + ], 'installable': True, 'application': True, 'auto_install': False, + 'license': 'LGPL-3', } diff --git a/lims_management/data/ir_sequence.xml b/lims_management/data/ir_sequence.xml new file mode 100644 index 0000000..1bb0b3c --- /dev/null +++ b/lims_management/data/ir_sequence.xml @@ -0,0 +1,13 @@ + + + + + + Patient Identifier Sequence + res.partner.patient_identifier + P + 6 + + + + diff --git a/lims_management/data/lims_demo.xml b/lims_management/data/lims_demo.xml new file mode 100644 index 0000000..37a1576 --- /dev/null +++ b/lims_management/data/lims_demo.xml @@ -0,0 +1,63 @@ + + + + + + + Ana Torres + + P-A87B01 + Carga Inicial + 1985-05-15 + female + +1-202-555-0174 + ana.torres@example.com + + + + Carlos Ruiz + + P-C45D02 + Carga Inicial + 1992-11-20 + male + +1-202-555-0192 + carlos.ruiz@example.com + + + + + Dr. Luis Herrera + + L-98765 + +1-202-555-0145 + luis.herrera@hospital.com + + + + Dra. Sofia Vargas + + L-54321 + +1-202-555-0133 + sofia.vargas@clinic.com + + + + + Laura Mendoza + +1-202-555-0188 + laura.mendoza@example.com + + + + Pedro Infante Jr. + + P-M12E03 + Carga Inicial + + male + + + + + \ No newline at end of file diff --git a/lims_management/models/__init__.py b/lims_management/models/__init__.py index 40a96af..1d3c2e9 100644 --- a/lims_management/models/__init__.py +++ b/lims_management/models/__init__.py @@ -1 +1,2 @@ # -*- coding: utf-8 -*- +from . import partner \ No newline at end of file diff --git a/lims_management/models/__pycache__/__init__.cpython-312.pyc b/lims_management/models/__pycache__/__init__.cpython-312.pyc deleted file mode 100644 index 6650407..0000000 Binary files a/lims_management/models/__pycache__/__init__.cpython-312.pyc and /dev/null differ diff --git a/lims_management/models/partner.py b/lims_management/models/partner.py new file mode 100644 index 0000000..f90bc73 --- /dev/null +++ b/lims_management/models/partner.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +from odoo import models, fields, api + +class ResPartner(models.Model): + _inherit = 'res.partner' + + is_patient = fields.Boolean(string="Es Paciente") + patient_identifier = fields.Char(string="Identificador de Paciente", copy=False) + origin = fields.Char( + string="Origen", + default='Manual', + help="Este campo indica el origen del registro del paciente (ej. Manual, Carga Inicial)." + ) + birthdate_date = fields.Date(string="Fecha de Nacimiento") + gender = fields.Selection([ + ('male', 'Masculino'), + ('female', 'Femenino'), + ('other', 'Otro') + ], string="Género") + + is_doctor = fields.Boolean(string="Es Médico") + doctor_license = fields.Char(string="Licencia Médica", copy=False) + + _sql_constraints = [ + ('patient_identifier_unique', 'unique(patient_identifier)', 'El identificador del paciente debe ser único.'), + ('doctor_license_unique', 'unique(doctor_license)', 'La licencia médica debe ser única.') + ] + + @api.model_create_multi + def create(self, vals_list): + for vals in vals_list: + if vals.get('is_patient') and not vals.get('patient_identifier'): + vals['patient_identifier'] = self.env['ir.sequence'].next_by_code('res.partner.patient_identifier') + return super(ResPartner, self).create(vals_list) diff --git a/lims_management/views/menus.xml b/lims_management/views/menus.xml index 9b9876a..f6229ec 100644 --- a/lims_management/views/menus.xml +++ b/lims_management/views/menus.xml @@ -7,34 +7,50 @@ name="Laboratorio" sequence="10"/> - - + + + Pacientes + res.partner + list,form + + [('is_patient', '=', True)] + {'default_is_patient': True} + +

+ Crea un nuevo paciente +

+
+
- + + + Doctores + res.partner + list,form + + [('is_doctor', '=', True)] + {'default_is_doctor': True} + +

+ Crea un nuevo doctor +

+
+
+ + - - - - + action="action_lims_doctor" + sequence="30"/> diff --git a/lims_management/views/partner_views.xml b/lims_management/views/partner_views.xml new file mode 100644 index 0000000..62aa9c4 --- /dev/null +++ b/lims_management/views/partner_views.xml @@ -0,0 +1,62 @@ + + + + + + res.partner.tree.patient + res.partner + + + + + + + + + + + + + res.partner.tree.doctor + res.partner + + + + + + + + + + + + + res.partner.form.lims + res.partner + + + + + + + + + + + + + + + + + + + + + + + + + + +