31 lines
1.1 KiB
PHP
31 lines
1.1 KiB
PHP
<?php
|
|
|
|
namespace App\Services;
|
|
|
|
use App\Models\Budget;
|
|
use App\Models\BudgetReinforcement;
|
|
use App\Models\User;
|
|
use Brick\Math\BigDecimal;
|
|
use Illuminate\Support\Str;
|
|
|
|
class BudgetReinforcementWorkflow
|
|
{
|
|
/** @param array<string,mixed> $data */
|
|
public function propose(User $user, Budget $budget, array $data): BudgetReinforcement
|
|
{
|
|
abort_unless($user->tenant_id === $budget->tenant_id, 403);
|
|
$adapter = app(CommonBudget::class);
|
|
$amount = BigDecimal::of((string) $data['amount'])->multipliedBy(100)->toScale(0)->toInt();
|
|
$id = $adapter->execute(fn () => $adapter->for($user)->proposeReinforcement($budget->id, $amount, Str::upper(Str::squish($data['reference'])), trim($data['reason'])));
|
|
|
|
return BudgetReinforcement::query()->findOrFail($id);
|
|
}
|
|
|
|
public function review(User $user, BudgetReinforcement $reinforcement, string $decision, string $reason): void
|
|
{
|
|
abort_unless($user->tenant_id === $reinforcement->tenant_id, 403);
|
|
$adapter = app(CommonBudget::class);
|
|
$adapter->execute(fn () => $adapter->for($user)->reviewReinforcement($reinforcement->id, $decision, $reason));
|
|
}
|
|
}
|