File manager - Edit - /var/www/html/portalHomolog/app/Http/Resources/Demandas/DemandaResource.php
Back
<?php namespace App\Http\Resources\Demandas; use App\Enums\PrioridadeDemanda; use App\Enums\StatusDemanda; use App\Helpers\FileUploadHelper; use App\Http\Services\Demandas\DemandaService; use App\Models\Demandas\Demanda; use App\Models\Demandas\DemandaAnexo; use App\Models\Demandas\DemandaDestinatario; use App\Models\Demandas\DemandaSubtarefa; use App\Models\IndicadoresTi\Setor; use App\Models\User; use Illuminate\Support\Facades\DB; use Illuminate\Support\Str; use Illuminate\Validation\ValidationException; class DemandaResource { public function __construct(private readonly DemandaService $service) {} public function formData(User $user): array { $podeAtendimentoTi = $user->permissoes->pluck('permissao')->contains('SUPORTE_TI'); return [ 'prioridades' => PrioridadeDemanda::options(), 'statusLabels' => StatusDemanda::options(), 'unidades' => $this->service->listarUnidades(), 'podeAtendimentoTi' => $podeAtendimentoTi, 'setores' => $podeAtendimentoTi ? Setor::orderBy('nome')->get(['id', 'nome']) : collect(), ]; } public function dashboardData(User $user, string $permissao): array { $isSecretario = $user->permissoes->pluck('permissao')->contains('DEMANDAS_SECRETARIA'); $base = array_merge($this->formData($user), [ 'resumo' => $this->service->calcularResumo($user), 'acaoRequerida' => $this->service->acaoRequerida($user), 'abertasPorPrioridade'=> $this->service->abertasPorPrioridade($user), 'proximasPrazo' => $this->service->proximasPrazo($user), 'recentes' => $this->service->queryBase($user) ->with(['unidade', 'solicitante', 'destinatarios']) ->orderBy('data_abertura', 'desc') ->limit(8) ->get(), 'isSecretario' => $isSecretario, ]); if ($isSecretario) { $base = array_merge($base, [ 'tendencia' => $this->service->tendenciaMensal($user), 'porResponsavel' => $this->service->porResponsavel($user), 'porUnidade' => $this->service->porUnidade($user), 'porCanal' => $this->service->porCanal($user), 'tempoMedio' => $this->service->tempoMedioAtendimento($user), ]); } return $base; } public function indexData(User $user, array $filters, string $aba, string $layout, string $permissao): array { $permissoes = $user->permissoes->pluck('permissao'); $base = array_merge($this->formData($user), [ 'filterParams' => $filters, 'layout' => $layout, 'perm' => $user->getPermissaoDetalhes($permissao), 'userId' => $user->id, 'isDemandaSecretaria' => $permissoes->contains('DEMANDAS_SECRETARIA'), ]); if ($aba === 'diretoria' && $permissoes->contains('DEMANDAS_SECRETARIA')) { return $base + [ 'aba' => 'diretoria', 'contagens' => $this->service->calcularContagens($user, $filters), 'gruposDiretoria' => $this->service->listarDiretoria($user, $filters), ]; } if ($layout === 'colunas') { return $base + $this->service->listarKanban($user, $filters, $aba); } return $base + $this->service->listarComAbas($user, $filters, $aba); } public function showData(Demanda $demanda, User $user, string $permissao): array { $userId = $user->id; $userUnidades = $user->unidades()->pluck('unidades_organizacionais.id'); $perm = $user->getPermissaoDetalhes($permissao); $subtarefaTotal = $demanda->subtarefas->count(); $subtarefaConcluidas = $demanda->subtarefas->where('concluida', true)->count(); $isCriadorOuResponsavel = $userId === $demanda->user_id || $demanda->destinatarios->contains(fn($d) => $d->tipo === 'usuario' && $d->responsavel_id === $userId); $minhaDest = $demanda->destinatarios->first(fn($d) => $d->responsavel_id === $userId); return array_merge($this->formData($user), [ 'demanda' => $demanda, 'demandaFechada' => in_array($demanda->status, ['atendido', 'cancelado']), 'destinatarioStatus' => DemandaDestinatario::STATUS, 'perm' => $perm, 'userId' => $userId, 'userUnidades' => $userUnidades, 'isCriador' => $isCriadorOuResponsavel, 'minhaDest' => $minhaDest, 'minhaDestUnica' => $minhaDest && $demanda->destinatarios->count() === 1, 'destsParaAceitar' => $demanda->destinatarios->filter( fn($d) => $d->tipo === 'unidade' && is_null($d->responsavel_id) && $userUnidades->contains($d->unidade_id) ), 'pareceres' => $demanda->logs->filter(fn($l) => $l->tipo === 'parecer'), 'subtarefaTotal' => $subtarefaTotal, 'subtarefaConcluidas' => $subtarefaConcluidas, 'subtarefaPct' => $subtarefaTotal > 0 ? round(($subtarefaConcluidas / $subtarefaTotal) * 100) : 0, 'destsUnidade' => $demanda->destinatarios->where('tipo', 'unidade'), 'destsUsuario' => $demanda->destinatarios->where('tipo', 'usuario'), ]); } public function interagir(Demanda $demanda, string $tipo, string $conteudo, User $autor, array $arquivos = []): void { DB::transaction(function () use ($demanda, $tipo, $conteudo, $autor, $arquivos) { $log = $demanda->logs()->create([ 'user_id' => $autor->id, 'tipo' => $tipo, 'conteudo' => $conteudo, ]); if (empty($arquivos)) return; $nomesAnexos = []; foreach ($arquivos as $arquivo) { $nomeOriginal = FileUploadHelper::sanitizeOriginalFileName($arquivo); $caminho = FileUploadHelper::processSafeGeneralUploadPublicDisk( $arquivo, 'demandas', $this->gerarNomeAnexo($demanda, $nomeOriginal) ); if (!$caminho) { throw ValidationException::withMessages([ 'anexos' => __('Arquivo inválido ou não permitido: :nome', ['nome' => $arquivo->getClientOriginalName()]), ]); } $demanda->anexos()->create([ 'log_id' => $log->id, 'user_id' => $autor->id, 'nome_original' => $nomeOriginal, 'caminho' => $caminho, 'mime_type' => $arquivo->getMimeType(), 'tamanho' => $arquivo->getSize(), ]); $nomesAnexos[] = $nomeOriginal; } if (!empty($nomesAnexos)) { $demanda->logs()->create([ 'user_id' => $autor->id, 'tipo' => 'atualizacao', 'conteudo' => __(':n arquivo(s) anexado(s): :nomes', [ 'n' => count($nomesAnexos), 'nomes' => implode(', ', $nomesAnexos), ]), ]); } }); } public function aceitarDestinatario(Demanda $demanda, DemandaDestinatario $dest, User $autor): void { DB::transaction(function () use ($demanda, $dest, $autor) { $dest->update(['responsavel_id' => $autor->id, 'status' => 'em_andamento']); $demanda->logs()->create([ 'user_id' => $autor->id, 'tipo' => 'encaminhamento', 'conteudo' => __(':nome aceitou a demanda em nome de: :unidade', [ 'nome' => $autor->name, 'unidade' => $dest->unidade?->abbreviation ?? $dest->unidade?->name ?? '-', ]), ]); if ($demanda->status === 'pendente') { $demanda->update(['status' => 'em_andamento']); $demanda->logs()->create([ 'user_id' => $autor->id, 'tipo' => 'status', 'conteudo' => __('Demanda iniciada automaticamente: responsável aceitou a demanda.'), ]); } }); } public function atualizarStatusDestinatario(Demanda $demanda, DemandaDestinatario $dest, string $status, User $autor): void { DB::transaction(function () use ($demanda, $dest, $status, $autor) { $dest->update(['status' => $status]); $demanda->logs()->create([ 'user_id' => $autor->id, 'tipo' => 'encaminhamento', 'conteudo' => __('Status de :nome atualizado para: :s', [ 'nome' => $dest->nome_display, 's' => DemandaDestinatario::STATUS[$status] ?? $status, ]), ]); // Destinatário único: o status da demanda espelha diretamente o do // responsável (pendente↔pendente, em_andamento↔em_andamento, concluido↔atendido). if ($demanda->destinatarios()->count() === 1) { $statusDemanda = match ($status) { 'concluido' => 'atendido', 'em_andamento' => 'em_andamento', default => 'pendente', }; if ($demanda->status !== $statusDemanda) { $demanda->update(['status' => $statusDemanda]); $demanda->logs()->create([ 'user_id' => $autor->id, 'tipo' => 'status', 'conteudo' => __('Status da demanda sincronizado com o responsável: :s', [ 's' => StatusDemanda::tryFrom($statusDemanda)?->label() ?? $statusDemanda, ]), ]); } } elseif ($demanda->destinatarios()->where('status', '!=', 'concluido')->doesntExist()) { $demanda->update(['status' => 'atendido']); $demanda->logs()->create([ 'user_id' => $autor->id, 'tipo' => 'status', 'conteudo' => __('Demanda encerrada automaticamente: todos os responsáveis concluíram.'), ]); } elseif ($demanda->status === 'pendente') { $demanda->update(['status' => 'em_andamento']); $demanda->logs()->create([ 'user_id' => $autor->id, 'tipo' => 'status', 'conteudo' => __('Demanda iniciada automaticamente: responsável atualizou seu status.'), ]); } }); } public function criar(array $dados, User $autor): Demanda { return $this->service->criar($dados, $autor); } public function atualizar(Demanda $demanda, array $dados, User $autor): void { $this->service->atualizar($demanda, $dados, $autor); if (!empty($dados['setor_id'])) { $this->service->salvarTiDetalhe($demanda, $dados); } } public function moverStatus(Demanda $demanda, string $status, User $autor): void { $this->service->moverStatus($demanda, $status, $autor); } public function adicionarDestinatario(Demanda $demanda, string $tipo, string $id, User $autor): void { $this->service->adicionarDestinatario($demanda, $tipo, $id, $autor); } public function removerDestinatario(Demanda $demanda, int $id, User $autor): void { $this->service->removerDestinatario($demanda, $id, $autor); } public function criarSubtarefa(Demanda $demanda, string $titulo, ?string $unidadeId, ?string $responsavelId): void { $this->service->criarSubtarefa($demanda, $titulo, $unidadeId, $responsavelId); } public function toggleSubtarefa(DemandaSubtarefa $subtarefa, User $user): array { return $this->service->toggleSubtarefa($subtarefa, $user); } public function removerSubtarefa(DemandaSubtarefa $subtarefa): void { $this->service->removerSubtarefa($subtarefa); } public function salvarAnexos(Demanda $demanda, array $arquivos, User $autor): void { $this->service->salvarAnexos($demanda, $arquivos, $autor); } public function excluirAnexo(DemandaAnexo $anexo, User $autor): void { $this->service->excluirAnexo($anexo, $autor); } public function buscarResponsaveis(string $termo): \Illuminate\Support\Collection { return $this->service->buscarResponsaveis($termo); } private function gerarNomeAnexo(Demanda $demanda, string $nomeOriginal): string { $ext = pathinfo($nomeOriginal, PATHINFO_EXTENSION); $base = Str::limit(Str::slug(pathinfo($nomeOriginal, PATHINFO_FILENAME)), 40, ''); return 'dem' . $demanda->numero . '_' . now()->format('Ymd_His') . '_' . $base . '.' . $ext; } }
| ver. 1.4 |
Github
|
.
| PHP 8.3.28 | Generation time: 0.02 |
proxy
|
phpinfo
|
Settings