filled('search')) { $query->where('nombre', 'like', '%' . $request->search . '%'); } if ($request->filled('activo')) { $query->where('activo', $request->boolean('activo')); } if ($request->filled('publico')) { $query->where('publico', $request->boolean('publico')); } if ($request->filled('tipo_proceso')) { $query->where('tipo_proceso', $request->tipo_proceso); } // 📄 Paginación $procesos = $query ->orderBy('created_at', 'desc') ->paginate($request->get('per_page', 10)); return response()->json($procesos); } /* ============================= | CREAR (STORE) ============================= */ public function store(Request $request) { $data = $request->validate([ 'nombre' => 'required|string|max:255', 'descripcion' => 'nullable|string', 'estado' => 'nullable|string|max:50', 'duracion' => 'nullable|integer|min:1', 'intentos_maximos' => 'nullable|integer|min:1', 'requiere_pago' => 'boolean', 'precio' => 'nullable|numeric|min:0', 'calificacion_id' => 'nullable|exists:calificaciones,id', 'tipo_simulacro' => 'nullable|string|max:50', 'tipo_proceso' => 'nullable|string|max:50', 'activo' => 'boolean', 'publico' => 'boolean', 'fecha_inicio' => 'nullable|date', 'fecha_fin' => 'nullable|date|after_or_equal:fecha_inicio', 'tiempo_por_pregunta' => 'nullable|integer|min:1', ]); $data['slug'] = Str::slug($data['nombre']) . '-' . uniqid(); $proceso = Proceso::create($data); return response()->json([ 'message' => 'Proceso creado correctamente', 'data' => $proceso ], 201); } /* ============================= | VER (SHOW) ============================= */ public function show($id) { $proceso = Proceso::findOrFail($id); return response()->json($proceso); } /* ============================= | ACTUALIZAR (UPDATE) ============================= */ public function update(Request $request, $id) { $proceso = Proceso::findOrFail($id); $data = $request->validate([ 'nombre' => 'required|string|max:255', 'descripcion' => 'nullable|string', 'estado' => 'nullable|string|max:50', 'duracion' => 'nullable|integer|min:1', 'intentos_maximos' => 'nullable|integer|min:1', 'requiere_pago' => 'boolean', 'precio' => 'nullable|numeric|min:0', 'calificacion_id' => 'nullable|exists:calificaciones,id', 'tipo_simulacro' => 'nullable|string|max:50', 'tipo_proceso' => 'nullable|string|max:50', 'activo' => 'boolean', 'publico' => 'boolean', 'fecha_inicio' => 'nullable|date', 'fecha_fin' => 'nullable|date|after_or_equal:fecha_inicio', 'tiempo_por_pregunta' => 'nullable|integer|min:1', ]); // 🔄 Regenerar slug si cambia nombre if ($data['nombre'] !== $proceso->nombre) { $data['slug'] = Str::slug($data['nombre']) . '-' . uniqid(); } $proceso->update($data); return response()->json([ 'message' => 'Proceso actualizado correctamente', 'data' => $proceso ]); } /* ============================= | ELIMINAR (DESTROY) ============================= */ public function destroy($id) { $proceso = Proceso::findOrFail($id); $proceso->delete(); return response()->json([ 'message' => 'Proceso eliminado correctamente' ]); } /* ============================= | TOGGLE ACTIVO ============================= */ public function toggleActivo($id) { $proceso = Proceso::findOrFail($id); $proceso->activo = !$proceso->activo; $proceso->save(); return response()->json([ 'message' => 'Estado actualizado', 'activo' => $proceso->activo ]); } }