Ver código fonte

Merge branch 'devFredy' of http://209.50.56.224/git/ITTEC/PlataformaEducativaWeb2 into unionCambios

AldrickChavarria 3 meses atrás
pai
commit
8d8f802045

+ 78 - 25
Back/backendP-Educativa/app/Http/Controllers/Api/RegistroAcademico.php

@@ -6,6 +6,7 @@ use Illuminate\Http\Request;
 use App\Http\Controllers\Controller;
 use  App\Models\PersonaAutorizada;
 use Illuminate\Support\Facades\Storage;
+use Illuminate\Support\Str;
 
 
 class RegistroAcademico extends Controller
@@ -358,11 +359,11 @@ public function ActualizarRegistroAca(Request $request, $id){
 
 
 
-
 public function registroAdministrativo(Request $request) {
     $message = '';
     $status = 0;
     $rutaS3 = '';
+    $uuidArchivo = Str::uuid()->toString(); // Identificador único
 
     try {
         $request->validate([
@@ -380,12 +381,12 @@ public function registroAdministrativo(Request $request) {
 
             $nombreArchivo = time() . '_' . $request->idAlumno . '_' . preg_replace('/[^a-zA-Z0-9._-]/', '', $archivo->getClientOriginalName());
 
-            // Subir directamente a S3
+            // Subir a S3
             $rutaS3 = 'constancias_fiscales/' . $nombreArchivo;
             Storage::disk('s3')->put($rutaS3, file_get_contents($archivo), 'public');
         }
 
-        // Guardar datos en BD
+        // Guardar en BD
         $registro = [
             'idEscuela' => $request->idEscuela ?? 'COLEGIOABC',
             'idAlumno' => $request->idAlumno,
@@ -401,7 +402,8 @@ public function registroAdministrativo(Request $request) {
             'RegA_DireccionFactura' => $request->domicilioFactura ?? 'NA',
             'RegA_CorreoFactura' => $request->correoFactura ?? 'NA',
             'RegA_CuentaPago' => $request->cuentaPago ?? 'NA',
-            'RegA_ConstanciaFiscal' => $rutaS3, // Ruta en S3
+            'RegA_ConstanciaFiscal' => $rutaS3,
+            'RegA_ArchivoUUID' => $rutaS3 ? $uuidArchivo : null, // UUID para referencia
             'RegA_Modalidad' => 'Presencial',
             'usuarioRegistro' => $request->usuarioRegistro,
             'created_at' => now(),
@@ -418,7 +420,7 @@ public function registroAdministrativo(Request $request) {
         $status = 200;
 
     } catch (\Exception $e) {
-        // Eliminar archivo si hubo error
+        // Borrar archivo si algo falla
         if ($rutaS3 && Storage::disk('s3')->exists($rutaS3)) {
             Storage::disk('s3')->delete($rutaS3);
         }
@@ -429,11 +431,55 @@ public function registroAdministrativo(Request $request) {
 
     return response()->json([
         'mensaje' => $message,
-        'archivo' => $rutaS3
+        'archivo' => $rutaS3,
+        'uuid' => $rutaS3 ? $uuidArchivo : null,
     ], $status);
 }
 
- public function editarRegistroAdmin(Request $request, $id)
+
+
+public function eliminarArchivo(Request $request)
+{
+    try {
+        $request->validate([
+            'rutaArchivo' => 'required|string'
+        ]);
+
+        $ruta = $request->input('rutaArchivo');
+
+        // Buscar el registro que contiene esta ruta
+        $registro = DB::table('registroadministrativo')
+            ->where('RegA_ConstanciaFiscal', $ruta)
+            ->first();
+
+        if (!$registro) {
+            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([
+                'RegA_ConstanciaFiscal' => null,
+                'updated_at' => now()
+            ]);
+
+        return response()->json(['mensaje' => 'Archivo eliminado correctamente'], 200);
+
+    } catch (\Exception $e) {
+        return response()->json([
+            'mensaje' => 'Error al eliminar archivo',
+            'error' => $e->getMessage()
+        ], 500);
+    }
+}
+
+  public function editarRegistroAdmin(Request $request, $id)
 {
     $message = '';
     $status = 0;
@@ -474,6 +520,7 @@ public function registroAdministrativo(Request $request) {
             'usuarioRegistro' => 'usuarioRegistro',
         ];
 
+        // Procesar cada campo
         foreach ($camposMapeo as $campoRequest => $campoBD) {
             if ($request->has($campoRequest)) {
                 $valor = $request->input($campoRequest);
@@ -484,42 +531,45 @@ 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 extensión PDF
+            // Validar que sea un PDF
             if (strtolower($extension) !== 'pdf') {
                 return response()->json(['mensaje' => 'El archivo debe ser PDF'], 400);
             }
 
-            // Generar nombre único
+            // Generar nombre único para el archivo
             $nombreArchivo = time() . '_' . $idAlumno . '_' . $nombreOriginal;
 
-            // Limpiar y decodificar el contenido base64
+            // Extraer el contenido Base64 (eliminar el prefijo data:application/pdf;base64,)
             $base64Str = substr($base64, strpos($base64, ',') + 1);
             $contenidoArchivo = base64_decode($base64Str);
 
-            // Validar tamaño (máximo 5 MB)
+            // 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);
             }
 
-            // Ruta nueva en S3
-            $rutaS3 = 'constancias_fiscales/' . $nombreArchivo;
-
-            // 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);
+            $rutaDestino = public_path('uploads/constancias_fiscales');
+            if (!file_exists($rutaDestino)) {
+                mkdir($rutaDestino, 0755, true);
             }
 
-            // Subir a S3
-            Storage::disk('s3')->put($rutaS3, $contenidoArchivo, 'public');
+            // 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 nueva ruta
-            $datosActualizar['RegA_ConstanciaFiscal'] = $rutaS3;
+            // Guardar el nuevo archivo
+            file_put_contents($rutaDestino . '/' . $nombreArchivo, $contenidoArchivo);
+            $datosActualizar['RegA_ConstanciaFiscal'] = $nombreArchivo;
         }
 
         // Campos adicionales
@@ -560,9 +610,11 @@ public function registroAdministrativo(Request $request) {
         error_log('ERROR en editarRegistroAdmin: ' . $e->getMessage());
         error_log('Stack trace: ' . $e->getTraceAsString());
 
-        // Eliminar archivo nuevo si ocurrió error
-        if (isset($rutaS3) && Storage::disk('s3')->exists($rutaS3)) {
-            Storage::disk('s3')->delete($rutaS3);
+        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();
@@ -573,6 +625,7 @@ public function registroAdministrativo(Request $request) {
 }
 
 
+
     public function getOneRegistroAdmi($id){
         $id = base64_decode($id);
         $registro = DB::table('registroadministrativo')

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

@@ -270,7 +270,7 @@ Route::get('/respuestas/check', [RespuestasController::class, 'tieneRespuesta'])
 Route::get('/respuestas/formulario', [RespuestasController::class, 'obtenerRespuesta']);
 Route::put('/actualizarRespuesta', [RespuestasController::class, 'actualizarRespuesta']);
 
-
+Route::post('/eliminarArchivo', [RegistroAcademico::class, 'eliminarArchivo']);
 
 
 });

+ 28 - 3
Front/src/app/modules/Padres/pages/Registro/registro.component.ts

@@ -927,12 +927,28 @@ export class RegistroAdComponent implements OnInit {
     nombreAlumno: any;
     gradoCur: any;
     Padre = JSON.parse(localStorage.getItem('userData') || '');
+  rutaArchivo=' ';
 
     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
     ) {
         this.formulario();
     }
+rutaArchivoSubido: string = '';
+
+eliminarArchivo() {
+  if (!this.rutaArchivo) {
+    Swal.fire('Error', 'No hay archivo para eliminar', 'error');
+    return;
+  }
+
+  this._registroAdministrativo.eliminarArchivo(this.rutaArchivo).subscribe((res) => {
+    Swal.fire('Archivo eliminado', res.mensaje, 'success');
+    this.rutaArchivo = '';
+  });
+}
+
+
 formulario() {
     this.form = this.fb.group({
         idAlumno: [''],
@@ -1159,6 +1175,13 @@ this.form2.get('constanciaFiscal')?.enable();
             this.MetodoPago = data.metodoPago;
         });
 
+        this._registroAdministrativo.getOneRegistroAdmin(this.id).subscribe((data: any) => {
+    this.datos = data.registro[0];
+
+    if (this.datos?.RegA_ConstanciaFiscal) {
+      this.rutaArchivo = this.datos.RegA_ConstanciaFiscal;
+    }
+  });
         this.cargarFormulario();
     }
 
@@ -1168,7 +1191,7 @@ async guardarFormulario() {
     return;
   }
 
-  try {
+   try {
     // Habilita temporalmente los campos deshabilitados
     this.form2.get('domicilioFactura')?.enable();
     this.form2.get('correoFactura')?.enable();
@@ -1297,7 +1320,9 @@ export class Asistente {
     ];
     form!: FormGroup;
     maxCaracteres: number = 0;
-    constructor(public dialogRef: MatDialogRef<Asistente>, private fb: FormBuilder, @Inject(MAT_DIALOG_DATA) public data: any) {
+    constructor(public dialogRef: MatDialogRef<Asistente>, private fb: FormBuilder, @Inject(MAT_DIALOG_DATA) public data: any,
+  private _registroAdministrativo: RegistroAcademicoService
+  ) {
         this.Formulario();
     }
 
@@ -1337,7 +1362,7 @@ export class Asistente {
                 referencia: [dataArr[9], [Validators.required, Validators.pattern('^[a-zA-Z0-9áéíóúÁÉÍÓÚñÑ,.][a-zA-Z0-9\\sáéíóúÁÉÍÓÚñÑ,.]*$')]],
             });
         }
-    }
+}
 
     guardar() {
         if (this.form.invalid) {

+ 10 - 0
Front/src/app/modules/Padres/pages/Registro/registroAd.component.html

@@ -189,6 +189,16 @@
   <mat-icon>upload_file</mat-icon>
   Seleccionar Archivo
 </button>
+ <button
+  type="button"
+  class="btn1 borderNone"
+  style="background-color: #e53935; color: white; margin-top: 10px;"
+  (click)="eliminarArchivo()"
+  *ngIf="rutaArchivo"
+>
+  <mat-icon>delete</mat-icon>
+  Eliminar archivo
+</button>
 
 
 

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

@@ -52,7 +52,6 @@ crearRegistroAdministrativo(formData: FormData): Observable<any> {
   }).pipe(tap(() => this.dataUpdated.next()));
 }
 
-
 actualizarRegistroAdministrativo(datos: any, idAlumno: string): Observable<any> {
     const encodedId = btoa(idAlumno);
 
@@ -68,6 +67,15 @@ actualizarRegistroAdministrativo(datos: any, idAlumno: string): Observable<any>
 }
 
 
+eliminarArchivo(rutaArchivo: string): Observable<any> {
+  return this.http.post(`${this.URL}/eliminarArchivo`, { rutaArchivo }, {
+    headers: this.getHeaders()
+  }).pipe(
+    tap(() => this.dataUpdated.next())
+  );
+}
+
+
 
 
   getOneRegistroAdmin(id: string) {