File manager - Edit - /var/www/html/portal/app/Http/Controllers/PageController.php
Back
<?php namespace App\Http\Controllers; use App\Models\Html; use App\Models\Comunicacao\Banner; use App\Models\Comunicacao\Noticia; use App\Models\Phone; use App\Models\Link; use App\Models\Comunicacao\Boletim; use App\Http\Services\Comunicacao\BoletimService; use App\Http\Resources\AtaResource; use App\Http\Resources\LegislacaoResource; use App\Http\Requests\AtaPublicFilterRequest; use App\Http\Requests\LegislacaoPublicFilterRequest; use App\Models\Contratos\Contrato; use App\Models\Structure; use App\Models\ConselhosMunicipais\Conselho; use App\Models\LicitacoesProcedimentos\Processo; use App\Models\LicitacoesProcedimentos\ProcessoUpload; use App\Models\Legislacao\Legislacao; use App\Enums\LegislacaoStatus; use App\Http\Services\LicitacaoProcedimentoService; use App\Support\GoogleMapsEmbed; use Illuminate\Http\Request; use App\Models\User; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Storage; use Illuminate\View\View; class PageController extends Controller { public function prefeito() { $prefeito = Structure::where("type", "GABINETE_PREFEITURA")->get(); if (!isset($prefeito[0])) { abort(404); } $secretarias = Structure::where([ ["status", "=", "ATIVADO"] ]) ->whereIn("type", ['GABINETE_PREFEITURA', 'SECRETARIA', 'FUNDACAO', 'AUTARQUIA']) ->orderBy('name', 'ASC')->get(); return view("paginas.prefeito", ['prefeito' => $prefeito[0], "secretarias" => $secretarias]); } public function vicePrefeito() { $vicePrefeito = Structure::where("type", "GABINETE_VICE_PREFEITURA")->get(); if (!isset($vicePrefeito[0])) { abort(404); } $secretarias = Structure::where([ ["status", "=", "ATIVADO"] ]) ->whereIn("type", ['GABINETE_PREFEITURA', 'GABINETE_VICE_PREFEITURA', 'SECRETARIA', 'FUNDACAO', 'AUTARQUIA']) ->orderBy('name', 'ASC')->get(); return view("paginas.vice-prefeito", ['vicePrefeito' => $vicePrefeito[0], "secretarias" => $secretarias]); } public function home(Request $request) { $bannersSection1 = Banner::where([ ["section", "=", "SECTION_1"], ["status", "=", "ATIVADO"], ])->orderBy('order', 'ASC')->get(); $bannersSection2 = Banner::where([ ["section", "=", "SECTION_2"], ["status", "=", "ATIVADO"], ])->orderBy('order', 'ASC')->get(); $bannersSection3 = Banner::where([ ["section", "=", "SECTION_3"], ["status", "=", "ATIVADO"], ])->orderBy('order', 'ASC')->get(); // Busca notícia em destaque (fix = 1). Pode não existir. $destaque = Noticia::where([ ["fix", "=", 1], ["status", "=", "ATIVADO"], ])->orderBy('created_at', 'DESC') ->first(); // Se ainda não existe destaque, tenta definir a notícia mais recente como fix. if (!$destaque) { try { DB::beginTransaction(); $news = Noticia::where([ ["status", "=", "ATIVADO"] ])->orderBy('created_at', 'DESC') ->first(); if ($news) { $news->update(["fix" => 1]); $destaque = $news; } DB::commit(); } catch (\Exception $e) { DB::rollBack(); // Se algo der errado, apenas segue sem destaque. $destaque = null; } } $noticias = Noticia::where([ [ "status", "=", "ATIVADO" ] ])->where("fix", "!=", 1) ->orderBy('created_at', 'DESC') ->skip(0)->take(7) ->get(); return view('paginas.home', compact([ 'noticias', 'destaque', 'bannersSection1', 'bannersSection2', 'bannersSection3', ])); } public function boletimOficial(Request $request) { $noticias = Noticia::where([ ["status", "=", "ATIVADO"], ["fix", "!=", 1], ]) ->orderBy('created_at', 'DESC') ->skip(0)->take(7) ->get(); $BoletimService = new BoletimService(); $boletins = $BoletimService->index($request); return view("paginas.boletim-oficial", compact(['noticias', 'boletins'])); } public function boletimOficialAjax(Request $request) { $BoletimService = new BoletimService(); $boletins = $BoletimService->index($request); return view("paginas.boletim-oficial-ajax", compact(['boletins'])); } public function licitacoesAtas(AtaPublicFilterRequest $request, AtaResource $ataResource): View { return view('paginas.licitacoes_atas', $ataResource->getPublicPageViewData($request)); } public function licitacaoProcedimentoDetalhe(int $id) { $licitacao = Processo::query() ->with('uploads') ->findOrFail($id); return view('paginas.licitacoes-e-procedimentos-detalhe', compact('licitacao')); } public function licitacaoProcedimentoDownloadUpload(Processo $licitacao, ProcessoUpload $upload) { if ((int) $upload->licitacao_procedimento_id !== (int) $licitacao->id) { return redirect()->back()->with('error', __('Arquivo inválido para este registro.')); } $path = trim((string) $upload->ds_arquivo); $path = str_replace('\\', '/', $path); $urlPath = parse_url($path, PHP_URL_PATH); if (is_string($urlPath) && $urlPath !== '') { $path = $urlPath; } $path = ltrim(rawurldecode($path), '/'); $candidates = []; $candidates[] = $path; if (str_starts_with($path, 'pmar/assets/img/')) { $candidates[] = substr($path, strlen('pmar/assets/img/')); } if (str_starts_with($path, LicitacaoProcedimentoService::UPLOAD_PUBLIC_PREFIX . '/')) { $fileName = basename($path); $candidates[] = 'licitacoes_procedimentos/' . $fileName; $candidates[] = $fileName; } $candidates[] = basename($path); $candidates = array_values(array_unique(array_filter($candidates))); foreach ($candidates as $relative) { if (!Storage::disk('public')->exists($relative)) { continue; } $upload->increment('qt_cliques'); return Storage::disk('public')->download($relative, basename($relative)); } $fallbackDir = LicitacaoProcedimentoService::physicalUploadStorageDir(); foreach ($candidates as $relative) { $fallback = $fallbackDir . DIRECTORY_SEPARATOR . str_replace('/', DIRECTORY_SEPARATOR, $relative); if (!is_file($fallback)) { continue; } $upload->increment('qt_cliques'); return response()->download($fallback, basename($fallback)); } $publicUrl = LicitacaoProcedimentoService::resolveUploadPublicUrl($upload->ds_arquivo); if (!empty($publicUrl)) { $upload->increment('qt_cliques'); // Evita 404 em ambiente local quando o registro é legado do SAPO. if (str_contains($publicUrl, '/pmar/assets/img/licitacoes_procedimentos/')) { $legacyFileName = basename($path); if ($legacyFileName !== '') { return redirect()->away( LicitacaoProcedimentoService::LEGACY_UPLOAD_BASE_URL . rawurlencode($legacyFileName) ); } } return redirect()->to($publicUrl); } $legacyFileName = basename($path); if ($legacyFileName !== '') { $upload->increment('qt_cliques'); return redirect()->away( LicitacaoProcedimentoService::LEGACY_UPLOAD_BASE_URL . rawurlencode($legacyFileName) ); } return redirect()->back()->with('error', __('Arquivo não encontrado.')); } public function legislacaoPublica(LegislacaoPublicFilterRequest $request, LegislacaoResource $legislacaoResource): View { return view('paginas.legislacao-publica', $legislacaoResource->getPublicPageViewData($request)); } /** * Página pública de detalhe de uma legislação (rota nomeada paginas.legislacao.detalhe). */ public function legislacaoPublicaShow(Legislacao $legislacao, LegislacaoResource $legislacaoResource): View|\Illuminate\Http\RedirectResponse { if (! $legislacaoResource->isLegislacaoPubliclyVisible($legislacao)) { abort(404); } $legislacao->load([ 'tipo', 'autor', 'autorSancao', 'boletim', 'categorias', 'retificacoes.boletim', 'acoes.legislacaoSofreAcao.tipo', ]); return view('paginas.legislacao-detalhe', compact('legislacao')); } /** * Redireciona URLs antigas (lei.asp) para a rota atual de legislação. */ public function legislacaoLegacyAsp(Request $request) { $raw = $request->query('id') ?? $request->query('id_legislacao') ?? $request->query('codigo') ?? $request->query('cod'); if ($raw !== null && $raw !== '' && is_numeric($raw)) { $leg = Legislacao::query() ->where('id_legislacao', (int) $raw) ->where('cd_status', LegislacaoStatus::PUBLICADO->value) ->first(); if ($leg !== null) { return redirect()->route('paginas.legislacao.detalhe', $leg, 301); } } return redirect()->route('paginas.legislacao', [], 301); } public function contratoDetalhe(string $id) { $contrato = Contrato::query() ->with(['favorecido', 'secretaria', 'secretariaGestora', 'arquivos', 'licitacao']) ->findOrFail($id); return view('paginas.contratos-detalhe', compact('contrato')); } public function details($slug, $slug2 = null) { $secretaria = Structure::select("*")->where([ ["slug", "=", ($slug2 == null) ? $slug : $slug2], ["status", "=", "ATIVADO"] ])->orderBy('name', 'asc')->first(); if (!isset($secretaria)) { abort(404, 'Acesso negado'); } $htmls = Html::where([ ["structure_id", "=", $secretaria->id], ["visibility", "=", "ATIVADO"] ])->orderBy('created_at', 'asc')->get(); $telefones = $this->buildTelefonesSidebar($secretaria); $newsSourceId = $secretaria->news_structure_id ?: $secretaria->id; $noticias = DB::table('news') ->leftJoin('news_rel_structures', 'news_rel_structures.news_id', '=', 'news.id') ->select("news.*") ->orderBy('news.created_at', 'DESC') ->where([["news_rel_structures.structure_id", $newsSourceId]]) ->paginate(15); $links = Link::where("structure_id", $secretaria->id)->orderBy('order', 'asc')->get(); if ($secretaria == null) { return redirect("/"); } $pageContentType = $secretaria->page_content_type ?? 'NOTICIAS'; $htmlPageContent = ''; if (in_array($pageContentType, ['HTML', 'HTML_NOTICIAS']) && $secretaria->html_page_id) { $htmlPage = Html::where('id', $secretaria->html_page_id) ->where('status', 'ATIVADO') ->whereIn('display_context', ['ORG_PAGE', 'BOTH']) ->first(); if ($htmlPage) { $htmlPageContent = $htmlPage->code ?? ''; } } return view('paginas.details', compact(['secretaria', 'telefones', 'links', 'noticias', 'htmls', 'pageContentType', 'htmlPageContent'])); } /** * Página pública "Fale conosco" do órgão (endereço, mapa, Fala.BR). * Mesma resolução de slug que {@see self::details()}. */ public function orgaoFaleConosco(string $slug, ?string $slug2 = null): View { $secretaria = Structure::query() ->with(['pertence', 'endereco']) ->where('slug', '=', $slug2 === null ? $slug : $slug2) ->where('status', '=', 'ATIVADO') ->orderBy('name', 'asc') ->first(); if (! isset($secretaria)) { abort(404, 'Acesso negado'); } $telefones = $this->buildTelefonesSidebar($secretaria); $links = Link::where('structure_id', $secretaria->id)->orderBy('order', 'asc')->get(); $mapEmbedSrc = GoogleMapsEmbed::embedSrc($secretaria->map); $falabrManifestacaoTypes = config('falabr_angra.manifestacao_types', []); $ouvidoriaInfoUrl = (string) config('falabr_angra.ouvidoria_info_url', 'https://transparencia.angra.rj.gov.br/ouvidoria'); return view('paginas.orgao-fale-conosco', compact( 'secretaria', 'telefones', 'links', 'mapEmbedSrc', 'falabrManifestacaoTypes', 'ouvidoriaInfoUrl' )); } /** * Telefones do órgão formatados para o card lateral (mesmo formato usado nas views de secretaria). * * @return array<int, array{telefone: string, numeros: array<int, array{numero: string, link: string}>}> */ private function buildTelefonesSidebar(Structure $secretaria): array { $telefoneRows = Phone::where('structure_id', $secretaria->id)->orderBy('created_at', 'asc')->get(); $phones = []; foreach ($telefoneRows as $telefone) { $convertArray = explode(',', $telefone->description ?? ''); $tels = array_map('trim', $convertArray); $tLink = []; foreach ($tels as $tel) { $tLink[] = [ 'numero' => $tel, 'link' => '+55'.str_replace('+55', '', str_replace('-', '', str_replace(' ', '', str_replace(')', '', str_replace('(', '', $tel))))), ]; } $phones[] = ['telefone' => $telefone->titulo, 'numeros' => $tLink]; } return $phones; } /** * Display a listing of the resource. */ public function paginasHTML($slug) { $html = Html::where("slug", $slug) ->with(['menuLinks', 'reusableMenu.menuLinks']) ->first(); if (!$html || ($html->status ?? 'ATIVADO') !== 'ATIVADO' || ($html->display_context ?? 'BOTH') === 'ORG_PAGE') { abort(404); } $viewContent = $html->code ?? ''; $secretaria = null; if (!empty($html->structure_id)) { $secretaria = Structure::select("*")->where([ ["id", "=", $html->structure_id], ["status", "=", "ATIVADO"] ])->orderBy('name', 'asc')->first(); } if (!$secretaria) { $secretaria = Structure::select("*")->where([ ["type", "=", "GABINETE_PREFEITURA"], ["status", "=", "ATIVADO"] ])->orderBy('name', 'asc')->first(); } if (!$secretaria) { return redirect("/"); } $htmls = Html::where([ ["structure_id", "=", $secretaria->id], ["visibility", "=", "ATIVADO"] ]) ->whereNotIn("slug", [$slug]) ->orderBy('created_at', 'asc') ->get(); $telefones = Phone::where("structure_id", $secretaria->id)->orderBy('created_at', 'asc')->get(); $noticias = DB::table('news') ->leftJoin('news_rel_structures', 'news_rel_structures.news_id', '=', 'news.id') ->select("news.*") ->orderBy('news.created_at', 'DESC') ->where([["news_rel_structures.structure_id", $secretaria->id]]) ->paginate(15); $phones = []; foreach ($telefones as $telefone) { $convertArray = explode(",", $telefone->description); $tels = array_map('trim', $convertArray); $tLink = null; foreach ($tels as $tel) { $tLink[] = ["numero" => $tel, "link" => "+55" . str_replace("+55", "", str_replace("-", "", str_replace(" ", "", str_replace(")", "", str_replace("(", "", $tel)))))]; } $phones[] = ["telefone" => $telefone->titulo, "numeros" => $tLink]; } $telefones = $phones; $links = Link::where("structure_id", $secretaria->id)->orderBy('order', 'asc')->get(); $custom_menu_links = collect(); // Regra de prioridade: // 1) Se o menu personalizado estiver ativado, ele tem precedência e o reutilizável não aparece. // 2) Se não houver menu personalizado ativado, então tenta renderizar o menu reutilizável (se estiver ATIVADO). if ($html->custom_menu_enabled) { $custom_menu_links = $html->menuLinks; } elseif (!empty($html->reusable_menu_id) && $html->reusableMenu?->status === 'ATIVADO') { $custom_menu_links = $html->reusableMenu->menuLinks; } if ($secretaria == null) { return redirect("/"); } return view("paginas.html", compact(['html', 'secretaria', 'telefones', 'noticias', 'links', 'htmls', 'viewContent', 'custom_menu_links'])); } public function conselhosMunicipais() { $conselhos = Conselho::with(['endereco', 'pertence']) ->orderBy('nome', 'asc') ->get(); return view('paginas.conselhos-municipais', compact('conselhos')); } public function conselhosDetails($slug) { // Busca o conselho com relacionamentos $conselho = Conselho::with(['endereco', 'arquivos']) ->where('slug', $slug) ->where('status', 'like', '%ATIVADO%') ->firstOrFail(); // Lista fixa de tipos de arquivo $tipos = [ "Ata de sessão extraordinária", "Ata de sessão ordinária", "Carta Aberta", "Comunicado", "Convocação", "Decreto", "Deliberação", "Edital", "Legislação", "Memorando", "Moção", "Ofício", "Parecer", "Plano de Ação", "Portaria", "Recomendação", "Regimento Interno", "Relatório", "Resolução", ]; sort($tipos); // Monta array associativo com os arquivos por tipo $arquivosPorTipo = []; foreach ($tipos as $tipo) { $arquivosPorTipo[$tipo] = $conselho->arquivos() ->where('tipo', $tipo) ->where('status', 'ATIVADO') ->orderBy('tipo', 'asc') ->orderBy('evento_at', 'desc') ->get(); } return view('paginas.conselho-detalhes', [ 'conselho' => $conselho, 'tipos' => $arquivosPorTipo ]); } }
| ver. 1.4 |
Github
|
.
| PHP 8.3.28 | Generation time: 0.11 |
proxy
|
phpinfo
|
Settings