feat: version 4.7.0 -- Agenda medica

Modulo clinic (habilitado por usuario): citas de pacientes para medicos con choques
bloqueantes (medico, paciente con cualquier medico, quirofano/bloqueos recurrentes y
horario de atencion), validados en transaccion con bloqueo de filas para que dos
recepcionistas no tomen el mismo hueco. Recepcion (alcance todos) y medico (alcance
propio). Vista Dia por columnas de medico, Semana y Lista; pacientes con historial;
bloqueos; configuracion de personal, horarios y tipos solo admin/superadmin. Capa de
citas en el calendario personal del medico. Migracion 036.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Milton Gonzalez
2026-10-28 12:57:43 -05:00
parent bdc62403f4
commit 1e25022630
29 changed files with 1649 additions and 34 deletions
+31
View File
@@ -33,6 +33,37 @@ campo en multipart. La API responde `428` si falta o es inválido y `409` si otr
el registro. En empresa y SMTP la respuesta `GET` incluye `edit_version`.
Las reuniones siguen el mismo contrato (`PUT /api/meetings/:id`).
## Agenda médica (v4.7.0)
Todas las rutas bajo `/api/clinic` exigen JWT, módulo `clinic` y fila activa en `clinic_staff`.
Sin la fila se responde 403. `scope=own` solo accede a su médico; `scope=all` gestiona todos.
Configuración exige además rol admin/superadmin. Fechas `YYYY-MM-DD HH:mm:ss` en hora civil
`America/Guayaquil`; rangos de listado de máximo 93 días.
| Método y ruta | Uso |
|---|---|
| `GET /staff/me` | alcance y condición de médico |
| `GET /doctors` | médicos visibles con horario y tipos activos |
| `GET /availability?doctorId=&date=&typeId=` | huecos de 15 minutos con duración del tipo |
| `GET /appointments?from=&to=[&doctorId=][&patientId=]` | citas no canceladas del rango; `patientId` solo recepción |
| `POST /appointments`, `PUT /appointments/:id` | crear o reprogramar/editar; `PUT` exige `editVersion` |
| `POST /appointments/:id/status` | `{status,editVersion}`; médico propio solo `attended`/`no_show` |
| `POST /appointments/:id/cancel` | `{reason,editVersion}`, solo recepción |
| `GET /blocks?from=&to=[&doctorId=]` | ocurrencias expandidas del rango |
| `POST /blocks`, `PUT /blocks/:id` | bloqueo; `{confirmAffected:true}` para guardar si afecta citas |
| `DELETE /blocks/:id?editVersion=` | eliminar bloqueo con versión |
| `GET /patients?search=&page=&pageSize=` | búsqueda paginada, solo recepción |
| `GET /patients/:id/appointments` | últimas 100 citas, solo recepción |
| `POST /patients`, `PUT /patients/:id` | alta y edición, solo recepción; `PUT` exige `editVersion` |
| `GET /config/staff`, `PUT /config/staff/:id` | personal y permiso interno |
| `GET/PUT /config/schedules/:id` | tramos; `PUT` recibe `{segments:[{weekday,startsTime,endsTime}]}` |
| `GET/POST /config/types`, `PUT /config/types/:id` | tipos de cita |
Una cita fuera del horario o en choque devuelve 409 con motivo concreto. Un bloqueo afectado
responde `{requiresConfirmation:true,affected:[...]}` y no se guarda sin confirmación. Las
ediciones con versión obsoleta devuelven 409. Las altas, ediciones, cambios de estado y
cancelaciones se auditan sin copiar datos de pacientes al detalle de auditoría.
## Calendario de reuniones (v4.4.0)
Todas las rutas requieren JWT y módulo `calendar`. Las fechas son `YYYY-MM-DD HH:mm:ss` en hora