5 - Integrate buffer multiplier into pipeline allocation service

This commit is contained in:
myrmidex 2026-03-20 00:28:20 +01:00
parent 772f4c1c5a
commit 50b7caf1f9
2 changed files with 71 additions and 1 deletions

View file

@ -81,7 +81,7 @@ private function calculateBucketAllocation(Bucket $bucket, int $remainingAmount)
*/
private function calculateFixedAllocation(Bucket $bucket, int $remainingAmount): int
{
$bucketCapacity = (int) ($bucket->allocation_value ?? 0);
$bucketCapacity = (int) round($bucket->getEffectiveCapacity());
$currentBalance = $bucket->getCurrentBalance();
$availableSpace = max(0, $bucketCapacity - $currentBalance);

View file

@ -339,4 +339,74 @@ public function test_percentage_allocation_with_insufficient_remaining_amount()
$this->assertEquals(95000, $draws[0]->amount);
$this->assertEquals(1000, $draws[1]->amount); // 20% of $50
}
public function test_fixed_allocation_respects_buffer_multiplier(): void
{
Bucket::factory()->create([
'scenario_id' => $this->scenario->id,
'allocation_type' => BucketAllocationTypeEnum::FIXED_LIMIT,
'allocation_value' => 50000,
'buffer_multiplier' => 1.0,
'starting_amount' => 0,
'priority' => 1,
]);
// Effective capacity = 50000 * (1 + 1.0) = 100000
$draws = $this->service->allocateInflow($this->scenario, 100000);
$this->assertCount(1, $draws);
$this->assertEquals(100000, $draws[0]->amount);
}
public function test_fixed_allocation_with_buffer_partially_filled(): void
{
$bucket = Bucket::factory()->create([
'scenario_id' => $this->scenario->id,
'allocation_type' => BucketAllocationTypeEnum::FIXED_LIMIT,
'allocation_value' => 50000,
'buffer_multiplier' => 1.0,
'starting_amount' => 30000,
'priority' => 1,
]);
// Effective capacity = 100000, balance = 30000, available = 70000
$draws = $this->service->allocateInflow($this->scenario, 80000);
$this->assertCount(1, $draws);
$this->assertEquals(70000, $draws[0]->amount);
}
public function test_buffer_does_not_affect_percentage_allocation(): void
{
Bucket::factory()->create([
'scenario_id' => $this->scenario->id,
'allocation_type' => BucketAllocationTypeEnum::PERCENTAGE,
'allocation_value' => 25.00,
'buffer_multiplier' => 1.0,
'starting_amount' => 0,
'priority' => 1,
]);
$draws = $this->service->allocateInflow($this->scenario, 100000);
$this->assertCount(1, $draws);
$this->assertEquals(25000, $draws[0]->amount); // 25% of 100000
}
public function test_buffer_does_not_affect_unlimited_allocation(): void
{
Bucket::factory()->create([
'scenario_id' => $this->scenario->id,
'allocation_type' => BucketAllocationTypeEnum::UNLIMITED,
'allocation_value' => null,
'buffer_multiplier' => 1.0,
'starting_amount' => 0,
'priority' => 1,
]);
$draws = $this->service->allocateInflow($this->scenario, 100000);
$this->assertCount(1, $draws);
$this->assertEquals(100000, $draws[0]->amount);
}
}