File manager - Edit - /var/www/html/portalHomolog/app/Http/Services/ContratoService.php
Back
<?php namespace App\Http\Services; use App\Helpers\ContratosAccessHelper; use App\Models\Contratos\Contrato; use App\Models\Contratos\ContratoArquivo; use App\Models\Contratos\ContratoFavorecido; use Illuminate\Contracts\Pagination\LengthAwarePaginator; use Illuminate\Http\Request; use Illuminate\Support\Facades\Storage; class ContratoService { public const UPLOAD_STORAGE_FOLDER = 'contratos'; public const UPLOAD_PUBLIC_PREFIX = 'pmar/assets/files/contratos'; /** * Returns distinct years present in the contratos table, * scoped to the authenticated user's secretaria when not SysAdmin. * * @return \Illuminate\Support\Collection<int, string> */ public function getAvailableYears(): \Illuminate\Support\Collection { return Contrato::query() ->selectRaw('DISTINCT con_ano') ->when(!ContratosAccessHelper::hasGlobalAccess(), function ($query) { $query->where('con_secretaria', auth()->user()?->structure_id); }) ->whereNotNull('con_ano') ->orderByDesc('con_ano') ->pluck('con_ano'); } public function listWithFilters(Request $request, int $perPage = 20): LengthAwarePaginator { return Contrato::query() ->with(['favorecido', 'secretaria', 'secretariaGestora', 'arquivos', 'criadoPor', 'editadoPor']) ->when(!ContratosAccessHelper::hasGlobalAccess(), function ($query) { $query->where('con_secretaria', auth()->user()?->structure_id); }) ->when($request->filled('ano'), function ($query) use ($request) { $query->where('con_ano', (string) $request->input('ano')); }) ->when($request->filled('con_modalidade'), function ($query) use ($request) { $query->where('con_modalidade', (int) $request->input('con_modalidade')); }) ->when($request->filled('con_status'), function ($query) use ($request) { $query->where('con_status', (int) $request->input('con_status')); }) ->when($request->filled('q'), function ($query) use ($request) { $term = trim((string) $request->input('q')); $query->where(function ($sub) use ($term) { $sub->where('con_numero', 'like', '%' . $term . '%') ->orWhere('con_processo', 'like', '%' . $term . '%') ->orWhere('con_titulo', 'like', '%' . $term . '%'); }); }) ->orderByDesc('con_ano') ->orderByDesc('id') ->paginate($perPage) ->appends($request->query()); } public function create(array $data): Contrato { $this->upsertFavorecido($data); $data['con_criado_por'] = auth()->id(); return Contrato::create($this->sanitizeData($data)); } public function update(Contrato $contrato, array $data): Contrato { $this->upsertFavorecido($data); $contrato->update($this->sanitizeData($data)); return $contrato; } public function delete(Contrato $contrato): void { foreach ($contrato->arquivos as $arquivo) { $this->deleteArquivo($arquivo); } $contrato->delete(); } public function nextArquivoSequencia(Contrato $contrato): int { return (int) ContratoArquivo::query() ->where('arq_id_contrato', $contrato->id) ->max('arq_sequencia') + 1; } /** * @param array<string, mixed> $data */ public function createArquivo(Contrato $contrato, array $data): ContratoArquivo { return ContratoArquivo::create([ 'arq_id_contrato' => $contrato->id, 'arq_sequencia' => $data['arq_sequencia'], 'arq_arquivo' => $data['arq_arquivo'], 'arq_numero' => $data['arq_numero'] ?? null, 'arq_titulo' => $data['arq_titulo'] ?? null, 'arq_dataini' => $data['arq_dataini'] ?? null, 'arq_datafim' => $data['arq_datafim'] ?? null, ]); } public function updateDataFim(Contrato $contrato, ?string $dataFim): void { $contrato->update(['con_datafim' => $dataFim]); } /** * Updates an arquivo's metadata and optionally replaces its physical file. * Pass 'arq_arquivo' in $data only when a new file has already been stored. * * @param array<string, mixed> $data */ public function updateArquivo(ContratoArquivo $arquivo, array $data): ContratoArquivo { if (!empty($data['arq_arquivo'])) { $oldPath = ltrim((string) $arquivo->arq_arquivo, '/'); if ($oldPath !== '' && !str_contains($oldPath, '..')) { Storage::disk('public')->delete($oldPath); } $arquivo->arq_arquivo = $data['arq_arquivo']; } $arquivo->arq_numero = $data['arq_numero'] ?? null; $arquivo->arq_titulo = $data['arq_titulo'] ?? null; $arquivo->arq_dataini = $data['arq_dataini'] ?? null; $arquivo->arq_datafim = $data['arq_datafim'] ?? null; $arquivo->save(); return $arquivo; } public function deleteArquivo(ContratoArquivo $arquivo): void { $path = ltrim((string) $arquivo->arq_arquivo, '/'); if ($path !== '' && !str_contains($path, '..')) { Storage::disk('public')->delete($path); } $arquivo->delete(); } /** * @param array<string, mixed> $data * @return array<string, mixed> */ /** * Updates con_editado_por on a contrato to reflect the current user. * Called after any arquivo operation (create, update, delete). */ public function touchEditadoPor(Contrato $contrato): void { $contrato->update(['con_editado_por' => auth()->id()]); } private function sanitizeData(array $data): array { $data['con_usuario'] = auth()->id(); $data['con_editado_por'] = auth()->id(); if (!ContratosAccessHelper::hasGlobalAccess()) { $data['con_secretaria'] = auth()->user()?->structure_id; } unset($data['fav_nome'], $data['q'], $data['page'], $data['ano']); return $data; } /** * @param array<string, mixed> $data */ private function upsertFavorecido(array $data): void { $cpfCnpj = trim((string) ($data['con_favorecido'] ?? '')); $nome = trim((string) ($data['fav_nome'] ?? '')); if ($cpfCnpj === '') { return; } ContratoFavorecido::query()->updateOrCreate( ['fav_cpfcnpj' => $cpfCnpj], ['fav_nome' => $nome !== '' ? $nome : null] ); } }
| ver. 1.4 |
Github
|
.
| PHP 8.3.28 | Generation time: 0.02 |
proxy
|
phpinfo
|
Settings