Preserve shared budget adapter and limited technical acceptance

This commit is contained in:
2026-10-29 13:25:06 +02:00
parent 3b1689ca0f
commit 57f6b3cc36
11 changed files with 164 additions and 172 deletions
+3 -19
View File
@@ -3,9 +3,6 @@
namespace App\Services;
use App\Enums\PurchasingRole;
use App\Models\Budget;
use App\Models\BudgetConsumption;
use App\Models\BudgetEntry;
use App\Models\GoodsReceiptItem;
use App\Models\Invoice;
use App\Models\InvoiceItem;
@@ -130,23 +127,10 @@ class InvoiceWorkflow
$this->invalid('Conferência alterada por outra factura; a validação está bloqueada.');
}
}
$commit = BudgetEntry::query()->where('requisition_id', $request->id)->where('kind', 'commit')->first();
if (! $commit) {
$this->invalid('A ordem não possui compromisso orçamental. Factura permanece pendente; não é criado saldo retroactivo.');
}
$budget = Budget::query()->lockForUpdate()->findOrFail($commit->budget_id);
if (! $budget->approved_by || (int) $budget->year !== now()->year) {
$this->invalid('Orçamento não aprovado ou fora do exercício.');
}
$amount = (int) ($budget->includes_tax ? $invoice->total_minor : $invoice->subtotal_minor);
$remaining = (int) BudgetEntry::query()->where('requisition_id', $request->id)->sum('committed_minor');
if ($amount > $remaining) {
$this->invalid('Compromisso insuficiente para a factura.');
}
BudgetEntry::query()->create(['tenant_id' => $user->tenant_id, 'budget_id' => $budget->id, 'requisition_id' => $request->id, 'created_by' => $user->id, 'kind' => 'invoice-'.$invoice->id, 'reserved_minor' => 0, 'committed_minor' => -$amount, 'created_at' => now()]);
BudgetConsumption::query()->create(['tenant_id' => $user->tenant_id, 'budget_id' => $budget->id, 'invoice_id' => $invoice->id, 'created_by' => $user->id, 'amount_minor' => $amount, 'created_at' => now()]);
$adapter = app(CommonBudget::class);
$effect = $adapter->execute(fn () => $adapter->for($user)->consume($request->id, $invoice->id, (int) $invoice->total_minor, (int) $invoice->subtotal_minor));
$invoice->update(['status' => 'validated', 'validated_by' => $user->id, 'validated_at' => now()]);
app(RequisitionWorkflow::class)->audit($user, 'invoice.validated', $request, null, ['invoice_id' => $invoice->id, 'budget_id' => $budget->id, 'consumed_minor' => $amount]);
app(RequisitionWorkflow::class)->audit($user, 'invoice.validated', $request, null, ['invoice_id' => $invoice->id] + $effect);
});
}
}