Skip to content

Commit 829efe7

Browse files
committed
feat(REC): implementa carga de medicamentos magistrales
1 parent fe18d9e commit 829efe7

4 files changed

Lines changed: 99 additions & 42 deletions

File tree

src/app/modules/rup/components/elementos/recetaMedica.component.ts

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ export class RecetaMedicaComponent extends RUPComponent implements OnInit, OnCha
2727
tiempoTratamiento: null,
2828
serie: null,
2929
numero: null,
30+
esMagistral: false,
3031
dosisDiaria: {
3132
dosis: null,
3233
frecuencia: null,
@@ -118,17 +119,39 @@ export class RecetaMedicaComponent extends RUPComponent implements OnInit, OnCha
118119
@Unsubscribe()
119120
loadMedicamentoGenerico(event) {
120121
const input = event.query;
121-
if (input && input.length > 2 && this.eclMedicamentos) {
122-
const query: any = {
123-
expression: this.eclMedicamentos.valor,
124-
search: input
125-
};
126-
this.snomedService.get(query).subscribe(event.callback);
122+
if (input && input.length > 2) {
123+
if (this.medicamento.esMagistral) {
124+
this.recetasService.getInsumos({ termino: input }).subscribe(insumos => {
125+
const mappedInsumos = insumos.map(i => {
126+
return {
127+
...i,
128+
term: i.nombre,
129+
conceptId: i.id
130+
};
131+
});
132+
event.callback(mappedInsumos);
133+
});
134+
} else if (this.eclMedicamentos) {
135+
const query = {
136+
expression: this.eclMedicamentos.valor,
137+
search: input
138+
};
139+
this.snomedService.get(query).subscribe(event.callback);
140+
} else {
141+
event.callback([]);
142+
}
127143
} else {
128144
event.callback([]);
129145
}
130146
}
131147

148+
onChangeMagistral() {
149+
this.medicamento.generico = null;
150+
this.medicamento.presentacion = null;
151+
this.unidades = [];
152+
this.deshacerCantidadManual();
153+
}
154+
132155
loadRegistros() {
133156
this.registros = [
134157
...this.prestacion.ejecucion.registros
@@ -142,9 +165,16 @@ export class RecetaMedicaComponent extends RUPComponent implements OnInit, OnCha
142165
loadPresentaciones() {
143166
this.deshacerCantidadManual();
144167
this.loading = true;
145-
this.medicamento.cantidad = null;
146168
this.medicamento.presentacion = null;
147169
this.medicamento.cantEnvases = null;
170+
171+
if (this.medicamento.esMagistral) {
172+
this.unidades = [];
173+
this.ingresoCantidadManual = true;
174+
this.loading = false;
175+
return;
176+
}
177+
148178
if (this.medicamento.generico && this.eclPresentaciones && this.eclMedicamentosComerciales) {
149179
const queryPresentacion: any = {
150180
expression: this.eclPresentaciones.valor.replace('#MG#', this.medicamento.generico.conceptId),
@@ -279,6 +309,7 @@ export class RecetaMedicaComponent extends RUPComponent implements OnInit, OnCha
279309
tiempoTratamiento: null,
280310
serie: null,
281311
numero: null,
312+
esMagistral: false,
282313
dosisDiaria: {
283314
frecuencia: null,
284315
dias: null,

src/app/modules/rup/components/elementos/recetaMedica.html

Lines changed: 51 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
<ng-container *ngIf="!soloValores">
22
<form class="mt-1" #formMedicamento="ngForm">
33
<plex-select [(ngModel)]="medicamento.diagnostico" hintType="info" label="Diagnóstico" [data]="registros"
4-
name="diagnostico" multiline="true" [required]="true" labelField="term" idField="conceptId"
5-
hint="Se listaran los conceptos registrados en esta consulta" hintType="info" hintIcon="eye">
4+
name="diagnostico" multiline="true" [required]="true" labelField="term" idField="conceptId"
5+
hint="Se listaran los conceptos registrados en esta consulta" hintType="info" hintIcon="eye">
66
</plex-select>
77

88
<!-- Sección de selección de obra social -->
99
<div class="row" *ngIf="showSelector">
1010
<div class="col-md-12">
1111
<label class="form-label">Obra Social / Financiador</label>
1212
<plex-radio name="financiador" [(ngModel)]="financiadorSeleccionado"
13-
(change)="seleccionarFinanciador($event)" [data]="datosFinanciadores">
13+
(change)="seleccionarFinanciador($event)" [data]="datosFinanciadores">
1414
</plex-radio>
1515
</div>
1616
</div>
@@ -19,8 +19,9 @@
1919
<div class="row" *ngIf="showListado">
2020
<div class="col-md-12">
2121
<label class="form-label">Seleccionar otro financiador</label>
22-
<plex-select name="otroFinanciador" placeholder="Buscar financiador..." [(ngModel)]="otroFinanciadorSeleccionado" [data]="opcionesFinanciadores"
23-
labelField="nombre" (change)="seleccionarOtroFinanciador($event)">
22+
<plex-select name="otroFinanciador" placeholder="Buscar financiador..."
23+
[(ngModel)]="otroFinanciadorSeleccionado" [data]="opcionesFinanciadores" labelField="nombre"
24+
(change)="seleccionarOtroFinanciador($event)">
2425
</plex-select>
2526
</div>
2627
</div>
@@ -29,104 +30,113 @@
2930
<div class="row" *ngIf="prestacion?.paciente?.obraSocial && showSelector">
3031
<div class="col-md-6">
3132
<plex-text name="numeroAfiliado" label="Número de afiliado" [(ngModel)]="numeroAfiliado"
32-
placeholder="Ingrese número de afiliado" [pattern]="patronNumerico"
33-
(ngModelChange)="actualizarNumeroAfiliado()">
33+
placeholder="Ingrese número de afiliado" [pattern]="patronNumerico"
34+
(ngModelChange)="actualizarNumeroAfiliado()">
3435
</plex-text>
3536
</div>
3637
</div>
3738

39+
<div class="mt-3">
40+
<plex-bool [(ngModel)]="medicamento.esMagistral" name="esMagistral" type="slide"
41+
label="Fórmula Magistral (Insumos)" (change)="onChangeMagistral()">
42+
</plex-bool>
43+
</div>
3844
<plex-grid cols="2">
39-
<plex-select [(ngModel)]="medicamento.generico" name="generico" (getData)="loadMedicamentoGenerico($event)"
40-
placeholder="Medicamento genérico" label="Medicamento" idField="conceptId" labelField="term"
41-
(change)="loadPresentaciones()" required="true">
45+
<plex-select *ngIf="!medicamento.esMagistral" [(ngModel)]="medicamento.generico" name="generico"
46+
(getData)="loadMedicamentoGenerico($event)" placeholder="Medicamento genérico" label="Medicamento"
47+
idField="conceptId" labelField="term" (change)="loadPresentaciones()" required="true">
48+
</plex-select>
49+
<plex-select *ngIf="medicamento.esMagistral" [(ngModel)]="medicamento.generico" name="genericoMagistral"
50+
(getData)="loadMedicamentoGenerico($event)" placeholder="Buscar Insumo Magistral"
51+
label="Fórmula Magistral" idField="conceptId" labelField="term" (change)="loadPresentaciones()"
52+
required="true">
4253
</plex-select>
4354

4455
<div grow="full">
4556
<plex-select *ngIf="!medicamento.generico || unidades.length || loading" class="formEditar w-100"
46-
name="unidades" [(ngModel)]="medicamento.cantidad" [data]="unidades"
47-
placeholder="Seleccione una opción" label="Cantidad" labelField="valor" required="true"
48-
[disabled]="!unidades?.length || ingresoCantidadManual" (change)="onChange($event)">
57+
name="unidades" [(ngModel)]="medicamento.cantidad" [data]="unidades"
58+
placeholder="Seleccione una opción" label="Cantidad" labelField="valor" required="true"
59+
[disabled]="!unidades?.length || ingresoCantidadManual" (change)="onChange($event)">
4960
</plex-select>
5061
<ng-container *ngIf="medicamento?.generico && !unidades.length && !loading || ingresoCantidadManual">
5162
<plex-int class="formEditar" [ngClass]="{ 'w-100': !unidades.length }" name="comprimidos"
52-
label="Cantidad" [(ngModel)]="valorCantidadManual" required="true" min="1" max="90">
63+
label="Cantidad" [(ngModel)]="valorCantidadManual" required="true" min="1" max="90">
5364
</plex-int>
5465
</ng-container>
5566
<plex-button *ngIf="ingresoCantidadManual && unidades.length" class="ml-1" name="deshacer"
56-
type="warning" icon="undo" tooltip="Deshacer edición manual" size="md"
57-
(click)="deshacerCantidadManual()">
67+
type="warning" icon="undo" tooltip="Deshacer edición manual" size="md"
68+
(click)="deshacerCantidadManual()">
5869
</plex-button>
5970
</div>
6071
</plex-grid>
6172

6273
<plex-grid cols="2">
6374
<plex-int name="envases" label="Cantidad de envases" [(ngModel)]="medicamento.cantEnvases" required="true"
64-
min="1" max="90">
75+
min="1" max="90">
6576
</plex-int>
6677

6778
<plex-grid cols="2" class="grid-tratamiento">
6879
<plex-bool [(ngModel)]="medicamento.tratamientoProlongado" name="tratamientoProlongado" type="slide"
69-
label="Tratamiento prolongado" [readonly]="medicamento.tipoReceta === 'triplicado'">
80+
label="Tratamiento prolongado" [readonly]="medicamento.tipoReceta === 'triplicado'">
7081
</plex-bool>
7182
<plex-select *ngIf="medicamento.tratamientoProlongado" [(ngModel)]="medicamento.tiempoTratamiento"
72-
name="tiempoTratamiento" [data]="tiemposTratamiento" required="true">
83+
name="tiempoTratamiento" [data]="tiemposTratamiento" required="true">
7384
</plex-select>
7485
</plex-grid>
7586
</plex-grid>
7687

7788
<div class="mt-2">
7889
<plex-title name="tipoReceta" titulo="Tipo de receta" size="sm"></plex-title>
7990
<plex-bool [(ngModel)]="esDuplicado" name="Duplicado" type="slide" label="Duplicado"
80-
(change)="onTipoRecetaChange('duplicado')">
91+
(change)="onTipoRecetaChange('duplicado')">
8192
</plex-bool>
8293
<plex-bool [(ngModel)]="esTriplicado" name="triplicado" type="slide" label="Triplicado"
83-
(change)="onTipoRecetaChange('triplicado')">
94+
(change)="onTipoRecetaChange('triplicado')">
8495
</plex-bool>
8596
</div>
8697

8798
<div class="mb-2" *ngIf="medicamento.tipoReceta === 'triplicado'">
8899
<plex-label size="lg" icon="alert-outline" titulo="Atención" type="warning"
89-
subtitulo="Recuerde que sigue siendo obligatoria la entrega del formulario triplicado en papel">
100+
subtitulo="Recuerde que sigue siendo obligatoria la entrega del formulario triplicado en papel">
90101
</plex-label>
91102
<plex-grid cols="2">
92103
<plex-text [(ngModel)]="medicamento.serie" name="serie" label="Serie" [required]="true"
93-
[pattern]="'^[A-Za-z]$'" placeholder="Ingrese una letra">
104+
[pattern]="'^[A-Za-z]$'" placeholder="Ingrese una letra">
94105
</plex-text>
95106
<plex-int [(ngModel)]="medicamento.numero" name="numero" label="Número" [required]="true"
96-
placeholder="Ingrese un número">
107+
placeholder="Ingrese un número">
97108
</plex-int>
98109
</plex-grid>
99110
</div>
100111

101112
<plex-title titulo="Indicaciones diarias" size="sm">
102113
<plex-button name="botonCollapse" class="collapse-button" type="primary" size="sm"
103-
icon="{{ collapse ? 'chevron-down' : 'chevron-up'}}"
104-
title="{{ collapse ? 'Expandir' : 'Colapsar'}}" titlePosition="left" (click)="colapsar()">
114+
icon="{{ collapse ? 'chevron-down' : 'chevron-up'}}" title="{{ collapse ? 'Expandir' : 'Colapsar'}}"
115+
titlePosition="left" (click)="colapsar()">
105116
</plex-button>
106117
</plex-title>
107118
<plex-wrapper>
108119
<div [hidden]="collapse" class="w-100">
109120
<div class="d-flex">
110121
<plex-text name="dosis" label="Dosis" [(ngModel)]="medicamento.dosisDiaria.dosis"
111-
[required]="requiereDosis" (change)="changeDosisIntervalo()">
122+
[required]="requiereDosis" (change)="changeDosisIntervalo()">
112123
</plex-text>
113124
<plex-select name="frecuencia" label="Intervalo" [(ngModel)]="medicamento.dosisDiaria.intervalo"
114-
[required]="requiereIntervalo" [data]="intervalos$ | async"
115-
(change)="changeDosisIntervalo()">
125+
[required]="requiereIntervalo" [data]="intervalos$ | async" (change)="changeDosisIntervalo()">
116126
</plex-select>
117127
<plex-int name=" duracion" label="Duración (días)" [(ngModel)]="medicamento.dosisDiaria.dias"
118-
required="false" min="1" max="90">
128+
required="false" min="1" max="90">
119129
</plex-int>
120130
<plex-text name="notaMedica" label="Notas médicas" [(ngModel)]="medicamento.dosisDiaria.notaMedica"
121-
required="false" min="1" max="90">
131+
required="false" min="1" max="90">
122132
</plex-text>
123133
</div>
124134

125135
</div>
126136
</plex-wrapper>
127137
<div class="d-flex justify-content-center">
128138
<plex-button name="botonAgregar" type="info" [disabled]="!formMedicamento.valid"
129-
(click)="preAgregarMedicamento($event)" [validateForm]="formMedicamento">
139+
(click)="preAgregarMedicamento($event)" [validateForm]="formMedicamento">
130140
Agregar
131141
</plex-button>
132142
</div>
@@ -142,29 +152,35 @@
142152
<plex-item *ngFor="let item of registro.valor.medicamentos">
143153
<plex-icon size="md" *ngIf="true" name="pildoras" class="icon icon--border--producto mr-2">
144154
</plex-icon>
145-
<plex-label [tituloBold]="true" titulo="{{ item.generico.term }}" subtitulo=" {{ item.cantEnvases}} envase(s) de {{ item.cantidad}} {{item.presentacion.term }}(s) {{ item.dosisDiaria.dosis? '| ' + item.dosisDiaria.dosis : '| ' }} {{ item.dosisDiaria.intervalo? ' cada ' + item.dosisDiaria.intervalo.nombre: '' }} {{ item.dosisDiaria.dias? ' durante ' + item.dosisDiaria.dias + ' día(s)':'' }}
155+
<plex-label [tituloBold]="true" titulo="{{ item.generico.term }}" subtitulo=" {{ item.cantEnvases}} envase(s) de {{ item.cantidad}} {{item.presentacion?.term }}(s) {{ item.dosisDiaria.dosis? '| ' + item.dosisDiaria.dosis : '| ' }} {{ item.dosisDiaria.intervalo? ' cada ' + item.dosisDiaria.intervalo.nombre: '' }} {{ item.dosisDiaria.dias? ' durante ' + item.dosisDiaria.dias + ' día(s)':'' }}
146156
"></plex-label>
147157
<plex-badge *ngIf="item.diagnostico" size="sm" type="warning" hintType="warning">
148158
{{ truncateDiagnostico(item.diagnostico.term) }}
149159
</plex-badge>
160+
<plex-badge *ngIf="item.esMagistral" size="sm" type="info" hintType="info">
161+
Fórmula Magistral
162+
</plex-badge>
150163
<plex-badge *ngIf="item.tratamientoProlongado" type="info">Tratamiento prolongado
151164
</plex-badge>
152165
<plex-badge *ngIf="item.tipoReceta?.length" type="info">{{item.tipoReceta}}
153166
</plex-badge>
154167
<plex-button type="danger" size="sm" (click)="borrarMedicamento(item)" icon="delete"
155-
tooltip="eliminar"></plex-button>
168+
tooltip="eliminar"></plex-button>
156169
</plex-item>
157170
</plex-list>
158171
</ng-container>
159172
<div *ngIf="soloValores">
160173
<div *ngIf="soloValores && alerta" class="alerta">{{alerta}}</div>
161174
<plex-list size="md" *ngIf="registro.valor.medicamentos">
162175
<plex-item *ngFor="let item of registro.valor.medicamentos">
163-
<plex-label [tituloBold]="true" titulo="{{ item.generico.term }}" subtitulo=" {{ item.cantEnvases}} envase(s) de {{ item.cantidad}} {{item.presentacion.term }}(s) {{ item.dosisDiaria.dosis? '| ' + item.dosisDiaria.dosis : '| ' }} {{ item.dosisDiaria.intervalo? ' cada ' + item.dosisDiaria.intervalo.nombre: '' }} {{ item.dosisDiaria.dias ? ' durante ' + item.dosisDiaria.dias + ' día(s)':'' }}
176+
<plex-label [tituloBold]="true" titulo="{{ item.generico.term }}" subtitulo=" {{ item.cantEnvases}} envase(s) de {{ item.cantidad}} {{item.presentacion?.term }}(s) {{ item.dosisDiaria.dosis? '| ' + item.dosisDiaria.dosis : '| ' }} {{ item.dosisDiaria.intervalo? ' cada ' + item.dosisDiaria.intervalo.nombre: '' }} {{ item.dosisDiaria.dias ? ' durante ' + item.dosisDiaria.dias + ' día(s)':'' }}
164177
"></plex-label>
165178
<plex-badge *ngIf="item.diagnostico" size="sm" type="warning" hintType="warning">
166179
{{ truncateDiagnostico(item.diagnostico.term) }}
167180
</plex-badge>
181+
<plex-badge *ngIf="item.esMagistral" size="sm" type="info" hintType="info">
182+
Fórmula Magistral
183+
</plex-badge>
168184
<plex-badge *ngIf="item.tratamientoProlongado" type="info">Tratamiento prolongado
169185
</plex-badge>
170186
<plex-badge *ngIf="item.tipoReceta?.length" type="info">{{item.tipoReceta}}

src/app/modules/rup/components/huds/vistaReceta.html

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
<plex-badge *ngIf="recetaPrincipal.medicamento" size="sm" type="default">
1616
{{ recetaPrincipal.medicamento.tipoReceta }}
1717
</plex-badge>
18+
<plex-badge *ngIf="recetaPrincipal.medicamento?.esMagistral" size="sm" type="info">
19+
Fórmula Magistral
20+
</plex-badge>
1821
</div>
1922
<div case="capitalize"><b>{{ recetaPrincipal.medicamento.concepto.term }}</b></div>
2023
<p *ngIf="recetaPrincipal.medicamento.cantidad && recetaPrincipal.medicamento.cantEnvases "><small>
@@ -157,6 +160,9 @@
157160
<plex-badge size="sm" [type]="estadoDispensa[receta.estadoDispensaActual.tipo]">
158161
{{ receta.estadoDispensaActual.tipo.replace('-', ' ') }}
159162
</plex-badge>
163+
<plex-badge *ngIf="receta.medicamento?.esMagistral" size="sm" type="info">
164+
Fórmula Magistral
165+
</plex-badge>
160166
</div>
161167
</td>
162168
</tr>

src/app/services/receta.service.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ export class RecetaService {
2121
return this.server.get(this.url, { params });
2222
}
2323

24+
getInsumos(params): Observable<any[]> {
25+
return this.server.get('/modules/insumos', { params });
26+
}
27+
2428
getMotivosSuspension() {
2529
return this.server.get(`${this.url}/motivos`);
2630
}

0 commit comments

Comments
 (0)