Procházet zdrojové kódy

corrigo bugs, solo faltan cosas de diseño

FREDY před 3 měsíci
rodič
revize
b5f071babb

+ 58 - 103
Back/backendP-Educativa/app/Http/Controllers/Api/RegistroAcademico.php

@@ -357,9 +357,8 @@ public function ActualizarRegistroAca(Request $request, $id){
         ]);
     }
 
-
-
-public function registroAdministrativo(Request $request) {
+public function registroAdministrativo(Request $request)
+{
     $message = '';
     $status = 0;
     $rutaS3 = '';
@@ -371,22 +370,29 @@ public function registroAdministrativo(Request $request) {
             'usuarioRegistro' => 'required',
         ]);
 
-        // Si se subió el archivo como form-data
-        if ($request->hasFile('constanciaFiscal')) {
+        $requiereFactura = $request->factura ?? '';
+
+        // Validar si se cargó archivo y se seleccionó "Sí"
+        if ($requiereFactura === 'Sí' && $request->hasFile('constanciaFiscal')) {
             $archivo = $request->file('constanciaFiscal');
 
             if (!$archivo->isValid()) {
                 throw new \Exception('Archivo inválido');
             }
 
-            $nombreArchivo = time() . '_' . $request->idAlumno . '_' . preg_replace('/[^a-zA-Z0-9._-]/', '', $archivo->getClientOriginalName());
+            $nombreArchivo = time() . '-' . $request->idAlumno . '-' . preg_replace('/[^a-zA-Z0-9._-]/', '', $archivo->getClientOriginalName());
 
             // Subir a S3
             $rutaS3 = 'constancias_fiscales/' . $nombreArchivo;
             Storage::disk('s3')->put($rutaS3, file_get_contents($archivo), 'public');
         }
 
-        // Guardar en BD
+        // Si seleccionó "No" o no se cargó archivo válido, poner NA
+        if ($requiereFactura === 'No' || $rutaS3 === '') {
+            $rutaS3 = 'NA';
+        }
+
+        // Guardar en base de datos
         $registro = [
             'idEscuela' => $request->idEscuela ?? 'COLEGIOABC',
             'idAlumno' => $request->idAlumno,
@@ -395,15 +401,14 @@ public function registroAdministrativo(Request $request) {
             'RegA_BecaCurso' => $request->becaCurso ?? '',
             'RegA_BecaPorcentaje' => $request->becaPorcentaje ?? '',
             'RegA_PlanPagos' => $request->planPago ?? '',
-            'RegA_RequiereFactura' => $request->factura ?? '',
-            'RegA_MetodoPago' => $request->metodoPago ?? $request->metedoPago ?? '',
-            'RegA_RfcFactura' => $request->RFCFactura ?? '',
-            'RegA_NombreFactura' => $request->razonSocial ?? '',
-            'RegA_DireccionFactura' => $request->domicilioFactura ?? 'NA',
-            'RegA_CorreoFactura' => $request->correoFactura ?? 'NA',
-            'RegA_CuentaPago' => $request->cuentaPago ?? 'NA',
+            'RegA_RequiereFactura' => $requiereFactura,
+            'RegA_MetodoPago' => $requiereFactura === 'No' ? 'NA' : ($request->metodoPago ?? $request->metedoPago ?? ''),
+            'RegA_RfcFactura' => $requiereFactura === 'No' ? 'NA' : ($request->RFCFactura ?? ''),
+            'RegA_NombreFactura' => $requiereFactura === 'No' ? 'NA' : ($request->razonSocial ?? ''),
+            'RegA_DireccionFactura' => $requiereFactura === 'No' ? 'NA' : ($request->domicilioFactura ?? 'NA'),
+            'RegA_CorreoFactura' => $requiereFactura === 'No' ? 'NA' : ($request->correoFactura ?? 'NA'),
+            'RegA_CuentaPago' => $requiereFactura === 'No' ? 'NA' : ($request->cuentaPago ?? 'NA'),
             'RegA_ConstanciaFiscal' => $rutaS3,
-            'RegA_ArchivoUUID' => $rutaS3 ? $uuidArchivo : null, // UUID para referencia
             'RegA_Modalidad' => 'Presencial',
             'usuarioRegistro' => $request->usuarioRegistro,
             'created_at' => now(),
@@ -421,7 +426,7 @@ public function registroAdministrativo(Request $request) {
 
     } catch (\Exception $e) {
         // Borrar archivo si algo falla
-        if ($rutaS3 && Storage::disk('s3')->exists($rutaS3)) {
+        if ($rutaS3 && $rutaS3 !== 'NA' && Storage::disk('s3')->exists($rutaS3)) {
             Storage::disk('s3')->delete($rutaS3);
         }
 
@@ -432,12 +437,14 @@ public function registroAdministrativo(Request $request) {
     return response()->json([
         'mensaje' => $message,
         'archivo' => $rutaS3,
-        'uuid' => $rutaS3 ? $uuidArchivo : null,
+        'uuid' => $rutaS3 && $rutaS3 !== 'NA' ? $uuidArchivo : null,
     ], $status);
 }
 
 
 
+
+
 public function eliminarArchivo(Request $request)
 {
     try {
@@ -456,12 +463,10 @@ public function eliminarArchivo(Request $request)
             return response()->json(['mensaje' => 'Registro no encontrado con esa ruta'], 404);
         }
 
-        // Verificar si el archivo existe en el bucket
         if (Storage::disk('s3')->exists($ruta)) {
             Storage::disk('s3')->delete($ruta);
         }
 
-        // Limpiar campos en la BD
         DB::table('registroadministrativo')
             ->where('RegA_ConstanciaFiscal', $ruta)
             ->update([
@@ -478,11 +483,11 @@ public function eliminarArchivo(Request $request)
         ], 500);
     }
 }
-
-  public function editarRegistroAdmin(Request $request, $id)
+public function editarRegistroAdmin(Request $request, $id)
 {
     $message = '';
     $status = 0;
+    $rutaS3 = '';
 
     try {
         $idAlumno = base64_decode($id);
@@ -494,16 +499,30 @@ public function eliminarArchivo(Request $request)
             ->first();
 
         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(),
-        ];
+        $datosActualizar = ['updated_at' => now()];
+
+        // 🔄 Subir nuevo archivo si viene en el request
+        if ($request->hasFile('constanciaFiscal')) {
+            $archivo = $request->file('constanciaFiscal');
+
+            if (!$archivo->isValid()) {
+                throw new \Exception('Archivo inválido');
+            }
+
+            $nombreArchivo = time() . '-' . $idAlumno . '-' . preg_replace('/[^a-zA-Z0-9._-]/', '', $archivo->getClientOriginalName());
+            $rutaS3 = 'constancias_fiscales/' . $nombreArchivo;
+
+            // Subir a S3
+            Storage::disk('s3')->put($rutaS3, file_get_contents($archivo), 'public');
+
+            // Guardar nueva ruta
+            $datosActualizar['RegA_ConstanciaFiscal'] = $rutaS3;
+        }
 
-        // Mapeo de campos del frontend al backend
+        // Mapeo de campos
         $camposMapeo = [
             'mesInscripcion' => 'RegA_MesInscripcion',
             'gradoCursar' => 'RegA_GradoCursar',
@@ -520,104 +539,40 @@ public function eliminarArchivo(Request $request)
             '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);
-
-            // Validar que sea un PDF
-            if (strtolower($extension) !== 'pdf') {
-                return response()->json(['mensaje' => 'El archivo debe ser PDF'], 400);
-            }
-
-            // Generar nombre único para el archivo
-            $nombreArchivo = time() . '_' . $idAlumno . '_' . $nombreOriginal;
-
-            // Extraer el contenido Base64 (eliminar el prefijo data:application/pdf;base64,)
-            $base64Str = substr($base64, strpos($base64, ',') + 1);
-            $contenidoArchivo = base64_decode($base64Str);
-
-            // 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);
-            }
-
-            $rutaDestino = public_path('uploads/constancias_fiscales');
-            if (!file_exists($rutaDestino)) {
-                mkdir($rutaDestino, 0755, true);
-            }
-
-            // Eliminar archivo anterior si existe
-            if ($registroExistente->RegA_ConstanciaFiscal) {
-                $rutaArchivoAnterior = public_path('uploads/constancias_fiscales/' . $registroExistente->RegA_ConstanciaFiscal);
-                if (file_exists($rutaArchivoAnterior)) {
-                    unlink($rutaArchivoAnterior);
-                }
-            }
-
-            // Guardar el nuevo archivo
-            file_put_contents($rutaDestino . '/' . $nombreArchivo, $contenidoArchivo);
-            $datosActualizar['RegA_ConstanciaFiscal'] = $nombreArchivo;
-        }
-
-        // Campos adicionales
         if ($request->has('idEscuela')) {
-            $datosActualizar['idEscuela'] = $request->input('idEscuela', 'COLEGIOABC');
+            $datosActualizar['idEscuela'] = $request->input('idEscuela');
         }
 
-        if ($request->has('lastUpdate')) {
-            $datosActualizar['lastUpdate'] = $request->input('lastUpdate');
+        // Si no se subió archivo nuevo y no existe ruta previa, poner 'NA'
+        if (!isset($datosActualizar['RegA_ConstanciaFiscal']) && empty($registroExistente->RegA_ConstanciaFiscal)) {
+            $datosActualizar['RegA_ConstanciaFiscal'] = 'NA';
         }
 
-        error_log('Datos finales para actualizar: ' . json_encode($datosActualizar));
-
-        $actualizado = DB::table('registroadministrativo')
+        // 🔄 Actualizar base de datos
+        DB::table('registroadministrativo')
             ->where('idEscuela', 'COLEGIOABC')
             ->where('idAlumno', $idAlumno)
             ->update($datosActualizar);
 
-        error_log('Filas afectadas por la actualización: ' . $actualizado);
-
-        if ($actualizado > 0) {
-            $message = 'Actualización exitosa';
-            $status = 200;
-
-            $registroActualizado = DB::table('registroadministrativo')
-                ->where('idEscuela', 'COLEGIOABC')
-                ->where('idAlumno', $idAlumno)
-                ->first();
-
-            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');
-        }
+        $message = 'Actualización exitosa';
+        $status = 200;
 
     } 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);
-            }
+        // Si algo falla, borrar archivo subido para no dejar basura
+        if ($rutaS3 && Storage::disk('s3')->exists($rutaS3)) {
+            Storage::disk('s3')->delete($rutaS3);
         }
 
-        $message = 'Error interno del servidor: ' . $e->getMessage();
+        $message = 'Error interno: ' . $e->getMessage();
         $status = 500;
     }
 

+ 1 - 1
Back/backendP-Educativa/routes/api.php

@@ -223,7 +223,7 @@ Route::get('/alumnos/bitacora/{id}', [AlumnosBitacoraController::class, 'index']
     Route::get('getAllAd',[RegistroAcademico::class,'getAllAd']);
     Route::post('registroAdministrativo',[RegistroAcademico::class,'registroAdministrativo']);
     Route::get('getRegistroAdmin/{id}',[RegistroAcademico::class,'getOneRegistroAdmi']);
-    Route::put('editarRegistroAdmin/{id}',[RegistroAcademico::class,'editarRegistroAdmin']);
+    Route::post('editarRegistroAdmin/{id}',[RegistroAcademico::class,'editarRegistroAdmin']);
     Route::get('getAllPlanPago',[RegistroAcademico::class,'getAllPlanPago']);
     Route::get('getAllPorcentajeBeca',[RegistroAcademico::class,'getAllPorcentajeBeca']);
     Route::get('getAllMetodoPago',[RegistroAcademico::class,'getAllMetoPago']);

+ 164 - 96
Front/src/app/modules/Padres/pages/Registro/registro.component.ts

@@ -1,4 +1,4 @@
-import { Component, Inject, OnInit } from "@angular/core";
+import { Component, ElementRef, Inject, OnInit, ViewChild } from "@angular/core";
 import { EnviarInfoService } from "../../../Administrador/services/enviar-info.service";
 import { AbstractControl, FormBuilder, FormControl, FormGroup, ReactiveFormsModule, ValidationErrors, Validators,FormArray } from "@angular/forms";
 import { MAT_DATE_LOCALE, MatOption, provideNativeDateAdapter } from "@angular/material/core";
@@ -928,6 +928,12 @@ export class RegistroAdComponent implements OnInit {
     gradoCur: any;
     Padre = JSON.parse(localStorage.getItem('userData') || '');
   rutaArchivo=' ';
+  facturaDataOriginal: any = null;
+  nombreArchivoCargado: any;
+opcionFactura: string = 'No';
+isSaving: boolean = false;
+
+
 
     constructor(private _enviarInfo: EnviarInfoService, private fb: FormBuilder, public dialog: MatDialog, private _registroAdministrativo: RegistroAcademicoService,
         private _router: Router, private _gradosEducativos: GradosEducativosService, private route: ActivatedRoute, private _registro: RegistroAcademicoService
@@ -936,6 +942,8 @@ export class RegistroAdComponent implements OnInit {
     }
 rutaArchivoSubido: string = '';
 
+@ViewChild('fileInput') fileInput!: ElementRef<HTMLInputElement>;
+
 eliminarArchivo() {
   if (!this.rutaArchivo) {
     Swal.fire('Error', 'No hay archivo para eliminar', 'error');
@@ -944,7 +952,16 @@ eliminarArchivo() {
 
   this._registroAdministrativo.eliminarArchivo(this.rutaArchivo).subscribe((res) => {
     Swal.fire('Archivo eliminado', res.mensaje, 'success');
+
+    // Limpiar campos y variables
     this.rutaArchivo = '';
+    this.selectedFile = null;
+    this.form2.get('constanciaFiscal')?.setValue(null);
+
+    // Limpiar visualmente el input file
+    if (this.fileInput && this.fileInput.nativeElement) {
+      this.fileInput.nativeElement.value = '';
+    }
   });
 }
 
@@ -998,102 +1015,133 @@ formulario() {
     }
 
 cargarFormulario() {
-    this._registroAdministrativo.getOneRegistroAdmin(this.id).subscribe((data: any) => {
-        this.isLoading = false;
-        this.datos = data.registro[0];
-        if (this.datos != undefined) {
-            this.form.get('gradoCursar')?.setValue(this.datos.RegA_GradoCursar);
-            this.form.get('mesInscripcion')?.setValue(this.datos.RegA_MesInscripcion);
-            this.form.get('planPago')?.setValue(this.datos.RegA_PlanPagos);
-            this.form.get('becaCurso')?.setValue(this.datos.RegA_BecaCurso);
-            this.form.get('becaPorcentaje')?.setValue(this.datos.RegA_BecaPorcentaje);
-
-            this.form2.get('factura')?.setValue(this.datos.RegA_RequiereFactura);
-
-            // Actualiza controles según valor de factura
-            this.factura({ value: this.datos.RegA_RequiereFactura });
-
-            this.form2.get('metedoPago')?.setValue(this.datos.RegA_MetodoPago);
-            this.form2.get('RFCFactura')?.setValue(this.datos.RegA_RfcFactura);
-            this.form2.get('razonSocial')?.setValue(this.datos.RegA_NombreFactura);
-            this.form2.get('domicilioFactura')?.setValue(this.datos.RegA_DireccionFactura);
-            this.form2.get('correoFactura')?.setValue(this.datos.RegA_CorreoFactura);
-            this.form2.get('cuentaPago')?.setValue(this.datos.RegA_CuentaPago);
-
-            if (this.datos.RegA_RequiereFactura === 'No') {
-                // Borra archivo porque ya no requiere factura
-                this.selectedFile = null;
-                this.form2.get('constanciaFiscal')?.setValue(null);
-            } else {
-                // Mostrar archivo si existe
-                if (this.datos.RegA_ConstanciaFiscal) {
-                    this.form2.get('constanciaFiscal')?.setValue(this.datos.RegA_ConstanciaFiscal);
-                }
-            }
+  this.isLoading = true;
+
+  this._registroAdministrativo.getOneRegistroAdmin(this.id).subscribe({
+    next: (data: any) => {
+      this.isLoading = false;
+      this.datos = data.registro[0];
+
+      if (this.datos != undefined) {
+        // Datos normales
+        this.form.get('gradoCursar')?.setValue(this.datos.RegA_GradoCursar);
+        this.form.get('mesInscripcion')?.setValue(this.datos.RegA_MesInscripcion);
+        this.form.get('planPago')?.setValue(this.datos.RegA_PlanPagos);
+        this.form.get('becaCurso')?.setValue(this.datos.RegA_BecaCurso);
+        this.form.get('becaPorcentaje')?.setValue(this.datos.RegA_BecaPorcentaje);
+
+        // FACTURACIÓN
+        const requiereFactura = this.datos.RegA_RequiereFactura?.toLowerCase() || 'no';
+
+        this.form2.get('factura')?.setValue(requiereFactura);
+        this.factura({ value: requiereFactura }); // ← actualiza visibilidad
+
+        // Guardar datos originales por si el usuario cambia de idea
+        this.facturaDataOriginal = {
+          metodoPago: this.datos.RegA_MetodoPago,
+          RFC: this.datos.RegA_RfcFactura,
+          razonSocial: this.datos.RegA_NombreFactura,
+          domicilio: this.datos.RegA_DireccionFactura,
+          correo: this.datos.RegA_CorreoFactura,
+          cuenta: this.datos.RegA_CuentaPago,
+          archivo: this.datos.RegA_ConstanciaFiscal,
+        };
+
+        if (requiereFactura === 'sí') {
+          // Mostrar datos si hay
+          this.form2.get('metedoPago')?.setValue(this.datos.RegA_MetodoPago);
+          this.form2.get('RFCFactura')?.setValue(this.datos.RegA_RfcFactura);
+          this.form2.get('razonSocial')?.setValue(this.datos.RegA_NombreFactura);
+          this.form2.get('domicilioFactura')?.setValue(this.datos.RegA_DireccionFactura);
+          this.form2.get('correoFactura')?.setValue(this.datos.RegA_CorreoFactura);
+          this.form2.get('cuentaPago')?.setValue(this.datos.RegA_CuentaPago);
+          this.form2.get('constanciaFiscal')?.setValue(this.datos.RegA_ConstanciaFiscal);
+
+          this.rutaArchivo = this.datos.RegA_ConstanciaFiscal; // Mostrar archivo
+        } else {
+          // Limpiar si no requiere factura
+          this.form2.get('metedoPago')?.setValue('NA');
+          this.form2.get('RFCFactura')?.setValue('NA');
+          this.form2.get('razonSocial')?.setValue('NA');
+          this.form2.get('domicilioFactura')?.setValue('NA');
+          this.form2.get('correoFactura')?.setValue('NA');
+          this.form2.get('cuentaPago')?.setValue('NA');
+          this.form2.get('constanciaFiscal')?.setValue('NA');
+          this.selectedFile = null;
+          this.rutaArchivo = ''; // Ocultar archivo
         }
-    });
+      }
+    },
+    error: (err) => {
+      this.isLoading = false;
+      console.error('Error al cargar formulario:', err);
+      Swal.fire('Error', 'No se pudo cargar el formulario', 'error');
+    }
+  });
 }
 
-  factura(event: any) {
-    if (event.value === 'No') {
-        this.form2.get('metedoPago')?.setValue('EF');
-        this.form2.get('RFCFactura')?.setValue('XAXX010101000');
-        this.form2.get('razonSocial')?.setValue('PUBLICO EN GENERAL');
-        this.form2.get('correoFactura')?.setValue('NA');
-        this.form2.get('domicilioFactura')?.setValue('NA');
-        this.form2.get('cuentaPago')?.setValue('00');
-        this.form2.get('domicilioFactura')?.clearValidators();
-        this.form2.get('correoFactura')?.clearValidators();
-        this.form2.get('razonSocial')?.clearValidators();
-        this.form2.get('RFCFactura')?.clearValidators();
-        this.form2.get('metedoPago')?.clearValidators();
-
-        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();
-this.form2.get('constanciaFiscal')?.disable();
-this.selectedFile = null;
-this.form2.get('constanciaFiscal')?.setValue(null);
-
-
-
-    } else {
-        this.form2.get('metedoPago')?.setValue('');
-        this.form2.get('RFCFactura')?.setValue('');
-        this.form2.get('razonSocial')?.setValue('');
-        this.form2.get('domicilioFactura')?.setValue('');
-        this.form2.get('correoFactura')?.setValue('');
-        this.form2.get('cuentaPago')?.setValue('01');
-
-        this.form2.get('domicilioFactura')?.setValidators([Validators.required]);
-        this.form2.get('correoFactura')?.setValidators([Validators.required, Validators.pattern('^[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,4}$')]);
-        this.form2.get('razonSocial')?.setValidators([Validators.required]);
-        this.form2.get('RFCFactura')?.setValidators([Validators.required]);
-        this.form2.get('metedoPago')?.setValidators([Validators.required]);
-
-        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();
-this.form2.get('constanciaFiscal')?.enable();
-    }
 
-    this.form2.get('domicilioFactura')?.updateValueAndValidity();
-    this.form2.get('correoFactura')?.updateValueAndValidity();
-    this.form2.get('razonSocial')?.updateValueAndValidity();
-    this.form2.get('RFCFactura')?.updateValueAndValidity();
-    this.form2.get('metedoPago')?.updateValueAndValidity();
-    this.form2.get('constanciaFiscal')?.updateValueAndValidity();
 
+factura(event: any) {
+  if (event.value === 'no') {
+    this.form2.get('metedoPago')?.setValue('NA');
+    this.form2.get('RFCFactura')?.setValue('NA');
+    this.form2.get('razonSocial')?.setValue('NA');
+    this.form2.get('domicilioFactura')?.setValue('NA');
+    this.form2.get('correoFactura')?.setValue('NA');
+    this.form2.get('cuentaPago')?.setValue('NA');
+
+    this.form2.get('constanciaFiscal')?.setValue(this.facturaDataOriginal?.archivo || '');
+
+    // Deshabilitamos campos pero no borramos constanciaFiscal
+    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();
+    this.form2.get('constanciaFiscal')?.disable();
+
+  } else {
+    this.form2.get('metedoPago')?.setValue(this.facturaDataOriginal?.metodoPago || '');
+    this.form2.get('RFCFactura')?.setValue(this.facturaDataOriginal?.RFC || '');
+    this.form2.get('razonSocial')?.setValue(this.facturaDataOriginal?.razonSocial || '');
+    this.form2.get('domicilioFactura')?.setValue(this.facturaDataOriginal?.domicilio || '');
+    this.form2.get('correoFactura')?.setValue(this.facturaDataOriginal?.correo || '');
+    this.form2.get('cuentaPago')?.setValue(this.facturaDataOriginal?.cuenta || '');
+
+    this.form2.get('constanciaFiscal')?.setValue(this.facturaDataOriginal?.archivo || '');
+
+    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();
+    this.form2.get('constanciaFiscal')?.enable();
+
+    this.form2.get('domicilioFactura')?.setValidators([Validators.required]);
+    this.form2.get('correoFactura')?.setValidators([Validators.required, Validators.pattern('^[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,4}$')]);
+    this.form2.get('razonSocial')?.setValidators([Validators.required]);
+    this.form2.get('RFCFactura')?.setValidators([Validators.required]);
+    this.form2.get('metedoPago')?.setValidators([Validators.required]);
+  }
+
+  // Actualizamos las validaciones y el estado del formulario
+  this.form2.get('domicilioFactura')?.updateValueAndValidity();
+  this.form2.get('correoFactura')?.updateValueAndValidity();
+  this.form2.get('razonSocial')?.updateValueAndValidity();
+  this.form2.get('RFCFactura')?.updateValueAndValidity();
+  this.form2.get('metedoPago')?.updateValueAndValidity();
+  this.form2.get('constanciaFiscal')?.updateValueAndValidity();
 }
 
 
 
 
 
+
+
+
+
     siguienteTap(index: number) {
         if (this.form.invalid) {
             this.form.markAllAsTouched();
@@ -1191,22 +1239,33 @@ async guardarFormulario() {
     return;
   }
 
-   try {
-    // Habilita temporalmente los campos deshabilitados
+  try {
+    const requiereFactura = this.form2.get('requiereFactura')?.value;
+
+    // Activamos campos de factura para acceder a su valor
     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 = {
+    // Creamos un objeto combinado de form1 y form2
+    const formularioCompleto: any = {
       ...this.form.getRawValue(),
       ...this.form2.getRawValue(),
-      idEscuela: 'COLEGIOABC',
+      idEscuela: 'COLEGIOABC'
     };
 
-    // Construir FormData
+    // Si el usuario seleccionó "No", seteamos manualmente los campos de factura como 'NA'
+    if (requiereFactura === 'No') {
+      formularioCompleto.domicilioFactura = 'NA';
+      formularioCompleto.correoFactura = 'NA';
+      formularioCompleto.razonSocial = 'NA';
+      formularioCompleto.RFCFactura = 'NA';
+      formularioCompleto.metedoPago = 'NA';
+    }
+
+    // Creamos FormData para envío (incluye datos y archivo)
     const formData = new FormData();
     for (const key in formularioCompleto) {
       if (formularioCompleto[key] !== null && formularioCompleto[key] !== undefined) {
@@ -1214,23 +1273,24 @@ async guardarFormulario() {
       }
     }
 
-    // Si hay archivo seleccionado, lo agregamos al FormData
+    // Adjuntar archivo solo si seleccionaron uno nuevo
     if (this.selectedFile) {
       formData.append('constanciaFiscal', this.selectedFile, this.selectedFile.name);
     }
 
-    // Vuelve a deshabilitar los campos
+    // Desactivamos los campos de factura de nuevo
     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();
 
-    // Decide si crear o actualizar
+    // Obtenemos si ya existe registro
     this._registroAdministrativo.getOneRegistroAdmin(this.id).subscribe((data: any) => {
       const idAlumno = this.form.get('idAlumno')?.value;
 
       if (data.registro && data.registro.length > 0) {
+        // Ya existe => actualizar
         this._registroAdministrativo.actualizarRegistroAdministrativo(formData, idAlumno).subscribe(
           (res: any) => {
             Swal.fire('Actualización exitosa', res.mensaje, 'success');
@@ -1242,6 +1302,7 @@ async guardarFormulario() {
           }
         );
       } else {
+        // No existe => crear
         this._registroAdministrativo.crearRegistroAdministrativo(formData).subscribe(
           (res: any) => {
             Swal.fire('Registro exitoso', res.mensaje, 'success');
@@ -1262,6 +1323,8 @@ async guardarFormulario() {
 }
 
 
+
+
     Asistente() {
         const asistente = this.dialog.open(Asistente, {
             data: this.form2.getRawValue().domicilioFactura
@@ -1275,7 +1338,6 @@ async guardarFormulario() {
     }
 }
 
-
 @Component({
     selector: 'App-Asistente',
     templateUrl: './Asistente.html',
@@ -1378,3 +1440,9 @@ export class Asistente {
         this.maxCaracteres = this.form.get('referencia')?.value.length
     }
 }
+
+
+
+// los primeros bugs que tengo son cuando edito el apratodao de facturazon tiene un radio btn con opciones si y no.
+//supongamos que el registro que NO tengo problema con eso se completo exitosamente y la opcion fue "si" entonces:
+//a la hora de editar y cargar las respuestas con carga formulario la opcion del radio viene como "no" y con ello vienen en los campos llenos, enotnces al campiar la opcion a "si" se borran los datos de las respuestas

+ 20 - 15
Front/src/app/modules/Padres/pages/Registro/registroAd.component.html

@@ -7,7 +7,12 @@
             <p class="content" [style.color]="textColor">Registro Administrativo - {{nombreAlumno}}</p>
         </div>
     </div>
+
+
     <div style="background-color: white;" class="divRes">
+        <div *ngIf="isLoading" style="display: flex; justify-content: center; margin: 20px;">
+  <mat-spinner diameter="40"></mat-spinner>
+</div>
         <mat-tab-group mat-stretch-tabs="false" *ngIf="!isLoading" class="mat-elevation-z4" animationDuration="0ms"
             (selectedIndexChange)="selected.setValue($event)" [selectedIndex]="selected.value">
             <mat-tab label="Generales">
@@ -88,11 +93,11 @@
                             <div class="input-label">
                                 <section class="radio-Button" style="width: 24%;">
                                     <label class="label-check">¿Requiere Factura Electrónica?</label>
-                                    <mat-radio-group [(ngModel)]="radioButton" formControlName="factura" color="primary"
-                                        (change)="factura($event)">
-                                        <mat-radio-button value="Si">Si</mat-radio-button>
-                                        <mat-radio-button value="No">No</mat-radio-button>
-                                    </mat-radio-group>
+                                   <mat-radio-group formControlName="factura" (change)="factura($event)">
+  <mat-radio-button value="si">Sí</mat-radio-button>
+  <mat-radio-button value="no">No</mat-radio-button>
+</mat-radio-group>
+
                                     <div class="mensajeError">
                                         <mat-hint *ngIf="isValidField1('factura','required')" class="error">El campo es
                                             obligatorio</mat-hint>
@@ -173,12 +178,14 @@
 
 
     <div style="display: flex; gap: 10px; margin-top: 10px; align-items: center;">
-        <input
-            type="file"
-            #fileInput
-            accept=".pdf"
-            (change)="onFileSelected($event)"
-            style="display: none;">
+     <input
+  #fileInput
+  id="fileInput"
+  type="file"
+  accept=".pdf"
+  (change)="onFileSelected($event)"
+  style="display: none;">
+
 <button
   *ngIf="form2.get('constanciaFiscal')?.enabled"
   type="button"
@@ -192,12 +199,10 @@
  <button
   type="button"
   class="btn1 borderNone"
-  style="background-color: #e53935; color: white; margin-top: 10px;"
+  style="background-color: #e53935; color: white; padding: 8px 16px;"
   (click)="eliminarArchivo()"
   *ngIf="rutaArchivo"
->
-  <mat-icon>delete</mat-icon>
-  Eliminar archivo
+>  Eliminar archivo
 </button>
 
 

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

@@ -52,18 +52,13 @@ crearRegistroAdministrativo(formData: FormData): Observable<any> {
   }).pipe(tap(() => this.dataUpdated.next()));
 }
 
-actualizarRegistroAdministrativo(datos: any, idAlumno: string): Observable<any> {
-    const encodedId = btoa(idAlumno);
-
-    // 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())
-      );
+actualizarRegistroAdministrativo(formData: FormData, idAlumno: string): Observable<any> {
+  const encodedId = btoa(idAlumno);
+  return this.http.post(`${this.URL}/editarRegistroAdmin/${encodedId}`, formData, {
+    headers: new HttpHeaders({
+      'Authorization': `Bearer ${localStorage.getItem('token')}`
+    })
+  });
 }