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;