File manager - Edit - /var/www/html/portal/app/Http/Resources/LegislacaoResource.php
Back
<?php namespace App\Http\Resources; use App\Enums\LegislacaoPortariaStatus; use App\Enums\LegislacaoStatus; use App\Http\Requests\LegislacaoPublicFilterRequest; use App\Models\Legislacao\Legislacao; use App\Models\Legislacao\LegislacaoAutor; use App\Models\Legislacao\LegislacaoAutorCargo; use App\Models\Legislacao\LegislacaoCategoria; use App\Models\Legislacao\LegislacaoPortaria; use App\Models\Legislacao\LegislacaoTipo; use Carbon\Carbon; use Illuminate\Database\Eloquent\Builder; use Illuminate\Http\Request; use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Pagination\Paginator; class LegislacaoResource { /** @var list<string> */ public const ADMIN_FILTER_KEYS = ['q', 'page', 'ano', 'tipo', 'status', 'sort_by', 'sort_dir']; /** @var list<string> */ public const PORTARIA_FILTER_KEYS = ['q', 'page', 'ano', 'status', 'sort_by', 'sort_dir']; /** * Monta os dados da listagem administrativa de legislações. * * @return array<string, mixed> */ public function getAdminIndexViewData(Request $request): array { $aplicarAnoPadrao = count($request->query()) === 0; $anoSelecionado = $request->has('ano') ? $request->input('ano') : ($aplicarAnoPadrao ? (string) now()->year : ''); $query = Legislacao::query() ->with(['tipo', 'autor.cargo', 'boletim', 'retificacoes.boletim']); $this->applyLegislacaoSorting($query, $request); if ($request->filled('q')) { $q = trim((string) $request->input('q')); $query->where(function ($inner) use ($q) { $inner->where('nr_legislacao', 'like', "%{$q}%") ->orWhere('ds_ementa', 'like', "%{$q}%"); }); } if ($request->filled('tipo') && (int) $request->input('tipo') > 0) { $query->where('id_tipo_legislacao', (int) $request->input('tipo')); } if ($request->filled('status') && (int) $request->input('status') > 0) { $query->where('cd_status', (int) $request->input('status')); } if ($anoSelecionado !== null && $anoSelecionado !== '' && (int) $anoSelecionado > 0) { $query->whereYear('dt_publicacao', (int) $anoSelecionado); } $anos = Legislacao::query() ->whereNotNull('dt_publicacao') ->selectRaw('YEAR(dt_publicacao) as y') ->distinct() ->orderByDesc('y') ->pluck('y'); if ($aplicarAnoPadrao || ($anoSelecionado !== '' && ! $anos->contains((int) $anoSelecionado))) { $anos = $anos->prepend((int) $anoSelecionado)->unique()->sortDesc()->values(); } $tipos = LegislacaoTipo::query() ->orderBy('ds_tipo_legislacao') ->get(); $filterParams = $this->adminFilterParams($request, $anoSelecionado); return [ 'legislacoes' => $query->paginate(20)->appends($filterParams), 'anos' => $anos, 'tipos' => $tipos, 'statusOpcoes' => LegislacaoStatus::adminLabels(), 'filterParams' => $filterParams, 'anoSelecionado' => $anoSelecionado, ]; } /** * Monta os dados da listagem administrativa de portarias. * * @return array<string, mixed> */ public function getPortariaIndexViewData(Request $request): array { $anoSelecionado = $request->input('ano', ''); $query = LegislacaoPortaria::query() ->with(['boletim', 'retificacoes.boletim']); $this->applyPortariaSorting($query, $request); if ($request->filled('q')) { $q = trim((string) $request->input('q')); $query->where(function ($inner) use ($q) { $inner->where('nr_portaria', 'like', "%{$q}%") ->orWhere('ds_ementa', 'like', "%{$q}%"); }); } if ($request->filled('status') && (int) $request->input('status') > 0) { $query->where('cd_status', (int) $request->input('status')); } if ($anoSelecionado !== null && $anoSelecionado !== '' && (int) $anoSelecionado > 0) { $query->whereYear('dt_publicacao', (int) $anoSelecionado); } $anos = LegislacaoPortaria::query() ->whereNotNull('dt_publicacao') ->selectRaw('YEAR(dt_publicacao) as y') ->distinct() ->orderByDesc('y') ->pluck('y'); if ($anoSelecionado !== '' && ! $anos->contains((int) $anoSelecionado)) { $anos = $anos->prepend((int) $anoSelecionado)->unique()->sortDesc()->values(); } $filterParams = $this->portariaFilterParams($request, (string) $anoSelecionado); return [ 'portarias' => $query->paginate(20)->appends($filterParams), 'anos' => $anos, 'statusOpcoes' => LegislacaoPortariaStatus::adminLabels(), 'filterParams' => $filterParams, 'anoSelecionado' => $anoSelecionado, ]; } /** * Monta os dados da página pública de legislação. * * @return array<string, mixed> */ public function getPublicPageViewData(LegislacaoPublicFilterRequest $request): array { $validated = $request->validated(); $tipos = LegislacaoTipo::query() ->orderBy('ds_tipo_legislacao') ->get(); $categorias = LegislacaoCategoria::query() ->orderBy('nm_categoria') ->get(); $anos = Legislacao::query() ->where('cd_status', LegislacaoStatus::PUBLICADO->value) ->select('dt_publicacao') ->whereNotNull('dt_publicacao') ->get() ->map(fn ($item) => substr((string) $item->dt_publicacao, 0, 4)) ->merge( LegislacaoPortaria::query() ->where('cd_status', LegislacaoPortariaStatus::PUBLICADO->value) ->whereNotNull('dt_publicacao') ->selectRaw('YEAR(dt_publicacao) as y') ->distinct() ->pluck('y') ) ->filter() ->unique() ->sortDesc() ->values(); $mostrarPortarias = (bool) ($validated['mostrar_portarias'] ?? false); $incluirPortarias = $mostrarPortarias && empty($validated['tipo']) && empty($validated['categoria']); $legislacoesQuery = $this->buildLegislacaoPublicaLegislacoesQuery($validated); if ($incluirPortarias) { $portariasQuery = $this->buildLegislacaoPublicaPortariasQuery($validated); $documentos = collect() ->merge( $legislacoesQuery->get()->map(fn (Legislacao $legislacao) => [ 'kind' => 'legislacao', 'data' => $legislacao, 'sort_at' => $legislacao->dt_publicacao?->format('Y-m-d') ?? '', 'sort_id' => $legislacao->id_legislacao, ]) ) ->merge( $portariasQuery->get()->map(fn (LegislacaoPortaria $portaria) => [ 'kind' => 'portaria', 'data' => $portaria, 'sort_at' => ($portaria->dt_publicacao ?? $portaria->dt_ato)?->format('Y-m-d') ?? '', 'sort_id' => $portaria->id_portaria, ]) ) ->sort(function (array $a, array $b) { $dateCompare = strcmp($b['sort_at'], $a['sort_at']); return $dateCompare !== 0 ? $dateCompare : $b['sort_id'] <=> $a['sort_id']; }) ->values(); $perPage = 15; $page = Paginator::resolveCurrentPage(); $legislacoes = new LengthAwarePaginator( $documentos->slice(($page - 1) * $perPage, $perPage)->values(), $documentos->count(), $perPage, $page, [ 'path' => Paginator::resolveCurrentPath(), 'query' => $request->query(), ] ); } else { $legislacoes = $legislacoesQuery ->paginate(15) ->through(fn (Legislacao $legislacao) => [ 'kind' => 'legislacao', 'data' => $legislacao, ]) ->withQueryString(); } return [ 'legislacoes' => $legislacoes, 'tipos' => $tipos, 'categorias' => $categorias, 'anos' => $anos, 'mostrarPortarias' => $mostrarPortarias, 'legislacaoExportJson' => json_encode( $this->mapLegislacaoPublicaForCsvExport($legislacoes), JSON_HEX_TAG | JSON_HEX_APOS | JSON_HEX_AMP | JSON_HEX_QUOT | JSON_UNESCAPED_UNICODE ), ]; } public function isLegislacaoPubliclyVisible(Legislacao $legislacao): bool { return (int) $legislacao->cd_status === LegislacaoStatus::PUBLICADO->value; } /** * @return array<string, mixed> */ public function getFormData(?Legislacao $legislacao = null): array { $legislacaoVinculos = Legislacao::query() ->with('tipo') ->orderBy('id_tipo_legislacao') ->orderByDesc('nr_legislacao') ->get(); $autoresSancao = LegislacaoAutor::query() ->with('cargo') ->whereHas('cargo', fn ($query) => $query->whereIn('nm_cargo', [ 'Prefeito', 'Prefeito em Exercício', ])) ->orderBy('nm_autor') ->get(); if ($autoresSancao->isEmpty()) { $autoresSancao = LegislacaoAutor::query()->with('cargo')->orderBy('nm_autor')->get(); } return [ 'legislacao' => $legislacao, 'tipos' => LegislacaoTipo::query()->orderBy('ds_tipo_legislacao')->get(), 'autores' => LegislacaoAutor::query()->with('cargo')->orderBy('nm_autor')->get(), 'autoresSancao' => $autoresSancao, 'categorias' => LegislacaoCategoria::query()->orderBy('nm_categoria')->get(), 'legislacaoVinculos' => $legislacaoVinculos, 'podeEditarHtmlAvancado' => (bool) (auth()->user()->getPermissaoDetalhes('SYSADMIN')['visualizar'] ?? false), ]; } /** * @return array<string, mixed> */ public function adminFilterParams(Request $request, ?string $anoSelecionado = null): array { $params = []; foreach (self::ADMIN_FILTER_KEYS as $key) { if ($request->filled($key)) { $params[$key] = $request->input($key); } } if ($request->has('ano')) { if ($request->filled('ano')) { $params['ano'] = $request->input('ano'); } } elseif ($anoSelecionado !== null && $anoSelecionado !== '') { $params['ano'] = $anoSelecionado; } return $params; } /** * @return array<string, mixed> */ public function portariaFilterParams(Request $request, ?string $anoSelecionado = null): array { $params = []; foreach (self::PORTARIA_FILTER_KEYS as $key) { if ($request->filled($key)) { $params[$key] = $request->input($key); } } if ($request->has('ano')) { if ($request->filled('ano')) { $params['ano'] = $request->input('ano'); } } elseif ($anoSelecionado !== null && $anoSelecionado !== '') { $params['ano'] = $anoSelecionado; } return $params; } /** * @return array<string, mixed> */ public function cadastrosRedirectParams(Request $request, string $aba): array { return array_merge(['aba' => $aba], $this->adminFilterParams($request)); } public function canDeleteLegislacaoTipo(LegislacaoTipo $tipo): bool { return ! Legislacao::query()->where('id_tipo_legislacao', $tipo->id_tipo_legislacao)->exists(); } public function canDeleteLegislacaoCategoria(LegislacaoCategoria $categoria): bool { return ! $categoria->legislacoes()->exists(); } public function canDeleteLegislacaoAutorCargo(LegislacaoAutorCargo $cargo): bool { return ! LegislacaoAutor::query()->where('id_cargo', $cargo->id_cargo)->exists(); } public function canDeleteLegislacaoAutor(LegislacaoAutor $autor): bool { return ! Legislacao::query() ->where('id_autor', $autor->id_autor) ->orWhere('id_autor_sancao', $autor->id_autor) ->exists(); } /** * Normaliza ações de legislação antes da persistência. * * @param array<int, array<string, mixed>> $acoes * @return array<int, array{cd_acao:int,id_legislacao_sofre_acao:int}> */ public function normalizeLegislacaoAcoes(Legislacao $legislacao, array $acoes): array { $normalized = []; foreach ($acoes as $acao) { $cd = (int) ($acao['cd_acao'] ?? 0); $alvo = (int) ($acao['id_legislacao_sofre_acao'] ?? 0); if ($cd < 1 || $cd > 4 || $alvo < 1 || $alvo === (int) $legislacao->id_legislacao) { continue; } $normalized[] = [ 'cd_acao' => $cd, 'id_legislacao_sofre_acao' => $alvo, ]; } return $normalized; } /** * Normaliza ações de portaria antes da persistência. * * @param array<int, array<string, mixed>> $acoes * @return array<int, array{cd_acao:int,id_portaria_sofre_acao:int}> */ public function normalizePortariaAcoes(LegislacaoPortaria $portaria, array $acoes): array { $normalized = []; foreach ($acoes as $acao) { $cd = (int) ($acao['cd_acao'] ?? 0); $alvo = (int) ($acao['id_portaria_sofre_acao'] ?? 0); if ($cd < 1 || $cd > 4 || $alvo < 1 || $alvo === (int) $portaria->id_portaria) { continue; } $normalized[] = [ 'cd_acao' => $cd, 'id_portaria_sofre_acao' => $alvo, ]; } return $normalized; } /** * @param array<string, mixed> $filters */ private function buildLegislacaoPublicaLegislacoesQuery(array $filters): Builder { $legislacoes = Legislacao::query() ->with(['tipo', 'autor', 'categorias']) ->where('cd_status', LegislacaoStatus::PUBLICADO->value) ->orderByDesc('dt_publicacao') ->orderByDesc('id_legislacao'); if (! empty($filters['tipo'])) { $legislacoes->where('id_tipo_legislacao', (int) $filters['tipo']); } if (! empty($filters['categoria'])) { $categoriaId = (int) $filters['categoria']; $legislacoes->whereHas('categorias', function ($query) use ($categoriaId) { $query->where('legislacao_categoria.id_categoria', $categoriaId); }); } if (! empty($filters['numero'])) { $numero = trim((string) $filters['numero']); $legislacoes->where('nr_legislacao', 'like', '%' . $numero . '%'); } if (! empty($filters['ano'])) { $legislacoes->where('dt_publicacao', 'like', (int) $filters['ano'] . '%'); } if (! empty($filters['texto'])) { $texto = trim((string) $filters['texto']); $legislacoes->where(function ($query) use ($texto) { $query->where('ds_ementa', 'like', '%' . $texto . '%') ->orWhere('ds_legislacao_original', 'like', '%' . $texto . '%') ->orWhere('ds_legislacao_compilada', 'like', '%' . $texto . '%'); }); } return $legislacoes; } /** * @param array<string, mixed> $filters */ private function buildLegislacaoPublicaPortariasQuery(array $filters): Builder { $portarias = LegislacaoPortaria::query() ->with(['boletim']) ->where('cd_status', LegislacaoPortariaStatus::PUBLICADO->value) ->orderByDesc('dt_publicacao') ->orderByDesc('id_portaria'); if (! empty($filters['numero'])) { $numero = trim((string) $filters['numero']); $portarias->where('nr_portaria', 'like', '%' . $numero . '%'); } if (! empty($filters['ano'])) { $portarias->whereYear('dt_publicacao', (int) $filters['ano']); } if (! empty($filters['texto'])) { $texto = trim((string) $filters['texto']); $portarias->where('ds_ementa', 'like', '%' . $texto . '%'); } return $portarias; } /** * @return array<int, array<string, mixed>> */ public function mapLegislacaoPublicaForCsvExport(LengthAwarePaginator $legislacoes): array { return collect($legislacoes->items())->map(function (array $documento) { $kind = $documento['kind'] ?? 'legislacao'; if ($kind === 'portaria') { /** @var LegislacaoPortaria $portaria */ $portaria = $documento['data']; return [ 'tipo' => __('Portaria'), 'numero' => $portaria->nr_portaria, 'dt_publicacao' => $portaria->dt_publicacao?->format('d/m/Y') ?? '', 'dt_ato' => $portaria->dt_ato?->format('d/m/Y') ?? '', 'ds_ementa' => $portaria->ds_ementa, 'autor' => '', 'categorias' => '', 'url_pdf' => $portaria->boletim?->public_bo_pdf_url ?? '', ]; } /** @var Legislacao $legislacao */ $legislacao = $documento['data']; return [ 'tipo' => $legislacao->tipo->ds_tipo_legislacao ?? '', 'numero' => $legislacao->nr_legislacao, 'dt_publicacao' => $legislacao->dt_publicacao ? Carbon::parse($legislacao->dt_publicacao)->format('d/m/Y') : '', 'dt_ato' => '', 'ds_ementa' => $legislacao->ds_ementa, 'autor' => $legislacao->autor->nm_autor ?? '', 'categorias' => $legislacao->categorias->pluck('nm_categoria')->implode(', '), 'url_pdf' => $legislacao->public_pdf_url ?? '', ]; })->values()->all(); } /** * Aplica ordenação permitida à listagem de legislações. */ public function applyLegislacaoSorting(Builder $query, Request $request): void { $allowed = [ 'tipo' => 'tipo', 'nr_legislacao' => 'nr_legislacao', 'ds_ementa' => 'ds_ementa', 'dt_publicacao' => 'dt_publicacao', 'cd_status' => 'cd_status', ]; $sortBy = (string) $request->input('sort_by', 'dt_publicacao'); if (! array_key_exists($sortBy, $allowed)) { $sortBy = 'dt_publicacao'; } $sortDir = strtolower((string) $request->input('sort_dir', 'desc')); if (! in_array($sortDir, ['asc', 'desc'], true)) { $sortDir = 'desc'; } if ($sortBy === 'tipo') { $query->leftJoin('legislacao_tipo as lt_sort', 'legislacao.id_tipo_legislacao', '=', 'lt_sort.id_tipo_legislacao') ->orderBy('lt_sort.ds_tipo_legislacao', $sortDir) ->select('legislacao.*'); } else { $query->orderBy($allowed[$sortBy], $sortDir); } if ($sortBy === 'dt_publicacao') { $query->orderBy('cd_status')->orderByDesc('nr_legislacao'); } elseif ($sortBy === 'cd_status') { $query->orderByDesc('dt_publicacao')->orderByDesc('nr_legislacao'); } elseif ($sortBy === 'nr_legislacao') { $query->orderByDesc('dt_publicacao')->orderBy('cd_status'); } elseif ($sortBy === 'tipo') { $query->orderByDesc('dt_publicacao')->orderBy('cd_status')->orderByDesc('nr_legislacao'); } else { $query->orderByDesc('dt_publicacao')->orderBy('cd_status')->orderByDesc('nr_legislacao'); } } /** * Aplica ordenação permitida à listagem de portarias. */ public function applyPortariaSorting(Builder $query, Request $request): void { $allowed = [ 'nr_portaria' => 'nr_portaria', 'ds_ementa' => 'ds_ementa', 'dt_publicacao' => 'dt_publicacao', 'cd_status' => 'cd_status', ]; $sortBy = (string) $request->input('sort_by', 'dt_publicacao'); if (! array_key_exists($sortBy, $allowed)) { $sortBy = 'dt_publicacao'; } $sortDir = strtolower((string) $request->input('sort_dir', 'desc')); if (! in_array($sortDir, ['asc', 'desc'], true)) { $sortDir = 'desc'; } $query->orderBy($allowed[$sortBy], $sortDir); if ($sortBy === 'dt_publicacao') { $query->orderBy('cd_status')->orderByDesc('nr_portaria'); } elseif ($sortBy === 'cd_status') { $query->orderByDesc('dt_publicacao')->orderByDesc('nr_portaria'); } elseif ($sortBy === 'nr_portaria') { $query->orderByDesc('dt_publicacao')->orderBy('cd_status'); } else { $query->orderByDesc('dt_publicacao')->orderBy('cd_status')->orderByDesc('nr_portaria'); } } }
| ver. 1.4 |
Github
|
.
| PHP 8.3.28 | Generation time: 0.02 |
proxy
|
phpinfo
|
Settings