Browse Source

subo insert de Fomulario academico

FREDY 3 months ago
parent
commit
d7b8ab15e3

+ 161 - 134
Back/backendP-Educativa/app/Http/Controllers/Api/RegistroAcademico.php

@@ -356,37 +356,52 @@ public function ActualizarRegistroAca(Request $request, $id){
 
 
 
-public function registroAdministrativo(Request $request){
+public function registroAdministrativo(Request $request) {
     $message = '';
     $status = 0;
+    $nombreArchivo = '';
 
     try {
-        // Validar el archivo si se envió
-        if ($request->hasFile('constanciaFiscal')) {
-            $request->validate([
-                'constanciaFiscal' => 'required|file|mimes:pdf|max:5120',
+        // 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);
+            }
 
-        // Procesar el archivo
-        $nombreArchivo = null;
-        if ($request->hasFile('constanciaFiscal')) {
-            $archivo = $request->file('constanciaFiscal');
-            $nombreArchivo = time() . '_' . $request->idAlumno . '_' . $archivo->getClientOriginalName();
+            $contenido = base64_decode($base64);
+
+            if ($contenido === false) {
+                throw new \Exception('No se pudo decodificar el archivo PDF');
+            }
 
-            // Crear directorio si no existe
             $rutaDestino = public_path('uploads/constancias_fiscales');
             if (!file_exists($rutaDestino)) {
-                mkdir($rutaDestino, 0755, true);
+                if (!mkdir($rutaDestino, 0755, true)) {
+                    throw new \Exception('No se pudo crear el directorio para guardar el archivo');
+                }
             }
 
-            // Mover el archivo
-            $archivo->move($rutaDestino, $nombreArchivo);
+            file_put_contents($rutaDestino . '/' . $nombreArchivo, $contenido);
+
+            // Verificar que el archivo se haya guardado
+            if (!file_exists($rutaDestino . '/' . $nombreArchivo)) {
+                throw new \Exception('El archivo no se guardó correctamente desde base64');
+            }
         }
 
-        $registroAdministrativo = DB::table('registroadministrativo')->insert([
-            'idEscuela' => 'COLEGIOABC',
+        // Preparar datos para la inserción
+        $registro = [
+            'idEscuela' => $request->idEscuela ?? 'COLEGIOABC',
             'idAlumno' => $request->idAlumno,
             'RegA_MesInscripcion' => $request->mesInscripcion ?? '',
             'RegA_GradoCursar' => $request->gradoCursar ?? '',
@@ -394,7 +409,7 @@ public function registroAdministrativo(Request $request){
             'RegA_BecaPorcentaje' => $request->becaPorcentaje ?? '',
             'RegA_PlanPagos' => $request->planPago ?? '',
             'RegA_RequiereFactura' => $request->factura ?? '',
-            'RegA_MetodoPago' => $request->metedoPago ?? '',
+            'RegA_MetodoPago' => $request->metodoPago ?? $request->metedoPago ?? '',
             'RegA_RfcFactura' => $request->RFCFactura ?? '',
             'RegA_NombreFactura' => $request->razonSocial ?? '',
             'RegA_DireccionFactura' => $request->domicilioFactura ?? 'NA',
@@ -405,166 +420,178 @@ public function registroAdministrativo(Request $request){
             'usuarioRegistro' => $request->usuarioRegistro,
             'created_at' => now(),
             'updated_at' => now(),
-        ]);
+        ];
+
+        // Insertar en la base de datos
+        $insertado = DB::table('registroadministrativo')->insert($registro);
+
+        if (!$insertado) {
+            throw new \Exception('No se pudo insertar el registro en la base de datos');
+        }
 
         $message = 'Registro exitoso';
         $status = 200;
 
     } catch (\Exception $e) {
-        // Si hay error y se subió un archivo, eliminarlo
-        if (isset($nombreArchivo) && $nombreArchivo) {
-            $rutaArchivo = public_path('uploads/constancias_fiscales/' . $nombreArchivo);
-            if (file_exists($rutaArchivo)) {
-                unlink($rutaArchivo);
-            }
+        // Eliminar el archivo si algo falló
+        if ($nombreArchivo && file_exists(public_path('uploads/constancias_fiscales/' . $nombreArchivo))) {
+            @unlink(public_path('uploads/constancias_fiscales/' . $nombreArchivo));
         }
 
-        $message = $e->getMessage();
+        $message = 'Error: ' . $e->getMessage();
         $status = 500;
     }
 
-    return response()->json(['mensaje' => $message], $status);
+    return response()->json([
+        'mensaje' => $message,
+        'archivo' => $nombreArchivo
+    ], $status);
 }
 
   public function editarRegistroAdmin(Request $request, $id)
-    {
-        $message = '';
-        $status = 0;
-
-        try {
-            $idAlumno = base64_decode($id);
+{
+    $message = '';
+    $status = 0;
 
+    try {
+        $idAlumno = base64_decode($id);
 
+        // Buscar el registro existente
+        $registroExistente = DB::table('registroadministrativo')
+            ->where('idEscuela', 'COLEGIOABC')
+            ->where('idAlumno', $idAlumno)
+            ->first();
 
-            // Buscar el registro existente
-            $registroExistente = DB::table('registroadministrativo')
-                ->where('idEscuela', 'COLEGIOABC')
-                ->where('idAlumno', $idAlumno)
-                ->first();
+        if (!$registroExistente) {
+            error_log('ERROR: Registro no encontrado para idAlumno: ' . $idAlumno);
+            return response()->json(['mensaje' => 'Registro no encontrado'], 404);
+        }
 
-            if (!$registroExistente) {
-                error_log('ERROR: Registro no encontrado para idAlumno: ' . $idAlumno);
-                return response()->json(['mensaje' => 'Registro no encontrado'], 404);
+        // Preparar datos para actualizar
+        $datosActualizar = [
+            'updated_at' => now(),
+        ];
+
+        // Mapeo de campos del frontend al backend
+        $camposMapeo = [
+            'mesInscripcion' => 'RegA_MesInscripcion',
+            'gradoCursar' => 'RegA_GradoCursar',
+            'becaCurso' => 'RegA_BecaCurso',
+            'becaPorcentaje' => 'RegA_BecaPorcentaje',
+            'planPago' => 'RegA_PlanPagos',
+            'factura' => 'RegA_RequiereFactura',
+            'metodoPago' => 'RegA_MetodoPago',
+            'RFCFactura' => 'RegA_RfcFactura',
+            'razonSocial' => 'RegA_NombreFactura',
+            'domicilioFactura' => 'RegA_DireccionFactura',
+            'correoFactura' => 'RegA_CorreoFactura',
+            'cuentaPago' => 'RegA_CuentaPago',
+            'usuarioRegistro' => 'usuarioRegistro',
+        ];
+
+        // Procesar cada campo
+        foreach ($camposMapeo as $campoRequest => $campoBD) {
+            if ($request->has($campoRequest)) {
+                $valor = $request->input($campoRequest);
+                if ($valor !== null && $valor !== '') {
+                    $datosActualizar[$campoBD] = $valor;
+                    error_log("Campo {$campoRequest} -> {$campoBD}: {$valor}");
+                }
             }
+        }
 
+        // 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);
 
-
-            if ($request->hasFile('constanciaFiscal')) {
-                $request->validate([
-                    'constanciaFiscal' => 'required|file|mimes:pdf|max:5120',
-                ]);
+            // Validar que sea un PDF
+            if (strtolower($extension) !== 'pdf') {
+                return response()->json(['mensaje' => 'El archivo debe ser PDF'], 400);
             }
 
-            $nombreArchivo = $registroExistente->RegA_ConstanciaFiscal;
+            // Generar nombre único para el archivo
+            $nombreArchivo = time() . '_' . $idAlumno . '_' . $nombreOriginal;
 
-            if ($request->hasFile('constanciaFiscal')) {
-                $archivo = $request->file('constanciaFiscal');
-                $nombreArchivo = time() . '_' . $idAlumno . '_' . $archivo->getClientOriginalName();
+            // Extraer el contenido Base64 (eliminar el prefijo data:application/pdf;base64,)
+            $base64Str = substr($base64, strpos($base64, ',') + 1);
+            $contenidoArchivo = base64_decode($base64Str);
 
-                $rutaDestino = public_path('uploads/constancias_fiscales');
-                if (!file_exists($rutaDestino)) {
-                    mkdir($rutaDestino, 0755, true);
-                }
-
-                // Eliminar archivo anterior
-                if ($registroExistente->RegA_ConstanciaFiscal) {
-                    $rutaArchivoAnterior = public_path('uploads/constancias_fiscales/' . $registroExistente->RegA_ConstanciaFiscal);
-                    if (file_exists($rutaArchivoAnterior)) {
-                        unlink($rutaArchivoAnterior);
-                    }
-                }
-
-                $archivo->move($rutaDestino, $nombreArchivo);
+            // Validar tamaño del archivo (5MB máximo)
+            if (strlen($contenidoArchivo) > (5 * 1024 * 1024)) {
+                return response()->json(['mensaje' => 'El archivo es demasiado grande (máximo 5MB)'], 400);
             }
 
-            // Preparar datos para actualizar
-            $datosActualizar = [
-                'updated_at' => now(),
-                'RegA_ConstanciaFiscal' => $nombreArchivo,
-            ];
-
-            // Mapeo de campos del frontend al backend
-            $camposMapeo = [
-                'mesInscripcion' => 'RegA_MesInscripcion',
-                'gradoCursar' => 'RegA_GradoCursar',
-                'becaCurso' => 'RegA_BecaCurso',
-                'becaPorcentaje' => 'RegA_BecaPorcentaje',
-                'planPago' => 'RegA_PlanPagos',
-                'factura' => 'RegA_RequiereFactura',
-                'metodoPago' => 'RegA_MetodoPago',
-                'RFCFactura' => 'RegA_RfcFactura',
-                'razonSocial' => 'RegA_NombreFactura',
-                'domicilioFactura' => 'RegA_DireccionFactura',
-                'correoFactura' => 'RegA_CorreoFactura',
-                'cuentaPago' => 'RegA_CuentaPago',
-                'usuarioRegistro' => 'usuarioRegistro',
-            ];
-
-            // Procesar cada campo
-            foreach ($camposMapeo as $campoRequest => $campoBD) {
-                if ($request->has($campoRequest)) {
-                    $valor = $request->input($campoRequest);
-                    if ($valor !== null && $valor !== '') {
-                        $datosActualizar[$campoBD] = $valor;
-                        error_log("Campo {$campoRequest} -> {$campoBD}: {$valor}");
-                    }
-                }
+            $rutaDestino = public_path('uploads/constancias_fiscales');
+            if (!file_exists($rutaDestino)) {
+                mkdir($rutaDestino, 0755, true);
             }
 
-            if ($request->has('idEscuela')) {
-                $datosActualizar['idEscuela'] = $request->input('idEscuela', 'COLEGIOABC');
+            // Eliminar archivo anterior si existe
+            if ($registroExistente->RegA_ConstanciaFiscal) {
+                $rutaArchivoAnterior = public_path('uploads/constancias_fiscales/' . $registroExistente->RegA_ConstanciaFiscal);
+                if (file_exists($rutaArchivoAnterior)) {
+                    unlink($rutaArchivoAnterior);
+                }
             }
 
-            if ($request->has('lastUpdate')) {
-                $datosActualizar['lastUpdate'] = $request->input('lastUpdate');
-            }
+            // Guardar el nuevo archivo
+            file_put_contents($rutaDestino . '/' . $nombreArchivo, $contenidoArchivo);
+            $datosActualizar['RegA_ConstanciaFiscal'] = $nombreArchivo;
+        }
 
-            error_log('Datos finales para actualizar: ' . json_encode($datosActualizar));
+        // Campos adicionales
+        if ($request->has('idEscuela')) {
+            $datosActualizar['idEscuela'] = $request->input('idEscuela', 'COLEGIOABC');
+        }
 
-            $actualizado = DB::table('registroadministrativo')
-                ->where('idEscuela', 'COLEGIOABC')
-                ->where('idAlumno', $idAlumno)
-                ->update($datosActualizar);
+        if ($request->has('lastUpdate')) {
+            $datosActualizar['lastUpdate'] = $request->input('lastUpdate');
+        }
 
-            error_log('Filas afectadas por la actualización: ' . $actualizado);
+        error_log('Datos finales para actualizar: ' . json_encode($datosActualizar));
 
-            if ($actualizado > 0) {
-                $message = 'Actualización exitosa';
-                $status = 200;
+        $actualizado = DB::table('registroadministrativo')
+            ->where('idEscuela', 'COLEGIOABC')
+            ->where('idAlumno', $idAlumno)
+            ->update($datosActualizar);
 
-                $registroActualizado = DB::table('registroadministrativo')
-                    ->where('idEscuela', 'COLEGIOABC')
-                    ->where('idAlumno', $idAlumno)
-                    ->first();
+        error_log('Filas afectadas por la actualización: ' . $actualizado);
 
-                error_log('Registro después de actualización: ' . json_encode($registroActualizado));
+        if ($actualizado > 0) {
+            $message = 'Actualización exitosa';
+            $status = 200;
 
-            } else {
-                $message = 'No se detectaron cambios en el registro';
-                $status = 200;
-                error_log('ADVERTENCIA: No se detectaron cambios');
-            }
+            $registroActualizado = DB::table('registroadministrativo')
+                ->where('idEscuela', 'COLEGIOABC')
+                ->where('idAlumno', $idAlumno)
+                ->first();
 
-            error_log('=== FIN DEBUG editarRegistroAdmin ===');
+            error_log('Registro después de actualización: ' . json_encode($registroActualizado));
+        } else {
+            $message = 'No se detectaron cambios en el registro';
+            $status = 200;
+            error_log('ADVERTENCIA: No se detectaron cambios');
+        }
 
-        } catch (\Exception $e) {
-            error_log('ERROR en editarRegistroAdmin: ' . $e->getMessage());
-            error_log('Stack trace: ' . $e->getTraceAsString());
+    } catch (\Exception $e) {
+        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);
-                }
+        if (isset($nombreArchivo) && $nombreArchivo && isset($registroExistente) && $nombreArchivo !== $registroExistente->RegA_ConstanciaFiscal) {
+            $rutaArchivo = public_path('uploads/constancias_fiscales/' . $nombreArchivo);
+            if (file_exists($rutaArchivo)) {
+                unlink($rutaArchivo);
             }
-
-            $message = 'Error interno del servidor: ' . $e->getMessage();
-            $status = 500;
         }
 
-        return response()->json(['mensaje' => $message], $status);
+        $message = 'Error interno del servidor: ' . $e->getMessage();
+        $status = 500;
     }
 
+    return response()->json(['mensaje' => $message], $status);
+}
     public function getOneRegistroAdmi($id){
         $id = base64_decode($id);
         $registro = DB::table('registroadministrativo')

+ 75 - 49
Front/src/app/modules/Padres/pages/Registro/registro.component.ts

@@ -1118,67 +1118,93 @@ formulario() {
         this.cargarFormulario();
     }
 
- guardarFormulario() {
+async guardarFormulario() {
     if (this.form2.invalid) {
         this.form2.markAllAsTouched();
         return;
     }
 
-    if (this.form.valid) {
-        Object.assign(this.formularioCompleto, this.form.getRawValue());
-    }
-    if (this.form2.valid) {
-        Object.assign(this.formularioCompleto, this.form2.getRawValue());
-    }
-
-    const formData = new FormData();
+    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;
+        }
 
-   Object.keys(this.formularioCompleto).forEach(key => {
-  const val = this.formularioCompleto[key];
-  if (val !== null && val !== undefined) {
-    formData.append(key, typeof val === 'object' ? JSON.stringify(val) : val);
-  }
-});
+        // 6. Ver datos en consola (DEBUG)
+        console.log('Datos a enviar:', datosEnvio);
 
+        // 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();
 
-    formData.append('idEscuela', 'COLEGIOABC');
-    formData.append('lastUpdate', new Date().toISOString());
+        // 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);
+                    }
+                );
+            }
+        });
 
-    if (this.selectedFile) {
-        formData.append('constanciaFiscal', this.selectedFile);
+    } catch (error) {
+        console.error('Error en guardarFormulario:', error);
+        Swal.fire('Error', 'Ocurrió un error al procesar el formulario', 'error');
     }
-
-
-    formData.forEach((val, key) => console.log(`${key}: ${val}`));
-
-    this._registroAdministrativo.getOneRegistroAdmin(this.id).subscribe((data: any) => {
-        const idAlumno = this.formularioCompleto['idAlumno'];
-
-        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');
-                }
-            );
-        } 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');
-                }
-            );
-        }
-    });
 }
 
-
     Asistente() {
         const asistente = this.dialog.open(Asistente, {
             data: this.form2.getRawValue().domicilioFactura

+ 1 - 3
Front/src/app/modules/Padres/pages/registroAlumno/registroAlumno.component.ts

@@ -152,8 +152,6 @@ descargarPDF(id: string) {
     doc.setFont("helvetica", "italic");
     doc.setFontSize(10);
     doc.text(`DATOS GENERALES: ALUMNO`, 10, 43);
-    doc.text(`DATOS GENERALES: PADRE DE FAMILIA O TUTOR`, 10, 135);
-    doc.text(`DATOS GENERALES: MADRE DE FAMILIA O TUTOR`, 10, 174);
 
     //LADO IZQUIERDO
     //IZQUIERDO NEGRITAS
@@ -217,7 +215,7 @@ descargarPDF(id: string) {
     // Ajustar posiciones de las siguientes secciones
     const sectionPadreY = nuevaPosicionBase;
     const sectionMadreY = sectionPadreY + 40;
-    const footerY = Math.max(220, sectionMadreY +20);
+    const footerY = Math.max(230, sectionMadreY +20);
 
     // Resto del contenido con posiciones ajustadas
     doc.text(`Autorizo al alumno(a) a retirarse solo(a):`, 135, 112);

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

@@ -53,18 +53,22 @@ crearRegistroAdministrativo(formData: FormData): Observable<any> {
 }
 
 
-actualizarRegistroAdministrativo(formData: FormData, idAlumno: string): Observable<any> {
-  const encodedId = btoa(idAlumno);
-
-  return this.http.put(`${this.URL}/editarRegistroAdmin/${encodedId}`, formData, {
-    headers: this.getHeaders(true)
-  }).pipe(
-    tap(() => this.dataUpdated.next())
-  );
+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(
+        tap(() => this.dataUpdated.next())
+    );
 }
 
 
-// ayudame a hacer el proceso de actualizacion correctamente
+
 
   getOneRegistroAdmin(id: string) {
     let qId = btoa(id);