nombrePeriodoActivo = $periodoService->obtenerPeriodoActivoNombre(); } catch (\Exception $e) { $this->nombrePeriodoActivo = null; } } public function registroAca(Request $request) { $message = ''; $status = 0; try { DB::beginTransaction(); // Guardar personas autorizadas como JSON $personasJson = json_encode($request->personasAutorizadas ?? []); // Armar el array con TODOS los campos que vas a insertar $data = [ 'idEscuela' => 'COLEGIOABC', 'idAlumno' => $request->idAlumno ?? '', 'FiDI_Nombre1' => $request->primerNombre ?? '', 'FiDI_Nombre2' => $request->segundoNombre ?? null, 'FiDI_ApellidoPaterno' => $request->apellidoPaterno ?? '', 'FiDI_ApellidoMaterno' => $request->apellidoMaterno ?? '', 'FiDI_CURP' => $request->curp ?? '', 'FiDI_Sexo' => $request->sexo ?? '', 'FiDI_Edad' => $request->edad ?? '', 'FiDI_NacCiudad' => $request->ciudadNacimiento ?? '', 'FiDI_NacEstado' => $request->estado ?? '', 'FiDI_NacFechaDia' => $request->diaNacimiento ?? '', 'FiDI_NacFechaMes' => $request->mesNacimiento ?? '', 'FiDI_NacFechaAnio' => $request->añoNacimiento ?? '', 'FiDI_Domicilio' => $request->domicilio ?? '', 'FiDI_Telefono' => $request->telefonoCasa ?? '', 'FiDI_InstProce' => $request->institucionProcedencia ?? '', 'FiDI_MotivoCambio' => $request->motivoCambio ?? '', // Padres 'FiDI_PadNombre1' => $request->padrePrimerNombre ?? '', 'FiDI_PadNombre2' => $request->padreSegundoNombre ?? null, 'FiDI_PadApellidoPaterno' => $request->padreApellidoPaterno ?? '', 'FiDI_PadApellidoMaterno' => $request->padreApellidoMaterno ?? '', 'FiDI_PadCURP' => $request->padreCurp ?? '', 'FiDI_PadNacionalidad' => $request->padreNacionalidad ?? '', 'FiDI_PadEstadoCivil' => $request->padreEstadoCivil ?? '', 'FiDI_PadNacFechaDia' => $request->padreDiaNacimiento ?? '', 'FiDI_PadNacFechaMes' => $request->padreMesNacimiento ?? '', 'FiDI_PadNacFechaAnio' => $request->padreAñoNacimiento ?? '', 'FiDI_PadDomicilio' => $request->padreDomicilio ?? '', 'FiDI_PadCP' => $request->padreCPDomicilio ?? '', 'FiDI_PadEscolaridad' => $request->padreEscolaridad ?? '', 'FiDI_PadOcupacion' => $request->padreOcupacion ?? '', 'FiDI_PadLugTrabajo' => $request->padreLugarTrabajo ?? '', 'FiDI_PadTelTrabajo' => $request->padreTelefonoTrabajo ?? '', 'FiDI_PadTelTrabajoExt' => $request->padreExtension ?? '', 'FiDI_PadCelular' => $request->padreCelular ?? '', 'FiDI_PadCorreo' => $request->padreCorreo ?? '', // Madres 'FiDI_MadNombre1' => $request->madrePrimerNombre ?? '', 'FiDI_MadNombre2' => $request->madreSegundoNombre ?? null, 'FiDI_MadApellidoPaterno' => $request->madreApellidoPaterno ?? '', 'FiDI_MadApellidoMaterno' => $request->madreApellidoMaterno ?? '', 'FiDI_MadCURP' => $request->madreCurp ?? '', 'FiDI_MadNacionalidad' => $request->madreNacionalidad ?? '', 'FiDI_MadEstadoCivil' => $request->madreEstadoCivil ?? '', 'FiDI_MadNacFechaDia' => $request->madreDiaNacimiento ?? '', 'FiDI_MadNacFechaMes' => $request->madreMesNacimiento ?? '', 'FiDI_MadNacFechaAnio' => $request->madreAñoNacimiento ?? '', 'FiDI_MadDomicilio' => $request->madreDomicilio ?? '', 'FiDI_MadCP' => $request->madreCPDomicilio ?? '', 'FiDI_MadEscolaridad' => $request->madreEscolaridad ?? '', 'FiDI_MadOcupacion' => $request->madreOcupacion ?? '', 'FiDI_MadLugTrabajo' => $request->madreLugarTrabajo ?? '', 'FiDI_MadTelTrabajo' => $request->madreTelefonoTrabajo ?? '', 'FiDI_MadTelTrabajoExt' => $request->madreExtension ?? '', 'FiDI_MadCelular' => $request->madreCelular ?? '', 'FiDI_MadCorreo' => $request->madreCorreo ?? '', // Autorizaciones 'FiDI_RetirarseSolo' => $request->AutorizarAlum ?? 'No', 'FiDI_RecogerMadre' => $request->MadreFam ?? 'No', 'FiDI_RecogerPadre' => $request->PadreFam ?? 'No', // personas autorizadas (EXCLUIDO de la validación) 'personasAutorizadas' => $personasJson, // Padecimientos 'CedA_TipoSangre' => $request->tipoSangre ?? '', 'CedA_AlergiaAspirina' => $request->aspirina ?? '', 'CedA_AlergiaPenicilina' => $request->penicilina ?? '', 'CedA_AlergiaOtro' => $request->otrosMedicamentos ?? '', 'CedA_PadPaperas' => $request->paperas ?? '', 'CedA_PadSarampio' => $request->sarampion ?? '', 'CedA_PadRubeola' => $request->rubeola ?? '', 'CedA_PadEscarlatina' => $request->escarlatina ?? '', 'CedA_PadTosferina' => $request->tosferina ?? '', 'CedA_PadTifoidea' => $request->tifoidea ?? '', 'CedA_PadHepatitis' => $request->hepatitis ?? '', 'CedA_PadVaricela' => $request->varicela ?? '', 'CedA_PadBronquitis' => $request->bronquitis ?? '', 'CedA_PadApendicitis' => $request->apendicitis ?? '', 'CedA_PadMeningitis' => $request->meninguitis ?? '', 'CedA_PadDesmayos' => $request->desmayos ?? '', 'CedA_PadCovid19' => $request->covid ?? '', 'CedA_PadGarganta' => $request->garganta ?? '', 'CedA_PadEstomago' => $request->estomago ?? '', 'CedA_PadCatarro' => $request->catarro ?? '', 'CedA_PadDiarrea' => $request->diarrea ?? '', 'CedA_PadDolorCabeza' => $request->dolorCabeza ?? '', 'CedA_PadFiebreAlta' => $request->fiebreAlta ?? '', 'CedA_PadComezon' => $request->comezonFrecuente ?? '', 'CedA_PadMareos' => $request->mareos ?? '', 'CedA_DiabeticoPrecauciones' => $request->diabetes ?? '', 'CedA_AsmaticoPrecauciones' => $request->asmatico ?? '', 'CedA_EpilepticoPrecauciones' => $request->epileptico ?? '', 'CedA_EnfermedadEnPiel' => $request->enfermedadPiel ?? '', // Antecedentes 'CedA_ProbEmbarazo' => $request->problemasEmbarazo ?? '', 'CedA_ProbParto' => $request->problemasParto ?? '', 'CedA_PesoNacimiento' => $request->peso ?? '', 'CedA_AlturaNacimiento' => $request->talla1 ?? '', 'CedA_PesoActual' => $request->pesoActual ?? '', 'CedA_AlturaActual' => $request->tallaActual ?? '', 'CedA_EsfinteresDiurno' => $request->edad1 ?? '', 'CedA_EsfinteresNocturno' => $request->edad2 ?? '', 'CedA_Gateo' => $request->gateo ?? '', 'CedA_GateoEdad' => $request->edadGateo ?? '', 'CedA_EdadHablo' => $request->edadHablo ?? '', 'CedA_EdadCamino' => $request->edadCamino ?? '', 'CedA_EnfermedadesPadecidas' => $request->enfermedades ?? '', 'CedA_EnfermedadesAlergiasActuales' => $request->alergias ?? '', 'CedA_TratamientoMedicoActual' => $request->tratamientoMedico ?? '', 'CedA_UsaLentes' => $request->lentes ?? '', 'CedA_PiePlano' => $request->piePlano ?? '', 'CedA_Ortopedico' => $request->zapatoOrtopedico ?? '', 'CedA_ProbAprendizaje' => $request->problemasAprendizaje ?? '', 'CedA_RelPareja' => $request->relacionPareja ?? '', 'CedA_ProblemasFamiliares' => $request->problemasFamilia ?? '', 'CedA_HijoAfectado' => $request->afectacionProblemas ?? '', 'CedA_TratPsicologico' => $request->tratamientoPsicologico ?? '', 'CedA_LoQueDesagradaFamilia' => $request->desagradaFamilia ?? '', 'CedA_LoQueAgradaFamilia' => $request->agradaFamilia ?? '', 'CedA_HogarNoGustan' => $request->actividadDesagrada ?? '', 'CedA_HogarGustan' => $request->actividadAgrada ?? '', 'CedA_Defectos' => $request->defectos ?? '', 'CedA_Virtudes' => $request->virtudes ?? '', 'CedA_Futuro' => $request->futuro ?? '', 'CedA_Comentario' => $request->comentarios ?? '', 'usuarioRegistro' => $request->usuarioRegistro ?? '', ]; // Validación automática: si alguna propiedad (excepto personasAutorizadas) está vacía => incompleto $incompleto = false; foreach ($data as $key => $val) { if ($key === 'personasAutorizadas') continue; if (is_null($val)) { $incompleto = true; break; } if (is_string($val) && trim($val) === '') { $incompleto = true; break; } } $data['completado'] = $incompleto ? 0 : 1; // Insert en un solo paso $idRegistro = DB::table('registroacademico')->insertGetId($data); DB::commit(); $message = 'Registro exitoso'; $status = 200; } catch (\Exception $e) { DB::rollBack(); $message = $e->getMessage(); $status = 500; } return response()->json(['mensaje' => $message, 'completado' => $data['completado']], $status); } public function ActualizarRegistroAca(Request $request, $id) { $id = base64_decode($id); $message = ''; $status = 0; $usuario = $request->usuario ?? 'sistema'; try { DB::beginTransaction(); // Buscar registro $registroExistente = DB::table('registroacademico') ->where('idEscuela', 'COLEGIOABC') ->where('idAlumno', $id) ->first(); if (!$registroExistente) { return response()->json(['mensaje' => 'Registro no encontrado'], 404); } // Manejo de personas autorizadas $personasJson = $registroExistente->personasAutorizadas; if (!empty($request->personasAutorizadas)) { $personasExistentes = json_decode($registroExistente->personasAutorizadas, true) ?? []; $personasJson = json_encode(array_merge($personasExistentes, $request->personasAutorizadas)); } // Construimos el array de actualización $datosUpdate = [ 'idEscuela' => 'COLEGIOABC', 'idAlumno' => $request->idAlumno ?? '', 'FiDI_Nombre1' => $request->primerNombre ?? '', 'FiDI_Nombre2' => $request->segundoNombre ?? null, 'FiDI_ApellidoPaterno' => $request->apellidoPaterno ?? '', 'FiDI_ApellidoMaterno' => $request->apellidoMaterno ?? '', 'FiDI_CURP' => $request->curp ?? '', 'FiDI_Sexo' => $request->sexo ?? '', 'FiDI_Edad' => $request->edad ?? '', 'FiDI_NacCiudad' => $request->ciudadNacimiento ?? '', 'FiDI_NacEstado' => $request->estado ?? '', 'FiDI_NacFechaDia' => $request->diaNacimiento ?? '', 'FiDI_NacFechaMes' => $request->mesNacimiento ?? '', 'FiDI_NacFechaAnio' => $request->añoNacimiento ?? '', 'FiDI_Domicilio' => $request->domicilio ?? '', 'FiDI_Telefono' => $request->telefonoCasa ?? '', 'FiDI_InstProce' => $request->institucionProcedencia ?? '', 'FiDI_MotivoCambio' => $request->motivoCambio ?? '', // Padres 'FiDI_PadNombre1' => $request->padrePrimerNombre ?? '', 'FiDI_PadNombre2' => $request->padreSegundoNombre ?? null, 'FiDI_PadApellidoPaterno' => $request->padreApellidoPaterno ?? '', 'FiDI_PadApellidoMaterno' => $request->padreApellidoMaterno ?? '', 'FiDI_PadCURP' => $request->padreCurp ?? '', 'FiDI_PadNacionalidad' => $request->padreNacionalidad ?? '', 'FiDI_PadEstadoCivil' => $request->padreEstadoCivil ?? '', 'FiDI_PadNacFechaDia' => $request->padreDiaNacimiento ?? '', 'FiDI_PadNacFechaMes' => $request->padreMesNacimiento ?? '', 'FiDI_PadNacFechaAnio' => $request->padreAñoNacimiento ?? '', 'FiDI_PadDomicilio' => $request->padreDomicilio ?? '', 'FiDI_PadCP' => $request->padreCPDomicilio ?? '', 'FiDI_PadEscolaridad' => $request->padreEscolaridad ?? '', 'FiDI_PadOcupacion' => $request->padreOcupacion ?? '', 'FiDI_PadLugTrabajo' => $request->padreLugarTrabajo ?? '', 'FiDI_PadTelTrabajo' => $request->padreTelefonoTrabajo ?? '', 'FiDI_PadTelTrabajoExt' => $request->padreExtension ?? '', 'FiDI_PadCelular' => $request->padreCelular ?? '', 'FiDI_PadCorreo' => $request->padreCorreo ?? '', // Madres 'FiDI_MadNombre1' => $request->madrePrimerNombre ?? '', 'FiDI_MadNombre2' => $request->madreSegundoNombre ?? null, 'FiDI_MadApellidoPaterno' => $request->madreApellidoPaterno ?? '', 'FiDI_MadApellidoMaterno' => $request->madreApellidoMaterno ?? '', 'FiDI_MadCURP' => $request->madreCurp ?? '', 'FiDI_MadNacionalidad' => $request->madreNacionalidad ?? '', 'FiDI_MadEstadoCivil' => $request->madreEstadoCivil ?? '', 'FiDI_MadNacFechaDia' => $request->madreDiaNacimiento ?? '', 'FiDI_MadNacFechaMes' => $request->madreMesNacimiento ?? '', 'FiDI_MadNacFechaAnio' => $request->madreAñoNacimiento ?? '', 'FiDI_MadDomicilio' => $request->madreDomicilio ?? '', 'FiDI_MadCP' => $request->madreCPDomicilio ?? '', 'FiDI_MadEscolaridad' => $request->madreEscolaridad ?? '', 'FiDI_MadOcupacion' => $request->madreOcupacion ?? '', 'FiDI_MadLugTrabajo' => $request->madreLugarTrabajo ?? '', 'FiDI_MadTelTrabajo' => $request->madreTelefonoTrabajo ?? '', 'FiDI_MadTelTrabajoExt' => $request->madreExtension ?? '', 'FiDI_MadCelular' => $request->madreCelular ?? '', 'FiDI_MadCorreo' => $request->madreCorreo ?? '', // Autorizaciones 'FiDI_RetirarseSolo' => $request->AutorizarAlum ?? 'No', 'FiDI_RecogerMadre' => $request->MadreFam ?? 'No', 'FiDI_RecogerPadre' => $request->PadreFam ?? 'No', // personas autorizadas 'personasAutorizadas' => $personasJson, // ejemplo: aquí irían todos los campos médicos y antecedentes... 'CedA_TipoSangre' => $request->tipoSangre ?? '', 'CedA_AlergiaAspirina' => $request->aspirina ?? '', 'CedA_AlergiaPenicilina' => $request->penicilina ?? '', 'CedA_AlergiaOtro' => $request->otrosMedicamentos ?? '', 'CedA_PadPaperas' => $request->paperas ?? '', 'CedA_PadSarampio' => $request->sarampion ?? '', 'CedA_PadRubeola' => $request->rubeola ?? '', 'CedA_PadEscarlatina' => $request->escarlatina ?? '', 'CedA_PadTosferina' => $request->tosferina ?? '', 'CedA_PadTifoidea' => $request->tifoidea ?? '', 'CedA_PadHepatitis' => $request->hepatitis ?? '', 'CedA_PadVaricela' => $request->varicela ?? '', 'CedA_PadBronquitis' => $request->bronquitis ?? '', 'CedA_PadApendicitis' => $request->apendicitis ?? '', 'CedA_PadMeningitis' => $request->meninguitis ?? '', 'CedA_PadDesmayos' => $request->desmayos ?? '', 'CedA_PadCovid19' => $request->covid ?? '', 'CedA_PadGarganta' => $request->garganta ?? '', 'CedA_PadEstomago' => $request->estomago ?? '', 'CedA_PadCatarro' => $request->catarro ?? '', 'CedA_PadDiarrea' => $request->diarrea ?? '', 'CedA_PadDolorCabeza' => $request->dolorCabeza ?? '', 'CedA_PadFiebreAlta' => $request->fiebreAlta ?? '', 'CedA_PadComezon' => $request->comezonFrecuente ?? '', 'CedA_PadMareos' => $request->mareos ?? '', 'CedA_DiabeticoPrecauciones' => $request->diabetes ?? '', 'CedA_AsmaticoPrecauciones' => $request->asmatico ?? '', 'CedA_EpilepticoPrecauciones' => $request->epileptico ?? '', 'CedA_EnfermedadEnPiel' => $request->enfermedadPiel ?? '', 'CedA_ProbEmbarazo' => $request->problemasEmbarazo ?? '', 'CedA_ProbParto' => $request->problemasParto ?? '', 'CedA_PesoNacimiento' => $request->peso ?? '', 'CedA_AlturaNacimiento' => $request->talla1 ?? '', 'CedA_PesoActual' => $request->pesoActual ?? '', 'CedA_AlturaActual' => $request->tallaActual ?? '', 'CedA_EsfinteresDiurno' => $request->edad1 ?? '', 'CedA_EsfinteresNocturno' => $request->edad2 ?? '', 'CedA_Gateo' => $request->gateo ?? '', 'CedA_GateoEdad' => $request->edadGateo ?? '', 'CedA_EdadHablo' => $request->edadHablo ?? '', 'CedA_EdadCamino' => $request->edadCamino ?? '', 'CedA_EnfermedadesPadecidas' => $request->enfermedades ?? '', 'CedA_EnfermedadesAlergiasActuales' => $request->alergias ?? '', 'CedA_TratamientoMedicoActual' => $request->tratamientoMedico ?? '', 'CedA_UsaLentes' => $request->lentes ?? '', 'CedA_PiePlano' => $request->piePlano ?? '', 'CedA_Ortopedico' => $request->zapatoOrtopedico ?? '', 'CedA_ProbAprendizaje' => $request->problemasAprendizaje ?? '', 'CedA_RelPareja' => $request->relacionPareja ?? '', 'CedA_ProblemasFamiliares' => $request->problemasFamilia ?? '', 'CedA_HijoAfectado' => $request->afectacionProblemas ?? '', 'CedA_TratPsicologico' => $request->tratamientoPsicologico ?? '', 'CedA_LoQueDesagradaFamilia' => $request->desagradaFamilia ?? '', 'CedA_LoQueAgradaFamilia' => $request->agradaFamilia ?? '', 'CedA_HogarNoGustan' => $request->actividadDesagrada ?? '', 'CedA_HogarGustan' => $request->actividadAgrada ?? '', 'CedA_Defectos' => $request->defectos ?? '', 'CedA_Virtudes' => $request->virtudes ?? '', 'CedA_Futuro' => $request->futuro ?? '', 'CedA_Comentario' => $request->comentarios ?? '', 'usuarioRegistro' => $usuario, ]; // Verificar si está completo $incompleto = false; foreach ($datosUpdate as $key => $val) { if ($key === 'personasAutorizadas') continue; if (is_null($val)) { $incompleto = true; break; } if (is_string($val) && trim($val) === '') { $incompleto = true; break; } } $datosUpdate['completado'] = $incompleto ? 0 : 1; // Actualizar DB::table('registroacademico') ->where('idEscuela', 'COLEGIOABC') ->where('idAlumno', $id) ->update($datosUpdate); DB::commit(); return response()->json([ 'mensaje' => 'Registro actualizado correctamente', 'completado' => $datosUpdate['completado'] ], 200); } catch (\Exception $e) { DB::rollBack(); return response()->json([ 'mensaje' => 'Error al actualizar el registro', 'error' => $e->getMessage() ], 500); } } public function getOneRegistro($id){ $id = base64_decode($id); $registro = DB::table('registroacademico') ->where('idEscuela', 'COLEGIOABC') ->where('idAlumno', $id) ->get(); return response()->json([ 'mensaje' => 'Registro encontrado', 'registro' => $registro ]); } public function getAll(){ $registro = DB::table('registroacademico') ->where('idEscuela', 'COLEGIOABC') ->get(); return response()->json([ 'mensaje' => 'Registro encontrado', 'registro' => $registro ]); } public function getAllAd(){ $registro = DB::table('registroadministrativo') ->where('idEscuela', 'COLEGIOABC') ->get(); return response()->json([ 'mensaje' => 'Registro encontrado', 'registro' => $registro ]); } public function registroAdministrativo(Request $request) { $message = ''; $status = 0; $rutaS3 = null; $uuidArchivo = Str::uuid()->toString(); $carpetaBase = config('custom.s3_carpeta_base'); try { $periodoService = new PeriodoService(); $carpetaPeriodo = $periodoService->obtenerPeriodoActivoNombre(); $request->validate([ 'idAlumno' => 'required', 'usuarioRegistro' => 'required', ]); // Normalizar el valor de 'factura' $requiereFactura = strtolower(trim($request->factura ?? 'no')) === 'sí' || strtolower(trim($request->factura ?? 'no')) === 'si' ? 'Sí' : 'No'; // Validación y carga del archivo si se requiere factura if ($requiereFactura === 'Sí' && $request->hasFile('constanciaFiscal')) { $archivo = $request->file('constanciaFiscal'); if (!$archivo->isValid()) { throw new \Exception('Archivo inválido'); } if (!$carpetaPeriodo) { throw new \Exception('No hay un período activo configurado. No se puede subir archivos.'); } $originalName = $archivo->getClientOriginalName(); if (strlen($originalName) > 250) { throw new \Exception('El nombre del archivo excede los 250 caracteres permitidos.'); } if (!preg_match('/^[a-zA-Z0-9\s._\-\(\)ñÑáéíóúÁÉÍÓÚ]+$/u', $originalName)) { throw new \Exception('El nombre del archivo contiene caracteres no permitidos.'); } if ($archivo->getClientMimeType() !== 'application/pdf') { throw new \Exception('Solo se permiten archivos PDF.'); } if ($archivo->getSize() > 5 * 1024 * 1024) { throw new \Exception('El archivo no puede ser mayor a 5MB.'); } $nombreArchivo = $uuidArchivo . '-' . $request->idAlumno . '-' . $originalName; $rutaS3 = $carpetaBase . '/' . $carpetaPeriodo . '/constancias_fiscales/' . $nombreArchivo; Storage::disk('s3')->put($rutaS3, file_get_contents($archivo), 'public'); } // Si no se requiere factura o no se subió archivo, se asigna 'NA' if ($requiereFactura === 'No' || !$rutaS3) { $rutaS3 = 'NA'; } $registro = [ 'idEscuela' => $request->idEscuela ?? 'COLEGIOABC', 'idAlumno' => $request->idAlumno, 'RegA_MesInscripcion' => $request->mesInscripcion ?? '', 'RegA_GradoCursar' => $request->gradoCursar ?? '', 'RegA_BecaCurso' => $request->becaCurso ?? '', 'RegA_BecaPorcentaje' => $request->becaPorcentaje ?? '', 'RegA_PlanPagos' => $request->planPago ?? '', '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_ConstanciaFiscal' => $rutaS3, 'RegA_Modalidad' => 'Presencial', 'usuarioRegistro' => $request->usuarioRegistro, 'created_at' => now(), 'updated_at' => now(), ]; $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) { if ($rutaS3 && $rutaS3 !== 'NA' && Storage::disk('s3')->exists($rutaS3)) { Storage::disk('s3')->delete($rutaS3); } $message = 'Error: ' . $e->getMessage(); $status = 500; } return response()->json([ 'mensaje' => $message, 'archivo' => $rutaS3, 'uuid' => $rutaS3 && $rutaS3 !== 'NA' ? $uuidArchivo : null, ], $status); } 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); } if (Storage::disk('s3')->exists($ruta)) { Storage::disk('s3')->delete($ruta); } 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; $rutaS3 = ''; $uuidArchivo = Str::uuid()->toString(); $carpetaBase = config('custom.s3_carpeta_base'); try { $idAlumno = base64_decode($id); $registroExistente = DB::table('registroadministrativo') ->where('idEscuela', 'COLEGIOABC') ->where('idAlumno', $idAlumno) ->first(); if (!$registroExistente) { return response()->json(['mensaje' => 'Registro no encontrado'], 404); } $datosActualizar = ['updated_at' => now()]; if ($request->hasFile('constanciaFiscal')) { $periodoService = new PeriodoService(); $carpetaPeriodo = $periodoService->obtenerPeriodoActivoNombre(); if (!$carpetaPeriodo) { throw new \Exception('No hay un período activo configurado. No se puede subir archivos.'); } $archivo = $request->file('constanciaFiscal'); if (!$archivo->isValid()) { throw new \Exception('Archivo inválido'); } $originalName = $archivo->getClientOriginalName(); if (strlen($originalName) > 250) { throw new \Exception('El nombre del archivo excede los 250 caracteres permitidos.'); } if (!preg_match('/^[a-zA-Z0-9\s._\-\(\)ñÑáéíóúÁÉÍÓÚ]+$/u', $originalName)) { throw new \Exception('El nombre del archivo contiene caracteres no permitidos.'); } if ($archivo->getClientMimeType() !== 'application/pdf') { throw new \Exception('Solo se permiten archivos PDF.'); } if ($archivo->getSize() > 5 * 1024 * 1024) { throw new \Exception('El archivo no puede ser mayor a 5MB.'); } $nombreArchivo = $uuidArchivo . '-' . $idAlumno . '-' . $originalName; $rutaS3 = $carpetaBase . '/' .$carpetaPeriodo . '/constancias_fiscales/' . $nombreArchivo; Storage::disk('s3')->put($rutaS3, file_get_contents($archivo), 'public'); $datosActualizar['RegA_ConstanciaFiscal'] = $rutaS3; } $camposMapeo = [ 'mesInscripcion' => 'RegA_MesInscripcion', 'gradoCursar' => 'RegA_GradoCursar', 'becaCurso' => 'RegA_BecaCurso', 'becaPorcentaje' => 'RegA_BecaPorcentaje', 'planPago' => 'RegA_PlanPagos', 'factura' => 'RegA_RequiereFactura', 'metedoPago' => 'RegA_MetodoPago', 'RFCFactura' => 'RegA_RfcFactura', 'razonSocial' => 'RegA_NombreFactura', 'domicilioFactura' => 'RegA_DireccionFactura', 'correoFactura' => 'RegA_CorreoFactura', 'usuarioRegistro' => 'usuarioRegistro', ]; foreach ($camposMapeo as $campoRequest => $campoBD) { if ($request->has($campoRequest)) { $valor = $request->input($campoRequest); if ($valor !== null && $valor !== '') { $datosActualizar[$campoBD] = $valor; } } } if ($request->has('idEscuela')) { $datosActualizar['idEscuela'] = $request->input('idEscuela'); } if (!isset($datosActualizar['RegA_ConstanciaFiscal']) && empty($registroExistente->RegA_ConstanciaFiscal)) { $datosActualizar['RegA_ConstanciaFiscal'] = 'NA'; } DB::table('registroadministrativo') ->where('idEscuela', 'COLEGIOABC') ->where('idAlumno', $idAlumno) ->update($datosActualizar); $message = 'Actualización exitosa'; $status = 200; } catch (\Exception $e) { if ($rutaS3 && Storage::disk('s3')->exists($rutaS3)) { Storage::disk('s3')->delete($rutaS3); } $message = 'Error interno: ' . $e->getMessage(); $status = 500; } return response()->json(['mensaje' => $message], $status); } public function getOneRegistroAdmi($id){ $id = base64_decode($id); $registro = DB::table('registroadministrativo') ->where('idEscuela', 'COLEGIOABC') ->where('idAlumno', $id) ->get(); return response()->json(['registro'=>$registro]); } public function getAllMetoPago(){ $metodoPago = DB::table('config_metodopago') ->where('idEscuela', 'COLEGIOABC') ->get(); return response()->json(['metodoPago'=>$metodoPago]); } public function getAllPlanPago(){ $planPago = DB::table('config_planpago') ->where('idEscuela', 'COLEGIOABC') ->get(); return response()->json(['planPago'=>$planPago]); } public function getAllPorcentajeBeca(){ $porcentajeBeca = DB::table('config_porcentajebeca') ->where('idEscuela', 'COLEGIOABC') ->get(); return response()->json(['porcentajeBeca'=>$porcentajeBeca]); } public function findOne($id) { $id = base64_decode($id); $usuario = DB::table('usuarios') ->where('idUsuario', $id) ->select( DB::raw("CONCAT(COALESCE(primerNombre, ''), ' ', COALESCE(segundoNombre, ''), ' ', COALESCE(apellidoPaterno, ''), ' ', COALESCE(apellidoMaterno, '')) AS nombreUsuario"), 'idUsuario', 'grado' ) ->get(); return response()->json($usuario, 200); } public function RecalcularCompletado() { try { DB::beginTransaction(); // Traer todos los registros $registros = DB::table('registroacademico')->get(); foreach ($registros as $registro) { $data = (array) $registro; // Revisar campos (excluyendo los que no deben contar) $incompleto = false; foreach ($data as $key => $val) { if (in_array($key, ['id', 'idEscuela', 'idAlumno', 'personasAutorizadas', 'completado', 'usuarioRegistro'])) { continue; } if (is_null($val)) { $incompleto = true; break; } if (is_string($val) && trim($val) === '') { $incompleto = true; break; } } $nuevoCompletado = $incompleto ? 0 : 1; // Solo actualizar si cambia if ($registro->completado != $nuevoCompletado) { DB::table('registroacademico') ->where('idEscuela', $registro->idEscuela) ->where('idAlumno', $registro->idAlumno) ->update(['completado' => $nuevoCompletado]); } } DB::commit(); return response()->json([ 'mensaje' => 'Proceso finalizado con éxito', 'total' => count($registros) ], 200); } catch (\Exception $e) { DB::rollBack(); return response()->json(['mensaje' => $e->getMessage()], 500); } } }