diff --git a/modules/cda/controller/CDAPatient.ts b/modules/cda/controller/CDAPatient.ts index 9e72b6f6c8..5808de2406 100644 --- a/modules/cda/controller/CDAPatient.ts +++ b/modules/cda/controller/CDAPatient.ts @@ -429,7 +429,6 @@ export function findByMetadata(conds) { export async function CDAExists(id, fecha, orgId) { const existe = await findByMetadata({ 'metadata.extras.id': id, - 'metadata.fecha': fecha, 'metadata.extras.organizacion': Types.ObjectId(orgId), }); return existe; diff --git a/modules/cda/routes/cda.ts b/modules/cda/routes/cda.ts index 6ce4749136..b40ca841c8 100644 --- a/modules/cda/routes/cda.ts +++ b/modules/cda/routes/cda.ts @@ -112,14 +112,23 @@ router.post('/', async (req: any, res, next) => { cdaData.paciente.sexo = cdaData.paciente.sexo === 'M' ? 'masculino' : 'femenino'; const yaExiste = await cdaCtr.CDAExists(cdaData.id, cdaData.fecha, orgId); + const prestacion = await cdaCtr.matchCodeByLoinc(cdaData.loinc); + if (yaExiste) { - return next({ error: 'prestacion_existente' }); + const esLaboratorio = prestacion?.snomed?.semanticTag === 'procedimiento'; + const fechaCda = moment(yaExiste.metadata.fecha); + const haceUnMes = moment().subtract(1, 'month'); + + if (esLaboratorio && fechaCda.isAfter(haceUnMes)) { + await cdaCtr.deleteCda(yaExiste._id, null); + } else { + return next({ error: 'prestacion_existente' }); + } } const organizacion = await Organizacion.findById(orgId); const dataProfesional = req.body.profesional; - const prestacion = await cdaCtr.matchCodeByLoinc(cdaData.loinc); if (!prestacion) { // Es obligatorio que posea prestación return next({ error: 'prestacion_invalida' }); @@ -344,15 +353,23 @@ async function createCDA(req, res, next) { orgId = req.body.organizacion; } const yaExiste = await cdaCtr.CDAExists(idPrestacion, fecha, orgId); + const prestacion = await cdaCtr.matchCode(req.body.tipoPrestacion); + if (yaExiste) { - return res.json({ cda: yaExiste._id, paciente: yaExiste.paciente?._id }); + const esLaboratorio = prestacion?.snomed?.semanticTag === 'procedimiento'; + const fechaCda = moment(yaExiste.metadata.fecha); + const haceUnMes = moment().subtract(1, 'month'); + + if (esLaboratorio && fechaCda.isAfter(haceUnMes)) { + await cdaCtr.deleteCda(yaExiste._id, null); + } else { + return res.json({ cda: yaExiste._id, paciente: yaExiste.paciente?._id }); + } } const dataPaciente = req.body.paciente; const dataProfesional = req.body.profesional; - // Devuelve un Loinc asociado al código SNOMED - const prestacion = await cdaCtr.matchCode(req.body.tipoPrestacion); if (!prestacion) { // Es obligatorio que posea prestación return next(`prestacion_invalida ${req.body.tipoPrestacion}`);