clinical_laboratory/lims_management/models/partner.py
Luis Ernesto Portillo Zaldivar 99990bdfcc feat(#51): Task 4 completada - Agregar método _compute_age() en res.partner
- Agregado campo computado 'age' que calcula edad en años desde birthdate_date
- Agregado campo 'is_pregnant' con validación de género femenino
- Implementado método _compute_age() usando relativedelta para precisión
- Agregado método helper get_age_at_date() para cálculos en fechas específicas
- Actualizada vista de pacientes para mostrar edad y estado de embarazo
- Validación que previene marcar embarazo en género masculino

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-07-15 11:56:50 -06:00

92 lines
3.4 KiB
Python

# -*- 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'
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")
# 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)
_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.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):
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)
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