Skip to content

Commit 5bf1280

Browse files
committed
feat(HUDS): implementa job para actualizar estados de dispensa
1 parent 9eb3302 commit 5bf1280

File tree

2 files changed

+115
-9
lines changed

2 files changed

+115
-9
lines changed

jobs/actualizarEstadosDispensa.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { actualizarEstadosDispensa } from '../modules/recetas/recetasController';
2+
3+
function run(done) {
4+
actualizarEstadosDispensa().finally(() => done());
5+
}
6+
7+
export = run;

modules/recetas/recetasController.ts

Lines changed: 108 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,44 @@
1+
import * as moment from 'moment';
12
import { Types } from 'mongoose';
23
import { Auth } from '../../auth/auth.class';
34
import { searchMatriculas } from '../../core/tm/controller/profesional';
45
import { MotivosReceta, Receta } from './receta-schema';
5-
import { ParamsIncorrect, RecetaNotFound, RecetaNotEdit } from './recetas.error';
6-
import * as moment from 'moment';
6+
import { createLog, informarLog, updateLog } from './recetaLogs';
7+
import { ParamsIncorrect, RecetaNotEdit, RecetaNotFound } from './recetas.error';
78
import { getReceta } from './services/receta';
8-
import { updateLog, informarLog, createLog } from './recetaLogs';
9+
10+
export async function consultarEstado(receta, sistema) {
11+
try {
12+
// Consultar estado en el sistema externo
13+
const recetaDisp = await getReceta(Types.ObjectId(receta.id), Types.ObjectId(receta.paciente.id), sistema);
14+
15+
if (!recetaDisp) {
16+
return {
17+
success: false,
18+
recetaDisp: null
19+
};
20+
}
21+
22+
const tipo = recetaDisp.tipoDispensaActual;
23+
const dispensada = ['dispensada', 'dispensa-parcial'].includes(tipo);
24+
25+
return {
26+
success: true,
27+
recetaDisp,
28+
tipo,
29+
dispensada
30+
};
31+
} catch (error) {
32+
await informarLog.error('consultarEstado', { recetaId: receta.id, sistema }, error);
33+
return {
34+
success: false,
35+
error
36+
};
37+
}
38+
}
939

1040

1141
async function registrarAppNotificadas(req, recetas, sistema) {
12-
const pacienteId = recetas[0].paciente.id;
1342
let recetasPaciente = [];
1443
recetasPaciente = recetas.map(async receta => {
1544
let incluirReceta = true;
@@ -24,11 +53,15 @@ async function registrarAppNotificadas(req, recetas, sistema) {
2453
} else {
2554
// otro sistema, se verifica dispensa
2655
indiceApp = arrayApps.findIndex(a => a.app !== sistema);
56+
2757
const sistema2 = arrayApps[indiceApp].app;
28-
const recetaDisp = await getReceta(Types.ObjectId(receta.id), pacienteId, sistema2);
29-
if (recetaDisp) {
30-
const tipo = recetaDisp.tipoDispensaActual;
31-
const dispensada = ['dispensada', 'dispensa-parcial'].includes(tipo);
58+
59+
// Consulta el estado de una receta en un sistema externo
60+
const resultado = await consultarEstado(receta, sistema2);
61+
62+
if (resultado.success) {
63+
const { recetaDisp, tipo, dispensada } = resultado;
64+
3265
if (dispensada) {
3366
recetaDisp.dispensas.forEach(async d => {
3467
receta = d.estado ? await dispensar(receta, d.estado, d.dispensa, sistema2) : receta;
@@ -49,6 +82,7 @@ async function registrarAppNotificadas(req, recetas, sistema) {
4982
incluirReceta = false;
5083
}
5184
}
85+
5286
} else {
5387
receta.appNotificada.push(appN);
5488
incluirReceta = true;
@@ -192,7 +226,7 @@ export async function setEstadoDispensa(req, operacion, app) {
192226
}
193227
}
194228

195-
async function dispensar(receta, operacion, dataDispensa, sistema) {
229+
export async function dispensar(receta, operacion, dataDispensa, sistema) {
196230
const operacionMap = {
197231
dispensar: 'dispensada',
198232
'dispensa-parcial': 'dispensa-parcial'
@@ -448,3 +482,68 @@ export async function crearReceta(req) {
448482
}
449483
}
450484

485+
export async function actualizarEstadosDispensa() {
486+
try {
487+
// Buscar recetas con appNotificada y sin dispensa
488+
const recetas: any = await Receta.find({
489+
appNotificada: { $exists: true },
490+
'estadoDispensaActual.tipo': 'sin-dispensa',
491+
'estadoActual.tipo': 'vigente'
492+
});
493+
494+
495+
if (!recetas || recetas.length === 0) {
496+
await informarLog.error('actualizarEstadosDispensa', {}, { message: 'No hay recetas para actualizar' });
497+
}
498+
499+
const resultados = {
500+
total: recetas.length,
501+
dispensadas: 0,
502+
sinDispensa: 0,
503+
errores: 0
504+
};
505+
506+
// Procesar cada receta
507+
for (const receta of recetas) {
508+
try {
509+
// Verificar cada app notificada
510+
for (const app of receta.appNotificada) {
511+
const sistema = app.app;
512+
513+
// Consulta el estado de una receta en un sistema externo
514+
const resultado = await consultarEstado(receta, sistema);
515+
516+
if (resultado.success) {
517+
const { recetaDisp, tipo, dispensada } = resultado;
518+
519+
// Si la receta fue dispensada, actualizar estado
520+
if (dispensada) {
521+
recetaDisp.dispensas.forEach(async d => {
522+
if (d.estado) {
523+
// Actualizar estado de dispensa
524+
await dispensar(receta, d.estado, d.dispensa, sistema);
525+
await receta.save();
526+
527+
resultados.dispensadas++;
528+
}
529+
});
530+
} else if (tipo === 'sin-dispensa') {
531+
// Si no fue dispensada, eliminar del array appNotificada
532+
const req = { user: { usuario: { nombre: 'JOB_ACTUALIZACION' } } };
533+
await actualizarAppNotificada(receta.id, sistema, req);
534+
535+
resultados.sinDispensa++;
536+
}
537+
}
538+
}
539+
} catch (error) {
540+
resultados.errores++;
541+
await informarLog.error('actualizarEstadosDispensa', { recetaId: receta.id }, error);
542+
}
543+
}
544+
545+
await updateLog.info('actualizarEstadosDispensa', { resultados });
546+
} catch (error) {
547+
await informarLog.error('actualizarEstadosDispensa', {}, error);
548+
}
549+
}

0 commit comments

Comments
 (0)