From 752d2c32dce7990056c79b2f008bd089b77f099c Mon Sep 17 00:00:00 2001 From: silviroa Date: Tue, 19 May 2026 08:26:33 -0300 Subject: [PATCH 1/2] fix(EP): cambia el evento al guardar una ficha para interoperar con sisa. --- .../forms-epidemiologia.events.ts | 148 ++++++++++-------- 1 file changed, 82 insertions(+), 66 deletions(-) diff --git a/modules/forms/forms-epidemiologia/forms-epidemiologia.events.ts b/modules/forms/forms-epidemiologia/forms-epidemiologia.events.ts index 9ed8cf114a..5fc178ff25 100644 --- a/modules/forms/forms-epidemiologia/forms-epidemiologia.events.ts +++ b/modules/forms/forms-epidemiologia/forms-epidemiologia.events.ts @@ -3,10 +3,10 @@ import { userScheduler } from '../../../config.private'; import { SECCION_CLASIFICACION } from './constantes'; import { FormEpidemiologiaCtr } from './forms-epidemiologia.routes'; import { Organizacion } from '../../../core/tm/schemas/organizacion'; -import { sisa } from '../../../config.private'; -import { handleHttpRequest } from '../../../utils/requestHandler'; -import { InformacionExportada } from '../../../core/log/schemas/logExportaInformacion'; -import * as moment from 'moment'; +import { sisaLog } from '../../sisa/logger/sisaLog'; +import { altaEventoV2 } from '../../sisa/controller/sisa.controller'; +import { FormsEpidemiologia } from '../../forms/forms-epidemiologia/forms-epidemiologia-schema'; + const dataLog: any = new Object(userScheduler); @@ -47,81 +47,98 @@ EventCore.on('notification:fichaEpidemiologica:laboratory', async (info) => { EventCore.on('alta:fichaEpidemiologica:snvs', async (info) => { const organizacion = await Organizacion.findById(info.createdBy.organizacion.id); + const idEstablecimientoCarga = organizacion?.codigo?.sisa; const clasificacionCaso = getClasificacionManual(info); - const eventoNominal = { - ciudadano: { - apellido: info.paciente.apellido, - nombre: info.paciente.nombre, - tipoDocumento: '1', - numeroDocumento: info.paciente.documento, - sexo: info.paciente.sexo === 'femenino' ? 'F' : (info.paciente.sexo === 'masculino') ? 'M' : '', - fechaNacimiento: moment(info.paciente.fechaNacimiento).format('DD-MM-YYYY') - }, - eventoCasoNominal: { - idGrupoEvento: info.config.idGrupoEvento, - idEvento: info.config.idEvento, - idEstablecimientoCarga: organizacion.codigo.sisa, - fechaPapel: moment(info.createdAt).format('DD-MM-YYYY'), - idClasificacionManualCaso: clasificacionCaso ? clasificacionCaso : '', + if (!idEstablecimientoCarga || !clasificacionCaso) { + const eventoNominal = { + ciudadano: { + apellido: info.paciente.apellido, + nombre: info.paciente.nombre, + tipoDocumento: '1', + numeroDocumento: info.paciente.documento, + sexo: info.paciente.sexo === 'femenino' ? 'F' : (info.paciente.sexo === 'masculino') ? 'M' : 'X', + fechaNacimiento: info.paciente.fechaNacimiento, + seDeclaraPuebloIndigena: 'No', + paisEmisionTipoDocumento: null, + telefono: info.paciente.telefono !== '' ? info.paciente.telefono : null, + mail: null, + personaACargo: { + tipoDocumento: null, + numeroDocumento: null, + vinculo: null + } + }, + eventoCasoNominal: { + idGrupoEvento: parseInt(clasificacionCaso.idGrupoEvento, 10), + idEvento: parseInt(clasificacionCaso.idEvento, 10), + idEstablecimientoCarga, + fechaPapel: clasificacionCaso.Fecha_Ficha, + idClasificacionManualCaso: parseInt(clasificacionCaso.event, 10), + } + }; + + if (eventoNominal.eventoCasoNominal.idClasificacionManualCaso) { + postSisa(eventoNominal, info); } - }; - if (eventoNominal.eventoCasoNominal.idClasificacionManualCaso) { - postSisa(eventoNominal, info); + } else { + const log = { + fecha: new Date(), + sistema: 'Sisa', + key: info.Tipo, + idPaciente: info.paciente.id, + info_enviada: {}, + resultado: { + resultado: 'ERROR_DE_ENVIO', + id_caso: '', + description: !idEstablecimientoCarga ? 'No se encontró el código SISA del establecimiento' : 'No se encontró una clasificación manual en la ficha' + } + }; + await sisaLog.error('sisa:export:SNVS:evento', { error: log }, 'error al dar de alta evento', userScheduler); } }); const getClasificacionManual = (ficha) => { - let clasificacion = null; - const configFields = ficha.config.configField; - configFields.forEach(field => { - ficha.secciones.forEach((seccion) => { - const found = seccion.fields.find(elem => (Object.keys(elem))[0] === field.key.id); - if (found) { - if (field.value) { - const val: any = Object.values(found)[0]; - if (val.id === field.value.id) { - clasificacion = field.event; - } - } else { - clasificacion = field.event; - } - } - }); - }); - return clasificacion; + const configFields = ficha?.config?.configField ?? []; + // Buscar el primer GC cuya key/value exista en alguna sección/campo + const gcEncontrado = configFields.find((GC) => + (ficha.secciones ?? []).some((unaSeccion) => + (unaSeccion.fields ?? []).some((f) => + f[GC.key] === GC.value || f[GC.key]?.id === GC.value + ) + ) + ); + return gcEncontrado ?? null; }; -const postSisa = async (dto, ficha) => { +const postSisa = async (eventoNominal, unaFicha) => { const log = { fecha: new Date(), sistema: 'Sisa', - key: dto.eventoCasoNominal.idClasificacionManualCaso, - idPaciente: ficha.paciente.id, - info_enviada: dto.eventoCasoNominal, + key: unaFicha.Tipo, + idPaciente: unaFicha.paciente.id, + info_enviada: {}, resultado: {} }; try { - const options = { - uri: sisa.url, - method: 'POST', - body: dto, - headers: { - APP_ID: sisa.APP_ID_ALTA, - APP_KEY: sisa.APP_KEY_ALTA, - 'Content-Type': 'application/json' - }, - json: true, - }; - const [status, resJson] = await handleHttpRequest(options); - if (status >= 200 && status <= 299) { - const id_caso = resJson.id_caso ? resJson.id_caso : ''; + + const response = await altaEventoV2(eventoNominal); + if (response) { + const id_caso = response.id_caso ? response.id_caso : ''; log.resultado = { - resultado: resJson.resultado ? resJson.resultado : '', + resultado: response.resultado ? response.resultado : '', id_caso, - description: resJson.description ? resJson.description : '' + description: response.description ? response.description : '' }; - ficha.snvs = true; // marca la ficha como que ya se envio sisa - FormEpidemiologiaCtr.update(ficha.id, ficha, dataLog); + try { + await FormsEpidemiologia.updateOne({ _id: unaFicha._id }, { $set: { idCasoSnvs: id_caso } }); + } catch (error) { + log.resultado = { + resultado: 'ERROR_DE_GUARDADO_ID_CASO', + id_caso, + description: error.toString() + }; + await sisaLog.error('sisa:export:SNVS:evento', { error: log }, 'error al guardar el idCasoSisa', userScheduler); + } } else { log.resultado = { resultado: 'ERROR_DE_ENVIO', @@ -129,8 +146,7 @@ const postSisa = async (dto, ficha) => { description: 'No se recibió ningún resultado' }; } - const info = new InformacionExportada(log); - await info.save(); + await sisaLog.info('sisa:export:SNVS:evento', { params: log }, userScheduler); } catch (error) { log.resultado = { @@ -138,7 +154,7 @@ const postSisa = async (dto, ficha) => { id_caso: '', description: error.toString() }; - const info = new InformacionExportada(log); - await info.save(); + await sisaLog.error('sisa:export:SNVS:evento', { error: log }, 'error al dar de alta evento', userScheduler); + } }; From 46315f2fde9cd98345b8daf7e48976d9b31604e3 Mon Sep 17 00:00:00 2001 From: silviroa Date: Wed, 20 May 2026 11:12:09 -0300 Subject: [PATCH 2/2] fix(EP): Cambia formato de fecha y controles de clasificacion --- .../forms/forms-epidemiologia/forms-epidemiologia-schema.ts | 4 ++-- .../forms/forms-epidemiologia/forms-epidemiologia.events.ts | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/modules/forms/forms-epidemiologia/forms-epidemiologia-schema.ts b/modules/forms/forms-epidemiologia/forms-epidemiologia-schema.ts index e80535cfa5..7b522fe1f2 100644 --- a/modules/forms/forms-epidemiologia/forms-epidemiologia-schema.ts +++ b/modules/forms/forms-epidemiologia/forms-epidemiologia-schema.ts @@ -63,7 +63,7 @@ const generarIdUnico = function (): string { const chars = 'abcdefghijklmnopqrstuvwxyz'; const charsLength = chars.length; let characters = ''; - for ( let i = 0 ; i < 4 ; i++ ) { + for (let i = 0; i < 4; i++) { characters += chars.charAt(Math.floor(Math.random() * charsLength)); } return `${characters}-${numero}`; @@ -117,7 +117,7 @@ FormsEpidemiologiaSchema.post('save', (ficha: any) => { const { FormsHistory } = require('./forms-history.schema'); const history = new FormsHistory(ficha.toJSON()); history._id = new mongoose.Types.ObjectId(); - if (ficha.config?.idEvento && !ficha.snvs) { + if (ficha.config.configField?.length && !ficha.snvs) { EventCore.emitAsync('alta:fichaEpidemiologica:snvs', ficha); } history.save(); diff --git a/modules/forms/forms-epidemiologia/forms-epidemiologia.events.ts b/modules/forms/forms-epidemiologia/forms-epidemiologia.events.ts index 5fc178ff25..15901970df 100644 --- a/modules/forms/forms-epidemiologia/forms-epidemiologia.events.ts +++ b/modules/forms/forms-epidemiologia/forms-epidemiologia.events.ts @@ -6,6 +6,7 @@ import { Organizacion } from '../../../core/tm/schemas/organizacion'; import { sisaLog } from '../../sisa/logger/sisaLog'; import { altaEventoV2 } from '../../sisa/controller/sisa.controller'; import { FormsEpidemiologia } from '../../forms/forms-epidemiologia/forms-epidemiologia-schema'; +import moment = require('moment'); const dataLog: any = new Object(userScheduler); @@ -49,7 +50,7 @@ EventCore.on('alta:fichaEpidemiologica:snvs', async (info) => { const organizacion = await Organizacion.findById(info.createdBy.organizacion.id); const idEstablecimientoCarga = organizacion?.codigo?.sisa; const clasificacionCaso = getClasificacionManual(info); - if (!idEstablecimientoCarga || !clasificacionCaso) { + if (idEstablecimientoCarga && clasificacionCaso) { const eventoNominal = { ciudadano: { apellido: info.paciente.apellido, @@ -57,7 +58,7 @@ EventCore.on('alta:fichaEpidemiologica:snvs', async (info) => { tipoDocumento: '1', numeroDocumento: info.paciente.documento, sexo: info.paciente.sexo === 'femenino' ? 'F' : (info.paciente.sexo === 'masculino') ? 'M' : 'X', - fechaNacimiento: info.paciente.fechaNacimiento, + fechaNacimiento: moment(info.paciente.fechaNacimiento).format('DD-MM-YYYY'), seDeclaraPuebloIndigena: 'No', paisEmisionTipoDocumento: null, telefono: info.paciente.telefono !== '' ? info.paciente.telefono : null, @@ -99,7 +100,6 @@ EventCore.on('alta:fichaEpidemiologica:snvs', async (info) => { const getClasificacionManual = (ficha) => { const configFields = ficha?.config?.configField ?? []; - // Buscar el primer GC cuya key/value exista en alguna sección/campo const gcEncontrado = configFields.find((GC) => (ficha.secciones ?? []).some((unaSeccion) => (unaSeccion.fields ?? []).some((f) =>