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 = (bool)$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(); |
|
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->enableHydration(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) |
||
131 | |||
132 | 3 | private function insertIntoDatabase() |
|
147 | |||
148 | 2 | private function ensureNeedToUpdateDatabase($diff, $row) |
|
158 | |||
159 | 5 | private function getRates() |
|
160 | { |
||
161 | 5 | $url = 'http://api.fixer.io/latest?base=' . $this->fromCurrency . '&symbols=' . $this->toCurrency; |
|
162 | |||
163 | 5 | $handle = @fopen($url, 'r'); |
|
164 | |||
165 | 5 | if ($handle) { |
|
166 | 4 | $result = fgets($handle, 4096); |
|
167 | 4 | fclose($handle); |
|
168 | 4 | } |
|
169 | |||
170 | 5 | if (isset($result)) { |
|
171 | 4 | $conversion = json_decode($result, true); |
|
172 | |||
173 | 4 | if (isset($conversion['rates'][$this->toCurrency])) { |
|
174 | 4 | return $conversion['rates'][$this->toCurrency]; |
|
175 | } |
||
176 | } |
||
177 | |||
178 | 1 | return $this->rate = 0; |
|
179 | } |
||
180 | |||
181 | 5 | private function ensureIfExistTable() |
|
203 | |||
204 | 7 | private function calculateValue() |
|
209 | } |
||
210 |