Implementa revisao de adjudicacoes e navegacao partilhada do SGC

This commit is contained in:
2026-10-28 17:46:59 +02:00
parent 5ff8d78803
commit ff403ea927
28 changed files with 1767 additions and 131 deletions
+10
View File
@@ -3,6 +3,7 @@
namespace App\Services;
use App\Enums\PurchasingRole;
use App\Models\AwardCancellation;
use App\Models\Equipment;
use App\Models\ProposalEvaluation;
use App\Models\PurchaseAward;
@@ -77,6 +78,7 @@ class PurchaseWorkflow
$user = app(CurrentActor::class)->lock($user);
$requisition = Requisition::query()->lockForUpdate()->findOrFail($award->requisition_id);
$award = PurchaseAward::query()->lockForUpdate()->findOrFail($award->id);
$this->assertNoPendingCancellation($award);
abort_unless($this->canDecide($user, $award, $requisition), 403);
if ($decision === 'approved') {
$this->currentBasis($user, $award, $requisition);
@@ -105,6 +107,7 @@ class PurchaseWorkflow
if ($existing) {
return $existing;
}
$this->assertNoPendingCancellation($award);
if ($award->status !== 'approved') {
throw ValidationException::withMessages(['approvals' => 'Conclua as aprovações do valor adjudicado antes de emitir a ordem.']);
}
@@ -287,4 +290,11 @@ class PurchaseWorkflow
app(EquipmentWorkflow::class)->line($line->toArray(), $requisition->department_id, $requisition->priority);
}
}
private function assertNoPendingCancellation(PurchaseAward $award): void
{
if (AwardCancellation::query()->where('purchase_award_id', $award->id)->where('status', 'pending')->exists()) {
throw ValidationException::withMessages(['cancellation' => 'Existe pedido de cancelamento pendente. Aguarde a decisão antes de aprovar ou emitir.']);
}
}
}