From 1960abda425d94a99ceac6b52790910319223cfa Mon Sep 17 00:00:00 2001 From: ma7payne Date: Wed, 10 Jul 2024 11:53:47 -0300 Subject: [PATCH] feat(CIT): Implementa mockups de demanda insatisfecha --- src/app/app.module.ts | 2 + src/app/app.routing.ts | 2 + .../demanda-insatisfecha.component.ts | 186 ++++++++++++++++++ .../demanda-insatisfecha.html | 171 ++++++++++++++++ src/app/components/turnos/citas.module.ts | 5 +- .../estadisticas-pacientes.component.ts | 1 - src/app/interfaces/turnos/IListaEspera.ts | 6 + 7 files changed, 371 insertions(+), 2 deletions(-) create mode 100644 src/app/components/demandaInsatisfecha/demanda-insatisfecha.component.ts create mode 100644 src/app/components/demandaInsatisfecha/demanda-insatisfecha.html diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 0933f1960d..3c93a0236a 100755 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -148,6 +148,7 @@ import { MPILibModule } from './modules/mpi/mpi-lib.module'; import { FormulaBaseService } from './modules/rup/components/formulas'; import { RiesgoCardiovascularService } from './modules/rup/components/formulas/riesgoCardiovascular.service'; import { demandaInsatisfechaComponent } from './components/turnos/dashboard/demandaInsatisfecha'; + // INTERNACION import { PuntoInicioInternacionComponent } from './modules/rup/components/internacion/puntoInicio-internacion.component'; import { RUPLibModule } from './modules/rup/rup-lib.module'; @@ -221,6 +222,7 @@ import { LogoSvgComponent } from './styles/logo.svg'; import { MapsComponent } from './utils/mapsComponent'; import { PermisosComponent } from './utils/permisos/permisos.component'; + registerLocaleData(localeEs, 'es'); // Main module diff --git a/src/app/app.routing.ts b/src/app/app.routing.ts index 395cf2c6da..4e556c56f6 100644 --- a/src/app/app.routing.ts +++ b/src/app/app.routing.ts @@ -40,6 +40,7 @@ import { PacienteComponent } from './core/mpi/components/paciente.component'; // Internacion import { PuntoInicioInternacionComponent } from './modules/rup/components/internacion/puntoInicio-internacion.component'; import { ValidarCertificadoComponent } from './modules/epidemiologia/components/validar-certificado/validar-certificado.component'; +import { DemandaInsatisfechaComponent } from './components/demandaInsatisfecha/demanda-insatisfecha.component'; const appRoutes: Routes = [ @@ -87,6 +88,7 @@ const appRoutes: Routes = [ { path: 'citas/sobreturnos/:idAgenda', component: AgregarSobreturnoComponent, canActivate: [RoutingNavBar, RoutingGuard] }, { path: 'citas/paciente/:idAgenda', component: AgregarPacienteComponent, canActivate: [RoutingNavBar, RoutingGuard] }, { path: 'citas/prestaciones_habilitadas', component: PrestacionesHabilitadasComponent, canActivate: [RoutingNavBar, RoutingGuard] }, + { path: 'citas/demanda-insatisfecha', component: DemandaInsatisfechaComponent, canActivate: [RoutingNavBar] }, { path: 'rup', diff --git a/src/app/components/demandaInsatisfecha/demanda-insatisfecha.component.ts b/src/app/components/demandaInsatisfecha/demanda-insatisfecha.component.ts new file mode 100644 index 0000000000..9de9c3f6fe --- /dev/null +++ b/src/app/components/demandaInsatisfecha/demanda-insatisfecha.component.ts @@ -0,0 +1,186 @@ + +import { Auth } from '@andes/auth'; +import { Plex } from '@andes/plex'; +import { Component, OnInit, ViewChild } from '@angular/core'; +import { NgForm } from '@angular/forms'; +import { map } from 'rxjs/operators'; +import { ILlamado } from 'src/app/interfaces/turnos/IListaEspera'; +import { ListaEsperaService } from 'src/app/services/turnos/listaEspera.service'; +import { TurnoService } from 'src/app/services/turnos/turno.service'; + +@Component({ + selector: 'demanda-insatisfecha', + templateUrl: 'demanda-insatisfecha.html' +}) + +export class DemandaInsatisfechaComponent implements OnInit { + public listaEspera = []; + public listaLlamados = []; + public listaHistorial = []; + public itemSelected = null; + public filtros: any = {}; + public selectorPrestacion; + public selectorMotivo; + public selectorEstadoLlamado; + public selectedPaciente; + public nuevoLlamado: ILlamado = {}; + public estadosLlamado = [ + { id: 'turnoAsignado', nombre: 'Turno asignado' }, + { id: 'noContesta', nombre: 'No contesta' }, + { id: 'numeroEquivocado', nombre: 'Numero equivocado' }, + { id: 'otro', nombre: 'Otro' } + ]; + + public verFormularioLlamado = false; + + public motivos = [ + { id: 1, nombre: 'No existe la oferta en el efector' }, + { id: 2, nombre: 'No hay turnos disponibles' }, + { id: 3, nombre: 'Oferta rechazada por el paciente' } + ]; + + public columns = [ + { + key: 'paciente', + label: 'Paciente' + }, + { + key: 'prestacion', + label: 'Prestación' + }, + { + key: 'fecha', + label: 'Fecha' + }, + { + key: 'motivo', + label: 'Motivo' + }, + { + key: 'estado', + } + ]; + + public tabIndex = 0; + public pacienteFields = ['sexo', 'fechaNacimiento', 'cuil', 'financiador', 'numeroAfiliado', 'direccion']; + + @ViewChild('formLlamados', { read: NgForm }) formLlamados: NgForm; + + constructor( + private listaEsperaService: ListaEsperaService, + private plex: Plex, + private auth: Auth, + private serviceTurno: TurnoService) { } + + ngOnInit(): void { + this.getDemandas({}); + } + + private getDemandas(filtros) { + this.listaEsperaService.get({ ...filtros, estado: 'pendiente' }).subscribe((listaEspera: any[]) => { + this.listaEspera = listaEspera; + this.listaEspera.forEach(item => { + item.motivos = item.demandas.map(({ motivo }) => motivo); + }); + }); + } + + public obtenerObjetoMasAntiguo() { + if (this.listaEspera.length === 0) { + return null; + } + + return this.listaEspera.reduce((masAntiguo, item) => { + return item.fecha < masAntiguo.fecha ? item : masAntiguo; + }); + } + + public getHistorial(historial) { + const primerDemanda = this.listaEspera.reduce((masAntiguo, item) => { + return item.fecha < masAntiguo.fecha ? item : masAntiguo; + }); + + if (historial) { + this.serviceTurno.getHistorial({ pacienteId: this.itemSelected.paciente.id }).pipe( + map(historial => historial.filter(item => moment(item.fechaHoraDacion).isAfter(moment(primerDemanda.fecha)))) + ).subscribe(historialFiltrado => { + this.listaHistorial = historialFiltrado; + }); + } + } + + public cambiarTab(value) { + this.tabIndex = value; + } + + public seleccionarDemanda(demanda) { + this.itemSelected = demanda; + this.listaHistorial = null; + this.tabIndex = 0; + this.listaLlamados = !this.itemSelected.llamados ? [] : [...this.itemSelected.llamados]; + } + + public actualizarDemanda(demanda) { + const i = this.listaEspera.findIndex(item => item.id === demanda.id); + this.listaEspera[i] = demanda; + } + + public refreshSelection({ value }, tipo) { + if (tipo === 'paciente') { + this.filtros = { ...this.filtros, paciente: value }; + } + + if (tipo === 'fechaDesde') { + this.filtros = { ...this.filtros, fechaDesde: value }; + } + + if (tipo === 'fechaHasta') { + this.filtros = { ...this.filtros, fechaHasta: value }; + } + + if (tipo === 'prestacion') { + this.filtros = { ...this.filtros, prestacion: value?.term }; + } + + if (tipo === 'motivo') { + this.filtros = { ...this.filtros, motivo: value?.nombre }; + } + + this.getDemandas(this.filtros); + } + + public cerrar() { this.itemSelected = null; } + + public agregarLlamado() { + this.verFormularioLlamado = !this.verFormularioLlamado; + this.nuevoLlamado = {}; + this.formLlamados?.reset({}); + this.formLlamados?.form.markAsPristine(); + } + + public async guardarLlamado(id) { + this.formLlamados.control.markAllAsTouched(); + + if (this.formLlamados.form.valid) { + try { + this.listaLlamados.push({ ...this.nuevoLlamado, createdBy: this.auth.usuario, createdAt: moment() }); + + this.listaEsperaService.patch(id, 'llamados', this.listaLlamados).subscribe((demanda) => { + this.plex.toast('success', 'Llamado registrado exitosamente'); + this.agregarLlamado(); + this.actualizarDemanda(demanda); + }); + } catch (error) { + this.plex.toast('danger', 'Error al guardar el llamado'); + } + } + } + + public seleccionarEstadoLlamado() { + this.nuevoLlamado.estado = this.selectorEstadoLlamado?.nombre; + + if (this.selectorEstadoLlamado?.id !== 'otro') { + this.nuevoLlamado.comentario = null; + } + } +} diff --git a/src/app/components/demandaInsatisfecha/demanda-insatisfecha.html b/src/app/components/demandaInsatisfecha/demanda-insatisfecha.html new file mode 100644 index 0000000000..7699ac44a4 --- /dev/null +++ b/src/app/components/demandaInsatisfecha/demanda-insatisfecha.html @@ -0,0 +1,171 @@ + + + + + + + + + + + + + + + + + +
+ + +
+ + + + + {{item.paciente.nombreCompleto}} + {{item.tipoPrestacion.nombre}} + {{item.fecha | fecha}} + {{item.motivos}} + + + {{item.estado}} + + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {{ listaLlamados.length }} + + + + + + + + + + + + + +
+ + + + + + +
+
+ + + + + + + + + {{ llamado?.createdAt | fecha }} {{ llamado?.createdAt | hora }} + +
+ Otro + + + Otro + + + {{llamado.estado}} + +
+ +
+
+
+
+ + + + + + + + + + + +
+ + {{historial.estado}} + +
+ + + +
+
+
+
+
+
+
\ No newline at end of file diff --git a/src/app/components/turnos/citas.module.ts b/src/app/components/turnos/citas.module.ts index f6ba930c67..e239899e24 100644 --- a/src/app/components/turnos/citas.module.ts +++ b/src/app/components/turnos/citas.module.ts @@ -18,6 +18,8 @@ import { BotonesTurnosPipe } from './gestor-agendas/pipes/botonesTurnos.pipe'; import { InfoAgendaComponent } from './gestor-agendas/info-agenda.component'; import { SeleccionarFinanciadorComponent } from './dar-turnos/seleccionar-financiador.component'; import { PrestacionesHabilitadasComponent } from './gestor-agendas/prestaciones-habilitadas/prestaciones-habilitadas.component'; +import { DemandaInsatisfechaComponent } from '../demandaInsatisfecha/demanda-insatisfecha.component'; + @NgModule({ imports: [ CommonModule, @@ -40,7 +42,8 @@ import { PrestacionesHabilitadasComponent } from './gestor-agendas/prestaciones- BotonesTurnosPipe, InfoAgendaComponent, SeleccionarFinanciadorComponent, - PrestacionesHabilitadasComponent + PrestacionesHabilitadasComponent, + DemandaInsatisfechaComponent ], exports: [ DarTurnosComponent, diff --git a/src/app/components/turnos/dashboard/estadisticas-pacientes.component.ts b/src/app/components/turnos/dashboard/estadisticas-pacientes.component.ts index c09cd9d5f0..4e58da535f 100644 --- a/src/app/components/turnos/dashboard/estadisticas-pacientes.component.ts +++ b/src/app/components/turnos/dashboard/estadisticas-pacientes.component.ts @@ -59,5 +59,4 @@ export class EstadisticasPacientesComponent implements OnInit { cerrarDemandaInsatisfecha() { this.demandaCerrada.emit(); } - } diff --git a/src/app/interfaces/turnos/IListaEspera.ts b/src/app/interfaces/turnos/IListaEspera.ts index 721aa19797..496f81e5f9 100644 --- a/src/app/interfaces/turnos/IListaEspera.ts +++ b/src/app/interfaces/turnos/IListaEspera.ts @@ -31,4 +31,10 @@ export interface IListaEspera { motivo: String; observacion: String; }; + llamados?: ILlamado[]; +} + +export interface ILlamado { + estado?: string; + comentario?: string; }