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:
@@ -0,0 +1,51 @@
|
||||
import { Router } from 'express';
|
||||
import { requireAuth } from '../../middleware/auth.js';
|
||||
import { requireModule } from '../../middleware/modules.js';
|
||||
import { asyncHandler, ok } from '../../utils/http.js';
|
||||
import * as clinic from './service.js';
|
||||
const router = Router();
|
||||
router.use(requireAuth, requireModule('clinic'));
|
||||
// Configuracion (solo admin/superadmin): no exige ser personal de la agenda, por eso va antes
|
||||
// del middleware que resuelve clinicStaff.
|
||||
router.get('/config/staff', asyncHandler(async (req, res) => ok(res, await clinic.configStaff(req.currentUser))));
|
||||
router.put('/config/staff/:id', asyncHandler(async (req, res) => ok(res, await clinic.saveStaff(req.body, req.currentUser, req.params.id))));
|
||||
router.get('/config/schedules/:id', asyncHandler(async (req, res) => {
|
||||
clinic.requireConfig(req.currentUser);
|
||||
ok(res, await clinic.schedules(req.params.id));
|
||||
}));
|
||||
router.put('/config/schedules/:id', asyncHandler(async (req, res) => ok(res, await clinic.saveSchedules(req.params.id, req.body, req.currentUser))));
|
||||
router.get('/config/types', asyncHandler(async (req, res) => {
|
||||
clinic.requireConfig(req.currentUser);
|
||||
ok(res, await clinic.types());
|
||||
}));
|
||||
router.post('/config/types', asyncHandler(async (req, res) => ok(res, await clinic.saveType(req.body, req.currentUser), 201)));
|
||||
router.put('/config/types/:id', asyncHandler(async (req, res) => ok(res, await clinic.saveType(req.body, req.currentUser, req.params.id))));
|
||||
router.use(asyncHandler(async (req, res, next) => {
|
||||
req.clinicStaff = await clinic.staffFor(req.currentUser);
|
||||
next();
|
||||
}));
|
||||
const get = (path, fn) => router.get(path, asyncHandler(async (req, res) => ok(res, await fn(req.query, req.clinicStaff, req.currentUser))));
|
||||
const write = (method, path, fn) => router[method](path, asyncHandler(async (req, res) => ok(res, await fn(req.body, req.currentUser, req.clinicStaff, req.params.id), method === 'post' && !req.params.id ? 201 : 200)));
|
||||
get('/staff/me', async (q, s) => s);
|
||||
get('/doctors', async (q, s) => Promise.all([clinic.doctors(s), clinic.types()]).then(async ([doctors, types]) => ({
|
||||
doctors: await Promise.all(doctors.map(async d => ({
|
||||
...d,
|
||||
schedules: await clinic.schedules(d.id)
|
||||
}))),
|
||||
types: types.filter(t => t.is_active)
|
||||
})));
|
||||
get('/availability', (q, s) => clinic.availability(q, s));
|
||||
get('/appointments', (q, s) => clinic.appointments(q, s));
|
||||
write('post', '/appointments', (body, user, staff) => clinic.saveAppointment(body, user, staff));
|
||||
write('put', '/appointments/:id', (body, user, staff, n) => clinic.saveAppointment(body, user, staff, n));
|
||||
write('post', '/appointments/:id/cancel', (body, user, staff, n) => clinic.changeStatus(n, body, user, staff, true));
|
||||
write('post', '/appointments/:id/status', (body, user, staff, n) => clinic.changeStatus(n, body, user, staff));
|
||||
get('/blocks', (q, s) => clinic.blocks(q, s));
|
||||
write('post', '/blocks', (body, user, staff) => clinic.saveBlock(body, user, staff));
|
||||
write('put', '/blocks/:id', (body, user, staff, n) => clinic.saveBlock(body, user, staff, n));
|
||||
router.delete('/blocks/:id', asyncHandler(async (req, res) => ok(res, await clinic.deleteBlock(req.params.id, req.query, req.currentUser, req.clinicStaff))));
|
||||
get('/patients', (q, s) => clinic.patients(q, s));
|
||||
router.get('/patients/:id/appointments', asyncHandler(async (req, res) => ok(res, await clinic.patientHistory(req.params.id, req.clinicStaff))));
|
||||
write('post', '/patients', (body, user, staff) => clinic.savePatient(body, user, staff));
|
||||
write('put', '/patients/:id', (body, user, staff, n) => clinic.savePatient(body, user, staff, n));
|
||||
export default router;
|
||||
Reference in New Issue
Block a user