Skip to content

Commit

Permalink
feat(LAB): implementa vista de laboratorios
Browse files Browse the repository at this point in the history
  • Loading branch information
ma7payne authored and negro89 committed Oct 10, 2024
1 parent 02adc46 commit 0b08ba1
Show file tree
Hide file tree
Showing 9 changed files with 259 additions and 49 deletions.
10 changes: 8 additions & 2 deletions projects/portal/src/app/services/laboratorio.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@ export class LaboratorioService {
return this.server.get(`${this.mobileUrl}/laboratorios/${id}`).pipe(
cacheStorage({ key: 'laboratorios' })
);

}

getLaboratorio(id: number | string, idPaciente) {
Expand All @@ -29,11 +28,18 @@ export class LaboratorioService {
);
}

getProtocolos({ estado, dni, fecNac, apellido, fechaDde, fechaHta }) {
return this.server.get(`/modules/rup/protocolosLab?estado=${estado}&dni=${dni}&fecNac=${fecNac}&apellido=${apellido}&fechaDde=${fechaDde}&fechaHta=${fechaHta}`);
}

getByProtocolo(id: number) {
return this.server.get(`/modules/rup/protocolosLab/${id}`);
}

descargar(cda) {
if (cda.confidentialityCode !== 'R') {
const url = environment.API + '/modules/cda/' + cda.adjuntos[0] + '?token=' + this.auth.getToken();
window.open(url);
}
}

}
102 changes: 67 additions & 35 deletions src/app/modules/rup/components/ejecucion/hudsBusqueda.component.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,12 @@ import { Auth } from '@andes/auth';
import { Plex } from '@andes/plex';
import { AfterContentInit, Component, EventEmitter, Input, Optional, Output, ViewEncapsulation } from '@angular/core';
import * as moment from 'moment';
import { Observable } from 'rxjs';
import { LaboratorioService } from 'projects/portal/src/app/services/laboratorio.service';
import { Observable, forkJoin } from 'rxjs';
import { switchMap } from 'rxjs/operators';
import { InternacionResumenHTTP } from 'src/app/apps/rup/mapa-camas/services/resumen-internacion.http';
import { IPaciente } from 'src/app/core/mpi/interfaces/IPaciente';
import { PacienteService } from 'src/app/core/mpi/services/paciente.service';
import { SECCION_CLASIFICACION } from 'src/app/modules/epidemiologia/constantes';
import { FormsEpidemiologiaService } from 'src/app/modules/epidemiologia/services/ficha-epidemiologia.service';
import { ConceptosTurneablesService } from 'src/app/services/conceptos-turneables.service';
Expand All @@ -14,8 +17,6 @@ import { getSemanticClass } from '../../pipes/semantic-class.pipes';
import { EmitConcepto, RupEjecucionService } from '../../services/ejecucion.service';
import { HUDSService } from '../../services/huds.service';
import { PrestacionesService } from './../../services/prestaciones.service';
import { PacienteService } from 'src/app/core/mpi/services/paciente.service';
import { IPaciente } from 'src/app/core/mpi/interfaces/IPaciente';

@Component({
selector: 'rup-hudsBusqueda',
Expand Down Expand Up @@ -154,7 +155,8 @@ export class HudsBusquedaComponent implements AfterContentInit {
private formEpidemiologiaService: FormsEpidemiologiaService,
private resumenHTTP: InternacionResumenHTTP,
@Optional() private ejecucionService: RupEjecucionService,
private pacienteService: PacienteService
private pacienteService: PacienteService,
private laboratorioService: LaboratorioService,
) {
}

Expand Down Expand Up @@ -282,6 +284,9 @@ export class HudsBusquedaComponent implements AfterContentInit {
registro.tipo = 'internacion';
registro.index = index;
break;
case 'laboratorio':
gtag('huds-open', tipo, 'laboratorio', index);
break;
}

this.huds.toogle(registro, tipo);
Expand Down Expand Up @@ -428,39 +433,66 @@ export class HudsBusquedaComponent implements AfterContentInit {
});
}

private ordenarLaboratorios(laboratorios, protocolos) {
const listaProtocolos = protocolos[0]?.Data;
const listado = listaProtocolos ? [...laboratorios, ...listaProtocolos] : [...laboratorios];

return listado.sort((a, b) => {
const fechaA = moment(a.fecha);
const fechaB = moment(b.fecha);
return fechaB.diff(fechaA);
});

}

// Trae los cdas registrados para el paciente
buscarCDAPacientes(token) {
this.servicioPrestacion.getCDAByPaciente(this.paciente.id, token).subscribe(registros => {
this.cdas = registros.map(cda => {
cda.id = cda.cda_id;
return {
data: cda,
tipo: 'cda',
prestacion: cda.prestacion.snomed,
profesional: cda.profesional ? `${cda.profesional.apellido} ${cda.profesional.nombre}` : '',
fecha: cda.fecha,
estado: 'validada',
ambito: 'ambulatorio',
organizacion: cda.organizacion.id
};
});
this.prestaciones = this.prestacionesCopia;
// filtramos las vacunas y laboratorios por ahora para que se listan por separado
this.vacunas = this.cdas.filter(cda => cda.prestacion.conceptId === ConceptosTurneablesService.Vacunas_CDA_ID);
this.laboratorios = this.cdas.filter(cda => cda.prestacion.conceptId === ConceptosTurneablesService.Laboratorio_CDA_ID
|| cda.prestacion.conceptId === ConceptosTurneablesService.Laboratorio_SISA_CDA_ID);

// DEjamos el resto de los CDAS y los unimos a las prestaciones
const filtro = this.cdas.filter(cda => {
return cda.prestacion.conceptId !== ConceptosTurneablesService.Vacunas_CDA_ID
&& cda.prestacion.conceptId !== ConceptosTurneablesService.Laboratorio_CDA_ID
&& cda.prestacion.conceptId !== ConceptosTurneablesService.Laboratorio_SISA_CDA_ID;
});
// Filtramos por CDA para poder recargar los estudiosc
this.prestaciones = [...this.prestaciones.filter(e => e.tipo !== 'cda'), ...filtro];
this.tiposPrestacion = this._prestaciones.map(p => p.prestacion);
this.prestacionesCopia = this.prestaciones.slice();
this.filtrar();
const { estado, documento: dni, fechaNacimiento, apellido } = this.paciente;
const fecNac = moment(fechaNacimiento).format('yyyyMMDD');
const fechaHta = moment().format('yyyyMMDD');

forkJoin({
protocolos: this.laboratorioService.getProtocolos({ estado, dni, fecNac, apellido, fechaDde: '20200101', fechaHta }),
cdaByPaciente: this.servicioPrestacion.getCDAByPaciente(this.paciente.id, token)
}).subscribe({
next: (resultados) => {
const protocolos = resultados.protocolos || [];

this.servicioPrestacion.getCDAByPaciente(this.paciente.id, token).subscribe(registros => {
this.cdas = registros.map(cda => {
cda.id = cda.cda_id;
return {
data: cda,
tipo: 'cda',
prestacion: cda.prestacion.snomed,
profesional: cda.profesional ? `${cda.profesional.apellido} ${cda.profesional.nombre}` : '',
fecha: cda.fecha,
estado: 'validada',
ambito: 'ambulatorio',
organizacion: cda.organizacion.id
};
});
this.prestaciones = this.prestacionesCopia;
// filtramos las vacunas y laboratorios por ahora para que se listan por separado
this.vacunas = this.cdas.filter(cda => cda.prestacion.conceptId === ConceptosTurneablesService.Vacunas_CDA_ID);
this.laboratorios = this.cdas.filter(cda => cda.prestacion.conceptId === ConceptosTurneablesService.Laboratorio_CDA_ID
|| cda.prestacion.conceptId === ConceptosTurneablesService.Laboratorio_SISA_CDA_ID);

this.laboratorios = this.ordenarLaboratorios(this.laboratorios, protocolos);

// DEjamos el resto de los CDAS y los unimos a las prestaciones
const filtro = this.cdas.filter(cda => {
return cda.prestacion.conceptId !== ConceptosTurneablesService.Vacunas_CDA_ID
&& cda.prestacion.conceptId !== ConceptosTurneablesService.Laboratorio_CDA_ID
&& cda.prestacion.conceptId !== ConceptosTurneablesService.Laboratorio_SISA_CDA_ID;
});
// Filtramos por CDA para poder recargar los estudiosc
this.prestaciones = [...this.prestaciones.filter(e => e.tipo !== 'cda'), ...filtro];
this.tiposPrestacion = this._prestaciones.map(p => p.prestacion);
this.prestacionesCopia = this.prestaciones.slice();
this.filtrar();
});
}
});
}

Expand Down
43 changes: 31 additions & 12 deletions src/app/modules/rup/components/ejecucion/hudsBusqueda.html
Original file line number Diff line number Diff line change
Expand Up @@ -584,7 +584,7 @@ <h6 class="titulo-filtro {{filtroActual}}">{{ getTitulo(filtroActual) | uppercas
<ng-container *ngFor="let laboratorio of laboratorios; let iLaboratorio = index">
<li>
<div class="rup-card mini laboratorio"
[ngClass]="{'active': huds.isOpen(laboratorio.data, 'cda')}">
[ngClass]="{'active': huds.isOpen(laboratorio, laboratorio.idProtocolo ? 'laboratorio' : 'cda')}">
<div class="rup-header">
<div class="rup-border rup-border-laboratorio">
<div class="row p-0 m-0 border-secondary border-left-0">
Expand All @@ -596,21 +596,40 @@ <h6 class="titulo-filtro {{filtroActual}}">{{ getTitulo(filtroActual) | uppercas
</div>
</ng-container>
<div class="col p-0 pl-2 float-left"
(click)="emitTabs(laboratorio, 'cda', iLaboratorio)">
{{ laboratorio?.prestacion.term }}
(click)="emitTabs(laboratorio, laboratorio.idProtocolo ? 'laboratorio' : 'cda', iLaboratorio)">
<div>
<small>
<span *ngIf="laboratorio?.prestacion?.term">{{
laboratorio?.prestacion?.term}}</span>
<span *ngIf="laboratorio?.idProtocolo">Informe de
laboratorio:
<b>Protocolo {{laboratorio?.idProtocolo}}</b>
</span>
</small>
</div>
<div class="row p-0 m-0">
<div class="col-10 p-0 m-0">
<div class="text-sm">
Solicitante:
{{laboratorio?.profesional?.nombre}}
<div *ngIf="laboratorio?.documento">
<small>Paciente: <b>{{ laboratorio?.apellido
}}, {{
laboratorio?.nombre }}</b></small>
</div>
<div class="text-sm">
Organización:
{{laboratorio?.data.organizacion?.nombre }}
<div>
<small>Organización: <b>{{
laboratorio?.data?.organizacion?.nombre ||
laboratorio?.efectorSolicitante
}}</b></small>
</div>
<div *ngIf="laboratorio?.fecha " class="text-xs">
<small>Fecha: <b>{{laboratorio?.fecha |
fecha}}</b></small>
</div>
<div *ngIf="laboratorio?.efectorSolicitante || laboratorio?.profesional"
class="text-sm">
<small>Médico solicitante: <b>{{
laboratorio?.medicoSolicitante ||
laboratorio?.profesional }}</b></small>
</div>
<small class="sugerido">
Fecha: {{laboratorio?.fecha | fecha}}
</small>
</div>
</div>
</div>
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
import { Component, Input, OnInit } from '@angular/core';
import { LaboratorioService } from 'projects/portal/src/app/services/laboratorio.service';

@Component({
selector: 'vista-laboratorio',
templateUrl: 'vista-laboratorio.html',
styleUrls: ['vista-laboratorio.scss'],
})

export class VistaLaboratorioComponent implements OnInit {

constructor(private laboratorioService: LaboratorioService) { }

public gruposLaboratorio;
public laboratorios: any = {};

@Input() protocolo;
@Input() index: number;

ngOnInit(): void {
const id = this.protocolo.data.idProtocolo;

this.laboratorioService.getByProtocolo(id).subscribe((resultados) => {
this.laboratorios = this.groupByArea(resultados[0].Data);
this.gruposLaboratorio = Object.keys(this.laboratorios);
});

}

public groupByArea(data: any): { [key: string]: any[] } {
return data?.reduce((acc, item) => {
if (!acc[item.grupo]) {
acc[item.grupo] = [];
}
acc[item.grupo].push(item);
return acc;
}, {} as { [key: string]: any[] });
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
<ng-container>
<div justify class="w-100">
<div class="info-basica">
<div class="d-flex flex-column">
<plex-badge type="info">
Protocolo {{protocolo.data.idProtocolo}}
</plex-badge>
<b class="mt-1">{{protocolo.data.fecha | fecha}} {{protocolo.data.fecha | hora}}hs</b>
</div>
<plex-grid type="full" cols="3" size="sm">
<div class="datos"><span>Medico solicitante</span><b>{{protocolo.data.medicoSolicitante}}</b></div>
<div class="datos"><span>Origen</span><b>{{protocolo.data.origen}}</b></div>
<div class="datos"><span>Efector</span><b>{{protocolo.data.efectorSolicitante}}</b></div>
</plex-grid>
</div>
</div>
<div class="w-100 mt-2">
<plex-title titulo="Resultados" size="md"></plex-title>
<table class="table table-striped table-hover">
<thead class="text-center">
<tr>
<th></th>
<th class="text-center">Resultado</th>
<th class="text-center">Referencia/Método</th>
<th class="text-center">Profesional</th>
</tr>
</thead>
<tbody *ngFor="let grupo of this.gruposLaboratorio">
<tr>
<th class="titulo-grupo"><b>{{grupo}}</b></th>
</tr>
<tr *ngFor="let resultado of laboratorios[grupo]" class="align-items-center">
<td><b>{{resultado.item}}</b></td>
<td class="text-center">{{resultado.resultado}}</td>
<td class="text-center">{{resultado.valorReferencia}}{{ resultado.Metodo ? '/' + resultado.Metodo : '' }}</td>
<td class="text-center"><plex-badge type="info" size="sm">{{resultado.userValida}}</plex-badge></td>
</tr>
</tbody>
</table>
</div>
</ng-container>
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
$blue: #00a8e0;
$lightblue: #d6f7ff;

.info-basica {
padding: 15px;
border: solid 1px $blue;
border-radius: 8px;
margin-top: 10px;
width: 100%;
display: flex;
gap: 5%;
font-size: smaller;

}

.info-basica .datos {
display: flex;
flex-direction: column;
text-align: center;
}

.titulo-grupo {
background-color: #fff;
color: $blue;
}

table {
tr {
border: 1px solid white;
}

td {
font-size: small;
vertical-align: middle;
}

thead {
th {
border-top: none;
}
}

tbody {
tr:hover {
background-color: $lightblue;
border: 1px solid $blue;

td {
border-top: 1px solid $blue;
border-bottom: 1px solid $blue;
}
}
}
}
9 changes: 9 additions & 0 deletions src/app/modules/rup/components/ejecucion/vistaHuds.html
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,16 @@
<vista-prestacion [prestacion]="prestacion" [paciente]="paciente">
</vista-prestacion>
</ng-container>
</plex-tab>

<plex-tab *ngIf="registro.tipo === 'laboratorio'" [allowClose]="true"
label="Informe de Laboratorio">
<vista-laboratorio [protocolo]="registro"></vista-laboratorio>
</plex-tab>

<plex-tab [allowClose]="true" [label]="registro.data.solicitud.tipoPrestacion.term"
[class]="registro.class" *ngIf="registro.tipo === 'solicitud'">
<vista-solicitud-top [registro]="registro.data"></vista-solicitud-top>
</plex-tab>

<plex-tab *ngIf="registro.tipo === 'cda'" [allowClose]="true"
Expand Down
Loading

0 comments on commit 0b08ba1

Please sign in to comment.