1 | <?php |
||
10 | class CurrencyConverterComponent extends Component |
||
11 | { |
||
12 | private $fromCurrency; |
||
13 | |||
14 | private $toCurrency; |
||
15 | |||
16 | private $amount; |
||
17 | |||
18 | private $hourDifference; |
||
19 | |||
20 | private $saveIntoDb; |
||
21 | |||
22 | private $dataSource; |
||
23 | |||
24 | private $rate; |
||
25 | |||
26 | private $currencyTable; |
||
27 | |||
28 | /** |
||
29 | * Convertion function |
||
30 | * |
||
31 | * @param string $fromCurrency the starting currency that user wants to convert to. |
||
32 | * @param string $toCurrency the ending currency that user wants to convert to. |
||
33 | * @param float $amount the amount to convert. |
||
34 | * @param boolean $saveIntoDb if develop wants to store convertion rate for use it without resending data to yahoo service. |
||
35 | * @param int $hourDifference the hour difference to check if the last convertion is passed, if yes make a new call to yahoo finance api. |
||
36 | * @param string $dataSource which dataSOurce need to use |
||
37 | * @return float the total amount converted into the new currency |
||
38 | */ |
||
39 | 8 | public function convert( |
|
40 | $fromCurrency, |
||
41 | $toCurrency, |
||
42 | $amount, |
||
43 | $saveIntoDb = true, |
||
44 | $hourDifference = 1, |
||
45 | $dataSource = 'default' |
||
46 | ) { |
||
47 | 8 | $this->fromCurrency = $fromCurrency; |
|
48 | 8 | $this->toCurrency = $toCurrency; |
|
49 | 8 | $this->amount = $amount; |
|
50 | 8 | $this->saveIntoDb = $saveIntoDb; |
|
51 | 8 | $this->hourDifference = $hourDifference; |
|
52 | 8 | $this->dataSource = $dataSource; |
|
53 | 8 | $this->rate = 0; |
|
54 | |||
55 | 8 | if($this->fromCurrency != $this->toCurrency){ |
|
56 | 7 | $this->fixFromToCurrency(); |
|
57 | |||
58 | 7 | if($this->saveIntoDb == true){ |
|
|
|||
59 | 5 | $this->currencyTable = TableRegistry::get('CurrencyConverter', [ |
|
60 | 5 | 'className' => 'CurrencyConverter\Model\Table\CurrencyConvertersTable', |
|
61 | 'table' => 'currency_converter' |
||
62 | 5 | ]); |
|
63 | |||
64 | 5 | $this->ensureIfExistTable(); |
|
65 | 5 | $this->saveIntoDatabase(); |
|
66 | |||
67 | 5 | return $this->calculateValue(); |
|
68 | } |
||
69 | |||
70 | 2 | $this->rate = $this->getRates($this->fromCurrency, $this->toCurrency); |
|
71 | |||
72 | 2 | return $this->calculateValue(); |
|
73 | } |
||
74 | |||
75 | 1 | return number_format((double)$this->amount, 2, '.', ''); |
|
76 | } |
||
77 | |||
78 | 7 | private function fixFromToCurrency() |
|
88 | |||
89 | 5 | private function saveIntoDatabase() |
|
90 | { |
||
91 | 5 | $query = $this->currencyTable->find('all') |
|
92 | 5 | ->where(['fromCurrency' => $this->fromCurrency, 'toCurrency' => $this->toCurrency ]); |
|
93 | |||
94 | 5 | $query->hydrate(false); |
|
95 | 5 | $result = $query->toArray(); |
|
96 | |||
97 | 5 | foreach ($result as $row){ |
|
98 | 2 | $lastUpdated = $row['modified']; |
|
99 | |||
100 | 2 | $now = date('Y-m-d H:i:s'); |
|
101 | 2 | $dStart = new \DateTime($now); |
|
102 | 2 | $diff = $dStart->diff($lastUpdated); |
|
103 | |||
104 | 2 | if ($this->ensureNeedToUpdateDatabase($diff, $row)) { |
|
105 | $this->updateDatabase($row); |
||
106 | } else { |
||
107 | 2 | $this->rate = $row['rates']; |
|
108 | } |
||
109 | 5 | } |
|
110 | |||
111 | 5 | if (count($result) <= 0) { |
|
112 | 3 | $this->insertIntoDatabase(); |
|
113 | 3 | } |
|
114 | 5 | } |
|
115 | |||
116 | private function updateDatabase($row) |
||
117 | { |
||
118 | $this->rate = $this->getRates($this->fromCurrency, $this->toCurrency); |
||
119 | |||
120 | $data = [ |
||
121 | 'fromCurrency'=> $this->fromCurrency, |
||
122 | 'toCurrency' => $this->toCurrency, |
||
123 | 'rates' => $this->rate, |
||
124 | 'modified' => date('Y-m-d H:i:s'), |
||
125 | ]; |
||
126 | |||
127 | $entity = $this->currencyTable->get($row['id']); |
||
128 | $this->currencyTable->patchEntity($entity, $data); |
||
129 | $this->currencyTable->save($entity); |
||
130 | } |
||
131 | |||
132 | 3 | private function insertIntoDatabase() |
|
147 | |||
148 | 2 | private function ensureNeedToUpdateDatabase($diff, $row) |
|
149 | { |
||
158 | |||
159 | 5 | private function getRates(){ |
|
179 | |||
180 | 5 | private function ensureIfExistTable(){ |
|
201 | |||
202 | 7 | private function calculateValue() |
|
207 | } |
||
208 |
When comparing two booleans, it is generally considered safer to use the strict comparison operator.