1
|
|
|
<?php |
2
|
|
|
namespace Yabacon\Paystack; |
3
|
|
|
|
4
|
|
|
class Fee |
5
|
|
|
{ |
6
|
|
|
const DEFAULT_PERCENTAGE = 0.015; |
7
|
|
|
const DEFAULT_ADDITIONAL_CHARGE = 10000; |
8
|
|
|
const DEFAULT_THRESHOLD = 250000; |
9
|
|
|
const DEFAULT_CAP = 200000; |
10
|
|
|
|
11
|
|
|
public static $default_percentage = Fee::DEFAULT_PERCENTAGE; |
12
|
|
|
public static $default_additional_charge = Fee::DEFAULT_ADDITIONAL_CHARGE; |
13
|
|
|
public static $default_threshold = Fee::DEFAULT_THRESHOLD; |
14
|
|
|
public static $default_cap = Fee::DEFAULT_CAP; |
15
|
|
|
|
16
|
|
|
private $percentage; |
17
|
|
|
private $additional_charge; |
18
|
|
|
private $threshold; |
19
|
|
|
private $cap; |
20
|
|
|
|
21
|
|
|
private $chargeDivider; |
22
|
|
|
private $crossover; |
23
|
|
|
private $flatlinePlusCharge; |
24
|
|
|
private $flatline; |
25
|
|
|
|
26
|
4 |
|
public function __construct() |
27
|
|
|
{ |
28
|
4 |
|
$this->percentage = Fee::$default_percentage; |
29
|
4 |
|
$this->additional_charge = Fee::$default_additional_charge; |
30
|
4 |
|
$this->threshold = Fee::$default_threshold; |
31
|
4 |
|
$this->cap = Fee::$default_cap; |
32
|
4 |
|
$this->__setup(); |
33
|
4 |
|
} |
34
|
|
|
|
35
|
2 |
|
public function withPercentage($percentage) |
36
|
|
|
{ |
37
|
2 |
|
$this->percentage = $percentage; |
38
|
2 |
|
$this->__setup(); |
39
|
2 |
|
} |
40
|
|
|
|
41
|
1 |
|
public static function resetDefaults() |
42
|
|
|
{ |
43
|
1 |
|
Fee::$default_percentage = Fee::DEFAULT_PERCENTAGE; |
44
|
1 |
|
Fee::$default_additional_charge = Fee::DEFAULT_ADDITIONAL_CHARGE; |
45
|
1 |
|
Fee::$default_threshold = Fee::DEFAULT_THRESHOLD; |
46
|
1 |
|
Fee::$default_cap = Fee::DEFAULT_CAP; |
47
|
1 |
|
} |
48
|
|
|
|
49
|
2 |
|
public function withAdditionalCharge($additional_charge) |
50
|
|
|
{ |
51
|
2 |
|
$this->additional_charge = $additional_charge; |
52
|
2 |
|
$this->__setup(); |
53
|
2 |
|
} |
54
|
|
|
|
55
|
2 |
|
public function withThreshold($threshold) |
56
|
|
|
{ |
57
|
2 |
|
$this->threshold = $threshold; |
58
|
2 |
|
$this->__setup(); |
59
|
2 |
|
} |
60
|
|
|
|
61
|
2 |
|
public function withCap($cap) |
62
|
|
|
{ |
63
|
2 |
|
$this->cap = $cap; |
64
|
2 |
|
$this->__setup(); |
65
|
2 |
|
} |
66
|
|
|
|
67
|
4 |
|
private function __setup() |
68
|
|
|
{ |
69
|
4 |
|
$this->chargeDivider = $this->__chargeDivider(); |
70
|
4 |
|
$this->crossover = $this->__crossover(); |
71
|
4 |
|
$this->flatlinePlusCharge = $this->__flatlinePlusCharge(); |
72
|
4 |
|
$this->flatline = $this->__flatline(); |
73
|
4 |
|
} |
74
|
|
|
|
75
|
4 |
|
private function __chargeDivider() |
76
|
|
|
{ |
77
|
4 |
|
return 1 - $this->percentage; |
78
|
|
|
} |
79
|
|
|
|
80
|
4 |
|
private function __crossover() |
81
|
|
|
{ |
82
|
4 |
|
return ($this->threshold * $this->chargeDivider) - $this->additional_charge; |
83
|
|
|
} |
84
|
|
|
|
85
|
4 |
|
private function __flatlinePlusCharge() |
86
|
|
|
{ |
87
|
4 |
|
return ($this->cap - $this->additional_charge) / $this->percentage; |
88
|
|
|
} |
89
|
|
|
|
90
|
4 |
|
private function __flatline() |
91
|
|
|
{ |
92
|
4 |
|
return $this->flatlinePlusCharge - $this->cap; |
93
|
|
|
} |
94
|
|
|
|
95
|
3 |
|
public function addFor($amountinkobo) |
96
|
|
|
{ |
97
|
3 |
|
if ($amountinkobo > $this->flatline) { |
98
|
1 |
|
return intval(ceil($amountinkobo + $this->cap)); |
99
|
3 |
|
} elseif ($amountinkobo > $this->crossover) { |
100
|
3 |
|
return intval(ceil(($amountinkobo + $this->additional_charge) / $this->chargeDivider)); |
101
|
|
|
} else { |
102
|
3 |
|
return intval(ceil($amountinkobo / $this->chargeDivider)); |
103
|
|
|
} |
104
|
|
|
} |
105
|
|
|
|
106
|
2 |
|
public function calculateFor($amountinkobo) |
107
|
|
|
{ |
108
|
2 |
|
$fee = $this->percentage * $amountinkobo; |
109
|
2 |
|
if ($amountinkobo >= $this->threshold) { |
110
|
2 |
|
$fee += $this->additional_charge; |
111
|
2 |
|
} |
112
|
2 |
|
if ($fee > $this->cap) { |
113
|
1 |
|
$fee = $this->cap; |
114
|
1 |
|
} |
115
|
2 |
|
return intval(ceil($fee)); |
|
|
|
|
116
|
|
|
} |
117
|
|
|
} |
118
|
|
|
|