Skip to content

Commit d91607b

Browse files
committed
feat(REC-174): Generar rutas para prescripciones de insumos (no medicamentos)
1 parent 2bcc27b commit d91607b

File tree

6 files changed

+513
-0
lines changed

6 files changed

+513
-0
lines changed

initialize.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,8 @@ export function initAPI(app: Express) {
122122
app.use('/api/modules', require('./modules/constantes').ConstantesRouter);
123123
app.use('/api/modules', require('./modules/recetas').RecetasRouter);
124124
app.use('/api/modules', require('./modules/insumos').InsumosRouter);
125+
app.use('/api/modules', require('./modules/recetas/recetasInsumos').RecetaInsumoRouter);
126+
125127

126128
if (configPrivate.hosts.BI_QUERY) {
127129
app.use(
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
import './receta-insumo.events';
2+
export { RecetaInsumoRouter } from './receta-insumo.routes';
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import { EventCore } from '@andes/event-bus';
2+
import { crearRecetaInsumo } from '../../recetas/recetasInsumos/recetaInsumosController';
3+
import { getProfesionActualizada } from '../../recetas/recetasController';
4+
import * as moment from 'moment';
5+
import { RecetaInsumo } from './receta-insumo.schema';
6+
import { createLog, informarLog, updateLog, jobsLog } from './../recetaLogs';
7+
8+
EventCore.on('prestacion:recetaInsumo:create', async ({ prestacion, registro }) => {
9+
const idRegistro = registro._id;
10+
const profPrestacion = prestacion.solicitud.profesional;
11+
const { profesionGrado, matriculaGrado, especialidades } = await getProfesionActualizada(profPrestacion.id);
12+
const profesional = {
13+
id: profPrestacion.id,
14+
nombre: profPrestacion.nombre,
15+
apellido: profPrestacion.apellido,
16+
documento: profPrestacion.documento,
17+
profesion: profesionGrado,
18+
especialidad: especialidades,
19+
matricula: matriculaGrado
20+
};
21+
22+
const organizacion = {
23+
id: prestacion.ejecucion.organizacion.id,
24+
nombre: prestacion.ejecucion.organizacion.nombre
25+
};
26+
27+
const dataReceta = {
28+
idPrestacion: prestacion.id,
29+
idRegistro,
30+
fechaRegistro: prestacion.ejecucion.fecha || moment().toDate(),
31+
fechaPrestacion: prestacion.ejecucion.fecha,
32+
paciente: prestacion.paciente,
33+
profesional,
34+
organizacion,
35+
insumo: null,
36+
diagnostico: null,
37+
};
38+
try {
39+
for (const insumo of registro.valor.dispositivos) {
40+
const receta: any = await RecetaInsumo.findOne({
41+
'insumo.insumo': insumo.generico.insumo,
42+
idRegistro
43+
});
44+
if (!receta) {
45+
dataReceta.insumo = insumo;
46+
await crearRecetaInsumo(dataReceta, prestacion.createdBy); // falta return
47+
}
48+
49+
}
50+
} catch (err) {
51+
createLog.error('create', { dataReceta, prestacion, profesional }, err, { prestacion, registro });
52+
return err; }
53+
});
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import { MongoQuery, ResourceBase } from '@andes/core';
2+
import { Auth } from '../../../auth/auth.class';
3+
import { RecetaInsumo } from './receta-insumo.schema';
4+
import { asyncHandler, Request, Response } from '@andes/api-tool';
5+
import { create } from './recetaInsumosController';
6+
7+
class RecetaInsumoResource extends ResourceBase {
8+
Model = RecetaInsumo;
9+
resourceName = 'recetaInsumo';
10+
routesEnable = ['get, post'];
11+
middlewares = [Auth.authenticate()];
12+
searchFileds = {
13+
paciente: {
14+
field: 'paciente.id',
15+
fn: MongoQuery.equalMatch
16+
},
17+
documento: {
18+
field: 'paciente.documento',
19+
fn: MongoQuery.equalMatch
20+
}
21+
};
22+
}
23+
24+
export const post = async (req, res) => {
25+
const resp = await create(req);
26+
const status = resp?.status || resp?.errors || 200;
27+
res.status(status).json(resp);
28+
};
29+
export const RecetaInsumoCtr = new RecetaInsumoResource({});
30+
export const RecetaInsumoRouter = RecetaInsumoCtr.makeRoutes();
31+
32+
const authorizeByToken = async (req: Request, res: Response, next) =>
33+
Auth.authorizeByToken(req, res, next, [
34+
'huds:visualizacionHuds',
35+
'huds:visualizacionParcialHuds:laboratorio',
36+
'huds:visualizacionParcialHuds:vacuna',
37+
'huds:visualizacionParcialHuds:receta',
38+
'huds:visualizacionParcialHuds:*',
39+
'recetas:read'
40+
]);
41+
42+
RecetaInsumoRouter.use(Auth.authenticate());
43+
RecetaInsumoRouter.post('/recetasInsumos', authorizeByToken, asyncHandler(post));
Lines changed: 158 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,158 @@
1+
import { AuditPlugin } from '@andes/mongoose-plugin-audit';
2+
import * as mongoose from 'mongoose';
3+
import { ProfesionalSubSchema } from '../../../core/tm/schemas/profesional';
4+
import { PacienteSubSchema } from '../../../core-v2/mpi/paciente/paciente.schema';
5+
const insumoSubSchema = new mongoose.Schema({
6+
insumo: String,
7+
tipo: {
8+
type: String,
9+
enum: ['dispositivo', 'nutricion', 'magistral']
10+
},
11+
requiereEspecificacion: Boolean,
12+
cantidad: Number,
13+
especificacion: String
14+
}, { _id: false });
15+
16+
const cancelarSchema = new mongoose.Schema({
17+
idDispensaApp: {
18+
type: String,
19+
required: false
20+
},
21+
motivo: {
22+
type: String,
23+
required: false
24+
},
25+
organizacion: {
26+
id: String,
27+
nombre: String
28+
}
29+
});
30+
const sistemaSchema = {
31+
type: String,
32+
enum: ['sifaho', 'recetar']
33+
};
34+
const estadoDispensaSchema = new mongoose.Schema({
35+
tipo: {
36+
type: String,
37+
enum: ['sin-dispensa', 'dispensada', 'dispensa-parcial'],
38+
required: true,
39+
default: 'sin-dispensa'
40+
},
41+
idDispensaApp: {
42+
type: String,
43+
required: false
44+
},
45+
fecha: Date,
46+
sistema: sistemaSchema,
47+
cancelada: {
48+
type: cancelarSchema,
49+
required: false
50+
}
51+
});
52+
const estadosSchema = new mongoose.Schema({
53+
tipo: {
54+
type: String,
55+
enum: ['pendiente', 'vigente', 'finalizada', 'vencida', 'suspendida', 'rechazada'],
56+
required: true,
57+
default: 'vigente'
58+
},
59+
motivo: {
60+
type: String,
61+
required: false
62+
},
63+
observacion: {
64+
type: String,
65+
required: false
66+
},
67+
profesional: {
68+
type: ProfesionalSubSchema,
69+
required: false
70+
},
71+
organizacionExterna: {
72+
id: {
73+
type: String,
74+
required: false
75+
},
76+
nombre: {
77+
type: String,
78+
required: false
79+
}
80+
}
81+
});
82+
83+
84+
85+
export const recetaInsumoSchema = new mongoose.Schema({
86+
organizacion: {
87+
id: mongoose.SchemaTypes.ObjectId,
88+
nombre: String
89+
},
90+
profesional: {
91+
id: mongoose.SchemaTypes.ObjectId,
92+
nombre: String,
93+
apellido: String,
94+
documento: String,
95+
profesion: String,
96+
matricula: Number,
97+
especialidad: String,
98+
},
99+
fechaRegistro: Date,
100+
fechaPrestacion: Date,
101+
idPrestacion: String,
102+
idRegistro: String,
103+
diagnostico: mongoose.SchemaTypes.Mixed,
104+
insumo: { type: insumoSubSchema, required: true },
105+
dispensa: [
106+
{
107+
idDispensaApp: String,
108+
fecha: Date,
109+
insumos: [{
110+
cantidad: Number,
111+
descripcion: String,
112+
insumo: mongoose.SchemaTypes.Mixed,
113+
cantidadEnvases: Number,
114+
observacion: {
115+
type: String,
116+
required: false
117+
}
118+
}],
119+
organizacion: {
120+
id: String,
121+
nombre: String
122+
},
123+
}
124+
],
125+
estados: [estadosSchema],
126+
estadoActual: estadosSchema,
127+
estadosDispensa: [estadoDispensaSchema],
128+
estadoDispensaActual: estadoDispensaSchema,
129+
paciente: PacienteSubSchema,
130+
renovacion: String,
131+
appNotificada: [{ app: sistemaSchema, fecha: Date }],
132+
origenExterno: {
133+
id: String, // id receta creada por sistema que no es Andes
134+
app: sistemaSchema,
135+
fecha: Date
136+
}
137+
});
138+
139+
recetaInsumoSchema.pre('save', function (next) {
140+
const recetaInsumo: any = this;
141+
142+
if (recetaInsumo.estados && recetaInsumo.estados.length > 0) {
143+
recetaInsumo.estadoActual = recetaInsumo.estados[recetaInsumo.estados.length - 1];
144+
}
145+
if (recetaInsumo.estadosDispensa && recetaInsumo.estadosDispensa.length > 0) {
146+
recetaInsumo.estadoDispensaActual = recetaInsumo.estadosDispensa[recetaInsumo.estadosDispensa.length - 1];
147+
}
148+
149+
next();
150+
});
151+
152+
recetaInsumoSchema.plugin(AuditPlugin);
153+
154+
recetaInsumoSchema.index({
155+
idPrestacion: 1,
156+
});
157+
158+
export const RecetaInsumo = mongoose.model('recetaInsumo', recetaInsumoSchema, 'recetaInsumo');

0 commit comments

Comments
 (0)