From 11a6d2f225ee90ae9cb63cbb7348d4dcb2e0c005 Mon Sep 17 00:00:00 2001 From: nicolasarana <90768149+nicolasarana@users.noreply.github.com> Date: Fri, 18 Sep 2026 12:08:18 -0300 Subject: [PATCH] =?UTF-8?q?GDU=20-=20Visualizaci=C3=B3n=20por=20solicitud?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../arbol-permisos-item.component.html | 2 +- .../arbol-permisos-item.component.ts | 39 +++++++++ .../ejecucion/hudsBusqueda.component.ts | 86 +++++++++++++++++-- .../hudsBusquedaPaciente.component.ts | 3 +- .../ejecucion/vistaHuds.component.ts | 3 +- .../rup/components/ejecucion/vistaHuds.html | 12 +-- src/app/modules/rup/services/huds.service.ts | 4 +- 7 files changed, 127 insertions(+), 22 deletions(-) diff --git a/src/app/apps/gestor-usuarios/components/arbol-permisos/arbol-permisos-item.component.html b/src/app/apps/gestor-usuarios/components/arbol-permisos/arbol-permisos-item.component.html index c3b949304d..f3884a0e57 100644 --- a/src/app/apps/gestor-usuarios/components/arbol-permisos/arbol-permisos-item.component.html +++ b/src/app/apps/gestor-usuarios/components/arbol-permisos/arbol-permisos-item.component.html @@ -30,7 +30,7 @@
+ (change)="onBooleanChange($event)">
diff --git a/src/app/apps/gestor-usuarios/components/arbol-permisos/arbol-permisos-item.component.ts b/src/app/apps/gestor-usuarios/components/arbol-permisos/arbol-permisos-item.component.ts index 9fc76cb50c..f4a9fbb828 100644 --- a/src/app/apps/gestor-usuarios/components/arbol-permisos/arbol-permisos-item.component.ts +++ b/src/app/apps/gestor-usuarios/components/arbol-permisos/arbol-permisos-item.component.ts @@ -50,6 +50,9 @@ export class ArbolPermisosItemComponent implements OnInit, OnChanges { ) { } get isHidden() { + if (this.item.requires && !this.siblingActivo()) { + return true; + } if (this.item.visibility) { if (this.item.visibility === 'hidden') { return true; @@ -135,6 +138,27 @@ export class ArbolPermisosItemComponent implements OnInit, OnChanges { * Se ejecuta al activar un checkbox o un colapsable para verificar si se debe desactivar otro checkbox correspondiente a un permiso incompatible. * Dos permisos son incompatibles cuando no deberían estar activados al mismo tiempo. */ + onBooleanChange($event) { + this.checkIncompatibles($event); + this.syncBoolean($event); + } + + /** + * Mantiene sincronizado el permiso booleano dentro de userPermissions para que + * los permisos hermanos con item.requires se muestren u oculten en vivo. + */ + syncBoolean($event) { + const permiso = this.makePermission(); + const idx = this.userPermissions.indexOf(permiso); + if ($event?.value) { + if (idx < 0) { + this.userPermissions.push(permiso); + } + } else if (idx >= 0) { + this.userPermissions.splice(idx, 1); + } + } + checkIncompatibles($event) { if ($event?.value === undefined) { // Se accionó un colapsable return; @@ -338,12 +362,27 @@ export class ArbolPermisosItemComponent implements OnInit, OnChanges { this.shiro.add(this.userPermissions); } + /** + * Devuelve si el permiso booleano hermano indicado en item.requires está activo en los permisos editados. + */ + private siblingActivo(): boolean { + if (!this.item.requires) { + return true; + } + const checker = shiroTrie.new(); + checker.add(this.userPermissions); + return checker.check(this.parentPermission + ':' + this.item.requires); + } + makePermission() { return this.parentPermission + (this.parentPermission.length ? ':' : '') + this.item.key; } public generateString(): String[] { let results = []; + if (this.item.requires && !this.siblingActivo()) { + return results; + } if (this.allModule) { return [this.makePermission() + ':*']; } diff --git a/src/app/modules/rup/components/ejecucion/hudsBusqueda.component.ts b/src/app/modules/rup/components/ejecucion/hudsBusqueda.component.ts index 818b56b80c..6d28367bdd 100644 --- a/src/app/modules/rup/components/ejecucion/hudsBusqueda.component.ts +++ b/src/app/modules/rup/components/ejecucion/hudsBusqueda.component.ts @@ -57,6 +57,10 @@ export class HudsBusquedaComponent implements AfterContentInit, OnInit, OnDestro private cantidadRegistros; solicitudesMezcladas = []; + public solicitudesFiltradas = []; + public prestacionesSolicitudes: any[] = []; + public prestacionSolicitudSeleccionada = []; + public filtroSolicitudPrestaciones = false; public loading = false; @@ -241,6 +245,7 @@ export class HudsBusquedaComponent implements AfterContentInit, OnInit, OnDestro public permisosLab; public permisosVac; public permisosRec; + public permisosSolicitudes; public permisosGuardia; public pacienteSelected: IPaciente | null = null; @@ -273,11 +278,15 @@ export class HudsBusquedaComponent implements AfterContentInit, OnInit, OnDestro this.listarPrestaciones(); this.listarConceptos(); this.listarDerivaciones(); + } else if (this.paciente && (this.permisosParciales || this.permisosSolicitudes)) { + this.cargarSolicitudes(); } // Cuando se inicia una prestación debemos volver a consultar si hay CDA nuevos al ratito. // [TODO] Ser notificado via websockets setTimeout(() => { - this.refreshCdas(); + if (this.permisosCompletos || this.permisosParciales || this.permisosLab || this.permisosVac || this.permisosGuardia) { + this.refreshCdas(); + } }, 1000 * 30); } @@ -291,6 +300,7 @@ export class HudsBusquedaComponent implements AfterContentInit, OnInit, OnDestro this.permisosLab = this.auth.check('huds:visualizacionParcialHuds:laboratorio'); this.permisosVac = this.auth.check('huds:visualizacionParcialHuds:vacuna'); this.permisosRec = this.auth.check('huds:visualizacionParcialHuds:receta'); + this.permisosSolicitudes = this.auth.check('huds:visualizacionParcialHuds:solicitudes'); this.permisosGuardia = this.auth.check('huds:visualizacionParcialHuds:guardia'); if (this.permisosCompletos || this.permisosParciales || this.permisosRec) { @@ -300,17 +310,18 @@ export class HudsBusquedaComponent implements AfterContentInit, OnInit, OnDestro // se setea el filtro inicial a visualizar en el sidebar this.filtroActual = this.permisosCompletos ? 'trastorno' : - (this.permisosGuardia) ? 'guardias' : - (this.permisosParciales || this.permisosRec) ? 'recetas' : - (this.permisosLab) ? 'laboratorios' : - 'vacunas'; + this.permisosSolicitudes ? 'solicitudes' : + (this.permisosGuardia) ? 'guardias' : + (this.permisosParciales || this.permisosRec) ? 'recetas' : + (this.permisosLab) ? 'laboratorios' : + 'vacunas'; this.pacienteSelected = this.paciente; if (this.filtroActual === 'recetas') { this.showFiltros = true; } - if (this.filtroActual !== 'trastorno') { + if (this.filtroActual !== 'trastorno' && (this.permisosCompletos || this.permisosParciales || this.permisosLab || this.permisosVac || this.permisosGuardia)) { this.refreshCdas(); } } @@ -698,6 +709,65 @@ export class HudsBusquedaComponent implements AfterContentInit, OnInit, OnDestro const fecha2 = e2.fechaEjecucion ? e2.fechaEjecucion : e2.solicitud.fecha; return fecha2 - fecha1; }); + + this.prestacionesSolicitudes = this.getPrestacionesSolicitudes(); + this.filtrarSolicitudes(); + } + + private cargarSolicitudes() { + this.servicioPrestacion.getByPaciente(this.paciente.id, false).subscribe(prestaciones => { + this.prestacionesTotales = prestaciones; + + this.servicioPrestacion.getByPacienteSolicitud(this.paciente.id).subscribe((solicitudes) => { + solicitudes.forEach(solicitud => { + const prestacion = this.prestacionesTotales?.find(p => solicitud.idPrestacion === p.solicitud.prestacionOrigen && solicitud.concepto.conceptId === p.solicitud.tipoPrestacion.conceptId); + if (prestacion) { + solicitud['dataPrestacion'] = prestacion; + solicitud['estadoActual'] = prestacion.estadoActual; + } + }); + this.solicitudes = solicitudes; + this.servicioPrestacion.getSolicitudes({ idPaciente: this.paciente.id, origen: 'top' }).subscribe((solicitudesTOP) => { + this.solicitudesTOP = solicitudesTOP; + this.cargarSolicitudesMezcladas(); + }); + }); + }); + } + + private getPrestacionesSolicitudes() { + const prestacionesMap = new Map(); + this.solicitudesMezcladas.forEach(solicitud => { + const tipoPrestacion = solicitud.evoluciones ? solicitud.concepto : solicitud.solicitud?.tipoPrestacion; + if (tipoPrestacion?.conceptId && !prestacionesMap.has(tipoPrestacion.conceptId)) { + prestacionesMap.set(tipoPrestacion.conceptId, { + conceptId: tipoPrestacion.conceptId, + term: tipoPrestacion.term + }); + } + }); + return Array.from(prestacionesMap.values()); + } + + toogleFiltroSolicitudes() { + if (!this.filtroSolicitudPrestaciones) { + this.prestacionSolicitudSeleccionada = []; + this.solicitudesFiltradas = [...this.solicitudesMezcladas]; + } else { + this.filtrarSolicitudes(); + } + } + + filtrarSolicitudes() { + if (this.prestacionSolicitudSeleccionada?.length) { + const prestacionesId = this.prestacionSolicitudSeleccionada.map(p => p.conceptId); + this.solicitudesFiltradas = this.solicitudesMezcladas.filter(solicitud => { + const conceptId = solicitud.evoluciones ? solicitud.concepto?.conceptId : solicitud.solicitud?.tipoPrestacion?.conceptId; + return prestacionesId.includes(conceptId); + }); + } else { + this.solicitudesFiltradas = [...this.solicitudesMezcladas]; + } } private ordenarLaboratorios(laboratorios, protocolos) { @@ -873,7 +943,7 @@ export class HudsBusquedaComponent implements AfterContentInit, OnInit, OnDestro case 'recc': return this.derivaciones.length; case 'solicitudes': - return this.solicitudesMezcladas.length; + return this.solicitudesFiltradas.length; case 'recetas': return this.cantidadTotalRecetas; case 'registro': @@ -903,6 +973,8 @@ export class HudsBusquedaComponent implements AfterContentInit, OnInit, OnDestro return true; } else if (item.key === 'recetas' && (this.permisosRec || this.permisosParciales)) { return true; + } else if (item.key === 'solicitudes' && (this.permisosSolicitudes || this.permisosParciales)) { + return true; } return false; } diff --git a/src/app/modules/rup/components/ejecucion/hudsBusquedaPaciente.component.ts b/src/app/modules/rup/components/ejecucion/hudsBusquedaPaciente.component.ts index 259000dcc8..5625aa1ee7 100644 --- a/src/app/modules/rup/components/ejecucion/hudsBusquedaPaciente.component.ts +++ b/src/app/modules/rup/components/ejecucion/hudsBusquedaPaciente.component.ts @@ -52,7 +52,8 @@ export class HudsBusquedaPacienteComponent implements OnInit { 'huds:visualizacionParcialHuds:*', 'huds:visualizacionParcialHuds:laboratorio', 'huds:visualizacionParcialHuds:vacuna', - 'huds:visualizacionParcialHuds:receta' + 'huds:visualizacionParcialHuds:receta', + 'huds:visualizacionParcialHuds:solicitudes' ]; if (!permisos.some(permiso => this.auth.check(permiso))) { diff --git a/src/app/modules/rup/components/ejecucion/vistaHuds.component.ts b/src/app/modules/rup/components/ejecucion/vistaHuds.component.ts index 11a3664db4..7c849e3eec 100644 --- a/src/app/modules/rup/components/ejecucion/vistaHuds.component.ts +++ b/src/app/modules/rup/components/ejecucion/vistaHuds.component.ts @@ -37,6 +37,7 @@ export class VistaHudsComponent implements OnInit, OnDestroy { public permisoLaboratorios: boolean; public permisoVacunas: boolean; public permisoRecetas: boolean; + public permisoSolicitudes: boolean; private fechaDesdeInternacion = moment('2016-01-01').toDate(); private origen: string; @@ -74,7 +75,7 @@ export class VistaHudsComponent implements OnInit, OnDestroy { this.permisoLaboratorios = this.permisoHudsCompleta || this.auth.check('huds:visualizacionParcialHuds:*') || this.auth.check('huds:visualizacionParcialHuds:laboratorio'); this.permisoVacunas = this.permisoHudsCompleta || this.auth.check('huds:visualizacionParcialHuds:*') || this.auth.check('huds:visualizacionParcialHuds:vacuna'); this.permisoRecetas = this.permisoHudsCompleta || this.auth.check('huds:visualizacionParcialHuds:*') || this.auth.check('huds:visualizacionParcialHuds:receta'); - + this.permisoSolicitudes = this.permisoHudsCompleta || this.auth.check('huds:visualizacionParcialHuds:*') || this.auth.check('huds:visualizacionParcialHuds:solicitudes'); // cargar las internaciones y armar un filtro en api . this.huds.registrosHUDS.subscribe((datos) => { if (this.registros.length < datos.length) { diff --git a/src/app/modules/rup/components/ejecucion/vistaHuds.html b/src/app/modules/rup/components/ejecucion/vistaHuds.html index 249d5d8cac..c458fff045 100644 --- a/src/app/modules/rup/components/ejecucion/vistaHuds.html +++ b/src/app/modules/rup/components/ejecucion/vistaHuds.html @@ -92,16 +92,6 @@ - - - - - - - - + [class]="registro.class" *ngIf="registro.tipo === 'solicitud' && this.permisoSolicitudes"> diff --git a/src/app/modules/rup/services/huds.service.ts b/src/app/modules/rup/services/huds.service.ts index 66b3199918..619e7e3b13 100644 --- a/src/app/modules/rup/services/huds.service.ts +++ b/src/app/modules/rup/services/huds.service.ts @@ -88,7 +88,9 @@ export class HUDSService { case 'rup': case 'cda': case 'dominio': - case 'solicitud': + case 'solicitudes': + if (registro.id === _registro.id || registro.data?.id === _registro.id) { return i; } + break; case 'ficha-epidemiologica': if (registro.id === _registro.id || registro.data?.id === _registro.id) { return i;