File manager - Edit - /var/www/html/portalHomolog/app/Http/Controllers/Saude/PessoasTrans/PessoasTransController.php
Back
<?php namespace App\Http\Controllers\Saude\PessoasTrans; use App\Http\Controllers\Controller; use App\Mail\PessoaTransBoasVindasMail; use App\Models\Saude\PessoasTrans\PessoaTrans; use Barryvdh\DomPDF\Facade\Pdf; use Illuminate\Http\Request; class PessoasTransController extends Controller { public function index(Request $request) { $busca = $request->input('q'); $query = PessoaTrans::query()->latest(); if ($busca) { $query->where(function ($q) use ($busca) { $q->where('nome_social', 'like', "%{$busca}%") ->orWhere('nome_civil', 'like', "%{$busca}%") ->orWhere('cpf', 'like', "%{$busca}%"); }); } $registros = $query->paginate(20)->withQueryString(); $camposRelatorio = $this->getCamposRelatorio(); return view('admin.saude.pessoas-trans.index', compact('registros', 'busca', 'camposRelatorio')); } public function create() { $pessoaTrans = new PessoaTrans(); $user = auth()->user(); $pessoa = $user?->pessoa; // Preenche com dados já existentes do usuário quando houver $pessoaTrans->nome_civil = $pessoa?->nomeCompleto ?? $user?->name; $pessoaTrans->cpf = $user?->cpf; $pessoaTrans->cns = $pessoa?->numeroSUS; $pessoaTrans->data_nascimento = $pessoa?->dtaNascimento; return view('admin.saude.pessoas-trans.form', compact('pessoaTrans')); } public function store(Request $request) { $data = $this->validateData($request); $user = auth()->user(); $data['user_id'] = $user->id; $pessoaTrans = PessoaTrans::create($data); try { \Mail::to($user->email)->send(new PessoaTransBoasVindasMail($user, $pessoaTrans)); } catch (\Throwable $e) { // silencioso: não quebra o fluxo caso o e-mail falhe } return redirect() ->route('admin.saude.pessoas-trans.index') ->with('success', '* Cadastro salvo com sucesso. Enviamos um e-mail de confirmação para você.'); } public function edit(PessoaTrans $pessoas_trans) { $pessoaTrans = $pessoas_trans; return view('admin.saude.pessoas-trans.form', compact('pessoaTrans')); } public function update(Request $request, PessoaTrans $pessoas_trans) { $data = $this->validateData($request); $pessoas_trans->update($data); return redirect() ->route('admin.saude.pessoas-trans.index') ->with('success', '* Cadastro atualizado com sucesso.'); } public function destroy(PessoaTrans $pessoas_trans) { $pessoas_trans->delete(); return redirect() ->route('admin.saude.pessoas-trans.index') ->with('success', '* Cadastro excluído com sucesso.'); } public function relatorio(Request $request) { $camposSelecionados = array_filter( $request->input('campos_dados', []), fn ($v) => !empty($v) ); if (empty($camposSelecionados)) { return redirect() ->route('admin.saude.pessoas-trans.index') ->with('error', 'Selecione ao menos um campo para o relatório.'); } $camposRelatorio = $this->getCamposRelatorio(); $campos = []; foreach ($camposSelecionados as $chave) { if (isset($camposRelatorio[$chave])) { $campos[$chave] = $camposRelatorio[$chave]; } } $query = PessoaTrans::query()->latest(); if ($request->filled('q')) { $busca = $request->input('q'); $query->where(function ($q2) use ($busca) { $q2->where('nome_social', 'like', "%{$busca}%") ->orWhere('nome_civil', 'like', "%{$busca}%") ->orWhere('cpf', 'like', "%{$busca}%"); }); } $registros = $query->get(); if ($registros->isEmpty()) { return redirect() ->route('admin.saude.pessoas-trans.index') ->with('error', 'Nenhum cadastro encontrado com os critérios selecionados.'); } $pdf = Pdf::loadView('admin.saude.pessoas-trans.relatorios.dados', [ 'registros' => $registros, 'campos' => $campos, ])->setPaper('a4', 'landscape'); return $pdf->stream('relatorio_pessoas_trans_' . now()->format('YmdHis') . '.pdf'); } protected function validateData(Request $request, bool $publico = false): array { $rules = [ 'nome_social' => $publico ? ['required', 'string', 'max:255'] : ['nullable', 'string', 'max:255'], 'nome_civil' => ['nullable', 'string', 'max:255'], 'cpf' => ['nullable', 'string', 'max:20'], 'cns' => ['nullable', 'string', 'max:30'], 'data_nascimento' => ['nullable', 'date'], 'endereco' => ['nullable', 'string', 'max:500'], 'identidade_genero' => ['nullable', 'string', 'max:100'], 'outra_identidade_genero' => ['nullable', 'string', 'max:255'], 'pronomes' => ['nullable', 'string', 'max:100'], 'outros_pronomes' => ['nullable', 'string', 'max:255'], 'orientacao_sexual' => ['nullable', 'string', 'max:100'], 'outra_orientacao_sexual' => ['nullable', 'string', 'max:255'], 'faixa_renda' => ['nullable', 'string', 'max:100'], 'fontes_renda' => ['nullable', 'array'], 'usou_esf_6m' => ['nullable', 'boolean'], 'atendimento_esf' => ['nullable', 'string'], 'iniciou_hormonizacao' => ['nullable', 'boolean'], 'hormonizacao_tipo' => ['nullable', 'string', 'max:100'], 'deseja_hormonizacao' => ['nullable', 'string', 'max:50'], 'interesse_cirurgias' => ['nullable', 'string', 'max:50'], 'quais_cirurgias' => ['nullable', 'string'], 'participa_movimento' => ['nullable', 'boolean'], 'quais_movimentos' => ['nullable', 'string'], 'contato_telefone' => ['nullable', 'boolean'], 'telefone' => ['nullable', 'string', 'max:30'], 'contato_whatsapp' => ['nullable', 'boolean'], 'whatsapp' => ['nullable', 'string', 'max:30'], 'contato_email' => ['nullable', 'boolean'], 'email' => ['nullable', 'email', 'max:255'], // 👇 LGPD 'lgpd_consentimento' => $publico ? ['required', 'accepted'] : ['nullable'], ]; return $request->validate($rules, [ 'lgpd_consentimento.required' => 'Você precisa aceitar o termo de uso de dados (LGPD) para enviar o formulário.', 'lgpd_consentimento.accepted' => 'Você precisa aceitar o termo de uso de dados (LGPD) para enviar o formulário.', ]); } /** * Formulário público (PMAR) - requer login */ public function formularioPublico() { $user = auth()->user(); $pessoa = $user?->pessoa; // Verifica se já tem cadastro $pessoaTrans = PessoaTrans::where('user_id', $user->id)->first(); if ($pessoaTrans) { // Se já tem cadastro, mostra mensagem e redireciona return redirect() ->route('saude.pessoasTrans') ->with('info', 'Você já possui um cadastro registrado. Entre em contato com a Secretaria de Saúde para atualizações.'); } // Preenche com dados já existentes do usuário $pessoaTrans = new PessoaTrans(); $pessoaTrans->nome_civil = $pessoa?->nomeCompleto ?? $user?->name; $pessoaTrans->cpf = $user?->cpf; $pessoaTrans->cns = $pessoa?->numeroSUS; $pessoaTrans->data_nascimento = $pessoa?->dtaNascimento; $pessoaTrans->email = $user?->email; $pessoaTrans->telefone = $user?->phoneNumber; // Busca endereço do usuário se existir $endereco = $user?->endereco; if ($endereco) { $pessoaTrans->endereco = trim(implode(', ', array_filter([ $endereco->logradouro, $endereco->numero, $endereco->complemento, $endereco->bairro, $endereco->cidade, $endereco->uf, $endereco->cep ]))); } return view('paginas.saude.pessoas-trans-formulario', compact('pessoaTrans')); } /** * Salva o cadastro vindo da parte pública */ public function storePublico(Request $request) { $user = auth()->user(); // Verifica se já tem cadastro $pessoaTransExistente = PessoaTrans::where('user_id', $user->id)->first(); if ($pessoaTransExistente) { return redirect() ->route('saude.pessoasTrans') ->with('error', 'Você já possui um cadastro registrado.'); } $data = $this->validateData($request, true); // true = formulário público $data['user_id'] = $user->id; $pessoaTrans = PessoaTrans::create($data); try { \Mail::to($user->email)->send(new PessoaTransBoasVindasMail($user, $pessoaTrans)); } catch (\Throwable $e) { // silencioso: não quebra o fluxo caso o e-mail falhe } return redirect() ->route('saude.pessoasTrans') ->with('success', 'Cadastro realizado com sucesso! Enviamos um e-mail de confirmação para você.'); } protected function getCamposRelatorio(): array { return [ 'nome_social' => 'Nome social', 'nome_civil' => 'Nome civil', 'cpf' => 'CPF', 'cns' => 'CNS', 'data_nascimento' => 'Data de nascimento', 'identidade_genero' => 'Identidade de gênero', 'pronomes' => 'Pronomes', 'orientacao_sexual' => 'Orientação sexual', 'faixa_renda' => 'Faixa de renda', 'usou_esf_6m' => 'Utilizou ESF nos últimos 6 meses', 'iniciou_hormonizacao' => 'Iniciou hormonização', 'hormonizacao_tipo' => 'Tipo de hormonização', 'deseja_hormonizacao' => 'Deseja iniciar hormonização', 'interesse_cirurgias' => 'Interesse em cirurgias', 'participa_movimento' => 'Participa de movimentos', 'contato_telefone' => 'Contato por telefone', 'contato_whatsapp' => 'Contato por WhatsApp', 'contato_email' => 'Contato por e-mail', ]; } }
| ver. 1.4 |
Github
|
.
| PHP 8.3.28 | Generation time: 0.02 |
proxy
|
phpinfo
|
Settings