1+ import * as moment from 'moment' ;
12import { Types } from 'mongoose' ;
23import { Auth } from '../../auth/auth.class' ;
34import { searchMatriculas } from '../../core/tm/controller/profesional' ;
45import { 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 ' ;
78import { 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
1141async 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