File manager - Edit - /var/www/html/portal/app/Http/Services/Accounts/Chamados/ChamadoService.php
Back
<?php namespace App\Http\Services\Accounts\Chamados; use App\Enums\MobiangraChamadoConvenio; use App\Models\Accounts\Chamados\Chamado; use App\Models\Accounts\Chamados\Mensagem; use App\Models\Saude\Fibromialgia\Fibromialgia; use App\Models\Arquivo; use App\Http\Controllers\Controller; use App\Http\Requests\Accounts\Chamados\ChamadoRequest; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Mail; use Illuminate\Http\Request; use Illuminate\Http\RedirectResponse; use Illuminate\Support\Facades\DB; use Illuminate\Pagination\LengthAwarePaginator; use Illuminate\Database\Eloquent\Collection; class ChamadoService extends Controller { protected $Chamado = Chamado::class; protected $Mensagem = Mensagem::class; protected $convenios = [Fibromialgia::class]; public function index(Request $request): LengthAwarePaginator { $paginate = 20; if (isset($request->q)) { $request->validate([ 'q' => 'nullable|string|max:255', ]); return $this->Chamado::where(function ($query) use ($request) { $query->where('convenio', 'like', '%' . trim($request->q) . '%') ->orWhere('convenioAtual', 'like', '%' . trim($request->q) . '%') ->orWhere('numeroChamado', 'like', '%' . trim($request->q) . '%') ->orWhere('assunto', 'like', '%' . trim($request->q) . '%') ->orWhere('statusChamado', 'like', '%' . trim($request->q) . '%'); }) ->where("user_id", Auth::user()->id) ->orderByDesc('created_at')->paginate($paginate); } return $users = $this->Chamado::where("user_id", Auth::user()->id) ->orderByDesc('created_at') ->paginate($paginate); } public function getMensagens(Chamado $chamado): ?Collection { $mensagens = $chamado->mensagens() ->orderByDesc('solicitacao') ->orderBy('created_at') ->get(); if ($mensagens instanceof Collection) { return $mensagens; } return null; } public function getConvenios(): ?Array { $userId = Auth::id(); $array = [MobiangraChamadoConvenio::valor()]; foreach ($this->convenios as $classeConvenio) { $exists = $classeConvenio::where("user_id", $userId)->exists(); if (!$exists) { continue; } if ($classeConvenio === Fibromialgia::class) { $array[] = "Cadastro de Paciente com Fibromialgia"; } } $array = array_values(array_unique($array)); sort($array, SORT_STRING | SORT_FLAG_CASE); return !empty($array) ? $array : null; } public function getStatusChamado(): ?Array { return [ 'Aberto' => 'Aberto', 'Aguardando interação do solicitante' => 'Aguardando interação do solicitante', 'Em análise' => 'Em análise', 'Atendido' => 'Atendido', 'Não atendido' => 'Não atendido', 'Finalizado' => 'Finalizado', ]; } public function preparaConvenios(Array $convenios): ?Array { $array = []; foreach ($convenios as $convenio) { $array[$convenio] = $convenio; } return $array; } public function store(ChamadoRequest $request, $array_chamado): RedirectResponse { try { DB::beginTransaction(); $chamado = $this->Chamado::create($array_chamado); DB::commit(); if (!empty($array_chamado['credenciamento_id']) && $chamado->user && $chamado->user->email) { Mail::to($chamado->user->email)->send(new \App\Mail\Cultura\Credenciamento\RecursoAbertoCredenciamentoMail($chamado)); } return redirect()->route('admin.contaAngra.chamados.solicitacao', $chamado->id) ->with('success', '* Assunto cadastrado com sucesso, vamos agora para a solicitação.'); } catch (\Exception $e) { DB::rollBack(); return redirect() ->back() ->withInput() ->with('error', 'Erro tentar cadastrar esse chamado. ' . $e->getMessage()); } } public function novaMensagem(Array $array_mensagem): Mensagem { try { DB::beginTransaction(); $mensagem = $this->Mensagem::create($array_mensagem); DB::commit(); return $mensagem; } catch (\Exception $e) { DB::rollBack(); return redirect() ->back() ->withInput() ->with('error', 'Erro tentar cadastrar esse chamado. ' . $e->getMessage()); } } /** * Conta mensagens não lidas por chamado para um usuário. * Cidadão: respostas da equipe. Gestor: mensagens do solicitante. * * @param array<int, string> $chamadoIds * @return array<string, int> */ public function contarMensagensNaoLidasPorChamados(array $chamadoIds, string $viewerUserId): array { if ($chamadoIds === []) { return []; } $chamadoIds = array_values(array_unique(array_map('strval', $chamadoIds))); $contagens = []; $chamados = $this->Chamado::query() ->whereIn('id', $chamadoIds) ->get(['id', 'user_id']); foreach ($chamados as $chamado) { $query = $this->Mensagem::query() ->where('chamado_id', $chamado->id) ->where('status', 'ATIVADO') ->whereDoesntHave('visualizacoes', function ($sub) use ($viewerUserId) { $sub->where('user_id', $viewerUserId); }); if ((string) $chamado->user_id === $viewerUserId) { $query->where('owner_id', '!=', $chamado->user_id); } else { $query->where('owner_id', $chamado->user_id); } $total = (int) $query->count(); if ($total > 0) { $contagens[(string) $chamado->id] = $total; } } return $contagens; } /** * Marca como visualizadas as mensagens do outro participante do chamado. */ public function marcarMensagensComoVisualizadas(Chamado $chamado, string $viewerUserId): void { $mensagens = $this->getMensagens($chamado); if ($mensagens === null) { return; } $citizenId = (string) $chamado->user_id; $viewerUserId = (string) $viewerUserId; foreach ($mensagens as $mensagem) { $ownerId = (string) $mensagem->owner_id; $ehDoOutro = $viewerUserId === $citizenId ? $ownerId !== $citizenId : $ownerId === $citizenId; if ($ehDoOutro) { $mensagem->visualizacoes()->syncWithoutDetaching([$viewerUserId]); } } } public function update(ChamadoRequest $request, Chamado $chamado, Array $array_chamado): RedirectResponse { try { DB::beginTransaction(); $chamado->fill($array_chamado); $chamado->save(); DB::commit(); return redirect()->route('admin.contaAngra.chamados.solicitacao', $chamado->id) ->with('success', '* Assunto atualizado com sucesso, vamos agora para a solicitação.'); } catch (\Exception $e) { DB::rollBack(); return redirect() ->back() ->withInput() ->with('error', 'Erro tentar atualizar esse chamado. ' . $e->getMessage()); } } public function destroyArquivo(Arquivo $arquivo): ?RedirectResponse { try { DB::beginTransaction(); Arquivo::destroy($arquivo->id); DB::commit(); return null; } catch (\Exception $e) { DB::rollBack(); return redirect() ->back() ->withInput() ->with('error', 'Erro tentar excluir este arquivo. ' . $e->getMessage()); } } public function destroyMensagem(Mensagem $mensagem): ?RedirectResponse { try { DB::beginTransaction(); Mensagem::destroy($mensagem->id); DB::commit(); return null; } catch (\Exception $e) { DB::rollBack(); return redirect() ->back() ->withInput() ->with('error', 'Erro tentar excluir este arquivo. ' . $e->getMessage()); } } public function destroy(Chamado $chamado): RedirectResponse { try { DB::beginTransaction(); Chamado::destroy($chamado->id); DB::commit(); return redirect()->route('admin.contaAngra.chamados.index') ->with('success', "* Atendimento nº {$chamado->numeroChamado} excluído com sucesso!"); } catch (\Exception $e) { DB::rollBack(); return redirect() ->back() ->withInput() ->with('error', 'Erro tentar excluir este arquivo. ' . $e->getMessage()); } } }
| ver. 1.4 |
Github
|
.
| PHP 8.3.28 | Generation time: 0.02 |
proxy
|
phpinfo
|
Settings