| Server IP : 210.245.233.93 / Your IP : 216.73.216.226 Web Server : Apache/2.2.15 (CentOS) System : Linux webserver2.onesolution.com.hk 2.6.32-754.35.1.el6.x86_64 #1 SMP Sat Nov 7 12:42:14 UTC 2020 x86_64 User : apache ( 48) PHP Version : 5.3.3 Disable Function : exec, shell_exec, system, passthru, popen, proc_open, pcntl_exec MySQL : ON | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : ON | Pkexec : ON Directory : /var/www/(Del)pathways.org.hk/MIS_bk/event_attendance/ |
Upload File : |
<?php
require_once(__DIR__ . '/../checkuser.php');
function index() {
global $dbh;
$typeOptions = array(
1 => 'Staff',
2 => 'Student',
);
$message = $_GET['message'] ?: null;
$search = $_GET['search'] ?: array();
$sort = $_GET['sort'] ?: array();
$sort_by_columns = array(
'event_code' => 'Event Code',
'lesson_date' => 'Date',
'time' => 'Time',
'program_code' => 'Programme',
'subject_code' => 'Subject',
'name' => 'Name',
'type' => 'Type',
'attendance' => 'Attendance',
);
$sort_by_options = array(
'asc' => 'A - Z',
'desc' => 'Z - A',
);
$today = date('Y-m-d');
if (empty($search['start_date']) && empty($search['end_date'])) {
$search['start_date'] = $today;
$search['end_date'] = $today;
}
if (isPost()) {
// Save
Db\Util::transaction($dbh, function() use ($dbh) {
$lesson_staff_columns = Db\Util::columns($dbh, 'mis_lesson_staff');
$lesson_student_columns = Db\Util::columns($dbh, 'mis_lesson_student');
$save = function($table, &$attributes, &$columns) use ($dbh) {
$sql = "SELECT * FROM `$table` WHERE `$table`.`id` = ? FOR UPDATE";
$parameters = array($attributes['id']);
$sth = Db\Util::execute($dbh, $sql, $parameters);
$lesson_person = $sth->fetch(PDO::FETCH_ASSOC);
$lesson_person = array_merge($lesson_person, $attributes);
return Db\Util::update($dbh, $table, $lesson_person, $columns);
};
// update staff
foreach ($_POST['attendance']['1'] as $id => $attributes) {
$tmp_attributes = array_merge($attributes, array('id' => $id));
$save('mis_lesson_staff', $tmp_attributes, $lesson_staff_columns);
}
// update student
foreach ($_POST['attendance']['2'] as $id => $attributes) {
$tmp_attributes = array_merge($attributes, array('id' => $id));
$save('mis_lesson_student', $tmp_attributes, $lesson_student_columns);
}
});
$data = array(
'message' => 'Saved',
'search' => $search,
'sort' => $sort,
);
redirectAndExit(basename(__FILE__) . '?' . http_build_query($data));
}
//TODO: search query
$lesson_staff_columns = Db\Util::columns($dbh, 'mis_lesson_staff');
$lesson_student_columns = Db\Util::columns($dbh, 'mis_lesson_student');
$union_column_names = array();
$lesson_staff_column_names = array();
foreach ($lesson_staff_columns as $column) {
$lesson_staff_column_names[] = $column['column_name'];
if (!in_array($column['column_name'], $union_column_names)) {
$union_column_names[] = $column['column_name'];
}
}
$lesson_student_column_names = array();
foreach ($lesson_student_columns as $column) {
$lesson_student_column_names[] = $column['column_name'];
if (!in_array($column['column_name'], $union_column_names)) {
$union_column_names[] = $column['column_name'];
}
}
$get_column_names = function($alias, $column_names) use (&$union_column_names) {
$ret_column_names = array();
foreach ($union_column_names as $column_name) {
if (in_array($column_name, $column_names)) {
$ret_column_names[] = $alias . '.' . $column_name;
} else {
$ret_column_names[] = 'NULL AS ' . $column_name;
}
}
return $ret_column_names;
};
$sql = "
SELECT DISTINCT *
FROM (
/* Staffs */
SELECT
1 AS `type`,
latest_staff.id AS person_id,
latest_staff.root_id AS person_root_id,
latest_staff.last_name,
latest_staff.first_name,
staff_position.title AS position_title,
NULL AS registration_number,
NULL AS grade_title,
lesson.`date` AS lesson_date,
lesson.start_time_hour AS lesson_start_time_hour,
lesson.start_time_min AS lesson_start_time_min,
lesson.end_time_hour AS lesson_end_time_hour,
lesson.end_time_min AS lesson_end_time_min,
attendance.attendance AS date_attendance,
program.code AS program_code,
subject.code AS subject_code,
evt.code AS event_code,
" . implode(', ', $get_column_names('lesson_staff', $lesson_staff_column_names)) . "
FROM mis_event evt
LEFT JOIN mis_program program ON program.id = evt.program_id
LEFT JOIN mis_subject subject ON subject.id = evt.subject_id
INNER JOIN mis_event_lesson lesson ON lesson.event_id = evt.id AND lesson.deleted = 0
INNER JOIN mis_lesson_staff lesson_staff ON lesson_staff.lesson_id = lesson.id AND lesson_staff.deleted = 0
INNER JOIN mis_staff staff ON staff.id = lesson_staff.staff_id
INNER JOIN mis_staff latest_staff ON latest_staff.root_id = staff.root_id AND latest_staff.is_latest = 1
LEFT JOIN mis_staff_position staff_position ON staff_position.id = latest_staff.position_id
LEFT JOIN (
SELECT attendance.*, staff.root_id AS staff_root_id
FROM mis_attendance attendance
INNER JOIN mis_staff staff ON staff.id = attendance.staff_id
) attendance ON attendance.staff_root_id = latest_staff.root_id AND attendance.`date` = lesson.`date`
WHERE evt.deleted = 0
AND CASE WHEN COALESCE(LENGTH(?), 0) = 0 THEN 1 = 1 ELSE lesson.`date` >= ? END
AND CASE WHEN COALESCE(LENGTH(?), 0) = 0 THEN 1 = 1 ELSE lesson.`date` <= ? END
AND CASE WHEN COALESCE(LENGTH(?), 0) = 0 THEN 1 = 1 ELSE evt.program_id = ? END
AND CASE WHEN COALESCE(LENGTH(?), 0) = 0 THEN 1 = 1 ELSE evt.subject_id = ? END
AND CASE WHEN COALESCE(LENGTH(?), 0) = 0 THEN 1 = 1 ELSE evt.code = ? END
AND CASE WHEN COALESCE(LENGTH(?), 0) = 0 THEN 1 = 1 ELSE latest_staff.root_id = ? END
AND CASE WHEN COALESCE(LENGTH(?), 0) = 0 THEN 1 = 1 ELSE 1 = 0 END
UNION ALL
/* Students */
SELECT
2 AS `type`,
latest_student.id AS person_id,
latest_student.root_id AS person_root_id,
latest_student.last_name,
latest_student.first_name,
NULL AS position_title,
latest_student.registration_number,
student_grade.title AS grade_title,
lesson.`date` AS lesson_date,
lesson.start_time_hour AS lesson_start_time_hour,
lesson.start_time_min AS lesson_start_time_min,
lesson.end_time_hour AS lesson_end_time_hour,
lesson.end_time_min AS lesson_end_time_min,
attendance.attendance AS date_attendance,
program.code AS program_code,
subject.code AS subject_code,
evt.code AS event_code,
" . implode(', ', $get_column_names('lesson_student', $lesson_student_column_names)) . "
FROM mis_event evt
LEFT JOIN mis_program program ON program.id = evt.program_id
LEFT JOIN mis_subject subject ON subject.id = evt.subject_id
INNER JOIN mis_event_lesson lesson ON lesson.event_id = evt.id AND lesson.deleted = 0
INNER JOIN mis_lesson_student lesson_student ON lesson_student.lesson_id = lesson.id AND lesson_student.deleted = 0
INNER JOIN mis_student student ON student.id = lesson_student.student_id
INNER JOIN mis_student latest_student ON latest_student.root_id = student.root_id AND latest_student.is_latest = 1
LEFT JOIN mis_student_grade student_grade ON student_grade.id = latest_student.student_grade_id
LEFT JOIN (
SELECT attendance.*, student.root_id AS student_root_id
FROM mis_attendance attendance
INNER JOIN mis_student student ON student.id = attendance.student_id
) attendance ON attendance.student_root_id = latest_student.root_id AND attendance.`date` = lesson.`date`
WHERE evt.deleted = 0
AND CASE WHEN COALESCE(LENGTH(?), 0) = 0 THEN 1 = 1 ELSE lesson.`date` >= ? END
AND CASE WHEN COALESCE(LENGTH(?), 0) = 0 THEN 1 = 1 ELSE lesson.`date` <= ? END
AND CASE WHEN COALESCE(LENGTH(?), 0) = 0 THEN 1 = 1 ELSE evt.program_id = ? END
AND CASE WHEN COALESCE(LENGTH(?), 0) = 0 THEN 1 = 1 ELSE evt.subject_id = ? END
AND CASE WHEN COALESCE(LENGTH(?), 0) = 0 THEN 1 = 1 ELSE evt.code = ? END
AND CASE WHEN COALESCE(LENGTH(?), 0) = 0 THEN 1 = 1 ELSE 1 = 0 END
AND CASE WHEN COALESCE(LENGTH(?), 0) = 0 THEN 1 = 1 ELSE latest_student.root_id = ? END
) attendance
ORDER BY ";
$order_by_sql = '';
foreach ($sort as $index => $info) {
if (!empty($info['column']) && !empty($info['option']) && in_array($info['column'], array_keys($sort_by_columns))) {
if (!empty($order_by_sql)) {
$order_by_sql .= ', ';
}
$direction = strtoupper($info['option']) != 'DESC' ? 'ASC' : 'DESC';
switch ($info['column']) {
case 'name': {
$order_by_sql .= "CONCAT(last_name, ' ', first_name) $direction";
break;
}
case 'time': {
$order_by_sql .= "lesson_start_time_hour $direction, lesson_start_time_min $direction, lesson_end_time_hour $direction, lesson_end_time_min $direction";
break;
}
default: {
$column = $info['column'];
$order_by_sql .= "`$column` $direction";
break;
}
}
}
}
if (empty($order_by_sql)) {
$order_by_sql = "lesson_date, `type`, last_name, first_name";
}
$sql .= $order_by_sql . ", registration_number, person_root_id";
$parameters = array(
$search['start_date'], $search['start_date'],
$search['end_date'], $search['end_date'],
$search['program_id'], $search['program_id'],
$search['subject_id'], $search['subject_id'],
$search['event_code'], $search['event_code'],
$search['staff_root_id'], $search['staff_root_id'],
$search['student_root_id'],
$search['start_date'], $search['start_date'],
$search['end_date'], $search['end_date'],
$search['program_id'], $search['program_id'],
$search['subject_id'], $search['subject_id'],
$search['event_code'], $search['event_code'],
$search['staff_root_id'],
$search['student_root_id'], $search['student_root_id'],
);
$sth = Db\Util::execute($dbh, $sql, $parameters);
$attendances = $sth->fetchAll();
$sql = "SELECT * FROM mis_campus WHERE deleted = ? ORDER BY sort";
$parameters = array(0);
$sth = Db\Util::execute($dbh, $sql, $parameters);
$campuses = $sth->fetchAll();
$sql = "SELECT * FROM mis_program WHERE deleted = ? ORDER BY sort";
$parameters = array(0);
$sth = Db\Util::execute($dbh, $sql, $parameters);
$programs = $sth->fetchAll();
$sql = "SELECT * FROM mis_subject WHERE deleted = ? ORDER BY sort";
$parameters = array(0);
$sth = Db\Util::execute($dbh, $sql, $parameters);
$subjects = $sth->fetchAll();
$sql = "
SELECT staff.*, staff_position.title AS position_title
FROM mis_staff staff
LEFT JOIN mis_staff_position staff_position ON staff_position.id = staff.position_id
WHERE staff.is_latest = 1 AND staff.deleted = 0
ORDER BY staff.last_name, staff.first_name, staff.root_id";
$parameters = array();
$sth = Db\Util::execute($dbh, $sql, $parameters);
$all_staffs = $sth->fetchAll();
return array(
'message' => $message,
'search' => $search,
'sort' => $sort,
'sort_by_columns' => $sort_by_columns,
'sort_by_options' => $sort_by_options,
'attendances' => $attendances,
'campuses' => $campuses,
'programs' => $programs,
'subjects' => $subjects,
'typeOptions' => $typeOptions,
'all_staffs' => $all_staffs,
);
}
extract(index());
?><!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<?php require(__DIR__ . '/../inc/_head_meta.php'); ?>
<?php require(__DIR__ . '/../inc/_head_css.php'); ?>
<?php require(__DIR__ . '/../inc/_head_script.php'); ?>
</head>
<body>
<?php require( __DIR__ . '/../inc/_navbar.php'); ?>
<div class="text-right">
<ul class="breadcrumb">
<li class="active"><a href="#">Event Attendance</a></li>
</ul>
</div>
<div class="container-fluid pathways-container">
<?php if (isset($message) && !empty($message)): ?>
<div class="alert alert-info">
<button type="button" class="close" data-dismiss="alert">×</button>
<h5 class="alert-heading">Note:</h5>
<p><?=$message?></p>
</div>
<?php endif; ?>
<button type="button" class="btn pull-right" onclick="bootbox.alert('Coming soon...')">Print</button>
<h3>Event Attendance</h3>
<div class="pathways-search">
<form id="search_form" class="form-inline" action="" method="get">
<div class="pathways-inline-block">
<?php $attribute = 'event_code'; $label = 'Event Code'; ?>
<label class="" for="<?=$attribute?>"><?=$label?></label>
<input type="text" id="<?=$attribute?>" name="search[<?=$attribute?>]" class="input-medium" value="<?=h($search[$attribute])?>" placeholder="<?=h($label)?>" maxlength="200" />
</div>
<script type="text/javascript">
$(function() {
$('#event_code').typeahead({
source: function(query, process) {
return $.getJSON('../event/codes.json.php', { q: query }, function(data) {
return process(data.results);
});
}
});
});
</script>
<div class="pathways-inline-block">
<?php $attribute = 'program_id'; $label = 'Programme'; ?>
<label class="" for="<?=$attribute?>"><?=$label?></label>
<select id="<?=$attribute?>" name="search[<?=$attribute?>]" class="input-medium" placeholder="<?=h($label)?>">
<option value="">All</option>
<?php foreach ($programs as $program): ?>
<option value="<?=h($program['id'])?>"<?=$program['id'] == $search[$attribute] ? ' selected="selected"' : ''?>><?=h($program['code'])?></option>
<?php endforeach; ?>
</select>
</div>
<div class="pathways-inline-block">
<?php $attribute = 'subject_id'; $label = 'Subject'; ?>
<label class="" for="<?=$attribute?>"><?=$label?></label>
<select id="<?=$attribute?>" name="search[<?=$attribute?>]" class="input-medium" placeholder="<?=h($label)?>">
<option value="">All</option>
<?php foreach ($subjects as $subject): ?>
<option value="<?=h($subject['id'])?>"<?=$subject['id'] == $search[$attribute] ? ' selected="selected"' : ''?>><?=h($subject['code'])?></option>
<?php endforeach; ?>
</select>
</div>
<div class="pathways-inline-block">
<?php $attribute = 'start_date'; $label = 'Date'; ?>
<label class="" for="<?=$attribute?>"><?=$label?></label>
<div class="input-append date-picker">
<input type="text" id="<?=$attribute?>" name="search[<?=$attribute?>]" class="dateISO input-small" style="width:90px" value="<?=h(Util::value_to_date_string($search[$attribute]))?>" data-format="yyyy-MM-dd" placeholder="<?=h($label)?>" maxlength="200" />
<span class="add-on"><i data-time-icon="icon-time" data-date-icon="icon-calendar"></i></span>
</div>
<?php $attribute = 'end_date'; $label = 'To'; ?>
<label class="" for="<?=$attribute?>"><?=$label?></label>
<div class="input-append date-picker">
<input type="text" id="<?=$attribute?>" name="search[<?=$attribute?>]" class="dateISO input-small" style="width:90px" value="<?=h(Util::value_to_date_string($search[$attribute]))?>" data-format="yyyy-MM-dd" placeholder="<?=h($label)?>" maxlength="200" />
<span class="add-on"><i data-time-icon="icon-time" data-date-icon="icon-calendar"></i></span>
</div>
</div>
<div class="pathways-inline-block">
<?php $attribute = 'staff_root_id'; $label = 'Staff'; ?>
<label class="" for="<?=$attribute?>"><?=$label?></label>
<!-- <input type="text" id="<?=$attribute?>" name="search[<?=$attribute?>]" class="input-medium" value="<?=h($search[$attribute])?>" placeholder="<?=h($label)?>" maxlength="200" /> -->
<select id="<?=$attribute?>" name="search[<?=$attribute?>]" class="select2" placeholder="Select a <?=$label?>">
<option value=""></option>
<?php foreach ($all_staffs as $staff): ?>
<option value="<?=h($staff['root_id'])?>"<?=$staff['root_id'] == $search[$attribute] ? ' selected="selected"' : ''?>>
<?=h($staff['last_name'])?> <?=h($staff['first_name'])?>
</option>
<?php endforeach; ?>
</select>
</div>
<div class="pathways-inline-block">
<?php $attribute = 'student_root_id'; $label = 'Student'; ?>
<label class="" for="<?=$attribute?>"><?=$label?></label>
<!-- <input type="text" id="<?=$attribute?>" name="search[<?=$attribute?>]" class="input-medium" value="<?=h($search[$attribute])?>" placeholder="<?=h($label)?>" maxlength="200" /> -->
<input type="hidden" id="<?=$attribute?>" name="search[<?=$attribute?>]" placeholder="Select a <?=$label?>" />
</div>
<script type="text/javascript">
$(function() {
$('#student_root_id').select2({
minimumInputLength: 1,
ajax: {
url: '../student/students.json.php',
dataType: 'json',
data: function(term, page) {
return { q: term };
},
results: function(data, page) {
return { results: data.results };
}
}
});
});
</script>
<div class="pathways-inline-block">
<?php $attribute = 'school'; $label = 'School (TBC)'; ?>
<label class="" for="<?=$attribute?>"><?=$label?></label>
<input type="text" id="<?=$attribute?>" name="search[<?=$attribute?>]" class="input-large" value="<?=h($search[$attribute])?>" placeholder="<?=h($label)?>" maxlength="200" />
</div>
<div class="pathways-inline-block">
<?php foreach ($sort as $index => $info): ?>
<?php if (!empty($info['column']) && !empty($info['option'])): ?>
<?php $attribute = 'column'; ?>
<input type="hidden" name="sort[<?=h($index)?>][<?=$attribute?>]" value="<?=h($info[$attribute])?>" />
<?php $attribute = 'option'; ?>
<input type="hidden" name="sort[<?=h($index)?>][<?=$attribute?>]" value="<?=h($info[$attribute])?>" />
<?php endif; ?>
<?php endforeach; ?>
<?php $attribute = 'column'; $label = 'Sort by'; ?>
<label class="" for="<?=$attribute?>"><?=$label?></label>
<select id="<?=$attribute?>" name="sort[<?=max(array_keys($sort?:array(0)))+1?>][<?=$attribute?>]" class="input-medium" placeholder="<?=h($label)?>">
<option value=""></option>
<?php foreach ($sort_by_columns as $value => $label): ?>
<option value="<?=$value?>"<?=$value == $search[$attribute] ? ' selected="selected"' : ''?>><?=h($label)?></option>
<?php endforeach; ?>
</select>
<?php $attribute = 'option'; $label = 'Option'; ?>
<!-- <label class="" for="<?=$attribute?>"><?=$label?></label> -->
<select id="<?=$attribute?>" name="sort[<?=max(array_keys($sort?:array(0)))+1?>][<?=$attribute?>]" class="input-mini" placeholder="<?=h($label)?>">
<option value=""></option>
<?php foreach ($sort_by_options as $value => $label): ?>
<option value="<?=$value?>"<?=$value == $search[$attribute] ? ' selected="selected"' : ''?>><?=h($label)?></option>
<?php endforeach; ?>
</select>
<button type="button" id="clear_sorting_btn" class="btn"><i class="icon-remove"></i> Clear sorting</button>
<script type="text/javascript">
$(function() {
$('#clear_sorting_btn').click(function() {
var $search_form = $('#search_form');
$('input[type="hidden"][name^="sort["]', $search_form).remove();
$search_form.submit();
});
});
</script>
<button type="submit" class="btn" style="margin-left:30px">GO</button>
</div>
</form>
</div>
<?php if (empty($attendances)): ?>
<p>There are no records.</p>
<?php else: ?>
<form id="form" action="" method="post">
<table class="table table-striped table-bordered table-hover table-condensed">
<thead>
<tr>
<th>Event Code <?=Util::getSortDirectionCaretHtml($sort, 'event_code')?></th>
<th>Date <?=Util::getSortDirectionCaretHtml($sort, 'lesson_date')?></th>
<th>Time <?=Util::getSortDirectionCaretHtml($sort, 'time')?></th>
<th>Programme <?=Util::getSortDirectionCaretHtml($sort, 'program_code')?></th>
<th>Subject <?=Util::getSortDirectionCaretHtml($sort, 'subject_code')?></th>
<th>Name <?=Util::getSortDirectionCaretHtml($sort, 'name')?></th>
<th>Type <?=Util::getSortDirectionCaretHtml($sort, 'type')?></th>
<th>Attendance <?=Util::getSortDirectionCaretHtml($sort, 'attendance')?></th>
</tr>
</thead>
<tbody>
<?php foreach ($attendances as $attendance): ?>
<tr>
<td><?=h($attendance['event_code'])?></td>
<td><?=h($attendance['lesson_date'])?></td>
<td>
<?=h(sprintf('%02d', $attendance['lesson_start_time_hour']))?>:<?=h(sprintf('%02d', $attendance['lesson_start_time_min']))?>
-
<?=h(sprintf('%02d', $attendance['lesson_end_time_hour']))?>:<?=h(sprintf('%02d', $attendance['lesson_end_time_min']))?>
</td>
<td><?=h($attendance['program_code'])?></td>
<td><?=h($attendance['subject_code'])?></td>
<td>
<?=h($attendance['last_name'])?> <?=h($attendance['first_name'])?>
<?php if (!empty($attendance['registration_number'])): ?>
(<?=h($attendance['registration_number'])?>)
<?php endif; ?>
<?php if (!empty($attendance['grade_title'])): ?>
<?=h($attendance['grade_title'])?>
<?php endif; ?>
</td>
<td>
<?php $attribute = 'type'; ?>
<?=h($typeOptions[$attendance[$attribute]])?>
</td>
<td>
<div class="pathways-inline-block" style="margin-right:0px">
<?php $attribute = 'attendance'; $label = 'Present'; ?>
<label class="radio inline">
<input type="radio" name="attendance[<?=$attendance['type']?>][<?=$attendance['id']?>][<?=$attribute?>]" value="1"<?=strval($attendance[$attribute]) === strval(1) ? ' checked="checked"' : ''?> />
Present
</label>
<label class="radio inline" style="margin-right:20px">
<input type="radio" name="attendance[<?=$attendance['type']?>][<?=$attendance['id']?>][<?=$attribute?>]" value="0"<?=strval($attendance[$attribute]) === strval(0) ? ' checked="checked"' : ''?> />
Absent
</label>
<?php $attribute = 'leave_reason'; $label = 'Leave Reason'; ?>
<select id="<?=$attribute?>" name="attendance[<?=$attendance['type']?>][<?=$attendance['id']?>][<?=$attribute?>]" class="input-large" placeholder="<?=h($label)?>">
<option value=""></option>
<?php
$options = array();
switch ($attendance['type']) {
case 1: { // Staff
$options = Staff::attendanceLeaveOptions();
break;
}
case 2: { // Student
$options = Student::attendanceLeaveOptions();
break;
}
}
foreach ($options as $value => $label):
?>
<option value="<?=$value?>"<?=$value == $attendance[$attribute] ? ' selected="selected"' : ''?>><?=h($label)?></option>
<?php endforeach; ?>
</select>
</div>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
<button type="submit" class="btn btn-danger">Save</button>
</form>
<script type="text/javascript">
$(function() {
$('.select2').select2();
$('#form').validate();
});
</script>
<?php endif; ?>
<script type="text/javascript">
$(function() {
$('.date-picker').datetimepicker({ pickTime: false });
$('#search_form').validate();
});
</script>
<?php require( __DIR__ . '/../inc/_footer.php'); ?>
</div> <!-- /container -->
</body>
</html>