File manager - Edit - /var/www/html/portal/app/Http/Controllers/Admin/ConvenioController.php
Back
<?php namespace App\Http\Controllers\Admin; use App\Http\Controllers\Controller; use App\Http\Resources\ConvenioResource; use App\Mail\ConvenioAlertaMail; use App\Models\Convenio; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Mail; use Illuminate\Support\Str; use Illuminate\View\View; class ConvenioController extends Controller { private string $permissao = 'GERENCIADOR_DE_PPPS'; /** * Retorna os destinatários dos alertas com fallback para ambientes com config cache. * * @return array<int, string> */ private function destinatariosAlertasConvenios(): array { $destinatarios = config('convenios.alertas_emails', []); if ($destinatarios !== []) { return $destinatarios; } $emailsRaw = (string) env('CONVENIOS_ALERTAS_EMAIL', ''); if ($emailsRaw !== '') { return $this->normalizarEmails($emailsRaw); } $envPath = base_path('.env'); if (!is_file($envPath)) { return []; } $linhas = file($envPath, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); if ($linhas === false) { return []; } foreach ($linhas as $linha) { $linhaTratada = trim($linha); if ($linhaTratada === '' || Str::startsWith($linhaTratada, '#')) { continue; } if (!Str::startsWith($linhaTratada, 'CONVENIOS_ALERTAS_EMAIL=')) { continue; } $emailsRaw = Str::after($linhaTratada, 'CONVENIOS_ALERTAS_EMAIL='); return $this->normalizarEmails($emailsRaw); } return []; } /** * Normaliza uma lista CSV de e-mails. * * @return array<int, string> */ private function normalizarEmails(string $emailsRaw): array { $emailsRaw = trim($emailsRaw, " \t\n\r\0\x0B\"'"); return array_values(array_filter(array_map('trim', explode(',', $emailsRaw)))); } /** * Regras de validação base do convênio. * * @return array<string, string> */ private function regrasBase(): array { return array_merge([ 'status_plataforma' => 'nullable|string|max:255', 'executor_ordenador' => 'nullable|string|max:255', 'programa' => 'nullable|string|max:255', 'programa_pac' => 'nullable|string|max:255', 'tipo_programa' => 'nullable|string|max:255', 'proposta_id' => 'nullable|string|max:255', 'objeto' => 'nullable|string', 'prazo_cadastro' => 'nullable|date', 'data' => 'nullable|date', 'local' => 'nullable|string|max:255', 'contrapartida' => 'nullable|string|max:255', 'repasse' => 'nullable|string|max:255', 'valor_global' => 'nullable|string|max:255', 'concedente' => 'nullable|string|max:255', 'prazo_execucao_meses' => 'nullable|string|max:255', 'show_objeto' => 'boolean', 'show_executor_ordenador' => 'boolean', 'show_concedente' => 'boolean', 'show_status_plataforma' => 'boolean', 'show_programa' => 'boolean', 'show_programa_pac' => 'boolean', 'show_tipo_programa' => 'boolean', 'show_proposta_id' => 'boolean', 'show_porcentagem_conclusao' => 'boolean', 'show_prazo_cadastro' => 'boolean', 'show_data' => 'boolean', 'show_prazo_execucao_meses' => 'boolean', 'show_local' => 'boolean', 'show_contrapartida' => 'boolean', 'show_repasse' => 'boolean', 'show_valor_global' => 'boolean', ], ConvenioResource::regrasValidacao()); } public function create(): View|RedirectResponse { $response = $this->checkPermissao($this->permissao, 'adicionar'); if ($response instanceof RedirectResponse) { return $response; } return view('admin.convenios.create'); } public function store(Request $request): RedirectResponse { $response = $this->checkPermissao($this->permissao, 'adicionar'); if ($response instanceof RedirectResponse) { return $response; } $validated = $request->validate($this->regrasBase()); $convenio = Convenio::create($validated); $destinatarios = $this->destinatariosAlertasConvenios(); $alertasPendentes = ConvenioResource::alertasPendentesEnvio($convenio); if ($alertasPendentes->isNotEmpty() && $destinatarios === []) { Log::warning('Convênio criado com alerta, mas sem destinatários configurados', [ 'convenio_id' => $convenio->id, ]); return redirect()->route('admin.ppps.index', ['tab' => 'convenios']) ->with('warning', __('Convênio criado com alerta, mas não foi possível enviar e-mail porque não há destinatário configurado em CONVENIOS_ALERTAS_EMAIL.')); } if ($destinatarios !== [] && $alertasPendentes->isNotEmpty()) { try { Mail::to($destinatarios)->send(new ConvenioAlertaMail( $convenio, $alertasPendentes->map(fn ($item) => [ 'tipo' => $item['tipo'], 'mensagem' => $item['mensagem'], ])->all() )); foreach ($alertasPendentes as $alertaPendente) { ConvenioResource::registrarAlertaEnviado( $convenio, $alertaPendente['tipo'], $alertaPendente['data_referencia'] ); } } catch (\Throwable $exception) { Log::error('Falha ao enviar alerta imediato de convênio após criação', [ 'convenio_id' => $convenio->id, 'erro' => $exception->getMessage(), ]); return redirect()->route('admin.ppps.index', ['tab' => 'convenios']) ->with('warning', __('Convênio criado, mas ocorreu uma falha no envio do e-mail de alerta. Verifique as configurações de e-mail e tente novamente.')); } } return redirect()->route('admin.ppps.index', ['tab' => 'convenios']) ->with('success', __('Convênio criado com sucesso!')); } public function edit(Convenio $convenio): View|RedirectResponse { $response = $this->checkPermissao($this->permissao, 'editar'); if ($response instanceof RedirectResponse) { return $response; } $alertasAtivos = ConvenioResource::alertasAtivos($convenio); return view('admin.convenios.edit', compact('convenio', 'alertasAtivos')); } public function update(Request $request, Convenio $convenio): RedirectResponse { $response = $this->checkPermissao($this->permissao, 'editar'); if ($response instanceof RedirectResponse) { return $response; } $validated = $request->validate(array_merge($this->regrasBase(), [ 'porcentagem_conclusao' => 'nullable|numeric|min:0|max:100', ])); $convenio->update($validated); return redirect()->route('admin.ppps.index', ['tab' => 'convenios']) ->with('success', __('Convênio atualizado com sucesso!')); } public function destroy(Convenio $convenio): RedirectResponse { $response = $this->checkPermissao($this->permissao, 'excluir'); if ($response instanceof RedirectResponse) { return $response; } $convenio->delete(); return redirect()->route('admin.ppps.index', ['tab' => 'convenios']) ->with('success', __('Convênio excluído com sucesso!')); } public function status(Convenio $convenio): RedirectResponse { $response = $this->checkPermissao($this->permissao, 'editar'); if ($response instanceof RedirectResponse) { return $response; } $convenio->status = $convenio->status === 'ATIVADO' ? 'DESATIVADO' : 'ATIVADO'; $convenio->save(); return redirect()->route('admin.ppps.index', ['tab' => 'convenios']) ->with('success', __('Status do convênio atualizado!')); } public function exportAllPdf() { $response = $this->checkPermissao($this->permissao, 'visualizar'); if ($response instanceof RedirectResponse) { return $response; } $convenios = Convenio::orderBy('objeto')->get(); $filename = 'relatorio_geral_convenios_' . date('YmdHis'); $pdf = \Barryvdh\DomPDF\Facade\Pdf::loadView('admin.convenios.export_all_pdf', compact('convenios')); $pdf->setPaper('a4', 'landscape'); return $pdf->download($filename . '.pdf'); } }
| ver. 1.4 |
Github
|
.
| PHP 8.3.28 | Generation time: 0.01 |
proxy
|
phpinfo
|
Settings