[ADD] SUBIDA DE REGISTRO Y ACTUALIZACION DE DRIVE

parent 212fafe2
......@@ -34,11 +34,12 @@
},
"configurations": {
"production": {
"baseHref": "",
"budgets": [
{
"type": "initial",
"maximumWarning": "500kB",
"maximumError": "1MB"
"maximumWarning": "10MB",
"maximumError": "10MB"
},
{
"type": "anyComponentStyle",
......@@ -46,6 +47,12 @@
"maximumError": "4kB"
}
],
"fileReplacements": [
{
"replace": "src/environment/env.ts",
"with": "src/environment/env.prod.ts"
}
],
"outputHashing": "all"
},
"development": {
......
......@@ -19,6 +19,7 @@
"@angular/platform-browser-dynamic": "^18.2.0",
"@angular/router": "^18.2.0",
"axios": "^1.7.7",
"notiflix": "^3.2.7",
"rxjs": "~7.8.0",
"tslib": "^2.3.0",
"zone.js": "~0.14.10"
......@@ -6016,9 +6017,9 @@
"license": "MIT"
},
"node_modules/cookie": {
"version": "0.4.2",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
"integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==",
"version": "0.7.2",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
"integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
"dev": true,
"license": "MIT",
"engines": {
......@@ -6696,9 +6697,9 @@
}
},
"node_modules/engine.io": {
"version": "6.6.1",
"resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.1.tgz",
"integrity": "sha512-NEpDCw9hrvBW+hVEOK4T7v0jFJ++KgtPl4jKFwsZVfG1XhS0dCrSb3VMb9gPAd7VAdW52VT1EnaNiU2vM8C0og==",
"version": "6.6.2",
"resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.2.tgz",
"integrity": "sha512-gmNvsYi9C8iErnZdVcJnvCpSKbWTt1E8+JZo8b+daLninywUWi5NQ5STSHZ9rFjFO7imNcvb8Pc5pe/wMR5xEw==",
"dev": true,
"license": "MIT",
"dependencies": {
......@@ -6707,7 +6708,7 @@
"@types/node": ">=10.0.0",
"accepts": "~1.3.4",
"base64id": "2.0.0",
"cookie": "~0.4.1",
"cookie": "~0.7.2",
"cors": "~2.8.5",
"debug": "~4.3.1",
"engine.io-parser": "~5.2.1",
......@@ -7070,9 +7071,9 @@
"license": "Apache-2.0"
},
"node_modules/express": {
"version": "4.21.0",
"resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz",
"integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==",
"version": "4.21.1",
"resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz",
"integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==",
"dev": true,
"license": "MIT",
"dependencies": {
......@@ -7081,7 +7082,7 @@
"body-parser": "1.20.3",
"content-disposition": "0.5.4",
"content-type": "~1.0.4",
"cookie": "0.6.0",
"cookie": "0.7.1",
"cookie-signature": "1.0.6",
"debug": "2.6.9",
"depd": "2.0.0",
......@@ -7113,9 +7114,9 @@
}
},
"node_modules/express/node_modules/cookie": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz",
"integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==",
"version": "0.7.1",
"resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz",
"integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==",
"dev": true,
"license": "MIT",
"engines": {
......@@ -10402,6 +10403,12 @@
"node": ">=0.10.0"
}
},
"node_modules/notiflix": {
"version": "3.2.7",
"resolved": "https://registry.npmjs.org/notiflix/-/notiflix-3.2.7.tgz",
"integrity": "sha512-NRu6KSeyfphgPKBxh4IUoOYXbROrpuDa9/q9/VPb6UNEP4uII9RKwclTZWUyl1A0tSh9+lEhdz9F/EkskH3A6w==",
"license": "MIT"
},
"node_modules/npm-bundled": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.1.tgz",
......
......@@ -21,6 +21,7 @@
"@angular/platform-browser-dynamic": "^18.2.0",
"@angular/router": "^18.2.0",
"axios": "^1.7.7",
"notiflix": "^3.2.7",
"rxjs": "~7.8.0",
"tslib": "^2.3.0",
"zone.js": "~0.14.10"
......
<div style="display: flex;width: 100%;justify-content: center; margin: 20px 0;" xmlns="http://www.w3.org/1999/html">
<div
style="border: 1px solid black ;
width: 75%; display: flex;
justify-content: center;
box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 15px rgba(0, 0, 0, 0.23);
height: 3rem;
align-items: center"
>
<label style="font-weight: bold;font-size: 2rem;font-family: 'inherit'">HOJA DE RUTA</label>
<div class="flex justify-center w-full my-5">
<div class="border border-black w-[90vw] md:w-3/4 flex justify-center items-center shadow-lg h-12 rounded-lg bg-yellow-300">
<label class="font-bold text-lg md:text-2xl">HOJA DE RUTA</label>
</div>
</div>
<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 ---------------------------------------------------------------------->
<div class="body flex flex-col items-center text-[13px] md:text-[18px] relative mx-2 my-5 pb-5 md:mx-0">
<div class="flex flex-col items-center text-xs md:text-base mx-2 my-5 pb-5 md:mx-0">
<mat-card appearance="outlined" class="mt-4 flex flex-col gap-2.5 text-[#222] shadow-xl w-full md:w-[75vw]">
<mat-card-header class="flex flex-col items-start w-full">
<label class="text-base md:text-lg font-bold">DATOS PERSONALES</label>
</mat-card-header>
<mat-card-content class="w-full my-2.5">
<div class="flex flex-col md:flex-row gap-x-4" [formGroup]="datos_personal">
<mat-form-field class="w-full md:w-1/4" appearance="outline" floatLabel="always">
<mat-label>Técnico responsable</mat-label>
<mat-select formControlName="tecnicoPersonal" placeholder="[Seleccionar técnico]" (selectionChange)="onEventoSeleccionTecnico($event)" required>
<mat-option *ngFor="let option of this.personal_list" [value]="option?.codper">
{{option?.personal}}
</mat-option>
</mat-select>
</mat-form-field>
<mat-form-field class="w-full md:w-1/4" appearance="outline" floatLabel="always">
<mat-label>Área designada</mat-label>
<input formControlName="areaPersonal" matInput placeholder="[Área designada]" value="" readonly>
</mat-form-field>
<mat-form-field class="w-full md:w-1/4" appearance="outline" floatLabel="always">
<mat-label>Sede designada : </mat-label>
<mat-select formControlName="sedePersonal" placeholder="[Seleccionar sede]" required>
<mat-option *ngFor="let option of this.sede_list" [value]="option?.codlocal">
{{option?.deslocal}}
</mat-option>
</mat-select>
</mat-form-field>
<mat-form-field class="w-full md:w-1/4" appearance="outline" floatLabel="always">
<mat-label>Rango de fechas : </mat-label>
<mat-date-range-input [rangePicker]="picker">
<input matStartDate formControlName="minFechaTrabajo" placeholder="Fecha inicial" readonly >
<input matEndDate formControlName="maxFechaTrabajo" placeholder="Fecha Fin" readonly>
</mat-date-range-input>
<mat-datepicker-toggle matIconSuffix [for]="picker" [disabled]="datos_personal.controls['minFechaTrabajo'].disabled"></mat-datepicker-toggle>
<mat-date-range-picker #picker></mat-date-range-picker>
</mat-form-field>
</div>
<div class="flex flex-col sm:flex-row gap-4">
<div class="sm:basis-3/12 w-full">
<mat-form-field [formGroup]="datos_personal" class="w-full sm:w-[20rem]" appearance="outline" floatLabel="always">
<mat-label>Pasaje designado : </mat-label>
<input matInput formControlName="pasajeTotal" placeholder="Calculo final del pasaje" value="" readonly>
</mat-form-field>
</div>
<div class="sm:basis-9/12 w-full">
<div class="grid gap-4 grid-cols-1 sm:grid-cols-2">
<mat-label class="text-[1.1em] font-bold mb-4 flex items-center">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)">
<mat-icon>add</mat-icon>
<b>Agregar pasaje</b>
</button>
</div>
<div class="overflow-x-auto">
<table mat-table [dataSource]="dataSource" class="mat-elevation-z8 w-full">
<ng-container matColumnDef="lugarOrigen">
<th mat-header-cell *matHeaderCellDef class="w-1/5"> LUGAR DE ORIGEN </th>
<td mat-cell *matCellDef="let element">
<ng-container *ngIf="element.isNew; else displayOrigen">
<mat-form-field [formGroup]="datos_lugarOrigen" appearance="outline">
<mat-select formControlName="lugarOrigen{{element.index}}" placeholder="[Seleccionar de origen]" required>
<mat-option *ngFor="let option of this.sede_list" [value]="option?.codlocal">
{{option?.deslocal}}
</mat-option>
</mat-select>
</mat-form-field>
</ng-container>
<ng-template #displayOrigen>
{{element.lugarOrigen}}
</ng-template>
</td>
</ng-container>
<ng-container matColumnDef="lugarDestino">
<th mat-header-cell *matHeaderCellDef class="w-1/5"> LUGAR DESTINO </th>
<td mat-cell *matCellDef="let element">
<ng-container *ngIf="element.isNew; else displayOrigen">
<mat-form-field appearance="outline">
<input matInput placeholder="[Lugar de Destino]" [value]="lugarDestinoPasaje" readonly>
</mat-form-field>
</ng-container>
<ng-template #displayOrigen>
{{element.lugarDestino}}
</ng-template>
</td>
</ng-container>
<ng-container matColumnDef="monto">
<th mat-header-cell *matHeaderCellDef class="w-1/10"> MONTO </th>
<td mat-cell *matCellDef="let element">
<ng-container *ngIf="element.isNew; else displayOrigen">
<mat-form-field [formGroup]="datos_pasajeAcumulado" appearance="outline">
<input matInput formControlName="montoPasaje{{element.index}}" soloNumeros placeholder="[Monto]" value="" maxlength="2">
</mat-form-field>
</ng-container>
<ng-template #displayOrigen>
{{element.monto}}
</ng-template>
</td>
</ng-container>
<ng-container matColumnDef="fecha">
<th mat-header-cell *matHeaderCellDef class="w-1/5"> FECHA </th>
<td mat-cell *matCellDef="let element">
<ng-container *ngIf="element.isNew; else displayOrigen">
<mat-form-field [formGroup]="datos_fechaPasaje" appearance="outline">
<input matInput [matDatepicker]="fechaPasaje" formControlName="fechaPasaje{{element.index}}" [min]="minFechaLimite" [max]="maxFechaLimite">
<mat-hint>DD/MM/YYYY</mat-hint>
<mat-datepicker-toggle matIconSuffix [for]="fechaPasaje"></mat-datepicker-toggle>
<mat-datepicker #fechaPasaje></mat-datepicker>
</mat-form-field>
</ng-container>
<ng-template #displayOrigen>
{{formatoFecha(element.fecha)}}
</ng-template>
</td>
</ng-container>
<ng-container matColumnDef="accion">
<th mat-header-cell *matHeaderCellDef class="w-3/10"> 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)="onEventoConfirmarPasaje($event, element)">
<mat-icon>check_circle</mat-icon>
</button>
<button mat-icon-button (click)="onEventoCancelarPasaje($event, element)">
<mat-icon>cancel</mat-icon>
</button>
</ng-container>
<ng-template #accionesEditar>
<button mat-icon-button (click)="onEventoEditarPasaje($event, element)">
<mat-icon>edit</mat-icon>
</button>
<button mat-icon-button (click)="onEventoEliminarPasaje($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="columnasPasaje"></tr>
<tr mat-row *matRowDef="let row; columns: columnasPasaje;"></tr>
</table>
</div>
</div>
</div>
</mat-card-content>
</mat-card>
</div>
<mat-card appearance="outlined" class="mt-4 flex flex-col gap-2.5 text-[#222] !shadow-xl w-[95vw] sm:w-[90vw] md:w-[75vw]">
<mat-card-header class="flex flex-col items-start w-full">
<label class="text-[1.1em] font-bold">
SERVICIOS PRESTADOS
</label>
</mat-card-header>
<mat-card-content class="w-full my-2.5">
<div class="div-serviocisPrestados divisionGeneral" [formGroup]="datos_servicio">
<div class="servicio-descripcion">
<div class="flex flex-col md:flex-row gap-5 pb-5">
<div class="w-full md:w-1/5">
<mat-form-field class="w-full" appearance="outline" floatLabel="always">
<mat-label>Listado de Requerimientos</mat-label>
<input type="text" placeholder="Buscar requerimiento" matInput #inputBusqueda formControlName="busquedaReq" [matAutocomplete]="auto" maxlength="9"
(input)="onBusquedaRequerimiento($event)">
<mat-autocomplete #auto="matAutocomplete" (optionSelected)="onEventSeleccion($event)">
<mat-option *ngFor="let option of requerimientosFiltrados" [value]="option.codigo">
{{ option.numero }}
</mat-option>
</mat-autocomplete>
</mat-form-field>
<mat-label [ngClass]="{'fade-out': isFading}" [innerText]="labelText"></mat-label>
</div>
<div class="grid grid-cols-2 md:grid-cols-5 gap-4 w-full md:w-4/5">
<div class="contenedorRequerimiento" *ngFor="let card of listRequerimientos">
<mat-card>
<mat-card-content>
<mat-card-subtitle class="text-base font-bold">{{ card.titulo }}</mat-card-subtitle>
<div class="w-fit py-2 px-3 flex space-x-4">
<button mat-fab aria-label="Eliminar" matTooltip="Eliminar" matTooltipPosition="above" (click)="deleteRequerimiento(card.id)">
<mat-icon class="mat-icon-small">delete</mat-icon>
</button>
<button mat-fab aria-label="Información" matTooltip="Información" matTooltipPosition="above" (click)="infoRequerimiento(card.codigo)">
<mat-icon class="mat-icon-small">info</mat-icon>
</button>
</div>
</mat-card-content>
</mat-card>
</div>
</div>
</div>
<div class="grid grid-cols-1 md:grid-cols-2 gap-5">
<div>
<mat-form-field class="w-full">
<mat-label>DESCRIPCIÓN DEL PROBLEMA</mat-label>
<textarea matInput placeholder="Breve descripción sobre los problemas encontrados en la sede" formControlName="descripcionServicio"
cdkTextareaAutosize cdkAutosizeMinRows="3" cdkAutosizeMaxRows="10" [required]="false"></textarea>
</mat-form-field>
</div>
<div>
<mat-form-field class="w-full">
<mat-label>DESCRIPCIÓN DE LA CAUSA</mat-label>
<textarea matInput placeholder="Breve descripción sobre las causas del problema" formControlName="causaServicio"
cdkTextareaAutosize cdkAutosizeMinRows="3" cdkAutosizeMaxRows="10" [required]="false"></textarea>
</mat-form-field>
</div>
</div>
</div>
<div class="grid grid-flow-col md:grid-cols-2 gap-5">
<div>
<div><b class="md:text-[1rem] text-[1em] text-black/60">EVIDENCIAS DEL PROBLEMA: *</b></div>
<button mat-fab class="!w-full" [color]="'blue'" (click)="file1.click()">
<mat-label>SUBIR EVIDENCIA DEL PROBLEMA</mat-label>
<mat-icon>file_open</mat-icon>
</button>
<input type="file" #file1 (change)="onEventoSubirArchivo($event)" class="hidden" multiple accept="image/png">
<br>
<div *ngFor="let archivo of archivosEvidencia; let i = index" class="flex mt-2">
<div *ngIf="archivo.tipoEvidencia === 1" class="flex w-full">
<p class="w-2/4">{{ (archivo.file.name + ' (' + (archivo.file.size / 1000) + ' KB)') | truncate:30:true }}</p>
<div class="w-2/4 grid grid-cols-3 gap-4">
<button (click)="gestionArchivos(i,1,archivo.file)"><mat-icon>info</mat-icon></button>
<button (click)="seleccionarInput(i,1)"><mat-icon>edit</mat-icon></button>
<input type="file" #fileEditar1 (change)="gestionArchivos(i,2,$event)" class="hidden" multiple accept="image/png">
<button (click)="gestionArchivos(i,3)"><mat-icon>delete</mat-icon></button>
</div>
</div>
</div>
</div>
<div>
<div><b class="md:text-[1rem] text-[1em] text-black/60">EVIDENCIAS DE SOLUCIONES: *</b></div>
<button mat-fab class="!w-full" [color]="'blue'" (click)="file2.click()">
<mat-label>SUBIR EVIDENCIA DE LA SOLUCIÓN</mat-label>
<mat-icon>file_open</mat-icon>
</button>
<input type="file" #file2 (change)="onEventoSubirArchivo($event,2)" class="hidden" multiple accept="image/png">
<br>
<div *ngFor="let archivo of archivosEvidencia; let i = index" class="flex mt-2">
<div *ngIf="archivo.tipoEvidencia === 2" class="flex w-full">
<p class="w-2/4">{{ (archivo.file.name + ' (' + (archivo.file.size / 1000) + ' KB)') | truncate:30:true }}</p>
<div class="w-2/4 grid grid-cols-3 gap-4">
<button (click)="gestionArchivos(i,1,archivo.file,2)"><mat-icon>info</mat-icon></button>
<button (click)="seleccionarInput(i,2)"><mat-icon>edit</mat-icon></button>
<input type="file" #fileEditar2 (change)="gestionArchivos(i,2,$event,2)" class="hidden" multiple accept="image/png">
<button (click)="gestionArchivos(i,3,2)"><mat-icon>delete</mat-icon></button>
</div>
</div>
</div>
</div>
</div>
</div>
</mat-card-content>
</mat-card>
<mat-card appearance="outlined" class="mt-4 flex flex-col gap-2.5 text-[#222] !shadow-xl w-[90vw] sm:w-[85vw] md:w-[75vw]">
<mat-card-header class="flex flex-col items-start w-full">
<label class="text-[1.1em] font-bold">
TRABAJOS PRESTADOS
</label>
</mat-card-header>
<mat-card-content class="w-full my-2.5">
<div class="div-trabajosPrestados divisionGeneral" [formGroup]="datos_trabajo">
<label class="font-bold text-[1.2rem]">TIPO DE TRABAJO:</label>
<mat-form-field class="w-full md:w-1/2">
<mat-label>Seleccionar tipo de trabajo</mat-label>
<mat-select formControlName="tipoTrabajo">
@for (tipoT of listTipoTrabajo; track tipoT) {
<mat-option [value]="tipoT.value">{{ tipoT.viewValue }}</mat-option>
}
</mat-select>
</mat-form-field>
<div class="w-full mt-5">
<mat-form-field class="w-full">
<mat-label>DESCRIPCIÓN DEL TRABAJO</mat-label>
<textarea matInput placeholder="Breve descripción del trabajo realizado" formControlName="descripcionTrabajo"
cdkTextareaAutosize cdkAutosizeMinRows="3" cdkAutosizeMaxRows="10" [required]="false"></textarea>
</mat-form-field>
</div>
</div>
</mat-card-content>
</mat-card>
<mat-card appearance="outlined" class="mt-4 flex flex-col gap-2.5 text-[#222] !shadow-xl w-[90vw] sm:w-[85vw] md:w-[75vw]" [formGroup]="existeMaterialS">
<mat-card-header class="flex justify-center items-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" value="0">
<mat-button-toggle value="1">SI</mat-button-toggle>
<mat-button-toggle value="0">NO</mat-button-toggle>
</mat-button-toggle-group>
</mat-card-header>
<!-- Mostrar componente solo si existeMaterial es "1" -->
<ng-container *ngIf="existeMaterialS.get('existeMaterial')?.value === '1'">
<!-- Componente a mostrar -->
<mat-card-content class="w-full">
<ordensalida-component></ordensalida-component>
</mat-card-content>
</ng-container>
</mat-card>
<div class="mt-4 flex flex-col">
<button mat-fab extended (click)="gestionConformidad()">
<mat-icon>app_registration</mat-icon>
REGISTRO CONFORMIDAD
</button>
</div>
<!--
<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 ">
<label class="text-[1.1em] font-bold mb-4">
<mat-card-header class="flex flex-col items-start w-full">
<label class="text-[1.1em] font-bold">
DATOS PERSONALES
</label>
</mat-card-header>
<!-- <mat-card-content>DATOS PRINCIPALES</mat-card-content> -->
<mat-card-content class="w-full">
<div class="mt-10">
<mat-card-content class="w-full my-2.5">
<div class="flex flex-row gap-x-4" [formGroup]="datos_personal">
<mat-form-field class="basis-1/4" appearance="outline" floatLabel="always">
<mat-label>Técnico responsable</mat-label>
......@@ -37,14 +350,13 @@
<input formControlName="areaPersonal" matInput placeholder="[Área designada]" value="" readonly>
</mat-form-field>
<mat-form-field class="basis-1/4" appearance="outline" floatLabel="always">
<mat-label>Sede afectada : </mat-label>
<mat-label>Sede designada : </mat-label>
<mat-select formControlName="sedePersonal" placeholder="[Seleccionar sede]" required>
<mat-option *ngFor="let option of this.sede_list" [value]="option?.codlocal">
{{option?.deslocal}}
</mat-option>
</mat-select>
</mat-form-field>
<!-- <mat-form-field [formGroup]="datos_fechaTrabajo" 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-date-range-input [rangePicker]="picker">
......@@ -56,9 +368,7 @@
</mat-form-field>
</div>
<!---------------------------------------------------------------------- SECCION DATOS PERSONALES ---------------------------------------------------------------------->
<!---------------------------------------------------------------------- SECCION PASAJE ---------------------------------------------------------------------->
<div class="flex flex-row gap-x-4">
<div class="basis-3/12">
<mat-form-field [formGroup]="datos_personal" style="width: 20rem" appearance="outline" floatLabel="always">
......@@ -77,7 +387,7 @@
<div>
<table mat-table [dataSource]="dataSource" class="mat-elevation-z8">
<ng-container matColumnDef="lugarOrigen">
<th mat-header-cell *matHeaderCellDef> LUGAR DE ORIGEN </th>
<th mat-header-cell *matHeaderCellDef style="width: 20%"> LUGAR DE ORIGEN </th>
<td mat-cell *matCellDef="let element">
<ng-container *ngIf="element.isNew; else displayOrigen">
<mat-form-field [formGroup]="datos_lugarOrigen" appearance="outline" floatLabel="always">
......@@ -95,7 +405,7 @@
</ng-container>
<ng-container matColumnDef="lugarDestino">
<th mat-header-cell *matHeaderCellDef> LUGAR DESTINO </th>
<th mat-header-cell *matHeaderCellDef style="width: 20%"> LUGAR DESTINO </th>
<td mat-cell *matCellDef="let element">
<ng-container *ngIf="element.isNew; else displayOrigen">
<mat-form-field appearance="outline">
......@@ -109,11 +419,11 @@
</ng-container>
<ng-container matColumnDef="monto">
<th mat-header-cell *matHeaderCellDef> MONTO </th>
<th mat-header-cell *matHeaderCellDef style="width: 10%"> MONTO </th>
<td mat-cell *matCellDef="let element">
<ng-container *ngIf="element.isNew; else displayOrigen">
<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="" maxlength="2">
</mat-form-field>
</ng-container>
<ng-template #displayOrigen>
......@@ -123,7 +433,7 @@
</ng-container>
<ng-container matColumnDef="fecha">
<th mat-header-cell *matHeaderCellDef> FECHA </th>
<th mat-header-cell *matHeaderCellDef style="width: 20%;"> FECHA </th>
<td mat-cell *matCellDef="let element">
<ng-container *ngIf="element.isNew; else displayOrigen">
<mat-form-field [formGroup]="datos_fechaPasaje" appearance="outline">
......@@ -140,7 +450,7 @@
</ng-container>
<ng-container matColumnDef="accion">
<th mat-header-cell *matHeaderCellDef> ACCIÓN </th>
<th mat-header-cell *matHeaderCellDef style="width: 30%;"> ACCIÓN </th>
<td mat-cell *matCellDef="let element">
<ng-container *ngIf="element.acciones; else sinAcciones">
<ng-container *ngIf="element.isNew; else accionesEditar">
......@@ -169,24 +479,23 @@
</table>
</div>
</div>
<!---------------------------------------------------------------------- SECCION PASAJE ---------------------------------------------------------------------->
</div>
</div>
</mat-card-content>
</mat-card-content>
</mat-card>
-->
<!---------------------------------------------------------------------- SERVICIOS 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-header class="flex flex-col items-center w-full ">
<label class="text-[1.1em] font-bold mb-4">
<!--<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-start w-full">
<label class="text-[1.1em] font-bold">
SERVICIOS PRESTADOS
</label>
</mat-card-header>
<mat-card-content class="w-full">
<mat-card-content class="w-full my-2.5">
<div class="div-serviocisPrestados divisionGeneral" [formGroup]="datos_servicio">
<div class="servicio-descripcion">
<div style="display: flex;align-items: center">
<div class="flex flex-row gap-5 pb-5">
<div class="basis-1/5">
<mat-form-field style="width: 15rem" appearance="outline" floatLabel="always">
<mat-label>Listado de Requerimientos</mat-label>
<input type="text" placeholder="Buscar requerimiento" matInput #inputBusqueda formControlName="busquedaReq" [matAutocomplete]="auto" maxlength="9"
......@@ -197,8 +506,10 @@
</mat-option>
</mat-autocomplete>
</mat-form-field>
<mat-label [ngClass]="{'fade-out': isFading}" [innerText]="labelText"></mat-label>
</div>
<div class="grid grid-cols-5 gap-4">
<div class="grid grid-cols-5 gap-4 basis-4/5">
<div class="contenedorRequerimiento" *ngFor="let card of listRequerimientos" style="display: flex">
<mat-card>
<mat-card-content>
......@@ -216,27 +527,27 @@
</mat-card>
</div>
</div>
<br>
<mat-label [ngClass]="{'fade-out': isFading}" [innerText]="labelText"></mat-label>
</div>
<div class="grid grid-flow-col md:grid-cols-2 gap-5" >
<div>
<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"
cdkTextareaAutosize
cdkAutosizeMinRows="3"
cdkAutosizeMaxRows="10"></textarea>
cdkAutosizeMaxRows="10"
[required]="false"></textarea>
</mat-form-field>
</div>
<div>
<mat-form-field class="example-full-width">
<mat-label>DESCRIPCIÓN DE LA 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"
cdkTextareaAutosize
cdkAutosizeMinRows="3"
cdkAutosizeMaxRows="10"></textarea>
cdkAutosizeMaxRows="10"
[required]="false"></textarea>
</mat-form-field>
</div>
</div>
......@@ -244,7 +555,7 @@
<div class="grid grid-flow-col md:grid-cols-2 gap-5">
<div class="">
<div> <b class="md:text-[0.7em] text-[1em] text-black/60">EVIDENCIAS DEL PROBLEMAS : </b> </div>
<div> <b class="md:text-[1rem] text-[1em] text-black/60">EVIDENCIAS DEL PROBLEMAS : *</b> </div>
<div>
<button mat-fab class="!w-full"
[color]="'blue'"
......@@ -269,7 +580,7 @@
</div>
<div class="">
<div> <b class="md:text-[0.7em] text-[1em] text-black/60">EVIDENCIAS DE SOLUCIONES :</b> </div>
<div> <b class="md:text-[1rem] text-[1em] text-black/60">EVIDENCIAS DE SOLUCIONES : *</b> </div>
<div>
<button mat-fab class="!w-full"
[color]="'blue'"
......@@ -296,18 +607,18 @@
</div>
</mat-card-content>
</mat-card>
</mat-card>-->
<!---------------------------------------------------------------------- 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-header class="flex flex-col items-center w-full ">
<label class="text-[1.1em] font-bold mb-4">
<!--<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-start w-full">
<label class="text-[1.1em] font-bold">
TRABAJOS PRESTADOS
</label>
</mat-card-header>
<mat-card-content class="w-full">
<mat-card-content class="w-full my-2.5">
<div class="div-trabajosPrestados divisionGeneral" [formGroup]="datos_trabajo">
<label style="font-weight: bold; font-size: 1.2rem; font-family: 'inherit'">TIPO DE TRABAJO : </label>
<mat-form-field class="select-tipoTrabajo">
......@@ -320,29 +631,27 @@
</mat-form-field>
<br>
<mat-form-field class="example-full-width">
<mat-label>DESCRIPCIÓN DEL TRABAJO : </mat-label>
<textarea matInput placeholder="Breve descripciòn del trabajo realizado" formControlName="descripcionTrabajo"></textarea>
<mat-label>DESCRIPCIÓN DEL TRABAJO</mat-label>
<textarea matInput placeholder="Breve descripciòn del trabajo realizado" formControlName="descripcionTrabajo" [required]="false"></textarea>
</mat-form-field>
</div>
</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 appearance="outlined" class="mt-4 flex flex-col gap-2.5 text-[#222] !shadow-xl w-[90vw] md:w-[75vw]" [formGroup]="existeMaterialS">
<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-group formControlName="existeMaterial" aria-label="Existe material sobrante" value="0">
<mat-button-toggle value="1">SI</mat-button-toggle>
<mat-button-toggle value="2">NO</mat-button-toggle>
<mat-button-toggle value="0">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 -->
<ng-container *ngIf="existeMaterialS.get('existeMaterial')?.value === '1'">
<mat-card-content>
<ordensalida-component></ordensalida-component>
</mat-card-content>
......@@ -355,7 +664,7 @@
<mat-icon>app_registration</mat-icon>
REGISTRO CONFORMIDAD
</button>
</div>
</div>-->
</div>
......
......@@ -29,6 +29,7 @@ import { modalEvidenciaComponent } from "./modalEvidencia/modalEvidencia.compone
import { truncarCaracteresDirective } from "../../service/directivas_service/restriccionCaracteres/truncarCaracteres.directive";
import { ordenSalidaComponent } from "../ordensalida/ordensalida.componente";
import {elementSelectors} from "@angular/cdk/schematics";
import Notiflix from 'notiflix';
interface tiposTrabajo {
value: string;
......@@ -36,16 +37,16 @@ interface tiposTrabajo {
}
interface interRequerimientos {
codigo: string;
serie : string;
numero: string;
id: number;
titulo: string;
codigo: string
}
interface interDetallePasaje {
index: number;
lugarOrigen: string;
lugarDestino : string;
monto: string;
monto: number;
fecha: Date;
isNew: boolean;
isEdit : boolean;
......@@ -115,6 +116,7 @@ export class ConformidadComponent implements OnInit {
@ViewChildren('fileEditar1') fileInputs1!: QueryList<ElementRef> ;
@ViewChildren('fileEditar2') fileInputs2!: QueryList<ElementRef> ;
@ViewChild(ordenSalidaComponent) ordenSalidaComponent!: ordenSalidaComponent;
//@ViewChild(ordenSalidaComponent) datos_materialSobrante!: FormGroup;
// VIEWCHILD
......@@ -135,7 +137,7 @@ export class ConformidadComponent implements OnInit {
personal_list: any = [];
sede_list: any = [];
requerimientosFiltrados: any[] = [];
listRequerimientos: { id: number; titulo: string; codigo: string}[] = [];
listRequerimientos: interRequerimientos[] = [];
idBotones: number = 0;
indexPasaje : number = 0 ;
labelText: string = ''; // Texto que se muestra inicialmente
......@@ -153,11 +155,7 @@ export class ConformidadComponent implements OnInit {
minFechaLimite: Date | null = new Date();
maxFechaLimite: Date | null = new Date();
archivosEvidencia : interFile[] = [];
archivosEP: File[] = [];
archivosES: File[] = [];
//INICIALIZACION DE VARIABLES UTILIZABLES
......@@ -166,22 +164,22 @@ export class ConformidadComponent implements OnInit {
datos_personal = new FormGroup({
tecnicoPersonal : new FormControl(null ,Validators.required),
sedePersonal : new FormControl(null,Validators.required),
areaPersonal : new FormControl<String | null>(null ,Validators.required),
areaPersonal : new FormControl<string>('' ,Validators.required),
codAreaPersona : new FormControl(),
minFechaTrabajo : new FormControl<Date | null>(null, Validators.required),
maxFechaTrabajo : new FormControl<Date | null>(null, Validators.required),
pasajeTotal: new FormControl<number | null>(null),
minFechaTrabajo : new FormControl<Date>(new Date(), Validators.required),
maxFechaTrabajo : new FormControl<Date>(new Date(), Validators.required),
pasajeTotal: new FormControl<number>(0),
});
datos_servicio = new FormGroup({
busquedaReq : new FormControl<String | null>(null ,[Validators.maxLength(12)]),
descripcionServicio : new FormControl(null ,Validators.required),
causaServicio : new FormControl(null ,Validators.required),
busquedaReq : new FormControl<string | null>(null ,[Validators.maxLength(12)]),
descripcionServicio : new FormControl<string | null>(null ,Validators.required),
causaServicio : new FormControl<string | null>(null ,Validators.required),
});
datos_trabajo = new FormGroup({
tipoTrabajo : new FormControl(null ,Validators.required),
descripcionTrabajo : new FormControl(null ,Validators.required),
tipoTrabajo : new FormControl<string>('1' ,Validators.required),
descripcionTrabajo : new FormControl<string>('' ,Validators.required),
});
datos_pasajeAcumulado = new FormGroup<any>({
......@@ -191,7 +189,7 @@ export class ConformidadComponent implements OnInit {
datos_fechaPasaje : FormGroup = new FormGroup<any>({}) ;
datos_materialSobrante : FormGroup = new FormGroup({
existeMaterialS : FormGroup = new FormGroup({
existeMaterial : new FormControl(null ,Validators.required),
});
......@@ -213,16 +211,16 @@ export class ConformidadComponent implements OnInit {
//ACCESOS RAPIDOS A GRUPOS DE FORMULARIOS
accesoDP(){
return this.datos_personal.controls;
agregarFormControl(formGroup: FormGroup, formControlName: string, formControl: FormControl = new FormControl()): any {
return formGroup.addControl(formControlName, formControl);
}
accesoDS(){
return this.datos_servicio.controls;
obtenerFormControl(formGroup: FormGroup, formControlName: string): any {
return formGroup.get(formControlName);
}
accesoDT(){
return this.datos_trabajo.controls;
removerFormControl(formGroup: FormGroup, formControlName: string): any {
return formGroup.removeControl(formControlName);
}
//ACCESOS RAPIDOS A GRUPOS DE FORMULARIOS
......@@ -239,6 +237,7 @@ export class ConformidadComponent implements OnInit {
return this.datePipe.transform(fecha, 'yyyy-mm-dd') || '';
}
async ngOnInit(): Promise<void> {
const [
......@@ -260,7 +259,7 @@ export class ConformidadComponent implements OnInit {
this.datos_personal.valueChanges.subscribe(value => {
const controlesInvalidos = Object.keys(this.datos_personal.controls)
.filter(controlName => this.datos_personal.get(controlName)?.invalid);
.filter(controlName => this.obtenerFormControl(this.datos_personal,controlName)?.invalid);
//console.log('Controles inválidos con errores:', controlesInvalidos);
this.activarPasajes = controlesInvalidos.length === 0 ? true : false;
......@@ -276,7 +275,8 @@ export class ConformidadComponent implements OnInit {
});
// 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.obtenerFormControl(this.datos_personal,'sedePersonal')?.valueChanges.subscribe((value : any) => {
this.lugarDestinoPasaje = this.sede_list.find((item: any) => item.codlocal === value)?.deslocal || '';
});
......@@ -338,7 +338,7 @@ export class ConformidadComponent implements OnInit {
}
});
this.datos_materialSobrante.get('existeMaterial')?.valueChanges.subscribe((value) => {
this.existeMaterialS.get('existeMaterial')?.valueChanges.subscribe((value) => {
console.log(value);
});
......@@ -411,7 +411,7 @@ export class ConformidadComponent implements OnInit {
//REALIZAR UNA BUSQUEDA DE REQUERIMIENTO
async onBusquedaRequerimiento(event: any) {
const codigoSede = this.accesoDP().sedePersonal.value;
const codigoSede = this.obtenerFormControl(this.datos_personal,'sedePersonal')?.value;
const busquedaReq = event.target.value;
const jsonParametrosReq = {
......@@ -436,15 +436,16 @@ export class ConformidadComponent implements OnInit {
index: this.indexPasaje++,
lugarOrigen: '',
lugarDestino: '',
monto: '',
monto: 0,
fecha: new Date(),
isNew: true,
isEdit : false,
acciones: true
};
this.datos_pasajeAcumulado.addControl('montoPasaje'+NuevaFila.index, new FormControl<number | null>(null,[Validators.maxLength(12)]));
this.datos_fechaPasaje.addControl('fechaPasaje'+NuevaFila.index, new FormControl<Date | null>(null,[Validators.maxLength(12)]));
this.datos_lugarOrigen.addControl('lugarOrigen'+NuevaFila.index, new FormControl<String | null>(null ,[Validators.maxLength(12)]));
this.agregarFormControl(this.datos_pasajeAcumulado,'montoPasaje'+NuevaFila.index,new FormControl<number | null>(null,[Validators.maxLength(12)]));
this.agregarFormControl(this.datos_fechaPasaje,'fechaPasaje'+NuevaFila.index,new FormControl<Date | null>(null,[Validators.maxLength(12)]));
this.agregarFormControl(this.datos_lugarOrigen,'lugarOrigen'+NuevaFila.index,new FormControl<String | null>(null ,[Validators.maxLength(12)]));
this.dataSource.forEach((item) => {
if (item.index !== NuevaFila.index) {
......@@ -462,10 +463,12 @@ export class ConformidadComponent implements OnInit {
}
onEventoConfirmarPasaje(event: any, elemento: any){
const lugarOrigen = this.datos_lugarOrigen.get(`lugarOrigen${elemento.index}`)?.value;
const lugarDestino = this.datos_personal.get('sedePersonal')?.value || '';
const pasaje = this.datos_pasajeAcumulado.get(`montoPasaje${elemento.index}`)?.value;
const fechaPasaje = this.datos_fechaPasaje.get(`fechaPasaje${elemento.index}`)?.value;
const lugarOrigen = this.obtenerFormControl(this.datos_lugarOrigen,`lugarOrigen${elemento.index}`)?.value;
const lugarDestino = this.obtenerFormControl(this.datos_personal,'sedePersonal')?.value || '';
const pasaje = this.obtenerFormControl(this.datos_pasajeAcumulado,`montoPasaje${elemento.index}`)?.value;
const fechaPasaje = this.obtenerFormControl(this.datos_fechaPasaje,`fechaPasaje${elemento.index}`)?.value;
//VALIDAR LOS VALORES OBTENIDOS ANTES DE REALIZAR UN REGISTRO
......@@ -513,11 +516,9 @@ export class ConformidadComponent implements OnInit {
const fechaPasaje = this.datos_fechaPasaje.get('fechaPasaje'+index)?.value;
const montoPasaje = this.datos_pasajeAcumulado.get('montoPasaje'+index)?.value;
this.datos_lugarOrigen.get('lugarOrigen'+index)?.setErrors({'incorrect': !(lugarOrigen && lugarOrigen !== lugarDestino) , emitEvent: true});
this.datos_fechaPasaje.get('fechaPasaje'+index)?.setErrors({'incorrect': !fechaPasaje , emitEvent: true });
this.datos_pasajeAcumulado.get('montoPasaje'+index)?.setErrors({'incorrect': !(montoPasaje && montoPasaje > 0) , emitEvent: true });
this.obtenerFormControl(this.datos_lugarOrigen,'lugarOrigen'+index)?.setErrors({'incorrect': !(lugarOrigen && lugarOrigen !== lugarDestino) , emitEvent: true});
this.obtenerFormControl(this.datos_fechaPasaje,'fechaPasaje'+index)?.setErrors({'incorrect': !fechaPasaje , emitEvent: true });
this.obtenerFormControl(this.datos_pasajeAcumulado,'montoPasaje'+index)?.setErrors({'incorrect': !(montoPasaje && montoPasaje > 0) , emitEvent: true });
return lugarOrigen && lugarDestino && fechaPasaje && montoPasaje && montoPasaje > 0 && lugarOrigen !== lugarDestino;
......@@ -536,9 +537,9 @@ export class ConformidadComponent implements OnInit {
}else{
this.dataSource = this.dataSource.filter((item) => item.index !== elemento.index);
this.datos_pasajeAcumulado.removeControl('montoPasaje'+elemento.index);
this.datos_fechaPasaje.removeControl('fechaPasaje'+elemento.index);
this.datos_lugarOrigen.removeControl('lugarOrigen'+elemento.index);
this.removerFormControl(this.datos_pasajeAcumulado,'montoPasaje'+elemento.index);
this.removerFormControl(this.datos_fechaPasaje,'fechaPasaje'+elemento.index);
this.removerFormControl(this.datos_lugarOrigen,'lugarOrigen'+elemento.index);
}
......@@ -549,7 +550,7 @@ export class ConformidadComponent implements OnInit {
//Editar una fila de pasaje
onEventoEditarPasaje(event: any, elemento: any) {
const index = this.dataSource.findIndex((item) => item.index === elemento.index);//Descubriendo el index
//const index = this.dataSource.findIndex((item) => item.index === elemento.index);//Descubriendo el index
this.dataSource.forEach((item) => {
if (item.index === elemento.index) {
......@@ -563,8 +564,6 @@ export class ConformidadComponent implements OnInit {
}
});
//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.activarPasajes = false;
......@@ -579,9 +578,9 @@ export class ConformidadComponent implements OnInit {
const index = elemento.index;
if (index >= 0) {
this.dataSource = this.dataSource.filter((item) => item.index !== elemento.index);
this.datos_pasajeAcumulado.removeControl('montoPasaje'+elemento.index);
this.datos_fechaPasaje.removeControl('fechaPasaje'+elemento.index);
this.datos_lugarOrigen.removeControl('lugarOrigen'+elemento.index);
this.removerFormControl(this.datos_pasajeAcumulado,'montoPasaje'+elemento.index);
this.removerFormControl(this.datos_fechaPasaje,'fechaPasaje'+elemento.index);
this.removerFormControl(this.datos_lugarOrigen,'lugarOrigen'+elemento.index);
}
}
});
......@@ -628,41 +627,6 @@ export class ConformidadComponent implements OnInit {
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 = () => {
......@@ -693,7 +657,6 @@ export class ConformidadComponent implements OnInit {
}else{
this.archivosEvidencia.splice(index, 1); // Eliminar el archivo del array de archivosEP
}
}
......@@ -705,61 +668,99 @@ export class ConformidadComponent implements OnInit {
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 datosTrabajo = this.datos_trabajo.getRawValue();
const existeMaterial = parseInt(this.existeMaterialS.get('existeMaterial')?.value) || 0;
const datosMaterial = this.ordenSalidaComponent?.dataSource.length > 0 ? this.ordenSalidaComponent?.dataSource : [];
const archivosEvidencias = this.archivosEvidencia;
let contadorEP = 1;
let contadorES = 1;
/*const archivosEP = this.archivosEP;
const archivosES = this.archivosES;*/
const datosMaterialSobrante = this.ordenSalidaComponent?.datos_materialSobrante?.get('descMaterial')?.value ? this.ordenSalidaComponent?.datos_materialSobrante?.get('descMaterial')?.value : '';
//console.log(existeMaterial);
//console.log(datosMaterial);
//console.log(datosMaterialSobrante);
//console.log(this.ordenSalidaComponent?);
/*
const registroArchivos = archivosEvidencias.map((item) => {
//CREACION DE CARPETA DE EVIDENCIAS
Notiflix.Loading.pulse();
const registroEvidencia = await this.conformidadHelper.creacionCarpeta({codconformidad: 40});
console.log(registroEvidencia);
Notiflix.Loading.remove();
//Subida simultanea de evidencias de PROBLEMAS y SOLUCIONES
/*const registroArchivos = archivosEvidencias.map((item) => {
return {
codconformidad : 48,
codconformidad : 40,
archivo: item.file,
tipoEvidencia : item.tipoEvidencia,
nombreArchivo : (item.tipoEvidencia === 1) ? 'EVIDENCIA_PROBLEMA_48'+ (contadorEP++) : 'EVIDENCIA_SERVICIO_48' + (contadorES++)
nombreArchivo : (item.tipoEvidencia === 1) ? 'EVIDENCIA_PROBLEMA_'+40+"_"+(contadorEP++) : 'EVIDENCIA_SOLUCION_'+40+"_"+(contadorES++)
};
});
const filtroEvidenciasProblemas = registroArchivos.filter((item) => item.tipoEvidencia === 1);
const filtroEvidenciasSoluciones = registroArchivos.filter((item) => item.tipoEvidencia === 2);
console.log(filtroEvidenciasProblemas);
console.log(filtroEvidenciasSoluciones);
for (let i=0; i < registroArchivos.length; i++){
console.log(registroArchivos[i]);
const registroEvidencia = await this.conformidadHelper.subidaEvidencia(registroArchivos[i]);
console.log(registroEvidencia);
const registroEvidencia = await Promise.all([this.conformidadHelper.subidaEvidencia(filtroEvidenciasProblemas),this.conformidadHelper.subidaEvidencia(filtroEvidenciasSoluciones)]);
console.log(registroEvidencia)*/
/*Notiflix.Loading.pulse(); // Muestra un loading
if (!this.validarDatosPersonales(datosPersonal)) {
this.mostrarAlerta('VALIDAR DATOS PERSONALES');
return;
}
*/
if (!this.validarPasajes(datosPasajes)) {
this.mostrarAlerta('VALIDAR PASAJES');
return;
}
if (!this.validarArchivos(archivosEvidencias)) {
const tipoEvidencia = archivosEvidencias.find((item) => item.tipoEvidencia === 1) ? 2 : (archivosEvidencias.find((item) => item.tipoEvidencia === 2) ? 1 : 0 );
const advertencia = tipoEvidencia === 0 ? 'REQUIERE SUBIR EVIDENCIAS' : (tipoEvidencia === 1 ? 'REQUIERE SUBIR EVIDENCIA DE PROBLEMA' : 'REQUIERE SUBIR EVIDENCIA DE SERVICIOS');
this.mostrarAlerta(advertencia);
return;
}
if (!this.validarMaterialSobrante(existeMaterial, this.ordenSalidaComponent?.dataSource)) {
this.mostrarAlerta('VALIDAR MATERIAL SOBRANTE');
return;
}
if (!this.datos_trabajo.valid) {
this.mostrarAlerta('VALIDAR DATOS DE TRABAJO');
return;
}
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'
codper: datosPersonal.tecnicoPersonal,
codlocal: datosPersonal.sedePersonal,
fechainicio: this.formatoFechaRegistro(datosPersonal.minFechaTrabajo || new Date() ) ,
fechafin: this.formatoFechaRegistro(datosPersonal.maxFechaTrabajo || new Date() ) ,
descproblema: datosServicio.descripcionServicio,
desccausa: datosServicio.causaServicio,
codtipotrabajo: parseInt(datosTrabajo.tipoTrabajo || '1'),
desctrabajo: datosTrabajo.descripcionTrabajo
});
const respuestaConformidad : any = JSON.parse(registroConformidad);
const respuestaConformidad : any = JSON.parse(registroConformidad);
if(respuestaConformidad.status){ // DATOS DE CONFORMIDAD VALIDADOS Y REGISTRADOS
let statusPasaje = true ;
if(datosPasajes.length > 0){
console.log(datosPasajes)
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),
pasaje: item.monto,
fechainicio: this.formatoFechaRegistro(item.fecha)
};
});
......@@ -778,6 +779,7 @@ export class ConformidadComponent implements OnInit {
let statusRequerimientos = true ;
if(requerimientoRelacionados.length > 0){
console.log(requerimientoRelacionados);
const datosRequerimientos = requerimientoRelacionados.map((item) => {
return {
opcion: 3,
......@@ -818,114 +820,111 @@ export class ConformidadComponent implements OnInit {
}
}
if(statusEvidencias) {
console.log(statusEvidencias);
console.log('SE REGISTRO TODO')
if(statusEvidencias) { // REGISTRO DE EVIDENCIAS SUBIDAS AL DRIVE Y REGISTRADAS EN BASE
}else{
this.barraAlerta.open( 'ERROR AL REGISTRAR LOS ARCHIVOS DE EVIDENCIA' , '' , {
horizontalPosition: this.alertaPosicionHorizontal,
verticalPosition: this.alertaPosicionVertical,
duration: this.alertaDuracion * 1000
});
}
let statusOrdenSalida = true;
}
if(existeMaterial === 1){
}else{
this.barraAlerta.open( 'ERROR AL REGISTRAR LOS PASAJES' , '' , {
horizontalPosition: this.alertaPosicionHorizontal,
verticalPosition: this.alertaPosicionVertical,
duration: this.alertaDuracion * 1000
});
}
const registroOrdenSalida = await this.conformidadHelper.gestionOrdenSalida({
accion : 1,
codper: datosPersonal.tecnicoPersonal,
codlocal: datosPersonal.sedePersonal,
fechaRegistro: this.formatoFechaRegistro(new Date()),
descripcion : datosMaterialSobrante
});
}else{
this.barraAlerta.open( 'ERROR AL REGISTRAR LA CONFORMIDAD' , '' , {
horizontalPosition: this.alertaPosicionHorizontal,
verticalPosition: this.alertaPosicionVertical,
duration: this.alertaDuracion * 1000
});
}
console.log(registroOrdenSalida);
/*if(datosPersonal?.codAreaPersona && datosPersonal?.sedePersonal && datosPersonal?.tecnicoPersonal && datosPersonal?.maxFechaTrabajo && datosPersonal?.minFechaTrabajo){ // VALIDAR SECCION PERSONAL
const respuestaOrdenSalida : any = JSON.parse(registroOrdenSalida);
if( (datosPasajes.length > 0 && datosPasajes.every((item) => item.lugarOrigen && item.lugarDestino && item.monto && item.fecha)) || datosPasajes.length === 0 ){ // VALIDAR SECCION DE PASAJES
if(respuestaOrdenSalida.status) {
if(archivosEP.length > 0 && archivosES.length > 0){ // VALIDAR LOS ARCHIVOS ENTRANTES DE EVIDENCIA DE PROBLEMA Y SERVICIOS
const datosMaterialSobrante = datosMaterial.map((item) => {
return {
accion: 2,
codOrdenSalida : respuestaOrdenSalida.data.codordensalida,
codArticulo : item.codigoArticulo,
cantidad: item.cantidad,
estado : item.estado
};
});
for (let i=0; i < datosMaterial.length; i++){
const registroMaterialS = await this.conformidadHelper.gestionOrdenSalida(datosMaterialSobrante[i]);
console.log(registroMaterialS);
const respuestaregistroMaterialS = JSON.parse(registroMaterialS);
if(!respuestaregistroMaterialS.status) {
statusOrdenSalida = false;
break;
}
}
if(datosTrabajo.valid){ // VALIDAR LOS DATOS DE DESCRIPCION DE TRABAJO
}else{
this.mostrarAlerta('ERROR AL REGISTRAR LOS ORDEN DE SALIDA');
}
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{
statusOrdenSalida = true;
}
console.log(statusOrdenSalida);
if(statusOrdenSalida){
console.log("SE REGISTRO TODO CORRECTAMENTE")
}else{
this.barraAlerta.open( 'VALIDAR MATERIAL SOBRANTE' , '' , {
horizontalPosition: this.alertaPosicionHorizontal,
verticalPosition: this.alertaPosicionVertical,
duration: this.alertaDuracion * 1000
});
return;
this.mostrarAlerta('ERROR AL REGISTRAR ORDEN DE SALIDA');
}
}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.mostrarAlerta('ERROR AL REGISTRAR LOS ARCHIVOS DE EVIDENCIA');
}
}
}else{
this.barraAlerta.open( 'VALIDAR PASAJES' , '' , {
horizontalPosition: this.alertaPosicionHorizontal,
verticalPosition: this.alertaPosicionVertical,
duration: this.alertaDuracion * 1000
});
return;
this.mostrarAlerta('ERROR AL REGISTRAR LOS REQUERIMIENTOS');
}
}else{
this.barraAlerta.open( 'VALIDAR DATOS PERSONALES' , '' , {
horizontalPosition: this.alertaPosicionHorizontal,
verticalPosition: this.alertaPosicionVertical,
duration: this.alertaDuracion * 1000
});
return;
this.mostrarAlerta('ERROR AL REGISTRAR LA CONFORMIDAD');
}*/
}
validarDatosPersonales(datosPersonal: any): boolean {
return datosPersonal?.codAreaPersona && datosPersonal?.sedePersonal &&
datosPersonal?.tecnicoPersonal && datosPersonal?.maxFechaTrabajo &&
datosPersonal?.minFechaTrabajo;
}
validarPasajes(datosPasajes: any[]): boolean {
return (datosPasajes.length > 0 && datosPasajes.every((item) => item.lugarOrigen && item.lugarDestino && item.monto && item.fecha)) || datosPasajes.length === 0;
}
validarArchivos(archivosEvidencia : any[]): boolean {
return archivosEvidencia.find((item) => item.tipoEvidencia === 1) && archivosEvidencia.find((item) => item.tipoEvidencia === 2);//Debe existir por lo menos un archivo de evidencia de problema y uno de solucion
}
validarMaterialSobrante(existeMaterial: number, dataSource: any[]): boolean {
return (existeMaterial === 1 && dataSource.length > 0) || existeMaterial === 0;
}
mostrarAlerta(mensaje: string): void {
Notiflix.Loading.remove();
this.barraAlerta.open(mensaje, '', {
horizontalPosition: this.alertaPosicionHorizontal,
verticalPosition: this.alertaPosicionVertical,
duration: this.alertaDuracion * 1000
});
}
}
......@@ -40,4 +40,23 @@ export class ConformidadHelper {
return respuesta
}
async subidaEvidencia2( json : any ){
const respuesta = await this.ConformidadService.subidaEvidencia2(json);
return respuesta
}
async creacionCarpeta(json : any){
const respuesta = await this.ConformidadService.creacionCarpeta(json);
return respuesta
}
async gestionOrdenSalida( json : any ){
const respuesta = await this.ConformidadService.gestionOrdenSalida(json);
if (respuesta?.status) {
return respuesta.json;
}else{
return [];
}
}
}
<div class="m-5">
<div class="m-5" [formGroup]="datos_materialSobrante">
<!-- Descripción del Material Sobrante -->
<div class="w-full">
<mat-form-field class="w-full">
<mat-label>DESCRIPCIÓN DEL MATERIAL SOBRANTE :</mat-label>
<textarea formControlName="descMaterial" matInput placeholder="Breve descripción de los materiales faltantes y su estado"></textarea>
</mat-form-field>
</div>
<!---------------------------------------------------------------------- SECCIÓN MATERIALES SOBRANTES ---------------------------------------------------------------------->
<div class="mt-6">
<!-- Título y botón de agregar artículo -->
<div class="grid gap-4 grid-cols-1 sm:grid-cols-2 items-center">
<mat-label class="text-[1.1em] font-bold mb-4 flex items-center">
LISTADO DE ARTÍCULOS
<mat-icon class="ml-2">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>
<!-- Tabla de artículos -->
<div class="overflow-x-auto">
<table mat-table [dataSource]="dataSource" class="mat-elevation-z8 w-full">
<!-- Columna Nombre de Artículo -->
<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 class="w-[25rem]">
<input type="text" placeholder="Buscar artículos" 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>
<!-- Columna Unidad -->
<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-label>{{formGroupMS(2,'unidad'+element.index)?.value}}</mat-label>
</ng-container>
<ng-template #displayOrigen>
{{ element.unidad }}
</ng-template>
</td>
</ng-container>
<!-- Columna Cantidad -->
<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 class="w-[10rem]" appearance="outline">
<input matInput formControlName="cantidad{{element.index}}" soloNumeros maxlength="2">
</mat-form-field>
</ng-container>
<ng-template #displayOrigen>
{{ element.cantidad }}
</ng-template>
</td>
</ng-container>
<!-- Columna Estado Artículo -->
<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="w-full select-tipoTrabajo">
<mat-label>Seleccionar tipo de trabajo</mat-label>
<mat-select formControlName="estado{{element.index}}">
<mat-option *ngFor="let tipoT of listEstadoArticulo" [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>
<!-- Columna Acción -->
<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>
<!-- Header y Filas -->
<tr mat-header-row *matHeaderRowDef="columnasArticulos"></tr>
<tr mat-row *matRowDef="let row; columns: columnasArticulos;"></tr>
</table>
</div>
</div>
</div>
<!--<div class="m-5" [formGroup]="datos_materialSobrante">
<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>
<textarea formControlName="descMaterial" 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>
<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)">
......@@ -41,10 +169,7 @@
<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>
<mat-label>{{formGroupMS(2,'unidad'+element.index)?.value}}</mat-label>
</ng-container>
<ng-template #displayOrigen>
{{element.unidad}}
......@@ -115,5 +240,4 @@
</table>
</div>
</div>
<!---------------------------------------------------------------------- SECCION MATERIALES SOBRANTES ---------------------------------------------------------------------->
</div>
</div> -->
......@@ -31,6 +31,7 @@ import { ConfirmarEliminacionComponent } from '../conformidad/modalEliminarPasa
interface interArticulo{
index: number;
codigoArticulo : string;
nombre: string;
unidad: string;
cantidad: number;
......@@ -107,7 +108,9 @@ export class ordenSalidaComponent implements OnInit {
//FORM GROUP
datos_materialSobrante: FormGroup = new FormGroup<any>({});
public datos_materialSobrante: FormGroup = new FormGroup<any>({
descMaterial : new FormControl<String | null>(null,[Validators.maxLength(100)]),
});
//FORM GROUP
// INICIALIZACION DATOS
......@@ -116,7 +119,6 @@ export class ordenSalidaComponent implements OnInit {
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
......@@ -141,25 +143,29 @@ export class ordenSalidaComponent implements OnInit {
private datePipe: DatePipe,
) {
this.articulosList = [];
this.codigoUnidad = '';
//this.codigoUnidad = '';
}
ngOnInit(): void {
this.dataSource = [];
}
onAgregarArticulo(event : any){
const NuevaFila : interArticulo = {
index: this.indexArticulo++,
codigoArticulo: '',
nombre: '',
unidad: '',
cantidad: 0,
estado: 1,
isNew: true,
isEdit: true,
isEdit: false,
acciones: true
};
this.formGroupMS(1,'articulo'+NuevaFila.index, new FormControl<String | null>(null,[Validators.maxLength(12)]));
this.formGroupMS(1,'codigoArticulo'+NuevaFila.index, new FormControl<String | null>(null));
this.formGroupMS(1,'unidad'+NuevaFila.index, new FormControl<String | null>(null));
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)]));
......@@ -175,15 +181,15 @@ export class ordenSalidaComponent implements OnInit {
this.activarNuevoArticulo = false;
this.articulosList = [];
console.log(this.articulosList);
}
onEventoConfirmarArticulo($event: MouseEvent, elemento : any) {
const articulo = this.formGroupMS(2,'articulo'+elemento.index)?.value;
const codigoArticulo = this.formGroupMS(2,'codigoArticulo'+elemento.index)?.value;
const unidad = this.formGroupMS(2,'unidad'+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})){
......@@ -191,8 +197,9 @@ export class ordenSalidaComponent implements OnInit {
const index = this.dataSource.findIndex((item) => item.index === elemento.index);
this.dataSource[index] = {
index: elemento.index,
codigoArticulo : codigoArticulo,
nombre: articulo,
unidad: this.codigoUnidad,
unidad: unidad,
cantidad: cantidad,
estado: estado,
isNew: false,
......@@ -201,7 +208,7 @@ export class ordenSalidaComponent implements OnInit {
};
console.log(this.dataSource , 'DATASOURCE');
console.log(this.dataSource);
//console.log(lugarOrigen , lugarDestino, pasaje, fechaPasaje)
this.dataSource.forEach((item) => { item.acciones = true; }); // VUELVE A ACTIVAR TODAS LAS ACCION
......@@ -259,7 +266,7 @@ export class ordenSalidaComponent implements OnInit {
}
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) {
......@@ -273,10 +280,7 @@ export class ordenSalidaComponent implements OnInit {
}
});
//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;
}
......@@ -331,7 +335,9 @@ export class ordenSalidaComponent implements OnInit {
console.log(articulo);
//SE OPTIENE EL NOMBRE PARA PONERLO EN EL INPUT
this.formGroupMS(2,'articulo'+index)?.setValue(articulo.nombre);
this.codigoUnidad = articulo.unidad;
this.formGroupMS(2,'codigoArticulo'+index)?.setValue(articulo.codigo);
this.formGroupMS(2,'unidad'+index)?.setValue(articulo.unidad);
// this.codigoUnidad = articulo.unidad;
//SE VUELVE A LIMPIAR EL LISTADO DE ARTICULOS PARA DEJAR PASO A OTRA FUTURA BUSQUEDA.
this.articulosList = [];
......
......@@ -69,7 +69,6 @@ export class ConformidadService {
desccausa : json.desccausa || '',
codtipotrabajo: json.codtipotrabajo || 0 ,
desctrabajo: json.desctrabajo || '',
materialsobrate: json.materialsobrate || '',
pasaje : json.pasaje || 0,
codrequerimiento : json.codrequerimiento || 0
};
......@@ -83,22 +82,23 @@ export class ConformidadService {
}
}
async subidaEvidencia(json:any){
const url = `${this.t_redireccionamiento}/google/drive`;
async creacionCarpeta(json: any) {
let respuesta: any;
const url = `${this.t_redireccionamiento}/google/drive/carpeta`;
const formData = new FormData();
formData.append('archivo_nombre', json.nombreArchivo);
formData.append('archivo_binario', json.archivo);
formData.append('archivo_nombre', '');
formData.append('archivo_binario', '');
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');
formData.append('app_nombre', 'EVIDENCIA_CONFORMIDAD');
formData.append('carpeta_nombre', 'CONFORMIDAD_' + json.codconformidad);
formData.append('subcarpeta_nombre', '');
const controller = new AbortController();
const timeout = setTimeout(() => controller.abort(), 30000); // 30 segundos
try {
const response = await fetch(url, {
method: 'POST',
......@@ -109,64 +109,195 @@ export class ConformidadService {
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){
if (statusCode === 200) {
console.log(responseBody);
respuesta = {status: false, message: "Carpeta creada"};
}else{
respuesta = {status: false, message: "Carpeta no creada"};
}
}catch (error) {
console.error('Error al registrar el archivo:', error);
//throw error;
respuesta = {status: false, message: error};
}
//console.log(responseBody);
return respuesta;
}
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 || ''
async subidaEvidencia(json:any){
const url = `${this.t_redireccionamiento}/google/drive`;
let respuesta: any;
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', 'EVIDENCIA_CONFORMIDAD');
formData.append('carpeta_nombre', 'CONFORMIDAD_' + json.codconformidad);
formData.append('subcarpeta_nombre', json.tipoEvidencia === 1 ? 'EVIDENCIAS_PROBLEMAS' : 'EVIDENCIAS_SOLUCIONES');
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
});
if(registroEvidencia?.status){
respuesta = {status: true, message: "Imagen subida"};
}else{
respuesta = { status :false , message : "Imagen no subida" };
const statusCode = response.status;
const responseBody = await response.json();
clearTimeout(timeout); // Limpiar, REVISA SI ESTO ESTA BIEN O QUITARLO
//let respuesta: any;
if (statusCode === 200) {
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: "Imagenes subidas"};
} else {
respuesta = {status: false, message: "Fallo en subir imagenes"};
}
} else {
respuesta = {status: false, message: "Imagenes subidas"};
}
//return respuesta;
} catch (error) {
console.error('Error al registrar el archivo:', error);
//throw error;
respuesta = {status: false, message: error};
}
return respuesta;
}
//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" };
async subidaEvidencia2(json:any){
const url = `${this.t_redireccionamiento}/google/drive`;
let respuesta: any;
for(let i = 0 ; i < json.length ; i++){
const datos = json[i];
const formData = new FormData();
formData.append('archivo_nombre', datos.nombreArchivo);
formData.append('archivo_binario', datos.archivo);
formData.append('archivo_id_actual', '');
formData.append('carpeta_id', this.value_idDrive);
formData.append('correo', this.value_correoDrive);
formData.append('app_nombre', 'EVIDENCIA_CONFORMIDAD');
formData.append('carpeta_nombre', 'CONFORMIDAD_' + datos.codconformidad);
formData.append('subcarpeta_nombre', datos.tipoEvidencia === 1 ? 'EVIDENCIAS_PROBLEMAS' : 'EVIDENCIAS_SOLUCIONES');
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();
clearTimeout(timeout); // Limpiar, REVISA SI ESTO ESTA BIEN O QUITARLO
if (statusCode === 200) {
const registroEvidencia = await this.registroDocumento({
codconformidad: datos.codconformidad || 0,
tipoEvidencia: datos.tipoEvidencia || 0,
idDrive: responseBody.data.archivo_id || '',
enlaceDrive: responseBody.data.archivo_url_vista || '',
enlaceDescarga: responseBody.data.archivo_url || '',
nombreDocumento: datos.nombreArchivo || ''
});
if (registroEvidencia?.status) {
respuesta = {status: true, message: "Imagenes subidas"};
} else {
respuesta = {status: false, message: "Fallo en subir imagenes"};
}
} else {
respuesta = {status: false, message: "Imagenes subidas"};
}
//return respuesta;
} catch (error) {
console.error('Error al registrar el archivo:', error);
//throw error;
respuesta = {status: false, message: error};
}
return respuesta;
} catch (error) {
console.error('Error al registrar el archivo:', error);
throw error;
}
return respuesta;
}
async registroDocumento(json : any){
async registroDocumento(json: any) {
const parametros = {
codconformidad: json.codconformidad || 0,
tipoEvidencia: json.tipoEvidencia || 0,
idDrive: json.idDrive || '',
enlaceDrive: json.enlaceDrive || '',
enlaceDescarga: json.enlaceDescarga || '',
nombreDocumento: json.nombreDocumento || ''
};
try {
const respuesta = await axios.post(this.t_facturacion_electronica_link + '/api/v1/conformidad/registroDocumentos', json);
//console.log(respuesta);
const respuesta = await axios.post(this.t_facturacion_electronica_link + '/api/v1/conformidad/registroDocumentos', parametros);
return respuesta.data;
} catch (e) {
return e;
}
}
async gestionOrdenSalida(json : any){
const parametros = {
accion : json.accion || 0,
codOrdenSalida : json.codOrdenSalida || 0,
codper : json.codper || 0,
codlocal : json.codlocal || '',
descripcion: json.descripcion || '',
fechaRegistro : json.fechaRegistro || '',
codArticulo : json.codArticulo || '',
cantidad : json.cantidad || 0,
estado : json.estado || 0,
};
try {
const respuesta = await axios.post(this.t_facturacion_electronica_link + '/api/v1/conformidad/gestionOrdenSalida', parametros);
return respuesta.data;
} catch (e) {
return e;
}
}
......
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