[ADD] AJUSTE DE DATOS Y SUBIDA DE ARCHIVOS A DRIVE Y BASE

parent 5bac3d22
...@@ -28,6 +28,7 @@ ...@@ -28,6 +28,7 @@
"@angular/cli": "^18.2.1", "@angular/cli": "^18.2.1",
"@angular/compiler-cli": "^18.2.0", "@angular/compiler-cli": "^18.2.0",
"@types/jasmine": "~5.1.0", "@types/jasmine": "~5.1.0",
"@types/node": "^22.7.4",
"autoprefixer": "^10.4.20", "autoprefixer": "^10.4.20",
"jasmine-core": "~5.2.0", "jasmine-core": "~5.2.0",
"karma": "~6.4.0", "karma": "~6.4.0",
...@@ -4477,9 +4478,9 @@ ...@@ -4477,9 +4478,9 @@
} }
}, },
"node_modules/@types/node": { "node_modules/@types/node": {
"version": "22.5.1", "version": "22.7.4",
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.1.tgz", "resolved": "https://registry.npmjs.org/@types/node/-/node-22.7.4.tgz",
"integrity": "sha512-KkHsxej0j9IW1KKOOAA/XBA0z08UFSrRQHErzEfA3Vgq57eXIMYboIlHJuYIfd+lwCQjtKqUu3UnmKbtUc9yRw==", "integrity": "sha512-y+NPi1rFzDs1NdQHHToqeiX2TIS79SWEAw9GYhkkx8bD0ChpfqC+n2j5OXOCpzfojBEBt6DnEnnG9MY0zk1XLg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
...@@ -6695,9 +6696,9 @@ ...@@ -6695,9 +6696,9 @@
} }
}, },
"node_modules/engine.io": { "node_modules/engine.io": {
"version": "6.5.5", "version": "6.6.1",
"resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.5.tgz", "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.1.tgz",
"integrity": "sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA==", "integrity": "sha512-NEpDCw9hrvBW+hVEOK4T7v0jFJ++KgtPl4jKFwsZVfG1XhS0dCrSb3VMb9gPAd7VAdW52VT1EnaNiU2vM8C0og==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
...@@ -12517,9 +12518,9 @@ ...@@ -12517,9 +12518,9 @@
} }
}, },
"node_modules/socket.io": { "node_modules/socket.io": {
"version": "4.7.5", "version": "4.8.0",
"resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.5.tgz", "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.0.tgz",
"integrity": "sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==", "integrity": "sha512-8U6BEgGjQOfGz3HHTYaC/L1GaxDCJ/KM0XTkJly0EhZ5U/du9uNEZy4ZgYzEzIqlx2CMm25CrCqr1ck899eLNA==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"dependencies": { "dependencies": {
...@@ -12527,7 +12528,7 @@ ...@@ -12527,7 +12528,7 @@
"base64id": "~2.0.0", "base64id": "~2.0.0",
"cors": "~2.8.5", "cors": "~2.8.5",
"debug": "~4.3.2", "debug": "~4.3.2",
"engine.io": "~6.5.2", "engine.io": "~6.6.0",
"socket.io-adapter": "~2.5.2", "socket.io-adapter": "~2.5.2",
"socket.io-parser": "~4.2.4" "socket.io-parser": "~4.2.4"
}, },
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
"@angular/cli": "^18.2.1", "@angular/cli": "^18.2.1",
"@angular/compiler-cli": "^18.2.0", "@angular/compiler-cli": "^18.2.0",
"@types/jasmine": "~5.1.0", "@types/jasmine": "~5.1.0",
"@types/node": "^22.7.4",
"autoprefixer": "^10.4.20", "autoprefixer": "^10.4.20",
"jasmine-core": "~5.2.0", "jasmine-core": "~5.2.0",
"karma": "~6.4.0", "karma": "~6.4.0",
......
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
</div> </div>
</div> </div>
<div class="body flex flex-col items-center text-[13px] md:text-[18px] relative mx-2 my-10 md:mx-0"> <div class="body flex flex-col items-center text-[13px] md:text-[18px] relative mx-2 my-10 pb-5 md:mx-0">
<!---------------------------------------------------------------------- SECCION DATOS PERSONALES ----------------------------------------------------------------------> <!---------------------------------------------------------------------- SECCION DATOS PERSONALES ---------------------------------------------------------------------->
<mat-card appearance="outlined" class="mt-4 flex flex-col gap-2.5 text-[#222] !shadow-xl w-[90vw] md:w-[75vw]"> <mat-card appearance="outlined" class="mt-4 flex flex-col gap-2.5 text-[#222] !shadow-xl w-[90vw] md:w-[75vw]">
...@@ -23,20 +23,20 @@ ...@@ -23,20 +23,20 @@
<!-- <mat-card-content>DATOS PRINCIPALES</mat-card-content> --> <!-- <mat-card-content>DATOS PRINCIPALES</mat-card-content> -->
<mat-card-content class="w-full"> <mat-card-content class="w-full">
<div class="mt-10"> <div class="mt-10">
<div style="display: flex;width: 100% ; justify-content: space-between" [formGroup]="datos_personal"> <div class="flex flex-row gap-x-4" [formGroup]="datos_personal">
<mat-form-field style="width: 20rem" appearance="outline" floatLabel="always"> <mat-form-field class="basis-1/4" appearance="outline" floatLabel="always">
<mat-label>Técnico responsable</mat-label> <mat-label>Técnico responsable</mat-label>
<mat-select formControlName="tecnicoPersonal" placeholder="[Seleccionar técnico]" (selectionChange)="onEventTecnico($event)" required> <mat-select formControlName="tecnicoPersonal" placeholder="[Seleccionar técnico]" (selectionChange)="onEventoSeleccionTecnico($event)" required>
<mat-option *ngFor="let option of this.personal_list" [value]="option?.codper"> <mat-option *ngFor="let option of this.personal_list" [value]="option?.codper">
{{option?.personal}} {{option?.personal}}
</mat-option> </mat-option>
</mat-select> </mat-select>
</mat-form-field> </mat-form-field>
<mat-form-field style="width: 20rem" appearance="outline" floatLabel="always"> <mat-form-field class="basis-1/4" appearance="outline" floatLabel="always">
<mat-label>Área designada</mat-label> <mat-label>Área designada</mat-label>
<input formControlName="areaPersonal" matInput placeholder="[Área designada]" value="" readonly> <input formControlName="areaPersonal" matInput placeholder="[Área designada]" value="" readonly>
</mat-form-field> </mat-form-field>
<mat-form-field style="width: 20rem" appearance="outline" floatLabel="always"> <mat-form-field class="basis-1/4" appearance="outline" floatLabel="always">
<mat-label>Sede afectada : </mat-label> <mat-label>Sede afectada : </mat-label>
<mat-select formControlName="sedePersonal" placeholder="[Seleccionar sede]" required> <mat-select formControlName="sedePersonal" placeholder="[Seleccionar sede]" required>
<mat-option *ngFor="let option of this.sede_list" [value]="option?.codlocal"> <mat-option *ngFor="let option of this.sede_list" [value]="option?.codlocal">
...@@ -45,7 +45,7 @@ ...@@ -45,7 +45,7 @@
</mat-select> </mat-select>
</mat-form-field> </mat-form-field>
<!-- <mat-form-field [formGroup]="datos_fechaTrabajo" style="width: 20rem" appearance="outline" floatLabel="always"> --> <!-- <mat-form-field [formGroup]="datos_fechaTrabajo" style="width: 20rem" appearance="outline" floatLabel="always"> -->
<mat-form-field style="width: 20rem" appearance="outline" floatLabel="always"> <mat-form-field class="basis-1/4" appearance="outline" floatLabel="always">
<mat-label>Rango de fechas : </mat-label> <mat-label>Rango de fechas : </mat-label>
<mat-date-range-input [rangePicker]="picker"> <mat-date-range-input [rangePicker]="picker">
<input matStartDate formControlName="minFechaTrabajo" placeholder="Fecha inicial" readonly > <input matStartDate formControlName="minFechaTrabajo" placeholder="Fecha inicial" readonly >
...@@ -59,16 +59,15 @@ ...@@ -59,16 +59,15 @@
<!---------------------------------------------------------------------- SECCION DATOS PERSONALES ----------------------------------------------------------------------> <!---------------------------------------------------------------------- SECCION DATOS PERSONALES ---------------------------------------------------------------------->
<!---------------------------------------------------------------------- SECCION PASAJE ----------------------------------------------------------------------> <!---------------------------------------------------------------------- SECCION PASAJE ---------------------------------------------------------------------->
<div style="width: 100%; display: flex;justify-content: flex-start"> <div class="flex flex-row gap-x-4">
<div style="margin : 0 20px 0 0"> <div class="basis-3/12">
<mat-form-field [formGroup]="datos_pasajeAcumulado" style="width: 20rem" appearance="outline" floatLabel="always"> <mat-form-field [formGroup]="datos_personal" style="width: 20rem" appearance="outline" floatLabel="always">
<mat-label>Pasaje designado : </mat-label> <mat-label>Pasaje designado : </mat-label>
<input matInput formControlName="pasajeTotal" placeholder="Calculo final del pasaje" value="" readonly> <input matInput formControlName="pasajeTotal" placeholder="Calculo final del pasaje" value="" readonly>
</mat-form-field> </mat-form-field>
</div> </div>
<div> <div class="basis-9/12 ">
<div class="grid gap-4 grid-cols-2"> <div class="grid gap-4 grid-cols-2">
<mat-label class="text-[1.1em] font-bold mb-4" style="display: flex;align-items: center;margin: unset">LISTADO DE PASAJES <mat-icon>attach_money</mat-icon> </mat-label> <mat-label class="text-[1.1em] font-bold mb-4" style="display: flex;align-items: center;margin: unset">LISTADO DE PASAJES <mat-icon>attach_money</mat-icon> </mat-label>
<button mat-raised-button [ngStyle]="{'visibility': activarPasajes ? 'visible' : 'hidden'}" [disabled]="!activarPasajes" (click)="onEventoNuevoPasaje($event)"> <button mat-raised-button [ngStyle]="{'visibility': activarPasajes ? 'visible' : 'hidden'}" [disabled]="!activarPasajes" (click)="onEventoNuevoPasaje($event)">
<mat-icon>add</mat-icon> <mat-icon>add</mat-icon>
...@@ -81,7 +80,7 @@ ...@@ -81,7 +80,7 @@
<th mat-header-cell *matHeaderCellDef> LUGAR DE ORIGEN </th> <th mat-header-cell *matHeaderCellDef> LUGAR DE ORIGEN </th>
<td mat-cell *matCellDef="let element"> <td mat-cell *matCellDef="let element">
<ng-container *ngIf="element.isNew; else displayOrigen"> <ng-container *ngIf="element.isNew; else displayOrigen">
<mat-form-field [formGroup]="datos_lugarOrigen" style="width: 20rem" appearance="outline" floatLabel="always"> <mat-form-field [formGroup]="datos_lugarOrigen" appearance="outline" floatLabel="always">
<mat-select formControlName="lugarOrigen{{element.index}}" placeholder="[Seleccionar de origen]" required> <mat-select formControlName="lugarOrigen{{element.index}}" placeholder="[Seleccionar de origen]" required>
<mat-option *ngFor="let option of this.sede_list" [value]="option?.codlocal"> <mat-option *ngFor="let option of this.sede_list" [value]="option?.codlocal">
{{option?.deslocal}} {{option?.deslocal}}
...@@ -99,7 +98,7 @@ ...@@ -99,7 +98,7 @@
<th mat-header-cell *matHeaderCellDef> LUGAR DESTINO </th> <th mat-header-cell *matHeaderCellDef> LUGAR DESTINO </th>
<td mat-cell *matCellDef="let element"> <td mat-cell *matCellDef="let element">
<ng-container *ngIf="element.isNew; else displayOrigen"> <ng-container *ngIf="element.isNew; else displayOrigen">
<mat-form-field style="width: 20rem" appearance="outline"> <mat-form-field appearance="outline">
<input matInput placeholder="[Lugar de Destino]" [value]="lugarDestinoPasaje" readonly> <input matInput placeholder="[Lugar de Destino]" [value]="lugarDestinoPasaje" readonly>
</mat-form-field> </mat-form-field>
</ng-container> </ng-container>
...@@ -113,7 +112,7 @@ ...@@ -113,7 +112,7 @@
<th mat-header-cell *matHeaderCellDef> MONTO </th> <th mat-header-cell *matHeaderCellDef> MONTO </th>
<td mat-cell *matCellDef="let element"> <td mat-cell *matCellDef="let element">
<ng-container *ngIf="element.isNew; else displayOrigen"> <ng-container *ngIf="element.isNew; else displayOrigen">
<mat-form-field [formGroup]="datos_pasajeAcumulado" style="width: 10rem" appearance="outline"> <mat-form-field [formGroup]="datos_pasajeAcumulado" appearance="outline">
<input matInput formControlName="montoPasaje{{element.index}}" soloNumeros placeholder="[Monto]" value=""> <input matInput formControlName="montoPasaje{{element.index}}" soloNumeros placeholder="[Monto]" value="">
</mat-form-field> </mat-form-field>
</ng-container> </ng-container>
...@@ -127,7 +126,7 @@ ...@@ -127,7 +126,7 @@
<th mat-header-cell *matHeaderCellDef> FECHA </th> <th mat-header-cell *matHeaderCellDef> FECHA </th>
<td mat-cell *matCellDef="let element"> <td mat-cell *matCellDef="let element">
<ng-container *ngIf="element.isNew; else displayOrigen"> <ng-container *ngIf="element.isNew; else displayOrigen">
<mat-form-field [formGroup]="datos_fechaPasaje" style="width: 10rem" appearance="outline"> <mat-form-field [formGroup]="datos_fechaPasaje" appearance="outline">
<input matInput [matDatepicker]="fechaPasaje" formControlName="fechaPasaje{{element.index}}" [min]="minFechaLimite" [max]="maxFechaLimite"> <input matInput [matDatepicker]="fechaPasaje" formControlName="fechaPasaje{{element.index}}" [min]="minFechaLimite" [max]="maxFechaLimite">
<mat-hint>DD/MM/YYYY</mat-hint> <mat-hint>DD/MM/YYYY</mat-hint>
<mat-datepicker-toggle matIconSuffix [for]="fechaPasaje"></mat-datepicker-toggle> <mat-datepicker-toggle matIconSuffix [for]="fechaPasaje"></mat-datepicker-toggle>
...@@ -190,17 +189,17 @@ ...@@ -190,17 +189,17 @@
<mat-form-field style="width: 15rem" appearance="outline" floatLabel="always"> <mat-form-field style="width: 15rem" appearance="outline" floatLabel="always">
<mat-label>Listado de Requerimientos</mat-label> <mat-label>Listado de Requerimientos</mat-label>
<input type="text" placeholder="Buscar requerimiento" matInput #inputBusqueda formControlName="selectedOption" [matAutocomplete]="auto" maxlength="9" <input type="text" placeholder="Buscar requerimiento" matInput #inputBusqueda formControlName="busquedaReq" [matAutocomplete]="auto" maxlength="9"
(input)="onBusquedaRequerimiento($event)"> (input)="onBusquedaRequerimiento($event)">
<mat-autocomplete #auto="matAutocomplete" (optionSelected)="onEventSeleccion($event)" > <mat-autocomplete #auto="matAutocomplete" (optionSelected)="onEventSeleccion($event)" >
<mat-option *ngFor="let option of filteredOptions" [value]="option.codigo"> <mat-option *ngFor="let option of requerimientosFiltrados" [value]="option.codigo">
{{ option.numero }} {{ option.numero }}
</mat-option> </mat-option>
</mat-autocomplete> </mat-autocomplete>
</mat-form-field> </mat-form-field>
<div class="grid grid-cols-5 gap-4"> <div class="grid grid-cols-5 gap-4">
<div class="contenedorRequerimiento" *ngFor="let card of cards" style="display: flex"> <div class="contenedorRequerimiento" *ngFor="let card of listRequerimientos" style="display: flex">
<mat-card> <mat-card>
<mat-card-content> <mat-card-content>
<mat-card-subtitle style="font-size: 1rem;font-weight: bold;align-content: center">{{ card.titulo }}</mat-card-subtitle> <mat-card-subtitle style="font-size: 1rem;font-weight: bold;align-content: center">{{ card.titulo }}</mat-card-subtitle>
...@@ -219,16 +218,13 @@ ...@@ -219,16 +218,13 @@
</div> </div>
<br> <br>
<mat-label [ngClass]="{'fade-out': isFading}" [innerText]="labelText"></mat-label> <mat-label [ngClass]="{'fade-out': isFading}" [innerText]="labelText"></mat-label>
</div> </div>
<br>
<div class="grid grid-flow-col md:grid-cols-2 gap-5" > <div class="grid grid-flow-col md:grid-cols-2 gap-5" >
<div> <div>
<mat-form-field class="example-full-width"> <mat-form-field class="example-full-width">
<mat-label>DESCRIPCIÓN DEL PROBLEMA : </mat-label> <mat-label>DESCRIPCIÓN DEL PROBLEMA : </mat-label>
<textarea matInput placeholder="Breve descripciòn sobrel los problemas encontrados en la sede" formControlName="descripcionServicio" <textarea matInput placeholder="Breve descripción sobrel los problemas encontrados en la sede" formControlName="descripcionServicio"
cdkTextareaAutosize cdkTextareaAutosize
cdkAutosizeMinRows="3" cdkAutosizeMinRows="3"
cdkAutosizeMaxRows="10"></textarea> cdkAutosizeMaxRows="10"></textarea>
...@@ -236,8 +232,8 @@ ...@@ -236,8 +232,8 @@
</div> </div>
<div> <div>
<mat-form-field class="example-full-width"> <mat-form-field class="example-full-width">
<mat-label>CAUSA : </mat-label> <mat-label>DESCRIPCIÓN DE LA CAUSA : </mat-label>
<textarea matInput placeholder="Breve descripciòn sobre las causas del problema" formControlName="causaServicio" <textarea matInput placeholder="Breve descripción sobre las causas del problema" formControlName="causaServicio"
cdkTextareaAutosize cdkTextareaAutosize
cdkAutosizeMinRows="3" cdkAutosizeMinRows="3"
cdkAutosizeMaxRows="10"></textarea> cdkAutosizeMaxRows="10"></textarea>
...@@ -247,37 +243,54 @@ ...@@ -247,37 +243,54 @@
</div> </div>
<div class="grid grid-flow-col md:grid-cols-2 gap-5"> <div class="grid grid-flow-col md:grid-cols-2 gap-5">
<!--<label>EVIDENCIA DEL PROBLEMA</label> --> <div class="">
<div class="grid grid-cols-3 md:grid-cols-1 gap-2.5 pb-2 border-b md:border-b-0 border-b-red-950/50"> <div> <b class="md:text-[0.7em] text-[1em] text-black/60">EVIDENCIAS DEL PROBLEMAS : </b> </div>
<b class="md:text-[0.7em] text-[1em] text-black/60">PROBLEMAS :</b> <div>
<button mat-fab extended <button mat-fab class="!w-full"
[color]="botonesEvidencia.botonProblema.estado ? 'success' : 'blue'" [color]="'blue'"
(click)="file1.click()"> (click)="file1.click()">
{{ botonesEvidencia.botonProblema.texto }} <mat-label> SUBIR EVIDENCIA DEL PROBLEMA </mat-label>
<ng-container *ngIf="botonesEvidencia.botonProblema.estado; else elseTemplate">
<mat-icon class="font-size: 48px; height: 48px; width: 48px">arrow_upload_ready</mat-icon>
</ng-container>
<ng-template #elseTemplate>
<mat-icon class="font-size: 48px; height: 48px; width: 48px">file_open</mat-icon> <mat-icon class="font-size: 48px; height: 48px; width: 48px">file_open</mat-icon>
</ng-template> </button>
</button> <input type="file" #file1 (change)="onEventoSubirArchivo($event)" class="hidden" multiple accept="image/png" />
<input id="botonProblema" #file1 type="file" class="hidden" (change)="onEventoDocumentos($event)"> </div>
<br>
<div *ngFor="let archivo of archivosEvidencia; let i = index" class="flex">
<div *ngIf="archivo.tipoEvidencia === 1" class="flex w-full">
<div class="w-2/4"><p>{{ (archivo.file.name + ' (' + (archivo.file.size / 1000) + ' KB)') | truncate:30:true }}</p></div>
<div class="w-2/4 grid grid-cols-3 gap-4 justify-center" >
<button type="button" (click)="gestionArchivos(i,1,archivo.file)"><mat-icon class="mat-icon-small">info</mat-icon></button>
<button type="button" (click)="seleccionarInput(i,1)"><mat-icon class="mat-icon-small">edit</mat-icon></button>
<input type="file" #fileEditar1 (change)="gestionArchivos(i,2,$event)" class="hidden" multiple accept="image/png" />
<button type="button" (click)="gestionArchivos(i,3)"><mat-icon class="mat-icon-small">delete</mat-icon></button>
</div>
</div>
</div>
</div> </div>
<div class="grid grid-cols-3 md:grid-cols-1 gap-2.5 pb-2 border-b md:border-b-0 border-b-red-950/50"> <div class="">
<b class="md:text-[0.7em] text-[1em] text-black/60">SOLUCIONES : </b> <div> <b class="md:text-[0.7em] text-[1em] text-black/60">EVIDENCIAS DE SOLUCIONES :</b> </div>
<button mat-fab extended <div>
[color]="botonesEvidencia.botonSolucion.estado ? 'success' : 'blue'" <button mat-fab class="!w-full"
(click)="file2.click()"> [color]="'blue'"
{{ botonesEvidencia.botonSolucion.texto }} (click)="file2.click()">
<ng-container *ngIf="botonesEvidencia.botonSolucion.estado; else elseTemplate"> <mat-label>SUBIR EVIDENCIA DE LA SOLUCIÓN</mat-label>
<mat-icon>arrow_upload_ready</mat-icon>
</ng-container>
<ng-template #elseTemplate>
<mat-icon>file_open</mat-icon> <mat-icon>file_open</mat-icon>
</ng-template> </button>
</button> <input type="file" #file2 (change)="onEventoSubirArchivo($event,2)" class="hidden" multiple accept="image/png">
<input id="botonSolucion" #file2 type="file" class="hidden" (change)="onEventoDocumentos($event)"> </div>
<br>
<div *ngFor="let archivo of archivosEvidencia; let i = index" class="flex">
<div *ngIf="archivo.tipoEvidencia === 2" class="flex w-full">
<div class="w-2/4"><p>{{ (archivo.file.name + ' (' + (archivo.file.size / 1000) + ' KB)') | truncate:30:true }}</p></div>
<div class="w-2/4 grid grid-cols-3 gap-4 justify-center" >
<button type="button" (click)="gestionArchivos(i,1,archivo.file,2)"><mat-icon class="mat-icon-small">info</mat-icon></button>
<button type="button" (click)="seleccionarInput(i,2)"><mat-icon class="mat-icon-small">edit</mat-icon></button>
<input type="file" #fileEditar2 (change)="gestionArchivos(i,2,$event,2)" class="hidden" multiple accept="image/png" />
<button type="button" (click)="gestionArchivos(i,3,2)"><mat-icon class="mat-icon-small">delete</mat-icon></button>
</div>
</div>
</div>
</div> </div>
</div> </div>
...@@ -286,6 +299,7 @@ ...@@ -286,6 +299,7 @@
</mat-card> </mat-card>
<!---------------------------------------------------------------------- SERVICIOS PRESTADOS ----------------------------------------------------------------------> <!---------------------------------------------------------------------- SERVICIOS PRESTADOS ---------------------------------------------------------------------->
<!---------------------------------------------------------------------- TRABAJOS PRESTADOS ---------------------------------------------------------------------->
<mat-card appearance="outlined" class="mt-4 flex flex-col gap-2.5 text-[#222] !shadow-xl w-[90vw] md:w-[75vw]"> <mat-card appearance="outlined" class="mt-4 flex flex-col gap-2.5 text-[#222] !shadow-xl w-[90vw] md:w-[75vw]">
<mat-card-header class="flex flex-col items-center w-full "> <mat-card-header class="flex flex-col items-center w-full ">
...@@ -313,19 +327,37 @@ ...@@ -313,19 +327,37 @@
</mat-card-content> </mat-card-content>
</mat-card> </mat-card>
<!---------------------------------------------------------------------- TRABAJOS PRESTADOS ---------------------------------------------------------------------->
<mat-card appearance="outlined" class="mt-4 flex flex-col gap-2.5 text-[#222] !shadow-xl w-[90vw] md:w-[75vw]" [formGroup]="datos_materialSobrante">
<mat-card-header class="justify-center content-center gap-x-4 w-full mb-4">
<mat-label class="flex items-center text-[1.1em] font-bold">
MATERIAL SOBRANTE
</mat-label>
<mat-button-toggle-group formControlName="existeMaterial" aria-label="Existe material sobrante" >
<mat-button-toggle value="1">SI</mat-button-toggle>
<mat-button-toggle value="2">NO</mat-button-toggle>
</mat-button-toggle-group>
</mat-card-header>
<!-- Mostrar componente solo si existeMaterial es "1" -->
<ng-container *ngIf="datos_materialSobrante.get('existeMaterial')?.value === '1'">
<!-- Componente a mostrar -->
<mat-card-content>
<ordensalida-component></ordensalida-component>
</mat-card-content>
</ng-container>
<mat-card appearance="outlined" class="titulo-Principal">
<mat-card-content>MATERIAL SOBRANTE</mat-card-content>
</mat-card> </mat-card>
<mat-label> ¿ Se encontro material para devolver al almacen ? : </mat-label>
<mat-button-toggle-group aria-label="Existe material sobrante" >
<mat-button-toggle value="1">SI</mat-button-toggle>
<mat-button-toggle value="2">NO</mat-button-toggle>
</mat-button-toggle-group>
<!-- <h4>MATERIAL SOBRANTE</h4> --> <div class="mt-4 flex flex-col">
<!--<div class="div-MaterialSobrante divisionGeneral" [formGroup]="datos_material"> <button mat-fab extended (click)="gestionConformidad()">
</div> --> <mat-icon>app_registration</mat-icon>
REGISTRO CONFORMIDAD
</button>
</div>
</div> </div>
......
import { Component, OnInit , ChangeDetectionStrategy , ChangeDetectorRef , Renderer2 , ElementRef, ViewChild , inject } from '@angular/core'; import { Component, OnInit, ChangeDetectorRef, Renderer2, ElementRef, ViewChild, inject, QueryList, ViewChildren } from '@angular/core';
import {FormControl, FormGroup, FormsModule, ReactiveFormsModule , Validators} from '@angular/forms'; import {FormBuilder, FormControl, FormGroup, FormsModule, ReactiveFormsModule, Validators} from '@angular/forms';
import {MatIconModule} from '@angular/material/icon'; import {MatIconModule} from '@angular/material/icon';
import {MatDividerModule} from '@angular/material/divider'; import {MatDividerModule} from '@angular/material/divider';
import {MatButtonModule} from '@angular/material/button'; import {MatButtonModule} from '@angular/material/button';
...@@ -13,8 +13,8 @@ import {MatCheckboxModule} from '@angular/material/checkbox'; ...@@ -13,8 +13,8 @@ import {MatCheckboxModule} from '@angular/material/checkbox';
import {ConformidadHelper} from "./helper/conformidad.helper"; import {ConformidadHelper} from "./helper/conformidad.helper";
import {NgClass, NgForOf, NgIf, DatePipe, AsyncPipe, NgStyle} from "@angular/common"; import {NgClass, NgForOf, NgIf, DatePipe, AsyncPipe, NgStyle} from "@angular/common";
import {MatCard, MatCardContent, MatCardFooter, MatCardHeader, MatCardTitle , MatCardModule} from '@angular/material/card'; import {MatCard, MatCardContent, MatCardFooter, MatCardHeader, MatCardTitle , MatCardModule} from '@angular/material/card';
import {Observable, from, min} from 'rxjs'; import {Observable, from, min, of} from 'rxjs';
import {switchMap, map, startWith , debounceTime } from 'rxjs/operators'; import { debounceTime, distinctUntilChanged, switchMap } from 'rxjs/operators';
import {MatAutocompleteModule} from '@angular/material/autocomplete'; import {MatAutocompleteModule} from '@angular/material/autocomplete';
import {MatTooltipModule} from '@angular/material/tooltip'; import {MatTooltipModule} from '@angular/material/tooltip';
import {MatDialog, MatDialogModule} from '@angular/material/dialog'; import {MatDialog, MatDialogModule} from '@angular/material/dialog';
...@@ -25,7 +25,10 @@ import { SoloNumerosDirective } from '../../service/directivas_service/soloNumer ...@@ -25,7 +25,10 @@ import { SoloNumerosDirective } from '../../service/directivas_service/soloNumer
import { MY_DATE_FORMATS } from "../../service/directivas_service/formatoFecha/date-format"; // Asegúrate de ajustar la ruta import { MY_DATE_FORMATS } from "../../service/directivas_service/formatoFecha/date-format"; // Asegúrate de ajustar la ruta
import { MatSnackBar, MatSnackBarHorizontalPosition, MatSnackBarVerticalPosition,} from '@angular/material/snack-bar'; import { MatSnackBar, MatSnackBarHorizontalPosition, MatSnackBarVerticalPosition,} from '@angular/material/snack-bar';
import { ConfirmarEliminacionComponent } from './modalEliminarPasaje/eliminarPasaje.componente'; import { ConfirmarEliminacionComponent } from './modalEliminarPasaje/eliminarPasaje.componente';
import { modalEvidenciaComponent } from "./modalEvidencia/modalEvidencia.componente";
import { truncarCaracteresDirective } from "../../service/directivas_service/restriccionCaracteres/truncarCaracteres.directive";
import { ordenSalidaComponent } from "../ordensalida/ordensalida.componente";
import {elementSelectors} from "@angular/cdk/schematics";
interface tiposTrabajo { interface tiposTrabajo {
value: string; value: string;
...@@ -49,6 +52,11 @@ interface interDetallePasaje { ...@@ -49,6 +52,11 @@ interface interDetallePasaje {
acciones: boolean; acciones: boolean;
} }
interface interFile{
tipoEvidencia: number;
file: File;
}
@Component({ @Component({
imports: [ imports: [
SoloNumerosDirective, SoloNumerosDirective,
...@@ -87,6 +95,8 @@ interface interDetallePasaje { ...@@ -87,6 +95,8 @@ interface interDetallePasaje {
MatTableModule, MatTableModule,
NgIf, NgIf,
NgStyle, NgStyle,
truncarCaracteresDirective,
ordenSalidaComponent,
], ],
providers: [provideNativeDateAdapter(),DatePipe, { provide: MAT_DATE_FORMATS, useValue: MY_DATE_FORMATS } ], providers: [provideNativeDateAdapter(),DatePipe, { provide: MAT_DATE_FORMATS, useValue: MY_DATE_FORMATS } ],
selector: 'app-conformidad', selector: 'app-conformidad',
...@@ -102,27 +112,30 @@ export class ConformidadComponent implements OnInit { ...@@ -102,27 +112,30 @@ export class ConformidadComponent implements OnInit {
// VIEWCHILD // VIEWCHILD
@ViewChild('labelAdvertencia', { static: false }) labelAdvertencia!: ElementRef; @ViewChild('labelAdvertencia', { static: false }) labelAdvertencia!: ElementRef;
@ViewChild('inputBusqueda', { static: false }) inputBusqueda!: ElementRef; @ViewChild('inputBusqueda', { static: false }) inputBusqueda!: ElementRef;
@ViewChildren('fileEditar1') fileInputs1!: QueryList<ElementRef> ;
@ViewChildren('fileEditar2') fileInputs2!: QueryList<ElementRef> ;
@ViewChild(ordenSalidaComponent) ordenSalidaComponent!: ordenSalidaComponent;
// VIEWCHILD // VIEWCHILD
//INICIALIZACION DE LISTADO DE TIPOS DE TRABAJO //INICIALIZACION DE LISTADO DE TIPOS DE TRABAJO
listTipoTrabajo: tiposTrabajo[] = [ listTipoTrabajo: tiposTrabajo[] = [
{value: '1', viewValue: 'Instalaciòn-Revisión'}, {value: '1', viewValue: 'Instalación-Revisión'},
{value: '2', viewValue: 'Instalaciòn-Ampliación'}, {value: '2', viewValue: 'Instalación-Ampliación'},
{value: '3', viewValue: 'Mantenimiento-Reparación'}, {value: '3', viewValue: 'Mantenimiento-Reparación'},
{value: '4', viewValue: 'Mantenimiento-Remodelación'}, {value: '4', viewValue: 'Mantenimiento-Remodelación'},
{value: '5', viewValue: 'Reposición'}, {value: '5', viewValue: 'Reposición'},
{value: '6', viewValue: 'Reinstalación'}, {value: '6', viewValue: 'Reinstalación'},
]; ];
//INICIALIZACION DE LISTADO DE TIPOS DE TRABAJO //INICIALIZACION DE LISTADO DE TIPOS DE TRABAJO
// DATALIST //INICIALIZACION DE VARIABLES UTILIZABLES
personal_list: any = []; personal_list: any = [];
sede_list: any = []; sede_list: any = [];
filteredOptions: any[]; requerimientosFiltrados: any[] = [];
cards: { id: number; titulo: string; codigo: string}[] = []; listRequerimientos: { id: number; titulo: string; codigo: string}[] = [];
idBotones: number = 0; idBotones: number = 0;
indexPasaje : number = 0 ; indexPasaje : number = 0 ;
labelText: string = ''; // Texto que se muestra inicialmente labelText: string = ''; // Texto que se muestra inicialmente
...@@ -132,10 +145,6 @@ export class ConformidadComponent implements OnInit { ...@@ -132,10 +145,6 @@ export class ConformidadComponent implements OnInit {
columnasPasaje: string[] = ['lugarOrigen', 'lugarDestino', 'monto', 'fecha','accion']; columnasPasaje: string[] = ['lugarOrigen', 'lugarDestino', 'monto', 'fecha','accion'];
dataSource: interDetallePasaje[] = []; dataSource: interDetallePasaje[] = [];
botonesEvidencia: any = {
botonProblema : { texto : 'EVIDENCIA DEL PROBLEMA' , estado : false},
botonSolucion : { texto : 'EVIDENCIA DE SOLUCIÓN' , estado : false}
}
alertaPosicionHorizontal: MatSnackBarHorizontalPosition = 'center'; alertaPosicionHorizontal: MatSnackBarHorizontalPosition = 'center';
alertaPosicionVertical: MatSnackBarVerticalPosition = 'bottom'; alertaPosicionVertical: MatSnackBarVerticalPosition = 'bottom';
...@@ -144,7 +153,13 @@ export class ConformidadComponent implements OnInit { ...@@ -144,7 +153,13 @@ export class ConformidadComponent implements OnInit {
minFechaLimite: Date | null = new Date(); minFechaLimite: Date | null = new Date();
maxFechaLimite: Date | null = new Date(); maxFechaLimite: Date | null = new Date();
// DATALIST
archivosEvidencia : interFile[] = [];
archivosEP: File[] = [];
archivosES: File[] = [];
//INICIALIZACION DE VARIABLES UTILIZABLES
// GROUPO DE FORMULARIO // GROUPO DE FORMULARIO
...@@ -152,14 +167,16 @@ export class ConformidadComponent implements OnInit { ...@@ -152,14 +167,16 @@ export class ConformidadComponent implements OnInit {
tecnicoPersonal : new FormControl(null ,Validators.required), tecnicoPersonal : new FormControl(null ,Validators.required),
sedePersonal : new FormControl(null,Validators.required), sedePersonal : new FormControl(null,Validators.required),
areaPersonal : new FormControl<String | null>(null ,Validators.required), areaPersonal : new FormControl<String | null>(null ,Validators.required),
codAreaPersona : new FormControl(),
minFechaTrabajo : new FormControl<Date | null>(null, Validators.required), minFechaTrabajo : new FormControl<Date | null>(null, Validators.required),
maxFechaTrabajo : new FormControl<Date | null>(null, Validators.required), maxFechaTrabajo : new FormControl<Date | null>(null, Validators.required),
pasajeTotal: new FormControl<number | null>(null),
}); });
datos_servicio = new FormGroup({ datos_servicio = new FormGroup({
busquedaReq : new FormControl<String | null>(null ,[Validators.maxLength(12)]),
descripcionServicio : new FormControl(null ,Validators.required), descripcionServicio : new FormControl(null ,Validators.required),
causaServicio : new FormControl(null ,Validators.required), causaServicio : new FormControl(null ,Validators.required),
selectedOption : new FormControl<String | null>(null ,[Validators.maxLength(12)]),
}); });
datos_trabajo = new FormGroup({ datos_trabajo = new FormGroup({
...@@ -168,24 +185,29 @@ export class ConformidadComponent implements OnInit { ...@@ -168,24 +185,29 @@ export class ConformidadComponent implements OnInit {
}); });
datos_pasajeAcumulado = new FormGroup<any>({ datos_pasajeAcumulado = new FormGroup<any>({
pasajeTotal: new FormControl<number | null>(null, Validators.required)
}); });
datos_lugarOrigen : FormGroup = new FormGroup<any>({}) ; datos_lugarOrigen : FormGroup = new FormGroup<any>({}) ;
datos_fechaPasaje : FormGroup = new FormGroup<any>({}) ; datos_fechaPasaje : FormGroup = new FormGroup<any>({}) ;
datos_materialSobrante : FormGroup = new FormGroup({
existeMaterial : new FormControl(null ,Validators.required),
});
//formulario: FormGroup | undefined;
// GROUPO DE FORMULARIO // GROUPO DE FORMULARIO
constructor( constructor(
private conformidadHelper: ConformidadHelper, private conformidadHelper: ConformidadHelper,
private renderer: Renderer2, private renderer: Renderer2,
private detectorChage : ChangeDetectorRef, private detectorChange : ChangeDetectorRef,
public dialog: MatDialog, public dialog: MatDialog,
private datePipe: DatePipe, private datePipe: DatePipe,
private fb: FormBuilder
) { ) {
this.filteredOptions = []; this.requerimientosFiltrados = [];
renderer.setStyle(document.body, 'background', 'var(--light-theme-bg)'); renderer.setStyle(document.body, 'background', 'var(--light-theme-bg)');
} }
...@@ -213,6 +235,10 @@ export class ConformidadComponent implements OnInit { ...@@ -213,6 +235,10 @@ export class ConformidadComponent implements OnInit {
return this.datePipe.transform(fecha, 'yyyy/MM/dd') || ''; return this.datePipe.transform(fecha, 'yyyy/MM/dd') || '';
} }
formatoFechaRegistro(fecha: Date){
return this.datePipe.transform(fecha, 'yyyy-mm-dd') || '';
}
async ngOnInit(): Promise<void> { async ngOnInit(): Promise<void> {
const [ const [
...@@ -247,21 +273,8 @@ export class ConformidadComponent implements OnInit { ...@@ -247,21 +273,8 @@ export class ConformidadComponent implements OnInit {
this.datos_fechaPasaje.reset(); this.datos_fechaPasaje.reset();
this.datos_lugarOrigen.reset(); this.datos_lugarOrigen.reset();
} }
/*const tecnicoPersonal = this.datos_personal.get('tecnicoPersonal')?.value;
const sedePersonal = this.datos_personal.get('sedePersonal')?.value;
const areaPersonal = this.datos_personal.get('areaPersonal')?.value;
if(tecnicoPersonal && sedePersonal && areaPersonal){
this.datos_personal.get('lugarDestinoPasaje')?.setErrors({'incorrect': false});
}else{
this.datos_personal.get('lugarDestinoPasaje')?.setErrors({'incorrect': true});
}*/
}); });
// Sincronizar el valor de 'sedePersonal' con los selects la tabla de pasaje // Sincronizar el valor de 'sedePersonal' con los selects la tabla de pasaje
this.datos_personal.get('sedePersonal')?.valueChanges.subscribe((value) => { this.datos_personal.get('sedePersonal')?.valueChanges.subscribe((value) => {
this.lugarDestinoPasaje = this.sede_list.find((item: any) => item.codlocal === value)?.deslocal || ''; this.lugarDestinoPasaje = this.sede_list.find((item: any) => item.codlocal === value)?.deslocal || '';
...@@ -271,7 +284,7 @@ export class ConformidadComponent implements OnInit { ...@@ -271,7 +284,7 @@ export class ConformidadComponent implements OnInit {
this.datos_pasajeAcumulado.valueChanges.subscribe(values => { this.datos_pasajeAcumulado.valueChanges.subscribe(values => {
const inputControls = Object.keys(values).filter(key => key.includes('montoPasaje')); const inputControls = Object.keys(values).filter(key => key.includes('montoPasaje'));
const sum : number = (inputControls.reduce((acc, key) => acc + (Number(values[key]) || 0), 0) ) || 0; const sum : number = (inputControls.reduce((acc, key) => acc + (Number(values[key]) || 0), 0) ) || 0;
this.datos_pasajeAcumulado.get('pasajeTotal')?.setValue(sum, { emitEvent: false }); this.datos_personal.get('pasajeTotal')?.setValue(sum, { emitEvent: false });
}); });
//Condicionar a todos los controladores de Lugar de Origen para que si se escoge el mismo lugar que el lugar de origen salga una advertencia //Condicionar a todos los controladores de Lugar de Origen para que si se escoge el mismo lugar que el lugar de origen salga una advertencia
...@@ -296,42 +309,46 @@ export class ConformidadComponent implements OnInit { ...@@ -296,42 +309,46 @@ export class ConformidadComponent implements OnInit {
}); });
/*this.datos_fechaTrabajo.get('maxFechaTrabajo')?.valueChanges.subscribe((value) => {
let minFecha : any = this.datos_fechaTrabajo.get('minFechaTrabajo')?.value;*/
this.datos_personal.get('maxFechaTrabajo')?.valueChanges.subscribe((value) => { this.datos_personal.get('maxFechaTrabajo')?.valueChanges.subscribe((value) => {
let minFecha : any = this.datos_personal.get('minFechaTrabajo')?.value; let minFecha : any = this.datos_personal.get('minFechaTrabajo')?.value;
let maxFecha : any = value; let maxFecha : any = value;
if( minFecha && maxFecha ){ if( minFecha && maxFecha ){
this.minFechaLimite = new Date(minFecha); this.minFechaLimite = new Date(minFecha);
this.maxFechaLimite = new Date(maxFecha); this.maxFechaLimite = new Date(maxFecha);
//Obtener todos los formControNames dentro del formGroup datos_fechaPasaje //Obtener todos los formControNames dentro del formGroup datos_fechaPasaje
const inputControls = Object.keys(this.datos_fechaPasaje.controls); const inputControls = Object.keys(this.datos_fechaPasaje.controls);
//Iterar sobre cada formControlName //Iterar sobre cada formControlName
inputControls.forEach((key) => { inputControls.forEach((key) => {
let fechaPasaje = this.datos_fechaPasaje.get(key)?.value; let fechaPasaje = this.datos_fechaPasaje.get(key)?.value;
if(fechaPasaje){ if(fechaPasaje){
let fechaPasajeDate = new Date(fechaPasaje); let fechaPasajeDate = new Date(fechaPasaje);
if(fechaPasajeDate >= (this.minFechaLimite || new Date()) && fechaPasajeDate <= (this.maxFechaLimite|| new Date()) ){ if(fechaPasajeDate >= (this.minFechaLimite || new Date()) && fechaPasajeDate <= (this.maxFechaLimite|| new Date()) ){
this.datos_fechaPasaje.get(key)?.setErrors({'incorrect': false}); this.datos_fechaPasaje.get(key)?.setErrors({'incorrect': false});
}else{ }else{
this.datos_fechaPasaje.get(key)?.setErrors({'incorrect': true}); this.datos_fechaPasaje.get(key)?.setErrors({'incorrect': true});
this.datos_fechaPasaje.get(key)?.setValue(''); this.datos_fechaPasaje.get(key)?.setValue('');
}
} }
}); }
});
} }
}); });
this.datos_materialSobrante.get('existeMaterial')?.valueChanges.subscribe((value) => {
console.log(value);
});
} }
//AL SELECCIONAR UN REQUERIMIENTO //AL SELECCIONAR UN REQUERIMIENTO
onEventSeleccion(event : any){ onEventSeleccion(event : any){
const valor = event.option.value; const valor = event.option.value;
if(this.cards.find((item) => item.codigo === valor)){ if(this.listRequerimientos.find((item) => item.codigo === valor)){
this.labelText = 'Ya existe el requerimiento ' + valor + ' en el listado'; // Cambia el texto this.labelText = 'Ya existe el requerimiento ' + valor + ' en el listado'; // Cambia el texto
this.isFading = false; // Resetea el estado de opacidad para mostrar el texto this.isFading = false; // Resetea el estado de opacidad para mostrar el texto
...@@ -341,21 +358,24 @@ export class ConformidadComponent implements OnInit { ...@@ -341,21 +358,24 @@ export class ConformidadComponent implements OnInit {
}, 2000); // 2000 ms = 2 segundos }, 2000); // 2000 ms = 2 segundos
}else{ }else{
this.cards.push({ titulo: `RQ N°${valor}`, id: this.idBotones++ , codigo: valor }); this.listRequerimientos.push({ titulo: `RQ N°${valor}`, id: this.idBotones++ , codigo: valor });
this.labelText = ''; this.labelText = '';
} }
this.datos_servicio.get('selectedOption')?.setValue(''); this.datos_servicio.get('busquedaReq')?.setValue('');
this.inputBusqueda.nativeElement.blur(); this.inputBusqueda.nativeElement.blur();
this.detectorChage.detectChanges(); this.detectorChange.detectChanges();
this.filteredOptions = []; this.requerimientosFiltrados = [];
} }
//AL SELECCIONAR INFORMACION DE UN REQUERIMIENTO //AL SELECCIONAR INFORMACION DE UN REQUERIMIENTO
async infoRequerimiento(valor: any){ async infoRequerimiento(valor: any){
const requerimientoInfo = await this.conformidadHelper.listadoGeneralHorizon({accion: 3, nroRequerimiento: valor, sede: ''}); const requerimientoInfo = await this.conformidadHelper.listadoGeneralHorizon({accion: 3, nombreValor: valor, sede: ''});
const dialogRef = this.dialog.open(modalRequerimientoComponent,{ const dialogRef = this.dialog.open(modalRequerimientoComponent,{
width: '300rem', width: '100%',
maxWidth: '90%',
minWidth: '50%',
height: '50%',
data: { requerimientoInfo } data: { requerimientoInfo }
}); });
dialogRef.afterClosed().subscribe(result => { dialogRef.afterClosed().subscribe(result => {
...@@ -365,42 +385,27 @@ export class ConformidadComponent implements OnInit { ...@@ -365,42 +385,27 @@ export class ConformidadComponent implements OnInit {
//ELIMINAR REQUERIMIENTO SELECCIONADO //ELIMINAR REQUERIMIENTO SELECCIONADO
deleteRequerimiento(valor : any){ deleteRequerimiento(valor : any){
this.cards = this.cards.filter((item) => item.id !== valor); this.listRequerimientos = this.listRequerimientos.filter((item) => item.id !== valor);
}
//AL SUBIR UN ARCHIVO EN LOS BOTONES DE DOCUMENTOS
onEventoDocumentos(event: any){
const file = event?.target?.files[0] || null;
const nameFile = file?.name.replaceAll(' ', '_').toUpperCase() || null;
const elementId = event.target.getAttribute('id');
const botonMap = this.botonesEvidencia[elementId];
console.log(botonMap);
if(botonMap) {
if(file){
botonMap.estado = true;
botonMap.texto = nameFile;
}else{
botonMap.estado = false;
botonMap.texto = elementId === 'botonProblema' ? 'EVIDENCIA DEL PROBLEMA' : 'EVIDENCIA DE SOLUCIÓN';
}
}
} }
//AL SELECCIONAR UN TECNICO, MOSTRAR AUTOMATICAMENTE SU AREA //AL SELECCIONAR UN TECNICO, MOSTRAR AUTOMATICAMENTE SU AREA
onEventTecnico(event: any) { // IMPRIMER EL ÁREA DEL TÉCNICO AL SELECCIONARLO onEventoSeleccionTecnico(event: any) { // IMPRIMER EL ÁREA DEL TÉCNICO AL SELECCIONARLO
const areaControl = this.accesoDP().areaPersonal; const areaControl = this.datos_personal.get('areaPersonal');
const codAreaControl = this.datos_personal.get('codAreaPersona');
const codigoPer = event.value; const codigoPer = event.value;
const personal_list = this.personal_list; const personal_list = this.personal_list;
const personal_datos = personal_list.find((item: any) => item.codper === codigoPer); const personal_datos = personal_list.find((item: any) => item.codper === codigoPer);
if(Object.keys(personal_datos).length > 0){ if(Object.keys(personal_datos).length > 0){
areaControl.setValue(personal_datos.descargo); areaControl?.setValue(personal_datos.descargo);
codAreaControl?.setValue(personal_datos.codarea);
}else{ }else{
areaControl.setValue('Sin Cargo'); areaControl?.setValue('Sin Cargo');
codAreaControl?.setValue('0');
} }
areaControl.updateValueAndValidity(); areaControl?.updateValueAndValidity();
codAreaControl?.updateValueAndValidity();
} }
...@@ -411,7 +416,7 @@ export class ConformidadComponent implements OnInit { ...@@ -411,7 +416,7 @@ export class ConformidadComponent implements OnInit {
const jsonParametrosReq = { const jsonParametrosReq = {
accion : 2, accion : 2,
nroRequerimiento : busquedaReq, nombreValor : busquedaReq,
sede : codigoSede sede : codigoSede
}; };
...@@ -422,7 +427,7 @@ export class ConformidadComponent implements OnInit { ...@@ -422,7 +427,7 @@ export class ConformidadComponent implements OnInit {
numero: item.CODIGONUM numero: item.CODIGONUM
})); }));
this.filteredOptions = mapeoResultado; this.requerimientosFiltrados = mapeoResultado;
} }
//AL SELECCIONAR LA OPCIÓN DE NUEVO PASAJE //AL SELECCIONAR LA OPCIÓN DE NUEVO PASAJE
...@@ -478,9 +483,6 @@ export class ConformidadComponent implements OnInit { ...@@ -478,9 +483,6 @@ export class ConformidadComponent implements OnInit {
acciones: true acciones: true
}; };
console.log(this.dataSource , 'DATASOURCE');
//console.log(lugarOrigen , lugarDestino, pasaje, fechaPasaje)
this.dataSource.forEach((item) => {item.acciones = true; }); // VUELVE A ACTIVAR TODAS LAS ACCION this.dataSource.forEach((item) => {item.acciones = true; }); // VUELVE A ACTIVAR TODAS LAS ACCION
this.dataSource = [...this.dataSource]; this.dataSource = [...this.dataSource];
...@@ -544,12 +546,6 @@ export class ConformidadComponent implements OnInit { ...@@ -544,12 +546,6 @@ export class ConformidadComponent implements OnInit {
this.activarPasajes = true this.activarPasajes = true
} }
onMaterialSobrante(event: any){
const materialSobrante = event.target.value;
console.log(materialSobrante);
}
//Editar una fila de pasaje //Editar una fila de pasaje
onEventoEditarPasaje(event: any, elemento: any) { onEventoEditarPasaje(event: any, elemento: any) {
...@@ -589,8 +585,6 @@ export class ConformidadComponent implements OnInit { ...@@ -589,8 +585,6 @@ export class ConformidadComponent implements OnInit {
} }
} }
}); });
} }
habilitarSeccionPersonal(datos: boolean){ habilitarSeccionPersonal(datos: boolean){
...@@ -609,5 +603,329 @@ export class ConformidadComponent implements OnInit { ...@@ -609,5 +603,329 @@ export class ConformidadComponent implements OnInit {
} }
} }
onEventoSubirArchivo(event: any, tipo : number = 1) {
const archivosSeleccionados: FileList = event.target.files;
const nuevosArchivos = Array.from(archivosSeleccionados).filter(file => file.type === 'image/png');
nuevosArchivos.forEach( async (file) => {
if(!this.archivosEvidencia.find((item) => item.file.name === file.name)){
this.archivosEvidencia.push({tipoEvidencia : tipo , file : file });
}
});
}
seleccionarInput(index : number, tipo : number){
if(tipo === 1){
const input = this.fileInputs1.toArray()[index];
input.nativeElement.click(); // Simula el clic en el input file correspondiente
}else{
const input = this.fileInputs2.toArray()[index];
input.nativeElement.click(); // Simula el clic en el input file correspondiente
}
}
async gestionArchivos(index: number, accion : number, file : any = [], tipo : number = 1){
/*const listadoArchivos = tipo === 1 ? this.archivosEP : this.archivosES;
if(accion === 1){
const fileReader = new FileReader();
fileReader.onload = () => {
this.dialog.open(modalEvidenciaComponent, {
data: {
imageUrl: fileReader.result // Pasar la imagen al modal
}
});
};
fileReader.readAsDataURL(file); // Convertir el archivo a URL para mostrarlo
}else if(accion === 2){
const archivoSeleccionado = file.target.files[0]; // Obteniendo el File
//OBTENER EL ARCHIVO FILE Y UBICARLO EN EL ARRAY DE archivosEP EN EL MISMO INDEX
if(archivoSeleccionado) {
//COMPRAR EL NOMBRE DEL ARCHIVOS CON TODA LA LISTA EXISTENTE PARA EVITAR REPETICIONES
if(!listadoArchivos.find((item) => item.name === archivoSeleccionado.name)){
listadoArchivos[index] = archivoSeleccionado;
}else{
this.barraAlerta.open( 'ARCHIVO YA SE ENCUENTRA EN LA LISTA' , '' , {
horizontalPosition: this.alertaPosicionHorizontal,
verticalPosition: this.alertaPosicionVertical,
duration: this.alertaDuracion * 1000
});
}
}
}else{
listadoArchivos.splice(index, 1); // Eliminar el archivo del array de archivosEP
}*/
if(accion === 1){
const fileReader = new FileReader();
fileReader.onload = () => {
this.dialog.open(modalEvidenciaComponent, {
data: {
imageUrl: fileReader.result // Pasar la imagen al modal
}
});
};
fileReader.readAsDataURL(file); // Convertir el archivo a URL para mostrarlo
}else if(accion === 2){
const archivoSeleccionado = file.target.files[0]; // Obteniendo el File
//OBTENER EL ARCHIVO FILE Y UBICARLO EN EL ARRAY DE archivosEP EN EL MISMO INDEX
if(archivoSeleccionado) {
//COMPRAR EL NOMBRE DEL ARCHIVOS CON TODA LA LISTA EXISTENTE PARA EVITAR REPETICIONES
if(!this.archivosEvidencia.find((item) => item.file.name === archivoSeleccionado.name)){
this.archivosEvidencia[index].file = archivoSeleccionado;
}else{
this.barraAlerta.open( 'ARCHIVO YA SE ENCUENTRA EN LA LISTA' , '' , {
horizontalPosition: this.alertaPosicionHorizontal,
verticalPosition: this.alertaPosicionVertical,
duration: this.alertaDuracion * 1000
});
}
}
}else{
this.archivosEvidencia.splice(index, 1); // Eliminar el archivo del array de archivosEP
}
}
async gestionConformidad() {
//Obtener todos los datos del form Group datos_personal
const datosPersonal = this.datos_personal.getRawValue();
const datosPasajes = this.dataSource;
const datosServicio = this.datos_servicio.getRawValue();
const requerimientoRelacionados = this.listRequerimientos;
const datosTrabajo = this.datos_trabajo;
const existeMaterial = this.datos_materialSobrante;
const archivosEvidencias = this.archivosEvidencia;
let contadorEP = 1;
let contadorES = 1;
/*const archivosEP = this.archivosEP;
const archivosES = this.archivosES;*/
/*
const registroArchivos = archivosEvidencias.map((item) => {
return {
codconformidad : 48,
archivo: item.file,
tipoEvidencia : item.tipoEvidencia,
nombreArchivo : (item.tipoEvidencia === 1) ? 'EVIDENCIA_PROBLEMA_48'+ (contadorEP++) : 'EVIDENCIA_SERVICIO_48' + (contadorES++)
};
});
for (let i=0; i < registroArchivos.length; i++){
console.log(registroArchivos[i]);
const registroEvidencia = await this.conformidadHelper.subidaEvidencia(registroArchivos[i]);
console.log(registroEvidencia);
}
*/
const registroConformidad = await this.conformidadHelper.gestionConformidad({
opcion: 1,
codper: 29,
codlocal: '09',
fechainicio: '2000-05-28',
fechafin: '2024-05-28',
descproblema: 'Un problema',
desccausa: 'Una causa',
codtipotrabajo: 1,
desctrabajo: 'Un trabajo',
materialsobrate: 'Materiales'
});
const respuestaConformidad : any = JSON.parse(registroConformidad);
if(respuestaConformidad.status){ // DATOS DE CONFORMIDAD VALIDADOS Y REGISTRADOS
let statusPasaje = true ;
if(datosPasajes.length > 0){
const datosPasaje = datosPasajes.map((item) => {
return {
opcion: 2,
codconformidad : respuestaConformidad.data.codconformidad,
codlocal: this.datos_lugarOrigen.get('lugarOrigen'+item.index)?.value,
pasaje: parseInt(item.monto),
fechainicio: this.formatoFechaRegistro(item.fecha)
};
});
for (let i=0; i < datosPasaje.length; i++){
const registroPasaje = await this.conformidadHelper.gestionConformidad(datosPasaje[i]);
const respuestaPasaje = JSON.parse(registroPasaje);
if(!respuestaPasaje.status) {
statusPasaje = false;
break;
}
}
}
if(statusPasaje){ // DATOS DE PASAJES VALIDADOS Y REGISTRADOS
let statusRequerimientos = true ;
if(requerimientoRelacionados.length > 0){
const datosRequerimientos = requerimientoRelacionados.map((item) => {
return {
opcion: 3,
codconformidad : respuestaConformidad.data.codconformidad,
codrequerimiento : parseInt(item.codigo)
};
});
for (let i=0; i < datosRequerimientos.length; i++){
const registroRequerimiento = await this.conformidadHelper.gestionConformidad(datosRequerimientos[i]);
const respuestaRequerimiento = JSON.parse(registroRequerimiento);
if(!respuestaRequerimiento.status) {
statusRequerimientos = false;
break;
}
}
}
if(statusRequerimientos){ // REGISTRO DE REQUERIMIENTOS VALIDADOS Y REGISTRADOS
//UNIR LOS DATOS archivosEP Y archivosES EN UN SOLO ARRAY
let statusEvidencias = true;
const registroArchivos = archivosEvidencias.map((item) => {
return {
codconformidad : respuestaConformidad.data.codconformidad,
archivo: item.file,
tipoEvidencia : item.tipoEvidencia,
nombreArchivo : (item.tipoEvidencia === 1) ? 'EVIDENCIA_PROBLEMA_'+respuestaConformidad.data.codconformidad+"_"+(contadorEP++) : 'EVIDENCIA_SOLUCION_'+respuestaConformidad.data.codconformidad+"_"+(contadorES++)
};
});
for (let i=0; i < registroArchivos.length; i++){
const registroEvidencia = await this.conformidadHelper.subidaEvidencia(registroArchivos[i]);
console.log(registroEvidencia);
if(!registroEvidencia?.status) {
statusEvidencias = false;
break;
}
}
if(statusEvidencias) {
console.log('SE REGISTRO TODO')
}else{
this.barraAlerta.open( 'ERROR AL REGISTRAR LOS ARCHIVOS DE EVIDENCIA' , '' , {
horizontalPosition: this.alertaPosicionHorizontal,
verticalPosition: this.alertaPosicionVertical,
duration: this.alertaDuracion * 1000
});
}
}
}else{
this.barraAlerta.open( 'ERROR AL REGISTRAR LOS PASAJES' , '' , {
horizontalPosition: this.alertaPosicionHorizontal,
verticalPosition: this.alertaPosicionVertical,
duration: this.alertaDuracion * 1000
});
}
}else{
this.barraAlerta.open( 'ERROR AL REGISTRAR LA CONFORMIDAD' , '' , {
horizontalPosition: this.alertaPosicionHorizontal,
verticalPosition: this.alertaPosicionVertical,
duration: this.alertaDuracion * 1000
});
}
/*if(datosPersonal?.codAreaPersona && datosPersonal?.sedePersonal && datosPersonal?.tecnicoPersonal && datosPersonal?.maxFechaTrabajo && datosPersonal?.minFechaTrabajo){ // VALIDAR SECCION PERSONAL
if( (datosPasajes.length > 0 && datosPasajes.every((item) => item.lugarOrigen && item.lugarDestino && item.monto && item.fecha)) || datosPasajes.length === 0 ){ // VALIDAR SECCION DE PASAJES
if(archivosEP.length > 0 && archivosES.length > 0){ // VALIDAR LOS ARCHIVOS ENTRANTES DE EVIDENCIA DE PROBLEMA Y SERVICIOS
if(datosTrabajo.valid){ // VALIDAR LOS DATOS DE DESCRIPCION DE TRABAJO
if(existeMaterial.valid && ( ( existeMaterial.get('existeMaterial')?.value === '1' && this.ordenSalidaComponent?.dataSource.length > 0 ) || existeMaterial.get('existeMaterial')?.value === '0')){ // VALIDAR QUE SE HAYA SELECCIONADO
//SI PASA TODAS LAS VALIDACIONES ANTERIORES SE PROCEDE A REGISTRAR LA CONFORMIDAD
const jsonConformidad = {
accion: 1,
codAreaPersona: datosPersonal.codAreaPersona,
codLocal: datosPersonal.sedePersonal,
codPer: datosPersonal.tecnicoPersonal,
fecFin: this.formatoFechaDate(datosPersonal.maxFechaTrabajo),
fecIni: this.formatoFechaDate(datosPersonal.minFechaTrabajo),
pasajeTotal: datosPersonal.pasajeTotal,
requerimientos: requerimientoRelacionados,
servicios: datosServicio,
trabajos: datosTrabajo,
pasajes: datosPasajes,
materialSobrante: existeMaterial.get('existeMaterial')?.value,
archivosEP: archivosEP,
archivosES: archivosES,
materialesSobrantes: this.ordenSalidaComponent?.dataSource
};
}else{
this.barraAlerta.open( 'VALIDAR MATERIAL SOBRANTE' , '' , {
horizontalPosition: this.alertaPosicionHorizontal,
verticalPosition: this.alertaPosicionVertical,
duration: this.alertaDuracion * 1000
});
return;
}
}else{
this.barraAlerta.open( 'VALIDAR DATOS DE TRABAJO' , '' , {
horizontalPosition: this.alertaPosicionHorizontal,
verticalPosition: this.alertaPosicionVertical,
duration: this.alertaDuracion * 1000
});
return;
}
}else{
const advertencia = (archivosEP.length === 0) ? 'REQUIERE SUBIR EVIDENCIA DE PROBLEMA' : ( (archivosES.length === 0) ? 'REQUIERE SUBIR EVIDENCIA DE PROBLEMA' : 'VALIDAR DATOS DE SERVICIOS' ) ;
this.barraAlerta.open( advertencia , '' , {
horizontalPosition: this.alertaPosicionHorizontal,
verticalPosition: this.alertaPosicionVertical,
duration: this.alertaDuracion * 1000
});
return;
}
}else{
this.barraAlerta.open( 'VALIDAR PASAJES' , '' , {
horizontalPosition: this.alertaPosicionHorizontal,
verticalPosition: this.alertaPosicionVertical,
duration: this.alertaDuracion * 1000
});
return;
}
}else{
this.barraAlerta.open( 'VALIDAR DATOS PERSONALES' , '' , {
horizontalPosition: this.alertaPosicionHorizontal,
verticalPosition: this.alertaPosicionVertical,
duration: this.alertaDuracion * 1000
});
return;
}*/
}
} }
...@@ -26,4 +26,18 @@ export class ConformidadHelper { ...@@ -26,4 +26,18 @@ export class ConformidadHelper {
} }
} }
async gestionConformidad(json: any){
const respuesta = await this.ConformidadService.gestionConformidad(json);
if (respuesta?.status) {
return respuesta.json;
}else{
return [];
}
}
async subidaEvidencia( json : any ){
const respuesta = await this.ConformidadService.subidaEvidencia(json);
return respuesta
}
} }
...@@ -29,7 +29,7 @@ import {MatTableModule} from "@angular/material/table"; ...@@ -29,7 +29,7 @@ import {MatTableModule} from "@angular/material/table";
template: ` template: `
<h1 mat-dialog-title>Confirmar Eliminación</h1> <h1 mat-dialog-title>Confirmar Eliminación</h1>
<div mat-dialog-content> <div mat-dialog-content>
<p>¿Estás seguro de que deseas eliminar este pasaje?</p> <p>¿Estás seguro de que deseas eliminar este registro?</p>
</div> </div>
<div mat-dialog-actions> <div mat-dialog-actions>
<button mat-button (click)="onCancelar()">Cancelar</button> <button mat-button (click)="onCancelar()">Cancelar</button>
......
import { Component, Inject } from '@angular/core';
import { MatDialogActions, MatDialogClose, MatDialogContent, MatDialogTitle, MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog';
import {MatButtonModule} from '@angular/material/button';
@Component({
selector: 'app-file-preview-dialog',
imports: [MatButtonModule,
MatDialogActions,
MatDialogClose,
MatDialogContent,
MatDialogTitle],
standalone: true,
template:`
<h1 mat-dialog-title>Vista previa del archivo</h1>
<div mat-dialog-content>
<img [src]="data.imageUrl" alt="Vista previa" style="max-width: 100%; height: auto;" />
</div>
<div mat-dialog-actions>
<button mat-button mat-dialog-close>Cerrar</button>
</div>
`
})
export class modalEvidenciaComponent {
constructor(
@Inject(MAT_DIALOG_DATA)
public data: any
) {
console.log(data);
}
}
<h2 mat-dialog-title>Detalle requerimiento</h2> <h1 mat-dialog-title>Detalle requerimiento {{detalleRequerimiento.numeroDoc || '000000000'}}</h1>
<mat-dialog-content > <mat-dialog-content >
<mat-card appearance="outlined" >
<mat-card-content class="flex grid grid-cols-4 gap-4" >
<div>
<mat-label>TIPO DE REQUERIMIENTO : </mat-label>
<mat-label>{{detalleRequerimiento.tipoRequerimiento || 'Sin Tipo Requerimiento'}}</mat-label>
</div>
<div>
<mat-label>FECHA REGISTRO : </mat-label>
<mat-label>{{detalleRequerimiento.fechaRegistro || 'Sin Fecha'}}</mat-label>
</div>
<div>
<mat-label>SEDE : </mat-label>
<mat-label>{{detalleRequerimiento.sede || 'Sin Sede'}}</mat-label>
</div>
<div>
<mat-label>EMPLEADO : </mat-label>
<mat-label>{{detalleRequerimiento.empleado || 'Sin Empleado'}}</mat-label>
</div>
<div>
<mat-label>OBSERVACIÓN : </mat-label>
<mat-label>{{detalleRequerimiento.observacion || 'Sin Observacion'}}</mat-label>
</div>
<div>
<mat-label>DESCRIPCIÓN : </mat-label>
<mat-label>{{detalleRequerimiento.descripcion || 'Sin descripcion'}}</mat-label>
</div>
<!-- <mat-label [innerHTML]="'REQUERIMIENTO : ' + (detalleRequerimiento[0].numeroDoc || 'Sin Requerimiento') "></mat-label>
<mat-label [innerHTML]="'SEDE : ' + (detalleRequerimiento[0].sede || 'Sin Sede') "></mat-label>
<mat-label [innerHTML]="'EMPLEADO : ' + (detalleRequerimiento[0].empleado || 'Sin Empleado') "></mat-label>
<mat-label [innerHTML]="'OBSERVACIÓN : ' + (detalleRequerimiento[0].observacion || 'Sin Observacion') "></mat-label>
<mat-label [innerHTML]="'DESCRIPCIÓN : ' + (detalleRequerimiento[0].descripcion || 'Sin descripcion') "></mat-label> -->
</mat-card-content>
</mat-card>
<mat-label [innerHTML]="'REQUERIMIENTO : ' + (detalleRequerimiento[0].numeroDoc || 'Sin Requerimiento') "></mat-label><br>
<mat-label [innerHTML]="'SEDE : ' + (detalleRequerimiento[0].sede || 'Sin Sede') "></mat-label><br>
<mat-label [innerHTML]="'EMPLEADO : ' + (detalleRequerimiento[0].empleado || 'Sin Empleado') "></mat-label><br>
<mat-label [innerHTML]="'OBSERVACIÓN : ' + (detalleRequerimiento[0].observacion || 'Sin Observacion') "></mat-label><br>
<mat-label [innerHTML]="'DESCRIPCIÓN : ' + (detalleRequerimiento[0].descripcion || 'Sin descripcion') "></mat-label><br>
<table mat-table [dataSource]="dataSource" class="mat-elevation-z8"> <table mat-table [dataSource]="dataSource" >
<!--- Note that these columns can be defined in any order. <!--- Note that these columns can be defined in any order.
The actual rendered columns are set as a property on the row definition" --> The actual rendered columns are set as a property on the row definition" -->
......
import {Component, Inject, OnInit} from '@angular/core'; import {Component, ElementRef, Inject, OnInit, ViewChild} from '@angular/core';
import {provideNativeDateAdapter} from '@angular/material/core'; import {provideNativeDateAdapter} from '@angular/material/core';
import {MatTableModule} from '@angular/material/table'; import {MatTableModule} from '@angular/material/table';
import { MatDialogActions, MatDialogClose, MatDialogContent, MatDialogTitle, MAT_DIALOG_DATA, MatDialogRef } from "@angular/material/dialog"; import { MatDialogActions, MatDialogClose, MatDialogContent, MatDialogTitle, MAT_DIALOG_DATA, MatDialogRef } from "@angular/material/dialog";
...@@ -9,6 +9,7 @@ import {FormControl, FormGroup, ReactiveFormsModule} from "@angular/forms"; ...@@ -9,6 +9,7 @@ import {FormControl, FormGroup, ReactiveFormsModule} from "@angular/forms";
import {MatIconModule} from '@angular/material/icon'; import {MatIconModule} from '@angular/material/icon';
import {MatDividerModule} from '@angular/material/divider'; import {MatDividerModule} from '@angular/material/divider';
import {MatButtonModule} from '@angular/material/button'; import {MatButtonModule} from '@angular/material/button';
import {MatCard, MatCardContent} from "@angular/material/card";
export interface PeriodicElement { export interface PeriodicElement {
...@@ -25,6 +26,8 @@ export interface interDetalleRequerimiento { ...@@ -25,6 +26,8 @@ export interface interDetalleRequerimiento {
cantidad: number; cantidad: number;
} }
//const ARTICULOS_DATA : detalleRequerimiento[] = []; //const ARTICULOS_DATA : detalleRequerimiento[] = [];
@Component({ @Component({
...@@ -46,28 +49,55 @@ export interface interDetalleRequerimiento { ...@@ -46,28 +49,55 @@ export interface interDetalleRequerimiento {
MatButtonModule, MatButtonModule,
MatDividerModule, MatDividerModule,
MatIconModule, MatIconModule,
MatCard,
MatCardContent,
] ]
}) })
export class modalRequerimientoComponent implements OnInit{ export class modalRequerimientoComponent implements OnInit{
@ViewChild('datosPrincipales') datosPrincipales!: ElementRef;
detalleRequerimiento: any; detalleRequerimiento: any;
filasRequerimientos: any; //filasRequerimientos: any;
//displayedColumns: string[] = ['position', 'name', 'weight', 'symbol'];
columnasArticulos: string[] = ['posicion', 'nombre', 'unidad', 'cantidad']; columnasArticulos: string[] = ['posicion', 'nombre', 'unidad', 'cantidad'];
dataSource: interDetalleRequerimiento[] = []; dataSource: interDetalleRequerimiento[] = [];
constructor(@Inject(MAT_DIALOG_DATA) public data: any) { constructor(@Inject(MAT_DIALOG_DATA) public data: any) {
// Puedes acceder a los datos pasados a través de 'data'
this.detalleRequerimiento = data.requerimientoInfo const datosPrincipales = data.requerimientoInfo?.map((item: any) => {
this.filasRequerimientos = data.requerimientoInfo.map((item: any) => ({ return {
posicion: item.numeral, numeroDoc : item.numeroDoc,
nombre: item.producto, descripcion : item.descripcion,
unidad: item.codUnidad, observacion : item.observacion,
cantidad: item.cantidad empleado : item.empleado,
})); sede : item.nombreSede,
posicion: item.numeral,
nombre: item.producto,
unidad: item.codUnidad,
cantidad: item.cantidad,
tipoRequerimiento : item.descTipoReq,
fechaRegistro : item.fechaRegistro
}
}) || [];
console.log(datosPrincipales);
if(datosPrincipales[0]){
//Obtener los valores de descripcion, observacion, sede y empleado por separado y en un solo objeto
this.detalleRequerimiento = {
numeroDoc : datosPrincipales[0].numeroDoc,
tipoRequerimiento : datosPrincipales[0].tipoRequerimiento,
descripcion : datosPrincipales[0].descripcion,
observacion : datosPrincipales[0].observacion,
empleado : datosPrincipales[0].empleado,
sede : datosPrincipales[0].sede
}
this.dataSource = datosPrincipales;
}
//this.detalleRequerimiento = data.requerimientoInfo
//this.filasRequerimientos =
console.log(this.detalleRequerimiento); console.log(this.detalleRequerimiento);
...@@ -75,7 +105,7 @@ export class modalRequerimientoComponent implements OnInit{ ...@@ -75,7 +105,7 @@ export class modalRequerimientoComponent implements OnInit{
ngOnInit(): void { ngOnInit(): void {
//ARTICULOS_DATA.push(this.detalleRequerimiento); //ARTICULOS_DATA.push(this.detalleRequerimiento);
this.dataSource = this.filasRequerimientos;
} }
......
<div class="m-5">
<div class="w-full">
<mat-form-field class="w-full">
<mat-label>DESCRIPCIÓN DEL MATERIAL SOBRANTE : </mat-label>
<textarea matInput placeholder="Breve descripción de los materiales faltantes y su estado"></textarea>
</mat-form-field>
</div>
<!---------------------------------------------------------------------- SECCION MATERIALES SOBRANTES ---------------------------------------------------------------------->
<div [formGroup]="datos_materialSobrante">
<div class="grid gap-4 grid-cols-2">
<mat-label class="text-[1.1em] font-bold mb-4" style="display: flex;align-items: center;margin: unset">LISTADO DE ARTICULOS <mat-icon>attach_money</mat-icon> </mat-label>
<button [ngStyle]="{'visibility': activarNuevoArticulo ? 'visible' : 'hidden'}" [disabled]="!activarNuevoArticulo" mat-raised-button (click)="onAgregarArticulo($event)">
<mat-icon>add</mat-icon>
<b>Agregar material</b>
</button>
</div>
<div>
<table mat-table [dataSource]="dataSource" class="mat-elevation-z8">
<ng-container matColumnDef="nombre">
<th mat-header-cell *matHeaderCellDef> NOMBRE DE ARTÍCULO </th>
<td mat-cell *matCellDef="let element">
<ng-container *ngIf="element.isNew; else displayOrigen">
<mat-form-field style="width: 25rem">
<input type="text" placeholder="Buscar articulos" matInput formControlName="articulo{{element.index}}" [matAutocomplete]="auto" maxlength="9"
(input)="onBusquedaArticulo($event,element.index)">
<mat-autocomplete #auto="matAutocomplete" (optionSelected)="onSeleccionArticulo($event,element.index)" >
<mat-option *ngFor="let option of articulosList" [value]="option.codigo">
{{ option.nombre }}
</mat-option>
</mat-autocomplete>
</mat-form-field>
</ng-container>
<ng-template #displayOrigen>
{{element.nombre}}
</ng-template>
</td>
</ng-container>
<ng-container matColumnDef="unidad">
<th mat-header-cell *matHeaderCellDef> UNIDAD </th>
<td mat-cell *matCellDef="let element">
<ng-container *ngIf="element.isNew; else displayOrigen">
<!-- <mat-form-field style="width: 20rem" appearance="outline">
<input matInput placeholder="[Lugar de Destino]" readonly>
</mat-form-field>-->
<mat-label>{{codigoUnidad}}</mat-label>
</ng-container>
<ng-template #displayOrigen>
{{element.unidad}}
</ng-template>
</td>
</ng-container>
<ng-container matColumnDef="cantidad">
<th mat-header-cell *matHeaderCellDef> CANTIDAD </th>
<td mat-cell *matCellDef="let element">
<ng-container *ngIf="element.isNew; else displayOrigen">
<mat-form-field style="width: 10rem" appearance="outline">
<input matInput formControlName="cantidad{{element.index}}" soloNumeros value="" maxlength="2">
</mat-form-field>
</ng-container>
<ng-template #displayOrigen>
{{ element.cantidad }}
</ng-template>
</td>
</ng-container>
<ng-container matColumnDef="estado">
<th mat-header-cell *matHeaderCellDef> ESTADO ARTÍCULO </th>
<td mat-cell *matCellDef="let element">
<ng-container *ngIf="element.isNew; else displayOrigen">
<mat-form-field class="select-tipoTrabajo">
<mat-label>Seleccionar tipo de trabajo</mat-label>
<mat-select formControlName="estado{{element.index}}">
@for (tipoT of listEstadoArticulo; track tipoT) {
<mat-option [value]="tipoT.valor">{{tipoT.nombre}}</mat-option>
}
</mat-select>
</mat-form-field>
</ng-container>
<ng-template #displayOrigen>
{{ formatoEstado(element.estado) }}
</ng-template>
</td>
</ng-container>
<ng-container matColumnDef="accion">
<th mat-header-cell *matHeaderCellDef> ACCIÓN </th>
<td mat-cell *matCellDef="let element">
<ng-container *ngIf="element.acciones; else sinAcciones">
<ng-container *ngIf="element.isNew; else accionesEditar">
<button mat-icon-button (click)="onEventoConfirmarArticulo($event, element)">
<mat-icon>check_circle</mat-icon>
</button>
<button mat-icon-button (click)="onEventoCancelarArticulo($event, element)">
<mat-icon>cancel</mat-icon>
</button>
</ng-container>
<ng-template #accionesEditar>
<button mat-icon-button (click)="onEventoEditarArticulo($event, element)">
<mat-icon>edit</mat-icon>
</button>
<button mat-icon-button (click)="onEventoEliminarArticulo($event, element)">
<mat-icon>delete</mat-icon>
</button>
</ng-template>
</ng-container>
<ng-template #sinAcciones>
</ng-template>
</td>
</ng-container>
<tr mat-header-row *matHeaderRowDef="columnasArticulos"></tr>
<tr mat-row *matRowDef="let row; columns: columnasArticulos;"></tr>
</table>
</div>
</div>
<!---------------------------------------------------------------------- SECCION MATERIALES SOBRANTES ---------------------------------------------------------------------->
</div>
import { Component, OnInit, ChangeDetectorRef, Renderer2, ElementRef, ViewChild, inject, QueryList, ViewChildren } from '@angular/core';
import {MatOption, provideNativeDateAdapter} from "@angular/material/core";
import {MatIconModule} from '@angular/material/icon';
import {FormBuilder, FormControl, FormGroup, FormsModule, ReactiveFormsModule, Validators} from '@angular/forms';
import {CdkTextareaAutosize} from "@angular/cdk/text-field";
import {MatAutocomplete, MatAutocompleteSelectedEvent, MatAutocompleteTrigger} from "@angular/material/autocomplete";
import {MatCard, MatCardContent, MatCardSubtitle , MatCardFooter, MatCardHeader, MatCardTitle , MatCardModule} from "@angular/material/card";
import {MatButton, MatFabButton, MatIconButton} from "@angular/material/button";
import {MatFormField, MatHint, MatLabel, MatSuffix,MatFormFieldModule} from "@angular/material/form-field";
import {MatIcon} from "@angular/material/icon";
import {MatInput} from "@angular/material/input";
import {MatTooltip} from "@angular/material/tooltip";
import {DatePipe, NgForOf, NgIf, NgStyle} from "@angular/common";
import {
MatCell,
MatCellDef,
MatColumnDef,
MatHeaderCell, MatHeaderCellDef,
MatHeaderRow,
MatHeaderRowDef,
MatRow, MatRowDef, MatTable
} from "@angular/material/table";
import {MatDatepicker, MatDatepickerInput, MatDatepickerToggle} from "@angular/material/datepicker";
import {MatSelect} from "@angular/material/select";
import {SoloNumerosDirective} from "../../service/directivas_service/soloNumeros/solo-numeros.directive";
import {MatSnackBar, MatSnackBarHorizontalPosition, MatSnackBarVerticalPosition} from "@angular/material/snack-bar";
import {ConformidadHelper} from "../conformidad/helper/conformidad.helper";
import {MatDialog} from "@angular/material/dialog";
import { ConfirmarEliminacionComponent } from '../conformidad/modalEliminarPasaje/eliminarPasaje.componente';
interface interArticulo{
index: number;
nombre: string;
unidad: string;
cantidad: number;
estado : number; // 1 = BUENO ESTADO , 2 = OBSERVACIÓN , 3 = MAL ESTADO
isNew: boolean;
isEdit : boolean;
acciones: boolean;
}
interface estadosArticulo {
valor: string;
nombre: string;
}
@Component({
selector: 'ordensalida-component',
templateUrl: './ordensalida.componente.html',
styleUrls: ['./ordensalida.componente.css'],
providers: [provideNativeDateAdapter()],
standalone: true,
imports: [
CdkTextareaAutosize,
FormsModule,
MatAutocomplete,
MatAutocompleteTrigger,
MatCard,
MatCardContent,
MatCardSubtitle,
MatFabButton,
MatFormField,
MatIcon,
MatInput,
MatLabel,
MatOption,
MatTooltip,
NgForOf,
ReactiveFormsModule,
MatButton,
MatCell,
MatCellDef,
MatColumnDef,
MatDatepicker,
MatDatepickerInput,
MatDatepickerToggle,
MatHeaderCell,
MatHeaderRow,
MatHeaderRowDef,
MatHint,
MatIconButton,
MatRow,
MatRowDef,
MatSelect,
MatSuffix,
MatTable,
NgIf,
SoloNumerosDirective,
NgStyle,
MatHeaderCellDef,
MatIconModule,
MatFormFieldModule,
MatCardModule,
MatCardHeader,
MatCardTitle,
MatCardFooter,
]
})
export class ordenSalidaComponent implements OnInit {
private barraAlerta = inject(MatSnackBar);
alertaPosicionHorizontal: MatSnackBarHorizontalPosition = 'center';
alertaPosicionVertical: MatSnackBarVerticalPosition = 'bottom';
alertaDuracion: number = 3;
//FORM GROUP
datos_materialSobrante: FormGroup = new FormGroup<any>({});
//FORM GROUP
// INICIALIZACION DATOS
columnasArticulos: string[] = ['nombre', 'unidad', 'cantidad', 'estado', 'accion'];
articulosList: any[] = [];
activarNuevoArticulo: boolean = true;
indexArticulo: number = 0;
public dataSource: interArticulo[] = [];
codigoUnidad: string = '';
listEstadoArticulo: estadosArticulo[] = [{ valor: '1', nombre: 'BUENO'}, { valor: '2', nombre: 'OBSERVACIÓN' },{ valor: '3', nombre: 'MAL ESTADO' } ]
// INICIALIZACION DATOS
// OBTENER DATOS DEL FORM GROUP
formGroupMS(accion: number , formControlName : string , formControl : FormControl = new FormControl()): any {
if(accion === 1){
return this.datos_materialSobrante.addControl(formControlName, formControl);
}else if(accion === 2){
//Obtener un formControl del formGroup y validar si existe caso contrario retornar null
return this.datos_materialSobrante.get(formControlName);
}else if(accion === 3){
return this.datos_materialSobrante.removeControl(formControlName);
}
}
constructor(
private conformidadHelper: ConformidadHelper,
private renderer: Renderer2,
private detectorChange : ChangeDetectorRef,
public dialog: MatDialog,
private datePipe: DatePipe,
) {
this.articulosList = [];
this.codigoUnidad = '';
}
ngOnInit(): void {
}
onAgregarArticulo(event : any){
const NuevaFila : interArticulo = {
index: this.indexArticulo++,
nombre: '',
unidad: '',
cantidad: 0,
estado: 1,
isNew: true,
isEdit: true,
acciones: true
};
this.formGroupMS(1,'articulo'+NuevaFila.index, new FormControl<String | null>(null,[Validators.maxLength(12)]));
this.formGroupMS(1,'cantidad'+NuevaFila.index, new FormControl<String | null>(null,[Validators.maxLength(2)]));
this.formGroupMS(1,'estado'+NuevaFila.index, new FormControl<String | null>(null ,[Validators.maxLength(1)]));
this.dataSource.forEach((item) => {
if (item.index !== NuevaFila.index) {
item.isEdit = false;
item.isNew = false;
item.acciones = false;
}
});
this.dataSource = [...this.dataSource,NuevaFila];
this.activarNuevoArticulo = false;
this.articulosList = [];
console.log(this.articulosList);
}
onEventoConfirmarArticulo($event: MouseEvent, elemento : any) {
const articulo = this.formGroupMS(2,'articulo'+elemento.index)?.value;
const cantidad = this.formGroupMS(2,'cantidad'+elemento.index)?.value;
const estado = this.formGroupMS(2,'estado'+elemento.index)?.value;
//VALIDAR LOS VALORES OBTENIDOS ANTES DE REALIZAR UN REGISTRO
if(this.validarRegistroArticulo({articulo,cantidad,estado})){
// Agregar los datos recogidos de la fila para agregarlos en dataSource y actualizar la tabla
const index = this.dataSource.findIndex((item) => item.index === elemento.index);
this.dataSource[index] = {
index: elemento.index,
nombre: articulo,
unidad: this.codigoUnidad,
cantidad: cantidad,
estado: estado,
isNew: false,
isEdit : false,
acciones: true
};
console.log(this.dataSource , 'DATASOURCE');
//console.log(lugarOrigen , lugarDestino, pasaje, fechaPasaje)
this.dataSource.forEach((item) => { item.acciones = true; }); // VUELVE A ACTIVAR TODAS LAS ACCION
this.dataSource = [...this.dataSource];
this.activarNuevoArticulo = true;
this.barraAlerta.open( 'REGISTRO INGRESADO' , '' , {
horizontalPosition: this.alertaPosicionHorizontal,
verticalPosition: this.alertaPosicionVertical,
duration: this.alertaDuracion * 1000
});
}else{
this.barraAlerta.open( 'VALIDAR DATOS INGRESADOS' , '' , {
horizontalPosition: this.alertaPosicionHorizontal,
verticalPosition: this.alertaPosicionVertical,
duration: this.alertaDuracion * 1000
});
}
}
validarRegistroArticulo(valores: any): boolean {
if (valores.articulo && valores.cantidad && valores.estado) {
return true;
} else {
return false;
}
}
onEventoCancelarArticulo(event: any, elemento : any) {
const index = this.dataSource.findIndex((item) => item.index === elemento.index);//Descubriendo el index
this.dataSource.forEach((item) => { item.acciones = true; }); // Que todas las filas vuelvan a tener las acciones
if(this.dataSource[index].isEdit){
this.dataSource[index].isEdit = false;
this.dataSource[index].isNew = false;
this.dataSource = [...this.dataSource];
}else{
this.dataSource = this.dataSource.filter((item) => item.index !== elemento.index);
this.formGroupMS(3,'articulo'+elemento.index);
this.formGroupMS(3,'cantidad'+elemento.index);
this.formGroupMS(3,'estado'+elemento.index);
}
this.activarNuevoArticulo = true
}
onEventoEditarArticulo(event: any, elemento : any) {
const index = this.dataSource.findIndex((item) => item.index === elemento.index);//Descubriendo el index
this.dataSource.forEach((item) => {
if (item.index === elemento.index) {
item.isEdit = true;
item.isNew = true;
item.acciones = true;
} else {
item.isEdit = false;
item.isNew = false;
item.acciones = false;
}
});
//this.dataSource[index].isNew = true; //Obteniendo la fila del dataSource y cambiando el estado a nuevo
//this.dataSource[index].isEdit = true;
this.dataSource = [...this.dataSource]; // Volviendo a ingresar los datos para que la tabla se actualice y la fila cambie con las condiciones del HTML
this.activarNuevoArticulo = false;
}
onEventoEliminarArticulo(event: any, elemento : any) {
//Al presionar el boton aparecerá un Dialog confirmando si desea eliminar el registro, al aceptar la fila del registro se eliminará.
const dialogRef = this.dialog.open(ConfirmarEliminacionComponent);
dialogRef.afterClosed().subscribe(result => {
if (result) {
const index = elemento.index;
if (index >= 0) {
this.dataSource = this.dataSource.filter((item) => item.index !== elemento.index);
this.formGroupMS(3,'articulo'+elemento.index);
this.formGroupMS(3,'cantidad'+elemento.index);
this.formGroupMS(3,'estado'+elemento.index);
}
}
});
}
async onBusquedaArticulo(event: any , index : number) {
const busquedaArt = event.target.value;
const jsonParametrosArti = {
accion : 4,
nombreValor : busquedaArt,
};
console.log(jsonParametrosArti);
const articulos_list = await this.conformidadHelper.listadoGeneralHorizon(jsonParametrosArti) ;
const mapeoResultado = articulos_list.map((item: any) => ({
codigo: item.codigoProducto,
nombre : item.nombreProducto,
unidad: item.unidad
}));
this.articulosList = mapeoResultado;
console.log(this.articulosList);
}
onSeleccionArticulo(event: MatAutocompleteSelectedEvent,index : number) {
//AL SELECCIONAR , SE OPTIENE EL VALUE
const selectedOption = event.option.value;
//SE BUSCA EL VALUE DENTRO DEL LISTADO DE ARTICULOS
const articulo = this.articulosList.find((item) => item.codigo === selectedOption);
console.log(articulo);
//SE OPTIENE EL NOMBRE PARA PONERLO EN EL INPUT
this.formGroupMS(2,'articulo'+index)?.setValue(articulo.nombre);
this.codigoUnidad = articulo.unidad;
//SE VUELVE A LIMPIAR EL LISTADO DE ARTICULOS PARA DEJAR PASO A OTRA FUTURA BUSQUEDA.
this.articulosList = [];
/*const valor = event.option.value;
if(this.listRequerimientos.find((item) => item.codigo === valor)){
this.labelText = 'Ya existe el requerimiento ' + valor + ' en el listado'; // Cambia el texto
this.isFading = false; // Resetea el estado de opacidad para mostrar el texto
// Después de 2 segundos, comienza a desvanecer el texto
setTimeout(() => {
this.isFading = true;
}, 2000); // 2000 ms = 2 segundos
}else{
this.listRequerimientos.push({ titulo: `RQ N°${valor}`, id: this.idBotones++ , codigo: valor });
this.labelText = '';
}
this.datos_servicio.get('busquedaReq')?.setValue('');
this.inputBusqueda.nativeElement.blur();
this.detectorChange.detectChanges();
this.requerimientosFiltrados = [];
}*/
}
formatoEstado(estado: any) {
return this.listEstadoArticulo.find((item) => item.valor === estado)?.nombre;
}
}
...@@ -2,7 +2,6 @@ import {Injectable} from "@angular/core"; ...@@ -2,7 +2,6 @@ import {Injectable} from "@angular/core";
import axios from "axios"; import axios from "axios";
import {environment} from "../../../environment/env"; import {environment} from "../../../environment/env";
@Injectable({ @Injectable({
providedIn: 'root' providedIn: 'root'
}) })
...@@ -10,6 +9,10 @@ export class ConformidadService { ...@@ -10,6 +9,10 @@ export class ConformidadService {
t_asistencia_rest_link = environment.t_asistencia_rest_link; t_asistencia_rest_link = environment.t_asistencia_rest_link;
t_horizon_rest_link = environment.horizon_services_link; t_horizon_rest_link = environment.horizon_services_link;
t_facturacion_electronica_link = environment.facturacion_electronica_link;
value_idDrive = environment.ID_CARPETA_DRIVE_LOGISTICA;
value_correoDrive = environment.CORREO_DRIVE_LOGISTICA;
t_redireccionamiento = environment.redireccionamiento;
constructor() { constructor() {
} }
...@@ -30,7 +33,7 @@ export class ConformidadService { ...@@ -30,7 +33,7 @@ export class ConformidadService {
const parametros =[ const parametros =[
json.accion || 0, json.accion || 0,
json.nroRequerimiento || '', json.nombreValor || '',
json.sede || '', json.sede || '',
] ]
...@@ -53,19 +56,124 @@ export class ConformidadService { ...@@ -53,19 +56,124 @@ export class ConformidadService {
} }
} }
async registroConformidad(json: any) { async gestionConformidad(json: any) {
const Parametros = {
opcion : json.opcion || 0,
codconformidad : json.codconformidad || 0,
codper : json.codper || 0,
codlocal : json.codlocal || '',
fechainicio : json.fechainicio || '1999-01-01',
fechafin : json.fechafin || '1999-01-01',
descproblema : json.descproblema || '',
desccausa : json.desccausa || '',
codtipotrabajo: json.codtipotrabajo || 0 ,
desctrabajo: json.desctrabajo || '',
materialsobrate: json.materialsobrate || '',
pasaje : json.pasaje || 0,
codrequerimiento : json.codrequerimiento || 0
};
try { try {
const respuesta = await axios.post(this.t_asistencia_rest_link + '/api/v1/Conformidad/registroConformidad', json); const respuesta = await axios.post(this.t_facturacion_electronica_link + '/api/v1/conformidad/registrarConformidad', Parametros);
console.log(respuesta);
return respuesta.data; return respuesta.data;
} catch (e) { } catch (e) {
return e; return e;
} }
} }
async subidaEvidencia(json:any){
const url = `${this.t_redireccionamiento}/google/drive`;
const formData = new FormData();
formData.append('archivo_nombre', json.nombreArchivo);
formData.append('archivo_binario', json.archivo);
formData.append('archivo_id_actual', '');
formData.append('carpeta_id', this.value_idDrive);
formData.append('correo', this.value_correoDrive);
formData.append('app_nombre', 'EVIDENCIAS_CONFORMIDAD');
formData.append('carpeta_nombre', 'EVIDENCIA1');
const controller = new AbortController();
const timeout = setTimeout(() => controller.abort(), 30000); // 30 segundos
try {
const response = await fetch(url, {
method: 'POST',
body: formData,
signal: controller.signal, // 30 segundos de timeout
});
const statusCode = response.status;
const responseBody = await response.json();
// Construir respuesta en formato JSON
/*const respuesta = {
statusCode: statusCode,
responseBody: responseBody,
};
*/
clearTimeout(timeout); // Limpiar, REVISA SI ESTO ESTA BIEN O QUITARLO
let respuesta :any ;
//console.log(statusCode,responseBody);
if(statusCode === 200){
//console.log(responseBody);
const registroEvidencia = await this.registroDocumento({
codconformidad: json.codconformidad || 0,
tipoEvidencia : json.tipoEvidencia || 0,
idDrive : responseBody.data.archivo_id || '',
enlaceDrive : responseBody.data.archivo_url_vista || '',
enlaceDescarga : responseBody.data.archivo_url || '',
nombreDocumento : json.nombreArchivo || ''
});
if(registroEvidencia?.status){
respuesta = {status: true, message: "Imagen subida"};
}else{
respuesta = { status :false , message : "Imagen no subida" };
}
//respuesta = { status :true , message : "Imagen subida" };
/*const respuestaDocumento = await axios.post(this.t_facturacion_electronica_link + '/api/v1/conformidad/registroDocumentos', registroEvidencia);+
console.log(respuestaDocumento);
respuesta = respuestaDocumento;*/
}else{
respuesta = { status :false , message : "Imagen no subida" };
}
return respuesta;
} catch (error) {
console.error('Error al registrar el archivo:', error);
throw error;
}
}
async registroDocumento(json : any){
try {
const respuesta = await axios.post(this.t_facturacion_electronica_link + '/api/v1/conformidad/registroDocumentos', json);
//console.log(respuesta);
return respuesta.data;
} catch (e) {
return e;
}
}
/*async listadoRequerimientos(json: any) { /*async listadoRequerimientos(json: any) {
const parametros =[ const parametros =[
json.accion || 0, json.accion || 0,
json.nroRequerimiento || '', json.nombreValor || '',
json.sede || '', json.sede || '',
] ]
...@@ -86,4 +194,6 @@ export class ConformidadService { ...@@ -86,4 +194,6 @@ export class ConformidadService {
return e; return e;
} }
}*/ }*/
} }
import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
standalone: true,
name: 'truncate'
})
export class truncarCaracteresDirective implements PipeTransform {
transform(value: string, limit: number = 20, completeWords: boolean = false, ellipsis: string = '...'): string {
if (!value) return '';
if (value.length <= limit) return value;
let truncated = value.substring(0, limit);
if (completeWords) {
const lastSpace = truncated.lastIndexOf(' ');
if (lastSpace > 0) {
truncated = truncated.substring(0, lastSpace);
}
}
return truncated + ellipsis;
}
}
/*import { SoloNumerosDirective } from './solo-numeros.directive';
describe('SoloNumerosDirective', () => {
it('should create an instance', () => {
const directive = new SoloNumerosDirective();
expect(directive).toBeTruthy();
});
});
*/
...@@ -2,10 +2,11 @@ export const environment = { ...@@ -2,10 +2,11 @@ export const environment = {
isProduction: false, isProduction: false,
trismegisto_services_link: 'https://tp-services.sacooliveros.edu.pe', trismegisto_services_link: 'https://tp-services.sacooliveros.edu.pe',
t_asistencia_rest_link: 'http://localhost:8080/tasistencia-rest', t_asistencia_rest_link: 'http://localhost:8080/tasistencia-rest',
redireccionamiento: 'https://fichaonline.sacooliveros.edu.pe', redireccionamiento: 'https://fichaonline.sacooliveros.edu.pe:8000/trismegisto-apis/api/v1',
facturacion_electronica_link: 'http://localhost:8080/FacturacionElectronicaSIIAA', facturacion_electronica_link: 'http://localhost:8080/FacturacionElectronicaSIIAA',
horizon_services_link: 'http://localhost:8080/trismegisto-api-horizons', horizon_services_link: 'http://localhost:8080/trismegisto-api-horizons',
ID_CARPETA_DRIVE_LOGISTICA:'13mGZo3AnFqgkNRyiVAgJoW9mUoQdABdC',
CORREO_DRIVE_LOGISTICA : 'trismegisto.logistica@sacooliveros.edu.pe'
}; };
......
...@@ -22,7 +22,9 @@ ...@@ -22,7 +22,9 @@
"lib": [ "lib": [
"ES2022", "ES2022",
"dom" "dom"
] ],
"types": ["node"] // Agregado para incluir los tipos de Node.js
}, },
"angularCompilerOptions": { "angularCompilerOptions": {
"enableI18nLegacyMessageIdFormat": false, "enableI18nLegacyMessageIdFormat": false,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment