|
18 | 18 | */ |
19 | 19 |
|
20 | 20 | use Gibbon\Data\Validator; |
| 21 | +use Gibbon\Domain\Attendance\AttendanceLogPersonGateway; |
21 | 22 | use Gibbon\Domain\Calendar\CalendarEventGateway; |
22 | 23 | use Gibbon\Domain\Calendar\CalendarEventPersonGateway; |
23 | 24 | use Gibbon\Support\Facades\Access; |
|
40 | 41 |
|
41 | 42 | $calendarEventGateway = $container->get(CalendarEventGateway::class); |
42 | 43 | $calendarEventPersonGateway = $container->get(CalendarEventPersonGateway::class); |
| 44 | + $attendanceLogPersonGateway = $container->get(AttendanceLogPersonGateway::class); |
43 | 45 |
|
44 | 46 | // Get event details |
45 | 47 | $event = $calendarEventGateway->getEventDetailsByID($gibbonCalendarEventID, $session->get('gibbonPersonID')); |
|
92 | 94 | header("Location: {$URL}"); |
93 | 95 | } |
94 | 96 |
|
| 97 | + // Check if the date or time has changed compared to the existing event |
| 98 | + $dateTimeChanged = $data['dateStart'] !== $event['dateStart'] || $data['dateEnd'] !== $event['dateEnd'] || $data['timeStart'] !== $event['timeStart'] || $data['timeEnd'] !== $event['timeEnd']; |
| 99 | + |
95 | 100 | // Update the record |
96 | 101 | if (!$calendarEventGateway->update($gibbonCalendarEventID, $data)) { |
97 | 102 | $URL .= '&return=error2'; |
98 | 103 | header("Location: {$URL}"); |
99 | 104 | } |
100 | 105 |
|
101 | | - $organiser = $calendarEventPersonGateway->selectBy(['gibbonCalendarEventID' => $gibbonCalendarEventID, 'role' => 'Organiser', 'gibbonPersonID' => $gibbonPersonIDOrganiser])->fetch(); |
| 106 | + $organiser = $calendarEventPersonGateway->selectBy(['gibbonCalendarEventID' => $gibbonCalendarEventID, 'role' => 'Organiser', 'gibbonPersonID' => $gibbonPersonIDOrganiser])->fetch(); |
102 | 107 |
|
103 | 108 | if (empty($organiser)) { |
104 | 109 | $organiserData = [ |
105 | | - 'gibbonCalendarEventID' => $gibbonCalendarEventID, |
106 | | - 'gibbonPersonID' => $gibbonPersonIDOrganiser, |
107 | | - 'role' => 'Organiser', |
108 | | - 'gibbonPersonIDModified' => $session->get('gibbonPersonID') ?? '', |
109 | | - 'timestampModified' => date('Y-m-d H:i:s'), |
110 | | - 'timestampCreated' => date('Y-m-d H:i:s'), |
111 | | - 'gibbonPersonIDCreated' => $session->get('gibbonPersonID') ?? '', |
| 110 | + 'gibbonCalendarEventID' => $gibbonCalendarEventID, |
| 111 | + 'gibbonPersonID' => $gibbonPersonIDOrganiser, |
| 112 | + 'role' => 'Organiser', |
| 113 | + 'gibbonPersonIDModified' => $session->get('gibbonPersonID') ?? '', |
| 114 | + 'timestampModified' => date('Y-m-d H:i:s'), |
| 115 | + 'timestampCreated' => date('Y-m-d H:i:s'), |
| 116 | + 'gibbonPersonIDCreated' => $session->get('gibbonPersonID') ?? '', |
112 | 117 | ]; |
113 | 118 |
|
114 | 119 | $inserted = $calendarEventPersonGateway->insertAndUpdate($organiserData, $organiserData); |
|
135 | 140 | $inserted = $calendarEventPersonGateway->insertAndUpdate($personData, $personData); |
136 | 141 | $partialFail &= !$inserted; |
137 | 142 | } |
138 | | - |
139 | | - $URL .= $partialFail |
140 | | - ? "&return=warning1" |
141 | | - : "&return=success0&editID=$gibbonCalendarEventID"; |
142 | | - header("Location: {$URL}"); |
| 143 | + |
| 144 | + // If event date or time changed, remove future absences for all student participants using the OLD dates |
| 145 | + $absencesRemoved = false; |
| 146 | + if ($dateTimeChanged) { |
| 147 | + $criteria = $calendarEventPersonGateway->newQueryCriteria() |
| 148 | + ->sortBy(['roleCategory', 'surname', 'preferredName']); |
| 149 | + |
| 150 | + $participants = $calendarEventPersonGateway->queryEventAttendees($criteria, $gibbonCalendarEventID); |
| 151 | + |
| 152 | + $studentPersonIDs = array_reduce($participants->toArray(), function ($group, $item) { |
| 153 | + if ($item['roleCategory'] == 'Student') $group[] = $item['gibbonPersonID']; |
| 154 | + return $group; |
| 155 | + }, []); |
| 156 | + |
| 157 | + if (!empty($studentPersonIDs)) { |
| 158 | + // Query using the OLD event dates/times before the update |
| 159 | + $futureAbsences = $event['allDay'] == 'Y' ? $attendanceLogPersonGateway->selectFutureAttendanceLogsByDate($event['dateStart'], $event['dateEnd'])->fetchAll() : $attendanceLogPersonGateway->selectFutureAttendanceLogsByDateAndTime($event['dateStart'], $event['dateEnd'], $event['timeStart'], $event['timeEnd'])->fetchAll(); |
| 160 | + |
| 161 | + foreach ($futureAbsences as $absence) { |
| 162 | + if (in_array($absence['groupBy'], $studentPersonIDs)) { |
| 163 | + $futureAbsenceDeleted = $attendanceLogPersonGateway->delete($absence['gibbonAttendanceLogPersonID']); |
| 164 | + $absencesRemoved = true; |
| 165 | + } |
| 166 | + } |
| 167 | + } |
| 168 | + } |
| 169 | + |
| 170 | + if ($absencesRemoved) { |
| 171 | + $URL .= "&return=warning9&editID=$gibbonCalendarEventID"; |
| 172 | + } elseif ($partialFail) { |
| 173 | + $URL .= "&return=warning1"; |
| 174 | + } else { |
| 175 | + $URL .= "&return=success0&editID=$gibbonCalendarEventID"; |
| 176 | + } |
| 177 | + |
| 178 | + header("Location: {$URL}"); |
143 | 179 | } |
0 commit comments