Files
compras/app/Http/Controllers/WorkflowTaskInboxController.php
2026-11-03 11:51:44 +02:00

71 lines
3.5 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\User;
use App\Services\WorkflowTaskInbox;
use Illuminate\Http\Request;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Facades\DB;
use Illuminate\Validation\Rule;
use Inertia\Inertia;
use Symfony\Component\HttpFoundation\Response;
class WorkflowTaskInboxController extends Controller
{
public function procurement(Request $request, WorkflowTaskInbox $inbox): Response
{
return $this->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;
});
}
}