Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 17 additions & 13 deletions src/app/components/turnos/dashboard/estadisticas-pacientes.html
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
</plex-tab>
<plex-tab icon="clock" label="Turnos">
<turnos-paciente [paciente]='paciente' [turnos]="turnosPaciente$ | async" [operacion]="'operacionTurnos'"
(turnosPacienteChanged)="refresh()" *plTab>
(turnosPacienteChanged)="refresh()" *plTab>
</turnos-paciente>
<ng-container *ngIf="demandaInsatisfecha">
<demandaInsatisfecha (demandaCerrada)="cerrarDemandaInsatisfecha()" [paciente]='paciente'>
Expand All @@ -22,27 +22,27 @@
<plex-title size="sm" titulo="Historial de turnos"></plex-title>
<plex-wrapper>
<plex-datetime grow="1" type="date" [(ngModel)]="fechaDesde" name="fechaDesde" [debounce]="600"
label="Fecha desde" class="fechas" (change)="filtrar()" [max]="fechaHasta">
label="Fecha desde" class="fechas" (change)="filtrar()" [max]="fechaHasta">
</plex-datetime>
<plex-datetime grow="1" type="date" [(ngModel)]="fechaHasta" name="fechaHasta" [debounce]="600"
label="Fecha hasta" class="fechas" (change)="filtrar()" [min]="fechaDesde">
label="Fecha hasta" class="fechas" (change)="filtrar()" [min]="fechaDesde">
</plex-datetime>
<plex-select [(ngModel)]="estadoTurno" name="estadoTurno" label="Estado" [data]="estados"
(change)="filtrar()"></plex-select>
(change)="filtrar()"></plex-select>
<plex-select label="Prestación" name="prestacion" [(ngModel)]="prestacion" labelField="term"
tmPrestaciones="rup:tipoPrestacion:?" [preload]="true" (change)="filtrar()">
tmPrestaciones="rup:tipoPrestacion:?" [preload]="true" (change)="filtrar()">
</plex-select>
</plex-wrapper>

<ng-container *ngIf="(ultimosTurnos$ | async) as ultimosTurnos">
<div class="contenedor-turnos-vacio" *ngIf="!ultimosTurnos?.length" justify="center">
<plex-label class="label-turnos-vacio" icon="turno-bold" type="info" size="lg" direction="column"
titulo="No se han encontrado turnos registrados para el paciente.">
titulo="No se han encontrado turnos registrados para el paciente.">
</plex-label>
</div>
<ng-container *ngIf="ultimosTurnos?.length">
<plex-table [columns]="columns" #table="plTable" (scroll)="onScroll()" [height]="580"
[headOpacity]="10">
[headOpacity]="10">
<plex-table-columns>
</plex-table-columns>

Expand All @@ -69,21 +69,25 @@
</td>
<td *plTableCol="'estado'">
<plex-badge *ngIf="turno.asistencia === 'noAsistio' && turno.estado !== 'suspendido'"
type="danger">NO ASISTIÓ</plex-badge>
type="danger">NO ASISTIÓ</plex-badge>
<plex-badge *ngIf="turno.estado === 'fuera-agenda'" type="warning">
FUERA DE AGENDA</plex-badge>
<plex-badge *ngIf="turno.asistencia !== 'noAsistio' && (turno.estado === 'asignado' || turno.estado === 'turnoDoble')"
type="success">
<plex-badge
*ngIf="turno.asistencia !== 'noAsistio' && (turno.estado === 'asignado' || turno.estado === 'turnoDoble')"
type="success">
ASIGNADO</plex-badge>
<plex-badge *ngIf="turno.estado === 'liberado' || turno.estado === 'suspendido'"
type="danger"
[hint]="turno.estado === 'liberado' ? motivoLiberado(turno) : (turno.reasignado) ? 'Reasignado' : null"
hintType="danger" detach="top">
type="danger"
[hint]="turno.estado === 'liberado' ? motivoLiberado(turno) : (turno.reasignado) ? 'Reasignado' : null"
hintType="danger" detach="top">
{{ turno.estado | uppercase }}
</plex-badge>
</td>
</tr>
</plex-table>
<plex-button modal right type="success" (click)="closeModal(0, formulario.form)">
ACEPTAR
</plex-button>
</ng-container>
</ng-container>
</fieldset>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,6 @@ import { Auth } from '@andes/auth';
import { Plex } from '@andes/plex';
import { AfterContentInit, Component, EventEmitter, Input, OnChanges, OnDestroy, OnInit, Optional, Output, SimpleChanges, ViewEncapsulation } from '@angular/core';
import * as moment from 'moment';
import { LaboratorioService } from 'src/app/services/laboratorio.service';
import { RecetaService } from 'src/app/services/receta.service';
import { Observable, forkJoin } from 'rxjs';
import { switchMap } from 'rxjs/operators';
import { InternacionResumenHTTP } from 'src/app/apps/rup/mapa-camas/services/resumen-internacion.http';
Expand All @@ -12,7 +10,9 @@ 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';
import { LaboratorioService } from 'src/app/services/laboratorio.service';
import { ProfesionalService } from 'src/app/services/profesional.service';
import { RecetaService } from 'src/app/services/receta.service';
import { gtag } from '../../../../shared/services/analytics.service';
import { IPrestacion } from '../../interfaces/prestacion.interface';
import { getSemanticClass } from '../../pipes/semantic-class.pipes';
Expand Down Expand Up @@ -86,6 +86,7 @@ export class HudsBusquedaComponent implements AfterContentInit, OnInit, OnDestro
});
}


public todos: any = [];
public solicitudes: any = [];
public solicitudesTOP: any = [];
Expand Down Expand Up @@ -147,6 +148,7 @@ export class HudsBusquedaComponent implements AfterContentInit, OnInit, OnDestro
public filtroRecetas;
public searchRecetas;
public busquedaRecetas;
public busquedaRecetasOriginal;
public motivosSuspension;
public motivoSuspensionSelector;
public seleccionRecetas = [];
Expand Down Expand Up @@ -243,6 +245,10 @@ export class HudsBusquedaComponent implements AfterContentInit, OnInit, OnDestro
this.permisosVac ? 'vacunas' :
'recetas';
this.pacienteSelected = this.paciente;

if (this.filtroActual === 'recetas') {
this.showFiltros = true;
}
}

ngOnChanges(changes: SimpleChanges) {
Expand Down Expand Up @@ -273,11 +279,26 @@ export class HudsBusquedaComponent implements AfterContentInit, OnInit, OnDestro
this._onDragEnd.emit(e);
}

public tiposPrescripcion = [
{ id: 'medicamento', nombre: 'Medicamento' },
{ id: 'insumo', nombre: 'Dispositivos / Insumos' },
{ id: 'alimentacion', nombre: 'Alimentación' },
{ id: 'magistral', nombre: 'Magistrales' }
];
public tipoPrescripcionSeleccionado = this.tiposPrescripcion[0];
public fechaInicioRecetas;
public fechaFinRecetas;

toogleFiltros() {
this.showFiltros = !this.showFiltros;
if (!this.showFiltros) {
this.fechaInicio = this.fechaFin = this.prestacionSeleccionada = null;
this.fechaInicioRecetas = this.fechaFinRecetas = null;
this.tipoPrescripcionSeleccionado = this.tiposPrescripcion[0];
this.filtrar();
if (this.filtroActual === 'recetas') {
this.filtrarRecetas();
}
}
}

Expand Down Expand Up @@ -756,7 +777,7 @@ export class HudsBusquedaComponent implements AfterContentInit, OnInit, OnDestro
case 'solicitudes':
return this.solicitudesMezcladas.length;
case 'recetas':
return this.busquedaRecetas?.length;
return this.busquedaRecetasOriginal?.length;
case 'registro':
return this.registrosTotalesCopia.registro.length;
}
Expand All @@ -768,6 +789,9 @@ export class HudsBusquedaComponent implements AfterContentInit, OnInit, OnDestro
if (key === 'planes') {
this.setAmbitoOrigen('ambulatorio');
}
if (key === 'recetas') {
this.showFiltros = true;
}
}

mostrarItem(item) {
Expand Down Expand Up @@ -945,22 +969,64 @@ export class HudsBusquedaComponent implements AfterContentInit, OnInit, OnDestro
filtrarRecetas() {
const searchTerm = this.searchRecetas?.toLowerCase() || '';

if (!searchTerm && !this.filtroRecetas) {
this.groupRecetas();
if (!searchTerm && !this.filtroRecetas && !this.tipoPrescripcionSeleccionado && !this.fechaInicioRecetas && !this.fechaFinRecetas) {
this.busquedaRecetas = this.busquedaRecetasOriginal;
return;
}

let filteredRecetas = this.busquedaRecetas;
let filteredRecetas = this.busquedaRecetasOriginal;

if (searchTerm) {
filteredRecetas = filteredRecetas.filter(group => {
return group.recetas[0].medicamento.concepto.term.toLowerCase().includes(searchTerm);
});
}

if (this.fechaInicioRecetas || this.fechaFinRecetas) {
const fechaInicio = this.fechaInicioRecetas ? moment(this.fechaInicioRecetas).startOf('day') : null;
const fechaFin = this.fechaFinRecetas ? moment(this.fechaFinRecetas).endOf('day') : null;

filteredRecetas = filteredRecetas.filter(group => {
const fecha = moment(group.recetaVisible.fechaRegistro);
if (fechaInicio && fecha.isBefore(fechaInicio)) {
return false;
}
if (fechaFin && fecha.isAfter(fechaFin)) {
return false;
}
return true;
});
}

if (this.tipoPrescripcionSeleccionado) {
const tipo = this.tipoPrescripcionSeleccionado.id;
filteredRecetas = filteredRecetas.filter(group => {
const medicamento = group.recetaVisible.medicamento;
const concept = medicamento.concepto;
const semanticTag = concept.semanticTag;
const term = concept.term.toLowerCase();

switch (tipo) {
case 'medicamento':
return true;
case 'insumo':
return (semanticTag === 'objeto físico' || semanticTag === 'producto') && !term.includes('alimentacion') && !term.includes('fórmula');
case 'alimentacion':
// Assuming semantic tag is 'producto' but checking term for 'alimentacion' as heuristic
return semanticTag === 'producto' && (term.includes('alimentacion') || term.includes('fórmula') || term.includes('leche'));
case 'magistral':
// Check if properties indicate magistral, currently no explicit property known, might be in concept term
return term.includes('magistral');
default:
return true;
}
});
}

if (this.filtroRecetas) {
filteredRecetas = filteredRecetas.reduce((acc, receta) => {
const vigenteRecetas = receta.recetas.filter(r => r.estadoActual.tipo === 'vigente');

if (vigenteRecetas.length > 0) {
acc.push({
conceptId: receta.conceptId,
Expand Down Expand Up @@ -1005,6 +1071,7 @@ export class HudsBusquedaComponent implements AfterContentInit, OnInit, OnDestro

}))
);
this.busquedaRecetasOriginal = this.busquedaRecetas;
});
}

Expand Down Expand Up @@ -1103,4 +1170,20 @@ export class HudsBusquedaComponent implements AfterContentInit, OnInit, OnDestro
return 'info';
}
}

checkDispensaAnticipada(receta) {
if (receta.estadoDispensaActual && receta.estadoDispensaActual.fecha) {
const fechaDispensa = moment(receta.estadoDispensaActual.fecha);
const fechaRegistro = moment(receta.fechaRegistro);

if (fechaDispensa.isBefore(fechaRegistro)) {
if (receta.estadoActual.tipo === 'finalizada') {
return 'dispensa anticipada';
} else if (receta.estadoActual.tipo === 'pendiente') {
return 'dispensa parcial anticipada';
}
}
}
return null;
}
}
50 changes: 36 additions & 14 deletions src/app/modules/rup/components/ejecucion/hudsBusqueda.html
Original file line number Diff line number Diff line change
Expand Up @@ -32,16 +32,16 @@ <h6 class="titulo-filtro {{filtroActual}}">{{ getTitulo(filtroActual) | uppercas
tooltip="Buscar nuevos registros" [disabled]="disabledBtnCDA" (click)="regenerarCDA()">
</plex-button>
</div>

<suspender-medicacion *ngIf="filtroActual==='recetas' && seleccionRecetas.length > 0"
[seleccionRecetas]="seleccionSuspender" [motivoSelector]="motivoSuspensionSelector"
[motivosSuspension]="motivosSuspension" [profesional]="profesional" (reset)="resetSeleccionRecetas()">
</suspender-medicacion>
</div>
<div class="grow" *ngIf="filtroActual === 'planes'">
<plex-options class="filtros-ambitos" (activated)='setAmbitoOrigen($event)' [items]="filtrosAmbitos">
<div class="grow d-flex w-100" *ngIf="filtroActual === 'planes' || filtroActual === 'recetas'">
<plex-options *ngIf="filtroActual === 'planes'" class="filtros-ambitos" (activated)='setAmbitoOrigen($event)'
[items]="filtrosAmbitos">
</plex-options>
<div class="ml-1">
<div class="d-flex align-items-center justify-content-end">
<suspender-medicacion *ngIf="filtroActual==='recetas' && seleccionRecetas.length > 0"
[seleccionRecetas]="seleccionSuspender" [motivoSelector]="motivoSuspensionSelector"
[motivosSuspension]="motivosSuspension" [profesional]="profesional" (reset)="resetSeleccionRecetas()">
</suspender-medicacion>
<plex-button type="info" size="sm" [icon]="showFiltros ? 'chevron-up' : 'chevron-down'"
[title]="showFiltros ? 'Cerrar filtros' : 'Ver filtros'" class="float-right" tooltipPosition="left"
(click)="toogleFiltros()">
Expand All @@ -68,6 +68,28 @@ <h6 class="titulo-filtro {{filtroActual}}">{{ getTitulo(filtroActual) | uppercas

<!-- Vista Recetas -->
<ng-container *ngIf="filtroActual === 'recetas'">
<ng-container *ngIf="showFiltros">
<div class="row">
<div class="col-12">
<plex-select [(ngModel)]="tipoPrescripcionSeleccionado" label="Tipo de prescripción"
[data]="tiposPrescripcion" idField="id" labelField="nombre" (change)="filtrarRecetas()"
[readonly]="true">
</plex-select>
</div>
</div>
<div class="row pb-2">
<div class="col-6">
<plex-datetime type="date" [(ngModel)]="fechaInicioRecetas" (change)="filtrarRecetas()"
name="fechaInicioRecetas" label="Fecha Desde" [debounce]="400">
</plex-datetime>
</div>
<div class="col-6">
<plex-datetime type="date" [(ngModel)]="fechaFinRecetas" (change)="filtrarRecetas()"
name="fechaFinRecetas" label="Fecha Hasta" [debounce]="400">
</plex-datetime>
</div>
</div>
</ng-container>
<plex-text [(ngModel)]="searchRecetas" name="searchRecetas" (change)="filtrarRecetas()"
placeholder="Buscar recetas..." [autoFocus]="true">
</plex-text>
Expand Down Expand Up @@ -883,11 +905,11 @@ <h6 class="titulo-filtro {{filtroActual}}">{{ getTitulo(filtroActual) | uppercas
<ng-container *ngFor="let registro of derivaciones; let iDerivacion = index">
<li>
<div class="rup-card mini recc"
[ngClass]="{'active': huds.isOpen(registro, 'recc'), 'recc': true}"
(click)="clickDerivacion(registro, iDerivacion)">
[ngClass]="{'active': huds.isOpen(registro, 'recc'), 'recc': true}"
(click)="clickDerivacion(registro, iDerivacion)">
<div class="rup-header">
<div class="rup-border rup-border-recc"
[ngClass]="{'active': huds.isOpen(registro, 'recc') , 'rup-border-recc': true}">
[ngClass]="{'active': huds.isOpen(registro, 'recc') , 'rup-border-recc': true}">
<div class="row p-0 m-0 border-secondary border-left-0">
<div class="col-10 p-0 m-0">
<div class="row m-0 p-0">
Expand All @@ -908,12 +930,12 @@ <h6 class="titulo-filtro {{filtroActual}}">{{ getTitulo(filtroActual) | uppercas
<br>
<small>Profesional:
<ng-container
*ngIf='registro.profesionalSolicitante'>
*ngIf='registro.profesionalSolicitante'>
{{ registro.profesionalSolicitante |
nombre }}
</ng-container>
<ng-container
*ngIf='!registro.profesionalSolicitante'>
*ngIf='!registro.profesionalSolicitante'>
No existe
</ng-container>
</small>
Expand All @@ -934,7 +956,7 @@ <h6 class="titulo-filtro {{filtroActual}}">{{ getTitulo(filtroActual) | uppercas
<hr class="mt-0">
<div class="item-lista-vacia">
<plex-label size="sm" justify="center" icon="adi adi-mano-corazon"
titulo="No hay derivaciones registradas">
titulo="No hay derivaciones registradas">
</plex-label>
</div>
</div>
Expand Down
Loading
Loading