From c559ea1ed68b67ec594d6b61b6a4d317a76b7344 Mon Sep 17 00:00:00 2001 From: ma7payne Date: Tue, 22 Oct 2024 10:43:13 -0300 Subject: [PATCH] zfeat(CIT): chequea turnos antes de asignar demanda --- .../turnos/dashboard/demandaInsatisfecha.html | 60 +++++++++++++- .../turnos/dashboard/demandaInsatisfecha.scss | 16 ++++ .../turnos/dashboard/demandaInsatisfecha.ts | 80 ++++++++++++++++--- .../services/turnos/listaEspera.service.ts | 8 +- 4 files changed, 150 insertions(+), 14 deletions(-) create mode 100644 src/app/components/turnos/dashboard/demandaInsatisfecha.scss diff --git a/src/app/components/turnos/dashboard/demandaInsatisfecha.html b/src/app/components/turnos/dashboard/demandaInsatisfecha.html index f47ca1cdcf..684faf7b18 100644 --- a/src/app/components/turnos/dashboard/demandaInsatisfecha.html +++ b/src/app/components/turnos/dashboard/demandaInsatisfecha.html @@ -14,4 +14,62 @@ - \ No newline at end of file + + + + + ¡Demanda insatisfecha guardada + exitosamente! +
+ +
+ + ACEPTAR + +
+ + + + No es posible registrar la + demanda +
+ +
+ + ACEPTAR + +
\ No newline at end of file diff --git a/src/app/components/turnos/dashboard/demandaInsatisfecha.scss b/src/app/components/turnos/dashboard/demandaInsatisfecha.scss new file mode 100644 index 0000000000..c00e9b1be4 --- /dev/null +++ b/src/app/components/turnos/dashboard/demandaInsatisfecha.scss @@ -0,0 +1,16 @@ +main { + min-height: auto !important; +} + +.modal-contents { + .content-row:last-child { + border-bottom: none; + } +} + +.content-row { + display: flex; + align-items: center; + margin-bottom: 10px; + border-bottom: 1px solid #999; +} \ No newline at end of file diff --git a/src/app/components/turnos/dashboard/demandaInsatisfecha.ts b/src/app/components/turnos/dashboard/demandaInsatisfecha.ts index 4e0f1d9bf1..558977ea4c 100644 --- a/src/app/components/turnos/dashboard/demandaInsatisfecha.ts +++ b/src/app/components/turnos/dashboard/demandaInsatisfecha.ts @@ -1,7 +1,10 @@ import { Auth } from '@andes/auth'; import { Plex } from '@andes/plex'; -import { Component, EventEmitter, Input, Output } from '@angular/core'; +import { PlexModalComponent } from '@andes/plex/src/lib/modal/modal.component'; +import { Component, EventEmitter, Input, Output, ViewChild } from '@angular/core'; +import { catchError, switchMap, throwError } from 'rxjs'; import { IPaciente } from 'src/app/core/mpi/interfaces/IPaciente'; +import { PrestacionesService } from 'src/app/modules/rup/services/prestaciones.service'; import { ConceptosTurneablesService } from 'src/app/services/conceptos-turneables.service'; import { ListaEsperaService } from 'src/app/services/turnos/listaEspera.service'; import { ProfesionalService } from './../../../services/profesional.service'; @@ -9,6 +12,7 @@ import { ProfesionalService } from './../../../services/profesional.service'; @Component({ selector: 'demandaInsatisfecha', templateUrl: 'demandaInsatisfecha.html', + styleUrls: ['demandaInsatisfecha.scss'] }) export class demandaInsatisfechaComponent { @@ -17,6 +21,8 @@ export class demandaInsatisfechaComponent { @Input() origen = 'citas'; @Input() estado = 'pendiente'; @Output() demandaCerrada = new EventEmitter(); + @ViewChild('modalSolicitudes', { static: true }) modalSolicitudes: PlexModalComponent; + @ViewChild('modalTurno', { static: true }) modalTurno: PlexModalComponent; tipoPrestacion: any; permisos = []; @@ -28,6 +34,8 @@ export class demandaInsatisfechaComponent { ]; motivo: any; organizacion = this.auth.organizacion; + solicitudesAsociadas; + turnoAsociado; constructor( public auth: Auth, @@ -35,6 +43,7 @@ export class demandaInsatisfechaComponent { public conceptosTurneablesService: ConceptosTurneablesService, public profesionalService: ProfesionalService, public listaEsperaService: ListaEsperaService, + public servicioPrestacion: PrestacionesService, ) { } loadTipoPrestaciones(event) { @@ -53,18 +62,71 @@ export class demandaInsatisfechaComponent { guardar() { if (this.motivo && this.tipoPrestacion) { - this.listaEsperaService.save({ id: this.paciente.id }, this.tipoPrestacion, this.estado, this.profesional, this.organizacion, this.motivo.nombre, this.origen).subscribe({ - complete: () => { - this.plex.toast('success', 'Demanda insatisfecha guardada exitosamente!'); - this.cerrar(); - }, - error: (e) => this.plex.toast('danger', e.message, 'Ha ocurrido un error al guardar') - }); + const params = { + idPaciente: this.paciente.id, + prestacionDestino: this.tipoPrestacion?.conceptId, + estados: [ + 'auditoria', + 'pendiente', + ] + }; + + const listaEsperaService$ = this.listaEsperaService.save( + { id: this.paciente.id }, + this.tipoPrestacion, + this.estado, + this.profesional, + this.organizacion, + this.motivo.nombre, + this.origen, + false + ); + + listaEsperaService$ + .pipe( + catchError((err) => { + if (err.code === 'turno_existente') { + const { data } = err; + const dia = moment(data.horaInicio).format('LL'); + const horario = moment(data.horaInicio).format('HH:mm'); + const profesionales = data.profesionale ? data.profesionales.map(prof => ` ${prof.nombre} ${prof.apellido}`) : 'Sin profesionales asignados'; + const organizacion = data.organizacion?.nombre || null; + + this.turnoAsociado = { dia, horario, profesionales, organizacion }; + } else { + this.plex.info('danger', err, 'No se pudo conectar con el servidor'); + } + + return throwError(() => err); + }), + switchMap(() => + this.servicioPrestacion.getSolicitudes(params).pipe( + catchError(() => { + this.plex.toast('success', 'Demanda insatisfecha guardada exitosamente!'); + this.cerrar(); + + return throwError(() => new Error('Error al obtener solicitudes')); + }) + ) + ), + ) + .subscribe({ + next: (solicitudes) => { + if (solicitudes?.length) { + this.solicitudesAsociadas = solicitudes; + this.modalSolicitudes.show(); + } else { + this.plex.toast('success', 'Demanda insatisfecha guardada exitosamente!'); + this.cerrar(); + } + }, + error: () => this.modalTurno.show() + }); } } cerrar() { this.demandaCerrada.emit(); + this.modalSolicitudes.close(); } - } diff --git a/src/app/services/turnos/listaEspera.service.ts b/src/app/services/turnos/listaEspera.service.ts index 3bad17834e..d4fddd6281 100644 --- a/src/app/services/turnos/listaEspera.service.ts +++ b/src/app/services/turnos/listaEspera.service.ts @@ -22,8 +22,8 @@ export class ListaEsperaService { return this.server.get(this.listaEsperaUrl, { params: params, showError: true }); } - post(listaEspera: IListaEspera): Observable { - return this.server.post(this.listaEsperaUrl, listaEspera); + post(listaEspera: IListaEspera, showError: boolean = true): Observable { + return this.server.post(this.listaEsperaUrl, listaEspera, { showError: showError }); } postXIdAgenda(id: String, cambios: any): Observable { @@ -42,7 +42,7 @@ export class ListaEsperaService { return this.server.patch(this.listaEsperaUrl + '/' + id + '/' + datoMod, cambios); } - save(paciente, tipoPrestacion, estado: String, profesional, organizacion, motivo: String, origen: String) { + save(paciente, tipoPrestacion, estado: String, profesional, organizacion, motivo: String, origen: String, showError?: boolean) { const datosProfesional = !profesional ? null : { id: profesional.id, nombre: profesional.nombre, @@ -64,6 +64,6 @@ export class ListaEsperaService { tipoPrestacion, resolucion: null }; - return this.post(listaEspera); + return this.post(listaEspera, showError); } }