File manager - Edit - /var/www/html/portalHomolog/app/Http/Resources/ProjetosProgramas/ProjetoProgramaVisualizacaoResource.php
Back
<?php namespace App\Http\Resources\ProjetosProgramas; use App\Models\ProjetosProgramas\Anexo; use App\Models\ProjetosProgramas\ProjetoPrograma; use Carbon\CarbonInterface; /** * Monta o payload JSON para visualização completa do projeto (modal de consulta). */ final class ProjetoProgramaVisualizacaoResource { public function __construct( private readonly ProjetoPrograma $p, private readonly array $statusOptions, private readonly array $orcamentoAndamentoLabels, ) { } /** * @return array{titulo: string, sections: list<array<string, mixed>>} */ public function toArray(): array { return [ 'titulo' => (string) ($this->p->denominacao ?? ''), 'sections' => array_values(array_filter([ $this->secaoIdentificacao(), $this->secaoLocalizacao(), $this->secaoCronograma(), $this->secaoAreas(), $this->secaoContato(), $this->secaoDados(), $this->secaoInvestimento(), $this->secaoHistorico(), $this->secaoAnexos(), ])), ]; } /** * @param list<array{rotulo: string, valor: string}> $linhas * @return array{titulo: string, linhas: list<array{rotulo: string, valor: string}>}|null */ private function secaoComLinhas(string $titulo, array $linhas): ?array { $linhas = array_values(array_filter($linhas, static fn (array $r): bool => $r['valor'] !== '')); if ($linhas === []) { return null; } return [ 'titulo' => $titulo, 'linhas' => $linhas, ]; } private function secaoIdentificacao(): ?array { $ppaList = config('projetos_programas.programas_ppa', []); $ppaKey = array_search($this->p->programa_ppa, $ppaList, true); $ppaLabel = $ppaKey !== false ? ($ppaKey . ' — ' . $this->p->programa_ppa) : $this->str($this->p->programa_ppa); $priorOrig = match ($this->p->prioridade_origem) { 'PREFEITO' => __('Prefeitura'), 'SUPOP' => __('SUPOP'), default => '', }; return $this->secaoComLinhas(__('Identificação e vínculos'), [ $this->linha(__('Denominação'), $this->str($this->p->denominacao)), $this->linha(__('Nº processo administrativo'), $this->str($this->p->num_processo_adm)), $this->linha(__('Código interno'), $this->str($this->p->codigo)), $this->linha(__('Gestor'), $this->nomeStructure($this->p->gestor)), $this->linha(__('Tipo'), $this->str(optional($this->p->tipo)->nome)), $this->linha(__('Programa PPA'), $ppaLabel), $this->linha(__('Programa'), $this->str(optional($this->p->programa)->rotuloExibicao())), $this->linha(__('Objetivo'), $this->str(optional($this->p->objetivo)->nome)), $this->linha(__('Nº de ordem (programa/objetivo)'), $this->str($this->p->numero_ordem)), $this->linha(__('Relação com PPA do Governo Federal'), $this->str($this->p->relacao_ppa)), $this->linha(__('Classificação'), $this->str(optional($this->p->classificacao)->nome)), $this->linha(__('Etapa'), $this->str(optional($this->p->etapa)->nome)), $this->linha(__('Situação do cadastro'), __($this->p->status_registro_label)), $this->linha(__('Prioritário'), $this->boolPt($this->p->prioritario)), $this->linha(__('Ordem na lista de prioridades'), $this->p->ordem_prioridade !== null ? (string) $this->p->ordem_prioridade : ''), $this->linha(__('Contexto da prioridade'), $priorOrig), $this->linha(__('Priorizado por'), $this->str(optional($this->p->prioridadeDefinidaPor)->name)), ]); } private function secaoLocalizacao(): ?array { $bairros = config('projetos_programas.bairros', []); $bairroLabel = $this->p->bairroRotuloExibicao(); if ($bairroLabel !== '' && ! $this->p->isBairroTodos()) { $bairroKey = array_search($this->p->bairro, $bairros, true); if ($bairroKey !== false) { $bairroLabel = $bairroKey . ' — ' . $this->p->bairro; } } return $this->secaoComLinhas(__('Localização'), [ $this->linha(__('CEP'), $this->str($this->p->cep)), $this->linha(__('Rua'), $this->str($this->p->endereco)), $this->linha(__('Bairro'), $bairroLabel), $this->linha(__('Latitude'), $this->p->latitude !== null ? (string) $this->p->latitude : ''), $this->linha(__('Longitude'), $this->p->longitude !== null ? (string) $this->p->longitude : ''), ]); } private function secaoCronograma(): ?array { $andCor = (string) ($this->p->andamento_cor ?? ''); $andLeg = $andCor !== '' && isset($this->orcamentoAndamentoLabels[$andCor]) ? $this->orcamentoAndamentoLabels[$andCor] : $andCor; $linhas = [ $this->linha(__('Data de início'), $this->dataPt($this->p->data_inicio)), $this->linha(__('Data de término'), $this->dataPt($this->p->data_termino)), $this->linha(__('Prazo de entrega'), $this->str(optional($this->p->prazo)->nome)), $this->linha(__('Prazo de entrega (dias)'), $this->p->prazo_entrega_dias !== null ? (string) $this->p->prazo_entrega_dias : ''), $this->linha( __('Competência do prazo (mês/an)'), $this->str($this->p->prazoEntregaCompetenciaMesAnoFormatado() ?? $this->p->prazo_entrega_competencia) ), $this->linha(__('Acompanhamento prioritário'), $this->boolPt($this->p->acompanhamento_prioritario)), $this->linha(__('Acompanhamento intensivo pelo Governo'), $this->boolPt($this->p->acompanhamento_governo)), $this->linha(__('Cor do andamento (MAPÃO)'), $andLeg), $this->linha(__('Texto do andamento'), $this->str($this->p->andamento)), ]; return $this->secaoComLinhas(__('Cronograma e governança'), $linhas); } private function secaoAreas(): ?array { $orgaos = $this->p->orgaosEnvolvidos->map(static function ($s): string { $abbr = (string) ($s->abbreviation ?? ''); $name = (string) ($s->name ?? ''); return $abbr !== '' ? ($abbr . ($name !== '' ? ' — ' . $name : '')) : $name; })->implode(', '); $linhas = [ $this->linha(__('Eixo'), $this->str(optional($this->p->eixo)->nome)), $this->linha(__('Área'), $this->str(optional($this->p->area)->nome)), $this->linha(__('Órgãos envolvidos'), $orgaos), ]; $linhas = array_values(array_filter($linhas, static fn (array $r): bool => $r['valor'] !== '')); /** @var list<array{codigo: string, url: string, alt: string}> $odsItens */ $odsItens = []; $odsOrdenados = $this->p->ods->sortBy(static function ($o): string { return str_pad((string) ($o->codigo ?? ''), 2, '0', STR_PAD_LEFT); })->values(); foreach ($odsOrdenados as $o) { $c = str_pad((string) ($o->codigo ?? ''), 2, '0', STR_PAD_LEFT); $odsItens[] = [ 'codigo' => $c, 'url' => asset('pmar/assets/img/ods/ods-' . $c . '.png'), 'alt' => __('ODS :cod', ['cod' => $c]), ]; } if ($linhas === [] && $odsItens === []) { return null; } return [ 'titulo' => __('Áreas, ODS e órgãos'), 'linhas' => $linhas, 'ods' => $odsItens, 'ods_rotulo' => __('ODS'), ]; } private function secaoContato(): ?array { return $this->secaoComLinhas(__('Contato'), [ $this->linha(__('Nome do contato'), $this->str($this->p->contato_nome)), $this->linha(__('Matrícula do contato'), $this->str($this->p->contato_matricula)), $this->linha(__('Ramal'), $this->str($this->p->contato_ramal)), $this->linha(__('Telefone'), $this->str($this->p->contato_telefone)), $this->linha(__('E-mail'), $this->str($this->p->contato_email)), ]); } private function secaoDados(): ?array { $statusId = $this->p->status_id; $statusTxt = $statusId !== null && isset($this->statusOptions[(int) $statusId]) ? __($this->statusOptions[(int) $statusId]) : ($statusId !== null ? (string) $statusId : ''); return $this->secaoComLinhas(__('Dados do objeto'), [ $this->linha(__('Descrição do objeto'), $this->str($this->p->descricao_objeto)), $this->linha(__('Descrição das responsabilidades'), $this->str($this->p->descricao_responsabilidades)), $this->linha(__('Status'), $statusTxt), $this->linha(__('Principais dificuldades (código)'), $this->p->dificuldade_id !== null ? (string) $this->p->dificuldade_id : ''), $this->linha(__('Gargalos (dificuldades)'), $this->str($this->p->gargalos)), $this->linha(__('Observação'), $this->str($this->p->observacoes)), ]); } private function secaoInvestimento(): ?array { $linhas = [ $this->linha(__('Fonte'), $this->str(optional($this->p->fonte)->nome)), $this->linha(__('Outra fonte'), $this->str($this->p->fonte_outro)), $this->linha(__('Órgão (Convênio)'), $this->str($this->p->conve_orgao)), $this->linha(__('Outro órgão (Convênio)'), $this->str($this->p->conve_orgao_outro)), $this->linha(__('Nº da proposta'), $this->str($this->p->conve_proposta)), $this->linha(__('Nº do convênio'), $this->str($this->p->conve_convenio)), $this->linha(__('Orçamento previsto (MAPÃO)'), $this->money($this->p->orcamento_previsto)), $this->linha(__('Orçamento disponível (MAPÃO)'), $this->money($this->p->orcamento_disponivel)), ]; return $this->secaoComLinhas(__('Investimento e orçamento'), $linhas); } private function secaoHistorico(): ?array { $hist = $this->p->historicos->sortBy('data')->values(); if ($hist->isEmpty()) { return null; } $texto = $hist->map(static function ($h): string { $data = $h->data ? $h->data->format('d/m/Y') : '—'; $st = (string) ($h->status ?? ''); $tx = trim((string) ($h->texto ?? '')); return $data . ($st !== '' ? ' — ' . $st : '') . ($tx !== '' ? "\n" . $tx : ''); })->implode("\n\n"); return $this->secaoComLinhas(__('Histórico (cronograma)'), [ $this->linha(__('Registros'), $texto), ]); } private function secaoAnexos(): ?array { if ($this->p->anexos->isEmpty()) { return null; } /** @var list<array{nome: string, url: string, tamanho: string}> $itens */ $itens = []; foreach ($this->p->anexos as $anexo) { /** @var Anexo $anexo */ $itens[] = [ 'nome' => (string) ($anexo->name ?? ''), 'url' => route('admin.projetosProgramas.anexos.download', [$this->p->id, $anexo->id], true), 'tamanho' => (string) ($anexo->size_human ?? ''), ]; } return [ 'titulo' => __('Anexos'), 'tipo' => 'anexos', 'anexos' => $itens, ]; } private function secaoEtapas(): ?array { return $this->secaoComLinhas(__('Etapas do cadastro'), [ $this->linha(__('Identificação'), $this->etapaPt($this->p->identificacao_done)), $this->linha(__('Cronograma'), $this->etapaPt($this->p->cronograma_done)), $this->linha(__('Áreas'), $this->etapaPt($this->p->areas_done)), $this->linha(__('Contato'), $this->etapaPt($this->p->contato_done)), $this->linha(__('Dados'), $this->etapaPt($this->p->dados_done)), $this->linha(__('Investimento'), $this->etapaPt($this->p->investimento_done)), ]); } /** * @return array{rotulo: string, valor: string} */ private function linha(string $rotulo, string $valor): array { $valor = trim($valor); return [ 'rotulo' => $rotulo, 'valor' => $valor === '' ? '' : $valor, ]; } private function str(?string $v): string { $v = trim((string) ($v ?? '')); return $v === '' ? '' : $v; } private function money(mixed $v): string { if ($v === null || $v === '') { return ''; } return 'R$ ' . number_format((float) $v, 2, ',', '.'); } private function dataPt(mixed $d): string { if ($d === null || $d === '') { return ''; } if ($d instanceof CarbonInterface) { return $d->format('d/m/Y'); } return ''; } private function boolPt(?bool $b): string { if ($b === null) { return ''; } return $b ? __('Sim') : __('Não'); } private function etapaPt(?bool $b): string { if ($b === null) { return ''; } return $b ? __('Concluída') : __('Pendente'); } private function nomeStructure(mixed $s): string { if (!$s) { return ''; } $abbr = (string) ($s->abbreviation ?? ''); $name = (string) ($s->name ?? ''); if ($abbr !== '' && $name !== '') { return $abbr . ' — ' . $name; } return $abbr !== '' ? $abbr : $name; } }
| ver. 1.4 |
Github
|
.
| PHP 8.3.28 | Generation time: 0.02 |
proxy
|
phpinfo
|
Settings