1 | <?php |
||
11 | class Calculator |
||
12 | { |
||
13 | const MONDAY = 1; |
||
14 | const TUESDAY = 2; |
||
15 | const WEDNESDAY = 3; |
||
16 | const THURSDAY = 4; |
||
17 | const FRIDAY = 5; |
||
18 | const SATURDAY = 6; |
||
19 | const SUNDAY = 7; |
||
20 | |||
21 | const WEEK_DAY_FORMAT = 'N'; |
||
22 | const HOLIDAY_FORMAT = 'm-d'; |
||
23 | const FREE_DAY_FORMAT = 'Y-m-d'; |
||
24 | |||
25 | /** @var \DateTime */ |
||
26 | private $date; |
||
27 | |||
28 | /** @var \DateTime[] */ |
||
29 | private $holidays = array(); |
||
30 | |||
31 | /** @var \DateTime[] */ |
||
32 | private $freeDays = array(); |
||
33 | |||
34 | /** @var int[] */ |
||
35 | private $freeWeekDays = array(); |
||
36 | |||
37 | /** |
||
38 | * @param \DateTime $startDate Date to start calculations from |
||
39 | * |
||
40 | * @return $this |
||
41 | */ |
||
42 | 16 | public function setStartDate(\DateTime $startDate) |
|
51 | |||
52 | /** |
||
53 | * @param \DateTime[] $holidays Array of holidays that repeats each year. (Only month and date is used to match). |
||
54 | * |
||
55 | * @return $this |
||
56 | */ |
||
57 | 15 | public function setHolidays(array $holidays) |
|
63 | |||
64 | /** |
||
65 | * @return \DateTime[] |
||
66 | */ |
||
67 | 16 | private function getHolidays() |
|
71 | |||
72 | /** |
||
73 | * @param \DateTime[] $freeDays Array of free days that dose not repeat. |
||
74 | * |
||
75 | * @return $this |
||
76 | */ |
||
77 | 15 | public function setFreeDays(array $freeDays) |
|
83 | |||
84 | /** |
||
85 | * @return \DateTime[] |
||
86 | */ |
||
87 | 16 | private function getFreeDays() |
|
91 | |||
92 | /** |
||
93 | * @param int[] $freeWeekDays Array of days of the week which are not business days. |
||
94 | * |
||
95 | * @return $this |
||
96 | */ |
||
97 | 16 | public function setFreeWeekDays(array $freeWeekDays) |
|
103 | |||
104 | /** |
||
105 | * @return int[] |
||
106 | */ |
||
107 | 17 | private function getFreeWeekDays() |
|
115 | |||
116 | /** |
||
117 | * @param int $howManyDays |
||
118 | * |
||
119 | * @return $this |
||
120 | */ |
||
121 | 17 | public function addBusinessDays($howManyDays) |
|
122 | { |
||
123 | 17 | $iterator = 0; |
|
124 | 17 | while ($iterator < $howManyDays) { |
|
125 | 17 | $this->getDate()->modify('+1 day'); |
|
126 | 17 | if ($this->isBusinessDay($this->getDate())) { |
|
127 | 16 | $iterator++; |
|
128 | } |
||
129 | } |
||
130 | |||
131 | 16 | return $this; |
|
132 | } |
||
133 | |||
134 | /** |
||
135 | * @return \DateTime |
||
136 | */ |
||
137 | 17 | public function getDate() |
|
138 | { |
||
139 | 17 | if ($this->date === null) { |
|
140 | 1 | $this->date = new \DateTime(); |
|
141 | } |
||
142 | |||
143 | 17 | return $this->date; |
|
144 | } |
||
145 | |||
146 | /** |
||
147 | * @param \DateTime $date |
||
148 | * |
||
149 | * @return bool |
||
150 | */ |
||
151 | 17 | public function isBusinessDay(\DateTime $date) |
|
152 | { |
||
153 | 17 | if ($this->isFreeWeekDayDay($date)) { |
|
154 | 7 | return false; |
|
155 | } |
||
156 | |||
157 | 16 | if ($this->isHoliday($date)) { |
|
158 | 4 | return false; |
|
159 | } |
||
160 | |||
161 | 16 | if ($this->isFreeDay($date)) { |
|
162 | 7 | return false; |
|
163 | } |
||
164 | |||
165 | 16 | return true; |
|
166 | } |
||
167 | |||
168 | /** |
||
169 | * @param \DateTime $date |
||
170 | * |
||
171 | * @return bool |
||
172 | */ |
||
173 | 17 | public function isFreeWeekDayDay(\DateTime $date) |
|
183 | |||
184 | /** |
||
185 | * @param \DateTime $date |
||
186 | * |
||
187 | * @return bool |
||
188 | */ |
||
189 | 16 | public function isHoliday(\DateTime $date) |
|
200 | |||
201 | /** |
||
202 | * @param \DateTime $date |
||
203 | * |
||
204 | * @return bool |
||
205 | */ |
||
206 | 16 | public function isFreeDay(\DateTime $date) |
|
217 | } |
||
218 |