ソースを参照

ya sube constancia fiscal al s3

FREDY 3 ヶ月 前
コミット
8c8b2d683b

+ 40 - 59
Back/backendP-Educativa/app/Http/Controllers/Api/RegistroAcademico.php

@@ -5,6 +5,8 @@ use Illuminate\Support\Facades\DB;
 use Illuminate\Http\Request;
 use App\Http\Controllers\Controller;
 use  App\Models\PersonaAutorizada;
+use Illuminate\Support\Facades\Storage;
+
 
 class RegistroAcademico extends Controller
 {
@@ -356,50 +358,34 @@ public function ActualizarRegistroAca(Request $request, $id){
 
 
 
+
 public function registroAdministrativo(Request $request) {
     $message = '';
     $status = 0;
-    $nombreArchivo = '';
+    $rutaS3 = '';
 
     try {
-        // Validar campos requeridos mínimos
         $request->validate([
             'idAlumno' => 'required',
             'usuarioRegistro' => 'required',
         ]);
 
-        // Procesar archivo si se recibió como base64
-        if ($request->has('constanciaFiscalBase64') && $request->has('nombreArchivo')) {
-            $base64 = $request->constanciaFiscalBase64;
-            $nombreArchivo = time() . '_' . $request->idAlumno . '_' . preg_replace('/[^a-zA-Z0-9._-]/', '', $request->nombreArchivo);
-
-            // Limpiar encabezado si viene con "data:..."
-            if (preg_match('/^data:application\/pdf;base64,/', $base64)) {
-                $base64 = substr($base64, strpos($base64, ',') + 1);
-            }
-
-            $contenido = base64_decode($base64);
-
-            if ($contenido === false) {
-                throw new \Exception('No se pudo decodificar el archivo PDF');
-            }
+        // Si se subió el archivo como form-data
+        if ($request->hasFile('constanciaFiscal')) {
+            $archivo = $request->file('constanciaFiscal');
 
-            $rutaDestino = public_path('uploads/constancias_fiscales');
-            if (!file_exists($rutaDestino)) {
-                if (!mkdir($rutaDestino, 0755, true)) {
-                    throw new \Exception('No se pudo crear el directorio para guardar el archivo');
-                }
+            if (!$archivo->isValid()) {
+                throw new \Exception('Archivo inválido');
             }
 
-            file_put_contents($rutaDestino . '/' . $nombreArchivo, $contenido);
+            $nombreArchivo = time() . '_' . $request->idAlumno . '_' . preg_replace('/[^a-zA-Z0-9._-]/', '', $archivo->getClientOriginalName());
 
-            // Verificar que el archivo se haya guardado
-            if (!file_exists($rutaDestino . '/' . $nombreArchivo)) {
-                throw new \Exception('El archivo no se guardó correctamente desde base64');
-            }
+            // Subir directamente a S3
+            $rutaS3 = 'constancias_fiscales/' . $nombreArchivo;
+            Storage::disk('s3')->put($rutaS3, file_get_contents($archivo), 'public');
         }
 
-        // Preparar datos para la inserción
+        // Guardar datos en BD
         $registro = [
             'idEscuela' => $request->idEscuela ?? 'COLEGIOABC',
             'idAlumno' => $request->idAlumno,
@@ -415,14 +401,13 @@ public function registroAdministrativo(Request $request) {
             'RegA_DireccionFactura' => $request->domicilioFactura ?? 'NA',
             'RegA_CorreoFactura' => $request->correoFactura ?? 'NA',
             'RegA_CuentaPago' => $request->cuentaPago ?? 'NA',
-            'RegA_ConstanciaFiscal' => $nombreArchivo,
+            'RegA_ConstanciaFiscal' => $rutaS3, // Ruta en S3
             'RegA_Modalidad' => 'Presencial',
             'usuarioRegistro' => $request->usuarioRegistro,
             'created_at' => now(),
             'updated_at' => now(),
         ];
 
-        // Insertar en la base de datos
         $insertado = DB::table('registroadministrativo')->insert($registro);
 
         if (!$insertado) {
@@ -433,9 +418,9 @@ public function registroAdministrativo(Request $request) {
         $status = 200;
 
     } catch (\Exception $e) {
-        // Eliminar el archivo si algo falló
-        if ($nombreArchivo && file_exists(public_path('uploads/constancias_fiscales/' . $nombreArchivo))) {
-            @unlink(public_path('uploads/constancias_fiscales/' . $nombreArchivo));
+        // Eliminar archivo si hubo error
+        if ($rutaS3 && Storage::disk('s3')->exists($rutaS3)) {
+            Storage::disk('s3')->delete($rutaS3);
         }
 
         $message = 'Error: ' . $e->getMessage();
@@ -444,11 +429,11 @@ public function registroAdministrativo(Request $request) {
 
     return response()->json([
         'mensaje' => $message,
-        'archivo' => $nombreArchivo
+        'archivo' => $rutaS3
     ], $status);
 }
 
-  public function editarRegistroAdmin(Request $request, $id)
+ public function editarRegistroAdmin(Request $request, $id)
 {
     $message = '';
     $status = 0;
@@ -489,7 +474,6 @@ public function registroAdministrativo(Request $request) {
             'usuarioRegistro' => 'usuarioRegistro',
         ];
 
-        // Procesar cada campo
         foreach ($camposMapeo as $campoRequest => $campoBD) {
             if ($request->has($campoRequest)) {
                 $valor = $request->input($campoRequest);
@@ -500,45 +484,42 @@ public function registroAdministrativo(Request $request) {
             }
         }
 
-        // Procesar archivo en Base64 si existe
+        // Procesar archivo en base64 si existe
         if ($request->has('constanciaFiscalBase64') && $request->has('nombreArchivo')) {
             $base64 = $request->input('constanciaFiscalBase64');
             $nombreOriginal = $request->input('nombreArchivo');
             $extension = pathinfo($nombreOriginal, PATHINFO_EXTENSION);
 
-            // Validar que sea un PDF
+            // Validar extensión PDF
             if (strtolower($extension) !== 'pdf') {
                 return response()->json(['mensaje' => 'El archivo debe ser PDF'], 400);
             }
 
-            // Generar nombre único para el archivo
+            // Generar nombre único
             $nombreArchivo = time() . '_' . $idAlumno . '_' . $nombreOriginal;
 
-            // Extraer el contenido Base64 (eliminar el prefijo data:application/pdf;base64,)
+            // Limpiar y decodificar el contenido base64
             $base64Str = substr($base64, strpos($base64, ',') + 1);
             $contenidoArchivo = base64_decode($base64Str);
 
-            // Validar tamaño del archivo (5MB máximo)
+            // Validar tamaño (máximo 5 MB)
             if (strlen($contenidoArchivo) > (5 * 1024 * 1024)) {
                 return response()->json(['mensaje' => 'El archivo es demasiado grande (máximo 5MB)'], 400);
             }
 
-            $rutaDestino = public_path('uploads/constancias_fiscales');
-            if (!file_exists($rutaDestino)) {
-                mkdir($rutaDestino, 0755, true);
-            }
+            // Ruta nueva en S3
+            $rutaS3 = 'constancias_fiscales/' . $nombreArchivo;
 
-            // Eliminar archivo anterior si existe
-            if ($registroExistente->RegA_ConstanciaFiscal) {
-                $rutaArchivoAnterior = public_path('uploads/constancias_fiscales/' . $registroExistente->RegA_ConstanciaFiscal);
-                if (file_exists($rutaArchivoAnterior)) {
-                    unlink($rutaArchivoAnterior);
-                }
+            // Eliminar archivo anterior en S3 si existe
+            if ($registroExistente->RegA_ConstanciaFiscal && Storage::disk('s3')->exists($registroExistente->RegA_ConstanciaFiscal)) {
+                Storage::disk('s3')->delete($registroExistente->RegA_ConstanciaFiscal);
             }
 
-            // Guardar el nuevo archivo
-            file_put_contents($rutaDestino . '/' . $nombreArchivo, $contenidoArchivo);
-            $datosActualizar['RegA_ConstanciaFiscal'] = $nombreArchivo;
+            // Subir a S3
+            Storage::disk('s3')->put($rutaS3, $contenidoArchivo, 'public');
+
+            // Guardar nueva ruta
+            $datosActualizar['RegA_ConstanciaFiscal'] = $rutaS3;
         }
 
         // Campos adicionales
@@ -579,11 +560,9 @@ public function registroAdministrativo(Request $request) {
         error_log('ERROR en editarRegistroAdmin: ' . $e->getMessage());
         error_log('Stack trace: ' . $e->getTraceAsString());
 
-        if (isset($nombreArchivo) && $nombreArchivo && isset($registroExistente) && $nombreArchivo !== $registroExistente->RegA_ConstanciaFiscal) {
-            $rutaArchivo = public_path('uploads/constancias_fiscales/' . $nombreArchivo);
-            if (file_exists($rutaArchivo)) {
-                unlink($rutaArchivo);
-            }
+        // Eliminar archivo nuevo si ocurrió error
+        if (isset($rutaS3) && Storage::disk('s3')->exists($rutaS3)) {
+            Storage::disk('s3')->delete($rutaS3);
         }
 
         $message = 'Error interno del servidor: ' . $e->getMessage();
@@ -592,6 +571,8 @@ public function registroAdministrativo(Request $request) {
 
     return response()->json(['mensaje' => $message], $status);
 }
+
+
     public function getOneRegistroAdmi($id){
         $id = base64_decode($id);
         $registro = DB::table('registroadministrativo')

+ 1 - 1
Back/backendP-Educativa/config/filesystems.php

@@ -52,7 +52,7 @@ return [
             'bucket' => env('AWS_BUCKET'),
             'url' => env('AWS_URL'),
             'endpoint' => env('AWS_ENDPOINT'),
-            'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false),
+'use_path_style_endpoint' => env('AWS_USE_PATH_STYLE_ENDPOINT', false),
             'throw' => false,
         ],
 

+ 69 - 79
Front/src/app/modules/Padres/pages/Registro/registro.component.ts

@@ -1163,92 +1163,82 @@ this.form2.get('constanciaFiscal')?.enable();
     }
 
 async guardarFormulario() {
-    if (this.form2.invalid) {
-        this.form2.markAllAsTouched();
-        return;
+  if (this.form2.invalid) {
+    this.form2.markAllAsTouched();
+    return;
+  }
+
+  try {
+    // Habilita temporalmente los campos deshabilitados
+    this.form2.get('domicilioFactura')?.enable();
+    this.form2.get('correoFactura')?.enable();
+    this.form2.get('razonSocial')?.enable();
+    this.form2.get('RFCFactura')?.enable();
+    this.form2.get('metedoPago')?.enable();
+
+    // Combina los valores de ambos formularios
+    const formularioCompleto = {
+      ...this.form.getRawValue(),
+      ...this.form2.getRawValue(),
+      idEscuela: 'COLEGIOABC',
+    };
+
+    // Construir FormData
+    const formData = new FormData();
+    for (const key in formularioCompleto) {
+      if (formularioCompleto[key] !== null && formularioCompleto[key] !== undefined) {
+        formData.append(key, formularioCompleto[key]);
+      }
     }
 
-    try {
-        // 1. Habilita temporalmente campos deshabilitados para incluirlos
-        this.form2.get('domicilioFactura')?.enable();
-        this.form2.get('correoFactura')?.enable();
-        this.form2.get('razonSocial')?.enable();
-        this.form2.get('RFCFactura')?.enable();
-        this.form2.get('metodoPago')?.enable();
-
-        // 2. Fusiona ambos formularios
-        const formularioCompleto = {
-            ...this.form.getRawValue(),
-            ...this.form2.getRawValue(),
-        };
-
-        // 3. Función para convertir archivo a Base64
-        const fileToBase64 = (file: File): Promise<string> => {
-            return new Promise((resolve, reject) => {
-                const reader = new FileReader();
-                reader.readAsDataURL(file);
-                reader.onload = () => resolve(reader.result as string);
-                reader.onerror = error => reject(error);
-            });
-        };
-
-        // 4. Preparar datos para enviar
-        const datosEnvio: any = {
-            ...formularioCompleto,
-            idEscuela: 'COLEGIOABC',
-        };
-
-        // 5. Convertir archivo a Base64 si existe
-        if (this.selectedFile) {
-            datosEnvio.constanciaFiscalBase64 = await fileToBase64(this.selectedFile);
-            datosEnvio.nombreArchivo = this.selectedFile.name;
-        }
+    // Si hay archivo seleccionado, lo agregamos al FormData
+    if (this.selectedFile) {
+      formData.append('constanciaFiscal', this.selectedFile, this.selectedFile.name);
+    }
 
-        // 6. Ver datos en consola (DEBUG)
-        console.log('Datos a enviar:', datosEnvio);
+    // Vuelve a deshabilitar los campos
+    this.form2.get('domicilioFactura')?.disable();
+    this.form2.get('correoFactura')?.disable();
+    this.form2.get('razonSocial')?.disable();
+    this.form2.get('RFCFactura')?.disable();
+    this.form2.get('metedoPago')?.disable();
 
-        // 7. Vuelve a deshabilitar los campos
-        this.form2.get('domicilioFactura')?.disable();
-        this.form2.get('correoFactura')?.disable();
-        this.form2.get('razonSocial')?.disable();
-        this.form2.get('RFCFactura')?.disable();
-        this.form2.get('metodoPago')?.disable();
-
-        // 8. Verificar si existe registro y enviar datos
-        this._registroAdministrativo.getOneRegistroAdmin(this.id).subscribe((data: any) => {
-            const idAlumno = formularioCompleto['idAlumno'];
-
-            if (data.registro && data.registro.length > 0) {
-                this._registroAdministrativo.actualizarRegistroAdministrativo(datosEnvio, idAlumno).subscribe(
-                    (res: any) => {
-                        Swal.fire('Actualización exitosa', res.mensaje, 'success');
-                        this._router.navigate(['/homePadres/registroAlumno']);
-                    },
-                    (error) => {
-                        Swal.fire('Error', 'No se pudo actualizar el registro', 'error');
-                        console.error('Error al actualizar:', error);
-                    }
-                );
-            } else {
-                this._registroAdministrativo.crearRegistroAdministrativo(datosEnvio).subscribe(
-                    (res: any) => {
-                        Swal.fire('Registro exitoso', res.mensaje, 'success');
-                        this._router.navigate(['/homePadres/registroAlumno']);
-                    },
-                    (error) => {
-                        Swal.fire('Error', 'No se pudo crear el registro', 'error');
-                        console.error('Error al crear:', error);
-                    }
-                );
-            }
-        });
+    // Decide si crear o actualizar
+    this._registroAdministrativo.getOneRegistroAdmin(this.id).subscribe((data: any) => {
+      const idAlumno = this.form.get('idAlumno')?.value;
+
+      if (data.registro && data.registro.length > 0) {
+        this._registroAdministrativo.actualizarRegistroAdministrativo(formData, idAlumno).subscribe(
+          (res: any) => {
+            Swal.fire('Actualización exitosa', res.mensaje, 'success');
+            this._router.navigate(['/homePadres/registroAlumno']);
+          },
+          (error) => {
+            Swal.fire('Error', 'No se pudo actualizar el registro', 'error');
+            console.error('Error al actualizar:', error);
+          }
+        );
+      } else {
+        this._registroAdministrativo.crearRegistroAdministrativo(formData).subscribe(
+          (res: any) => {
+            Swal.fire('Registro exitoso', res.mensaje, 'success');
+            this._router.navigate(['/homePadres/registroAlumno']);
+          },
+          (error) => {
+            Swal.fire('Error', 'No se pudo crear el registro', 'error');
+            console.error('Error al crear:', error);
+          }
+        );
+      }
+    });
 
-    } catch (error) {
-        console.error('Error en guardarFormulario:', error);
-        Swal.fire('Error', 'Ocurrió un error al procesar el formulario', 'error');
-    }
+  } catch (error) {
+    console.error('Error en guardarFormulario:', error);
+    Swal.fire('Error', 'Ocurrió un error al procesar el formulario', 'error');
+  }
 }
 
+
     Asistente() {
         const asistente = this.dialog.open(Asistente, {
             data: this.form2.getRawValue().domicilioFactura

+ 9 - 9
Front/src/app/modules/Padres/services/registroAcademico.service.ts

@@ -55,16 +55,16 @@ crearRegistroAdministrativo(formData: FormData): Observable<any> {
 
 actualizarRegistroAdministrativo(datos: any, idAlumno: string): Observable<any> {
     const encodedId = btoa(idAlumno);
-    console.log(datos);
-
-    return this.http.put(`${this.URL}/editarRegistroAdmin/${encodedId}`, datos, {
-        headers: new HttpHeaders({
-            'Content-Type': 'application/json',
-            'Authorization': `Bearer ${localStorage.getItem('token')}`
-        })
-    }).pipe(
+
+    // NOTA: No agregues 'Content-Type' aquí
+    const headers = new HttpHeaders({
+        'Authorization': `Bearer ${localStorage.getItem('token')}`
+    });
+
+    return this.http.put(`${this.URL}/editarRegistroAdmin/${encodedId}`, datos, { headers })
+      .pipe(
         tap(() => this.dataUpdated.next())
-    );
+      );
 }