diff --git a/modules/recetas/recetas.routes.ts b/modules/recetas/recetas.routes.ts index b58128df87..1819560713 100644 --- a/modules/recetas/recetas.routes.ts +++ b/modules/recetas/recetas.routes.ts @@ -2,7 +2,7 @@ import { asyncHandler, Request, Response } from '@andes/api-tool'; import { MongoQuery, ResourceBase } from '@andes/core'; import { Auth } from '../../auth/auth.class'; import { Receta } from './receta-schema'; -import { buscarRecetas, getMotivosReceta, setEstadoDispensa, suspender, actualizarAppNotificada, cancelarDispensa, create, buscarRecetasPorProfesional, buscarRecetasConFiltros } from './recetasController'; +import { buscarRecetas, getMotivosReceta, setEstadoDispensa, suspender, actualizarAppNotificada, cancelarDispensa, create, buscarRecetasPorProfesional, buscarRecetasConFiltros, verificarRecetaExistente } from './recetasController'; import { ParamsIncorrect } from './recetas.error'; class RecetasResource extends ResourceBase { @@ -46,6 +46,21 @@ export const getConFiltros = async (req, res) => { res.json(result); }; +export const getVerificarReceta = async (req, res) => { + try { + const { documento, sexo, conceptId } = req.query; + if (!documento || !sexo) { + const error = new ParamsIncorrect('Se requieren los parámetros documento y sexo'); + return res.status(error.status).json(error); + } + const result = await verificarRecetaExistente(documento as string, sexo as string, conceptId as string); + res.json(result); + } catch (err) { + const status = (err as any).status || 400; + res.status(status).json(err); + } +}; + export const patch = async (req, res) => { const operacion = req.body.op ? req.body.op.toLowerCase() : ''; let result, status; @@ -100,7 +115,8 @@ const authorizeByToken = async (req: Request, res: Response, next) => RecetasRouter.use(Auth.authenticate()); RecetasRouter.get('/recetas', authorizeByToken, asyncHandler(get)); RecetasRouter.get('/recetas/motivos', asyncHandler(getMotivos)); -RecetasRouter.get('/recetas/profesional/:id', authorizeByToken,asyncHandler(getByProfesional)); RecetasRouter.get('/recetas/filtros', authorizeByToken, asyncHandler(getConFiltros)); +RecetasRouter.get('/recetas/profesional/:id', authorizeByToken, asyncHandler(getByProfesional)); +RecetasRouter.get('/recetas/verificar', authorizeByToken, asyncHandler(getVerificarReceta)); RecetasRouter.patch('/recetas', authorizeByToken, asyncHandler(patch)); RecetasRouter.post('/recetas', authorizeByToken, asyncHandler(post)); diff --git a/modules/recetas/recetasController.ts b/modules/recetas/recetasController.ts index d21576ed04..3351af3738 100644 --- a/modules/recetas/recetasController.ts +++ b/modules/recetas/recetasController.ts @@ -928,3 +928,48 @@ export async function actualizarEstadosDispensa() { await informarLog.error('actualizarEstadosDispensa', {}, error); } } + +/** + * Verifica si existe una receta vigente o pendiente para un paciente y un medicamento (por conceptId SNOMED) + * al momento en que se realiza la consulta. + * + * @param documento - DNI del paciente (identificador común entre sistemas) + * @param sexo - Sexo del paciente ('masculino' | 'femenino' | 'otro') + * @param conceptId - conceptId SNOMED del medicamento + * @returns { existe: boolean, receta?: any } + */ +export async function verificarRecetaExistente(documento: string, sexo: string, conceptId: string) { + if (!documento) { + throw new ParamsIncorrect('Se requiere el documento (DNI) del paciente'); + } + if (!sexo) { + throw new ParamsIncorrect('Se requiere el sexo del paciente'); + } + if (!conceptId) { + throw new ParamsIncorrect('Se requiere el conceptId del medicamento'); + } + + const ahora = moment().toDate(); + const parametro: any = await RecetasParametros.findOne({ key: 'fechaLimite' }); + const days = (parametro && parametro.value) ? Number(parametro.value) : 30; + const fechaLimiteVigentes = moment().subtract(days, 'days').startOf('day').toDate(); + + const receta = await Receta.findOne({ + 'paciente.documento': documento, + 'paciente.sexo': sexo, + 'medicamento.concepto.conceptId': conceptId, + 'estadoActual.tipo': { $in: ['vigente', 'pendiente'] }, + 'estadoDispensaActual.tipo': { $nin: ['dispensada'] }, + $or: [ + // Vigentes: que no hayan superado el límite de días desde su registro + { 'estadoActual.tipo': 'vigente', fechaRegistro: { $gte: fechaLimiteVigentes, $lte: ahora } }, + // Pendientes: fechaRegistro futura (aún no activa pero pertenece al tratamiento) + { 'estadoActual.tipo': 'pendiente', fechaRegistro: { $lte: moment().add(10, 'days').endOf('day').toDate() } } + ] + }).sort({ fechaRegistro: -1 }); + + return { + existe: !!receta, + receta: receta || null + }; +}