File manager - Edit - /var/www/html/portalHomolog/app/Http/Controllers/StructureController.php
Back
<?php namespace App\Http\Controllers; use App\Models\Structure; use App\Models\Phone; use App\Models\Link; use App\Models\Html; use App\Http\Requests\StructureRequest; use App\Http\Services\Admin\SecretariaService; use App\Http\Resources\SecretariaResource; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\Http\JsonResponse; use Illuminate\View\View; use Illuminate\Support\Facades\DB; class StructureController extends Controller { private string $permissao = "GERENCIADOR_DE_SECRETARIAS"; public function __construct( private readonly SecretariaService $secretariaService, private readonly SecretariaResource $secretariaResource ) { $this->middleware('secretarias')->except(["getCompetencias", "getSecretario", "getFormacaoAcademica", "menu", "secretarias_dados"]); } /** * Monta menu hierárquico de estruturas * * @param string $structureId * @param string $condition * @return array */ private function __getDesdobramentos(string $structureId, string $condition): array { $desdobramentos = $this->secretariaService->getDesdobramentos($structureId, $condition); $menu = []; foreach ($desdobramentos as $desdobramento) { $menu[] = [ "id" => $desdobramento->id, "nome" => $desdobramento->name, "url" => $desdobramento->slug, "type" => $desdobramento->type ]; } return $menu; } /** * Monta itens do menu NAV do portal com desdobramentos. * Exibe exclusivamente Secretarias e Secretarias Executivas (nenhuma outra entidade). * * @param \Illuminate\Database\Eloquent\Collection $query * @return array */ private function __itemMenu($query): array { $itensMenu = []; foreach ($query as $q) { $itensMenu[] = [ "id" => $q->id, "nome" => $q->name, "url" => $q->slug, "type" => $q->type, "executivas" => $this->__getDesdobramentos($q->id, "SECRETARIA_EXECUTIVA"), "superintendencias" => [], "diretorias" => [], ]; } return count($itensMenu) > 0 ? $itensMenu : []; } /** * Retorna menu de estruturas em JSON (público). * O menu Secretarias no NAV exibe exclusivamente Secretarias e Secretarias Executivas, * independentemente do status de outros órgãos vinculados. Nenhuma outra entidade é apresentada. * * @return JsonResponse */ public function menu(): JsonResponse { // Secretarias principais $secretarias = $this->__itemMenu( $this->secretariaService->getActiveByType("SECRETARIA") ); // Fundações e Autarquias (para o submenu específico no NAV) $autarquias = $this->__itemMenu( $this->secretariaService->getActiveByType("AUTARQUIA") ); $fundacoes = $this->__itemMenu( $this->secretariaService->getActiveByType("FUNDACAO") ); $itensMenu = array_merge($secretarias, $autarquias, $fundacoes); return response()->json($itensMenu, 200); } /** * Retorna estruturas ativas em JSON (endpoint público de dados). * * Expõe apenas estruturas ATIVADAS e um conjunto curado de campos públicos, * evitando vazar registros inativos/rascunho e campos internos * (faleConoscoExtraInfo, html_page_id, news_structure_id, page_content_*). * * @return JsonResponse */ public function secretarias_dados(): JsonResponse { $secretarias = Structure::query() ->where('status', 'ATIVADO') ->orderBy('name', 'asc') ->get([ 'id', 'structure_id', 'type', 'name', 'abbreviation', 'slug', 'address', 'map', 'phoneNumber', 'email1', 'email2', 'email3', 'description', 'pronunciation', 'manager', 'academicBackground', 'skills', 'duties', 'managerPhoto', 'banner', 'openingHours', 'serviceHours', 'instagram', 'facebook', 'twitter', 'order', ]); return response()->json($secretarias, 200); } /** * Exibe a lista de estruturas/secretarias * * @return View|RedirectResponse */ public function index(): View|RedirectResponse { $response = $this->checkPermissao($this->permissao, 'visualizar'); if ($response instanceof RedirectResponse) { return $response; } return view('admin.secretarias.index', [ "gabinetes" => $this->secretariaService->getByTypes(['GABINETE_PREFIETURA', 'GABINETE_VICE_PREFIETURA']), "secretarias" => $this->secretariaService->getByType("SECRETARIA"), "executivas" => $this->secretariaService->getByType("SECRETARIA_EXECUTIVA"), "superintendencias" => $this->secretariaService->getByType("SUPERINTENDENCIA"), "diretorias" => $this->secretariaService->getByType("DIRETORIA"), "departamentos" => $this->secretariaService->getByType("DEPARTAMENTO"), "autarquias" => $this->secretariaService->getByTypes(['FUNDACAO', 'AUTARQUIA']), "totalSecretarias" => $this->secretariaService->countByType("SECRETARIA"), ]); } /** * Exibe o formulário de criação * * @return View|RedirectResponse */ public function create(): View|RedirectResponse { $response = $this->checkPermissao($this->permissao, 'adicionar'); if ($response instanceof RedirectResponse) { return $response; } return view('admin.secretarias.create', [ "secretarias" => $this->secretariaService->getMainStructures() ]); } /** * Armazena uma nova estrutura/secretaria * * @param StructureRequest $request * @return RedirectResponse */ public function store(StructureRequest $request): RedirectResponse { $response = $this->checkPermissao($this->permissao, 'adicionar'); if ($response instanceof RedirectResponse) { return $response; } $request->validated(); return $this->secretariaResource->store($request); } /** * Exibe o formulário de edição * * @param Structure $structure * @return View|RedirectResponse */ public function edit(Structure $structure): View|RedirectResponse { $response = $this->checkPermissao($this->permissao, 'editar'); if ($response instanceof RedirectResponse) { return $response; } $structure->load('endereco'); return view('admin.secretarias.edit', [ "secretaria" => $structure, "secretarias" => $this->secretariaService->getMainStructures(), "htmls" => Html::where("structure_id", $structure->id) ->where("status", "ATIVADO") ->whereIn("display_context", ["ORG_PAGE", "BOTH"]) ->orderBy('order', 'asc') ->orderBy('created_at', 'asc') ->get(), "todasStructures" => Structure::where("status", "ATIVADO") ->orderBy('name', 'asc') ->get(), ]); } /** * Atualiza uma estrutura/secretaria existente * * @param StructureRequest $request * @param Structure $structure * @return RedirectResponse */ public function update(StructureRequest $request, Structure $structure): RedirectResponse { $response = $this->checkPermissao($this->permissao, 'editar'); if ($response instanceof RedirectResponse) { return $response; } $request->validated(); return $this->secretariaResource->update($request, $structure); } /** * Exclui uma estrutura/secretaria * * @param Request $request * @param Structure $structure * @return RedirectResponse */ public function destroy(Request $request, Structure $structure): RedirectResponse { $response = $this->checkPermissao($this->permissao, 'excluir'); if ($response instanceof RedirectResponse) { return $response; } return $this->secretariaResource->destroy($request, $structure); } /** * Atualiza o status de uma estrutura/secretaria * * @param Request $request * @param Structure $structure * @return RedirectResponse */ public function status(Request $request, Structure $structure): RedirectResponse { $response = $this->checkPermissao($this->permissao, 'editar'); if ($response instanceof RedirectResponse) { return $response; } return $this->secretariaResource->updateStatus($request, $structure); } /** * Exibe página pública do secretário * * @param string $slug * @return View */ public function getSecretario(string $slug): View { $secretaria = $this->secretariaService->getBySlug($slug); if (!$secretaria) { abort(404, 'Estrutura não encontrada'); } return view('paginas.secretario', ["secretaria" => $secretaria]); } /** * Exibe página pública de competências e atribuições * * @param string $slug * @return View */ public function getCompetencias(string $slug): View { $secretaria = $this->secretariaService->getBySlug($slug); if (!$secretaria) { abort(404, 'Acesso negado'); } $htmls = Html::where([ ["structure_id", "=", $secretaria->id], ["status", "=", "ATIVADO"] ])->orderBy('created_at', 'asc')->get(); $telefones = Phone::where("structure_id", $secretaria->id) ->orderBy('created_at', 'asc') ->get(); $links = Link::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); // Formata telefones $phones = []; foreach ($telefones as $telefone) { $convertArray = explode(",", $telefone->description); $tels = array_map('trim', $convertArray); $tLink = []; foreach ($tels as $tel) { $tLink[] = [ "numero" => $tel, "link" => "+55" . str_replace(["+55", "-", " ", ")", "("], "", $tel) ]; } $phones[] = [ "telefone" => $telefone->titulo, "numeros" => $tLink ]; } $telefones = $phones; return view('paginas.competencias-e-atribuicoes', compact( 'secretaria', 'telefones', 'links', 'noticias', 'htmls' )); } /** * Exibe página pública de formação acadêmica * * @param string $slug * @return View */ public function getFormacaoAcademica(string $slug): View { $secretaria = $this->secretariaService->getBySlug($slug); if (!$secretaria) { abort(404, 'Acesso negado'); } $htmls = Html::where([ ["structure_id", "=", $secretaria->id], ["status", "=", "ATIVADO"] ])->orderBy('created_at', 'asc')->get(); $telefones = Phone::where("structure_id", $secretaria->id) ->orderBy('created_at', 'asc') ->get(); $links = Link::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); // Formata telefones $phones = []; foreach ($telefones as $telefone) { $convertArray = explode(",", $telefone->description); $tels = array_map('trim', $convertArray); $tLink = []; foreach ($tels as $tel) { $tLink[] = [ "numero" => $tel, "link" => "+55" . str_replace(["+55", "-", " ", ")", "("], "", $tel) ]; } $phones[] = [ "telefone" => $telefone->titulo, "numeros" => $tLink ]; } $telefones = $phones; return view('paginas.formacao-academica', compact( 'secretaria', 'telefones', 'links', 'noticias', 'htmls' )); } }
| ver. 1.4 |
Github
|
.
| PHP 8.3.28 | Generation time: 0.02 |
proxy
|
phpinfo
|
Settings