Skip to content
Closed
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
1 change: 1 addition & 0 deletions initialize.ts
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,7 @@ export function initAPI(app: Express) {
app.use('/api/modules', require('./modules/semaforo/').SemaforoRouter);
app.use('/api/modules', require('./modules/constantes').ConstantesRouter);
app.use('/api/modules', require('./modules/recetas').RecetasRouter);
app.use('/api/modules', require('./modules/recetas').RecetaDispositivoRouter);

if (configPrivate.hosts.BI_QUERY) {
app.use(
Expand Down
3 changes: 2 additions & 1 deletion modules/recetas/index.ts
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
export { RecetasRouter } from './recetas.routes';
export { RecetasRouter } from './receta.routes';
export { RecetaDispositivoRouter } from './receta-dispositivo.routes';
23 changes: 23 additions & 0 deletions modules/recetas/receta-dispositivo.routes.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { MongoQuery, ResourceBase } from '@andes/core';
import { Auth } from '../../auth/auth.class';
import { RecetaDispositivo } from './receta-dispositivo.schema';

class RecetaDispositivoResource extends ResourceBase {
Model = RecetaDispositivo;
resourceName = 'recetaDispositivo';
routesEnable = ['get, post'];
middlewares = [Auth.authenticate()];
searchFileds = {
paciente: {
field: 'paciente.id',
fn: MongoQuery.equalMatch
},
documento: {
field: 'paciente.documento',
fn: MongoQuery.equalMatch
}
};
}

export const RecetaDispositivoCtr = new RecetaDispositivoResource({});
export const RecetaDispositivoRouter = RecetaDispositivoCtr.makeRoutes();
88 changes: 88 additions & 0 deletions modules/recetas/receta-dispositivo.schema.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
import { AuditPlugin } from '@andes/mongoose-plugin-audit';
import * as mongoose from 'mongoose';
import { PacienteSubSchema } from '../../core-v2/mpi/paciente/paciente.schema';
import { SnomedConcept } from '../rup/schemas/snomed-concept';
import { estadosSchema, estadoDispensaSchema, sistemaSchema } from './receta.schema';


const dispositivoSchema = new mongoose.Schema({
concepto: SnomedConcept,
cantidad: Number,
tratamientoProlongado: Boolean,
tiempoTratamiento: mongoose.SchemaTypes.Mixed
});

export const recetaDispositivoSchema = new mongoose.Schema({
organizacion: {
id: mongoose.SchemaTypes.ObjectId,
nombre: String
},
profesional: {
id: mongoose.SchemaTypes.ObjectId,
nombre: String,
apellido: String,
documento: String,
profesion: String,
matricula: Number,
especialidad: String,
},
fechaRegistro: Date,
fechaPrestacion: Date,
idPrestacion: String,
idRegistro: String,
diagnostico: SnomedConcept,
dispositivo: dispositivoSchema,
dispensa: [
{
idDispensaApp: String,
fecha: Date,
dispositivo: [{
cantidad: Number,
descripcion: String,
dispositivo: mongoose.SchemaTypes.Mixed,
cantidadEnvases: Number,
observacion: {
type: String,
required: false
}
}],
organizacion: {
id: String,
nombre: String
},
}
],
estados: [estadosSchema],
estadoActual: estadosSchema,
estadosDispensa: [estadoDispensaSchema],
estadoDispensaActual: estadoDispensaSchema,
paciente: PacienteSubSchema,
renovacion: String,
appNotificada: [{ app: sistemaSchema, fecha: Date }],
origenExterno: {
id: String, // id receta creada por sistema que no es Andes
app: sistemaSchema,
fecha: Date
}
});

recetaDispositivoSchema.pre('save', function (next) {
const recetaDispositivo: any = this;

if (recetaDispositivo.estados && recetaDispositivo.estados.length > 0) {
recetaDispositivo.estadoActual = recetaDispositivo.estados[recetaDispositivo.estados.length - 1];
}
if (recetaDispositivo.estadosDispensa && recetaDispositivo.estadosDispensa.length > 0) {
recetaDispositivo.estadoDispensaActual = recetaDispositivo.estadosDispensa[recetaDispositivo.estadosDispensa.length - 1];
}

next();
});

recetaDispositivoSchema.plugin(AuditPlugin);

recetaDispositivoSchema.index({
idPrestacion: 1,
});

export const RecetaDispositivo = mongoose.model('prescripcionInsumos', recetaDispositivoSchema, 'prescripcionInsumos');
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { asyncHandler, Request, Response } from '@andes/api-tool';
import { MongoQuery, ResourceBase } from '@andes/core';
import { Auth } from '../../auth/auth.class';
import { Receta } from './receta-schema';
import { buscarRecetas, getMotivosReceta, setEstadoDispensa, suspender, actualizarAppNotificada, cancelarDispensa, crearReceta } from './recetasController';
import { ParamsIncorrect } from './recetas.error';
import { Receta } from './receta.schema';
import { buscarRecetas, getMotivosReceta, setEstadoDispensa, suspender, actualizarAppNotificada, cancelarDispensa, crearReceta } from './recetaController';
import { ParamsIncorrect } from './receta.error';

class RecetasResource extends ResourceBase {
Model = Receta;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ export const motivosRecetaSchema = new mongoose.Schema({
}
});

const estadosSchema = new mongoose.Schema({
export const estadosSchema = new mongoose.Schema({
tipo: {
type: String,
enum: ['pendiente', 'vigente', 'finalizada', 'vencida', 'suspendida', 'rechazada'],
Expand Down Expand Up @@ -48,12 +48,13 @@ const estadosSchema = new mongoose.Schema({

estadosSchema.plugin(AuditPlugin);

const sistemaSchema = {

export const sistemaSchema = {
type: String,
enum: ['sifaho', 'recetar']
};

const cancelarSchema = new mongoose.Schema({
export const cancelarSchema = new mongoose.Schema({
idDispensaApp: {
type: String,
required: false
Expand All @@ -67,7 +68,8 @@ const cancelarSchema = new mongoose.Schema({
nombre: String
}
});
const estadoDispensaSchema = new mongoose.Schema({

export const estadoDispensaSchema = new mongoose.Schema({
tipo: {
type: String,
enum: ['sin-dispensa', 'dispensada', 'dispensa-parcial'],
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { Types } from 'mongoose';
import { Auth } from '../../auth/auth.class';
import { searchMatriculas } from '../../core/tm/controller/profesional';
import { MotivosReceta, Receta } from './receta-schema';
import { ParamsIncorrect, RecetaNotFound, RecetaNotEdit } from './recetas.error';
import { MotivosReceta, Receta } from './receta.schema';
import { ParamsIncorrect, RecetaNotFound, RecetaNotEdit } from './receta.error';
import * as moment from 'moment';
import { getReceta } from './services/receta';
import { updateLog, informarLog, createLog } from './recetaLogs';
Expand Down
135 changes: 87 additions & 48 deletions modules/rup/controllers/rup.events.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,19 @@
import { EventCore } from '@andes/event-bus';
import { getProfesionActualizada } from '../../recetas/recetasController';
import { getProfesionActualizada } from '../../recetas/recetaController';
import * as moment from 'moment';
import { Receta } from '../../recetas/receta-schema';
import { userScheduler } from '../../../config.private';
import { Receta } from '../../recetas/receta.schema';
import { rupEventsLog as logger } from './rup.events.log';
import { RecetaDispositivo } from '../../recetas/receta-dispositivo.schema';

const conceptIds = ['33633005', '103742009']; // Receta y renovación de receta
const conceptIdsMedicamento = ['33633005', '103742009']; // Receta y renovación de receta de MEDICAMENTOS
const conceptIdsDispositivo = ['313047003']; // Receta de DISPOSITIVOS (INSUMOS)

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;

Expand All @@ -33,53 +35,90 @@ EventCore.on('prestacion:receta:create', async (prestacion) => {
};

for (const registro of registros) {
if (conceptIds.includes(registro.concepto.conceptId)) {
for (const medicamento of registro.valor.medicamentos) {
let receta: any = await Receta.findOne(
{
'medicamento.concepto.conceptId': medicamento.generico.conceptId,
idRegistro: registro._id,
});

if (!receta) {
receta = new Receta();
}
receta.organizacion = organizacion;
receta.profesional = profesional;
receta.fechaRegistro = moment(prestacion.ejecucion.fecha).toDate();
receta.fechaPrestacion = moment(prestacion.ejecucion.fecha).toDate();
receta.idPrestacion = idPrestacion;
receta.idRegistro = registro._id;
receta.diagnostico = medicamento.diagnostico;
receta.medicamento = {
concepto: medicamento.generico,
presentacion: medicamento.presentacion.term,
unidades: medicamento.unidades,
cantidad: medicamento.cantidad,
cantEnvases: medicamento.cantEnvases,
dosisDiaria: {
dosis: medicamento.dosisDiaria.dosis,
intervalo: medicamento.dosisDiaria.intervalo,
dias: medicamento.dosisDiaria.dias,
notaMedica: medicamento.dosisDiaria.notaMedica
},
tratamientoProlongado: medicamento.tratamientoProlongado,
tiempoTratamiento: medicamento.tiempoTratamiento,
tipoReceta: medicamento.tipoReceta || 'simple',
serie: medicamento.serie,
numero: medicamento.numero
};
receta.estados = [{ tipo: 'vigente' }];
receta.estadoActual = { tipo: 'vigente' };
receta.estadosDispensa = [{ tipo: 'sin-dispensa', fecha: moment().toDate() }];
receta.estadoDispensaActual = { tipo: 'sin-dispensa', fecha: moment().toDate() };
receta.paciente = prestacion.paciente;
receta.audit(prestacion.createdBy);
await receta.save();
}
if (conceptIdsMedicamento.includes(registro.concepto.conceptId)) {
const medicamentos = registro.valor.medicamentos;
await saveRecetaMedicamentos(organizacion, profesional, prestacion, registro, medicamentos);
} else if (conceptIdsDispositivo.includes(registro.concepto.conceptId)) {
const dispositivos = registro.valor.dispositivos;
await saveRecetaDispositivos(organizacion, profesional, prestacion, registro, dispositivos);
}
}
} catch (err) {
logger.error('prestacion:receta:create', prestacion, err);
}
});

/**
* Por cada medicamento genera un nuevo documento en la coleccion 'receta'
*/
async function saveRecetaMedicamentos(organizacion, profesional, prestacion, registro, medicamentos) {
for (const medicamento of medicamentos) {
let receta: any = await Receta.findOne({ idPrestacion: 0 });
if (!receta) {
receta = new Receta();
}
receta.organizacion = organizacion;
receta.profesional = profesional;
receta.fechaRegistro = moment(prestacion.ejecucion.fecha).toDate();
receta.fechaPrestacion = moment(prestacion.ejecucion.fecha).toDate();
receta.idPrestacion = prestacion.id;
receta.idRegistro = registro._id;
receta.diagnostico = medicamento.diagnostico;
receta.medicamento = {
concepto: medicamento.generico,
presentacion: medicamento.presentacion.term,
unidades: medicamento.unidades,
cantidad: medicamento.cantidad,
cantEnvases: medicamento.cantEnvases,
dosisDiaria: {
dosis: medicamento.dosisDiaria.dosis,
intervalo: medicamento.dosisDiaria.intervalo,
dias: medicamento.dosisDiaria.dias,
notaMedica: medicamento.dosisDiaria.notaMedica
},
tratamientoProlongado: medicamento.tratamientoProlongado,
tiempoTratamiento: medicamento.tiempoTratamiento,
tipoReceta: medicamento.tipoReceta || 'simple',
serie: medicamento.serie,
numero: medicamento.numero
};
receta.estados = [{ tipo: 'vigente' }];
receta.estadoActual = { tipo: 'vigente' };
receta.estadosDispensa = [{ tipo: 'sin-dispensa', fecha: moment().toDate() }];
receta.estadoDispensaActual = { tipo: 'sin-dispensa', fecha: moment().toDate() };
receta.paciente = prestacion.paciente;
receta.audit(prestacion.createdBy);
await receta.save();
}
}

/**
* Por cada dispositivo recetado genera un nuevo documento en la coleccion 'prescripcionInsumos'
*/
async function saveRecetaDispositivos(organizacion, profesional, prestacion, registro, dispositivos) {
for (const dispositivo of dispositivos) {
let recetaDispositivo: any = await RecetaDispositivo.findOne({ idPrestacion: 0 });
if (!recetaDispositivo) {
recetaDispositivo = new RecetaDispositivo();
}
recetaDispositivo.organizacion = organizacion;
recetaDispositivo.profesional = profesional;
recetaDispositivo.fechaRegistro = moment(prestacion.ejecucion.fecha).toDate();
recetaDispositivo.fechaPrestacion = moment(prestacion.ejecucion.fecha).toDate();
recetaDispositivo.idPrestacion = prestacion.id;
recetaDispositivo.idRegistro = registro._id;
recetaDispositivo.dispositivo = {
concepto: dispositivo.generico,
cantidad: dispositivo.cantidad,
tratamientoProlongado: dispositivo.tratamientoProlongado,
tiempoTratamiento: dispositivo.tiempoTratamiento,
};
recetaDispositivo.estados = [{ tipo: 'vigente' }];
recetaDispositivo.estadoActual = { tipo: 'vigente' };
recetaDispositivo.estadosDispensa = [{ tipo: 'sin-dispensa', fecha: moment().toDate() }];
recetaDispositivo.estadoDispensaActual = { tipo: 'sin-dispensa', fecha: moment().toDate() };
recetaDispositivo.paciente = prestacion.paciente;
recetaDispositivo.audit(userScheduler);
await recetaDispositivo.save();
}
}