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 @@
+
+