Skip to content
77 changes: 59 additions & 18 deletions modules/Attendance/attendance_studentSelfRegisterProcess.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,16 +19,16 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/

//Gibbon system-wide includes
use Gibbon\Data\Validator;
use Gibbon\Domain\System\SettingGateway;
use Gibbon\Domain\Attendance\AttendanceCodeGateway;
use Gibbon\Domain\Attendance\AttendanceLogPersonGateway;
use Gibbon\Domain\System\SettingGateway;

require_once '../../gibbon.php';

$_POST = $container->get(Validator::class)->sanitize($_POST);

//Module includes
// Module includes
include './moduleFunctions.php';

$address = $_POST['address'] ?? '';
Expand All @@ -45,21 +45,24 @@
$URL .= '&return=error0';
header("Location: {$URL}");
} else {
//Check if school day
// Check if school day
$currentDate = date('Y-m-d');
if (isSchoolOpen($guid, $currentDate, $connection2, true) == false) {
$URL .= '&return=error0';
header("Location: {$URL}");
}
else {
// Check for existence of records today
$attendanceCodeGateway = $container->get(AttendanceCodeGateway::class);
$attendanceLogGateway = $container->get(AttendanceLogPersonGateway::class);

$result = $container->get(AttendanceLogPersonGateway::class)->selectAttendanceLogsByPersonAndDate($session->get('gibbonPersonID'), $currentDate, 'N');

if ($result->rowCount() > 0) { //Records! Return error
$URL .= '&return=error1';
header("Location: {$URL}");
}
else { //If no records, set status to Present
else { // If no records, set status to Present
$inRange = false ;
foreach (explode(',', $studentSelfRegistrationIPAddresses) as $ipAddress) {
if (trim($ipAddress) == $realIP)
Expand All @@ -68,25 +71,63 @@

$status = $_POST['status'] ?? null;

if (!$inRange && $status == 'Absent') {
try {
$dataUpdate = array('gibbonPersonID' => $session->get('gibbonPersonID'), 'gibbonPersonIDTaker' => $session->get('gibbonPersonID'), 'date' => $currentDate, 'timestampTaken' => date('Y-m-d H:i:s'));
$sqlUpdate = 'INSERT INTO gibbonAttendanceLogPerson SET gibbonAttendanceCodeID=(SELECT gibbonAttendanceCodeID FROM gibbonAttendanceCode WHERE name=\'Absent\'), gibbonPersonID=:gibbonPersonID, direction=\'Out\', type=\'Absent\', context=\'Self Registration\', reason=\'\', comment=\'\', gibbonPersonIDTaker=:gibbonPersonIDTaker, gibbonCourseClassID=NULL, date=:date, timestampTaken=:timestampTaken';
$resultUpdate = $connection2->prepare($sqlUpdate);
$resultUpdate->execute($dataUpdate);
} catch (PDOException $e) {
if (!$inRange && $status == 'Absent') {
$attendanceCode = $attendanceCodeGateway->selectBy(['name' => 'Absent'])->fetch();

if (empty($attendanceCode)) {
$URL .= '&return=error2';
header("Location: {$URL}");
exit();
}

$data = [
'gibbonAttendanceCodeID' => $attendanceCode['gibbonAttendanceCodeID'],
'gibbonPersonID' => $session->get('gibbonPersonID'),
'direction' => 'Out',
'type' => 'Absent',
'context' => 'Self Registration',
'reason' => '',
'comment' => '',
'gibbonPersonIDTaker' => $session->get('gibbonPersonID'),
'gibbonCourseClassID' => null,
'date' => $currentDate,
'timestampTaken' => date('Y-m-d H:i:s'),
];

$inserted = $attendanceLogGateway->insert($data);

if (!$inserted) {
$URL .= '&return=error2';
header("Location: {$URL}");
exit();
}
}
else if ($inRange && $status == 'Present') {
try {
$dataUpdate = array('gibbonPersonID' => $session->get('gibbonPersonID'), 'gibbonPersonIDTaker' => $session->get('gibbonPersonID'), 'date' => $currentDate, 'timestampTaken' => date('Y-m-d H:i:s'));
$sqlUpdate = 'INSERT INTO gibbonAttendanceLogPerson SET gibbonAttendanceCodeID=(SELECT gibbonAttendanceCodeID FROM gibbonAttendanceCode WHERE name=\'Present\'), gibbonPersonID=:gibbonPersonID, direction=\'In\', type=\'Present\', context=\'Self Registration\', reason=\'\', comment=\'\', gibbonPersonIDTaker=:gibbonPersonIDTaker, gibbonCourseClassID=NULL, date=:date, timestampTaken=:timestampTaken';
$resultUpdate = $connection2->prepare($sqlUpdate);
$resultUpdate->execute($dataUpdate);
} catch (PDOException $e) {
$attendanceCode = $attendanceCodeGateway->selectBy(['name' => 'Present'])->fetch();

if (empty($attendanceCode)) {
$URL .= '&return=error2';
header("Location: {$URL}");
exit();
}

$data = [
'gibbonAttendanceCodeID' => $attendanceCode['gibbonAttendanceCodeID'],
'gibbonPersonID' => $session->get('gibbonPersonID'),
'direction' => 'In',
'type' => 'Present',
'context' => 'Self Registration',
'reason' => '',
'comment' => '',
'gibbonPersonIDTaker' => $session->get('gibbonPersonID'),
'gibbonCourseClassID' => null,
'date' => $currentDate,
'timestampTaken' => date('Y-m-d H:i:s'),
];

$inserted = $attendanceLogGateway->insert($data);

if (!$inserted) {
$URL .= '&return=error2';
header("Location: {$URL}");
exit();
Expand Down
62 changes: 21 additions & 41 deletions modules/Attendance/attendance_take_byFormGroup.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,13 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/

use Gibbon\Domain\Attendance\AttendanceLogFormGroupGateway;
use Gibbon\Domain\Attendance\AttendanceLogPersonGateway;
use Gibbon\Domain\FormGroups\FormGroupGateway;
use Gibbon\Domain\Students\StudentGateway;
use Gibbon\Domain\System\SettingGateway;
use Gibbon\Forms\Form;
use Gibbon\Forms\DatabaseFormFactory;
use Gibbon\Forms\Form;
use Gibbon\Module\Attendance\AttendanceView;
use Gibbon\Services\Format;

Expand All @@ -40,19 +44,18 @@
if ($highestAction == false) {
$page->addError(__('The highest grouped action cannot be determined.'));
} else {
//Proceed!
// Proceed!
$page->return->addReturns(['error3' => __('Your request failed because the specified date is in the future, or is not a school day.')]);

$settingGateway = $container->get(SettingGateway::class);
$formGroupGateway = $container->get(FormGroupGateway::class);

$attendance = new AttendanceView($gibbon, $pdo, $settingGateway);

$gibbonFormGroupID = '';
if (isset($_GET['gibbonFormGroupID']) == false) {
$data = array('gibbonPersonIDTutor1' => $session->get('gibbonPersonID'), 'gibbonPersonIDTutor2' => $session->get('gibbonPersonID'), 'gibbonPersonIDTutor3' => $session->get('gibbonPersonID'), 'gibbonSchoolYearID' => $session->get('gibbonSchoolYearID'));
$sql = "SELECT gibbonFormGroup.*, firstDay, lastDay FROM gibbonFormGroup JOIN gibbonSchoolYear ON (gibbonFormGroup.gibbonSchoolYearID=gibbonSchoolYear.gibbonSchoolYearID) WHERE (gibbonPersonIDTutor=:gibbonPersonIDTutor1 OR gibbonPersonIDTutor2=:gibbonPersonIDTutor2 OR gibbonPersonIDTutor3=:gibbonPersonIDTutor3) AND gibbonFormGroup.gibbonSchoolYearID=:gibbonSchoolYearID";
$result = $connection2->prepare($sql);
$result->execute($data);
$result = $formGroupGateway->selectFormGroupsByTutor($session->get('gibbonPersonID'));

if ($result->rowCount() > 0) {
$row = $result->fetch();
$gibbonFormGroupID = $row['gibbonFormGroupID'];
Expand Down Expand Up @@ -98,32 +101,25 @@
} else {
$countClassAsSchool = $settingGateway->getSettingByScope('Attendance', 'countClassAsSchool');
$defaultAttendanceType = $settingGateway->getSettingByScope('Attendance', 'defaultFormGroupAttendanceType');

// Check form group
$result = $formGroupGateway->getFormGroupDetailsByID($gibbonFormGroupID);

//Check form group

$data = array('gibbonFormGroupID' => $gibbonFormGroupID, 'gibbonSchoolYearID' => $session->get('gibbonSchoolYearID'));
$sql = 'SELECT gibbonFormGroup.*, firstDay, lastDay FROM gibbonFormGroup JOIN gibbonSchoolYear ON (gibbonFormGroup.gibbonSchoolYearID=gibbonSchoolYear.gibbonSchoolYearID) WHERE gibbonFormGroupID=:gibbonFormGroupID AND gibbonFormGroup.gibbonSchoolYearID=:gibbonSchoolYearID';
$result = $connection2->prepare($sql);
$result->execute($data);

if ($result->rowCount() == 0) {
if (empty($result)) {
echo $page->getBlankSlate();
return;
}

$formGroup = $result->fetch();
$formGroup = $result;

if ($formGroup['attendance'] == 'N') {
print "<div class='error'>" ;
print __("Attendance taking has been disabled for this form group.") ;
print "</div>" ;
} else {

//Show attendance log for the current day
$dataLog = array('gibbonFormGroupID' => $gibbonFormGroupID, 'date' => $currentDate.'%');
$sqlLog = 'SELECT * FROM gibbonAttendanceLogFormGroup, gibbonPerson WHERE gibbonAttendanceLogFormGroup.gibbonPersonIDTaker=gibbonPerson.gibbonPersonID AND gibbonFormGroupID=:gibbonFormGroupID AND date LIKE :date ORDER BY timestampTaken';
$resultLog = $connection2->prepare($sqlLog);
$resultLog->execute($dataLog);
// Show attendance log for the current day
$resultLog = $container->get(AttendanceLogFormGroupGateway::class)->getFormGroupAttendanceByDate($gibbonFormGroupID, $currentDate);

if ($resultLog->rowCount() < 1) {
echo "<div class='error'>";
Expand All @@ -140,12 +136,8 @@
echo '</div>';
}

//Show form group grid

$dataFormGroup = array('gibbonFormGroupID' => $gibbonFormGroupID, 'date' => $currentDate);
$sqlFormGroup = "SELECT gibbonPerson.image_240, gibbonPerson.dob, gibbonPerson.preferredName, gibbonPerson.surname, gibbonPerson.gibbonPersonID FROM gibbonStudentEnrolment INNER JOIN gibbonPerson ON gibbonStudentEnrolment.gibbonPersonID=gibbonPerson.gibbonPersonID WHERE gibbonFormGroupID=:gibbonFormGroupID AND status='Full' AND (dateStart IS NULL OR dateStart<=:date) AND (dateEnd IS NULL OR dateEnd>=:date) ORDER BY rollOrder, surname, preferredName";
$resultFormGroup = $connection2->prepare($sqlFormGroup);
$resultFormGroup->execute($dataFormGroup);
// Show form group grid
$resultFormGroup = $container->get(StudentGateway::class)->selectActiveStudentsByFormGroup($gibbonFormGroupID, $currentDate);

if ($resultFormGroup->rowCount() < 1) {
echo $page->getBlankSlate();
Expand All @@ -154,26 +146,14 @@
$countPresent = 0;
$columns = 4;

$defaults = array('type' => $defaultAttendanceType, 'reason' => '', 'comment' => '', 'context' => '', 'direction' => '', 'prefill' => 'Y', 'gibbonFormGroupID' => 0);
$defaults = ['type' => $defaultAttendanceType, 'reason' => '', 'comment' => '', 'context' => '', 'direction' => '', 'prefill' => 'Y', 'gibbonFormGroupID' => 0];
$students = $resultFormGroup->fetchAll();

// Build the attendance log data per student
foreach ($students as $key => $student) {
$data = array('gibbonPersonID' => $student['gibbonPersonID'], 'date' => $currentDate);
$sql = "SELECT gibbonAttendanceLogPerson.type, reason, comment, gibbonAttendanceLogPerson.direction, context, timestampTaken, gibbonAttendanceCode.prefill, gibbonAttendanceLogPerson.gibbonFormGroupID
FROM gibbonAttendanceLogPerson
JOIN gibbonPerson ON (gibbonAttendanceLogPerson.gibbonPersonID=gibbonPerson.gibbonPersonID)
JOIN gibbonAttendanceCode ON (gibbonAttendanceCode.gibbonAttendanceCodeID=gibbonAttendanceLogPerson.gibbonAttendanceCodeID)
WHERE gibbonAttendanceLogPerson.gibbonPersonID=:gibbonPersonID
AND date LIKE :date";

if ($countClassAsSchool == 'N') {
$sql .= " AND NOT context='Class'";
}
$sql .= " ORDER BY timestampTaken DESC";
$result = $pdo->executeQuery($data, $sql);
$result = $container->get(AttendanceLogPersonGateway::class)->selectAttendanceLogsByPersonAndDate($student['gibbonPersonID'], $currentDate, $countClassAsSchool);

$log = ($result->rowCount() > 0)? $result->fetch() : $defaults;
$log = ($result->rowCount() > 0) ? $result->fetch() : $defaults;

if ($log['prefill'] == 'N' && (($log['context'] == 'Form Group' && $log['gibbonFormGroupID'] != $gibbonFormGroupID) || $log['context'] == 'Class') ) {
$log = $defaults;
Expand Down
60 changes: 28 additions & 32 deletions modules/Attendance/attendance_take_byFormGroupProcess.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,12 @@
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/

use Gibbon\Domain\Attendance\AttendanceLogFormGroupGateway;
use Gibbon\Domain\Attendance\AttendanceLogPersonGateway;
use Gibbon\Domain\FormGroups\FormGroupGateway;
use Gibbon\Domain\System\SettingGateway;
use Gibbon\Services\Format;
use Gibbon\Module\Attendance\AttendanceView;
use Gibbon\Domain\Attendance\AttendanceLogPersonGateway;
use Gibbon\Services\Format;

//Gibbon system-wide includes
require __DIR__ . '/../../gibbon.php';
Expand All @@ -43,60 +45,54 @@
if ($highestAction == false) {
$page->addError(__('The highest grouped action cannot be determined.'));
} else {
//Proceed!
//Check if gibbonFormGroupID and currentDate specified
// Proceed!
// Check if gibbonFormGroupID and currentDate specified
if ($gibbonFormGroupID == '' and $currentDate == '') {
$URL .= '&return=error1';
header("Location: {$URL}");
} else {
try {
if ($highestAction == 'Attendance By Form Group_all') {
$data = array('gibbonFormGroupID' => $gibbonFormGroupID);
$sql = 'SELECT * FROM gibbonFormGroup WHERE gibbonFormGroupID=:gibbonFormGroupID';
}
else {
$data = array('gibbonFormGroupID' => $gibbonFormGroupID, 'gibbonPersonIDTutor1' => $session->get('gibbonPersonID'), 'gibbonPersonIDTutor2' => $session->get('gibbonPersonID'), 'gibbonPersonIDTutor3' => $session->get('gibbonPersonID'), 'gibbonSchoolYearID' => $session->get('gibbonSchoolYearID'));
$sql = "SELECT * FROM gibbonFormGroup WHERE gibbonSchoolYearID=:gibbonSchoolYearID AND (gibbonPersonIDTutor=:gibbonPersonIDTutor1 OR gibbonPersonIDTutor2=:gibbonPersonIDTutor2 OR gibbonPersonIDTutor3=:gibbonPersonIDTutor3) AND gibbonFormGroup.attendance = 'Y' AND gibbonFormGroupID=:gibbonFormGroupID ORDER BY LENGTH(name), name";
}
$result = $connection2->prepare($sql);
$result->execute($data);
} catch (PDOException $e) {
$URL .= '&return=error2';
header("Location: {$URL}");
exit();
if ($highestAction == 'Attendance By Form Group_all') {
$result = $container->get(FormGroupGateway::class)->getByID($gibbonFormGroupID);
} else {
$result = $container->get(FormGroupGateway::class)->selectFormGroupsByTutor($session->get('gibbonPersonID'));
}

if ($result->rowCount() != 1) {
if (empty($result)) {
$URL .= '&return=error2';
header("Location: {$URL}");
} else {
//Check that date is not in the future
// Check that date is not in the future
if ($currentDate > $today) {
$URL .= '&return=error3';
header("Location: {$URL}");
} else {
//Check that date is a school day
// Check that date is a school day
if (isSchoolOpen($guid, $currentDate, $connection2) == false) {
$URL .= '&return=error3';
header("Location: {$URL}");
} else {
//Write to database
// Write to database
require_once __DIR__ . '/src/AttendanceView.php';
$attendance = new AttendanceView($gibbon, $pdo, $container->get(SettingGateway::class));

try {
$data = array('gibbonPersonIDTaker' => $session->get('gibbonPersonID'), 'gibbonFormGroupID' => $gibbonFormGroupID, 'date' => $currentDate, 'timestampTaken' => date('Y-m-d H:i:s'));
$sql = 'INSERT INTO gibbonAttendanceLogFormGroup SET gibbonPersonIDTaker=:gibbonPersonIDTaker, gibbonFormGroupID=:gibbonFormGroupID, date=:date, timestampTaken=:timestampTaken';
$result = $connection2->prepare($sql);
$result->execute($data);
} catch (PDOException $e) {
$attendanceLogGateway = $container->get(AttendanceLogPersonGateway::class);
$attendanceLogFormGroupGateway = $container->get(AttendanceLogFormGroupGateway::class);

$data = [
'gibbonPersonIDTaker' => $session->get('gibbonPersonID'),
'gibbonFormGroupID' => $gibbonFormGroupID,
'date' => $currentDate,
'timestampTaken' => date('Y-m-d H:i:s')
];

$inserted = $attendanceLogFormGroupGateway->insert($data);

if (!$inserted) {
$URL .= '&return=error2';
header("Location: {$URL}");
exit();
}

$attendanceLogGateway = $container->get(AttendanceLogPersonGateway::class);


$count = $_POST['count'] ?? '';
$partialFail = false;

Expand Down
Loading
Loading