File manager - Edit - /var/www/html/portal/app/Http/Services/LicitacaoProcedimentoService.php
Back
<?php namespace App\Http\Services; use App\Helpers\FileUploadHelper; use App\Models\LicitacoesProcedimentos\Processo; use App\Models\LicitacoesProcedimentos\ProcessoUpload; use Illuminate\Contracts\Pagination\LengthAwarePaginator; use Illuminate\Http\Request; class LicitacaoProcedimentoService { public const UPLOAD_PUBLIC_PREFIX = 'pmar/assets/img/licitacoes_procedimentos'; public const UPLOAD_STORAGE_FOLDER = 'licitacoes_procedimentos'; public const LEGACY_UPLOAD_BASE_URL = 'https://angra.rj.gov.br/SAPO/_licitacao/adm/upload/'; private const LEGACY_UPLOAD_PREFIX = 'pmar/assets/img/licitacoes_procedimentos/'; /** * Caminho físico único dos uploads. */ public static function physicalUploadStorageDir(): string { return storage_path('app/public/licitacoes_procedimentos'); } /** * Normaliza caminho gravado no banco para o prefixo público atual. */ public static function normalizeUploadPublicPath(string $path): string { $normalized = str_replace('\\', '/', trim($path)); if ($normalized === '') { return $normalized; } if (str_starts_with($normalized, self::LEGACY_UPLOAD_PREFIX)) { return self::UPLOAD_PUBLIC_PREFIX . '/' . basename($normalized); } $legacySapoPrefix = 'SAPO/_licitacao/adm/upload/'; if (str_starts_with($normalized, $legacySapoPrefix)) { return self::UPLOAD_PUBLIC_PREFIX . '/' . basename($normalized); } return $normalized; } /** * Resolve URL pública de upload, suportando legado e novos arquivos em storage. */ public static function resolveUploadPublicUrl(?string $path): ?string { $normalized = self::normalizeUploadPublicPath((string) $path); if ($normalized === '') { return null; } if (preg_match('#^https?://#i', $normalized)) { return $normalized; } if (str_starts_with($normalized, self::UPLOAD_PUBLIC_PREFIX . '/')) { return asset($normalized); } if (str_starts_with($normalized, 'SAPO/_licitacao/adm/upload/')) { return self::LEGACY_UPLOAD_BASE_URL . basename($normalized); } if (str_starts_with($normalized, 'pmar/assets/img/')) { return asset($normalized); } if (str_starts_with($normalized, 'storage/')) { return asset($normalized); } // Registros legados podem salvar apenas o nome do arquivo. if (!str_contains($normalized, '/')) { return self::LEGACY_UPLOAD_BASE_URL . rawurlencode($normalized); } return asset('storage/' . ltrim($normalized, '/')); } public function listWithFilters(Request $request, int $perPage = 20): LengthAwarePaginator { return Processo::query() ->with('uploads') ->when($request->filled('ano'), function ($query) use ($request) { $query->whereYear('dt_data', (int) $request->input('ano')); }) ->when($request->filled('tipo_processo'), function ($query) use ($request) { $query->where('tipo_processo', (string) $request->input('tipo_processo')); }) ->when( $request->filled('tipo_processo') && $request->filled('tipo'), function ($query) use ($request) { $query->where('cd_tipo', (int) $request->input('tipo')); } ) ->when($request->filled('status'), function ($query) use ($request) { $query->where('cd_status', (int) $request->input('status')); }) ->when($request->filled('nr_processo'), function ($query) use ($request) { $term = '%' . trim((string) $request->input('nr_processo')) . '%'; $query->where(function ($subQuery) use ($term) { $subQuery->where('nr_processo', 'like', $term) ->orWhere('nr_licitacao', 'like', $term); }); }) ->orderByDesc('id') ->paginate($perPage) ->appends($request->query()); } public function create(array $data): Processo { return Processo::create($this->sanitizeData($data)); } public function update(Processo $processo, array $data): Processo { $processo->update($this->sanitizeData($data)); return $processo; } public function delete(Processo $processo): void { foreach ($processo->uploads as $upload) { $this->deleteUploadFile($upload->ds_arquivo); } $processo->delete(); } public function storeUploads(Processo $processo, Request $request): void { $files = $request->file('uploads', []); $legendas = $request->input('uploads_legendas', []); foreach ($files as $index => $file) { if (!$file || !$file->isValid()) { continue; } $filePath = FileUploadHelper::processSafeGeneralUploadPublicDisk($file, self::UPLOAD_STORAGE_FOLDER); if (!$filePath) { continue; } ProcessoUpload::create([ 'licitacao_procedimento_id' => $processo->id, 'dt_data' => now(), 'ds_arquivo' => $filePath, 'ds_legenda' => $legendas[$index] ?? null, 'qt_cliques' => 0, ]); } } public function removeUpload(ProcessoUpload $upload): void { $this->deleteUploadFile($upload->ds_arquivo); $upload->delete(); } public function incrementClick(ProcessoUpload $upload): void { $upload->increment('qt_cliques'); } private function sanitizeData(array $data): array { if (array_key_exists('cd_tipo', $data) && is_numeric($data['cd_tipo'])) { $data['cd_tipo'] = (int) $data['cd_tipo']; } if (array_key_exists('cd_status', $data) && is_numeric($data['cd_status'])) { $data['cd_status'] = (int) $data['cd_status']; } if (array_key_exists('id_setor', $data) && $data['id_setor'] !== null && $data['id_setor'] !== '') { $data['id_setor'] = (string) $data['id_setor']; } unset( $data['uploads'], $data['uploads_legendas'], $data['ano'], $data['tipo'], $data['status'], $data['page'] ); return $data; } private function deleteUploadFile(?string $path): void { if (empty($path)) { return; } $normalized = str_replace('\\', '/', $path); $fullPath = null; if (str_starts_with($normalized, 'pmar/assets/img/')) { $relative = substr($normalized, strlen('pmar/assets/img/')); $fullPath = storage_path('app/public/' . $relative); } elseif (str_starts_with($normalized, self::UPLOAD_PUBLIC_PREFIX . '/')) { $fullPath = storage_path('app/public/' . $normalized); } else { $candidate = storage_path('app/public/' . ltrim($normalized, '/')); if (is_file($candidate)) { $fullPath = $candidate; } } if ($fullPath && is_file($fullPath)) { @unlink($fullPath); } } }
| ver. 1.4 |
Github
|
.
| PHP 8.3.28 | Generation time: 0.02 |
proxy
|
phpinfo
|
Settings