orderBy('orden') ->get(); return response()->json($archivos); } public function store(Request $request, int $procesoId) { $request->validate([ 'orden' => 'required|integer|min:1|max:6', 'nombre' => 'required|string|max:255', 'archivo' => 'required|file|mimes:txt|max:10240', ]); // Máximo 6 archivos por proceso $count = ProcesoAdmisionResultadoArchivo::where('proceso_admision_id', $procesoId)->count(); if ($count >= 6) { return response()->json(['message' => 'Máximo 6 archivos por proceso.'], 422); } // No puede haber dos archivos con el mismo orden en el mismo proceso $existe = ProcesoAdmisionResultadoArchivo::where('proceso_admision_id', $procesoId) ->where('orden', $request->orden) ->exists(); if ($existe) { return response()->json(['message' => 'Ya existe un archivo para ese slot.'], 422); } $contenido = file_get_contents($request->file('archivo')->getRealPath()); $encoding = mb_detect_encoding($contenido, ['UTF-8', 'Windows-1252', 'ISO-8859-1'], true); $contenidoUtf8 = ($encoding === 'UTF-8') ? $contenido : mb_convert_encoding($contenido, 'UTF-8', $encoding ?: 'Windows-1252'); $filename = uniqid() . '.txt'; $path = "proceso-resultados/{$procesoId}/{$filename}"; \Storage::disk('public')->put($path, $contenidoUtf8); $archivo = ProcesoAdmisionResultadoArchivo::create([ 'proceso_admision_id' => $procesoId, 'nombre' => $request->nombre, 'file_path' => $path, 'orden' => $request->orden, ]); return response()->json($archivo, 201); } public function destroy(int $id) { $archivo = ProcesoAdmisionResultadoArchivo::findOrFail($id); Storage::disk('public')->delete($archivo->file_path); $archivo->delete(); return response()->json(['message' => 'Eliminado correctamente.']); } }