File manager - Edit - /var/www/html/portalHomolog/app/Http/Controllers/Saude/Fibromialgia/FibromialgiaController.php
Back
<?php namespace App\Http\Controllers\Saude\Fibromialgia; use App\Http\Controllers\Controller; use App\Models\Saude\Fibromialgia\Fibromialgia; use App\Models\Saude\Fibromialgia\FibromialgiaChamado; use App\Models\Endereco; use App\Models\User; use App\Mail\StatusCarteirinhaFibromialgiaMail; use Illuminate\Http\Request; use App\Http\Requests\Saude\Fibromialgia\FibromialgiaRequest; use Illuminate\Support\Facades\Hash; use LaravelLegends\PtBrValidator\Rules\FormatoCpf; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Mail; use App\Mail\CadastroPacienteMail; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Session; use App\Http\Services\Saude\Fibromialgia\FibromialgiaService; use App\Http\Controllers\Saude\Fibromialgia\Concerns\ResolvesFibromialgiaUser; use App\Http\Services\Accounts\AccountService; use Illuminate\Pagination\LengthAwarePaginator; //use Barryvdh\DomPDF\PDF; use Barryvdh\DomPDF\Facade\Pdf; use setasign\Fpdi\Tcpdf\Fpdi; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Response; use Illuminate\View\View; use Illuminate\Database\Eloquent\Collection; use Illuminate\Support\Facades\File; use Illuminate\Support\Facades\Storage; use Illuminate\Support\Carbon; class FibromialgiaController extends Controller { use ResolvesFibromialgiaUser; private $permissao = "GERENCIADOR_DO_CADASTRO_DE_PACIENTES_COM_FIBROMIALGIA"; public function verify(Request $request): View|RedirectResponse { $response = $this->checkPermissao($this->permissao, "editar"); if ($response instanceof RedirectResponse) { return $response; } if ($request->isMethod("POST")) { try { $request->validate([ 'cpf' => ['required', new FormatoCpf] ]); if (!$this->validaCPF($request->cpf)) { return redirect() ->back() ->withInput() ->with('error', 'O CPF informado é inválido!'); } } catch (\Illuminate\Validation\ValidationException $e) { return redirect() ->back() ->withInput() ->with('error', '* O campo CPF não possui o formato válido.'); } $FibromialgiaService = new FibromialgiaService(); $user = $FibromialgiaService->getUserWithId($request->cpf); if ($user instanceof User) { if ($user->fibromialgia()->exists()) { return redirect()->route('admin.saude.fibromialgia.edit', $user->fibromialgia->id) ->with('info', '* Usuário encontrado, o mesmo já é paciete com fibromialgia.'); } else if ($fibromialgia = $FibromialgiaService->create(["user_id" => $user->id])) { return redirect()->route('admin.saude.fibromialgia.edit', $fibromialgia->id) ->with('info', '* Usuário encontrado, mas sem cadastro de paciete com fibromialgia.'); } else { return redirect()->route('admin.cultura.fibromialgia.index') ->with('info', '* Ocorreu um erro inesperado ao tentar localizar esse usuário por este CPF.'); } } Session::put('cpfTmp', $request->cpf); return redirect()->route('admin.saude.fibromialgia.create')->with('error', '* Usuário não encontrado.'); } return view('admin.saude.fibromialgia.verified'); } public function index(Request $request): View|LengthAwarePaginator|RedirectResponse { $response = $this->checkPermissao($this->permissao, "visualizar"); if ($response instanceof RedirectResponse) { return $response; } $FibromialgiaService = new FibromialgiaService(); $pacientes = $FibromialgiaService->index($request); $camposFibromialgia = $FibromialgiaService->getCamposFibromialgia(); $carteirinhaStatuses = \App\Enums\CarteirinhaPaciente::cases(); $cadastroStatuses = \App\Enums\StatusCadastro::cases(); return view('admin.saude.fibromialgia.index', compact('pacientes', 'camposFibromialgia', 'carteirinhaStatuses', 'cadastroStatuses')); } public function create(): View|RedirectResponse { $response = $this->checkPermissao($this->permissao, "adicionar"); if ($response instanceof RedirectResponse) { return $response; } return view('admin.saude.fibromialgia.create'); } public function store(FibromialgiaRequest $request): RedirectResponse { $response = $this->checkPermissao($this->permissao, "adicionar"); if ($response instanceof RedirectResponse) { return $response; } $request->validated(); if (!$this->validaCPF($request->cpf)) { return redirect() ->back() ->withInput() ->withErrors(['cpf' => 'O número de CPF informado não é válido!']) ->with('error', 'O número de CPF informado não é válido!'); } $fullName = $this->resolveFullname($request->fullName); $array_user = [ "structure_id" => $request->input('structure_id') ?: null, "firstName" => $fullName["firstName"], "lastName" => $fullName["lastName"], "cpf" => $request->cpf, "matriculation" => $request->matriculation, "phoneNumber" => $request->phoneNumber, "email" => $request->email, "password" => bcrypt("mudar123"), "photo" => $this->getPathImageUserField($request, 'photo', null), "status" => $request->status, 'isPasswordDefault' => 1, "isWhatsapp" => $request->boolean('isWhatsapp') ? 1 : 0, ]; $FibromialgiaService = new FibromialgiaService(); return $FibromialgiaService->store($array_user); } public function edit(Fibromialgia $fibromialgia): View|RedirectResponse { $response = $this->checkPermissao($this->permissao, "editar"); if ($response instanceof RedirectResponse) { return $response; } $paciente = $fibromialgia; $user = $this->userDoPaciente($fibromialgia); if ($user instanceof RedirectResponse) { return $user; } return view('admin.saude.fibromialgia.edit', compact(['paciente', 'user'])); } public function update(FibromialgiaRequest $request, Fibromialgia $fibromialgia): RedirectResponse { $response = $this->checkPermissao($this->permissao, "editar"); if ($response instanceof RedirectResponse) { return $response; } $request->validated(); if (!$this->validaCPF($request->cpf)) { return redirect() ->back() ->withInput() ->with('error', 'O número de CPF informado não é válido!'); } $fullName = $this->resolveFullname($request->fullName); $user = $this->userDoPaciente($fibromialgia); if ($user instanceof RedirectResponse) { return $user; } $array_user = [ "structure_id" => $user->structure_id, "firstName" => $fullName["firstName"], "lastName" => $fullName["lastName"], "cpf" => $request->cpf, "matriculation" => $request->matriculation, "phoneNumber" => $request->phoneNumber, "email" => $request->email, "status" => $request->status, "photo" => $this->getPathImageUserField($request, 'photo', $user), "isWhatsapp" => $request->boolean('isWhatsapp') ? 1 : 0, ]; if ($request->boolean('resetPasswordCheckbox')) { $array_user['password'] = bcrypt($request->password); $array_user['isPasswordDefault'] = 1; } $FibromialgiaService = new FibromialgiaService(); return $FibromialgiaService->update($request, $user, $array_user); } public function destroyArquivo(Fibromialgia $fibromialgia, string $label): RedirectResponse { $response = $this->checkPermissao($this->permissao, "excluir"); if ($response instanceof RedirectResponse) { return $response; } $this->handleFileDestroyArquivo($fibromialgia->$label); $FibromialgiaService = new FibromialgiaService(); return $FibromialgiaService->destroyArquivo($fibromialgia, $label); } public function relatorio(Request $request): Response|RedirectResponse { $response = $this->checkPermissao($this->permissao, "visualizar"); if ($response instanceof RedirectResponse) { return $response; } $FibromialgiaService = new FibromialgiaService(); if ($request->input('tipo_relatorio') == "cadastro") { if ($request->input('estado_cadastro') == null) { return redirect() ->route("admin.saude.fibromialgia.index") ->with('error', 'Selecione ao menos um estado de cadastro.'); } $filtrosSelecionados = $request->input('estado_cadastro'); sort($filtrosSelecionados, SORT_STRING | SORT_FLAG_CASE); $pacientes = $FibromialgiaService->relatorioDeCadastros($filtrosSelecionados); if ($pacientes instanceof RedirectResponse) { return $pacientes; } $campos = $filtrosSelecionados; return Pdf::loadView('admin.saude.fibromialgia.relatorios.cadastros', compact(['pacientes', 'filtrosSelecionados', 'campos'])) ->setPaper('a4', 'landscape') ->stream('relatorio_cadastros_fibromialgia_' . now()->format('YmdHis') . '.pdf'); } else if ($request->input('tipo_relatorio') == "dadosCadastrados") { $camposSelecionados = array_filter( $request->input('campos_dados', []), fn($v) => !empty($v) ); if (empty($camposSelecionados)) { return redirect() ->route("admin.saude.fibromialgia.index") ->with('error', 'Selecione ao menos um dado de usuário.'); } $camposFibromialgia = $FibromialgiaService->getCamposFibromialgia(); $campos = []; foreach ($camposSelecionados as $valor) { foreach ($camposFibromialgia as $key => $value) { if ($valor == $key) { $campos[$key] = $value; } } } $pacientes = $FibromialgiaService->relatorioDadosPacientes(); return Pdf::loadView('admin.saude.fibromialgia.relatorios.dados', compact(['pacientes', 'campos'])) ->setPaper('a4', 'landscape') ->stream('relatorio_cadastros_fibromialgia_' . now()->format('YmdHis') . '.pdf'); } else if ($request->input('tipo_relatorio') == "carteirinha") { $statusCarteirinhaPaciente = $request->input('carteirinha_paciente', []); if (empty($statusCarteirinhaPaciente)) { return redirect() ->route("admin.saude.fibromialgia.index") ->with('error', 'Selecione ao menos um status da carteirinha.'); } $pacientes = $FibromialgiaService->relatorioCarteirinhaPaciente($statusCarteirinhaPaciente); return Pdf::loadView('admin.saude.fibromialgia.relatorios.andamento', compact(['pacientes', 'statusCarteirinhaPaciente'])) ->setPaper('a4', 'landscape') ->stream('relatorio_cadastros_fibromialgia_' . now()->format('YmdHis') . '.pdf'); } return redirect() ->route("admin.saude.fibromialgia.index") ->with('error', 'Para gerar relatórios é necessário especificar um tipo de filtro.'); } public function carteirinhas(Request $request): Response|RedirectResponse { $response = $this->checkPermissao($this->permissao, "visualizar"); if ($response instanceof RedirectResponse) { return $response; } $ids = $request->input('ids', []); if (empty($ids)) { return redirect() ->route("admin.saude.fibromialgia.index") ->with('error', 'Selecione ao menos um paciente para gerar a carteirinha.'); } $FibromialgiaService = new FibromialgiaService(); $pacientes = $FibromialgiaService->relatorioCarteirinhas($request, $ids); if ($pacientes->isEmpty()) { return redirect() ->route("admin.saude.fibromialgia.index") ->with('error', 'Nenhum paciente encontrado com os critérios selecionados.'); } $pdf = new Fpdi('P', 'mm', 'A4', true, 'UTF-8', false); $pdf->setPrintHeader(false); $pdf->setPrintFooter(false); $pdf->SetAutoPageBreak(false, 0); $pdf->SetMargins(15, 15, 15); $frentePath = public_path('pmar/assets/img/fibromialgia-cartao-de-prioridade-frente.pdf'); $versoPath = public_path('pmar/assets/img/fibromialgia-cartao-de-prioridade-verso.pdf'); $defaultFoto = public_path('pmar/assets/img/neutro.png'); $frenteFixed = $this->fixPdfHeader($frentePath); $versoFixed = $this->fixPdfHeader($versoPath); $cardWidth = 85; $marginTop = 20; $marginLeft = 15; $espacamento = 10; foreach ($pacientes as $paciente) { $fotoPath = $defaultFoto; $path = public_path('pmar/assets/img/neutro.png'); if (!empty($paciente->fileFoto)) { $path = public_path($paciente->fileFoto); if (file_exists($path)) { $fotoPath = $path; } elseif (Storage::exists($paciente->fileFoto)) { $fotoPath = Storage::path($paciente->fileFoto); } else { $path = public_path('pmar/assets/img/neutro.png'); //Log::warning("Foto não encontrada para paciente ID {$paciente->id}: {$paciente->fileFoto}"); } } $pdf->AddPage(); $x_frente = $marginLeft; $y_frente = $marginTop; $pdf->setSourceFile($frenteFixed); $tplIdx = $pdf->importPage(1); $pdf->useTemplate($tplIdx, $x_frente, $y_frente, $cardWidth); $pdf->SetFont('helvetica', 'B', 8); $pdf->SetXY($x_frente + 30, $y_frente + 22.2); $pdf->Cell(40, 4, $paciente->user->cpf ?? '', 0, 1, 'L'); $dataNasc = $paciente->user->pessoa?->dtaNascimento ? Carbon::parse($paciente->user->pessoa->dtaNascimento)->format('d/m/Y') : '--/--/----'; $pdf->SetXY($x_frente + 32, $y_frente + 29.5); $pdf->Cell(40, 4, $dataNasc, 0, 1, 'L'); $pdf->SetFont('helvetica', 'B', 7); $pdf->SetXY($x_frente + 4.4, $y_frente + 36); $pdf->MultiCell(49.5, 4, mb_strtoupper($paciente->user->name), 0, 'C'); $pdf->Image($fotoPath, $x_frente + 56, $y_frente + 20, 25, 30, '', '', '', false, 300); $x_verso = $marginLeft + $cardWidth + $espacamento; $y_verso = $marginTop; $pdf->setSourceFile($versoFixed); $tplIdx = $pdf->importPage(1); $pdf->useTemplate($tplIdx, $x_verso, $y_verso, $cardWidth); $pdf->SetFont('helvetica', 'B', 10); $pdf->SetXY($x_verso + 32, $y_verso + 5); $pdf->Cell(40, 5, 'Fibromialgia (CID M79.7)', 0, 1, 'L'); } $pdf->Output('carteirinha-de-pacientes-' . now()->format('Ymd_His') . '.pdf', 'I'); } private function fixPdfHeader(string $filePath): string { $realPath = realpath($filePath); if ($realPath === false) { throw new \RuntimeException("Caminho de arquivo inválido: {$filePath}"); } $baseDir = realpath(public_path('pmar/assets/img')); if ($baseDir === false) { throw new \RuntimeException("Diretório base inválido para arquivos de fibromialgia."); } // Garante que o arquivo esteja dentro do diretório permitido $baseDir = rtrim($baseDir, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR; if (strpos($realPath, $baseDir) !== 0) { throw new \RuntimeException("Caminho de arquivo inválido para processamento de PDF."); } if (!is_file($realPath) || !is_readable($realPath)) { throw new \RuntimeException("Arquivo PDF inválido ou inacessível."); } $content = file_get_contents($realPath); if ($content === false) { throw new \RuntimeException("Não foi possível ler o arquivo PDF: {$filePath}"); } $pos = strpos($content, '%PDF-'); if ($pos === false) { throw new \RuntimeException("Cabeçalho PDF não encontrado no arquivo: {$filePath}"); } if ($pos > 0) { $content = substr($content, $pos); } $tmpFile = tempnam(sys_get_temp_dir(), 'pdf_fix_'); file_put_contents($tmpFile, $content); return $tmpFile; } public function destroy(Request $request, Fibromialgia $fibromialgia) : RedirectResponse { $response = $this->checkPermissao($this->permissao, "excluir"); if ($response instanceof RedirectResponse) { return $response; } $this->handleFileDestroyArquivo($fibromialgia->fileFoto); $this->handleFileDestroyArquivo($fibromialgia->fileLaudo); $this->handleFileDestroyArquivo($fibromialgia->fileRG); $this->handleFileDestroyArquivo($fibromialgia->fileCPF); $this->handleFileDestroyArquivo($fibromialgia->fileCartaoSUS); $FibromialgiaService = new FibromialgiaService(); return $FibromialgiaService->destroy($request, $fibromialgia); } }
| ver. 1.4 |
Github
|
.
| PHP 8.3.28 | Generation time: 0.02 |
proxy
|
phpinfo
|
Settings