Files
voltcerto/app/Services/ResourceService.php
Luis Medon e488ae3342 Add feature tests, unit tests, and configuration for Laravel application
- 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.
2026-10-29 11:30:06 +00:00

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);
}
}