diff --git a/lims_management/models/__pycache__/partner.cpython-312.pyc b/lims_management/models/__pycache__/partner.cpython-312.pyc index cb379f7..0ba6f10 100644 Binary files a/lims_management/models/__pycache__/partner.cpython-312.pyc and b/lims_management/models/__pycache__/partner.cpython-312.pyc differ diff --git a/lims_management/models/partner.py b/lims_management/models/partner.py index f90bc73..b2f567d 100644 --- a/lims_management/models/partner.py +++ b/lims_management/models/partner.py @@ -1,5 +1,8 @@ # -*- coding: utf-8 -*- from odoo import models, fields, api +from odoo.exceptions import ValidationError +from datetime import date +from dateutil.relativedelta import relativedelta class ResPartner(models.Model): _inherit = 'res.partner' @@ -17,6 +20,19 @@ class ResPartner(models.Model): ('female', 'Femenino'), ('other', 'Otro') ], string="Género") + + # Nuevos campos para el cálculo de rangos + age = fields.Integer( + string="Edad", + compute='_compute_age', + store=False, + help="Edad calculada en años basada en la fecha de nacimiento" + ) + + is_pregnant = fields.Boolean( + string="Embarazada", + help="Marcar si la paciente está embarazada (solo aplica para género femenino)" + ) is_doctor = fields.Boolean(string="Es Médico") doctor_license = fields.Char(string="Licencia Médica", copy=False) @@ -25,6 +41,25 @@ class ResPartner(models.Model): ('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.depends('birthdate_date') + def _compute_age(self): + """Calcula la edad en años basada en la fecha de nacimiento""" + today = date.today() + for partner in self: + if partner.birthdate_date: + # Calcular diferencia usando relativedelta para precisión + delta = relativedelta(today, partner.birthdate_date) + partner.age = delta.years + else: + partner.age = 0 + + @api.constrains('is_pregnant', 'gender') + def _check_pregnant_gender(self): + """Valida que solo pacientes de género femenino puedan estar embarazadas""" + for partner in self: + if partner.is_pregnant and partner.gender != 'female': + raise ValidationError('Solo las pacientes de género femenino pueden estar marcadas como embarazadas.') @api.model_create_multi def create(self, vals_list): @@ -32,3 +67,25 @@ class ResPartner(models.Model): 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) + + def get_age_at_date(self, target_date=None): + """ + Calcula la edad del paciente en una fecha específica. + + :param target_date: Fecha en la que calcular la edad. Si es None, usa la fecha actual. + :return: Edad en años + """ + self.ensure_one() + if not self.birthdate_date: + return 0 + + if not target_date: + target_date = date.today() + elif isinstance(target_date, str): + target_date = fields.Date.from_string(target_date) + + if target_date < self.birthdate_date: + return 0 + + delta = relativedelta(target_date, self.birthdate_date) + return delta.years diff --git a/lims_management/views/partner_views.xml b/lims_management/views/partner_views.xml index 62aa9c4..dc2be18 100644 --- a/lims_management/views/partner_views.xml +++ b/lims_management/views/partner_views.xml @@ -11,6 +11,8 @@ + + @@ -43,7 +45,9 @@ + +