File manager - Edit - /var/www/html/portalHomolog/app/Http/Controllers/Demandas/DemandaController.php
Back
<?php namespace App\Http\Controllers\Demandas; use App\Http\Controllers\Controller; use App\Http\Requests\Demandas\DemandaAnexoRequest; use App\Http\Requests\Demandas\DemandaDestinatarioRequest; use App\Http\Requests\Demandas\DemandaDestinatarioStatusRequest; use App\Http\Requests\Demandas\DemandaInteragirRequest; use App\Http\Requests\Demandas\DemandaMoverStatusRequest; use App\Http\Requests\Demandas\DemandaRequest; use App\Http\Requests\Demandas\DemandaSubtarefaRequest; use App\Http\Resources\Demandas\DemandaResource; use App\Models\Demandas\Demanda; use App\Models\Demandas\DemandaAnexo; use App\Models\Demandas\DemandaSubtarefa; use Illuminate\Http\JsonResponse; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Storage; use Illuminate\Validation\ValidationException; use Illuminate\View\View; use Symfony\Component\HttpFoundation\StreamedResponse; class DemandaController extends Controller { private string $permissao = 'GERENCIADOR_DEMANDAS'; private const MODULOS = ['geral', 'ti']; public function __construct(private readonly DemandaResource $resource) {} private function findDemanda(string $id): Demanda { return Demanda::whereIn('modulo', self::MODULOS)->findOrFail($id); } private function demandaFechada(Demanda $demanda): bool { return in_array($demanda->status, ['atendido', 'cancelado']); } private function servirAnexo(string $demanda, int $anexo, bool $inline): StreamedResponse|RedirectResponse { $model = DemandaAnexo::where('demanda_id', $demanda)->findOrFail($anexo); if (!Storage::disk('public')->exists($model->caminho)) { return redirect()->route('admin.demandas.show', $demanda) ->with('error', __('Arquivo não encontrado.')); } return $inline ? Storage::disk('public')->response($model->caminho, $model->nome_original, [ 'Content-Disposition' => 'inline; filename="' . addslashes($model->nome_original) . '"', ]) : Storage::disk('public')->download($model->caminho, $model->nome_original); } public function dashboard(): View|RedirectResponse { $response = $this->checkPermissao($this->permissao, 'visualizar'); if ($response instanceof RedirectResponse) return $response; return view('admin.demandas.dashboard', $this->resource->dashboardData(Auth::user(), $this->permissao)); } public function index(Request $request): View|RedirectResponse { $response = $this->checkPermissao($this->permissao, 'visualizar'); if ($response instanceof RedirectResponse) return $response; $user = Auth::user(); $layout = in_array($request->get('layout'), ['lista', 'colunas']) ? $request->get('layout') : session('demandas.layout', 'lista'); $aba = $request->get('aba', session('demandas.aba', 'unidade')); $filters = $request->only(['busca', 'status', 'prioridade']); session([ 'demandas.aba' => $aba, 'demandas.layout' => $aba !== 'diretoria' ? $layout : session('demandas.layout', 'lista'), ]); return view('admin.demandas.index', $this->resource->indexData($user, $filters, $aba, $layout, $this->permissao)); } public function create(): View|RedirectResponse { $response = $this->checkPermissao($this->permissao, 'adicionar'); if ($response instanceof RedirectResponse) return $response; return view('admin.demandas.create', $this->resource->formData(Auth::user())); } public function show(string $demanda): View|RedirectResponse { $response = $this->checkPermissao($this->permissao, 'visualizar'); if ($response instanceof RedirectResponse) return $response; $model = Demanda::with([ 'logs.autor', 'logs.anexos', 'solicitante', 'unidade', 'secretaria', 'destinatarios.unidade', 'destinatarios.responsavel', 'subtarefas.unidade', 'subtarefas.responsavel', 'subtarefas.conclusor', 'anexos.autor', 'tiDetalhe.setor', 'tiDetalhe.assunto', 'tiDetalhe.subassunto', 'tiDetalhe.cliente', 'equipamentos.unidade', 'equipamentos.responsavel', 'licencas.unidade', 'licencas.usuario', ])->whereIn('modulo', self::MODULOS)->findOrFail($demanda); $user = Auth::user(); $permAtivos = $user->permissoes->pluck('permissao')->contains('GERENCIADOR_DE_ATIVOS_TI'); return view('admin.demandas.show', $this->resource->showData($model, $user, $this->permissao) + ['permAtivos' => $permAtivos]); } public function store(DemandaRequest $request): RedirectResponse { $response = $this->checkPermissao($this->permissao, 'adicionar'); if ($response instanceof RedirectResponse) return $response; $user = Auth::user(); $unidadeId = $user->unidades()->value('unidades_organizacionais.id'); if (!$unidadeId) { return redirect()->back() ->with('error', __('Você não possui uma unidade organizacional associada. Solicite ao administrador.')); } $dados = $request->validated(); $dados['unidade_organizacional_id'] = $unidadeId; $dados['user_id'] = $user->id; $demanda = $this->resource->criar($dados, $user); if ($request->hasFile('anexos')) { try { $this->resource->salvarAnexos($demanda, $request->file('anexos'), $user); } catch (ValidationException $e) { return redirect()->route('admin.demandas.show', $demanda->id) ->withErrors($e->errors()) ->with('warning', __('Demanda criada, mas um ou mais arquivos foram rejeitados por segurança.')); } } return redirect()->route('admin.demandas.show', $demanda->id) ->with('success', __('Demanda criada com sucesso.')); } public function update(DemandaRequest $request, string $demanda): RedirectResponse { $response = $this->checkPermissao($this->permissao, 'editar'); if ($response instanceof RedirectResponse) return $response; $model = $this->findDemanda($demanda); if ($this->demandaFechada($model)) { return redirect()->route('admin.demandas.show', $demanda) ->with('error', __('Esta demanda está encerrada. Reabra-a antes de editar.')); } $podeEditar = Auth::id() === $model->user_id || $model->destinatarios()->where('tipo', 'usuario')->where('responsavel_id', Auth::id())->exists(); if (!$podeEditar) { return redirect()->route('admin.demandas.show', $demanda) ->with('error', __('Apenas o criador ou o responsável pode editar esta demanda.')); } $this->resource->atualizar($model, $request->validated(), Auth::user()); if ($request->hasFile('anexos')) { try { $this->resource->salvarAnexos($model, $request->file('anexos'), Auth::user()); } catch (ValidationException $e) { return redirect()->route('admin.demandas.show', $demanda) ->withErrors($e->errors()) ->with('warning', __('Demanda salva, mas um ou mais arquivos foram rejeitados por segurança.')); } } return redirect()->route('admin.demandas.show', $demanda) ->with('success', __('Demanda atualizada com sucesso.')); } public function moverStatus(DemandaMoverStatusRequest $request, string $demanda): RedirectResponse|JsonResponse { $response = $this->checkPermissao($this->permissao, 'visualizar'); if ($response instanceof RedirectResponse) return $response; $model = $this->findDemanda($demanda); $user = Auth::user(); $permissoes = $user->permissoes->pluck('permissao'); $podeAlterar = $user->id === $model->user_id || $permissoes->contains('DEMANDAS_SECRETARIA') || $model->destinatarios()->where('tipo', 'usuario')->where('responsavel_id', $user->id)->exists(); if (!$podeAlterar) { if ($request->expectsJson() || $request->ajax()) { return response()->json(['ok' => false, 'message' => __('Apenas o criador pode alterar o status da demanda.')], 403); } return redirect()->route('admin.demandas.show', $demanda) ->with('error', __('Apenas o criador pode alterar o status da demanda.')); } $this->resource->moverStatus($model, $request->input('status'), $user); if ($request->expectsJson() || $request->ajax()) { return response()->json(['ok' => true, 'message' => __('Status atualizado.')]); } return redirect()->route('admin.demandas.show', $demanda)->with('success', __('Status atualizado.')); } public function interagir(DemandaInteragirRequest $request, string $demanda): RedirectResponse { $response = $this->checkPermissao($this->permissao, 'adicionar'); if ($response instanceof RedirectResponse) return $response; $model = $this->findDemanda($demanda); if ($this->demandaFechada($model)) { return redirect()->route('admin.demandas.show', $demanda) ->with('error', __('Esta demanda está encerrada. Reabra-a para interagir.')); } try { $this->resource->interagir( $model, $request->input('tipo'), $request->input('conteudo'), Auth::user(), $request->file('anexos') ?? [] ); } catch (ValidationException $e) { return redirect()->route('admin.demandas.show', $demanda) ->withErrors($e->errors()) ->with('warning', __('Registrado, mas um ou mais arquivos foram rejeitados por segurança.')); } return redirect()->route('admin.demandas.show', $demanda) ->with('success', __('Registrado com sucesso.')); } public function destinatarioStore(DemandaDestinatarioRequest $request, string $demanda): RedirectResponse { $response = $this->checkPermissao($this->permissao, 'editar'); if ($response instanceof RedirectResponse) return $response; $model = $this->findDemanda($demanda); if ($this->demandaFechada($model)) { return redirect()->route('admin.demandas.show', $demanda) ->with('error', __('Esta demanda está encerrada.')); } $tipo = $request->input('tipo'); $id = $tipo === 'unidade' ? $request->input('unidade_id') : $request->input('responsavel_id'); $this->resource->adicionarDestinatario($model, $tipo, $id, Auth::user()); return redirect()->route('admin.demandas.show', $demanda) ->with('success', __('Destinatário adicionado.')); } public function destinatarioDestroy(string $demanda, int $destinatario): RedirectResponse { $response = $this->checkPermissao($this->permissao, 'editar'); if ($response instanceof RedirectResponse) return $response; $model = $this->findDemanda($demanda); if ($this->demandaFechada($model)) { return redirect()->route('admin.demandas.show', $demanda) ->with('error', __('Esta demanda está encerrada.')); } if (Auth::id() !== $model->user_id) { return redirect()->route('admin.demandas.show', $demanda) ->with('error', __('Apenas o criador da demanda pode remover responsáveis.')); } $this->resource->removerDestinatario($model, $destinatario, Auth::user()); return redirect()->route('admin.demandas.show', $demanda) ->with('success', __('Destinatário removido.')); } public function destinatarioStatus(DemandaDestinatarioStatusRequest $request, string $demanda, string $destinatario): JsonResponse|RedirectResponse { $response = $this->checkPermissao($this->permissao, 'visualizar'); if ($response instanceof RedirectResponse) return $response; $model = $this->findDemanda($demanda); $dest = $model->destinatarios()->findOrFail($destinatario); $podeEditar = (bool) (Auth::user()->getPermissaoDetalhes($this->permissao)['editar'] ?? false); if ($dest->responsavel_id !== Auth::id() && !$podeEditar) { return redirect()->route('admin.demandas.show', $demanda) ->with('error', __('Você não é o responsável por este encaminhamento.')); } $this->resource->atualizarStatusDestinatario($model, $dest, $request->input('status'), Auth::user()); if ($request->expectsJson() || $request->ajax()) { return response()->json(['ok' => true, 'message' => __('Status atualizado.')]); } return redirect()->route('admin.demandas.show', $demanda)->with('success', __('Status atualizado.')); } public function aceitarDestinatario(Request $request, string $demanda, string $destinatario): RedirectResponse { $response = $this->checkPermissao($this->permissao, 'editar'); if ($response instanceof RedirectResponse) return $response; $model = $this->findDemanda($demanda); $user = Auth::user(); $userUnidades = $user->unidades()->pluck('unidades_organizacionais.id'); $dest = $model->destinatarios()->findOrFail($destinatario); if ($dest->tipo !== 'unidade' || $dest->responsavel_id || !$userUnidades->contains($dest->unidade_id)) { return redirect()->route('admin.demandas.show', $demanda) ->with('error', __('Você não pode aceitar esta demanda.')); } $this->resource->aceitarDestinatario($model, $dest, $user); return redirect()->route('admin.demandas.show', $demanda) ->with('success', __('Demanda aceita com sucesso.')); } public function subtarefaStore(DemandaSubtarefaRequest $request, string $demanda): RedirectResponse { $response = $this->checkPermissao($this->permissao, 'adicionar'); if ($response instanceof RedirectResponse) return $response; $model = $this->findDemanda($demanda); if ($this->demandaFechada($model)) { return redirect()->route('admin.demandas.show', $demanda) ->with('error', __('Esta demanda está encerrada.')); } $this->resource->criarSubtarefa( $model, $request->input('titulo'), $request->input('unidade_id'), $request->input('responsavel_id') ); return redirect()->route('admin.demandas.show', $demanda); } public function subtarefaToggle(Request $request, string $demanda, int $subtarefa): JsonResponse|RedirectResponse { $response = $this->checkPermissao($this->permissao, 'adicionar'); if ($response instanceof RedirectResponse) return $response; $demandaModel = $this->findDemanda($demanda); if ($this->demandaFechada($demandaModel)) { if ($request->expectsJson() || $request->ajax()) { return response()->json(['ok' => false, 'message' => __('Esta demanda está encerrada.')], 403); } return redirect()->route('admin.demandas.show', $demanda) ->with('error', __('Esta demanda está encerrada.')); } $sub = DemandaSubtarefa::where('demanda_id', $demanda)->findOrFail($subtarefa); $user = Auth::user(); if ($sub->unidade_id || $sub->responsavel_id) { $userUnidades = $user->unidades()->pluck('unidades_organizacionais.id'); $temAcesso = ($sub->unidade_id && $userUnidades->contains($sub->unidade_id)) || ($sub->responsavel_id && $sub->responsavel_id === $user->id); if (!$temAcesso) { if ($request->expectsJson() || $request->ajax()) { return response()->json(['ok' => false, 'message' => __('Sem permissão para esta subtarefa.')], 403); } return redirect()->route('admin.demandas.show', $demanda) ->with('error', __('Apenas o responsável ou membros da unidade podem concluir esta subtarefa.')); } } $result = $this->resource->toggleSubtarefa($sub, $user); if ($request->expectsJson() || $request->ajax()) { return response()->json(['ok' => true, ...$result]); } return redirect()->route('admin.demandas.show', $demanda); } public function subtarefaDestroy(string $demanda, int $subtarefa): RedirectResponse { $response = $this->checkPermissao($this->permissao, 'editar'); if ($response instanceof RedirectResponse) return $response; $sub = DemandaSubtarefa::where('demanda_id', $demanda)->findOrFail($subtarefa); $this->resource->removerSubtarefa($sub); return redirect()->route('admin.demandas.show', $demanda); } public function anexoStore(DemandaAnexoRequest $request, string $demanda): RedirectResponse { $response = $this->checkPermissao($this->permissao, 'adicionar'); if ($response instanceof RedirectResponse) return $response; $model = $this->findDemanda($demanda); if ($this->demandaFechada($model)) { return redirect()->route('admin.demandas.show', $demanda) ->with('error', __('Esta demanda está encerrada.')); } try { $this->resource->salvarAnexos($model, $request->file('anexos'), Auth::user()); } catch (ValidationException $e) { return redirect()->route('admin.demandas.show', $demanda) ->withErrors($e->errors()) ->with('error', __('Um ou mais arquivos foram rejeitados por segurança.')); } return redirect()->route('admin.demandas.show', $demanda) ->with('success', __('Anexo(s) adicionado(s) com sucesso.')); } public function anexoView(string $demanda, int $anexo): StreamedResponse|RedirectResponse { $response = $this->checkPermissao($this->permissao, 'visualizar'); if ($response instanceof RedirectResponse) return $response; return $this->servirAnexo($demanda, $anexo, inline: true); } public function anexoDownload(string $demanda, int $anexo): StreamedResponse|RedirectResponse { $response = $this->checkPermissao($this->permissao, 'visualizar'); if ($response instanceof RedirectResponse) return $response; return $this->servirAnexo($demanda, $anexo, inline: false); } public function anexoDestroy(string $demanda, int $anexo): RedirectResponse { $response = $this->checkPermissao($this->permissao, 'editar'); if ($response instanceof RedirectResponse) return $response; $model = DemandaAnexo::where('demanda_id', $demanda)->findOrFail($anexo); $this->resource->excluirAnexo($model, Auth::user()); return redirect()->route('admin.demandas.show', $demanda) ->with('success', __('Anexo removido.')); } public function buscarResponsaveis(Request $request): JsonResponse { if ($this->checkPermissao($this->permissao, 'visualizar') !== null) { return response()->json(['message' => __('Permissão negada.')], 403); } return response()->json($this->resource->buscarResponsaveis($request->get('q', ''))); } }
| ver. 1.4 |
Github
|
.
| PHP 8.3.28 | Generation time: 0.02 |
proxy
|
phpinfo
|
Settings