Skip to content

Commit

Permalink
Staff: fix My Coverage page showing coverage from past years
Browse files Browse the repository at this point in the history
  • Loading branch information
SKuipers committed Feb 2, 2024
1 parent 7166519 commit 092da3f
Show file tree
Hide file tree
Showing 9 changed files with 31 additions and 26 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.txt
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ v27.0.00
System: fixed the file uploader to handle exif image rotation from mobile devices
Activities: fixed highlight colour for Waiting List activities in View Activities
Attendance: fixed handling of double periods in Set Future Absence tool
Staff: fixed My Coverage page showing coverage from past years
Students: fixed the view all option in the Students by Form Group report

Deprecations
Expand Down
2 changes: 1 addition & 1 deletion modules/Staff/coverage_availability.php
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@

$criteria = $staffCoverageGateway->newQueryCriteria();

$coverage = $staffCoverageGateway->queryCoverageByPersonCovering($criteria, $gibbonPersonID, false);
$coverage = $staffCoverageGateway->queryCoverageByPersonCovering($criteria, $session->get('gibbonSchoolYearID'), $gibbonPersonID, false);
$exceptions = $substituteGateway->queryUnavailableDatesBySub($criteria, $session->get('gibbonSchoolYearID'), $gibbonPersonID);
$schoolYear = $schoolYearGateway->getSchoolYearByID($session->get('gibbonSchoolYearID'));

Expand Down
21 changes: 11 additions & 10 deletions modules/Staff/coverage_my.php
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
$settingGateway = $container->get(SettingGateway::class);

$urgencyThreshold = $settingGateway->getSettingByScope('Staff', 'urgencyThreshold');
$coverageMode = $settingGateway->getSettingByScope('Staff', 'coverageMode');

// TODAY'S COVERAGE
$criteria = $staffCoverageGateway->newQueryCriteria(true)
Expand All @@ -57,7 +58,7 @@
->filterBy('dateEnd:'.date('Y-m-d'))
->fromPOST('staffCoverageToday');

$todaysCoverage = $staffCoverageGateway->queryCoverageByPersonCovering($criteria, $gibbonPersonID);
$todaysCoverage = $staffCoverageGateway->queryCoverageByPersonCovering($criteria, $session->get('gibbonSchoolYearID'), $gibbonPersonID);

if (count($todaysCoverage) > 0) {
$page->write('<h2>'.__("Today's Coverage").'</h2>');
Expand Down Expand Up @@ -90,11 +91,11 @@

// TEACHER COVERAGE
$criteria = $staffCoverageGateway->newQueryCriteria(true)
// ->sortBy('dateStart')
->sortBy('dateStart', 'DESC')
->filterBy('date:upcoming')
->fromPOST('staffCoverageSelf');

$coverage = $staffCoverageGateway->queryCoverageByPersonAbsent($criteria, $gibbonPersonID, false);
$coverage = $staffCoverageGateway->queryCoverageByPersonAbsent($criteria, $session->get('gibbonSchoolYearID'), $gibbonPersonID, false);
if (isActionAccessible($guid, $connection2, '/modules/Staff/coverage_request.php') || $coverage->getResultCount() > 0) {
$coverageByTimetable = count(array_filter($coverage->toArray(), function($item) {
return !empty($item['gibbonTTDayRowClassID']);
Expand Down Expand Up @@ -158,23 +159,23 @@
$table->addActionColumn()
->addParam('gibbonStaffCoverageID')
->addParam('gibbonStaffAbsenceID')
->format(function ($coverage, $actions) use ($guid, $connection2) {
->format(function ($coverage, $actions) use ($guid, $connection2, $coverageMode) {
$actions->addAction('view', __('View Details'))
->isModal(800, 550)
->setURL('/modules/Staff/coverage_view_details.php');

if ($coverage['status'] == 'Requested' || $coverage['status'] == 'Accepted') {
if ($coverage['status'] == 'Requested' || $coverage['status'] == 'Pending' || $coverage['status'] == 'Accepted') {
$actions->addAction('edit', __('Edit'))
->setURL('/modules/Staff/coverage_view_edit.php');
}

if ($coverage['status'] == 'Requested' || ($coverage['status'] == 'Accepted' && $coverage['dateEnd'] >= date('Y-m-d'))) {
$actions->addAction('cancel', __('Cancel'))
->setIcon('iconCross')
->setURL('/modules/Staff/coverage_view_cancel.php');
}

$canRequestCoverage = isActionAccessible($guid, $connection2, '/modules/Staff/coverage_request.php') && (($coverage['coverageMode'] == 'Requested' && $coverage['absenceStatus'] == 'Approved') || ($coverage['coverageMode'] == 'Assigned' && $coverage['absenceStatus'] != 'Declined'));
$canRequestCoverage = isActionAccessible($guid, $connection2, '/modules/Staff/coverage_request.php') && (($coverageMode == 'Requested' && $coverage['absenceStatus'] == 'Approved') || ($coverageMode == 'Assigned' && $coverage['absenceStatus'] != 'Declined'));

if ($canRequestCoverage && !empty($coverage['gibbonStaffAbsenceID']) && $coverage['status'] == 'Declined') {
$actions->addAction('coverage', __('Request Coverage'))
Expand All @@ -193,7 +194,7 @@
if (!empty($substitute)) {
$criteria = $staffCoverageGateway->newQueryCriteria();

$coverage = $staffCoverageGateway->queryCoverageByPersonCovering($criteria, $gibbonPersonID, false);
$coverage = $staffCoverageGateway->queryCoverageByPersonCovering($criteria, $session->get('gibbonSchoolYearID'), $gibbonPersonID, false);
$exceptions = $substituteGateway->queryUnavailableDatesBySub($criteria, $session->get('gibbonSchoolYearID'), $gibbonPersonID);
$schoolYear = $schoolYearGateway->getSchoolYearByID($session->get('gibbonSchoolYearID'));

Expand All @@ -211,11 +212,11 @@

// QUERY
$criteria = $staffCoverageGateway->newQueryCriteria(true)
->sortBy('date')
->sortBy('date', 'DESC')
->filterBy('date:upcoming')
->fromPOST('staffCoverageOther');

$coverage = $staffCoverageGateway->queryCoverageByPersonCovering($criteria, $gibbonPersonID);
$coverage = $staffCoverageGateway->queryCoverageByPersonCovering($criteria, $session->get('gibbonSchoolYearID'), $gibbonPersonID);

// DATA TABLE
$table = DataTable::createPaginated('staffCoverageOther', $criteria);
Expand Down
2 changes: 1 addition & 1 deletion modules/Staff/coverage_view.php
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@
->filterBy('date:upcoming')
->fromPOST('myCoverage');

$myCoverage = $staffCoverageGateway->queryCoverageByPersonCovering($criteria, $gibbonPersonID, true);
$myCoverage = $staffCoverageGateway->queryCoverageByPersonCovering($criteria, $gibbonSchoolYearID, $gibbonPersonID, true);

$criteria = $staffCoverageGateway->newQueryCriteria()
->sortBy('date', 'ASC')
Expand Down
2 changes: 1 addition & 1 deletion modules/Staff/report_coverage_summary.php
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,7 @@
->filterBy('dateEnd', $dateEnd->format('Y-m-d'))
->fromPOST('staffCoverage'.$gibbonPersonID);

$coverage = $staffCoverageGateway->queryCoverageByPersonCovering($criteria, $gibbonPersonID, false);
$coverage = $staffCoverageGateway->queryCoverageByPersonCovering($criteria, $gibbonSchoolYearID, $gibbonPersonID, false);

// DATA TABLE
$table = ReportTable::createPaginated('staffCoverage'.$gibbonPersonID, $criteria)->setViewMode($viewMode, $session);
Expand Down
4 changes: 2 additions & 2 deletions modules/Staff/src/Tables/AbsenceFormats.php
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ public static function personAndTypeDetails($absence)
public static function substituteDetails($coverage)
{
if (empty($coverage['gibbonPersonIDCoverage'])) {
if ($coverage['status'] == 'Pending') {
if ($coverage['status'] == 'Pending' || $coverage['status'] == 'Requested') {
return Format::tag(__('Cover Required'), 'error whitespace-nowrap');
} else if ($coverage['status'] == 'Not Required') {
return Format::tag(__('Not Required'), 'dull whitespace-nowrap');
Expand Down Expand Up @@ -168,7 +168,7 @@ public static function coverageStatus($coverage, $urgencyThreshold)
} elseif ($relativeSeconds <= (86400 * ($urgencyThreshold * 3))) {
return '<span class="tag warning">'.__('Upcoming').'</span>';
} else {
return __('Upcoming');
return __($coverage['status']);
}
}

Expand Down
1 change: 1 addition & 0 deletions modules/Staff/src/View/CoverageView.php
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
*/
class CoverageView
{
protected $gibbonStaffCoverageID;
protected $staffCoverageGateway;
protected $userGateway;

Expand Down
5 changes: 2 additions & 3 deletions modules/Timetable/moduleFunctions.php
Original file line number Diff line number Diff line change
Expand Up @@ -340,7 +340,7 @@ function getCalendarEvents($connection2, $guid, $xml, $startDayStamp, $endDaySta
//$narrow can be "full", "narrow", or "trim" (between narrow and full)
function renderTT($guid, $connection2, $gibbonPersonID, $gibbonTTID, $title = '', $startDayStamp = '', $q = '', $params = '', $narrow = 'full', $edit = false)
{
global $session;
global $session, $container;

$zCount = 0;
$output = '';
Expand Down Expand Up @@ -630,7 +630,6 @@ function renderTT($guid, $connection2, $gibbonPersonID, $gibbonTTID, $title = ''
);

// Get all special days
global $container;
$specialDayGateway = $container->get(SchoolYearSpecialDayGateway::class);
$specialDays = $specialDayGateway->selectSpecialDaysByDateRange($dateRange->start->format('Y-m-d'), $dateRange->end->format('Y-m-d'))->fetchGroupedUnique();

Expand Down Expand Up @@ -728,7 +727,7 @@ function renderTT($guid, $connection2, $gibbonPersonID, $gibbonTTID, $title = ''
->filterBy('dateStart', date('Y-m-d', $startDayStamp))
->filterBy('dateEnd', date('Y-m-d', $endDayStamp))
->filterBy('status', 'Accepted');
$coverageList = $staffCoverageGateway->queryCoverageByPersonCovering($criteria, $gibbonPersonID, false);
$coverageList = $staffCoverageGateway->queryCoverageByPersonCovering($criteria, $session->get('gibbonSchoolYearID'), $gibbonPersonID, false);
$staffCoverage = [];

foreach ($coverageList as $coverage) {
Expand Down
19 changes: 11 additions & 8 deletions src/Domain/Staff/StaffCoverageGateway.php
Original file line number Diff line number Diff line change
Expand Up @@ -90,13 +90,13 @@ public function queryCoverageBySchoolYear(QueryCriteria $criteria, $gibbonSchool
return $this->runQuery($query, $criteria);
}

public function queryCoverageByPersonCovering(QueryCriteria $criteria, $gibbonPersonID, $grouped = true)
public function queryCoverageByPersonCovering(QueryCriteria $criteria, $gibbonSchoolYearID, $gibbonPersonID, $grouped = true)
{
$query = $this
->newQuery()
->from($this->getTableName())
->cols([
'gibbonStaffCoverage.gibbonStaffCoverageID', 'gibbonStaffCoverage.status', 'gibbonStaffAbsenceType.name as type', 'gibbonStaffAbsence.reason', 'gibbonStaffCoverageDate.date', 'COUNT(*) as days', 'MIN(date) as dateStart', 'MAX(date) as dateEnd', 'gibbonStaffCoverageDate.allDay', 'gibbonStaffCoverageDate.timeStart', 'gibbonStaffCoverageDate.timeEnd', 'timestampStatus', 'timestampCoverage', 'gibbonStaffCoverage.gibbonPersonIDCoverage',
'gibbonStaffCoverage.gibbonStaffCoverageID', 'gibbonStaffCoverage.status', 'gibbonStaffCoverage.requestType', 'gibbonStaffAbsenceType.name as type', 'gibbonStaffAbsence.reason', 'gibbonStaffCoverageDate.date', 'COUNT(*) as days', 'MIN(date) as dateStart', 'MAX(date) as dateEnd', 'gibbonStaffCoverageDate.allDay', 'gibbonStaffCoverageDate.timeStart', 'gibbonStaffCoverageDate.timeEnd', 'timestampStatus', 'timestampCoverage', 'gibbonStaffCoverage.gibbonPersonIDCoverage',
'gibbonStaffCoverage.gibbonPersonID', 'absence.title AS titleAbsence', 'absence.preferredName AS preferredNameAbsence', 'absence.surname AS surnameAbsence',
'gibbonStaffCoverage.gibbonPersonIDStatus', 'status.title as titleStatus', 'status.preferredName as preferredNameStatus', 'status.surname as surnameStatus',
'gibbonStaffCoverage.notesStatus', 'absenceStaff.jobTitle as jobTitleAbsence', 'SUM(gibbonStaffCoverageDate.value) as value',
Expand All @@ -118,6 +118,8 @@ public function queryCoverageByPersonCovering(QueryCriteria $criteria, $gibbonPe
->leftJoin('gibbonPerson AS absence', 'gibbonStaffCoverage.gibbonPersonID=absence.gibbonPersonID')
->leftJoin('gibbonStaff AS absenceStaff', 'absence.gibbonPersonID=absenceStaff.gibbonPersonID')

->where('gibbonStaffCoverage.gibbonSchoolYearID = :gibbonSchoolYearID')
->bindValue('gibbonSchoolYearID', $gibbonSchoolYearID)
->where('gibbonStaffCoverage.gibbonPersonIDCoverage = :gibbonPersonID')
->bindValue('gibbonPersonID', $gibbonPersonID)
->groupBy($grouped ? ['gibbonStaffCoverage.gibbonStaffCoverageID'] : ['gibbonStaffCoverageDate.gibbonStaffCoverageDateID'])
Expand Down Expand Up @@ -295,18 +297,18 @@ public function selectCoverageByDateRange($dateStart, $dateEnd = null)
return $this->runSelect($query);
}

public function queryCoverageByPersonAbsent(QueryCriteria $criteria, $gibbonPersonID, $grouped = true)
public function queryCoverageByPersonAbsent(QueryCriteria $criteria, $gibbonSchoolYearID, $gibbonPersonID, $grouped = true)
{
$query = $this
->newQuery()
->from($this->getTableName())
->cols([
'gibbonStaffCoverage.gibbonStaffCoverageID', 'gibbonStaffCoverage.status', 'gibbonStaffAbsence.gibbonStaffAbsenceID', 'gibbonStaffAbsenceType.name as type', 'gibbonStaffAbsence.reason', 'gibbonStaffAbsence.coverageRequired', 'gibbonStaffAbsence.status as absenceStatus', 'gibbonStaffCoverageDate.date', 'gibbonStaffCoverageDate.allDay', 'gibbonStaffCoverageDate.timeStart', 'gibbonStaffCoverageDate.timeEnd', 'timestampStatus', 'timestampCoverage', 'gibbonStaffCoverage.gibbonPersonIDCoverage', 'gibbonStaffCoverage.gibbonPersonID',
'gibbonStaffCoverage.gibbonStaffCoverageID', 'gibbonStaffCoverage.status', 'gibbonStaffCoverage.requestType', 'gibbonStaffAbsence.gibbonStaffAbsenceID', 'gibbonStaffAbsenceType.name as type', 'gibbonStaffAbsence.reason', 'gibbonStaffAbsence.coverageRequired', 'gibbonStaffAbsence.status as absenceStatus', 'gibbonStaffCoverageDate.date', 'gibbonStaffCoverageDate.allDay', 'gibbonStaffCoverageDate.timeStart', 'gibbonStaffCoverageDate.timeEnd', 'timestampStatus', 'timestampCoverage', 'gibbonStaffCoverage.gibbonPersonIDCoverage', 'gibbonStaffCoverage.gibbonPersonID',
'coverage.title as titleCoverage', 'coverage.preferredName as preferredNameCoverage', 'coverage.surname as surnameCoverage', 'gibbonStaffCoverage.notesStatus', 'gibbonStaffCoverage.notesCoverage', 'gibbonTTDayRowClass.gibbonTTDayRowClassID', 'gibbonStaffCoverageDate.foreignTable', 'gibbonStaffCoverageDate.foreignTableID',
'gibbonCourse.gibbonCourseID', 'gibbonCourseClass.gibbonCourseClassID', 'gibbonCourse.gibbonDepartmentID',

'(CASE WHEN foreignTable="gibbonTTDayRowClass" THEN gibbonTTColumnRow.name WHEN foreignTable="gibbonStaffDutyPerson" THEN "Staff Duty" WHEN foreignTable="gibbonActivitySlot" THEN "Activity" END ) as period',
'(CASE WHEN foreignTable="gibbonTTDayRowClass" THEN CONCAT(gibbonCourse.nameShort, ".", gibbonCourseClass.nameShort) WHEN foreignTable="gibbonStaffDutyPerson" THEN gibbonStaffDuty.name WHEN foreignTable="gibbonActivitySlot" THEN gibbonActivity.name END ) as contextName',
'(CASE WHEN foreignTable="gibbonTTDayRowClass" THEN CONCAT(gibbonCourse.nameShort, ".", gibbonCourseClass.nameShort) WHEN foreignTable="gibbonStaffDutyPerson" THEN gibbonStaffDuty.name WHEN foreignTable="gibbonActivitySlot" THEN gibbonActivity.name END ) as contextName'
])
->leftJoin('gibbonStaffCoverageDate', 'gibbonStaffCoverageDate.gibbonStaffCoverageID=gibbonStaffCoverage.gibbonStaffCoverageID')
->leftJoin('gibbonStaffAbsence', 'gibbonStaffCoverage.gibbonStaffAbsenceID=gibbonStaffAbsence.gibbonStaffAbsenceID')
Expand All @@ -324,10 +326,11 @@ public function queryCoverageByPersonAbsent(QueryCriteria $criteria, $gibbonPers
->leftJoin('gibbonActivitySlot', 'gibbonActivitySlot.gibbonActivitySlotID=gibbonStaffCoverageDate.foreignTableID AND gibbonStaffCoverageDate.foreignTable="gibbonActivitySlot"')
->leftJoin('gibbonActivity', 'gibbonActivitySlot.gibbonActivityID=gibbonActivity.gibbonActivityID')

->where('gibbonStaffCoverage.gibbonSchoolYearID = :gibbonSchoolYearID')
->bindValue('gibbonSchoolYearID', $gibbonSchoolYearID)
->where('gibbonStaffCoverage.gibbonPersonID = :gibbonPersonID')
->bindValue('gibbonPersonID', $gibbonPersonID)
->groupBy(['gibbonStaffCoverage.gibbonStaffCoverageID'])
->orderBy(["gibbonStaffCoverage.status = 'Requested' DESC"]);
->groupBy(['gibbonStaffCoverage.gibbonStaffCoverageID']);

if ($grouped) {
$query->cols(['COUNT(*) as days', 'MIN(gibbonStaffCoverageDate.date) as dateStart', 'MAX(gibbonStaffCoverageDate.date) as dateEnd'])
Expand Down Expand Up @@ -481,7 +484,7 @@ protected function getSharedFilterRules()
},
'date' => function ($query, $date) {
switch (ucfirst($date)) {
case 'Upcoming': return $query->where("gibbonStaffCoverageDate.date >= CURRENT_DATE()")->where("gibbonStaffCoverage.status <> 'Declined' AND gibbonStaffCoverage.status <> 'Cancelled'");
case 'Upcoming': return $query->where("gibbonStaffCoverageDate.date >= CURRENT_DATE()")->where("gibbonStaffCoverage.status <> 'Declined' AND gibbonStaffCoverage.status <> 'Cancelled'")->orderBy(['gibbonStaffCoverageDate.date']);
case 'Today' : return $query->where("gibbonStaffCoverageDate.date = CURRENT_DATE()");
case 'Past' : return $query->where("gibbonStaffCoverageDate.date < CURRENT_DATE()");
default: return $query->bindValue('dateFilter', $date)->where("gibbonStaffCoverageDate.date = :dateFilter");
Expand Down

0 comments on commit 092da3f

Please sign in to comment.