Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
| Total | |
100.00% |
1 / 1 |
|
100.00% |
8 / 8 |
CRAP | |
100.00% |
182 / 182 |
| RomanianHolidays | |
100.00% |
1 / 1 |
|
100.00% |
8 / 8 |
32 | |
100.00% |
182 / 182 |
| setHolidays | |
100.00% |
1 / 1 |
12 | |
100.00% |
22 / 22 |
|||
| setHolidaysFixed | |
100.00% |
1 / 1 |
4 | |
100.00% |
17 / 17 |
|||
| setHolidaysEasterBetween2001and2005 | |
100.00% |
1 / 1 |
2 | |
100.00% |
22 / 22 |
|||
| setHolidaysEasterBetween2006and2010 | |
100.00% |
1 / 1 |
2 | |
100.00% |
26 / 26 |
|||
| setHolidaysEasterBetween2011and2015 | |
100.00% |
1 / 1 |
2 | |
100.00% |
31 / 31 |
|||
| setHolidaysEasterBetween2016and2020 | |
100.00% |
1 / 1 |
2 | |
100.00% |
31 / 31 |
|||
| setHolidaysInMonth | |
100.00% |
1 / 1 |
3 | |
100.00% |
12 / 12 |
|||
| setWorkingDaysInMonth | |
100.00% |
1 / 1 |
5 | |
100.00% |
21 / 21 |
|||
| <?php | |
| /** | |
| * | |
| * The MIT License (MIT) | |
| * | |
| * Copyright (c) 2015 Daniel Popiniuc | |
| * | |
| * Permission is hereby granted, free of charge, to any person obtaining a copy | |
| * of this software and associated documentation files (the "Software"), to deal | |
| * in the Software without restriction, including without limitation the rights | |
| * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |
| * copies of the Software, and to permit persons to whom the Software is | |
| * furnished to do so, subject to the following conditions: | |
| * | |
| * The above copyright notice and this permission notice shall be included in all | |
| * copies or substantial portions of the Software. | |
| * | |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
| * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |
| * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |
| * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |
| * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
| * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | |
| * SOFTWARE. | |
| * | |
| */ | |
| namespace danielgp\common_lib; | |
| /** | |
| * Return a list of all Romanian Holidays between 2001 and 2020 | |
| * | |
| * @author Daniel Popiniuc | |
| */ | |
| trait RomanianHolidays | |
| { | |
| /** | |
| * List of legal holidays | |
| * | |
| * @param date $lngDate | |
| * @param boolean $includeCatholicEaster | |
| * @return array | |
| */ | |
| protected function setHolidays($lngDate, $includeCatholicEaster = false) | |
| { | |
| $yr = date('Y', $lngDate); | |
| $daying = $this->setHolidaysFixed($lngDate); | |
| if ($includeCatholicEaster) { | |
| // Catholic easter is already known by PHP | |
| $daying[] = easter_date($yr); // Easter 1st day (Catholic) | |
| $daying[] = strtotime('+1 day', easter_date($yr)); // Easter 2nd day (Catholic) | |
| } | |
| if (($yr >= 2001) && ($yr <= 2005)) { | |
| $holidays = $this->setHolidaysEasterBetween2001and2005($lngDate); | |
| } elseif (($yr >= 2006) && ($yr <= 2010)) { | |
| $holidays = $this->setHolidaysEasterBetween2006and2010($lngDate); | |
| } elseif (($yr >= 2011) && ($yr <= 2015)) { | |
| $holidays = $this->setHolidaysEasterBetween2011and2015($lngDate); | |
| } elseif (($yr >= 2016) && ($yr <= 2020)) { | |
| $holidays = $this->setHolidaysEasterBetween2016and2020($lngDate); | |
| } | |
| if (is_array($holidays)) { | |
| foreach ($holidays as $value) { | |
| $daying[] = $value; | |
| } | |
| } | |
| sort($daying); | |
| // unique logic needs to be applies as in some years catholic and orthodox years does match | |
| return array_unique($daying); | |
| } | |
| /** | |
| * List of all Romanian fixed holidays | |
| * (where fixed means every single year occur on same day of the month) | |
| * | |
| * @param date $lngDate | |
| * @return array | |
| */ | |
| private function setHolidaysFixed($lngDate) | |
| { | |
| $yr = date('Y', $lngDate); | |
| $daying [] = mktime(0, 0, 0, 1, 1, $yr); // Happy New Year | |
| $daying[] = mktime(0, 0, 0, 1, 2, $yr); // recovering from New Year party | |
| if ($yr >= 2015) { | |
| $daying[] = mktime(0, 0, 0, 1, 24, $yr); // Unirea Principatelor Romane | |
| } | |
| $daying[] = mktime(0, 0, 0, 5, 1, $yr); // May 1st | |
| if ($yr >= 2009) { | |
| $daying[] = mktime(0, 0, 0, 8, 15, $yr); // St. Marry | |
| } | |
| if ($yr >= 2012) { | |
| $daying[] = mktime(0, 0, 0, 11, 30, $yr); // St. Andrew | |
| } | |
| $daying[] = mktime(0, 0, 0, 12, 1, $yr); // Romanian National Day | |
| $daying [] = mktime(0, 0, 0, 12, 25, $yr); // December 25th | |
| $daying[] = mktime(0, 0, 0, 12, 26, $yr); // December 26th | |
| return $daying; | |
| } | |
| /** | |
| * List of all Orthodox holidays between 2001 and 2005 | |
| * | |
| * @param date $lngDate | |
| * @return array | |
| */ | |
| private function setHolidaysEasterBetween2001and2005($lngDate) | |
| { | |
| $yr = date('Y', $lngDate); | |
| $variableHolidays = [ | |
| 2001 => [ | |
| mktime(0, 0, 0, 4, 2, $yr), | |
| mktime(0, 0, 0, 4, 3, $yr), | |
| ], | |
| 2002 => [ | |
| mktime(0, 0, 0, 4, 22, $yr), | |
| mktime(0, 0, 0, 4, 23, $yr), | |
| ], | |
| 2003 => [ | |
| mktime(0, 0, 0, 4, 20, $yr), | |
| mktime(0, 0, 0, 4, 21, $yr), | |
| ], | |
| 2004 => [ | |
| mktime(0, 0, 0, 3, 10, $yr), | |
| mktime(0, 0, 0, 3, 11, $yr), | |
| ], | |
| 2005 => [ | |
| mktime(0, 0, 0, 5, 1, $yr), | |
| mktime(0, 0, 0, 5, 2, $yr), | |
| ], | |
| ]; | |
| $daying = []; | |
| if (in_array($yr, array_keys($variableHolidays))) { | |
| $daying = $variableHolidays[$yr]; | |
| } | |
| return $daying; | |
| } | |
| /** | |
| * List of all Orthodox holidays between 2006 and 2010 | |
| * | |
| * @param date $lngDate | |
| * @return array | |
| */ | |
| private function setHolidaysEasterBetween2006and2010($lngDate) | |
| { | |
| $yr = date('Y', $lngDate); | |
| $variableHolidays = [ | |
| 2006 => [ | |
| mktime(0, 0, 0, 4, 23, $yr), | |
| mktime(0, 0, 0, 4, 24, $yr), | |
| ], | |
| 2007 => [ | |
| mktime(0, 0, 0, 4, 8, $yr), | |
| mktime(0, 0, 0, 4, 9, $yr), | |
| ], | |
| 2008 => [ | |
| mktime(0, 0, 0, 4, 27, $yr), | |
| mktime(0, 0, 0, 4, 28, $yr), | |
| ], | |
| 2009 => [ | |
| mktime(0, 0, 0, 4, 19, $yr), | |
| mktime(0, 0, 0, 4, 20, $yr), | |
| mktime(0, 0, 0, 6, 7, $yr), | |
| mktime(0, 0, 0, 6, 8, $yr), | |
| ], | |
| 2010 => [ | |
| mktime(0, 0, 0, 4, 4, $yr), | |
| mktime(0, 0, 0, 4, 5, $yr), | |
| mktime(0, 0, 0, 5, 23, $yr), | |
| mktime(0, 0, 0, 5, 24, $yr), | |
| ], | |
| ]; | |
| $daying = []; | |
| if (in_array($yr, array_keys($variableHolidays))) { | |
| $daying = $variableHolidays[$yr]; | |
| } | |
| return $daying; | |
| } | |
| /** | |
| * List of all Orthodox holidays between 2011 and 2015 | |
| * | |
| * @param date $lngDate | |
| * @return array | |
| */ | |
| private function setHolidaysEasterBetween2011and2015($lngDate) | |
| { | |
| $yr = date('Y', $lngDate); | |
| $variableHolidays = [ | |
| 2011 => [ | |
| mktime(0, 0, 0, 4, 24, $yr), | |
| mktime(0, 0, 0, 4, 25, $yr), | |
| mktime(0, 0, 0, 6, 12, $yr), | |
| mktime(0, 0, 0, 6, 13, $yr), | |
| ], | |
| 2012 => [ | |
| mktime(0, 0, 0, 4, 15, $yr), | |
| mktime(0, 0, 0, 4, 16, $yr), | |
| mktime(0, 0, 0, 6, 3, $yr), | |
| mktime(0, 0, 0, 6, 4, $yr), | |
| ], | |
| 2013 => [ | |
| mktime(0, 0, 0, 5, 6, $yr), | |
| mktime(0, 0, 0, 5, 6, $yr), | |
| mktime(0, 0, 0, 6, 23, $yr), | |
| mktime(0, 0, 0, 6, 24, $yr), | |
| ], | |
| 2014 => [ | |
| mktime(0, 0, 0, 4, 20, $yr), | |
| mktime(0, 0, 0, 4, 21, $yr), | |
| mktime(0, 0, 0, 6, 8, $yr), | |
| mktime(0, 0, 0, 6, 9, $yr), | |
| ], | |
| 2015 => [ | |
| mktime(0, 0, 0, 4, 12, $yr), | |
| mktime(0, 0, 0, 4, 13, $yr), | |
| mktime(0, 0, 0, 5, 31, $yr), | |
| mktime(0, 0, 0, 6, 1, $yr), | |
| ] | |
| ]; | |
| $daying = []; | |
| if (in_array($yr, array_keys($variableHolidays))) { | |
| $daying = $variableHolidays[$yr]; | |
| } | |
| return $daying; | |
| } | |
| /** | |
| * List of all Orthodox holidays between 2016 and 2020 | |
| * | |
| * @param date $lngDate | |
| * @return array | |
| */ | |
| private function setHolidaysEasterBetween2016and2020($lngDate) | |
| { | |
| $yr = date('Y', $lngDate); | |
| $variableHolidays = [ | |
| 2016 => [ | |
| mktime(0, 0, 0, 5, 1, $yr), | |
| mktime(0, 0, 0, 5, 2, $yr), | |
| mktime(0, 0, 0, 6, 19, $yr), | |
| mktime(0, 0, 0, 6, 20, $yr), | |
| ], | |
| 2017 => [ | |
| mktime(0, 0, 0, 4, 16, $yr), | |
| mktime(0, 0, 0, 4, 17, $yr), | |
| mktime(0, 0, 0, 6, 4, $yr), | |
| mktime(0, 0, 0, 6, 5, $yr), | |
| ], | |
| 2018 => [ | |
| mktime(0, 0, 0, 4, 8, $yr), | |
| mktime(0, 0, 0, 4, 9, $yr), | |
| mktime(0, 0, 0, 5, 27, $yr), | |
| mktime(0, 0, 0, 5, 28, $yr), | |
| ], | |
| 2019 => [ | |
| mktime(0, 0, 0, 4, 28, $yr), | |
| mktime(0, 0, 0, 4, 29, $yr), | |
| mktime(0, 0, 0, 6, 16, $yr), | |
| mktime(0, 0, 0, 6, 17, $yr), | |
| ], | |
| 2020 => [ | |
| mktime(0, 0, 0, 4, 19, $yr), | |
| mktime(0, 0, 0, 4, 20, $yr), | |
| mktime(0, 0, 0, 6, 7, $yr), | |
| mktime(0, 0, 0, 6, 8, $yr), | |
| ] | |
| ]; | |
| $daying = []; | |
| if (in_array($yr, array_keys($variableHolidays))) { | |
| $daying = $variableHolidays[$yr]; | |
| } | |
| return $daying; | |
| } | |
| /** | |
| * returns bank holidays in a given month | |
| * | |
| * @param date $lngDate | |
| * @param boolean $includeCatholicEaster | |
| * @return int | |
| */ | |
| protected function setHolidaysInMonth($lngDate, $includeCatholicEaster = false) | |
| { | |
| $holidaysInGivenYear = $this->setHolidays($lngDate, $includeCatholicEaster); | |
| $firstDayGivenMonth = strtotime('first day of', $lngDate); | |
| $lastDayInGivenMonth = strtotime('last day of', $lngDate); | |
| $secondsInOneDay = 24 * 60 * 60; | |
| $thisMonthDays = range($firstDayGivenMonth, $lastDayInGivenMonth, $secondsInOneDay); | |
| $holidays = 0; | |
| foreach ($thisMonthDays as $value) { | |
| if (in_array($value, $holidaysInGivenYear)) { | |
| $holidays += 1; | |
| } | |
| } | |
| return $holidays; | |
| } | |
| /** | |
| * returns working days in a given month | |
| * | |
| * @param date $lngDate | |
| * @param boolean $includeCatholicEaster | |
| * @return int | |
| */ | |
| protected function setWorkingDaysInMonth($lngDate, $includeCatholicEaster = false) | |
| { | |
| $holidaysInGivenYear = $this->setHolidays($lngDate, $includeCatholicEaster); | |
| $firstDayGivenMonth = strtotime('first day of', $lngDate); | |
| $lastDayInGivenMonth = strtotime('last day of', $lngDate); | |
| $secondsInOneDay = 24 * 60 * 60; | |
| $thisMonthDays = range($firstDayGivenMonth, $lastDayInGivenMonth, $secondsInOneDay); | |
| $workingDays = 0; | |
| foreach ($thisMonthDays as $value) { | |
| switch (strftime('%w', $value)) { | |
| case 0: | |
| case 6: | |
| $workingDays += 0; | |
| break; | |
| default: | |
| if (in_array($value, $holidaysInGivenYear)) { | |
| $workingDays += 0; | |
| } else { | |
| $workingDays += 1; | |
| } | |
| break; | |
| } | |
| } | |
| return $workingDays; | |
| } | |
| } |