get('radicado', '')); $cedula = trim((string) $request->get('cedula', '')); $fechaDesde = $request->get('fecha_desde'); // yyyy-mm-dd $fechaHasta = $request->get('fecha_hasta'); // yyyy-mm-dd $region = trim((string) $request->get('region', '')); $departamento = trim((string) $request->get('departamento', '')); $municipio = trim((string) $request->get('municipio', '')); // Base SQL con CTE (último evento por radicado) $sql = << $operadorId, 'operadorId2' => $operadorId, ]; // filtros dinámicos (se agregan ANTES del ORDER BY y sin cerrar la sentencia) if ($radicado !== '') { $sql .= " AND LTRIM(RTRIM(CAST(s.rad_via AS VARCHAR(50)))) LIKE :radicado "; $params['radicado'] = '%'.$radicado.'%'; } if ($cedula !== '') { $sql .= " AND s.numero_identificacion_titular LIKE :cedula "; $params['cedula'] = '%'.$cedula.'%'; } if ($fechaDesde) { $sql .= " AND e.fecha_solicitud >= :fdesde "; $params['fdesde'] = $fechaDesde; } if ($fechaHasta) { $sql .= " AND e.fecha_solicitud <= :fhasta "; $params['fhasta'] = $fechaHasta; } if ($region !== '') { $sql .= " AND r.descripcion LIKE :region "; $params['region'] = '%'.$region.'%'; } if ($departamento !== '') { $sql .= " AND m.descripcion_dep LIKE :departamento "; $params['departamento'] = '%'.$departamento.'%'; } if ($municipio !== '') { $sql .= " AND m.descripcion_mun LIKE :municipio "; $params['municipio'] = '%'.$municipio.'%'; } // cierre final del query $sql .= " ORDER BY e.fecha_solicitud DESC;"; $tareas = DB::select($sql, $params); return view('viaticos.tareas', [ 'tareas' => $tareas, 'filtros' => $request->all(), ]); } // 2) APROBAR / RECHAZAR (AJAX) public function actualizarEstado(Request $request) { $request->validate([ 'radicado' => 'required', 'cedula' => 'required', 'accion' => 'required|in:Aprobar,Rechazar', 'observacion' => 'nullable|string' ]); $operadorId = Auth::id(); $radicado = $request->radicado; $cedula = $request->cedula; $accion = $request->accion; $obs = $accion === 'Rechazar' ? ($request->observacion ?? '') : null; // upsert estado en archivo_viaticos (sin ruta aún si no han subido archivos) DB::table('archivo_viaticos')->updateOrInsert( [ 'radicado' => $radicado, 'cedula' => $cedula, 'operador_id' => $operadorId, ], [ 'region_id' => DB::raw("(SELECT TOP 1 r.id FROM municipio m JOIN region r ON m.region_id = r.id JOIN afiliado a ON a.codigo_dane_municipio_atencion = m.id JOIN solicitudes s ON s.numero_identificacion_titular = a.numero_documento WHERE s.rad_via = {$radicado})"), 'estado' => $accion, 'observacion' => $obs, 'fecha_subida'=> now(), // marcamos fecha de gestión; cambiar si prefieres null aquí 'departamento'=> null, // se completa al subir archivos 'ruta_archivo'=> null, // se completa al subir archivos 'nombre_archivo'=> null, // se completa al subir archivos ] ); return response()->json([ 'ok' => true, 'allowUpload' => $accion === 'Aprobar', 'message' => $accion === 'Aprobar' ? 'Aprobado: ya puedes subir archivos.' : 'Rechazado: observación registrada.' ]); } // 3) SUBIR ARCHIVOS (tu lógica, con soporte de estado/obs si vienen) public function subirArchivos(Request $request) { $request->validate([ 'cedula' => 'required', 'region_id' => 'required|integer', 'radicado' => 'required', 'departamento' => 'required|string', 'archivo' => 'required', 'archivo.*' => 'file', 'estado' => 'nullable|in:Aprobar,Rechazar,Pendiente', 'observacion' => 'nullable|string' ]); $operador_id = Auth::user()->id; $departamento = $request->departamento; $rutaBase = $departamento . '/' . $request->cedula; foreach ($request->file('archivo') as $file) { $nombreOriginal = $file->getClientOriginalName(); $path = $file->storeAs($rutaBase, now()->format('Ymd_His_') . '_' . $nombreOriginal, 'financiera'); DB::table('archivo_viaticos')->updateOrInsert( [ 'cedula' => $request->cedula, 'radicado' => $request->radicado, 'operador_id' => $operador_id, ], [ 'region_id' => $request->region_id, 'ruta_archivo' => $path, 'fecha_subida' => now(), 'nombre_archivo'=> $nombreOriginal, 'departamento' => $departamento, 'estado' => $request->estado ?? 'Aprobar', 'observacion' => $request->observacion, ] ); } return back()->with('success', 'Archivos subidos correctamente.'); } }