Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion modules/recetas/receta-schema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ export const motivosRecetaSchema = new mongoose.Schema({
const estadosSchema = new mongoose.Schema({
tipo: {
type: String,
enum: ['pendiente', 'vigente', 'finalizada', 'vencida', 'suspendida', 'rechazada'],
enum: ['pendiente', 'vigente', 'finalizada', 'vencida', 'suspendida', 'rechazada','eliminada'],
required: true,
default: 'vigente'
},
Expand Down
4 changes: 2 additions & 2 deletions modules/recetas/recetas.routes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,13 +46,13 @@ export const patch = async (req, res) => {
let result, status;
const { recetaId, recetas, dataDispensa } = req.body;
const app = req.user.app?.nombre ? req.user.app.nombre.toLowerCase() : '';
if (!recetaId && !recetas) {
if ((!recetaId && !recetas)) {
const error = new ParamsIncorrect();
res.status(error.status).json(error);
} else {
switch (operacion) {
case 'suspender':
result = await suspender(recetas, req);
result = await suspender(recetaId, req);
break;
case 'dispensar':
case 'dispensa-parcial':
Expand Down
136 changes: 43 additions & 93 deletions modules/recetas/recetasController.ts
Original file line number Diff line number Diff line change
Expand Up @@ -155,10 +155,12 @@ export async function buscarRecetas(req) {
optOtros['estadoActual.tipo'] = { $in: includeOtros };
}
options['$or'] = [optPendientes, optVigentes, optOtros].filter(o => o.hasOwnProperty('estadoActual.tipo'));
} else if (user.type === 'app-token') {
options['fechaRegistro'] = { $gte: fechaInicio, $lte: fechaFin };
} else {
options['estadoActual.tipo'] = { $nin: ['eliminada'] };
if (user.type === 'app-token') {
options['fechaRegistro'] = { $gte: fechaInicio, $lte: fechaFin };
}
}

let recetas: any = await Receta.find(options);
if (!recetas.length) {
return [];
Expand Down Expand Up @@ -188,102 +190,52 @@ export async function buscarRecetas(req) {
}
}

/**
* Groups recetas by idRegistro and selects the one with the smallest ordenTratamiento from each group
* @param recetaIds Array of receta IDs
* @returns Array of selected recetas (one per group)
*/
export async function obtenerRecetasPorGrupo(recetaIds) {
try {
const recetasPromises = recetaIds.map(async (recetaId) => {
const receta: any = await Receta.findById(recetaId);
return receta;
});
const recetas = await Promise.all(recetasPromises);
const grupos = {};
recetas.forEach(receta => {
if (receta) {
const idRegistro = receta.idRegistro;
if (!grupos[idRegistro]) {
grupos[idRegistro] = [];
}
grupos[idRegistro].push(receta);
}
});

const recetasASuspender = [];
Object.values(grupos).forEach((grupo: any[]) => {
if (grupo.length > 0) {
const recetaMenorOrden = grupo.reduce((min, receta) =>
receta.medicamento.ordenTratamiento < min.medicamento.ordenTratamiento ? receta : min
);
recetasASuspender.push(recetaMenorOrden);
}
});

return recetasASuspender;
} catch (error) {
await updateLog.error('obtenerRecetasPorGrupo', { recetaIds }, error);
throw error;
}
}

export async function suspender(recetas, req) {
export async function suspender(recetaId, req) {
const motivo = req.body.motivo;
const observacion = req.body.observacion;
const profesional = req.body.profesional;
try {
if (!recetas) {
throw new ParamsIncorrect();
}
const recetasASuspender = await obtenerRecetasPorGrupo(recetas);
const promises = recetas.map(async (recetaId) => {

const receta: any = await Receta.findById(recetaId);

if (!receta) {
throw new RecetaNotFound();
const recetaR: any = await Receta.findById(recetaId);
const recetasASuspender = await Receta.find({
'medicamento.concepto.conceptId': recetaR.medicamento.concepto.conceptId,
idRegistro: recetaR.idRegistro,
'estadoActual.tipo': { $nin: ['vencida', 'finalizada'] }
}).sort({ fechaRegistro: -1 });


if (recetasASuspender.length) {
const recetasSuspender = recetasASuspender.filter((r: any) => (r.estadoActual.tipo === 'vigente') || (r.estadoDispensaActual.tipo === 'dispensa-parcial' && r.estadoActual.tipo === 'pendiente'));
const recetasEliminar = recetasASuspender.filter((r: any) => (r.estadoDispensaActual.tipo === 'sin-dispensa' && r.estadoActual.tipo === 'pendiente'));
if (recetasSuspender.length === 0 && recetasEliminar.length !== 0) {
// en el tratamiento prolongado, al menos una receta debe quedar en estado suspendido
const recetaSusp = recetasEliminar.pop();
recetasSuspender.push(recetaSusp);
}
if (!receta.medicamento.tratamientoProlongado) {
receta.estados.push({
tipo: 'suspendida',
motivo,
observacion,
profesional,
fecha: new Date()
});
Auth.audit(receta, req);
await receta.save();
const recSusp = await Promise.all(await recetasUpdate(recetasSuspender, 'suspendida', motivo, observacion, profesional, req));

const idRegistro = receta.idRegistro;
const medicamento = receta.medicamento?.concepto.conceptId;
await Receta.deleteMany({ idRegistro, 'medicamento.concepto.conceptId': medicamento, 'estadoActual.tipo': 'pendiente', 'estadoDispensaActual.tipo': 'sin-dispensa' });
} else {
if (recetasASuspender.some(r => r.id.toString() === receta.id.toString())) {
receta.estados.push({
tipo: 'suspendida',
motivo,
observacion,
profesional,
fecha: new Date()
});
Auth.audit(receta, req);
await receta.save();
} else {
const _id = receta.id;
const medicamento = receta.medicamento?.concepto.conceptId;
await Receta.deleteOne({ _id });
}
}
});
await Promise.all(promises);
return { success: true };
const rec = recSusp.concat(await Promise.all(await recetasUpdate(recetasEliminar, 'eliminada', motivo, observacion, profesional, req)));

return rec;
}
return recetasASuspender;
} catch (error) {
await updateLog.error('suspender', { motivo, observacion, profesional, recetas }, error);
await updateLog.error('suspender', { motivo, observacion, profesional, recetaId }, error);
return error;
}
}

async function recetasUpdate(recetas, estado, motivo, observacion, profesional, req) {
return recetas.map(async (receta: any) => {
receta.estados.push({
tipo: estado,
motivo,
observacion,
profesional,
});
Auth.audit(receta, req);
return await receta.save();
});
};

export async function getMotivosReceta(res) {
try {
Expand Down Expand Up @@ -695,7 +647,7 @@ export async function buscarRecetasPorProfesional(req) {
filter['origenExterno.app'] = origenExternoApp;
}
if (excluirEstado) {
filter['estadoActual.tipo'] = { $ne: excluirEstado };
filter['estadoActual.tipo'] = { $nin: excluirEstado };
}
const recetas = await Receta.find(filter);
return recetas;
Expand Down Expand Up @@ -735,8 +687,7 @@ export async function actualizarEstadosRecetas(done) {
for (const receta of recetasPendientes) {
try {
receta.estados.push({
tipo: 'vigente',
fecha: moment().toDate(),
tipo: 'vigente'
});
totalRecetasAVigentes++;
Auth.audit(receta, userScheduler as any);
Expand All @@ -758,8 +709,7 @@ export async function actualizarEstadosRecetas(done) {
for (const receta of recetasVigentes) {
try {
receta.estados.push({
tipo: 'vencida',
fecha: moment().toDate()
tipo: 'vencida'
});
Auth.audit(receta, userScheduler as any);
await receta.save();
Expand Down