File manager - Edit - /var/www/html/portalHomolog/app/Http/Resources/ContratoResource.php
Back
<?php namespace App\Http\Resources; use App\Helpers\FileUploadHelper; use App\Http\Controllers\Controller; use App\Http\Requests\ContratoArquivoRequest; use App\Http\Requests\ContratoRequest; use App\Http\Services\ContratoService; use App\Models\Contratos\Contrato; use App\Models\Contratos\ContratoArquivo; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Log; use Illuminate\Validation\ValidationException; class ContratoResource extends Controller { public const ADMIN_FILTER_KEYS = ['q', 'ano', 'con_modalidade', 'con_status', 'page']; public function __construct( private readonly ContratoService $service ) { } public function store(ContratoRequest $request): RedirectResponse { try { DB::beginTransaction(); $this->service->create($request->validated()); DB::commit(); return redirect() ->route('admin.contratos.index', $this->adminFilterParams($request)) ->with('success', __('* Contrato criado com sucesso!')); } catch (\Throwable $e) { DB::rollBack(); Log::error('Erro ao criar contrato.', [ 'usuario_id' => auth()->id(), 'exception' => $e->getMessage(), ]); return redirect() ->back() ->withInput() ->with('error', __('* Não foi possível criar o contrato. Tente novamente ou contate o administrador.')); } } public function destroy(Request $request, Contrato $contrato): RedirectResponse { try { DB::beginTransaction(); $this->service->delete($contrato); DB::commit(); return redirect() ->route('admin.contratos.index', $this->adminFilterParams($request)) ->with('success', __('* Contrato excluído com sucesso!')); } catch (\Throwable $e) { DB::rollBack(); Log::error('Erro ao excluir contrato.', [ 'contrato_id' => $contrato->id, 'usuario_id' => auth()->id(), 'exception' => $e->getMessage(), ]); return redirect() ->back() ->withInput() ->with('error', __('* Não foi possível excluir o contrato. Tente novamente ou contate o administrador.')); } } public function storeArquivo(ContratoArquivoRequest $request, Contrato $contrato): RedirectResponse { $file = $request->file('arquivo'); if (!$file || !$file->isValid()) { throw ValidationException::withMessages([ 'arquivo' => __('* O arquivo enviado é inválido.'), ]); } $filePath = FileUploadHelper::processSafeGeneralUploadPublicDisk( $file, ContratoService::UPLOAD_STORAGE_FOLDER ); if (!$filePath) { throw ValidationException::withMessages([ 'arquivo' => __('* Não foi possível processar o arquivo enviado. Verifique o formato e tente novamente.'), ]); } try { DB::beginTransaction(); $arqDatafim = $request->input('arq_datafim') ?: null; $sequencia = (int) $request->input( 'arq_sequencia', $this->service->nextArquivoSequencia($contrato) ); $this->service->createArquivo($contrato, [ 'arq_sequencia' => $sequencia, 'arq_arquivo' => $filePath, 'arq_numero' => $request->input('arq_numero'), 'arq_titulo' => $request->input('arq_titulo'), 'arq_dataini' => $request->input('arq_dataini'), 'arq_datafim' => $arqDatafim, ]); if ($arqDatafim !== null && $this->dataAMaiorQueB($arqDatafim, (string) ($contrato->con_datafim ?? ''))) { $this->service->updateDataFim($contrato, $arqDatafim); } $this->service->touchEditadoPor($contrato); DB::commit(); return redirect() ->route('admin.contratos.arquivos', [$contrato->id] + $this->adminFilterParams($request)) ->with('success', __('* Arquivo adicionado com sucesso!')); } catch (ValidationException $e) { DB::rollBack(); throw $e; } catch (\Throwable $e) { DB::rollBack(); Log::error('Erro ao adicionar arquivo de contrato.', [ 'contrato_id' => $contrato->id, 'usuario_id' => auth()->id(), 'exception' => $e->getMessage(), ]); return redirect() ->back() ->withInput() ->with('error', __('* Não foi possível adicionar o arquivo. Tente novamente ou contate o administrador.')); } } public function updateArquivo(ContratoArquivoRequest $request, Contrato $contrato, ContratoArquivo $arquivo): RedirectResponse { if ((string) $arquivo->arq_id_contrato !== (string) $contrato->id) { return redirect()->back()->with('error', __('Arquivo inválido para este contrato.')); } $data = [ 'arq_numero' => $request->input('arq_numero') ?: null, 'arq_titulo' => $request->input('arq_titulo') ?: null, 'arq_dataini' => $request->input('arq_dataini') ?: null, 'arq_datafim' => $request->input('arq_datafim') ?: null, ]; $file = $request->file('arquivo'); if ($file && $file->isValid()) { $filePath = FileUploadHelper::processSafeGeneralUploadPublicDisk( $file, ContratoService::UPLOAD_STORAGE_FOLDER ); if (!$filePath) { throw ValidationException::withMessages([ 'arquivo' => __('* Não foi possível processar o arquivo enviado. Verifique o formato e tente novamente.'), ]); } $data['arq_arquivo'] = $filePath; } try { DB::beginTransaction(); $arqDatafimAnterior = $arquivo->arq_datafim; $this->service->updateArquivo($arquivo, $data); $novaDatafim = $data['arq_datafim']; if ($novaDatafim !== null && $this->dataAMaiorQueB($novaDatafim, (string) ($contrato->con_datafim ?? ''))) { $this->service->updateDataFim($contrato, $novaDatafim); } elseif ($arqDatafimAnterior === $contrato->con_datafim && $arqDatafimAnterior !== $novaDatafim) { $this->service->updateDataFim($contrato, $this->resolveNovaDataFim($contrato)); } $this->service->touchEditadoPor($contrato); DB::commit(); return redirect() ->route('admin.contratos.arquivos', [$contrato->id] + $this->adminFilterParams($request)) ->with('success', __('* Arquivo atualizado com sucesso!')); } catch (ValidationException $e) { DB::rollBack(); throw $e; } catch (\Throwable $e) { DB::rollBack(); Log::error('Erro ao atualizar arquivo de contrato.', [ 'contrato_id' => $contrato->id, 'arquivo_id' => $arquivo->id_arquivo, 'usuario_id' => auth()->id(), 'exception' => $e->getMessage(), ]); return redirect() ->back() ->withInput() ->with('error', __('* Não foi possível atualizar o arquivo. Tente novamente ou contate o administrador.')); } } public function destroyArquivo(Request $request, Contrato $contrato, ContratoArquivo $arquivo): RedirectResponse { if ((string) $arquivo->arq_id_contrato !== (string) $contrato->id) { return redirect()->back()->with('error', __('Arquivo inválido para este contrato.')); } try { DB::beginTransaction(); $arqDatafimRemovido = $arquivo->arq_datafim; $this->service->deleteArquivo($arquivo); if ( !empty($arqDatafimRemovido) && $arqDatafimRemovido === $contrato->con_datafim ) { $this->service->updateDataFim($contrato, $this->resolveNovaDataFim($contrato)); } $this->service->touchEditadoPor($contrato); DB::commit(); return redirect() ->route('admin.contratos.arquivos', [$contrato->id] + $this->adminFilterParams($request)) ->with('success', __('* Arquivo removido com sucesso!')); } catch (\Throwable $e) { DB::rollBack(); Log::error('Erro ao remover arquivo de contrato.', [ 'contrato_id' => $contrato->id, 'usuario_id' => auth()->id(), 'exception' => $e->getMessage(), ]); return redirect() ->back() ->withInput() ->with('error', __('* Não foi possível remover o arquivo. Tente novamente ou contate o administrador.')); } } /** * @return array<string, mixed> */ private function adminFilterParams(Request $request): array { return $request->only(self::ADMIN_FILTER_KEYS); } private function resolveNovaDataFim(Contrato $contrato): ?string { return ContratoArquivo::query() ->where('arq_id_contrato', $contrato->id) ->whereNotNull('arq_datafim') ->where('arq_datafim', '<>', '') ->pluck('arq_datafim') ->sortByDesc(fn (string $date) => $this->parseDateToComparable($date)) ->first() ?: null; } private function dataAMaiorQueB(string $dataA, string $dataB): bool { if ($dataB === '') { return $dataA !== ''; } return $this->parseDateToComparable($dataA) > $this->parseDateToComparable($dataB); } private function parseDateToComparable(string $date): string { $parts = explode('/', trim($date)); if (count($parts) !== 3) { return '00000000'; } return str_pad($parts[2], 4, '0', STR_PAD_LEFT) . str_pad($parts[1], 2, '0', STR_PAD_LEFT) . str_pad($parts[0], 2, '0', STR_PAD_LEFT); } }
| ver. 1.4 |
Github
|
.
| PHP 8.3.28 | Generation time: 0.02 |
proxy
|
phpinfo
|
Settings