File manager - Edit - /var/www/html/portalHomolog/app/Http/Services/IndicadoresTi/IndicadoresTiService.php
Back
<?php namespace App\Http\Services\IndicadoresTi; use App\Models\IndicadoresTi\Assunto; use App\Models\IndicadoresTi\Chamado; use App\Models\IndicadoresTi\Cliente; use App\Models\IndicadoresTi\Setor; use App\Models\IndicadoresTi\Subassunto; use App\Models\UnidadeOrganizacional; use App\Models\User; use Illuminate\Contracts\Pagination\LengthAwarePaginator; use Illuminate\Database\Eloquent\Builder; use Illuminate\Http\Request; use Illuminate\Support\Collection; use Illuminate\Support\Facades\Auth; class IndicadoresTiService { public function dadosBase(): array { return [ 'headLine' => 'Chamados de TI', 'setores' => Setor::orderBy('nome')->get(), 'clientes' => Cliente::orderBy('nome')->get(), ]; } public function aplicarFiltros(Request $request): Builder { $query = Chamado::with(['cliente', 'solicitante', 'setor', 'assunto', 'subassunto', 'unidade', 'participantes']); return $query ->when($request->filled('busca'), function ($q) use ($request) { $q->where('numero', 'like', '%' . $request->busca . '%') ->orWhereHas('cliente', fn($q2) => $q2->where('nome', 'like', '%' . $request->busca . '%')); }) ->when($request->filled('status'), fn($q) => $q->where('status', $request->status)) ->when($request->filled('prioridade'), fn($q) => $q->where('prioridade', $request->prioridade)) ->when($request->filled('setor_id'), fn($q) => $q->where('setor_id', $request->setor_id)); } public function getMeusChamadosDiretor(Builder $query, User $user): LengthAwarePaginator { return (clone $query) ->where(function ($q) use ($user) { $q->where('atendente_id', $user->id) ->orWhereHas('participantes', fn($q2) => $q2->where('users.id', $user->id)); }) ->orderByRaw("FIELD(status, 'em_andamento', 'pendente', 'cancelado', 'atendido')") ->orderByDesc('created_at') ->paginate(10, ['*'], 'minha_page') ->withQueryString(); } public function getOutrosChamadosPorSetor(Builder $query, User $user): array { $outrosQuery = (clone $query) ->where(function ($q) use ($user) { $q->where('atendente_id', '!=', $user->id) ->whereDoesntHave('participantes', fn($q2) => $q2->where('users.id', $user->id)); }) ->whereIn('status', ['pendente', 'em_andamento', 'cancelado', 'atendido']) ->orderByRaw("FIELD(status, 'em_andamento', 'pendente')") ->orderByDesc('created_at'); $setores = Setor::orderBy('nome')->get(); $resultado = []; foreach ($setores as $setor) { $chamados = (clone $outrosQuery) ->where('setor_id', $setor->id) ->paginate(10, ['*'], "s{$setor->id}_pg") ->withQueryString(); if ($chamados->total() > 0) { $resultado[] = [ 'setor' => $setor, 'chamados' => $chamados, ]; } } return $resultado; } public function getMeusChamadosIndicadores(Builder $query, User $user): LengthAwarePaginator { return (clone $query) ->where('atendente_id', $user->id) ->orderByRaw("FIELD(status, 'em_andamento', 'pendente', 'cancelado', 'atendido')") ->orderByDesc('created_at') ->paginate(15, ['*'], 'minha_page') ->withQueryString(); } public function getTodosChamadosPorSetor(Builder $query, User $user): array { $todosQuery = (clone $query) ->where(function ($q) use ($user) { $q->where('atendente_id', '!=', $user->id) ->whereDoesntHave('participantes', fn($q2) => $q2->where('users.id', $user->id)); }) ->orderByRaw("FIELD(status, 'em_andamento', 'pendente', 'cancelado', 'atendido')") ->orderByDesc('created_at'); $setores = Setor::orderBy('nome')->get(); $resultado = []; foreach ($setores as $setor) { $chamados = (clone $todosQuery) ->where('setor_id', $setor->id) ->paginate(10, ['*'], "s{$setor->id}_pg") ->withQueryString(); if ($chamados->total() > 0) { $resultado[] = [ 'setor' => $setor, 'chamados' => $chamados, ]; } } return $resultado; } public function getOutrosChamadosPorUnidade(Builder $query, User $user, Collection $userUnidadeIds): array { $baseQuery = (clone $query) ->where('atendente_id', '!=', $user->id) ->whereNotNull('unidade_organizacional_id') ->whereIn('unidade_organizacional_id', $userUnidadeIds) ->orderByRaw("FIELD(status, 'em_andamento', 'pendente', 'cancelado', 'atendido')") ->orderByDesc('created_at'); $unidades = UnidadeOrganizacional::whereIn('id', $userUnidadeIds) ->orderBy('abbreviation') ->get(); $resultado = []; $idx = 0; foreach ($unidades as $unidade) { $chamados = (clone $baseQuery) ->where('unidade_organizacional_id', $unidade->id) ->paginate(10, ['*'], "u{$idx}_pg") ->withQueryString(); if ($chamados->total() > 0) { $resultado[] = ['unidade' => $unidade, 'chamados' => $chamados]; } $idx++; } return $resultado; } public function getOutrosChamadosIndicadores(Builder $query, User $user, Collection $userUnidadeIds): LengthAwarePaginator { return (clone $query) ->where('atendente_id', '!=', $user->id) ->where(function ($q) use ($user, $userUnidadeIds) { $q->whereHas('participantes', fn($q2) => $q2->where('users.id', $user->id)) ->orWhere(function ($q2) use ($userUnidadeIds) { $q2->whereNotNull('unidade_organizacional_id') ->whereIn('unidade_organizacional_id', $userUnidadeIds); }); }) ->orderByRaw("FIELD(status, 'em_andamento', 'pendente', 'cancelado', 'atendido')") ->orderByDesc('created_at') ->paginate(15, ['*'], 'outros_page') ->withQueryString(); } public function getChamadosAbertos(Request $request): array { $abas = $request->session()->get('abas_chamados', []); if (empty($abas)) { return []; } return Chamado::with([ 'cliente', 'setor', 'assunto', 'subassunto', 'unidade.secretaria', 'participantes', 'logs.autor', ]) ->whereIn('id', $abas) ->orderByRaw('FIELD(id, ' . implode(',', $abas) . ')') ->get() ->all(); } private function resolverNomes(array &$dados): void { $dados['setor_nome'] = isset($dados['setor_id']) ? Setor::find($dados['setor_id'])?->nome : null; $dados['assunto_nome'] = isset($dados['assunto_id']) ? Assunto::find($dados['assunto_id'])?->nome : null; $dados['subassunto_nome'] = isset($dados['subassunto_id']) ? Subassunto::find($dados['subassunto_id'])?->nome : null; } public function criarChamado(array $dados, Request $request): Chamado { $this->resolverNomes($dados); $chamado = new Chamado($dados); $chamado->numero = Chamado::gerarNumero(); $chamado->data_abertura = now(); $chamado->atendente_id = Auth::id(); $chamado->save(); $chamado->participantes()->attach(Auth::id()); $chamado->logs()->create([ 'user_id' => Auth::id(), 'tipo' => 'abertura', 'conteudo' => 'Chamado aberto por ' . Auth::user()->name . '.', ]); $this->abrirAba($request, $chamado->id); return $chamado; } public function atualizarChamado(Chamado $chamado, array $dados, Request $request): void { $tornandoAtendido = ($dados['status'] ?? '') === 'atendido' && $chamado->status !== 'atendido'; $this->resolverNomes($dados); $chamado->fill($dados); if ($tornandoAtendido) { $chamado->data_fechamento = now(); $chamado->atualizarTempoAtendimento(); } $chamado->save(); $chamado->logs()->create([ 'user_id' => Auth::id(), 'tipo' => $tornandoAtendido ? 'conclusao' : 'atualizacao', 'conteudo' => $tornandoAtendido ? 'Chamado concluído por ' . Auth::user()->name . '.' : 'Chamado atualizado por ' . Auth::user()->name . '.', ]); $this->abrirAba($request, $chamado->id); } public function reabrirChamado(Chamado $chamado, Request $request): void { $chamado->status = 'em_andamento'; $chamado->data_fechamento = null; $chamado->data_reabertura = now(); $chamado->save(); $chamado->logs()->create([ 'user_id' => Auth::id(), 'tipo' => 'reabertura', 'conteudo' => 'Chamado reaberto por ' . Auth::user()->name . '.', ]); $this->abrirAba($request, $chamado->id); } public function concluirChamado(Chamado $chamado, User $user, Request $request): void { $chamado->status = 'atendido'; $chamado->data_fechamento = now(); $chamado->atualizarTempoAtendimento(); $chamado->save(); $chamado->logs()->create([ 'user_id' => $user->id, 'tipo' => 'conclusao', 'conteudo' => 'Chamado concluído por ' . $user->name . '.', ]); $this->fecharAba($request, $chamado->id); } public function adicionarParticipante(Chamado $chamado, string|int $userId, Request $request): void { $chamado->participantes()->attach($userId); $adicionado = User::find($userId); $isSelf = $userId === Auth::id(); $chamado->logs()->create([ 'user_id' => Auth::id(), 'tipo' => 'participante_adicionado', 'conteudo' => $isSelf ? Auth::user()->name . ' se adicionou ao chamado.' : Auth::user()->name . ' adicionou ' . optional($adicionado)->name . ' ao chamado.', ]); $this->abrirAba($request, $chamado->id); } public function removerParticipante(Chamado $chamado, string|int $userId, Request $request): void { $removido = User::find($userId); $isSelf = $userId === Auth::id(); $chamado->participantes()->detach($userId); $chamado->logs()->create([ 'user_id' => Auth::id(), 'tipo' => 'participante_removido', 'conteudo' => $isSelf ? Auth::user()->name . ' saiu do chamado.' : Auth::user()->name . ' removeu ' . optional($removido)->name . ' do chamado.', ]); } public function excluirChamado(Chamado $chamado, Request $request): void { $chamado->delete(); $this->fecharAba($request, $chamado->id); } public function abrirAba(Request $request, int $chamadoId): void { $abas = $request->session()->get('abas_chamados', []); $abas = array_unique($abas); $abas = array_values(array_filter($abas, fn($id) => Chamado::where('id', $id)->exists())); if (!in_array($chamadoId, $abas)) { $abas[] = $chamadoId; } if (count($abas) > 10) { array_shift($abas); } $request->session()->put('abas_chamados', $abas); $request->session()->put('aba_ativa', $chamadoId); } public function fecharAba(Request $request, int $chamadoId): void { $abas = $request->session()->get('abas_chamados', []); $abas = array_values(array_filter($abas, fn($id) => $id != $chamadoId)); $request->session()->put('abas_chamados', $abas); if ($request->session()->get('aba_ativa') == $chamadoId) { $request->session()->put('aba_ativa', !empty($abas) ? $abas[0] : null); } } public function criarCliente(array $dados): Cliente { return Cliente::create($dados); } public function buscarClientePorCpf(string $cpf): ?Cliente { return Cliente::where('cpf', $cpf)->first(); } public function buscarUsuarioPorNome(string $nome): ?User { return User::whereRaw( "LOWER(CONCAT(firstName, ' ', lastName)) = ?", [mb_strtolower($nome)] )->first(); } public function buscarSolicitantes(string $termo): Collection { if (strlen($termo) < 2) { return collect(); } $t = '%' . mb_strtolower($termo) . '%'; $clientes = Cliente::where(function ($query) use ($t) { $query->whereRaw('LOWER(nome) LIKE ?', [$t]) ->orWhereRaw('LOWER(cpf) LIKE ?', [$t]) ->orWhereRaw('LOWER(matricula) LIKE ?', [$t]); }) ->orderBy('nome') ->limit(5) ->get() ->map(fn($cliente) => [ 'id' => $cliente->id, 'nome' => $cliente->nome, 'cpf' => $cliente->cpf, 'matricula' => $cliente->matricula, 'setor' => $cliente->setor, 'telefone' => $cliente->telefone, 'tipo' => 'cliente', ]); $usuarios = User::with('pertence') ->where(function ($query) use ($t) { $query->whereRaw('LOWER(firstName) LIKE ?', [$t]) ->orWhereRaw('LOWER(lastName) LIKE ?', [$t]) ->orWhereRaw("LOWER(CONCAT(firstName,' ',lastName)) LIKE ?", [$t]) ->orWhereRaw('LOWER(matriculation) LIKE ?', [$t]); }) ->limit(5) ->get() ->map(fn($user) => [ 'id' => $user->id, 'nome' => $user->name, 'cpf' => $user->matriculation, 'setor' => optional($user->pertence)->nome, 'telefone' => $user->phoneNumber, 'tipo' => 'usuario', ]); return $clientes->concat($usuarios)->values(); } public function buscarUnidades(string $termo): Collection { if (strlen($termo) < 2) { return collect(); } return UnidadeOrganizacional::with('secretaria:id,abbreviation') ->where('status', 'ATIVADO') ->where(function ($q) use ($termo) { $q->where('name', 'like', "%{$termo}%") ->orWhere('abbreviation', 'like', "%{$termo}%"); }) ->limit(15) ->get() ->map(fn($u) => [ 'id' => $u->id, 'texto' => $u->abbreviation . ' — ' . $u->name, 'secretaria' => optional($u->secretaria)->abbreviation, ]); } public function assuntosPorSetor(int $setorId): Collection { return Assunto::where('setor_id', $setorId) ->orderBy('nome') ->get(['id', 'nome']); } public function subassuntosPorAssunto(int $assuntoId): Collection { return Subassunto::where('assunto_id', $assuntoId) ->orderBy('nome') ->get(['id', 'nome']); } public function resolverSolicitante(array &$dados): void { if ($dados['solicitante_tipo'] === 'usuario') { $dados['user_id'] = $dados['solicitante_id']; $dados['cliente_id'] = null; } else { $dados['cliente_id'] = $dados['solicitante_id']; $dados['user_id'] = null; } unset($dados['solicitante_id'], $dados['solicitante_tipo']); } }
| ver. 1.4 |
Github
|
.
| PHP 8.3.28 | Generation time: 0.02 |
proxy
|
phpinfo
|
Settings