File manager - Edit - /var/www/html/portal/app/Http/Controllers/CartaServicos/CartaServicosController.php
Back
<?php namespace App\Http\Controllers\CartaServicos; use App\Enums\StatusPermission; use App\Helpers\FileUploadHelper; use App\Http\Controllers\Controller; use App\Models\CartaServicos\CartaServico; use App\Models\CartaServicos\CartaServicoTipo; use App\Models\Structure; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Storage; use Illuminate\View\View; class CartaServicosController extends Controller { public function index(Request $request): View|RedirectResponse { $response = $this->checkPermissao(StatusPermission::GERENCIADOR_DA_CARTA_DE_SERVICOS, 'visualizar'); if ($response instanceof RedirectResponse) { return $response; } $tipos = CartaServicoTipo::query() ->orderBy('tip_descricao') ->get(); $servicos = CartaServico::query() ->when($request->filled('q'), function ($query) use ($request) { $q = trim((string) $request->q); $query->where(function ($subQuery) use ($q) { $subQuery->where('cds_titulo', 'like', "%{$q}%") ->orWhere('cds_descricao', 'like', "%{$q}%"); }); }) ->when($request->filled('tipo_id'), function ($query) use ($request) { $tipoId = (int) $request->tipo_id; $query->where(function ($subQuery) use ($tipoId) { $subQuery->where('categoria_principal_id', $tipoId) ->orWhere('cds_tipo', 'like', "%{$tipoId};%"); }); }) ->orderBy('cds_titulo') ->paginate(15) ->withQueryString(); return view('admin.cartaServicos.index', [ 'tipos' => $tipos, 'servicos' => $servicos, ]); } public function create(): View|RedirectResponse { $response = $this->checkPermissao(StatusPermission::GERENCIADOR_DA_CARTA_DE_SERVICOS, 'adicionar'); if ($response instanceof RedirectResponse) { return $response; } return view('admin.cartaServicos.create', [ 'tipos' => CartaServicoTipo::query()->where('tip_status', 'A')->orderBy('tip_descricao')->get(), 'secretarias' => Structure::query()->where('status', 'ATIVADO')->orderBy('name')->get(['id', 'name', 'abbreviation']), ]); } public function store(Request $request): RedirectResponse { $response = $this->checkPermissao(StatusPermission::GERENCIADOR_DA_CARTA_DE_SERVICOS, 'adicionar'); if ($response instanceof RedirectResponse) { return $response; } $data = $this->validateServico($request); DB::transaction(function () use ($data) { CartaServico::create($data); }); return redirect()->route('admin.cartaServicos.index') ->with('success', __('* Serviço cadastrado com sucesso!')); } public function edit(CartaServico $cartaServico): View|RedirectResponse { $response = $this->checkPermissao(StatusPermission::GERENCIADOR_DA_CARTA_DE_SERVICOS, 'editar'); if ($response instanceof RedirectResponse) { return $response; } return view('admin.cartaServicos.edit', [ 'servico' => $cartaServico, 'tipos' => CartaServicoTipo::query()->where('tip_status', 'A')->orderBy('tip_descricao')->get(), 'secretarias' => Structure::query()->where('status', 'ATIVADO')->orderBy('name')->get(['id', 'name', 'abbreviation']), ]); } public function update(Request $request, CartaServico $cartaServico): RedirectResponse { $response = $this->checkPermissao(StatusPermission::GERENCIADOR_DA_CARTA_DE_SERVICOS, 'editar'); if ($response instanceof RedirectResponse) { return $response; } $data = $this->validateServico($request); DB::transaction(function () use ($cartaServico, $data) { $cartaServico->update($data); }); return redirect()->route('admin.cartaServicos.index', $request->only(['q', 'tipo_id', 'page'])) ->with('success', __('* Serviço atualizado com sucesso!')); } public function destroy(Request $request, CartaServico $cartaServico): RedirectResponse { $response = $this->checkPermissao(StatusPermission::GERENCIADOR_DA_CARTA_DE_SERVICOS, 'excluir'); if ($response instanceof RedirectResponse) { return $response; } DB::transaction(function () use ($cartaServico) { $cartaServico->delete(); }); return redirect()->route('admin.cartaServicos.index', $request->only(['q', 'tipo_id', 'page'])) ->with('success', __('* Serviço excluído com sucesso!')); } public function storeTipo(Request $request): RedirectResponse { $response = $this->checkPermissao(StatusPermission::GERENCIADOR_DA_CARTA_DE_SERVICOS, 'adicionar'); if ($response instanceof RedirectResponse) { return $response; } $request->validate([ 'tip_descricao' => ['required', 'string', 'max:255'], 'tip_foto' => ['nullable', 'image', 'mimes:jpg,jpeg,png,webp', 'max:2048'], 'tip_status' => ['required', 'in:A,I'], ]); $tipFoto = null; if ($request->hasFile('tip_foto')) { $foto = $request->file('tip_foto'); if (!FileUploadHelper::validateFile($foto, ['jpg', 'jpeg', 'png', 'webp'], FileUploadHelper::ALLOWED_IMAGE_MIME_TYPES)) { return redirect()->back()->withInput() ->with('error', __('* A imagem enviada é inválida.')); } $tipFoto = $foto->store('carta-servicos/categorias', 'public'); } CartaServicoTipo::create([ 'tip_descricao' => trim((string) $request->tip_descricao), 'tip_class' => $tipFoto ? 'storage/' . $tipFoto : 'fa-circle', 'tip_status' => $request->tip_status, ]); return redirect()->route('admin.cartaServicos.tipos.create') ->with('success', __('* Categoria criada com sucesso!')); } public function createTipo(): View|RedirectResponse { $response = $this->checkPermissao(StatusPermission::GERENCIADOR_DA_CARTA_DE_SERVICOS, 'adicionar'); if ($response instanceof RedirectResponse) { return $response; } return view('admin.cartaServicos.categorias.create', [ 'tipos' => CartaServicoTipo::query()->orderBy('tip_descricao')->get(), ]); } public function updateTipo(Request $request, CartaServicoTipo $tipo): RedirectResponse { $response = $this->checkPermissao(StatusPermission::GERENCIADOR_DA_CARTA_DE_SERVICOS, 'editar'); if ($response instanceof RedirectResponse) { return $response; } $request->validate([ 'tip_descricao' => ['required', 'string', 'max:255'], 'tip_foto' => ['nullable', 'image', 'mimes:jpg,jpeg,png,webp', 'max:2048'], 'tip_status' => ['required', 'in:A,I'], ]); $tipClass = (string) ($tipo->tip_class ?: 'fa-circle'); if ($request->hasFile('tip_foto')) { $foto = $request->file('tip_foto'); if (!FileUploadHelper::validateFile($foto, ['jpg', 'jpeg', 'png', 'webp'], FileUploadHelper::ALLOWED_IMAGE_MIME_TYPES)) { return redirect()->back()->withInput() ->with('error', __('* A imagem enviada é inválida.')); } $tipFoto = $foto->store('carta-servicos/categorias', 'public'); $tipClass = 'storage/' . $tipFoto; $fotoAntigaPath = $this->getTipoFotoStoragePath((string) $tipo->tip_class); if ($fotoAntigaPath && Storage::disk('public')->exists($fotoAntigaPath)) { Storage::disk('public')->delete($fotoAntigaPath); } } $tipo->update([ 'tip_descricao' => trim((string) $request->tip_descricao), 'tip_class' => $tipClass, 'tip_status' => $request->tip_status, ]); return redirect()->route('admin.cartaServicos.tipos.create') ->with('success', __('* Categoria atualizada com sucesso!')); } public function destroyTipo(CartaServicoTipo $tipo): RedirectResponse { $response = $this->checkPermissao(StatusPermission::GERENCIADOR_DA_CARTA_DE_SERVICOS, 'excluir'); if ($response instanceof RedirectResponse) { return $response; } if (CartaServico::query()->where('categoria_principal_id', $tipo->id_tipo)->exists()) { return redirect()->route('admin.cartaServicos.tipos.create') ->with('error', __('* Não é possível excluir uma categoria que possui serviços vinculados.')); } $fotoPath = $this->getTipoFotoStoragePath((string) $tipo->tip_class); if ($fotoPath && Storage::disk('public')->exists($fotoPath)) { Storage::disk('public')->delete($fotoPath); } $tipo->delete(); return redirect()->route('admin.cartaServicos.tipos.create') ->with('success', __('* Categoria excluída com sucesso!')); } private function validateServico(Request $request): array { $data = $request->validate([ 'cds_secretaria' => ['nullable', 'uuid', 'exists:structures,id'], 'categoria_principal_id' => ['nullable', 'integer', 'exists:carta_servicos_tipos,id_tipo'], 'categoria_ids' => ['nullable', 'array'], 'categoria_ids.*' => ['integer', 'exists:carta_servicos_tipos,id_tipo'], 'cds_titulo' => ['required', 'string', 'max:255'], 'cds_status' => ['required', 'in:1,2,3'], 'cds_setor' => ['nullable', 'string'], 'cds_entrada' => ['nullable', 'string'], 'cds_descricao' => ['nullable', 'string'], 'cds_telefone' => ['nullable', 'string', 'max:120'], 'cds_email' => ['nullable', 'email', 'max:255'], 'cds_quem' => ['nullable', 'string'], 'cds_quando' => ['nullable', 'string'], 'cds_atendimento' => ['nullable', 'string'], 'cds_requisitos' => ['nullable', 'string'], 'cds_prazo' => ['nullable', 'string'], 'cds_taxas' => ['nullable', 'string'], 'cds_legislacao' => ['nullable', 'string'], 'cds_contato' => ['nullable', 'string'], 'cds_etapas' => ['nullable', 'string'], 'cds_obs' => ['nullable', 'string'], 'cds_solicitacao' => ['nullable', 'url', 'max:500'], 'cds_mapa' => ['nullable', 'url', 'max:1000'], ]); $categorias = collect($request->input('categoria_ids', [])) ->map(fn ($id) => (int) $id) ->filter(fn ($id) => $id > 0) ->unique() ->values(); if (empty($data['categoria_principal_id']) && $categorias->isNotEmpty()) { $data['categoria_principal_id'] = $categorias->first(); } if (! empty($data['categoria_principal_id']) && ! $categorias->contains((int) $data['categoria_principal_id'])) { $categorias->prepend((int) $data['categoria_principal_id']); $categorias = $categorias->unique()->values(); } $data['cds_tipo'] = $categorias->isNotEmpty() ? $categorias->implode(';') . ';' : null; return $data; } private function getTipoFotoStoragePath(string $tipClass): ?string { if (! str_starts_with($tipClass, 'storage/')) { return null; } return ltrim(substr($tipClass, 8), '/'); } }
| ver. 1.4 |
Github
|
.
| PHP 8.3.28 | Generation time: 0.02 |
proxy
|
phpinfo
|
Settings