
- 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>
92 lines
3.4 KiB
Python
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
|