File manager - Edit - /var/www/html/portal/app/Http/Resources/AtaResource.php
Back
<?php namespace App\Http\Resources; use App\Helpers\FileUploadHelper; use App\Http\Requests\AtaPublicFilterRequest; use App\Http\Requests\AtaRequest; use App\Http\Services\AtaService; use App\Models\Ata; use App\Models\Comunicacao\Boletim; use App\Models\LicitacoesProcedimentos\Processo; use App\Models\Structure; use Carbon\Carbon; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Support\Collection; use Illuminate\Support\Facades\DB; use Illuminate\Support\Str; use Illuminate\Validation\ValidationException; class AtaResource { /** @var string[] */ public const ADMIN_FILTER_KEYS = [ 'q', 'nr_ata', 'nr_processo', 'id_secretaria_ata', 'dt_data_ata', 'page', ]; public function __construct( private readonly AtaService $service ) { } /** * Monta os dados da página pública de atas. * * @return array<string, mixed> */ public function getPublicPageViewData(AtaPublicFilterRequest $request): array { $validated = $request->validated(); $secretarias = Structure::query() ->select(['id', 'name', 'abbreviation']) ->where('status', 'ATIVADO') ->orderBy('name') ->get(); $anosAta = Ata::query() ->select('dt_data_ata') ->whereNotNull('dt_data_ata') ->get() ->map(fn ($item) => substr((string) $item->dt_data_ata, 0, 4)) ->filter() ->unique() ->sortDesc() ->values(); $vigencias = Ata::query() ->select('dt_vigencia_ata') ->whereNotNull('dt_vigencia_ata') ->get() ->map(fn ($item) => substr((string) $item->dt_vigencia_ata, 0, 4)) ->filter() ->unique() ->sortDesc() ->values(); $query = Ata::query() ->with(['licitacao:id,nr_licitacao', 'bo:id,url,fileName,number,publicationDate']) ->orderByDesc('dt_data_ata') ->orderByDesc('id_ata'); if (!empty($validated['instituicao'])) { $query->where('id_secretaria_ata', (string) $validated['instituicao']); } if (!empty($validated['objeto'])) { $objeto = trim((string) $validated['objeto']); $query->where('ds_objeto', 'like', '%' . $objeto . '%'); } if (!empty($validated['numero_ata'])) { $numeroAta = trim((string) $validated['numero_ata']); $query->where('nr_ata', 'like', '%' . $numeroAta . '%'); } if (!empty($validated['ano_ata'])) { $query->where('dt_data_ata', 'like', (int) $validated['ano_ata'] . '%'); } if (!empty($validated['vigencia_ata'])) { $query->where('dt_vigencia_ata', 'like', (int) $validated['vigencia_ata'] . '%'); } $atas = $query->paginate(15)->withQueryString(); return [ 'atas' => $atas, 'secretarias' => $secretarias, 'anosAta' => $anosAta, 'vigencias' => $vigencias, 'atasExportJson' => json_encode( $this->mapAtasForCsvExport($atas), JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT | JSON_UNESCAPED_UNICODE ), ]; } /** * @return array<int, array<string, mixed>> */ public function mapAtasForCsvExport(LengthAwarePaginator $atas): array { return collect($atas->items())->map(function (Ata $ata) { return [ 'id_ata' => $ata->id_ata, 'nr_ata' => $ata->nr_ata, 'ds_objeto' => $ata->ds_objeto, 'ds_sigla' => $ata->ds_sigla, 'nr_processo' => $ata->nr_processo, 'dt_data_ata' => $ata->dt_data_ata ? date('d/m/Y', strtotime((string) $ata->dt_data_ata)) : '', 'dt_vigencia_ata' => $ata->dt_vigencia_ata ? date('d/m/Y', strtotime((string) $ata->dt_vigencia_ata)) : '', 'nr_bo' => $ata->nr_bo, 'dt_bo' => $ata->dt_bo ? date('d/m/Y', strtotime((string) $ata->dt_bo)) : '', 'nr_licitacao' => $ata->licitacao->nr_licitacao ?? '', ]; })->values()->all(); } /** * Pesquisa licitações pelo termo informado para autocomplete. * * @return Collection<int, array{id: string, text: string}> */ public function searchLicitacoes(string $term): Collection { $normalizedNumericTerm = preg_replace('/\D+/', '', $term); $termWords = preg_split('/\s+/', mb_strtolower($term), -1, PREG_SPLIT_NO_EMPTY); return Processo::query() ->select(['id', 'nr_licitacao', 'nr_processo', 'ds_objeto']) ->where('tipo_processo', 'licitacao') ->where(function ($query) use ($term, $termWords, $normalizedNumericTerm) { $query->where('nr_licitacao', 'like', "%{$term}%") ->orWhere('nr_processo', 'like', "%{$term}%") ->orWhere('ds_objeto', 'like', "%{$term}%"); if (!empty($normalizedNumericTerm) && mb_strlen($normalizedNumericTerm) >= 2) { $query->orWhereRaw( "REPLACE(REPLACE(REPLACE(REPLACE(nr_licitacao, '/', ''), '.', ''), '-', ''), ' ', '') LIKE ?", ["%{$normalizedNumericTerm}%"] )->orWhereRaw( "REPLACE(REPLACE(REPLACE(REPLACE(nr_processo, '/', ''), '.', ''), '-', ''), ' ', '') LIKE ?", ["%{$normalizedNumericTerm}%"] ); } foreach ($termWords as $word) { if (mb_strlen($word) < 2) { continue; } $query->orWhereRaw('LOWER(ds_objeto) LIKE ?', ["%{$word}%"]); } }) ->orderByDesc('dt_data') ->orderByDesc('id') ->limit(20) ->get() ->map(fn (Processo $licitacao) => [ 'id' => (string) $licitacao->id, 'text' => $this->formatLicitacaoLabel($licitacao), ]) ->values(); } /** * @return array{id: string, text: string}|null */ public function getLicitacaoSelecionada(mixed $id): ?array { if (empty($id)) { return null; } $licitacao = Processo::query() ->select(['id', 'nr_licitacao', 'nr_processo', 'ds_objeto', 'tipo_processo']) ->where('tipo_processo', 'licitacao') ->find($id); if (!$licitacao) { return null; } return [ 'id' => (string) $licitacao->id, 'text' => $this->formatLicitacaoLabel($licitacao), ]; } /** * @return string[] */ public function getSelectedSecretarias(Ata $ata): array { $pivotIds = $ata->secretariasAtas() ->pluck('structures.id') ->map(fn ($value) => (string) $value) ->all(); if (!empty($pivotIds)) { return $pivotIds; } if (!empty($ata->id_secretaria_ata)) { return [(string) $ata->id_secretaria_ata]; } return []; } public function store(AtaRequest $request): RedirectResponse { try { DB::beginTransaction(); $this->service->persistFromPayload( $this->buildPayload($request), (array) $request->input('id_secretaria_ata', []) ); DB::commit(); return redirect() ->route('admin.atas.index', $this->adminFilterParams($request)) ->with('success', __('* Ata cadastrada com sucesso!')); } catch (\Throwable $e) { DB::rollBack(); return redirect() ->back() ->withInput() ->with('error', __('Erro ao cadastrar a ata.') . ' ' . $e->getMessage()); } } public function update(AtaRequest $request, Ata $ata): RedirectResponse { try { DB::beginTransaction(); $this->service->updateFromPayload( $ata, $this->buildPayload($request, $ata), (array) $request->input('id_secretaria_ata', []) ); DB::commit(); return redirect() ->route('admin.atas.index', $this->adminFilterParams($request)) ->with('success', __('* Ata atualizada com sucesso!')); } catch (\Throwable $e) { DB::rollBack(); return redirect() ->back() ->withInput() ->with('error', __('Erro ao atualizar a ata.') . ' ' . $e->getMessage()); } } public function destroy(Request $request, Ata $ata): RedirectResponse { try { DB::beginTransaction(); $this->service->delete($ata); DB::commit(); return redirect() ->route('admin.atas.index', $this->adminFilterParams($request)) ->with('success', __('* Ata excluída com sucesso!')); } catch (\Throwable $e) { DB::rollBack(); return redirect() ->back() ->withInput() ->with('error', __('Erro ao excluir a ata.') . ' ' . $e->getMessage()); } } /** * @return array<string, mixed> */ public function adminFilterParams(Request $request): array { return array_filter( $request->only(self::ADMIN_FILTER_KEYS), fn ($value) => $value !== null && $value !== '' ); } public function formatLicitacaoLabel(Processo $licitacao): string { $label = $licitacao->nr_licitacao ?: ('ID #' . $licitacao->id); if (!empty($licitacao->nr_processo)) { $label .= ' - Processo: ' . $licitacao->nr_processo; } $objeto = trim((string) ($licitacao->ds_objeto ?? '')); if ($objeto !== '') { $label .= ' — ' . Str::limit($objeto, 90); } return $label; } /** * @return array<string, mixed> * * @throws ValidationException */ private function buildPayload(AtaRequest $request, ?Ata $ata = null): array { $validated = $request->validated(); $secretariaIds = collect((array) ($validated['id_secretaria_ata'] ?? [])) ->filter(fn ($v) => !empty($v)) ->map(fn ($v) => (string) $v) ->values() ->all(); $secretariaPrincipalId = $secretariaIds[0] ?? null; $boletim = Boletim::query()->find($validated['id_bo']); $secretarias = Structure::query() ->select(['id', 'abbreviation']) ->whereIn('id', $secretariaIds) ->get(); $dtBo = null; if (!empty($boletim?->publicationDate)) { $dtBo = $boletim->publicationDate instanceof \DateTimeInterface ? $boletim->publicationDate->format('Y-m-d') : Carbon::parse((string) $boletim->publicationDate)->format('Y-m-d'); } $payload = [ 'nr_ata' => $validated['nr_ata'], 'ds_objeto' => $validated['ds_objeto'], 'id_secretaria' => (string) auth()->user()->structure_id, 'nr_processo' => $validated['nr_processo'], 'id_bo' => (string) $validated['id_bo'], 'nr_bo' => (string) ($boletim->number ?? ''), 'dt_bo' => $dtBo, 'ds_link_bo' => (string) ($boletim->url ?? ''), 'id_secretaria_ata' => (string) $secretariaPrincipalId, 'ds_sigla' => (string) $secretarias->pluck('abbreviation')->filter()->implode(', '), 'dt_data_ata' => $validated['dt_data_ata'], 'dt_vigencia_ata' => $validated['dt_vigencia_ata'], 'licitacao_procedimento_id' => $validated['licitacao_procedimento_id'] ?? null, ]; if ($request->hasFile('nm_arquivo_ata') && $request->file('nm_arquivo_ata')->isValid()) { $arquivo = $request->file('nm_arquivo_ata'); $storedPath = FileUploadHelper::processSafeDocumentUploadStorageLink($arquivo, 'atas'); if (!$storedPath) { throw ValidationException::withMessages([ 'nm_arquivo_ata' => __('* O arquivo da ata é inválido ou não é um PDF válido.'), ]); } if ($ata && !empty($ata->nm_arquivo_ata) && !str_starts_with((string) $ata->nm_arquivo_ata, 'http')) { $this->service->deleteStoredFile($ata->nm_arquivo_ata); } $payload['nm_arquivo_ata'] = $storedPath; } elseif ($ata) { $payload['nm_arquivo_ata'] = $ata->nm_arquivo_ata; } return $payload; } }
| ver. 1.4 |
Github
|
.
| PHP 8.3.28 | Generation time: 0.12 |
proxy
|
phpinfo
|
Settings