Issues (89)

src/Domain/ValueObject/TaxRate.php (1 issue)

1
<?php
2
3
namespace ConferenceTools\Tickets\Domain\ValueObject;
4
5
use Doctrine\ORM\Mapping as ORM;
6
use JMS\Serializer\Annotation as Jms;
7
8
/**
9
 * Class TaxRate
10
 * @package ConferenceTools\Tickets\Domain\ValueObject
11
 * @ORM\Embeddable
12
 */
13
class TaxRate
14
{
15
    /**
16
     * @var string
17
     * @Jms\Type("integer")
18
     * @ORM\Column(type="integer")
19
     */
20
    private $percentage;
21
22
    /**
23
     * TaxRate constructor.
24
     * @param $percentage
25
     */
26 31
    public function __construct(int $percentage)
27
    {
28 31
        $this->percentage = $percentage;
29 31
    }
30
31
    /**
32
     * @return int
33
     */
34 1
    public function getPercentage(): int
35
    {
36 1
        return $this->percentage;
0 ignored issues
show
Bug Best Practice introduced by
The expression return $this->percentage returns the type string which is incompatible with the type-hinted return integer.
Loading history...
37
    }
38
39 3
    public function calculateTaxFromNet(Money $net): Money
40
    {
41 3
        return $net->multiply($this->getPercentageAsFloat());
42
    }
43
44 2
    public function calculateGross(Money $net): Money
45
    {
46 2
        return $net->add($this->calculateTaxFromNet($net));
47
    }
48
49 1
    public function calculateTaxFromGross(Money $gross): Money
50
    {
51 1
        return $gross->subtract($gross->multiply($this->getInversePercentage()));
52
    }
53
54 1
    public function calculateNet(Money $gross): Money
55
    {
56 1
        return $gross->subtract($this->calculateTaxFromGross($gross));
57
    }
58
59
    /**
60
     * @return float
61
     */
62 1
    private function getInversePercentage()
63
    {
64 1
        return 1 / (1 + $this->getPercentageAsFloat());
65
    }
66
67
    /**
68
     * @return float
69
     */
70 3
    private function getPercentageAsFloat(): float
71
    {
72 3
        return (float) ($this->percentage / 100);
73
    }
74
75
    /**
76
     * @param TaxRate $other
77
     * @return bool
78
     */
79 39
    public function equals(TaxRate $other): bool
80
    {
81 39
        return ($other->percentage === $this->percentage);
82
    }
83
84
    /**
85
     * @param TaxRate $other
86
     * @return int
87
     */
88 6
    public function compare(TaxRate $other): int
89
    {
90 6
        if ($this->percentage < $other->percentage) {
91 5
            return -1;
92 6
        } elseif ($this->percentage == $other->percentage) {
93 1
            return 0;
94
        } else {
95 5
            return 1;
96
        }
97
    }
98
99
    /**
100
     * @param TaxRate $other
101
     * @return bool
102
     */
103 1
    public function greaterThan(TaxRate $other): bool
104
    {
105 1
        return 1 === $this->compare($other);
106
    }
107
108
    /**
109
     * @param TaxRate $other
110
     * @return bool
111
     */
112 1
    public function lessThan(TaxRate $other): bool
113
    {
114 1
        return -1 === $this->compare($other);
115
    }
116
}