Skip to content

Commit 924311b

Browse files
committed
feat(REC-174): Generar rutas para prescripciones de insumos
1 parent f60c701 commit 924311b

6 files changed

Lines changed: 512 additions & 0 deletions

File tree

initialize.ts

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

127129
if (configPrivate.hosts.BI_QUERY) {
128130
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: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
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.insumos) {
40+
const receta: any = await RecetaInsumo.findOne({
41+
'insumo.nombre': insumo.generico.nombre,
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+
}
54+
});
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: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
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+
export const recetaInsumoSchema = new mongoose.Schema({
85+
organizacion: {
86+
id: mongoose.SchemaTypes.ObjectId,
87+
nombre: String
88+
},
89+
profesional: {
90+
id: mongoose.SchemaTypes.ObjectId,
91+
nombre: String,
92+
apellido: String,
93+
documento: String,
94+
profesion: String,
95+
matricula: Number,
96+
especialidad: String,
97+
},
98+
fechaRegistro: Date,
99+
fechaPrestacion: Date,
100+
idPrestacion: String,
101+
idRegistro: String,
102+
diagnostico: mongoose.SchemaTypes.Mixed,
103+
insumo: { type: insumoSubSchema, required: true },
104+
dispensa: [
105+
{
106+
idDispensaApp: String,
107+
fecha: Date,
108+
insumos: [{
109+
cantidad: Number,
110+
descripcion: String,
111+
insumo: mongoose.SchemaTypes.Mixed,
112+
cantidadEnvases: Number,
113+
observacion: {
114+
type: String,
115+
required: false
116+
}
117+
}],
118+
organizacion: {
119+
id: String,
120+
nombre: String
121+
},
122+
}
123+
],
124+
estados: [estadosSchema],
125+
estadoActual: estadosSchema,
126+
estadosDispensa: [estadoDispensaSchema],
127+
estadoDispensaActual: estadoDispensaSchema,
128+
paciente: PacienteSubSchema,
129+
renovacion: String,
130+
appNotificada: [{ app: sistemaSchema, fecha: Date }],
131+
origenExterno: {
132+
id: String, // id receta creada por sistema que no es Andes
133+
app: sistemaSchema,
134+
fecha: Date
135+
}
136+
});
137+
138+
recetaInsumoSchema.pre('save', function (next) {
139+
const recetaInsumo: any = this;
140+
141+
if (recetaInsumo.estados && recetaInsumo.estados.length > 0) {
142+
recetaInsumo.estadoActual = recetaInsumo.estados[recetaInsumo.estados.length - 1];
143+
}
144+
if (recetaInsumo.estadosDispensa && recetaInsumo.estadosDispensa.length > 0) {
145+
recetaInsumo.estadoDispensaActual = recetaInsumo.estadosDispensa[recetaInsumo.estadosDispensa.length - 1];
146+
}
147+
148+
next();
149+
});
150+
151+
recetaInsumoSchema.plugin(AuditPlugin);
152+
153+
recetaInsumoSchema.index({
154+
idPrestacion: 1,
155+
});
156+
157+
export const RecetaInsumo = mongoose.model('recetasInsumo', recetaInsumoSchema, 'recetasInsumo');

0 commit comments

Comments
 (0)