visible($request, $requisition); return response()->streamDownload(function () use ($request, $requisition, $trail) { DB::transaction(function () use ($request, $requisition, $trail) { if (DB::getDriverName() === 'pgsql' && DB::transactionLevel() === 1) { DB::statement('SET TRANSACTION ISOLATION LEVEL REPEATABLE READ READ ONLY'); } $source = $this->visible($request, $requisition); $out = fopen('php://output', 'w'); if ($out === false) { throw new \RuntimeException('Não foi possível preparar a exportação.'); } $text = static function (mixed $value): string { $value = (string) ($value ?? ''); return preg_match('/^[\s\x00-\x1F]*[=+\-@]/u', $value) ? "'".$value : $value; }; try { fwrite($out, "\xEF\xBB\xBF"); fputcsv($out, ['Metadados do histórico da requisição', $text($source->number), 'Conferido em', now()->toIso8601String()], ';', '"', ''); fputcsv($out, ['Registo', 'Data registada', 'Acção', 'Utilizador (id)', 'Modo de execução'], ';', '"', ''); foreach ($trail->query($source)->lazyById(100) as $record) { $row = $trail->row($record); fputcsv($out, array_map($text, [$row['id'], $row['created_at'], $row['action'], $row['user_id'], $row['execution']]), ';', '"', ''); } } finally { fclose($out); } }); }, 'historico-requisicao-'.$requisition.'-'.now()->format('Ymd-His').'.csv', ['Content-Type' => 'text/csv; charset=UTF-8', 'Cache-Control' => 'private, no-store, max-age=0']); } private function visible(Request $request, int $id): Requisition { $actor = $request->user('web'); abort_unless($actor instanceof User, 403); $actor = User::query()->where('tenant_id', $actor->tenant_id)->findOrFail($actor->id); $access = app(OrganizationAccess::class); abort_unless(! $access->maintenanceOnly($actor) && $access->permissions($actor) !== [], 403); return Requisition::query()->visibleTo($actor)->findOrFail($id); } }