File manager - Edit - /var/www/html/portal/app/Http/Resources/DefesaCivil/TabuaResource.php
Back
<?php namespace App\Http\Resources\DefesaCivil; use App\Helpers\FileUploadHelper; use App\Http\Controllers\Controller; use App\Http\Services\DefesaCivil\TabuaMareService; use Carbon\Carbon; use Illuminate\Http\UploadedFile; use Smalot\PdfParser\Parser; class TabuaResource extends Controller { public function __construct(private readonly TabuaMareService $tabuaService) { } public function getTabuaTresDias($data): array { try { $carbon = Carbon::parse($data); $dataAnterior = $carbon->copy()->subDay(); $dataAtual = $carbon->copy(); $dataSeguinte = $carbon->copy()->addDay(); return [ 'anterior' => [ 'data' => $dataAnterior->format('Y-m-d'), 'dataFormatada' => $dataAnterior->locale('pt_BR')->translatedFormat('d/m/Y (D)'), 'dados' => $this->tabuaService->getTabuaPorData($dataAnterior->format('Y-m-d')), ], 'atual' => [ 'data' => $dataAtual->format('Y-m-d'), 'dataFormatada' => $dataAtual->locale('pt_BR')->translatedFormat('d/m/Y (D)'), 'dados' => $this->tabuaService->getTabuaPorData($dataAtual->format('Y-m-d')), ], 'seguinte' => [ 'data' => $dataSeguinte->format('Y-m-d'), 'dataFormatada' => $dataSeguinte->locale('pt_BR')->translatedFormat('d/m/Y (D)'), 'dados' => $this->tabuaService->getTabuaPorData($dataSeguinte->format('Y-m-d')), ], ]; } catch (\Throwable $e) { return [ 'anterior' => ['data' => null, 'dataFormatada' => null, 'dados' => null], 'atual' => ['data' => null, 'dataFormatada' => null, 'dados' => null], 'seguinte' => ['data' => null, 'dataFormatada' => null, 'dados' => null], ]; } } public function getTabuaPorData(string $data): ?array { return $this->tabuaService->getTabuaPorData($data); } public function processUpload(UploadedFile $file, int $ano): array { // Validação completa do arquivo usando FileUploadHelper if (!FileUploadHelper::validateFile( $file, FileUploadHelper::ALLOWED_DOCUMENT_EXTENSIONS, FileUploadHelper::ALLOWED_DOCUMENT_MIME_TYPES )) { throw new \InvalidArgumentException('Arquivo inválido. Apenas arquivos PDF são permitidos.'); } // Gera nome de arquivo seguro $safeFileName = FileUploadHelper::generateSafeFileName( $file, FileUploadHelper::ALLOWED_DOCUMENT_EXTENSIONS ); // Faz upload com nome seguro em pasta de PDFs brutos $path = $file->storeAs('tabuas-brutas', $safeFileName, 'public'); $texto = $this->extrairTextoPDF(storage_path("app/public/{$path}")); $tabua = $this->estruturarTabua($texto, $ano); $this->tabuaService->storeJson($ano, $tabua); return [ 'path' => $path, 'tabua' => $tabua, ]; } public function listAvailableYears(): array { return $this->tabuaService->listAvailableYears(); } private function extrairTextoPDF(string $caminho): string { // Valida que o arquivo existe e está dentro do storage permitido $realPath = realpath($caminho); $storagePath = realpath(storage_path('app/public/tabuas-brutas')); if (! $realPath) { throw new \RuntimeException("Arquivo não encontrado: {$caminho}"); } if (! $storagePath || strpos($realPath, $storagePath) !== 0) { throw new \RuntimeException("Caminho de arquivo inválido. O arquivo deve estar em: {$storagePath}"); } // Valida que é um arquivo PDF válido if (! file_exists($realPath) || ! is_readable($realPath)) { throw new \RuntimeException("Arquivo não pode ser lido: {$realPath}"); } // Extração segura usando apenas a biblioteca PHP (PdfParser), // sem qualquer dependência do script Python. try { $parser = new Parser(); $pdf = $parser->parseFile($realPath); return $pdf->getText(); } catch (\Exception $e) { throw new \RuntimeException('Erro ao extrair texto do PDF: '.$e->getMessage(), 0, $e); } } private function estruturarTabua(string $texto, ?int $ano = null): array { $meses = [ 'Janeiro' => '01', 'Fevereiro' => '02', 'Março' => '03', 'Abril' => '04', 'Maio' => '05', 'Junho' => '06', 'Julho' => '07', 'Agosto' => '08', 'Setembro' => '09', 'Outubro' => '10', 'Novembro' => '11', 'Dezembro' => '12', ]; $tabua = []; $mesAtual = $diaAtual = null; if (! $ano) { $ano = preg_match('/\b(20\d{2})\b/', $texto, $m) ? (int) $m[1] : (int) date('Y'); } $linhas = preg_split("/\r\n|\n|\r/", $texto); foreach ($linhas as $linha) { $linha = trim($linha); if (isset($meses[$linha])) { $mesAtual = $meses[$linha]; continue; } if (preg_match('/^\d{1,2}$/', $linha) && $mesAtual) { $diaAtual = str_pad($linha, 2, '0', STR_PAD_LEFT); $tabua["{$ano}-{$mesAtual}-{$diaAtual}"] = []; continue; } if ($mesAtual && $diaAtual && preg_match_all('/(\d{2,4})\s+(-?\d+[.,]?\d*)/', $linha, $matches, PREG_SET_ORDER)) { $data = "{$ano}-{$mesAtual}-{$diaAtual}"; foreach ($matches as [$full, $hora, $altura]) { $horaFormatada = match (strlen($hora)) { 3 => '0'.substr($hora, 0, 1).':'.substr($hora, 1), 4 => substr($hora, 0, 2).':'.substr($hora, 2), default => $hora, }; $tabua[$data][] = [ 'hora' => $horaFormatada, 'altura' => (float) str_replace(',', '.', $altura), ]; } } } return $tabua; } }
| ver. 1.4 |
Github
|
.
| PHP 8.3.28 | Generation time: 0.02 |
proxy
|
phpinfo
|
Settings