Completed
Push — master ( 67432b...61d761 )
by z38
04:15
created

Mixed   A

Complexity

Total Complexity 8

Size/Duplication

Total Lines 84
Duplicated Lines 0 %

Coupling/Cohesion

Components 1
Dependencies 1

Test Coverage

Coverage 86.36%

Importance

Changes 5
Bugs 0 Features 3
Metric Value
wmc 8
c 5
b 0
f 3
lcom 1
cbo 1
dl 0
loc 84
ccs 19
cts 22
cp 0.8636
rs 10

6 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 5 1
A getCurrency() 0 4 1
A getDecimals() 0 4 1
A plus() 0 6 1
A minus() 0 6 1
A normalizeDecimals() 0 12 3
1
<?php
2
3
namespace Z38\SwissPayment\Money;
4
5
/**
6
 * Sum of money in mixed currencies
7
 */
8
class Mixed extends Money
9
{
10
    /**
11
     * @var int
12
     */
13
    protected $decimals;
14
15
    /**
16
     * Constructor
17
     *
18
     * @param int $cents    Amount of money in cents
19
     * @param int $decimals Number of minor units
20
     */
21 2
    public function __construct($cents, $decimals = 0)
22
    {
23 2
        parent::__construct($cents);
24 2
        $this->decimals = $decimals;
25 2
    }
26
27
    /**
28
     * {@inheritdoc}
29
     */
30
    final public function getCurrency()
31
    {
32
        return null;
33
    }
34
35
    /**
36
     * {@inheritdoc}
37
     */
38 2
    final protected function getDecimals()
39
    {
40 2
        return $this->decimals;
41
    }
42
43
    /**
44
     * Returns the sum of this and an other amount of money
45
     *
46
     * @param Money $addend The addend
47
     *
48
     * @return Money The sum
49
     */
50 3
    public function plus(Money $addend)
51
    {
52 3
        list($thisCents, $addendCents, $decimals) = self::normalizeDecimals($this, $addend);
53
54 3
        return new static($thisCents + $addendCents, $decimals);
55
    }
56
57
    /**
58
     * Returns the subtraction of this and an other amount of money
59
     *
60
     * @param Money $subtrahend The subtrahend
61
     *
62
     * @return Money The difference
63
     */
64 1
    public function minus(Money $subtrahend)
65
    {
66 1
        list($thisCents, $subtrahendCents, $decimals) = self::normalizeDecimals($this, $subtrahend);
67
68 1
        return new static($thisCents - $subtrahendCents, $decimals);
69
    }
70
71
    /**
72
     * Normalizes two amounts such that they have the same number of decimals
73
     *
74
     * @param Money $a
75
     * @param Money $b
76
     *
77
     * @return array An array containing the two amounts and number of decimals
78
     */
79 2
    protected static function normalizeDecimals(Money $a, Money $b)
80
    {
81 2
        $decimalsDiff = ($a->getDecimals() - $b->getDecimals());
82 2
        $decimalsMax = max($a->getDecimals(), $b->getDecimals());
83 2
        if ($decimalsDiff > 0) {
84
            return array($a->getAmount(), pow(10, $decimalsDiff) * $b->getAmount(), $decimalsMax);
85 2
        } elseif ($decimalsDiff < 0) {
86 2
            return array(pow(10, -$decimalsDiff) * $a->getAmount(), $b->getAmount(), $decimalsMax);
87
        } else {
88 2
            return array($a->getAmount(), $b->getAmount(), $decimalsMax);
89
        }
90
    }
91
}
92