Issues (92)

src/tools/MonthlyBillQuantityFixer.php (1 issue)

1
<?php
2
3
namespace hiqdev\billing\hiapi\tools;
4
5
use hiqdev\billing\hiapi\charge\Generalizer;
6
use hiqdev\billing\hiapi\type\TypeSemantics;
7
use hiqdev\php\billing\bill\BillInterface;
8
use hiqdev\php\billing\charge\GeneralizerInterface;
9
use hiqdev\php\units\Quantity;
10
use hiqdev\php\units\QuantityInterface;
11
use hiqdev\php\units\Unit;
12
13
/**
14
 * Normally, when monthly charges are put in the single bill, the bill quantity
15
 * increases accordingly. But it's not the right scenario for monthly bills: all
16
 * the charges are for the month quantity, but the whole bill is for one month as well.
17
 *
18
 * Class MonthlyBillQuantityFixer is applicable only for monthly bills and
19
 * adjusts the quantity of monthly bills according to the number of days in month.
20
 *
21
 * @author Dmytro Naumenko <[email protected]>
22
 */
23
final class MonthlyBillQuantityFixer
24
{
25
    /**
26
     * @var Generalizer
27
     */
28
    private $generalizer;
29
30
    /**
31
     * @var TypeSemantics
32
     */
33
    private $typeSemantics;
34
35
    public function __construct(
36
        GeneralizerInterface $generalizer,
37
        TypeSemantics $typeSemantics
38
    ) {
39
        $this->generalizer = $generalizer;
0 ignored issues
show
Documentation Bug introduced by
$generalizer is of type hiqdev\php\billing\charge\GeneralizerInterface, but the property $generalizer was declared to be of type hiqdev\billing\hiapi\charge\Generalizer. Are you sure that you always receive this specific sub-class here, or does it make sense to add an instanceof check?

Our type inference engine has found a suspicous assignment of a value to a property. This check raises an issue when a value that can be of a given class or a super-class is assigned to a property that is type hinted more strictly.

Either this assignment is in error or an instanceof check should be added for that assignment.

class Alien {}

class Dalek extends Alien {}

class Plot
{
    /** @var  Dalek */
    public $villain;
}

$alien = new Alien();
$plot = new Plot();
if ($alien instanceof Dalek) {
    $plot->villain = $alien;
}
Loading history...
40
        $this->typeSemantics = $typeSemantics;
41
    }
42
43
    /**
44
     * @param BillInterface $bill
45
     */
46
    public function __invoke($bill): void
47
    {
48
        if ($this->typeSemantics->isMonthly($bill->getType())) {
49
            $bill->setQuantity($this->calculateMonthlyQuantity($bill));
50
        }
51
    }
52
53
    private function calculateMonthlyQuantity(BillInterface $bill): QuantityInterface
54
    {
55
        $res = null;
56
        foreach ($bill->getCharges() as $charge) {
57
            $amount = $this->generalizer->generalizeQuantity($charge);
58
            if (!$amount->getUnit()->isConvertible(Unit::days())) {
59
                continue;
60
            }
61
            if ($res === null || $amount->compare($res)>0) {
62
                $res = $amount;
63
            }
64
        }
65
        return $res ?? Quantity::create('days', 1);
66
    }
67
}
68