- Created ExampleTest and RoutesTest for basic application response and route testing. - Implemented IsolatedDatabaseTestCase for isolated database testing. - Added unit tests for various models and services including Contract, CPE, and LeadDetail. - Developed request validation tests for CreateClientRequest, UpdateClientRequest, and ContractRequest. - Introduced Vite configuration for asset management in the Laravel application.
79 lines
2.8 KiB
PHP
79 lines
2.8 KiB
PHP
<?php
|
|
|
|
namespace App\Services;
|
|
|
|
use App\Models\{PowerTier, ContractType, PaymentMethod, Typology, CuiTier, Supplier, ContractStatus};
|
|
use Illuminate\Database\Eloquent\Model;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Cache;
|
|
use Illuminate\Validation\Rule;
|
|
|
|
class ResourceService
|
|
{
|
|
private const MODELS = [
|
|
'power_tiers' => PowerTier::class,
|
|
'contract_types' => ContractType::class,
|
|
'payment_methods' => PaymentMethod::class,
|
|
'typologies' => Typology::class,
|
|
'cui_tiers' => CuiTier::class,
|
|
'suppliers' => Supplier::class,
|
|
'contract-statuses' => ContractStatus::class,
|
|
];
|
|
|
|
private function model(string $resource): string
|
|
{
|
|
abort_unless(isset(self::MODELS[$resource]), 404);
|
|
return self::MODELS[$resource];
|
|
}
|
|
|
|
public function all(string $resource)
|
|
{
|
|
return $this->model($resource)::orderBy('id')->get();
|
|
}
|
|
|
|
public function find(string $resource, $id): Model
|
|
{
|
|
$model = $this->model($resource)::findOrFail($id);
|
|
if ($resource === 'suppliers') {
|
|
abort_unless($model->status === 'A', 403, 'Este fornecedor esta inativo.');
|
|
}
|
|
return $model;
|
|
}
|
|
|
|
public function save(string $resource, Request $request, $id = null): Model
|
|
{
|
|
$modelClass = $this->model($resource);
|
|
$model = $id === null ? new $modelClass() : $this->find($resource, $id);
|
|
$rules = match ($resource) {
|
|
'contract_types', 'typologies' => ['description' => 'required|string|max:255'],
|
|
'payment_methods' => ['name' => 'required|string|max:255', 'icon' => 'required|string|max:255'],
|
|
'suppliers' => ['name' => 'required|string|max:255', 'color' => 'nullable|string|max:20'],
|
|
'contract-statuses' => [
|
|
'code' => ['required', 'string', 'max:10', Rule::unique($model->getTable(), 'code')->ignore($model->getKey())],
|
|
'description' => 'required|string|max:255',
|
|
'color' => ['nullable', 'string', 'regex:/^#([A-Fa-f0-9]{6})$/'],
|
|
],
|
|
default => ['name' => 'required|string|max:255'],
|
|
};
|
|
$model->fill($request->validate($rules));
|
|
if ($resource === 'suppliers' && $id === null) {
|
|
$model->status = 'A';
|
|
}
|
|
$model->save();
|
|
$this->invalidate($resource);
|
|
return $model;
|
|
}
|
|
|
|
public function delete(string $resource, $id): void
|
|
{
|
|
$model = $this->model($resource)::findOrFail($id);
|
|
$resource === 'contract-statuses' ? $model->delete() : $model->update(['status' => 'I']);
|
|
$this->invalidate($resource);
|
|
}
|
|
|
|
private function invalidate(string $resource): void
|
|
{
|
|
Cache::forget($resource === 'contract-statuses' ? 'contract_statuses' : $resource);
|
|
}
|
|
}
|