Skip to content

Commit

Permalink
(FEAT) PACS - Cancelar orden de trabajo (#1825)
Browse files Browse the repository at this point in the history
  • Loading branch information
Fabio-Ramirez authored Aug 29, 2023
1 parent 116f2c1 commit 401acfb
Show file tree
Hide file tree
Showing 3 changed files with 71 additions and 18 deletions.
21 changes: 21 additions & 0 deletions modules/pacs/pacs-network.ts
Original file line number Diff line number Diff line change
Expand Up @@ -70,3 +70,24 @@ export async function enviarInforme(pacsConfig: IPacsConfig, uid: string, data:

throw new Error(body);
}

export async function anularPacs(pacsConfig: IPacsConfig, uid: string, spsId: string, token: string) {
const fs = require('fs');
const url = `${pacsConfig.host}/dcm4chee-arc/aets/DCM4CHEE/rs/mwlitems/${uid}/${spsId}/status/CANCELED`;
const [status, body] = await handleHttpRequest({
method: 'POST',
url,
headers: {
Authorization: 'Bearer ' + token,
'content-type': 'multipart/related; type=\"application/dicom+json\"'
},
preambleCRLF: true,
postambleCRLF: true
});
if (status >= 200 && status < 300) {
return status;
}

throw new Error(body);
}

32 changes: 30 additions & 2 deletions modules/pacs/pacs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { DICOMInformePDF } from './dicom/informe-encode';
import { DICOMPaciente } from './dicom/paciente-encode';
import { DICOMPrestacion } from './dicom/prestacion-encode';
import { PacsConfigController } from './pacs-config.controller';
import { createPaciente, createWorkList, enviarInforme, loginPacs } from './pacs-network';
import { createPaciente, createWorkList, enviarInforme, loginPacs, anularPacs } from './pacs-network';

export async function syncWorkList(prestacion: IPrestacion) {
try {
Expand Down Expand Up @@ -55,7 +55,7 @@ export async function syncWorkList(prestacion: IPrestacion) {
{ key: 'pacs-config', valor: config.id }
];
if (dataResponse) {
arrayMetadata.push({ key: 'pacs-spsID', valor: spsID });
arrayMetadata.push({ key: 'pacs-spsID', valor: spsID }); // id de la orden
}
await Prestacion.update(
query,
Expand Down Expand Up @@ -91,6 +91,25 @@ export async function getVisualizadorURL(prestacion: IPrestacion) {
}
}

export async function updateWork(metadata: any, estado: string) {
try {
const { valor: uid } = metadata.find(item => item.key === 'pacs-uid');
const { valor: spsId } = metadata.find(item => item.key === 'pacs-spsID');
const { valor: configId } = metadata.find(item => item.key === 'pacs-config');
const config = await PacsConfigController.findById(configId);
if (config) {
const token = await loginPacs(config);

if (estado === 'anular') {
await anularPacs(config, uid, spsId, token);
}
}
return null;
} catch (err) {
return null;
}
}

export async function sendInformePDF(prestacion: IPrestacion) {
try {
const { valor: uid } = prestacion.metadata.find(item => item.key === 'pacs-uid');
Expand Down Expand Up @@ -120,3 +139,12 @@ EventCore.on('rup:prestacion:ejecucion', (prestacion) => {
syncWorkList(prestacion);
});


EventCore.on('rup:prestacion:anular', (prestacion) => {
if (prestacion?.metadata?.length) {
const estado = 'anular';
updateWork(prestacion.metadata, estado);
};
});


36 changes: 20 additions & 16 deletions modules/rup/routes/prestacion.ts
Original file line number Diff line number Diff line change
Expand Up @@ -582,10 +582,13 @@ router.patch('/prestaciones/:id', (req: Request, res, next) => {
if (data.estados[data.estados.length - 1].tipo === 'validada') {
return next('Prestación validada, no se puede volver a validar.');
}
if (req.body.estado.tipo === 'anulada' && data.inicio !== 'top') {
const prestacion = await saveEnHistorial(data, req.body.estado, req);
await Prestacion.findOneAndRemove({ _id: data._id });
return res.json(prestacion);
if (req.body.estado.tipo === 'anulada') {
EventCore.emitAsync('rup:prestacion:anular', data);
if (data.inicio !== 'top') {
const prestacion = await saveEnHistorial(data, req.body.estado, req);
await Prestacion.findOneAndRemove({ _id: data._id });
return res.json(prestacion);
}
}
data.estados.push(req.body.estado);
if (req.body.estado.tipo === 'asignada') {
Expand Down Expand Up @@ -662,13 +665,14 @@ router.patch('/prestaciones/:id', (req: Request, res, next) => {
case 'desasociarTurno':
data.solicitud.turno = null;
const prestation_back = await saveEnHistorial(data, { tipo: 'anulada' }, req);
EventCore.emitAsync('rup:prestacion:anular', data);
await Prestacion.findOneAndRemove({ _id: data._id });
return res.json(prestation_back);

case 'referir':
if (req.body.estado) {
data.estados.push();
}

data.solicitud.profesional = req.body.profesional;
data.solicitud.organizacion = req.body.organizacion;
data.solicitud.tipoPrestacion = req.body.tipoPrestacion;
Expand Down Expand Up @@ -699,7 +703,7 @@ router.patch('/prestaciones/:id', (req: Request, res, next) => {
if (data.paciente) {
AppCache.clear(`huds-${data.paciente.id}`);
}
if (req.body.estado && req.body.estado.tipo === 'validada') {
if (req.body.estado?.tipo === 'validada') {
EventCore.emitAsync('rup:prestacion:validate', data);

// buscarYCrearSolicitudes y saveTurnoProfesional se hace acá para obtener datos del REQ a futuro se debería asociar al EventCore
Expand All @@ -711,7 +715,7 @@ router.patch('/prestaciones/:id', (req: Request, res, next) => {
}
}

if (req.body.estado && req.body.estado.tipo === 'ejecucion') {
if (req.body.estado?.tipo === 'ejecucion') {
EventCore.emitAsync('rup:prestacion:ejecucion', data);
}

Expand Down Expand Up @@ -813,22 +817,22 @@ EventCore.on('rup:prestacion:validate', async (prestacion: IPrestacionDoc) => {
EventCore.on('rup:prestacion:romperValidacion', async (prestacion: IPrestacionDoc) => {
const elementosRUPSet = await elementosRUPAsSet();
const elementoRUPPrestacion = elementosRUPSet.getByConcept(prestacion.solicitud.tipoPrestacion);
if (elementoRUPPrestacion) {
if (elementoRUPPrestacion?.dispatch) {
elementoRUPPrestacion.dispatch.forEach(hook => {
if (hook.method === 'romper-validacion') {
EventCore.emitAsync(hook.event, prestacion);
}
});
}

if (elementoRUPPrestacion?.dispatch) {
elementoRUPPrestacion.dispatch.forEach(hook => {
if (hook.method === 'romper-validacion') {
EventCore.emitAsync(hook.event, prestacion);
}
});
}

const registros = prestacion.getRegistros(true);

for (const reg of registros) {
if (reg.elementoRUP) {

const elemento = elementosRUPSet.getByID(reg.elementoRUP);
if (elemento && elemento.dispatch) {
if (elemento?.dispatch) {
elemento.dispatch.forEach(hook => {
if (hook.method === 'romper-validacion') {
EventCore.emitAsync(hook.event, { prestacion, registro: reg });
Expand Down

0 comments on commit 401acfb

Please sign in to comment.