page($request, $inbox, 'procurement'); } public function people(Request $request, WorkflowTaskInbox $inbox): Response { return $this->page($request, $inbox, 'people'); } private function page(Request $request, WorkflowTaskInbox $inbox, string $area): Response { $actor = $request->user('web'); abort_unless($actor instanceof User, 403); $modules = $area === 'people' ? ['people' => 'Pessoas e contratações'] : ['purchases' => 'Compras', 'warehouse' => 'Armazém', 'supply' => 'Fornecimentos e reposição', 'finance' => 'Finanças']; $filters = $request->validate(['module' => ['nullable', Rule::in(['all', ...array_keys($modules)])], 'search' => 'nullable|string|max:100', 'page' => 'nullable|integer|min:1|max:1000000', 'due' => 'nullable|in:all,overdue,today,upcoming,undated']); return DB::transaction(function () use ($request, $actor, $area, $inbox, $modules, $filters) { if (DB::getDriverName() === 'pgsql' && DB::transactionLevel() === 1) { DB::statement('SET TRANSACTION ISOLATION LEVEL REPEATABLE READ READ ONLY'); } $today = today()->toDateString(); $all = collect($inbox->build($actor, $area))->map(function ($row) use ($today) { $date = $row['due_on'] ?? null; $row['due_status'] = $date === null ? 'undated' : ($date < $today ? 'overdue' : ($date === $today ? 'today' : 'upcoming')); return $row; }); $counts = []; foreach ($modules as $key => $label) { $counts[$key] = $all->where('module', $key)->count(); } $rows = $all->filter(fn ($row) => (($filters['module'] ?? 'all') === 'all' || $row['module'] === $filters['module']) && (($filters['search'] ?? '') === '' || mb_stripos($row['reference'].' '.$row['label'], trim($filters['search'])) !== false))->values(); $deadlineCounts = []; foreach (['overdue', 'today', 'upcoming', 'undated'] as $status) { $deadlineCounts[$status] = $rows->where('due_status', $status)->count(); } if (($filters['due'] ?? 'all') !== 'all') { $rows = $rows->where('due_status', $filters['due'])->values(); } $page = (int) ($filters['page'] ?? 1); Inertia::encryptHistory(); $response = Inertia::render('workflow/tasks', ['area' => $area, 'modules' => $modules, 'counts' => $counts, 'checkedAt' => now()->toIso8601String(), 'asOf' => $today, 'deadlineCounts' => $deadlineCounts, 'filters' => ['module' => $filters['module'] ?? 'all', 'search' => $filters['search'] ?? '', 'due' => $filters['due'] ?? 'all'], 'tasks' => (new LengthAwarePaginator($rows->slice(($page - 1) * 25, 25)->values(), $rows->count(), 25, $page, ['path' => $request->url()]))->withQueryString()])->toResponse($request); $response->headers->set('Cache-Control', 'private, no-store, max-age=0'); return $response; }); } }