Browse Source

Merge branch 'master' of http://209.50.56.224/git/ITTEC/SistemaMantenimiento

JeanBenitez 1 year ago
parent
commit
48a045ded8

+ 64 - 0
sistema-mantenimiento-front/src/app/components/corrective-maintenance/corrective-maintenance.component.ts

@@ -8,6 +8,12 @@ import { EncService } from 'src/app/services/enc/enc.service';
 import { ModulesService } from 'src/app/services/modules.service';
 import { SubmoduleFunctionsComponent } from '../template/menu-item/submodule-functions/submodule-functions.component';
 import { Permissions, PermissionsInterface } from 'src/app/interfaces/permissions.interface';
+import { SocketService } from 'src/app/services/socket.service';
+import { UserConsultResponse } from 'src/app/interfaces/user.interface';
+import { UsersProfilesService } from 'src/app/services/users-profiles.service';
+import { ResourcesService } from 'src/app/services/resources/resources.service';
+import { ProfileInterface } from 'src/app/interfaces/profile.interface';
+import { FunctionsService } from 'src/app/services/functions.service';
 
 @Component({
   selector: 'app-corrective-maintenance',
@@ -26,6 +32,10 @@ export class CorrectiveMaintenanceComponent implements OnInit {
     private _modulesService: ModulesService,
     private _dialog: MatDialog,
     private _router: Router,
+    private _socketService: SocketService,
+    private _usersProfilesService: UsersProfilesService,
+    private _resourcesService: ResourcesService,
+    private _functionsService: FunctionsService,
   ) {
     this.isLoading = true;
     this.hasError = false;
@@ -36,6 +46,60 @@ export class CorrectiveMaintenanceComponent implements OnInit {
 
   ngOnInit(): void {
     this.getSubmodules();
+    this._socketService.refreshPermissions().subscribe(async (profUpdEnc) => {
+      try{
+        let idUser = localStorage.getItem('idusuario')!;
+        let usrInfo: UserConsultResponse = await lastValueFrom(this._usersProfilesService.getUser(idUser, idUser, 1));
+        
+        if(usrInfo.error){
+          this._resourcesService.openSnackBar('ERR_NPE000: Ocurrió un error inesperado.');
+        }else{
+          let idProfDec = await this._encService.decrypt(usrInfo.response.PERFIL);
+          let currentProfile = await this._encService.decrypt(localStorage.getItem('perfil')!);
+
+          if(idProfDec != currentProfile){
+            this._router.navigate(['/sam/home']);
+            return;
+          }
+          
+          let profileUpdated = await this._encService.decrypt(`${profUpdEnc}`);
+          if(profileUpdated == currentProfile){
+            let profile = localStorage.getItem('perfil')!;
+            let profInfo: ProfileInterface = await lastValueFrom(this._usersProfilesService.getProfile(
+              profile,
+              idUser,
+              1
+            ));
+
+            let permArr = await this._functionsService.processPermissions(profInfo.response.PERMISOS.permissions);
+            let modPerm = permArr.filter(item => item.id == 'S002V01M09GMCO');
+            if(modPerm.length > 0){
+              let newSubmod: Submodules[] = [];
+              for(let item of this.submodulesAux){
+                let idSub = item.IDSUBMODULO;
+                let sub = modPerm[0].children.filter(item2 => item2.id == idSub);
+
+                if(sub.length > 0){
+                  if(sub[0].access > 0){
+                    newSubmod.push(item);
+                  }
+                }
+              }
+
+              this.submodules = newSubmod;
+            }
+          }
+        }
+      }catch(error: any){
+        if(error.error == undefined){
+          this._resourcesService.openSnackBar('ERR_PAD001: Ocurrió un error inesperado.');
+        }else if(error.error.msg == undefined){
+          this._resourcesService.openSnackBar('ERR_PAD002: Ocurrió un error inesperado.');
+        }else{
+          this._resourcesService.openSnackBar(`ERR_PAD003: ${error.error.msg}`);
+        }
+      }
+    });
   }
 
   async getSubmodules(){

+ 13 - 4
sistema-mantenimiento-front/src/app/components/corrective-maintenance/operations-management/operations-management.component.html

@@ -15,15 +15,20 @@
           <mat-form-field appearance="outline" class="w-300p mr-8">
             <mat-label>Buscador</mat-label>
             <input matInput [(ngModel)]="txtBuscador" (keyup)="applyFilter($event,'INP')"
-              placeholder="Ingrese la palabra a buscar" />
+            placeholder="Ingrese la palabra a buscar" />
             <mat-icon *ngIf="txtBuscador.length === 0" matSuffix>search</mat-icon>
             <mat-icon *ngIf="txtBuscador.length > 0" class="clickable" matTooltip="Eliminar filtro"
-              (click)="applyFilter('', 'EST')" matSuffix>close</mat-icon>
+            (click)="applyFilter('', 'EST')" matSuffix>close</mat-icon>
           </mat-form-field>
           <div class="override-buttons">
-            <button mat-raised-button color="primary" class="override_no_shadow mr-10 animated fadeIn" (click)="openWorkOrder('nuevo', null)">
+            <button mat-raised-button color="primary" class="override_no_shadow mr-10 animated fadeIn" (click)="openWorkOrder('nuevo', null)" 
+            *ngIf="!btnSmall">
               <mat-icon>add</mat-icon> Registrar orden de trabajo
             </button>
+            <button mat-mini-fab color="primary" class="override_no_shadow mr-10 animated fadeIn" (click)="openWorkOrder('nuevo', null)" 
+            *ngIf="btnSmall" matTooltip="Registrar orden de trabajo">
+            <mat-icon>add</mat-icon>
+            </button>
             <button mat-mini-fab class="cyan_dark_background white_font override_no_shadow mr-10" matTooltip="Actualizar datos" (click)="getworkOrders(false)">
               <mat-icon>refresh</mat-icon>
             </button>
@@ -41,9 +46,13 @@
         <h3>{{ errorStr }}</h3>
       </div>
 
+      <div class="animated fadeIn" *ngIf="!operationsConsultEnabled && !isLoading && !hasError">
+        <h3 class="ml-20"><b>Su perfil no cuenta con los permisos necesarios para visualizar la información de esta sección.</b></h3>
+      </div>
+
       <div class="override-table animated fadeIn" [ngClass]="{ hidden: isLoading || hasError }">
         <table mat-table [dataSource]="dataSource!" matSort 
-        [style.display]="!isLoading && !hasError ? 'revert' : 'none'">
+        [style.display]="!isLoading && operationsConsultEnabled && !hasError ? 'revert' : 'none'">
           <ng-container matColumnDef="ID">
             <th mat-header-cell *matHeaderCellDef mat-sort-header>#</th>
             <td mat-cell *matCellDef="let row">{{ row.ID_ORDEN }}</td>

+ 91 - 0
sistema-mantenimiento-front/src/app/components/corrective-maintenance/operations-management/operations-management.component.ts

@@ -17,6 +17,11 @@ import { ResourcesService } from 'src/app/services/resources/resources.service';
 import { CommnetsDialogComponent } from './commnets-dialog/commnets-dialog.component';
 import { TransferOrderDialogComponent } from './transfer-order-dialog/transfer-order-dialog.component';
 import { StatusTimelineComponent } from './status-timeline/status-timeline.component';
+import { Permissions, PermissionsInterface } from 'src/app/interfaces/permissions.interface';
+import { SocketService } from 'src/app/services/socket.service';
+import { UserConsultResponse } from 'src/app/interfaces/user.interface';
+import { UsersProfilesService } from 'src/app/services/users-profiles.service';
+import { ProfileInterface } from 'src/app/interfaces/profile.interface';
 
 @Component({
   selector: 'app-operations-management',
@@ -39,6 +44,11 @@ export class OperationsManagementComponent implements OnInit {
   @ViewChild(MatPaginator) paginator?: MatPaginator;
   @ViewChild(MatSort) sort?: MatSort;
 
+  operationsConsultEnabled: boolean;
+  /*manualActivationEnabled: boolean;
+  workOrderGenerationEnabled: boolean;
+  workOrderTransfer: boolean;*/
+
   constructor(
     private _activatedRoute: ActivatedRoute,
     private _router: Router,
@@ -48,6 +58,8 @@ export class OperationsManagementComponent implements OnInit {
     private _functionsService: FunctionsService,
     private _dialog: MatDialog,
     private _resourcesService: ResourcesService,
+    private _socketService: SocketService,
+    private _usersProfilesService: UsersProfilesService,
   ) {
     this.isLoading = true;
     this.hasError = false;
@@ -57,6 +69,8 @@ export class OperationsManagementComponent implements OnInit {
     
     this.txtBuscador = '';
     this.btnSmall = window.innerWidth <= 1405;
+
+    this.operationsConsultEnabled = true;
   }
 
   ngOnInit(): void {
@@ -68,6 +82,58 @@ export class OperationsManagementComponent implements OnInit {
         this.init(data);
       }
     });
+
+    this._socketService.refreshPermissions().subscribe(async (profUpdEnc) => {
+      try{
+        let idUser = localStorage.getItem('idusuario')!;
+        let usrInfo: UserConsultResponse = await lastValueFrom(this._usersProfilesService.getUser(idUser, idUser, 1));
+        
+        if(usrInfo.error){
+          this._resourcesService.openSnackBar('ERR_NPE000: Ocurrió un error inesperado.');
+        }else{
+          let idProfDec = await this._encService.decrypt(usrInfo.response.PERFIL);
+          let currentProfile = await this._encService.decrypt(localStorage.getItem('perfil')!);
+
+          if(idProfDec != currentProfile){
+            this._router.navigate(['/sam/home']);
+            return;
+          }
+          
+          let profileUpdated = await this._encService.decrypt(`${profUpdEnc}`);
+          if(profileUpdated == currentProfile){
+            let profile = localStorage.getItem('perfil')!;
+            let profInfo: ProfileInterface = await lastValueFrom(this._usersProfilesService.getProfile(
+              profile,
+              idUser,
+              1
+            ));
+
+            let permArr = await this._functionsService.processPermissions(profInfo.response.PERMISOS.permissions);
+            let modPerm = permArr.filter(item => item.id == 'S002V01M09GMCO');
+            if(modPerm.length > 0){
+              let subPerm = modPerm[0].children.filter(item => item.id == 'S002V01S01ORTR');
+              if(subPerm.length > 0){
+                let funPerm = subPerm[0].children.filter(item => item.id == 'S002V01F01GEOP');
+                if(funPerm.length > 0){
+                  let operationsConsultEnabled = funPerm[0].children.filter(item => item.id == 'S002V01P01COOP');
+                  if(operationsConsultEnabled.length > 0){
+                    this.operationsConsultEnabled = operationsConsultEnabled[0].access > 0;
+                  }
+                }
+              }
+            }
+          }
+        }
+      }catch(error: any){
+        if(error.error == undefined){
+          this._resourcesService.openSnackBar('ERR_PAD001: Ocurrió un error inesperado.');
+        }else if(error.error.msg == undefined){
+          this._resourcesService.openSnackBar('ERR_PAD002: Ocurrió un error inesperado.');
+        }else{
+          this._resourcesService.openSnackBar(`ERR_PAD003: ${error.error.msg}`);
+        }
+      }
+    });
   }
 
   async init(dataEnc: string){
@@ -157,6 +223,31 @@ export class OperationsManagementComponent implements OnInit {
         this.dataSource = new MatTableDataSource(workOrdersArr);
         this.dataSource.paginator = this.paginator!;
         this.dataSource.sort = this.sort!;
+        
+        let permissionsEnc = localStorage.getItem('permisos');
+        let permissionsDec = '';
+        if(permissionsEnc == '' || permissionsEnc == undefined || permissionsEnc == null){
+          permissionsDec = '[]';
+        }else{
+          permissionsDec = await this._encService.decrypt(permissionsEnc!);
+        }
+
+        let permissionsArr: Permissions = JSON.parse(permissionsDec);
+        if(permissionsArr.permissions != undefined){
+          let modPerm = permissionsArr.permissions.filter(item => item.id == 'S002V01M09GMCO');
+          if(modPerm.length > 0){
+            let subPerm = modPerm[0].children.filter(item => item.id == 'S002V01S01ORTR');
+            if(subPerm.length > 0){
+              let funPerm = subPerm[0].children.filter(item => item.id == 'S002V01F01GEOP');
+              if(funPerm.length > 0){
+                let operationsConsultEnabled = funPerm[0].children.filter(item => item.id == 'S002V01P01COOP');
+                if(operationsConsultEnabled.length > 0){
+                  this.operationsConsultEnabled = operationsConsultEnabled[0].access > 0;
+                }
+              }
+            }
+          }
+        }
       }
 
       this.isLoading = false;

+ 1 - 1
sistema-mantenimiento-front/src/app/components/equipment-management/equipment-details/equipment-details.component.html

@@ -199,7 +199,7 @@
           <mat-icon>menu_book</mat-icon>
         </button>
         <button mat-mini-fab class="override_no_shadow white_font orange_primary_background mr-10" matTooltip="Gestionar criticidad de seguridad" 
-        (click)="openCriticalityManagement()">
+        (click)="openCriticalityManagement()" [disabled]="!securityCriticalityEnabled">
           <mat-icon>report</mat-icon>
         </button>
         <button mat-mini-fab class="override_no_shadow mr-10" color="warn" matTooltip="Exportar a PDF" (click)="exportEquipmentDetails('PDF')">

+ 2 - 0
sistema-mantenimiento-front/src/app/components/equipment-management/equipment-details/equipment-details.component.ts

@@ -20,6 +20,7 @@ export class EquipmentDetailsComponent implements OnInit {
   @Input() equipmentDetailsEnabled: boolean;
   @Input() equipmentImagesGalleryEnabled: boolean;
   @Input() relatedDocumentsTableEnabled: boolean;
+  @Input() securityCriticalityEnabled: boolean;
   @Output() refreshCriticality = new EventEmitter<string>();
   @Output() printFile = new EventEmitter<string>();
 
@@ -41,6 +42,7 @@ export class EquipmentDetailsComponent implements OnInit {
     this.equipmentDetailsEnabled = true;
     this.equipmentImagesGalleryEnabled = true;
     this.relatedDocumentsTableEnabled = true;
+    this.securityCriticalityEnabled = true;
     this.images = [];
     this.imageIndex = 0;
     this.screenWidth = window.innerWidth;

+ 1 - 1
sistema-mantenimiento-front/src/app/components/equipment-management/equipment-management.component.html

@@ -121,7 +121,7 @@
       <div class="equipments-container w-100" *ngIf="!isLoading && !hasError && currentLevel >= 3">
         <app-equipment-details class="w-100" [equipment]="parentEquipmentDetails" *ngIf="currentLevel > 3" [equipmentDetailsEnabled]="equipmentDetailsEnabled" 
         (refreshCriticality)="updateEquipmentCriticality($event)" (printFile)="generateFile($event)" [relatedDocumentsTableEnabled]="relatedDocumentsTableEnabled" 
-        [equipmentImagesGalleryEnabled]="equipmentImagesGalleryEnabled"></app-equipment-details>
+        [equipmentImagesGalleryEnabled]="equipmentImagesGalleryEnabled" [securityCriticalityEnabled]="securityCriticalityEnabled"></app-equipment-details>
         <app-equipment-card equipmentType="equipment" *ngFor="let equipment of equipmentsBySubfamily" [equipment]="equipment" 
         (openChildren)="openChildren($event)" [equipmentDetailsEnabled]="equipmentDetailsEnabled"></app-equipment-card>
 

+ 12 - 0
sistema-mantenimiento-front/src/app/components/equipment-management/equipment-management.component.ts

@@ -70,6 +70,7 @@ export class EquipmentManagementComponent implements OnInit {
   equipmentTypeManagementEnabled: boolean;
   equipmentLocationEnabled: boolean;
   viewArborescenceInData: boolean;
+  securityCriticalityEnabled: boolean;
 
   constructor(
     @Inject(DOCUMENT) private _document: Document,
@@ -128,6 +129,7 @@ export class EquipmentManagementComponent implements OnInit {
     this.equipmentTypeManagementEnabled = true;
     this.equipmentLocationEnabled = true;
     this.viewArborescenceInData = true;
+    this.securityCriticalityEnabled = true;
   }
 
   ngOnInit(): void {
@@ -236,6 +238,11 @@ export class EquipmentManagementComponent implements OnInit {
                   this.viewArborescenceInData = viewArborescenceInData[0].access > 0;
                 }
               }
+
+              let securityCriticalityEnabled = modPerm[0].children.filter(item => item.id == 'S002V01F03GCSE');
+              if(securityCriticalityEnabled.length > 0){
+                this.securityCriticalityEnabled = securityCriticalityEnabled[0].access > 0;
+              }
             }
           }
         }
@@ -337,6 +344,11 @@ export class EquipmentManagementComponent implements OnInit {
               this.viewArborescenceInData = viewArborescenceInData[0].access > 0;
             }
           }
+
+          let securityCriticalityEnabled = modPerm[0].children.filter(item => item.id == 'S002V01F03GCSE');
+          if(securityCriticalityEnabled.length > 0){
+            this.securityCriticalityEnabled = securityCriticalityEnabled[0].access > 0;
+          }
         }
       }
   

+ 17 - 6
sistema-mantenimiento-front/src/app/components/equipment-management/subfamilies-management/subfamilies-management.component.html

@@ -81,17 +81,28 @@
           <ng-container matColumnDef="ACCIONES">
             <th mat-header-cell *matHeaderCellDef>Acciones</th>
             <td mat-cell *matCellDef="let row">
-              <button mat-mini-fab matTooltip="Editar subfamilia" class="override_no_shadow mr-4" color="primary" [disabled]="row.ESTADO == 'Eliminado'" 
-              (click)="openFamilyForm('edit', row)">
+              <button mat-mini-fab matTooltip="Editar subfamilia" class="override_no_shadow mr-4 animated fadeIn" color="primary" 
+              [disabled]="row.ESTADO == 'Eliminado'" (click)="openFamilyForm('edit', row)" *ngIf="!btnSmall">
                 <mat-icon>edit</mat-icon>
               </button>
-              <button mat-mini-fab matTooltip="Eliminar subfamilia" class="override_no_shadow" color="warn" [disabled]="row.ESTADO == 'Eliminado'" 
-              (click)="deleteSubfamily(row.CODIGOSUBFAMILIA)">
+              <button mat-mini-fab matTooltip="Eliminar subfamilia" class="override_no_shadow animated fadeIn" color="warn" [disabled]="row.ESTADO == 'Eliminado'" 
+              (click)="deleteSubfamily(row.CODIGOSUBFAMILIA)" *ngIf="!btnSmall">
                 <mat-icon>delete</mat-icon>
               </button>
-              <button>
-                
+              <button mat-mini-fab class="override_no_shadow animated fadeIn" color="primary" *ngIf="btnSmall" [mat-menu-trigger-for]="menu" 
+              [disabled]="row.ESTADO == 'Eliminado'">
+                <mat-icon>more_vert</mat-icon>
               </button>
+              <mat-menu #menu>
+                <button mat-menu-item (click)="openFamilyForm('edit', row)">
+                  <span>Editar subfamilia</span>
+                  <mat-icon>edit</mat-icon>
+                </button>
+                <button mat-menu-item (click)="deleteSubfamily(row.CODIGOSUBFAMILIA)">
+                  <span>Eliminar subfamilia</span>
+                  <mat-icon>delete</mat-icon>
+                </button>
+              </mat-menu>
             </td>
           </ng-container>
 

+ 64 - 2
sistema-mantenimiento-front/src/app/components/equipment-management/subfamilies-management/subfamilies-management.component.ts

@@ -1,7 +1,7 @@
 import { Component, OnInit, ViewChild } from '@angular/core';
 import { MatDialog } from '@angular/material/dialog';
 import { MatTableDataSource } from '@angular/material/table';
-import { ActivatedRoute } from '@angular/router';
+import { ActivatedRoute, Router } from '@angular/router';
 import { EncService } from 'src/app/services/enc/enc.service';
 import { ResourcesService } from 'src/app/services/resources/resources.service';
 import { NewSubfamilyComponent } from './new-subfamily/new-subfamily.component';
@@ -12,6 +12,10 @@ import { FunctionsService } from 'src/app/services/functions.service';
 import { MatPaginator } from '@angular/material/paginator';
 import { MatSort } from '@angular/material/sort';
 import { Permissions } from 'src/app/interfaces/permissions.interface';
+import { SocketService } from 'src/app/services/socket.service';
+import { UserConsultResponse } from 'src/app/interfaces/user.interface';
+import { UsersProfilesService } from 'src/app/services/users-profiles.service';
+import { ProfileInterface } from 'src/app/interfaces/profile.interface';
 
 @Component({
   selector: 'app-subfamilies-management',
@@ -44,7 +48,11 @@ export class SubfamiliesManagementComponent implements OnInit {
     private _dialog: MatDialog,
     private _equipmentManagementService: EquipmentManagementService,
     private _functionsService: FunctionsService,
+    private _socketService: SocketService,
+    private _usersProfilesService: UsersProfilesService,
+    private _router: Router,
   ) {
+    this.btnSmall = window.innerWidth <= 1405;
     this.isLoading = true;
     this.hasError = false;
     this.errorStr = "";
@@ -65,7 +73,61 @@ export class SubfamiliesManagementComponent implements OnInit {
       }else{
         this.init(familyCode);
       }
-    })
+    });
+
+    this._socketService.refreshPermissions().subscribe(async (profUpdEnc) => {
+      try{
+        let idUser = localStorage.getItem('idusuario')!;
+        let usrInfo: UserConsultResponse = await lastValueFrom(this._usersProfilesService.getUser(idUser, idUser, 1));
+        
+        if(usrInfo.error){
+          this._resourcesService.openSnackBar('ERR_NPE000: Ocurrió un error inesperado.');
+        }else{
+          let idProfDec = await this._encService.decrypt(usrInfo.response.PERFIL);
+          let currentProfile = await this._encService.decrypt(localStorage.getItem('perfil')!);
+
+          if(idProfDec != currentProfile){
+            this._router.navigate(['/sam/home']);
+            return;
+          }
+          
+          let profileUpdated = await this._encService.decrypt(`${profUpdEnc}`);
+          if(profileUpdated == currentProfile){
+            let profile = localStorage.getItem('perfil')!;
+            let profInfo: ProfileInterface = await lastValueFrom(this._usersProfilesService.getProfile(
+              profile,
+              idUser,
+              1
+            ));
+
+            let permArr = await this._functionsService.processPermissions(profInfo.response.PERMISOS.permissions);
+            let modPerm = permArr.filter(item => item.id == 'S002V01M07GEEQ');
+            if(modPerm.length > 0){
+              let funPerm = modPerm[0].children.filter(item => item.id == 'S002V01F02DFSU');
+              if(funPerm.length > 0){
+                let subfamilyConsultEnabled = funPerm[0].children.filter(item => item.id == 'S002V01P03COSU');
+                if(subfamilyConsultEnabled.length > 0){
+                  this.subfamilyConsultEnabled = subfamilyConsultEnabled[0].access > 0;
+                }
+      
+                let subfamilyRegisterEnabled = funPerm[0].children.filter(item => item.id == 'S002V01P04RESU');
+                if(subfamilyConsultEnabled.length > 0){
+                  this.subfamilyRegisterEnabled = subfamilyRegisterEnabled[0].access > 0;
+                }
+              }
+            }
+          }
+        }
+      }catch(error: any){
+        if(error.error == undefined){
+          this._resourcesService.openSnackBar('ERR_PAD001: Ocurrió un error inesperado.');
+        }else if(error.error.msg == undefined){
+          this._resourcesService.openSnackBar('ERR_PAD002: Ocurrió un error inesperado.');
+        }else{
+          this._resourcesService.openSnackBar(`ERR_PAD003: ${error.error.msg}`);
+        }
+      }
+    });
   }
 
   goBack(steps: number){

+ 1 - 1
sistema-mantenimiento-front/src/app/components/users-profiles/users-profiles.component.ts

@@ -100,7 +100,7 @@ export class UsersProfilesComponent implements OnInit {
           this._resourcesService.openSnackBar(`ERR_PAD003: ${error.error.msg}`);
         }
       }
-    })
+    });
   }
 
   async getSubmodules(){