Citas: solapamiento permitido entre medicos distintos (chequeo por doctor_id)

This commit is contained in:
2026-08-28 07:42:14 +00:00
parent 29225e848a
commit d47c054ffc

View File

@@ -218,22 +218,25 @@ class SkeenCita(models.Model):
def action_send_reminder(self): def action_send_reminder(self):
self.write({'reminder_sent': True, 'reminder_date': fields.Datetime.now()}) self.write({'reminder_sent': True, 'reminder_date': fields.Datetime.now()})
@api.constrains('date', 'time', 'servicio_id') @api.constrains('date', 'time', 'doctor_id', 'servicio_id')
def _check_availability(self): def _check_availability(self):
for cita in self: for cita in self:
if cita.state in ('cancelled', 'no_show'): if cita.state in ('cancelled', 'no_show'):
continue continue
# Verificar solapamiento # Verificar solapamiento SOLO dentro del mismo médico:
# la clínica permite citas simultáneas con doctores distintos.
# Criterio para citas sin médico: solo traslapan con otras sin médico.
domain = [ domain = [
('id', '!=', cita.id), ('id', '!=', cita.id),
('date', '=', cita.date), ('date', '=', cita.date),
('state', 'not in', ('cancelled', 'no_show')), ('state', 'not in', ('cancelled', 'no_show')),
('doctor_id', '=', cita.doctor_id.id if cita.doctor_id else False),
('datetime_start', '<', cita.datetime_end), ('datetime_start', '<', cita.datetime_end),
('datetime_end', '>', cita.datetime_start), ('datetime_end', '>', cita.datetime_start),
] ]
overlapping = self.search(domain) overlapping = self.search(domain)
if overlapping: if overlapping:
raise ValidationError(_('Ya existe una cita en ese horario!')) raise ValidationError(_('Ya existe una cita en ese horario para ese médico!'))
@api.constrains('date', 'time', 'doctor_id', 'servicio_id') @api.constrains('date', 'time', 'doctor_id', 'servicio_id')
def _check_bloqueos(self): def _check_bloqueos(self):