Skip to content

Commit

Permalink
feat(IN-574): Reporte indicaciones de medicamentos
Browse files Browse the repository at this point in the history
  • Loading branch information
aldoEMatamala authored and negro89 committed Jul 18, 2024
1 parent ba954c2 commit 761af22
Show file tree
Hide file tree
Showing 9 changed files with 412 additions and 35 deletions.
2 changes: 2 additions & 0 deletions src/app/apps/rup/mapa-camas/mapa-camas.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ import { TimelineMapaCamasComponent } from './views/timelinea-mapa-camas/timelin
import { VistaCDAComponent } from './views/mapa-camas-capa/vista-cda/vista-cda.component';
import { IngresoPacienteService } from './sidebar/ingreso/ingreso-paciente-workflow/ingreso-paciente-workflow.service';
import { PeriodosCensablesComponent } from './sidebar/periodos-censables/periodos-censables.component';
import { ListadoMedicamentosCapasComponent } from './views/listado-internacion-capas/listado-medicamentos-capas.component';



Expand Down Expand Up @@ -110,6 +111,7 @@ export const INTERNACION_COMPONENTS = [
IngresoDinamicoComponent,
PrestarDevolverRecursoComponent,
ListadoInternacionCapasComponent,
ListadoMedicamentosCapasComponent,
ListadoInternacionUnificadoComponent,
FiltrosListadoCapasComponent,
RecursosListadoComponent,
Expand Down
3 changes: 3 additions & 0 deletions src/app/apps/rup/mapa-camas/mapa-camas.routing.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { CensosDiariosComponent } from './views/censos/censo-diario/censo-diario
import { CensosMensualesComponent } from './views/censos/censo-mensual/censo-mensual.component';
import { InternacionListaEsperaComponent } from './views/lista-espera/lista-espera.component';
import { ListadoInternacionCapasComponent } from './views/listado-internacion-capas/listado-internacion-capas.component';
import { ListadoMedicamentosCapasComponent } from './views/listado-internacion-capas/listado-medicamentos-capas.component';
import { ListadoInternacionUnificadoComponent } from './views/listado-internacion-capas/listado-internacion-unificado.component';
import { InternacionListadoComponent } from './views/listado-internacion/listado-internacion.component';
import { MapaCamasCapaComponent } from './views/mapa-camas-capa/mapa-camas-capa.component';
Expand Down Expand Up @@ -36,6 +37,8 @@ export const INTERNACION_ROUTES = [

{ path: 'listado-internacion-medico', component: ListadoInternacionCapasComponent },

{ path: 'listado-medicamentos', component: ListadoMedicamentosCapasComponent },

{ path: ':ambito', component: MapaCamasMainComponent },

{ path: ':ambito/:capa/visualizacion', component: TimelineMapaCamasComponent },
Expand Down
5 changes: 4 additions & 1 deletion src/app/apps/rup/mapa-camas/services/mapa-camas.http.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,12 +40,15 @@ export class MapaCamasHTTP {
return this.server.get(`${this.url}/camas/historial`, { params });
}

historialInternacion(ambito: string, capa: string, desde: Date, hasta: Date, idInternacion: string): Observable<ISnapshot[]> {
historialInternacion(ambito: string, capa: string, desde: Date, hasta: Date, idInternacion: string, organizacionID?: string): Observable<ISnapshot[]> {
const params = {
ambito,
desde,
hasta
};
if (organizacionID) {
params['idInternacion'] = idInternacion;
};
return this.server.get(`${this.url}/${capa}/${idInternacion}/historial`, { params });
}

Expand Down
85 changes: 82 additions & 3 deletions src/app/apps/rup/mapa-camas/services/plan-indicaciones.service.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,95 @@
import { ResourceBaseHttp, Server } from '@andes/shared';
import { Injectable } from '@angular/core';
import { of } from 'rxjs';
import { map } from 'rxjs/operators';
import { BehaviorSubject, EMPTY, Observable, combineLatest, of, forkJoin } from 'rxjs';
import { auditTime, map, mergeMap, switchMap } from 'rxjs/operators';
import { MapaCamasHTTP } from './mapa-camas.http';

@Injectable({ providedIn: 'root' })

export class PlanIndicacionesServices extends ResourceBaseHttp {
protected url = '/modules/rup/internacion/plan-indicaciones';
public medicamentosFiltrados$: Observable<any[]>;
public lastResults = new BehaviorSubject<any[]>(null);
public organizacion = new BehaviorSubject<string>(null);
public paciente = new BehaviorSubject<string>(null);
public sector = new BehaviorSubject<string>(null);
public unidadO = new BehaviorSubject<string>(null);
private limit = 15;
private skip;

constructor(protected server: Server) {
constructor(
protected server: Server,
private camasHTTP: MapaCamasHTTP,) {
super(server);
this.medicamentosFiltrados$ = combineLatest([
this.organizacion,
this.paciente,
this.lastResults,
this.sector,
this.unidadO
]).pipe(
auditTime(0),
switchMap(([organizacion, paciente, lastResults, sector, unidadO]) => {

if (!lastResults) {
this.skip = 0;
}
if (this.skip > 0 && this.skip % this.limit !== 0) {
return EMPTY;
}
const params: any = {
limit: this.limit,
aceptadas: true,
skip: this.skip,
delDia: true
};
if (organizacion) {
params.organizacion = organizacion;
}
if (paciente) {
params.paciente = '^' + (paciente as string).toUpperCase();
}
return this.search(params).pipe(
map(resultados => {
const listado = lastResults ? (lastResults as any[]).concat(resultados) : resultados;
this.skip = listado.length;
const desde = moment().subtract(1, 'y').toDate();
if (resultados.length === 0) {
return of([]);
} else {

return forkJoin(
listado.map(int =>
this.camasHTTP.historialInternacion('internacion', 'medica', desde as Date, null, int.idInternacion, int.organizacion.id)
)
).pipe(
map((results) => {
return listado.filter((int, index) => {
const camas = results[index];
if (camas[0]?.sectores) {
int.sector = camas[0].sectores[1]?.tipoSector?.semanticTag + ' | ' + camas[0].sectores[1]?.nombre + ' | habitación: ' + (camas[0].sectores[2]?.nombre ? camas[0].sectores[2]?.nombre : 'S/D');
int.sectorID1 = camas[0].sectores[0]?._id;
int.sectorID2 = camas[0].sectores[1]?._id;
int.sectorID3 = camas[0].sectores[2]?._id;
} else {
int.sector = 'S/D';
}
camas[0]?.unidadOrganizativa?.fsn ? int.unidadOrganizativa = camas[0].unidadOrganizativa.fsn : int.unidadOrganizativa = 'S/D';
const matchSector = !sector || sector === int.sectorID1 || sector === int.sectorID2 || sector === int.sectorID3;
const matchUnidadO = !unidadO || camas[0]?.unidadOrganizativa?.id === unidadO;
return matchSector && matchUnidadO;
});
})
);
}

})
);
})
).pipe(mergeMap(x => x));
}


updateEstado(idIndicacion: string, estado) {
return this.server.patch(`${this.url}/${idIndicacion}/estado`, estado);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,72 @@
<plex-layout [main]="12">
<plex-layout-main>
<plex-title titulo="Medicamentos">
<plex-button label="VOLVER" type="danger" (click)="volver()"></plex-button>
</plex-title>
<plex-wrapper>
<plex-select name="unidadOrganizativa" label="Unidad Organizativa" [(ngModel)]="unidadOrg"
idField="conceptId" labelField="term" (change)="filtrar()"
[data]="unidadesOrganizativas$ | async">
</plex-select>
<plex-select name="sector" label="Sector" [(ngModel)]="sector" idField="nombre" labelField="nombre"
[data]="sectorList$ | async" (change)="filtrar()">
</plex-select>
<plex-text grow="1" [(ngModel)]="paciente" name="paciente" label="Paciente" [debounce]="500"
(change)="filtrar()"></plex-text>
</plex-wrapper>
<div *ngIf="!(listaMedicamentos$ | async)?.length" class="mt-5">

<plex-label *ngIf="!medicamentosHoy" class="flex-column" icon="magnify" type="info" justify="center"
size="xl" direction="column"
titulo="No se han registrado solicitudes de medicamentos en el día de la fecha"
subtitulo="Se mostrarán los medicamentos cargados desde el plan de indicaciones de los pacientes">
</plex-label>
<plex-label *ngIf="medicamentosHoy && !filtrosVacios" class="flex-column" icon="magnify" type="info"
justify="center" size="xl" direction="column" titulo="No hay resultados para esta búsqueda."
subtitulo="Edite algún filtro para realizar una nueva">
</plex-label>
</div>
<plex-table *ngIf="(listaMedicamentos$ | async)?.length" [columns]="columns" #table="plTable" [offset]="102"
(scroll)="onScroll()" [headOpacity]="50">
<plex-table-columns>
</plex-table-columns>
<plex-title titulo="Listado de pedidos del día" size="sm">
<plex-button size="sm" type="info" label="Descargar" (click)="descargarListado()"></plex-button>
<plex-table-columns class="pr-2">
</plex-table-columns>
</plex-title>
<tr *ngFor="let internacion of (listaMedicamentos$| plSort:table | async)">
<ng-container *ngIf="internacion.valor?.nombre ">
<td *plTableCol="'paciente'">
{{internacion.paciente | nombre }}
</td>
<td *plTableCol="'documento'">
{{ internacion.paciente | documento }}
</td>
<td *plTableCol="'medicamento'">
<span *ngIf="internacion.valor.nombre || internacion.valor.medicamento?.term">
{{ internacion.valor.nombre || internacion.valor.medicamento?.term}}
</span>
</td>
<td *plTableCol="'estado'">
<span *ngIf="internacion.estadoActual?.tipo!=='bypass'">
{{ internacion.estadoActual?.tipo==='active'? 'Aceptada':
internacion.estadoActual?.tipo}}
</span>
<span *ngIf="internacion.estadoActual?.tipo==='bypass'">
{{"Bypass ("+(internacion.estadoActual?.verificacion?.estado == null?
"pendiente": internacion.estadoActual?.verificacion?.estado) +")"}}
</span>
</td>
<td *plTableCol="'sector'">
{{internacion.sector }}
</td>
<td *plTableCol="'unidadOrganizativa'">
{{internacion.unidadOrganizativa }}
</td>
</ng-container>
</tr>
</plex-table>

</plex-layout-main>
</plex-layout>
Loading

0 comments on commit 761af22

Please sign in to comment.