/** * Round all approved amount down to nearest full unit * * @param ClaimArray $claims * @param SEK $funds * @return SEK */ public function allocate(ClaimArray $claims, SEK $funds) { $strategy = new \byrokrat\amount\Rounder\RoundDown(); $sumBeforeAction = $claims->sumApprovedAmounts(); foreach ($claims as $claim) { $claim->setApprovedAmount($claim->getApprovedAmount()->roundTo(0, $strategy)); } return $funds->subtract($claims->sumApprovedAmounts()->subtract($sumBeforeAction)); }
/** * Calculate current ratio * * @param ClaimArray $claims * @param SEK $funds * @return SEK */ private function calculateRatio(ClaimArray $claims, SEK $funds) { $notApproved = $claims->sumNotApprovedAmounts(); if ($notApproved->isZero()) { return $notApproved; } $ratio = $funds->divideBy($notApproved); $one = new SEK('1'); return $ratio->isGreaterThan($one) ? $one : $ratio; }
public function beforeAmountNode(AmountNode $node) { try { $node->setAttribute('amount', SEK::createFromSignalString($node->getValue())); } catch (AmountException $e) { $this->addError("Invalid signaled amount %s on line %s", $node->getValue(), (string) $node->getLineNr()); } }
public function testCreateFromExchange() { $sek = SEK::createFromExchange(new EUR('10'), '10'); $this->assertInstanceOf('byrokrat\\amount\\Currency\\SEK', $sek); $this->assertEquals('100', $sek->getAmount()); }