File manager - Edit - /var/www/html/portalHomolog/app/Http/Services/Escolas/EscolaService.php
Back
<?php namespace App\Http\Services\Escolas; use App\Http\Controllers\Controller; use App\Http\Requests\Escolas\EscolasCrechesRequest; use App\Models\Endereco; use App\Models\Escola; use App\Models\Structure; use Illuminate\Database\Eloquent\Collection; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\DB; class EscolaService extends Controller { /** * Retorna lista paginada de escolas com suporte a busca textual. */ public function index(Request $request): LengthAwarePaginator { $paginate = 20; $request->validate([ 'q' => 'nullable|string|max:255', ]); // leftJoin mantido para permitir busca por campos de endereço (cep, logradouro, bairro…). // distinct() evita que uma escola com mais de um endereço histórico apareça duplicada // na listagem, já que select('escolas.*') garante que todas as colunas comparadas // são do mesmo registro. $query = Escola::select('escolas.*') ->with(['pertence', 'endereco']) ->leftJoin('enderecos', 'enderecos.owner_id', '=', 'escolas.id') ->distinct(); if ($request->filled('q')) { $q = trim($request->q); $query->where(function ($sub) use ($q) { $sub->where('escolas.nome', 'like', "%{$q}%") ->orWhere('escolas.telefone', 'like', "%{$q}%") ->orWhere('escolas.email', 'like', "%{$q}%") ->orWhere('enderecos.cep', 'like', "%{$q}%") ->orWhere('enderecos.logradouro', 'like', "%{$q}%") ->orWhere('enderecos.complemento', 'like', "%{$q}%") ->orWhere('enderecos.bairro', 'like', "%{$q}%"); }); $query->orderByDesc('escolas.created_at'); } else { $query->orderBy('escolas.created_at', 'asc'); } return $query->paginate($paginate)->withQueryString(); } /** * Retorna secretarias/órgãos de educação para o select de vínculos. */ public function getSecretarias(): Collection { return Structure::select('id', 'name', 'abbreviation') ->where([ ['status', '=', 'ATIVADO'], ['name', 'like', '%educação%'], ]) ->whereNull('structure_id') ->orderBy('name', 'asc') ->get(); } /** * Retorna escolas ativas filtradas por tipo (para o portal público). * * Sem leftJoin: o JOIN com enderecos duplicava linhas quando uma escola * possui mais de um endereço histórico, causando marcadores e itens de * lista duplicados no mapa público. A ordenação é feita em PHP sobre o * relacionamento já carregado via eager load. */ public function getEscolasAtivasPorTipo(string $tipo): Collection { return Escola::with(['endereco']) ->where('tipoUnidadeEscolar', 'like', "%{$tipo}%") ->where('status', 'ATIVADO') ->get() ->sortBy(fn ($e) => mb_strtolower(optional($e->endereco)->bairro ?? '')) ->values(); } /** * Retorna todas as escolas e creches ativas para a API de dados abertos. */ public function getEscolasPublicasParaApi(): Collection { return Escola::select('escolas.*', 'enderecos.*') ->leftJoin('enderecos', 'enderecos.owner_id', '=', 'escolas.id') ->where('escolas.status', 'ATIVADO') ->orderByDesc('escolas.created_at') ->get(); } /** * Persiste uma nova escola e seu endereço em transação atômica. */ public function store(EscolasCrechesRequest $request, array $escolaData, array $enderecoData): RedirectResponse { try { DB::beginTransaction(); $escola = Escola::create($escolaData); $enderecoData['user_id'] = Auth::id(); $enderecoData['owner_id'] = $escola->id; Endereco::create($enderecoData); DB::commit(); return redirect($this->buildRedirectUrl($request)) ->with('success', __("* A escola {$escolaData['nome']} foi cadastrada com sucesso!")); } catch (\Exception $e) { DB::rollBack(); return redirect() ->back() ->withInput() ->with('error', __('Erro ao tentar cadastrar esta escola. ') . $e->getMessage()); } } /** * Atualiza os dados de uma escola e seu endereço em transação atômica. */ public function update(EscolasCrechesRequest $request, Escola $escola, array $escolaData, array $enderecoData): RedirectResponse { try { DB::beginTransaction(); $escola->update($escolaData); $enderecoData['user_id'] = Auth::id(); $enderecoData['owner_id'] = $escola->id; $endereco = $escola->endereco()->first(); if ($endereco) { $endereco->update($enderecoData); } else { Endereco::create($enderecoData); } DB::commit(); return redirect($this->buildRedirectUrl($request)) ->with('success', __("* A escola {$escolaData['nome']} foi atualizada com sucesso!")); } catch (\Exception $e) { DB::rollBack(); return redirect() ->back() ->withInput() ->with('error', __('Erro ao tentar atualizar esta escola. ') . $e->getMessage()); } } /** * Remove uma escola e seu endereço em transação atômica. */ public function destroy(Request $request, Escola $escola): RedirectResponse { try { DB::beginTransaction(); if ($escola->endereco) { Endereco::destroy($escola->endereco->id); } Escola::destroy($escola->id); DB::commit(); return redirect($this->buildRedirectUrl($request)) ->with('success', __("* A escola {$escola->nome} foi excluída com sucesso! Esta ação não pode ser desfeita!")); } catch (\Exception $e) { DB::rollBack(); return redirect() ->back() ->withInput() ->with('error', __('Erro ao tentar excluir esta escola. ') . $e->getMessage()); } } /** * Altera o status (ATIVADO / DESATIVADO) de uma escola. */ public function status(Request $request, Escola $escola): RedirectResponse { try { DB::beginTransaction(); $escola->fill(['status' => $request->checkStatus]); $escola->save(); DB::commit(); return redirect($this->buildRedirectUrl($request)) ->with('success', __("* O status da escola {$escola->nome} foi alterado com sucesso!")); } catch (\Exception $e) { DB::rollBack(); return redirect() ->back() ->withInput() ->with('error', __('Erro ao tentar alterar o status desta escola. ') . $e->getMessage()); } } /** * Constrói a URL de redirecionamento preservando os filtros e a página atual. */ private function buildRedirectUrl(Request $request): string { $params = []; if ($request->filled('q')) { $params['q'] = $request->q; } $page = (int) $request->input('page', 1); if ($page > 1) { $params['page'] = $page; } $queryString = ! empty($params) ? '?' . http_build_query($params) : ''; return "/admin/escolas{$queryString}"; } }
| ver. 1.4 |
Github
|
.
| PHP 8.3.28 | Generation time: 0.01 |
proxy
|
phpinfo
|
Settings