diff --git a/modules/rup/controllers/rup.events.log.ts b/modules/rup/controllers/rup.events.log.ts new file mode 100644 index 0000000000..245c341f26 --- /dev/null +++ b/modules/rup/controllers/rup.events.log.ts @@ -0,0 +1,12 @@ +import { Connections } from '../../../connections'; +import { Logger } from '@andes/log'; + +export const rupEventsLog = new Logger({ + connection: Connections.logs, + module: 'rup', + type: 'rup-events', + application: 'andes', + bucketBy: 'd', + bucketSize: 100, + expiredAt: '2 M' +}); diff --git a/modules/rup/controllers/rup.events.ts b/modules/rup/controllers/rup.events.ts new file mode 100644 index 0000000000..a0ab50d6e1 --- /dev/null +++ b/modules/rup/controllers/rup.events.ts @@ -0,0 +1,86 @@ +import { userScheduler } from '../../../config.private'; +import { EventCore } from '@andes/event-bus'; +import * as moment from 'moment'; +import { Receta } from '../schemas/receta-schema'; +import * as mongoose from 'mongoose'; +import { rupEventsLog as logger } from './rup.events.log'; + +const conceptId = '16076005'; // Receta. + +EventCore.on('prestacion:receta:create', async (prestacion) => { + try { + if (prestacion.prestacion) { + prestacion = prestacion.prestacion; + } + const idPrestacion = prestacion.id; + const registros = prestacion.ejecucion.registros; + const profPrestacion = prestacion.solicitud.profesional; + const profesional = { + id: profPrestacion.id, + nombre: profPrestacion.nombre, + apellido: profPrestacion.apellido, + documento: profPrestacion.documento, + profesion: 'medico', + especialidad: 'especialidad', + matricula: 123 + }; + const organizacion = { + id: prestacion.ejecucion.organizacion.id, + nombre: prestacion.ejecucion.organizacion.nombre + }; + + for (const registro of registros) { + if (registro.concepto.conceptId === conceptId) { // Si es receta. + for (const medicamento of registro.valor.medicamentos) { + let receta: any = await Receta.findOne({ idPrestacion: 0 }); + if (!receta) { + receta = new Receta(); + } + receta.organizacion = organizacion; + receta.profesional = profesional; + receta.fechaRegistro = moment().toDate(); + receta.fechaPrestacion = moment(prestacion.ejecucion.fecha).toDate(); + receta.idPrestacion = idPrestacion; + receta.idRegistro = registro._id; + receta.medicamento = { + conceptId: medicamento.generico.conceptId, + term: medicamento.generico.term, + presentacion: medicamento.presentacion.term, + unidades: medicamento.unidades, + cantidad: medicamento.cantidad, + cantEnvases: medicamento.cantEnvases, + dosisDiaria: { + dosis: medicamento.dosisDiaria.dosis, + frecuencia: medicamento.dosisDiaria.frecuencia, + dias: medicamento.dosisDiaria.dias, + notaMedica: medicamento.dosisDiaria.notaMedica + }, + tratamientoProlongado: medicamento.tratamientoProlongado, + tiempoTratamiento: medicamento.tiempoTratamiento + }; + receta.estados = [{ estado: 'vigente' }]; + receta.paciente = prestacion.paciente; + receta.audit(userScheduler); + await receta.save(); + } + } + } + } catch (err) { + logger.error('prestacion:receta:create', prestacion, err); + } +}); + +EventCore.on('prestacion:receta:delete', async (prestacion) => { + if (prestacion.prestacion) { + prestacion = prestacion.prestacion; + } + try { + const idPrestacion = prestacion.id; + const recetas = await Receta.find({ idPrestacion }); + for (const receta of recetas) { + await Receta.findOneAndDelete({ _id: mongoose.Types.ObjectId(receta._id) }); + } + } catch (err) { + logger.error('prestacion:receta:delete', prestacion, err); + } +}); diff --git a/modules/rup/index.ts b/modules/rup/index.ts index 8659f3f3c3..6503eb1bee 100644 --- a/modules/rup/index.ts +++ b/modules/rup/index.ts @@ -1,6 +1,9 @@ import * as express from 'express'; import { ElementoRUPRouter } from './elementos-rup.controller'; import { CamasRouter, CensosRouter, EstadosRouter, InternacionResumenRouter, InternacionRouter, PlanIndicacionesEventosRouter, PlanIndicacionesRouter, SalaComunRouter } from './internacion'; + +require('./controllers/rup.events'); + export function setup(app: express.Application) { app.use('/api/modules/rup', ElementoRUPRouter); app.use('/api/modules/rup/internacion', CamasRouter); @@ -11,8 +14,6 @@ export function setup(app: express.Application) { app.use('/api/modules/rup/internacion', InternacionResumenRouter); app.use('/api/modules/rup/internacion', PlanIndicacionesRouter); app.use('/api/modules/rup/internacion', PlanIndicacionesEventosRouter); - - } export { hudsPaciente } from './controllers/prestacion'; diff --git a/modules/rup/schemas/receta-schema.ts b/modules/rup/schemas/receta-schema.ts new file mode 100644 index 0000000000..c969c9af42 --- /dev/null +++ b/modules/rup/schemas/receta-schema.ts @@ -0,0 +1,67 @@ +import { AuditPlugin } from '@andes/mongoose-plugin-audit'; +import * as mongoose from 'mongoose'; +import { PacienteSubSchema } from '../../../core-v2/mpi/paciente/paciente.schema'; + +const estadosSchema = new mongoose.Schema({ + estado: { + type: String, + enum: ['vigente', 'dispensada', 'vencida'], + required: true, + default: 'vigente' + }, +}); +estadosSchema.plugin(AuditPlugin); + +export const recetaSchema = new mongoose.Schema({ + organizacion: { + id: mongoose.SchemaTypes.ObjectId, + nombre: String + }, + profesional: { + id: mongoose.SchemaTypes.ObjectId, + nombre: String, + apellido: String, + documento: String, + profesion: String, + especialidad: String, + matricula: Number + }, + fechaRegistro: Date, + fechaPrestacion: Date, + idPrestacion: String, + idRegistro: String, + medicamento: { + conceptId: String, + term: String, // (DescripciĆ³n) + presentacion: String, + unidades: String, // (mg, cc, etc.) + cantidad: Number, + cantEnvases: Number, + dosisDiaria: { + dosis: String, + frecuencia: mongoose.SchemaTypes.Mixed, + dias: Number, + notaMedica: String + }, + tratamientoProlongado: Boolean, + tiempoTratamiento: mongoose.SchemaTypes.Mixed, + }, + estados: [estadosSchema], + estadoActual: { + type: String, + required: true, + default: 'vigente' + }, + paciente: PacienteSubSchema, + renovacion: String, // (referencia al registro original) + vinculoRecetar: String, + vinculoSifaho: String +}); + +recetaSchema.plugin(AuditPlugin); + +recetaSchema.index({ + idPrestacion: 1, +}); + +export const Receta = mongoose.model('receta', recetaSchema, 'receta');