initial commit

This commit is contained in:
2019-05-07 21:32:41 +02:00
commit f6b9517e50
46 changed files with 2479 additions and 0 deletions

View File

@@ -0,0 +1,22 @@
<?php
/*
*
*/
namespace Chill\AMLI\BudgetBundle\Calculator;
use Chill\AMLI\BudgetBundle\Entity\AbstractElement;
/**
*
* @author Julien Fastré <julien.fastre@champs-libres.coop>
*/
interface CalculatorInterface
{
/**
*
* @param AbstractElement[] $elements
*/
public function calculate(array $elements) : ?CalculatorResult;
public function getAlias();
}

View File

@@ -0,0 +1,67 @@
<?php
/*
*
*/
namespace Chill\AMLI\BudgetBundle\Calculator;
use Chill\AMLI\BudgetBundle\Entity\AbstractElement;
/**
*
*
* @author Julien Fastré <julien.fastre@champs-libres.coop>
*/
class CalculatorManager
{
/**
*
* @var CalculatorInterface[]
*/
protected $calculators = [];
protected $defaultCalculator = [];
public function addCalculator(CalculatorInterface $calculator, bool $default)
{
$this->calculators[$calculator::getAlias()] = $calculator;
if ($default) {
$this->defaultCalculator[] = $calculator::getAlias();
}
}
/**
*
* @param string $alias
* @return CalculatorInterface
*/
public function getCalculator($alias)
{
if (FALSE === \array_key_exists($alias, $this->calculators)) {
throw new \OutOfBoundsException("The calculator with alias '$alias' does "
. "not exists. Possible values are ". \implode(", ", \array_keys($this->calculators)));
}
return $this->calculators[$alias];
}
/**
*
* @param AbstractElement[] $elements
* @return CalculatorResult[]
*/
public function calculateDefault(array $elements)
{
$results = [];
foreach ($this->defaultCalculator as $alias) {
$calculator = $this->calculators[$alias];
$result = $calculator->calculate($elements);
if ($result !== null) {
$results[$calculator::getAlias()] = $result;
}
}
return $results;
}
}

View File

@@ -0,0 +1,23 @@
<?php
/*
*
*/
namespace Chill\AMLI\BudgetBundle\Calculator;
/**
*
*
* @author Julien Fastré <julien.fastre@champs-libres.coop>
*/
class CalculatorResult
{
const TYPE_RATE = 'rate';
const TYPE_CURRENCY = 'currency';
const TYPE_PERCENTAGE = 'percentage';
public $type;
public $result;
public $label;
}