From b57004d750c0ef60e57c9eb35aaedaa5197f3e29 Mon Sep 17 00:00:00 2001 From: Pancho Date: Mon, 15 Nov 2021 11:13:39 -0300 Subject: [PATCH] feat(citas): carga masiva --- src/app/app.module.ts | 5 +- .../gestor-agendas.component.ts | 79 ++++++++++++++++++- .../turnos/gestor-agendas/gestor-agendas.html | 33 +++++--- .../botones-agenda.component.ts | 13 +++ .../operaciones-agenda/botones-agenda.html | 4 + .../bi-queries/bi-queries.component.html | 7 +- .../bi-queries/bi-queries.component.ts | 15 +++- .../visualizacion-informacion.module.ts | 3 +- 8 files changed, 135 insertions(+), 24 deletions(-) diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 6c9cf56775..a2d8583655 100755 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -156,6 +156,7 @@ import { HUDSService } from './modules/rup/services/huds.service'; import { PlantillasService } from './modules/rup/services/plantillas.service'; import { PrestacionesService } from './modules/rup/services/prestaciones.service'; import { ResumenPacienteDinamicoService } from './modules/rup/services/resumenPaciente-dinamico.service'; +import { VisualizacionInformacionModule } from './modules/visualizacion-informacion/visualizacion-informacion.module'; import { AppMobileService } from './services/appMobile.service'; import { BarrioService } from './services/barrio.service'; import { ConceptosTurneablesService } from './services/conceptos-turneables.service'; @@ -245,7 +246,9 @@ registerLocaleData(localeEs, 'es'); AuditoriaModule, RecaptchaModule, RecaptchaFormsModule, - Ng2ImgMaxModule + Ng2ImgMaxModule, + VisualizacionInformacionModule + ], declarations: [ AppComponent, diff --git a/src/app/components/turnos/gestor-agendas/gestor-agendas.component.ts b/src/app/components/turnos/gestor-agendas/gestor-agendas.component.ts index d73338691d..1e820d363b 100644 --- a/src/app/components/turnos/gestor-agendas/gestor-agendas.component.ts +++ b/src/app/components/turnos/gestor-agendas/gestor-agendas.component.ts @@ -1,10 +1,12 @@ import { Auth } from '@andes/auth'; import { Plex } from '@andes/plex'; -import { Component, OnDestroy, OnInit, ViewChild, ViewContainerRef } from '@angular/core'; +import { Component, OnDestroy, OnInit, QueryList, ViewChild, ViewChildren, ViewContainerRef } from '@angular/core'; import { Router } from '@angular/router'; import * as moment from 'moment'; import { Subscription } from 'rxjs'; +import { BiQueriesComponent } from 'src/app/modules/visualizacion-informacion/components/bi-queries/bi-queries.component'; import { ConceptosTurneablesService } from 'src/app/services/conceptos-turneables.service'; +import { QueriesService } from 'src/app/services/query.service'; import { ITurno } from '../../../interfaces/turnos/ITurno'; import { InstitucionService } from '../../../services/turnos/institucion.service'; import { enumToArray } from '../../../utils/enums'; @@ -28,6 +30,8 @@ export class GestorAgendasComponent implements OnInit, OnDestroy { @ViewChild('guardarAgendaPanel', { static: false }) set setGuardarAgendaPanel(theElementRef: ViewContainerRef) { this.guardarAgendaPanel = theElementRef; } + @ViewChildren(BiQueriesComponent) biQuery: QueryList; + agendasSeleccionadas: IAgenda[] = []; turnosSeleccionados: ITurno[] = []; @@ -72,6 +76,7 @@ export class GestorAgendasComponent implements OnInit, OnDestroy { public puedeCrearAgenda: Boolean; public puedeRevisarAgendas: Boolean; private scrollEnd = false; + public enableQueries = false; // ultima request de profesionales que se almacena con el subscribe private lastRequestProf: Subscription; @@ -97,7 +102,9 @@ export class GestorAgendasComponent implements OnInit, OnDestroy { public serviceAgenda: AgendaService, public serviceInstitucion: InstitucionService, private router: Router, - public auth: Auth) { } + public auth: Auth, + private queryService: QueriesService, + ) { } /* limpiamos la request que se haya ejecutado */ ngOnDestroy() { @@ -693,4 +700,72 @@ export class GestorAgendasComponent implements OnInit, OnDestroy { this.showRevisionFueraAgenda = true; } + cargarPacientes() { + this.enableQueries = !this.enableQueries; + } + + asignarPacientesPorConsulta() { + let query; + const params = {}; + let invalidFormMsg; + this.biQuery.forEach(item => { + if (item.consultaSeleccionada) { + query = item.consultaSeleccionada.nombre; + item.argumentos.forEach(arg => { + const key = arg.key; + const value = item.argumentos[key]; + if (arg.required && !value) { + invalidFormMsg = 'Debe completar los filtros obligatorios'; + } + params[key] = value; + }); + } else { + invalidFormMsg = 'Debe seleccionar una lista de pacientes'; + } + }); + + if (invalidFormMsg) { + this.plex.info('warning', invalidFormMsg, 'Atención'); + } else { + this.queryService.getQuery(query, params).subscribe(res => { + this.asignarTurnosBulk(res); + }); + } + } + + asignarTurnosBulk(inscripciones) { + const pacientes = inscripciones.map(e => ({ + id: e.pacienteId, + nombre: e.nombre, + apellido: e.apellido, + documento: e.documento, + fechaNacimiento: moment(e.fechaNacimiento), + telefono: e.telefono, + sexo: e.sexo, + carpetaEfectores: [] + })); + + let turnos = []; + this.agendasSeleccionadas[0].bloques.forEach(b => { + const turnosDisponibles = b.turnos.filter(t => !t.paciente); + turnos = [...turnos, ...turnosDisponibles]; + }); + + let i = 0; + let end = pacientes.length; + if (end > turnos.length) { + end = turnos.length; + } + while (i < end) { + turnos[i].paciente = pacientes[i]; + turnos[i].estado = 'asignado'; + i++; + } + + this.serviceAgenda.save(this.agendasSeleccionadas[0]).subscribe(res => { + this.showTurnos = true; + this.enableQueries = false; + this.plex.toast('success', 'Asignación automática exitosa', '', 1000); + }); + } } diff --git a/src/app/components/turnos/gestor-agendas/gestor-agendas.html b/src/app/components/turnos/gestor-agendas/gestor-agendas.html index b5d4cd3b79..9b5558639d 100644 --- a/src/app/components/turnos/gestor-agendas/gestor-agendas.html +++ b/src/app/components/turnos/gestor-agendas/gestor-agendas.html @@ -7,18 +7,19 @@
- - + + @@ -166,7 +167,7 @@
- +
@@ -190,6 +191,12 @@
+ + + Cerrar + Importar + +
diff --git a/src/app/components/turnos/gestor-agendas/operaciones-agenda/botones-agenda.component.ts b/src/app/components/turnos/gestor-agendas/operaciones-agenda/botones-agenda.component.ts index 518b3387e6..a07881b86d 100644 --- a/src/app/components/turnos/gestor-agendas/operaciones-agenda/botones-agenda.component.ts +++ b/src/app/components/turnos/gestor-agendas/operaciones-agenda/botones-agenda.component.ts @@ -21,6 +21,7 @@ export class BotonesAgendaComponent implements OnInit { @Output() agregarSobreturnoEmit = new EventEmitter(); @Output() revisionAgendaEmit = new EventEmitter(); @Output() reasignarTurnosEmit = new EventEmitter(); + @Output() cargarPacientesEmit = new EventEmitter(); private _agendasSeleccionadas: Array; @@ -138,6 +139,7 @@ export class BotonesAgendaComponent implements OnInit { const puedeBorrar = this.auth.getPermissions('turnos:agenda:puedeBorrar:').length > 0; const puedeRevisar = this.auth.getPermissions('turnos:agenda:puedeRevision:').length > 0; const puedeNota = this.auth.getPermissions('turnos:agenda:puedeNota:').length > 0; + const puedeCargar = this.auth.getPermissions('turnos:agenda:asignacionMasiva:').length > 0;; this.vistaBotones = { // Se puede editar sólo una agenda que esté en estado planificacion o disponible @@ -170,6 +172,8 @@ export class BotonesAgendaComponent implements OnInit { listarTurnos: (this.cantidadSeleccionadas > 0) && puedeImprimir, // Imprimir pdf carpetas listarCarpetas: this.cantidadSeleccionadas > 0 && puedeImprimir && this.puedoImprimirCarpetas(), + // Hablita carga de pacientes masivos + cargaMasiva: puedeCargar && this.puedeCargaMasiva() }; } @@ -256,6 +260,11 @@ export class BotonesAgendaComponent implements OnInit { return !this.agendasSeleccionadas.some((agenda: any) => agenda.estado === 'pendienteAsistencia' || agenda.estado === 'pendienteAuditoria' || agenda.estado === 'auditada' || agenda.estado === 'pausada' || agenda.estado === 'suspendida'); } + puedeCargaMasiva() { + const agenda = this._agendasSeleccionadas[0]; + return this.cantidadSeleccionadas === 1 && agenda.bloques[0].pacienteSimultaneos && agenda.estado === 'disponible' || agenda.estado === 'publicada'; + } + // Verifica que las agendas seleccionadas tengan al menos un turno de acceso directo poder para publicar la agenda haySoloTurnosReservados() { let band = false; @@ -346,4 +355,8 @@ export class BotonesAgendaComponent implements OnInit { this.showBotonesAgenda = true; } + cargarPacientes() { + this.cargarPacientesEmit.emit(true); + } + } diff --git a/src/app/components/turnos/gestor-agendas/operaciones-agenda/botones-agenda.html b/src/app/components/turnos/gestor-agendas/operaciones-agenda/botones-agenda.html index cc25dd1839..13498df9b7 100644 --- a/src/app/components/turnos/gestor-agendas/operaciones-agenda/botones-agenda.html +++ b/src/app/components/turnos/gestor-agendas/operaciones-agenda/botones-agenda.html @@ -66,4 +66,8 @@ title="Imprimir carpetas"> + + + + \ No newline at end of file diff --git a/src/app/modules/visualizacion-informacion/components/bi-queries/bi-queries.component.html b/src/app/modules/visualizacion-informacion/components/bi-queries/bi-queries.component.html index 0002b9c723..4dcc70f69c 100644 --- a/src/app/modules/visualizacion-informacion/components/bi-queries/bi-queries.component.html +++ b/src/app/modules/visualizacion-informacion/components/bi-queries/bi-queries.component.html @@ -1,9 +1,10 @@ - + Descargar CSV +
@@ -67,9 +68,9 @@
-
-
+ \ No newline at end of file diff --git a/src/app/modules/visualizacion-informacion/components/bi-queries/bi-queries.component.ts b/src/app/modules/visualizacion-informacion/components/bi-queries/bi-queries.component.ts index 57f1db7f00..3c3a4dc225 100644 --- a/src/app/modules/visualizacion-informacion/components/bi-queries/bi-queries.component.ts +++ b/src/app/modules/visualizacion-informacion/components/bi-queries/bi-queries.component.ts @@ -1,5 +1,5 @@ import { ZonaSanitariaService } from './../../../../services/zonaSanitaria.service'; -import { Component, OnInit } from '@angular/core'; +import { Component, Input, OnInit } from '@angular/core'; import { QueriesService } from '../../../../services/query.service'; import { Observable } from 'rxjs'; import { ProfesionalService } from '../../../../services/profesional.service'; @@ -15,6 +15,7 @@ import { IZonaSanitaria } from 'src/app/interfaces/IZonaSanitaria'; styleUrls: ['./bi-queries.component.scss'] }) export class BiQueriesComponent implements OnInit { + @Input() type; public consultaSeleccionada; public opciones = []; @@ -45,12 +46,20 @@ export class BiQueriesComponent implements OnInit { if (this.permisosZonas.length > 0) { this.loadZonasSanitarias(); } + let params; if (permisos.length) { if (permisos[0] === '*') { - this.queries$ = this.queryService.getAllQueries({ desdeAndes: true }); + params = { desdeAndes: true }; } else { - this.queries$ = this.queryService.getAllQueries({ _id: permisos }); + params = { _id: permisos }; } + + if (this.type) { + params.type = this.type; + } + + this.queries$ = this.queryService.getAllQueries(params); + } else { this.router.navigate(['./inicio']); } diff --git a/src/app/modules/visualizacion-informacion/visualizacion-informacion.module.ts b/src/app/modules/visualizacion-informacion/visualizacion-informacion.module.ts index 9d9e669055..6861b2afd5 100644 --- a/src/app/modules/visualizacion-informacion/visualizacion-informacion.module.ts +++ b/src/app/modules/visualizacion-informacion/visualizacion-informacion.module.ts @@ -16,12 +16,11 @@ import { DescargasPendientesComponent } from './components/exportar-huds/descarg @NgModule({ declarations: [ VisualizacionInformacionComponent, - BiQueriesComponent, ExportarHudsComponent, BiQueriesComponent, DescargasPendientesComponent ], - exports: [DescargasPendientesComponent], + exports: [BiQueriesComponent, DescargasPendientesComponent], imports: [ CommonModule,