From 8d28c5aacfbeaa29a5fc00f565d022d831bb59a8 Mon Sep 17 00:00:00 2001 From: ma7payne Date: Wed, 25 Feb 2026 15:50:33 -0300 Subject: [PATCH] feat(TOP): implementa resolucion de solicitudes --- src/app/components/top/pipes/botones.pipe.ts | 11 +- .../top/pipes/estado-prestacion.pipe.ts | 3 +- .../top/pipes/estado-solicitud.pipe.ts | 3 + .../top/solicitudes/solicitudes.component.ts | 66 +++- .../top/solicitudes/solicitudes.html | 314 ++++++++++-------- 5 files changed, 249 insertions(+), 148 deletions(-) diff --git a/src/app/components/top/pipes/botones.pipe.ts b/src/app/components/top/pipes/botones.pipe.ts index 1bcec4b24f..04d2f4c252 100644 --- a/src/app/components/top/pipes/botones.pipe.ts +++ b/src/app/components/top/pipes/botones.pipe.ts @@ -20,7 +20,9 @@ export class BotonesSolicitudPipe implements PipeTransform { verHuds: false, devolverDeshacer: false, cancelar: false, - comunicacionPaciente: false + comunicacionPaciente: false, + resolver: false, + deshacerResolver: false }; if (prestacion?.paciente) { if (prestacion.estadoActual.tipo === 'asignada') { @@ -37,12 +39,18 @@ export class BotonesSolicitudPipe implements PipeTransform { if (prestacion.estadoActual.tipo === 'rechazada') { botones.referir = true; } + if (prestacion.estadoActual.tipo === 'resuelta') { + if (this.esEfectorDestino(prestacion)) { + botones.deshacerResolver = true; + } + } if (!prestacion.solicitud.turno) { if (prestacion.estadoActual.tipo === 'pendiente') { if (this.esEfectorDestino(prestacion)) { botones.darTurno = true; botones.anular = true; botones.volverAuditoria = true; + botones.resolver = true; } if (prestacion.solicitud.historial.length) { botones.comunicacionPaciente = true; @@ -55,6 +63,7 @@ export class BotonesSolicitudPipe implements PipeTransform { if ((this.esEfectorDestino(prestacion) && prestacion.estadoActual.tipo === 'auditoria')) { botones.anular = true; botones.auditar = true; + botones.resolver = true; } } } diff --git a/src/app/components/top/pipes/estado-prestacion.pipe.ts b/src/app/components/top/pipes/estado-prestacion.pipe.ts index 03e9921f77..d3ef543a3c 100644 --- a/src/app/components/top/pipes/estado-prestacion.pipe.ts +++ b/src/app/components/top/pipes/estado-prestacion.pipe.ts @@ -18,7 +18,8 @@ export class EstadoPrestacionPipe implements PipeTransform { 'turnoDado': 'success', 'validada': 'success', 'anulada': 'danger', - 'vencida': 'danger' + 'vencida': 'danger', + 'resuelta': 'success' }; return badge[prestacion.estadoActual.tipo]; diff --git a/src/app/components/top/pipes/estado-solicitud.pipe.ts b/src/app/components/top/pipes/estado-solicitud.pipe.ts index 061bd54646..c6527c56d3 100644 --- a/src/app/components/top/pipes/estado-solicitud.pipe.ts +++ b/src/app/components/top/pipes/estado-solicitud.pipe.ts @@ -39,6 +39,9 @@ export class EstadoSolicitudPipe implements PipeTransform { if (prestacion.estadoActual.tipo === 'rechazada') { return 'rechazada'; } + if (prestacion.estadoActual.tipo === 'resuelta') { + return 'resuelta'; + } } } diff --git a/src/app/components/top/solicitudes/solicitudes.component.ts b/src/app/components/top/solicitudes/solicitudes.component.ts index 5a4875b8c6..94b91b9694 100644 --- a/src/app/components/top/solicitudes/solicitudes.component.ts +++ b/src/app/components/top/solicitudes/solicitudes.component.ts @@ -30,6 +30,7 @@ export class SolicitudesComponent implements OnInit { @HostBinding('class.plex-layout') layout = true; @ViewChild('modalDevolver', { static: true }) modalDevolver: PlexModalComponent; @ViewChild('modalIniciar', { static: true }) modalIniciar: PlexModalComponent; + @ViewChild('modalResolver', { static: true }) modalResolver: PlexModalComponent; @ViewChild('helpIniciar', { static: false }) helpIniciar: PlexHelpComponent; @ViewChild('helpAnular', { static: false }) helpAnular: PlexHelpComponent; @ViewChild('helpCitar', { static: false }) helpCitar: PlexHelpComponent; @@ -76,14 +77,22 @@ export class SolicitudesComponent implements OnInit { { id: 'turnoDado', nombre: 'TURNO DADO' }, { id: 'registroHUDS', nombre: 'REGISTRO EN HUDS' }, { id: 'anulada', nombre: 'ANULADA' }, - { id: 'vencida', nombre: 'VENCIDA' } + { id: 'vencida', nombre: 'VENCIDA' }, + { id: 'resuelta', nombre: 'RESUELTA' } ]; public prioridad; public prioridades = [ { id: 'prioritario', nombre: 'PRIORITARIO' }, ]; - prestacionSeleccionada: any; + public prestacionSeleccionada: any; + public motivosResolucion = [ + { id: 'turno_en_efector', nombre: 'Con turno programado en el efector' }, + { id: 'turno_otro_efector', nombre: 'Con turno programado en otro efector' }, + { id: 'no_requiere', nombre: 'Ya no requiere turno' }, + { id: 'fallecido', nombre: 'Paciente fallecido' } + ]; + public motivoResolucionSeleccionado: any; public showModalMotivo = false; public motivoVerContinuarPrestacion = 'Continuidad del cuidado del paciente'; public routeToParams = []; @@ -367,6 +376,50 @@ export class SolicitudesComponent implements OnInit { this.observacionesAnular = ''; } } + + onResolver() { + if (this.prestacionSeleccionada.estados?.length && this.motivoResolucionSeleccionado) { + const patch = { + op: 'estadoPush', + estado: { + tipo: 'resuelta', + observaciones: this.motivoResolucionSeleccionado.nombre + } + }; + this.servicioPrestacion.patch(this.prestacionSeleccionada.id, patch).subscribe( + () => { + this.cargarSolicitudes(); + this.plex.toast('success', 'Solicitud resuelta exitosamente'); + } + ); + this.hideModal('resolver'); + this.closeSidebar(); + } + } + + onDeshacerResolver() { + this.closeSidebar(); + let estadoPrevio = 'pendiente'; + if (this.prestacionSeleccionada.estados?.length > 1) { + const prev = this.prestacionSeleccionada.estados[this.prestacionSeleccionada.estados.length - 2]; + estadoPrevio = prev.tipo; + } + + const patch = { + op: 'estadoPush', + estado: { + tipo: estadoPrevio, + observaciones: 'Reversión de estado resuelto' + } + }; + this.servicioPrestacion.patch(this.prestacionSeleccionada.id, patch).subscribe( + () => { + this.cargarSolicitudes(); + this.plex.toast('success', 'Se deshizo la resolución de la solicitud'); + } + ); + } + citar() { if (this.prestacionSeleccionada.estados?.length) { const patch = { @@ -437,7 +490,8 @@ export class SolicitudesComponent implements OnInit { 'validada', 'ejecucion', 'asignada', - 'referir' + 'referir', + 'resuelta' ] }; if (this.tipoSolicitud === 'entrada') { @@ -949,6 +1003,8 @@ export class SolicitudesComponent implements OnInit { break; case 'devolver': this.modalDevolver.showed = true; break; + case 'resolver': this.modalResolver.showed = true; + break; } } @@ -961,6 +1017,10 @@ export class SolicitudesComponent implements OnInit { this.modalDevolver.showed = false; this.motivoRespuesta = ''; break; + case 'resolver': + this.modalResolver.showed = false; + this.motivoResolucionSeleccionado = null; + break; } } diff --git a/src/app/components/top/solicitudes/solicitudes.html b/src/app/components/top/solicitudes/solicitudes.html index 4100b83f7d..b5db6e4b9f 100644 --- a/src/app/components/top/solicitudes/solicitudes.html +++ b/src/app/components/top/solicitudes/solicitudes.html @@ -1,81 +1,78 @@ + *ngIf="!showDarTurnos && !showCargarSolicitud && !showEditarReglas"> + routerLink="/solicitudes/reglasVisualizacion"> + label="Nueva Solicitud de Entrada" (click)="nuevaSolicitud()"> + label="Reglas de entrada" (click)="editarReglas()"> + label="Nueva Solicitud de Salida" (click)="nuevaSolicitud()"> + label="Reglas de entrada" (click)="editarReglas()">
+ (change)="cambioFechaDesde()" name="fechaDesdeLimitada" label="Registro desde" + class="fechas" required> + (change)="cambioFechaHasta()" name="fechaHastaLimitada" label="Registro hasta" + class="fechas" required> + [(ngModel)]="fechaDesde" (change)="cargarSolicitudes()" name="fechaDesde" + label="Registro desde" class="fechas" [max]="fechaHasta" required> + [(ngModel)]="fechaHasta" (change)="cargarSolicitudes()" name="fechaHasta" + label="Registro hasta" class="fechas" [min]="fechaDesde" [max]="hoy" required> + label="Prestación destino" name="prestacionDestino" + tmPrestaciones="solicitudes:tipoPrestacion:?" (change)="cargarSolicitudes()" + [preload]="true" [multiple]="true"> + label="Filtrar por paciente" debounce="400"> + [data]="selectEstados" name="estado" label="Estado" ngModelOptions="{standalone: true}">
+ label="Organización origen" placeholder="Seleccione la organización" labelField="nombre" + [multiple]="true" (change)="cargarSolicitudes()"> + tmProfesionales label="Equipo de salud" placeholder="Buscar por equipo de salud" + (change)="cargarSolicitudes()" [closeAfterSelect]="true"> + label="Prioridad" ngModelOptions="{standalone: true}" (change)="cargarSolicitudes()"> + name="conceptoAsociado" label="Diagnóstico asociado" name="conceptoAsociado" + [data]="listaConceptosAsociados" labelField="term" idField="conceptId" + (change)="setConceptoAsociado($event)"> + (change)="onChange()" [ngModelOptions]="{standalone: true}" type="slide">
@@ -87,7 +84,7 @@
+ titulo="No hay solicitudes de entrada en el rango de fechas">
@@ -95,7 +92,7 @@ + (scroll)="onScroll()" [offset]="collapse ? 252 : 180" height="60vh" [headOpacity]="80"> @@ -106,10 +103,10 @@ + [showUpdate]="false"> + subtitulo="Fecha de solicitud: {{prestacion.solicitud.fecha | fecha}}"> @@ -117,21 +114,21 @@ + subtitulo="DNI: {{prestacion.paciente.documento}}"> + titulo="{{prestacion.solicitud.organizacionOrigen? prestacion.solicitud.organizacionOrigen.nombre : 'Sin organización de origen'}}" + subtitulo="{{prestacion.solicitud.profesionalOrigen?(prestacion.solicitud.profesionalOrigen | nombre) : 'Sin profesional de origen'}}"> + subtitulo="{{prestacion.solicitud.profesional? (prestacion.solicitud.profesional | nombre):'Sin profesional de destino'}}"> @@ -141,60 +138,63 @@ + *ngIf="prestacion.solicitud.registros[0]?.valor.solicitudPrestacion?.conceptoAsociado" + type="warning"> + tooltip="Agenda Virtual" tooltipPosition="top"> + tooltip="Paciente notificado"> - AUTOCITADO + AUTOCITADO VENCIDA + *ngIf="prestacion.solicitud.registros[0]?.valor.solicitudPrestacion.prioridad === 'prioritario'"> {{prestacion.solicitud.registros[0].valor.solicitudPrestacion.prioridad}} + *ngIf="prestacion.estadoActual.tipo !== 'rechazada' && prestacion.estadoActual.tipo !== 'auditoria' && prestacion.estadoActual.tipo !== 'validada' && prestacion.estadoActual.tipo !== 'vencida'"> {{ prestacion | estadoSolicitud}} + *ngIf="!prestacion.solicitud.turno && prestacion.estadoActual.tipo === 'validada'"> Registro en HUDS + *ngIf="!prestacion.solicitud.turno && estado === 'rechazada'"> CONTRARREFERIDA + *ngIf="!prestacion.solicitud.turno && prestacion.estadoActual.tipo === 'auditoria'"> {{prestacion | estadoSolicitud}} + *ngIf="prestacion | auditoriasSolicitud as auditorias"> {{auditorias}} - Turno dado - + Turno dado + Registro en HUDS REFERIDA @@ -212,40 +212,38 @@ + name="fechaDesde" label="Registro desde" class="fechas" [max]="fechaHasta" required> + name="fechaHasta" label="Registro hasta" class="fechas" [min]="fechaDesde" [max]="hoy" + required> + label="Prestación destino" name="prestacionDestino" + tmPrestaciones="solicitudes:tipoPrestacion:?" (change)="cargarSolicitudes()" + [preload]="true" [multiple]="true"> + label="Filtrar por paciente" debounce="400"> + name="estado" label="Estado" ngModelOptions="{standalone: true}">
+ label="Organización destino" placeholder="Seleccione la organización" + labelField="nombre" [multiple]="true" (change)="cargarSolicitudes()"> + label="Prioridad" ngModelOptions="{standalone: true}" (change)="cargarSolicitudes()"> + name="conceptoAsociado" label="Diagnóstico asociado" name="conceptoAsociado" + [data]="listaConceptosAsociados" labelField="term" idField="conceptId" + (change)="setConceptoAsociado($event)"> + (change)="onChange()" [ngModelOptions]="{standalone: true}" type="slide">
@@ -254,7 +252,7 @@ + (scroll)="onScroll()" [offset]="collapse?252:180" height="60vh" [headOpacity]="80"> + subtitulo="Fecha de solicitud: {{prestacion.solicitud.fecha| fecha}}"> + subtitulo="DNI: {{prestacion.paciente.documento}}"> + titulo="{{prestacion.solicitud.tipoPrestacion? prestacion.solicitud.tipoPrestacion.term : 'No indica'}}" + subtitulo=" {{prestacion.solicitud.profesionalOrigen?(prestacion.solicitud.profesionalOrigen | nombre) : 'Sin profesional de origen'}}"> + titulo="{{prestacion.solicitud.organizacion? prestacion.solicitud.organizacion.nombre : 'Sin organización de destino'}}" + subtitulo=" {{prestacion.solicitud.profesional?(prestacion.solicitud.profesional | nombre) : 'Sin profesional de destino'}}"> + titulo="{{prestacion.updatedAt | date:'dd/MM/yyyy - HH:mm'}}"> + *ngIf="prestacion.solicitud.registros[0]?.valor.solicitudPrestacion?.conceptoAsociado" + type="warning"> + tooltip="Paciente notificado"> + *ngIf="prestacion.solicitud.registros[0]?.valor.solicitudPrestacion.prioridad === 'prioritario'"> {{prestacion.solicitud.registros[0].valor.solicitudPrestacion.prioridad}} + type="{{prestacion | estadoPrestacion}}"> CONTRARREFERIDA - + {{prestacion.estadoActual.tipo}} - + {{ prestacion | estadoSolicitud}} - Registro en + Registro en HUDS @@ -332,7 +333,7 @@
+ titulo="No hay solicitudes de salida en el rango de fechas">
@@ -343,7 +344,7 @@ + (click)="closeSidebar()"> @@ -351,142 +352,147 @@
+ [turnoSeleccionado]="turnoSeleccionado" (internacionPaciente)="verInternacionPaciente($event)"> + *ngIf="botones.iniciarPrestacion && isPrestationEnabled(prestacionSeleccionada)" + icon="notas-check" btnType="success" type="info" tooltip="Iniciar prestación"> + tooltipPosition="left" [disabled]="formIniciar.invalid" + (click)="showModal('iniciar', true)"> + [required]="true" name="fechaIniciar" label="Fecha y hora de la prestación"> + [(ngModel)]="observacionesIniciarPrestacion" + placeholder="Ingrese observaciones..."> + tooltip="Continuar registro" tooltipPosition="left" size="sm" type="success" + (click)="onContinuarRegistro()"> + tooltip="Volver a auditoría" type="info" size="sm" (click)="volverAuditoria()"> + type="success" (click)="$event.stopPropagation(); onDarTurno()" title="Dar Turno"> + type="info" tooltip="Citar paciente">
+ tooltipPosition="left" [disabled]="formCitar.invalid" + (click)="$event.stopPropagation(); citar()"> + [(ngModel)]="observacionesCitar" [required]="true"> + label="Prioridad" ngModelOptions="{standalone: true}">
+ type="info" size="sm" (click)="onVerHuds()"> + btnType="danger" type="info" tooltip="Anular solicitud">
+ tooltipPosition="left" [disabled]="formAnular.invalid" + (click)="$event.stopPropagation(); anular()"> + [(ngModel)]="observacionesAnular" [required]="true">
+ + + + + + + +
+ icon="chevron-double-right" btnType="warning" (click)="referir()"> + (returnReferir)="returnReferir($event)"> + tooltip="Auditar Solicitud" + [tooltipPosition]="prestacionSeleccionada.estadoActual.tipo === 'rechazada' ? 'left' : 'top'"> + (returnAuditoria)="returnAuditoria($event)"> + *ngIf="botones.cancelar && tipoSolicitud === 'salida' && permisoAnular" icon="cancel" + tooltip="Anular solicitud" size="sm" type="danger" (click)="onCancelar()"> + tooltip="Comunicación con el paciente" tooltipPosition="left" icon="telefono"> + tooltipPosition="left" [disabled]="!formComunicacion.valid" + (click)="onNotificarPaciente()">
+ name="fechaNotificacion" [max]="hoy" [(ngModel)]="fechaNotificacion" + [required]="true" placeholder="Ingrese una fecha"> + [(ngModel)]="descripcionNotificacion" placeholder="Ingrese una descripción" + [required]="true">
+ tooltip="{{ prestacionSeleccionada.solicitud.profesional?.id === auth.profesional ? 'Devolver' : 'Deshacer' }}" + tooltipPosition="left" type="danger" size="sm" (click)="showModal('devolver')">
@@ -508,8 +514,8 @@ + (afterDarTurno)="volverDarTurno($event)" [pacienteSeleccionado]="pacienteSeleccionado" + [solicitudPrestacion]="solicitudTurno"> @@ -529,7 +535,7 @@
+ [required]="true">
@@ -543,7 +549,7 @@ + (closed)="showModal('iniciar')">
?
@@ -554,10 +560,10 @@ + subtitulo="{{ prestacionSeleccionada.solicitud.tipoPrestacion.term }}"> + icon="paciente" subtitulo="{{ prestacionSeleccionada.paciente.documento }}">
@@ -568,4 +574,26 @@ ACEPTAR + + + + + + + Resolver solicitud + + Seleccione el motivo de resolución: +
+
+ + +
+
+ + ACEPTAR + + + CANCELAR +
\ No newline at end of file