[EDIT] VALIDACIONES DE REGISTRO CONFORMIDAD CON SUBIDAD DE ARCHIVOS

parent ddf174f7
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -42,3 +42,24 @@ mat-label { ...@@ -42,3 +42,24 @@ mat-label {
white-space: pre-line; /* Permite respetar saltos de línea */ white-space: pre-line; /* Permite respetar saltos de línea */
} }
.progress-bar {
width: 100%;
height: 20px;
background: #ccc;
border-radius: 10px;
overflow: hidden;
margin-top: 10px;
}
.progress {
height: 100%;
background: #4caf50;
transition: width 0.3s ease-in-out;
}
.success-snackbar {
background-color: #4caf50 !important; /* Color verde */
color: white !important;
text-align: center;
font-weight: bold;
}
...@@ -429,7 +429,7 @@ ...@@ -429,7 +429,7 @@
<mat-label>SUBIR FOTO DE LA ATS</mat-label> <mat-label>SUBIR FOTO DE LA ATS</mat-label>
<mat-icon>file_open</mat-icon> <mat-icon>file_open</mat-icon>
</button> </button>
<input type="file" #fotoATC (change)="onEventoSubirArchivo($event,3)" class="hidden" accept="image/png, image/jpeg"> <input type="file" #fotoATC (change)="onEventoSubirArchivo($event,3)" class="hidden" multiple accept="image/png, image/jpeg">
</div> </div>
<div *ngFor="let archivo of archivosEvidencia; let i = index"> <div *ngFor="let archivo of archivosEvidencia; let i = index">
<div *ngIf="archivo.tipoEvidencia === 3" class="flex w-full mt-2"> <div *ngIf="archivo.tipoEvidencia === 3" class="flex w-full mt-2">
......
import { import {Component, OnInit, ChangeDetectorRef, Renderer2, ElementRef, ViewChild, inject, QueryList, ViewChildren, NgModule,
Component, AfterViewInit, contentChild} from '@angular/core';
OnInit,
ChangeDetectorRef,
Renderer2,
ElementRef,
ViewChild,
inject,
QueryList,
ViewChildren,
NgModule,
AfterViewInit, contentChild
} from '@angular/core';
import {FormBuilder, 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';
import { import {provideNativeDateAdapter, MatNativeDateModule, MAT_DATE_FORMATS, MAT_DATE_LOCALE, DateAdapter } from '@angular/material/core';
provideNativeDateAdapter,
MatNativeDateModule,
MAT_DATE_FORMATS,
MAT_DATE_LOCALE,
DateAdapter
} from '@angular/material/core';
import {DateRange, MatDatepickerModule, MatDateRangeInput } from '@angular/material/datepicker'; import {DateRange, MatDatepickerModule, MatDateRangeInput } from '@angular/material/datepicker';
import { NgxMatTimepickerModule } from '@alexfriesen/ngx-mat-timepicker'; import {NgxMatTimepickerModule } from '@alexfriesen/ngx-mat-timepicker';
import {MatFormFieldModule} from '@angular/material/form-field'; import {MatFormFieldModule} from '@angular/material/form-field';
import {MatInputModule} from '@angular/material/input'; import {MatInputModule} from '@angular/material/input';
import {MatSelectModule} from '@angular/material/select'; import {MatSelectModule} from '@angular/material/select';
import {MatButtonToggleModule} from '@angular/material/button-toggle'; import {MatButtonToggleModule} from '@angular/material/button-toggle';
import {MatCheckboxModule} from '@angular/material/checkbox'; import {MatCheckboxModule} from '@angular/material/checkbox';
import {ConformidadHelper} from "./helper/conformidad.helper"; import {ConformidadHelper} from "./helper/conformidad.helper";
import {ConformidadService} from "../../service/conformidad_service/conformidad.service";
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 {MatAutocompleteModule} from '@angular/material/autocomplete'; import {MatAutocompleteModule} from '@angular/material/autocomplete';
...@@ -47,11 +31,7 @@ import { modalEvidenciaComponent } from "./modalEvidencia/modalEvidencia.compone ...@@ -47,11 +31,7 @@ import { modalEvidenciaComponent } from "./modalEvidencia/modalEvidencia.compone
import { truncarCaracteresDirective } from "../../service/directivas_service/restriccionCaracteres/truncarCaracteres.directive"; import { truncarCaracteresDirective } from "../../service/directivas_service/restriccionCaracteres/truncarCaracteres.directive";
import { ordenSalidaComponent } from "../ordensalida/ordensalida.componente"; import { ordenSalidaComponent } from "../ordensalida/ordensalida.componente";
import {elementSelectors} from "@angular/cdk/schematics"; import {elementSelectors} from "@angular/cdk/schematics";
import { CustomDateAdapter } from '../../service/directivas_service/formatoFecha/custom-date'; // Archivo personalizado import { CustomDateAdapter } from '../../service/directivas_service/formatoFecha/custom-date'; // Archivo personalizado
//import { AngularSignaturePadModule, SignaturePadComponent } from '@almothafar/angular-signature-pad';
import Notiflix from 'notiflix'; import Notiflix from 'notiflix';
import { DecimalPipe } from '@angular/common'; import { DecimalPipe } from '@angular/common';
import {environment} from "../../../environment/env"; import {environment} from "../../../environment/env";
...@@ -188,7 +168,6 @@ export class ConformidadComponent implements AfterViewInit { ...@@ -188,7 +168,6 @@ export class ConformidadComponent implements AfterViewInit {
//activarPasajes : boolean = false; //activarPasajes : boolean = false;
obtenerFirma :boolean = false; obtenerFirma :boolean = false;
//lugarDestinoPasaje : string = ''; //lugarDestinoPasaje : string = '';
//columnasPasaje: string[] = ['lugarOrigen', 'lugarDestino', 'monto', 'fecha','accion']; //columnasPasaje: string[] = ['lugarOrigen', 'lugarDestino', 'monto', 'fecha','accion'];
//dataSource: interDetallePasaje[] = []; //dataSource: interDetallePasaje[] = [];
...@@ -245,12 +224,14 @@ export class ConformidadComponent implements AfterViewInit { ...@@ -245,12 +224,14 @@ export class ConformidadComponent implements AfterViewInit {
constructor( constructor(
private conformidadHelper: ConformidadHelper, private conformidadHelper: ConformidadHelper,
private ConformidadService : ConformidadService,
private renderer: Renderer2, private renderer: Renderer2,
private detectorChange : ChangeDetectorRef, private detectorChange : ChangeDetectorRef,
public dialog: MatDialog, public dialog: MatDialog,
private datePipe: DatePipe, private datePipe: DatePipe,
private fb: FormBuilder, private fb: FormBuilder,
private decimalPipe: DecimalPipe private decimalPipe: DecimalPipe,
private snackBar: MatSnackBar
) { ) {
this.requerimientosFiltrados = []; this.requerimientosFiltrados = [];
renderer.setStyle(document.body, 'background', 'var(--light-theme-bg)'); renderer.setStyle(document.body, 'background', 'var(--light-theme-bg)');
...@@ -443,6 +424,56 @@ export class ConformidadComponent implements AfterViewInit { ...@@ -443,6 +424,56 @@ export class ConformidadComponent implements AfterViewInit {
} }
botonPrueba(){
/*Notiflix.Notify.success('ÉXITO DE CONFORMIDAD ', {
position: 'center-center', // Notificación en el centro de la pantalla
timeout: 1000, // 1 segundo
width: '400px',
fontSize: '24px',
fontAwesomeIconSize: '34px',
});
// Espera 1 segundo y recarga la página
setTimeout(() => {
window.location.reload();
}, 1000);*/
Notiflix.Report.failure(
"Error en subida",
`Fallaron 2 archivos después de 1 intentos.`,
"Cerrar"
);
//this.mostrarNotificacion();
/*Notiflix.Confirm.show(
"✅ ÉXITO DE CONFORMIDAD",
"Registro completado exitosamente",
"Cerrar",
() => {
setTimeout(() => {
window.location.reload(); // Recargar la página
}, 1000);
}
)*/
}
mostrarNotificacion() {
this.snackBar.open('Operación exitosa', 'Cerrar', {
duration: 1000, // 1 segundo
horizontalPosition: 'center',
verticalPosition: 'top', // Puedes cambiar a 'bottom' si prefieres
panelClass: ['success-snackbar'] // Clase CSS personalizada
});
// Espera 1 segundo y recarga la página
setTimeout(() => {
window.location.reload();
}, 1000);
}
//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, nombreValor: valor, sede: ''}); const requerimientoInfo = await this.conformidadHelper.listadoGeneralHorizon({accion: 3, nombreValor: valor, sede: ''});
...@@ -834,7 +865,91 @@ export class ConformidadComponent implements AfterViewInit { ...@@ -834,7 +865,91 @@ export class ConformidadComponent implements AfterViewInit {
let contadorExtras = 1; let contadorExtras = 1;
const datosMaterialSobrante = this.ordenSalidaComponent?.datos_materialSobrante?.get('descMaterial')?.value ? this.ordenSalidaComponent?.datos_materialSobrante?.get('descMaterial')?.value : ''; const datosMaterialSobrante = this.ordenSalidaComponent?.datos_materialSobrante?.get('descMaterial')?.value ? this.ordenSalidaComponent?.datos_materialSobrante?.get('descMaterial')?.value : '';
Notiflix.Loading.pulse(); // Muestra un loading Notiflix.Loading.standard('Cargando...');
//APLICAR EL REGISTRO DE CONFORMIDAD
/*const registroConformidad = await this.conformidadHelper.gestionConformidad({
opcion: 1,
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,
minhoratrabajo : datosPersonal.minHoraTrabajo,
maxhoratrabajo : datosPersonal.maxHoraTrabajo,
avance : datosTrabajo.avanceTrabajo,
});
console.log(registroConformidad);
//RESPUESTA DEL REGISTRO DE CONFORMIDAD
const respuestaConformidad : any = JSON.parse(registroConformidad);
if(respuestaConformidad.status){
let codigoConformidad = respuestaConformidad.data.codconformidad;
const registroCarpeta = await this.conformidadHelper.creacionCarpeta({codconformidad: codigoConformidad});
if (registroCarpeta.status) {
//UNIR LOS DATOS archivosEP Y archivosES EN UN SOLO ARRAY
let statusEvidencias = true;
const registroArchivos = archivosEvidencias.map((item) => {
return {
codconformidad: codigoConformidad,
archivo: item.file,
idCarpeta: registroCarpeta.idCarpeta,
tipoEvidencia: item.tipoEvidencia,
nombreArchivo: (item.tipoEvidencia === 1) ? 'EVIDENCIA_PROBLEMA_' + codigoConformidad + "_" + (contadorEP++) :
(item.tipoEvidencia === 2) ? 'EVIDENCIA_SOLUCION_' + codigoConformidad + "_" + (contadorES++) :
(item.tipoEvidencia === 3) ? 'EVIDENCIA_ATS_' + codigoConformidad + "_" + (constadorATS++) :
(item.tipoEvidencia === 4) ? 'FIRMA_' + codigoConformidad + "_" + (contadorFirma++) : 'DATO_EXTRA_' + codigoConformidad + "_" + (contadorExtras++)
};
});
this.ConformidadService.progresoSubida.next(0); // Reiniciar progreso
const resultados : {status: boolean , mensaje : string} = await this.conformidadHelper.subidaEvidencia3(registroArchivos);
if(resultados.status){
Notiflix.Notify.success('Operación exitosa', {
position: 'center-center', // Notificación en el centro de la pantalla
timeout: 1000, // 1 segundo
width: '400px',
fontSize: '24px',
fontAwesomeIconSize: '34px',
});
// Espera 1 segundo y recarga la página
setTimeout(() => {
window.location.reload();
}, 1000);
}else{
Notiflix.Report.failure(
"Error en subida",
resultados.mensaje,
"Cerrar"
);
//Agregar el eliminar registro y eliminar Documento.
const eliminarConformidad = await this.conformidadHelper.eliminarDocumento({opcion: 1, codconformidad: codigoConformidad});
console.log(eliminarConformidad);
}
//Notiflix.Loading.remove();
} else {
this.mostrarAlerta('ERROR AL CREAR CARPETA DE EVIDENCIAS');
}
}else{
this.mostrarAlerta('ERROR AL REGISTRAR CONFORMIDAD');
}*/
//Notiflix.Loading.pulse(); // Muestra un loading
if (!this.validarDatosPersonales(datosPersonal)) { if (!this.validarDatosPersonales(datosPersonal)) {
this.mostrarAlerta('VALIDAR DATOS PERSONALES'); this.mostrarAlerta('VALIDAR DATOS PERSONALES');
...@@ -877,12 +992,38 @@ export class ConformidadComponent implements AfterViewInit { ...@@ -877,12 +992,38 @@ export class ConformidadComponent implements AfterViewInit {
const respuestaConformidad : any = JSON.parse(registroConformidad); const respuestaConformidad : any = JSON.parse(registroConformidad);
if(respuestaConformidad.status){ // DATOS DE CONFORMIDAD VALIDADOS Y REGISTRADOS
let codigoConformidad = respuestaConformidad.data.codconformidad;
let codigoConformidad = 0 ; const registroCarpeta = await this.conformidadHelper.creacionCarpeta({codconformidad: codigoConformidad});
if(respuestaConformidad.status){ // DATOS DE CONFORMIDAD VALIDADOS Y REGISTRADOS if (registroCarpeta.status) {
//UNIR LOS DATOS archivosEP Y archivosES EN UN SOLO ARRAY
const registroArchivos = archivosEvidencias.map((item) => {
return {
codconformidad: codigoConformidad,
archivo: item.file,
idCarpeta: registroCarpeta.idCarpeta,
tipoEvidencia: item.tipoEvidencia,
nombreArchivo: (item.tipoEvidencia === 1) ? 'EVIDENCIA_PROBLEMA_' + codigoConformidad + "_" + (contadorEP++) :
(item.tipoEvidencia === 2) ? 'EVIDENCIA_SOLUCION_' + codigoConformidad + "_" + (contadorES++) :
(item.tipoEvidencia === 3) ? 'EVIDENCIA_ATS_' + codigoConformidad + "_" + (constadorATS++) :
(item.tipoEvidencia === 4) ? 'FIRMA_' + codigoConformidad + "_" + (contadorFirma++) : 'DATO_EXTRA_' + codigoConformidad + "_" + (contadorExtras++)
};
});
codigoConformidad = respuestaConformidad.data.codconformidad; this.ConformidadService.progresoSubida.next(0); // Reiniciar progreso
const resultados: {
status: boolean,
mensaje: string
} = await this.conformidadHelper.subidaEvidencia3(registroArchivos);
if (resultados.status) { // REGISTROS DE EVIDENCIAS CONFIRMADAS Y REGISTRADAS
Notiflix.Loading.change(`Registro de Personal...`);
let statusPersonal = true; let statusPersonal = true;
...@@ -903,12 +1044,15 @@ export class ConformidadComponent implements AfterViewInit { ...@@ -903,12 +1044,15 @@ export class ConformidadComponent implements AfterViewInit {
} }
} }
if(statusPersonal) { if(statusPersonal) { // REGISTRO DE PERSONAL CONFIRMADO Y REGISTRADO
let statusRequerimientos = true; let statusRequerimientos = true;
if (requerimientoRelacionados.length > 0) { if (requerimientoRelacionados.length > 0) {
Notiflix.Loading.change(`Registro de Requerimientos...`);
const datosRequerimientos = requerimientoRelacionados.map((item) => { const datosRequerimientos = requerimientoRelacionados.map((item) => {
return { return {
opcion: 3, opcion: 3,
...@@ -935,9 +1079,10 @@ export class ConformidadComponent implements AfterViewInit { ...@@ -935,9 +1079,10 @@ export class ConformidadComponent implements AfterViewInit {
if (existeMaterial === 1) { if (existeMaterial === 1) {
Notiflix.Loading.change(`Registro de Orden de Salida...`);
const registroOrdenSalida = await this.conformidadHelper.gestionOrdenSalida({ const registroOrdenSalida = await this.conformidadHelper.gestionOrdenSalida({
accion: 1, accion: 1,
//codper: datosPersonal.tecnicoPersonal,
codlocal: datosPersonal.sedePersonal + '', codlocal: datosPersonal.sedePersonal + '',
fechaRegistro: this.formatoFechaRegistro(new Date()), fechaRegistro: this.formatoFechaRegistro(new Date()),
descripcion: datosMaterialSobrante descripcion: datosMaterialSobrante
...@@ -945,7 +1090,7 @@ export class ConformidadComponent implements AfterViewInit { ...@@ -945,7 +1090,7 @@ export class ConformidadComponent implements AfterViewInit {
const respuestaOrdenSalida: any = JSON.parse(registroOrdenSalida); const respuestaOrdenSalida: any = JSON.parse(registroOrdenSalida);
if (respuestaOrdenSalida.status) { if (respuestaOrdenSalida.status) { // REGISTRO DE ORDEN DE SALIDA CONFIRMADO Y VALIDADO
const datosMaterialSobrante = datosMaterial.map((item) => { const datosMaterialSobrante = datosMaterial.map((item) => {
return { return {
...@@ -960,7 +1105,6 @@ export class ConformidadComponent implements AfterViewInit { ...@@ -960,7 +1105,6 @@ export class ConformidadComponent implements AfterViewInit {
}); });
for (let i = 0; i < datosMaterial.length; i++) { for (let i = 0; i < datosMaterial.length; i++) {
const registroMaterialS = await this.conformidadHelper.gestionOrdenSalida(datosMaterialSobrante[i]); const registroMaterialS = await this.conformidadHelper.gestionOrdenSalida(datosMaterialSobrante[i]);
//console.log(registroMaterialS);
const respuestaregistroMaterialS = JSON.parse(registroMaterialS); const respuestaregistroMaterialS = JSON.parse(registroMaterialS);
if (!respuestaregistroMaterialS.status) { if (!respuestaregistroMaterialS.status) {
statusOrdenSalida = false; statusOrdenSalida = false;
...@@ -975,8 +1119,6 @@ export class ConformidadComponent implements AfterViewInit { ...@@ -975,8 +1119,6 @@ export class ConformidadComponent implements AfterViewInit {
codordensalida: respuestaOrdenSalida.data.codordensalida codordensalida: respuestaOrdenSalida.data.codordensalida
}); });
//console.log(relacionarOrdenConformidad);
const respuestarelacionarOrdenConformidad = JSON.parse(relacionarOrdenConformidad); const respuestarelacionarOrdenConformidad = JSON.parse(relacionarOrdenConformidad);
if (!respuestarelacionarOrdenConformidad.status) { if (!respuestarelacionarOrdenConformidad.status) {
statusOrdenSalida = false; statusOrdenSalida = false;
...@@ -991,61 +1133,41 @@ export class ConformidadComponent implements AfterViewInit { ...@@ -991,61 +1133,41 @@ export class ConformidadComponent implements AfterViewInit {
if (statusOrdenSalida) { if (statusOrdenSalida) {
const registroCarpeta = await this.conformidadHelper.creacionCarpeta({codconformidad: codigoConformidad});
if (registroCarpeta.status) {
//UNIR LOS DATOS archivosEP Y archivosES EN UN SOLO ARRAY
let statusEvidencias = true;
const registroArchivos = archivosEvidencias.map((item) => {
return {
codconformidad: codigoConformidad,
archivo: item.file,
idCarpeta: registroCarpeta.idCarpeta,
tipoEvidencia: item.tipoEvidencia,
nombreArchivo: (item.tipoEvidencia === 1) ? 'EVIDENCIA_PROBLEMA_' + codigoConformidad + "_" + (contadorEP++) :
(item.tipoEvidencia === 2) ? 'EVIDENCIA_SOLUCION_' + codigoConformidad + "_" + (contadorES++) :
(item.tipoEvidencia === 3) ? 'EVIDENCIA_ATS_' + codigoConformidad + "_" + (constadorATS++) :
(item.tipoEvidencia === 4) ? 'FIRMA_' + codigoConformidad + "_" + (contadorFirma++) : 'DATO_EXTRA_' + codigoConformidad + "_" + (contadorExtras++)
};
});
const filtroEvidenciasProblemas = registroArchivos.filter((item) => item.tipoEvidencia === 1);
const filtroEvidenciasSoluciones = registroArchivos.filter((item) => item.tipoEvidencia === 2);
const filtroEvidenciasExtras = registroArchivos.filter((item) => item.tipoEvidencia === 3 || item.tipoEvidencia === 4);
const registroEvidencia = await Promise.all([
this.conformidadHelper.subidaEvidencia2(filtroEvidenciasProblemas),
this.conformidadHelper.subidaEvidencia2(filtroEvidenciasSoluciones),
this.conformidadHelper.subidaEvidencia2(filtroEvidenciasExtras)]);
if (registroEvidencia[0].status && registroEvidencia[1].status && registroEvidencia[2].status) { // REGISTRO DE EVIDENCIAS SUBIDAS AL DRIVE Y REGISTRADAS EN BASE
console.log("SE REGISTRO TODO CORRECTAMENTE");
Notiflix.Loading.remove(); Notiflix.Loading.remove();
Notiflix.Notify.success('REGISTRO COMPLETADO'); Notiflix.Notify.success('ÉXITO DE CONFORMIDAD ', {
position: 'center-center', // Notificación en el centro de la pantalla
timeout: 1000, // 1 segundo
width: '400px',
fontSize: '24px',
fontAwesomeIconSize: '34px',
});
// Espera 1 segundo y recarga la página
setTimeout(() => { setTimeout(() => {
window.location.reload(); window.location.reload();
}, 3000); }, 1000);
}else {
} else { this.mostrarAlertaError('FALLO DE REGISTRO','ERROR AL REGISTRAR ORDEN DE SALIDA');
this.mostrarAlerta('REGISTRO COMPLETADO , ERROR AL REGISTRAR LOS ARCHIVOS DE EVIDENCIAS');
} }
} else { } else {
this.mostrarAlerta('REGISTRO COMPLETADO , ERROR AL CREAR CARPETA DE EVIDENCIAS'); this.mostrarAlertaError('FALLO DE REGISTRO','ERROR AL REGISTRAR LOS REQUERIMIENTOS');
} }
}else { }else{
this.mostrarAlerta('ERROR AL REGISTRAR ORDEN DE SALIDA'); this.mostrarAlertaError('FALLO DE REGISTRO','ERROR AL REGISTRAR EL PERSONAL');
} }
} else { } else {
this.mostrarAlerta('ERROR AL REGISTRAR LOS REQUERIMIENTOS'); this.mostrarAlertaError('ERROR DE SUBIDA DE EVIDENCIA' , resultados.mensaje );
//Agregar el eliminar registro y eliminar Documento.
await this.conformidadHelper.eliminarDocumento({
opcion: 1,
codconformidad: codigoConformidad
});
} }
}else{ } else{
this.mostrarAlerta('ERROR AL REGISTRAR EL PERSONAL'); this.mostrarAlertaError('ERROR DE SUBIDA DE EVIDENCIA','ERROR AL CREAR CARPETA DE EVIDENCIAS');
} }
}else{ }else{
this.mostrarAlerta('ERROR AL REGISTRAR LA CONFORMIDAD'); this.mostrarAlertaError('FALLO DE REGISTRO','ERROR AL REGISTRAR LA CONFORMIDAD');
} }
} }
...@@ -1110,10 +1232,7 @@ export class ConformidadComponent implements AfterViewInit { ...@@ -1110,10 +1232,7 @@ export class ConformidadComponent implements AfterViewInit {
return (existeMaterial === 1 && dataSource.length > 0) || existeMaterial === 0; return (existeMaterial === 1 && dataSource.length > 0) || existeMaterial === 0;
} }
mostrarAlerta(mensaje: string): void { mostrarAlerta(mensaje: string): void {
Notiflix.Loading.remove(); Notiflix.Loading.remove();
this.barraAlerta.open(mensaje, '', { this.barraAlerta.open(mensaje, '', {
horizontalPosition: this.alertaPosicionHorizontal, horizontalPosition: this.alertaPosicionHorizontal,
...@@ -1121,7 +1240,15 @@ export class ConformidadComponent implements AfterViewInit { ...@@ -1121,7 +1240,15 @@ export class ConformidadComponent implements AfterViewInit {
duration: this.alertaDuracion * 1000, duration: this.alertaDuracion * 1000,
panelClass: ['custom-snackbar'], panelClass: ['custom-snackbar'],
}); });
}
mostrarAlertaError(titulo: string , mensaje: string): void {
Notiflix.Loading.remove();
Notiflix.Report.failure(
titulo,
mensaje,
"Cerrar"
);
} }
mostrarFirma(valor: any){ mostrarFirma(valor: any){
......
...@@ -53,8 +53,25 @@ export class ConformidadHelper { ...@@ -53,8 +53,25 @@ export class ConformidadHelper {
} }
} }
async subidaEvidencia( json : any ){
const respuesta = await this.ConformidadService.subidaEvidencia(json);
return respuesta
}
async subidaEvidencia2( json : any ){ async subidaEvidencia2( json : any ){
const respuesta = await this.ConformidadService.subidaEvidencia2(json); const respuesta = await this.ConformidadService.subidaEvidencia2(json);
//console.log(respuesta);
return respuesta
}
async subidaEvidencia3( json : any ){
const respuesta = await this.ConformidadService.subidaEvidencia3(json);
//console.log(respuesta);
return respuesta
}
async eliminarDocumento(json : any){
const respuesta = await this.ConformidadService.eliminarDocumento(json);
return respuesta return respuesta
} }
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
<mat-label>CANTIDAD : </mat-label> <mat-label>CANTIDAD : </mat-label>
<mat-form-field class="w-full"> <mat-form-field class="w-full">
<mat-label>Ingrese cantidad</mat-label> <mat-label>Ingrese cantidad</mat-label>
<input formControlName="cantidadArticulo" matInput soloNumeros="entero" maxlength="2" placeholder="Máx. 2 dígitos"> <input formControlName="cantidadArticulo" matInput soloNumeros="entero" maxlength="3" placeholder="Máx. 3 dígitos">
</mat-form-field> </mat-form-field>
</div> </div>
......
...@@ -118,7 +118,7 @@ export class modalFirmaComponent implements AfterViewInit { ...@@ -118,7 +118,7 @@ export class modalFirmaComponent implements AfterViewInit {
//this.dialogRef.close(sign); //this.dialogRef.close(sign);
console.log(blob); //console.log(blob);
} }
dataURLToBlob(dataURL: string): Blob { dataURLToBlob(dataURL: string): Blob {
...@@ -137,7 +137,7 @@ export class modalFirmaComponent implements AfterViewInit { ...@@ -137,7 +137,7 @@ export class modalFirmaComponent implements AfterViewInit {
drawComplete(event: TouchEvent) { drawComplete(event: TouchEvent) {
const sign = this.signaturePad.toDataURL(); const sign = this.signaturePad.toDataURL();
console.log(sign); //console.log(sign);
//this.signImage.emit(sign); //this.signImage.emit(sign);
} }
......
import {Injectable} from "@angular/core"; import {Injectable} from "@angular/core";
import axios from "axios"; import axios from "axios";
import {environment} from "../../../environment/env"; import {environment} from "../../../environment/env";
import {BehaviorSubject} from "rxjs";
import Notiflix from "notiflix";
@Injectable({ @Injectable({
providedIn: 'root' providedIn: 'root'
}) })
export class ConformidadService { 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; t_facturacion_electronica_link = environment.facturacion_electronica_link;
...@@ -17,6 +18,9 @@ export class ConformidadService { ...@@ -17,6 +18,9 @@ export class ConformidadService {
constructor() { constructor() {
} }
progresoSubida = new BehaviorSubject<number>(0);
progresoSubida$ = this.progresoSubida.asObservable();
async listadoGeneral(opcion: number) { async listadoGeneral(opcion: number) {
try { try {
const respuesta = await axios.post(this.t_asistencia_rest_link + '/api/v1/Conformidad/listadoGeneral', const respuesta = await axios.post(this.t_asistencia_rest_link + '/api/v1/Conformidad/listadoGeneral',
...@@ -124,7 +128,7 @@ export class ConformidadService { ...@@ -124,7 +128,7 @@ export class ConformidadService {
return respuesta; return respuesta;
} }
async subidaEvidencia2(json:any){ async subidaEvidencia(json:any){
const url = `${this.t_redireccionamiento}/google/drive`; const url = `${this.t_redireccionamiento}/google/drive`;
let respuesta: any; let respuesta: any;
...@@ -189,21 +193,186 @@ export class ConformidadService { ...@@ -189,21 +193,186 @@ export class ConformidadService {
} }
} }
return respuesta; return respuesta;
}
// REEMPLAZO DE SUBIDA DE ARCHIVOS
// FUNCION , RECONOCER QUE TODOS LOS ARCHIVOS SE SUBIERON
async subidaEvidencia2(json:any){
const url = `${this.t_redireccionamiento}/google/drive`;
const respuestas: any[] = [];
let archivosSubidos = 0;
const totalArchivos = json.length;
const promesas = json.map(async (datos: { nombreArchivo: string | Blob; archivo: string | Blob; idCarpeta: any; tipoEvidencia: number; codconformidad: any; }, index: any) => {
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", datos.idCarpeta || this.value_idDrive);
formData.append("correo", this.value_correoDrive);
try {
const controller = new AbortController();
const timeout = setTimeout(() => controller.abort(), 90000);
const response = await fetch(url, {
method: "POST",
body: formData,
signal: controller.signal,
});
clearTimeout(timeout);
if (!response.ok) {
console.error("Error en la respuesta del servidor:", response);
return { status: false, message: "Error al subir el archivo" };
} }
const responseBody = await response.json();
if (responseBody?.status) {
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 || "",
idCarpeta: datos.idCarpeta || "",
});
archivosSubidos++;
//this.progresoSubida.next(Math.round((archivosSubidos / totalArchivos) * 100));
const progreso = Math.round((archivosSubidos / totalArchivos) * 100);
this.progresoSubida.next(progreso);
// Actualizar Notiflix con el progreso
Notiflix.Loading.change(`Carga al ${progreso}%`);
return { status: true, message: "Archivo subido correctamente" };
} else {
return { status: false, message: "Error al registrar evidencia" };
}
} catch (error) {
console.error("Error al registrar el archivo:", error);
return { status: false, message: error };
}
});
return Promise.all(promesas);
}
async subidaEvidencia3(json: any[]) {
const url = `${this.t_redireccionamiento}/google/drive`;
const totalArchivos = json.length;
let archivosSubidos = 0;
const maxReintentos = 3; // Intentos máximos
const timeoutBase = 40000; // Timeout inicial de 30 segundos
// Mostrar la carga en Notiflix
Notiflix.Loading.standard("Preparando subida...");
const subirArchivo = async (datos: any, intentos: number = 1 , index : number): Promise<boolean> => {
let tiempoEspera = timeoutBase * intentos; // Aumentar timeout con cada intento
if (tiempoEspera > 120000) tiempoEspera = 120000; // Limitar timeout a 90 segundos
try {
const controller = new AbortController();
const timeout = setTimeout(() => controller.abort(), tiempoEspera);
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", datos.idCarpeta || this.value_idDrive);
formData.append("correo", this.value_correoDrive);
/*if(index === 2){ // PROVOCAR UN FALLO EN EL ARCHIVO 2
throw new Error("Error al registrar evidencia");
}*/
const response = await fetch(url, {
method: "POST",
body: formData,
signal: controller.signal,
});
clearTimeout(timeout);
if (!response.ok) {
throw new Error("Error HTTP: " + response.status);
}
const responseBody = await response.json();
if (responseBody?.status) {
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 || "",
idCarpeta: datos.idCarpeta || "",
});
archivosSubidos++;
const progreso = Math.round((archivosSubidos / totalArchivos) * 100);
Notiflix.Loading.change(`Subida al ${progreso}%`);
return true;
} else {
throw new Error("Error al registrar evidencia");
}
} catch (error) {
console.error(`Error en intento ${intentos} de subida:`, error);
if (intentos < maxReintentos) {
Notiflix.Loading.change(`Reintentando ${datos.nombreArchivo}... (Intento ${intentos + 1})`);
return await subirArchivo(datos, intentos + 1,index);
} else {
console.error(`Fallo definitivo en ${datos.nombreArchivo}`);
return false;
}
}
};
// Ejecutar la subida en paralelo
const resultados = await Promise.all(json.map((archivo,index) => subirArchivo(archivo,1,index)));
// Cerrar Notiflix Loading
Notiflix.Loading.change(`Subida de archivos Existosa`);
// Verificar si hubo fallos
const archivosFallidos = resultados.filter((resultado) => !resultado).length;
if (archivosFallidos > 0) {
const mensaje = `Fallaron ${archivosFallidos} archivos después de ${maxReintentos} intentos.`;
return {status : false , mensaje};
} else {
// ✅ Mostrar mensaje de éxito y reiniciar la página después de 1000ms
console.log("Subida Existosa");
return {status : true , mensaje : "Subida Existosa"};
}
}
async registroDocumento(json: any) { async registroDocumento(json: any) {
const parametros = { const parametros = {
accion : 1, accion: 1,
codconformidad: json.codconformidad || 0, codconformidad: json.codconformidad || 0,
tipoEvidencia: json.tipoEvidencia || 0, tipoEvidencia: json.tipoEvidencia || 0,
idDrive: json.idDrive || '', idDrive: json.idDrive || '',
enlaceDrive: json.enlaceDrive || '', enlaceDrive: json.enlaceDrive || '',
enlaceDescarga: json.enlaceDescarga || '', enlaceDescarga: json.enlaceDescarga || '',
nombreDocumento: json.nombreDocumento || '', nombreDocumento: json.nombreDocumento || '',
idCarpeta : json.idCarpeta || '' idCarpeta: json.idCarpeta || ''
}; };
try { try {
...@@ -215,6 +384,20 @@ export class ConformidadService { ...@@ -215,6 +384,20 @@ export class ConformidadService {
} }
} }
async eliminarDocumento(json : any){
const parametros = {
accion: 1,
codconformidad: json.codconformidad || 0,
};
try {
const respuesta = await axios.post(this.t_facturacion_electronica_link + '/api/v1/conformidad/eliminarConformidad', parametros);
return respuesta.data;
} catch (e) {
return e;
}
}
async gestionOrdenSalida(json : any){ async gestionOrdenSalida(json : any){
const parametros = { const parametros = {
......
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