From 6061233fad3078a4c35fea0385f57fbe6d3760d3 Mon Sep 17 00:00:00 2001 From: aldoEMatamala Date: Mon, 13 Jul 2026 14:54:06 -0300 Subject: [PATCH] feat(RUP-536):Receta - compatibilidad app externa --- .../elementos-rup/receta-medica.component.ts | 59 +++++++++++++++++-- modules/recetas/receta-schema.ts | 4 ++ modules/recetas/recetasController.ts | 34 +++++++++-- modules/rup/controllers/rup.events.ts | 6 ++ 4 files changed, 93 insertions(+), 10 deletions(-) diff --git a/modules/descargas/informe-rup/elementos-rup/receta-medica.component.ts b/modules/descargas/informe-rup/elementos-rup/receta-medica.component.ts index eb385e1806..9ee7ff3473 100644 --- a/modules/descargas/informe-rup/elementos-rup/receta-medica.component.ts +++ b/modules/descargas/informe-rup/elementos-rup/receta-medica.component.ts @@ -47,6 +47,7 @@ export class RecetaMedicaComponent extends HTMLComponent { Cantidad Indicaciones Diagnóstico + Obra Social @@ -63,9 +64,6 @@ export class RecetaMedicaComponent extends HTMLComponent { {{/if}} - {{ unidades }} {{presentacion.term }}(s) - - {{ cantEnvases}} envase(s) de {{ cantidad }} {{presentacion.term }}(s) @@ -90,10 +88,20 @@ export class RecetaMedicaComponent extends HTMLComponent { {{ diagnostico.term }} + + {{#if obraSocial}} + {{obraSocial.nombre}} + {{#if obraSocial.numeroAfiliado}} +
Af. {{obraSocial.numeroAfiliado}} + {{/if}} + {{else}} + Sin obra social + {{/if}} + {{/each}} - + {{#if esReceta}} Esta receta fue creada por emisor inscripto y valido en el Registro de Recetarios Electrónicos del Ministerio de Salud de la Nación - RL-2025-24026558-APN-SSVEIYES#MS @@ -152,8 +160,49 @@ del Ministerio de Salud de la Nación - RL-2025-24026558-APN-SSVEIYES#MS const finalIdReceta = idReceta || this.registro.id; + let obraSocial = this.prestacion.paciente?.obraSocial || null; + if (Array.isArray(obraSocial)) { + obraSocial = obraSocial[0]; + } + let obraSocialObj = null; + if (obraSocial) { + const nombreOS = typeof obraSocial === 'string' ? obraSocial : (obraSocial.nombre || obraSocial.financiador || ''); + if (nombreOS && nombreOS !== 'Sin obra social') { + obraSocialObj = { + nombre: nombreOS, + numeroAfiliado: typeof obraSocial === 'object' ? (obraSocial.numeroAfiliado || '') : '' + }; + } + } + + const registroClone = this.registro.toObject ? this.registro.toObject() : JSON.parse(JSON.stringify(this.registro)); + if (registroClone.valor?.medicamentos) { + registroClone.valor.medicamentos = registroClone.valor.medicamentos.map(med => { + let medOS = null; + if (med.obraSocial && typeof med.obraSocial === 'object') { + const nombreMedOS = med.obraSocial.nombre || med.obraSocial.financiador || ''; + if (nombreMedOS && nombreMedOS !== 'Sin obra social') { + medOS = { + nombre: nombreMedOS, + numeroAfiliado: med.obraSocial.numeroAfiliado || '' + }; + } + } else if (med.obraSocial === undefined && obraSocialObj) { + medOS = { + nombre: obraSocialObj.nombre, + numeroAfiliado: obraSocialObj.numeroAfiliado + }; + } + + return { + ...med, + obraSocial: medOS + }; + }); + } + this.data = { - registro: this.registro, + registro: registroClone, esReceta: this.depth ? 1 : 0, // Si es 0 no muestra el código de barras idReceta: finalIdReceta, estadoReceta, diff --git a/modules/recetas/receta-schema.ts b/modules/recetas/receta-schema.ts index bcdee23ec0..c8c2249980 100644 --- a/modules/recetas/receta-schema.ts +++ b/modules/recetas/receta-schema.ts @@ -147,6 +147,10 @@ const medicamentoSubschema = new mongoose.Schema({ numero: { type: Number, required: false + }, + obraSocial: { + type: mongoose.SchemaTypes.Mixed, + required: false } }, { toJSON: { virtuals: true }, diff --git a/modules/recetas/recetasController.ts b/modules/recetas/recetasController.ts index 0203e2631b..4386371912 100644 --- a/modules/recetas/recetasController.ts +++ b/modules/recetas/recetasController.ts @@ -110,6 +110,16 @@ async function registrarAppNotificadas(req, recetas, sistema) { return recetasUpdated.filter(r => r !== null); } +function formatearRecetasParaAppExterna(recetas: any[]) { + return recetas.map(receta => { + const rec = receta.toObject ? receta.toObject() : JSON.parse(JSON.stringify(receta)); + if (rec.paciente && rec.medicamento?.obraSocial !== undefined) { + rec.paciente.obraSocial = rec.medicamento.obraSocial; + } + return rec; + }); +} + /** * Se ontienen las recetas de un paciente segun filtros: * @param pacienteId (optativo con documento y sexo) @@ -221,6 +231,7 @@ export async function buscarRecetas(req) { // si es un usuario de app y no tiene nombre de sistema asignado, no se envia recetas const sistema = user.app.nombre.toLowerCase(); recetas = sistema ? await registrarAppNotificadas(req, recetas, sistema) : []; + recetas = formatearRecetasParaAppExterna(recetas); } return recetas; } catch (err) { @@ -338,6 +349,7 @@ export async function buscarRecetasConFiltros(req) { // si es un usuario de app y no tiene nombre de sistema asignado, no se envia recetas const sistema = user.app?.nombre ? user.app.nombre.toLowerCase() : ''; recetas = sistema ? await registrarAppNotificadas(req, recetas, sistema) : []; + recetas = formatearRecetasParaAppExterna(recetas); } return recetas; @@ -697,7 +709,7 @@ export async function create(req) { pacienteAndes.fechaNacimiento = fechaNacimientoReceta; await pacienteAndes.save(); } - pacienteAndes.obraSocial = (!pacienteRecetar.obraSocial) ? null : + pacienteAndes.obraSocial = (!pacienteRecetar.obraSocial || pacienteRecetar.obraSocial.nombre === 'Sin obra social') ? null : { origen: pacienteRecetar.obraSocial.otraOS ? 'RECETAR' : 'PUCO', nombre: pacienteRecetar.obraSocial.nombre, @@ -727,7 +739,11 @@ export async function create(req) { matricula: matriculaGrado }; } - return await crearReceta(dataReceta, req); + const recetas: any = await crearReceta(dataReceta, req); + if (Array.isArray(recetas) && req.user?.type === 'app-token') { + return formatearRecetasParaAppExterna(recetas); + } + return recetas; } catch (err) { createLog.error('create', { dataReceta, pacienteRecetar, profRecetar }, err, req); return err; @@ -749,6 +765,8 @@ export async function crearReceta(dataReceta, req) { const diag = medicamento.diagnostico; receta.diagnostico = (typeof diag === 'string') ? { descripcion: diag } : diag; const esMagistral = !!medicamento.esMagistral; + const obraSocialAux = (medicamento.obraSocial !== undefined) ? medicamento.obraSocial : (dataReceta.paciente?.obraSocial || null); + const obraSocialFinal = (obraSocialAux && obraSocialAux.nombre !== 'Sin obra social') ? obraSocialAux : null; receta.medicamento = { concepto: esMagistral ? null : (medicamento.concepto || medicamento.generico), presentacion: medicamento.presentacion?.term || medicamento.presentacion, @@ -770,11 +788,14 @@ export async function crearReceta(dataReceta, req) { tipoReceta: medicamento.tipoReceta?.id || medicamento.tipoReceta || 'simple', serie: medicamento.serie, numero: medicamento.numero, + obraSocial: obraSocialFinal }; receta.estados = i < 1 ? [{ tipo: 'vigente' }] : [{ tipo: 'pendiente' }]; receta.estadosDispensa = [{ tipo: 'sin-dispensa', fecha: moment().toDate() }]; - receta.paciente = dataReceta.paciente; - receta.paciente.obraSocial = dataReceta.paciente.obraSocial; + + const pacienteClone = dataReceta.paciente.toObject ? dataReceta.paciente.toObject() : JSON.parse(JSON.stringify(dataReceta.paciente)); + receta.paciente = pacienteClone; + receta.paciente.obraSocial = null; receta.paciente.id = dataReceta.paciente.id || dataReceta.paciente._id; receta.profesional = dataReceta.profesional; receta.profesional._id = dataReceta.profesional.id || dataReceta.profesional._id; // revisar como se generan ids en ambos casos @@ -831,7 +852,10 @@ export async function buscarRecetasPorProfesional(req) { filter['estadoActual.tipo'] = { $nin: estados }; } - const recetas = await Receta.find(filter); + let recetas: any = await Receta.find(filter); + if (req.user?.type === 'app-token') { + recetas = formatearRecetasParaAppExterna(recetas); + } return recetas; } catch (err) { await informarLog.error('buscarRecetasPorProfesional', { params: req.params, query: req.query }, err); diff --git a/modules/rup/controllers/rup.events.ts b/modules/rup/controllers/rup.events.ts index 42ff8bc3be..5adf2debf5 100644 --- a/modules/rup/controllers/rup.events.ts +++ b/modules/rup/controllers/rup.events.ts @@ -56,10 +56,16 @@ EventCore.on('prestacion:receta:create', async ({ prestacion, registro }) => { diagnostico: null, }; dataRecetaBase.paciente.cuil = pacienteCUIL; + if (dataRecetaBase.paciente?.obraSocial?.nombre === 'Sin obra social') { + dataRecetaBase.paciente.obraSocial = null; + } for (const medicamento of registro.valor.medicamentos) { try { const esMagistral = !!medicamento?.esMagistral; + if (medicamento.obraSocial?.nombre === 'Sin obra social') { + medicamento.obraSocial = null; + } const conceptId = medicamento?.concepto?.conceptId || medicamento?.generico?.conceptId; if (!conceptId && !esMagistral) {