| <?php |
| /* |
| * hores |
| * Copyright (c) 2023 Adrià Vilanova MartÃnez |
| * |
| * This program is free software: you can redistribute it and/or modify |
| * it under the terms of the GNU Affero General Public License as |
| * published by the Free Software Foundation, either version 3 of the |
| * License, or (at your option) any later version. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU Affero General Public License for more details. |
| * |
| * You should have received a copy of the GNU Affero General Public |
| * License along with this program. |
| * If not, see http://www.gnu.org/licenses/. |
| */ |
| |
| class recurringIncidents { |
| /*public static function oldAdd($worker, $type, $details, $ifirstday, $ilastday, $begins, $ends, $creator = "ME", $typedays, $days, $alreadyTimestamp = false) { |
| global $con, $conf; |
| |
| $sworker = (int)$worker; |
| $workerDetails = workers::get($sworker); |
| if ($workerDetails === false) return 1; |
| |
| if ($creator === "ME") $creator = people::userData("id"); |
| $screator = (int)$creator; |
| |
| if (!security::isAllowed(security::ADMIN) && $workerDetails["person"] != $creator) return 5; |
| |
| $stype = (int)$type; |
| $sverified = (int)$verified; |
| $sdetails = db::sanitize($details); |
| |
| $incidenttype = self::getType($stype); |
| if ($incidenttype === false) return -1; |
| |
| if ($alreadyTimestamp) { |
| $sfirstday = (int)$ifirstday; |
| $slastday = (int)$ilastday; |
| } else { |
| $firstday = new DateTime($ifirstday); |
| $sfirstday = (int)$firstday->getTimestamp(); |
| $lastday = new DateTime($ilastday); |
| $slastday = (int)$lastday->getTimestamp(); |
| } |
| |
| if ($sfirstday >= $slastday) return 3; |
| |
| $sbegins = (int)$begins; |
| $sends = (int)$ends; |
| if ($sbegins >= $sends) return 3; |
| |
| $typedays = array_unique(array_map(function($el) { |
| return (int)$el; |
| }, $typedays)); |
| foreach ($typedays as $typeday) { |
| if (!in_array($typeday, $workingTypes)) return 6; |
| } |
| $stypedays = json_encode($typedays); |
| |
| if (!mysqli_query($con, "INSERT INTO recurringincidents (worker, creator, type, firstday, lastday, typedays, begins, ends, details) VALUES ($sworker, $screator, $stype, $sfirstday, $slastday, '$stypedays', $sbegins, $sends, '$sdetails')")) return -1; |
| |
| return 0; |
| }*/ // NOTE: This was a first idea, to allow setting up recurring incidents like schedules, but we've changed how we'll handle them and so this is no longer useful. |
| |
| public static function add($worker, $type, $details, $ifirstday, $ilastday, $begins, $ends, $creator, $typeDays, $days, $alreadyTimestamp = false) { |
| if ($alreadyTimestamp) { |
| $current = new DateTime(); |
| $current->setTimestamp($ifirstday); |
| $lastday = new DateTime(); |
| $lastday->setTimestamp($ilastday); |
| } else { |
| $current = new DateTime($ifirstday); |
| $lastday = new DateTime($ilastday); |
| } |
| |
| $oneDay = new DateInterval("P1D"); |
| |
| $category = registry::getWorkerCategory($worker); |
| if ($category === false) return false; |
| |
| $flag = true; |
| |
| for (; $current->diff($lastday)->invert === 0; $current->add($oneDay)) { |
| $currentTimestamp = $current->getTimestamp(); |
| $currentDay = (int)$current->format("N") - 1; |
| |
| if (!in_array($currentDay, $days)) continue; |
| |
| $calendarDays = registry::getDayTypes($currentTimestamp); |
| if ($calendarDays === false) return false; |
| |
| if (isset($calendarDays[$category])) { |
| $typeDay = $calendarDays[$category]; |
| } else if (isset($calendarDays[-1])) { |
| $typeDay = $calendarDays[-1]; |
| } else { |
| $flag = false; |
| continue; |
| } |
| |
| if (!in_array($typeDay, $typeDays)) continue; |
| |
| if ($status = incidents::add($worker, $type, $details, $currentTimestamp, $begins, $ends, $creator, 1, true, false, false) !== 0) { |
| $flag = false; |
| continue; |
| } |
| } |
| |
| return $flag; |
| } |
| } |