Skip to content

Commit

Permalink
Fixing attendance calculation and attendance presentation with group …
Browse files Browse the repository at this point in the history
…management -refs BT#9425
  • Loading branch information
NicoDucou committed Jun 30, 2015
1 parent 0f13416 commit fb77008
Show file tree
Hide file tree
Showing 2 changed files with 127 additions and 54 deletions.
20 changes: 10 additions & 10 deletions main/attendance/attendance_controller.php
Expand Up @@ -280,7 +280,7 @@ public function attendance_sheet($action, $attendance_id, $student_id = 0, $edit

if ($edit == true) {
if (api_is_allowed_to_edit(null, true) || $isDrhOfCourse) {
$data['users_presence'] = $attendance->get_users_attendance_sheet($attendance_id);
$data['users_presence'] = $attendance->get_users_attendance_sheet($attendance_id, 0, $groupId);
}
} else {
if (!empty($student_id)) {
Expand All @@ -293,12 +293,12 @@ public function attendance_sheet($action, $attendance_id, $student_id = 0, $edit
api_is_coach(api_get_session_id(), api_get_course_int_id()) ||
$isDrhOfCourse
) {
$data['users_presence'] = $attendance->get_users_attendance_sheet($attendance_id);
$data['users_presence'] = $attendance->get_users_attendance_sheet($attendance_id, 0, $groupId);
} else {
$data['users_presence'] = $attendance->get_users_attendance_sheet($attendance_id, $user_id);
$data['users_presence'] = $attendance->get_users_attendance_sheet($attendance_id, $user_id, $groupId);
}

$data['faults'] = $attendance->get_faults_of_user($user_id, $attendance_id);
$data['faults'] = $attendance->get_faults_of_user($user_id, $attendance_id, $groupId);
$data['user_id'] = $user_id;
}

Expand Down Expand Up @@ -332,12 +332,12 @@ public function attendance_sheet($action, $attendance_id, $student_id = 0, $edit
$my_calendar_id,
$groupId
);
$data['attendant_calendar_all'] = $attendance->get_attendance_calendar($attendance_id);
$data['users_presence'] = $attendance->get_users_attendance_sheet($attendance_id);
$data['attendant_calendar_all'] = $attendance->get_attendance_calendar($attendance_id, 'all', null, $groupId);
$data['users_presence'] = $attendance->get_users_attendance_sheet($attendance_id, 0, $groupId);
$data['next_attendance_calendar_id'] = $attendance->get_next_attendance_calendar_id($attendance_id);
$data['next_attendance_calendar_datetime'] = $attendance->get_next_attendance_calendar_datetime($attendance_id);
} else {
$data['attendant_calendar_all'] = $attendance->get_attendance_calendar($attendance_id);
$data['attendant_calendar_all'] = $attendance->get_attendance_calendar($attendance_id, 'all', null, $groupId);
$data['attendant_calendar'] = $attendance->get_attendance_calendar($attendance_id, $filter_type, null, $groupId);
}

Expand Down Expand Up @@ -485,15 +485,15 @@ public function attendance_sheet_export_to_pdf($action, $attendance_id, $student
);

if (api_is_allowed_to_edit(null, true) || api_is_drh()) {
$data_array['users_presence'] = $attendance->get_users_attendance_sheet($attendance_id);
$data_array['users_presence'] = $attendance->get_users_attendance_sheet($attendance_id, 0, $groupId);
} else {
if (!empty($student_id)) {
$user_id = intval($student_id);
} else {
$user_id = api_get_user_id();
}
$data_array['users_presence'] = $attendance->get_users_attendance_sheet($attendance_id, $user_id);
$data_array['faults'] = $attendance->get_faults_of_user($user_id, $attendance_id);
$data_array['users_presence'] = $attendance->get_users_attendance_sheet($attendance_id, $user_id, $groupId);
$data_array['faults'] = $attendance->get_faults_of_user($user_id, $attendance_id, $groupId);
$data_array['user_id'] = $user_id;
}

Expand Down
161 changes: 117 additions & 44 deletions main/inc/lib/attendance.lib.php
Expand Up @@ -717,8 +717,9 @@ public function attendance_sheet_add($calendar_id, $users_present, $attendance_i
$result = Database::query($sql);

$insertId = Database::insert_id();
$sql = "UPDATE $tbl_attendance_sheet SET id = iid WHERE iid = $insertId";
Database::query($sql);
//The table attendance_sheet do not hace id field
//$sql = "UPDATE $tbl_attendance_sheet SET id = iid WHERE iid = $insertId";
//Database::query($sql);

$affected_rows += Database::affected_rows($result);
} else {
Expand Down Expand Up @@ -749,8 +750,9 @@ public function attendance_sheet_add($calendar_id, $users_present, $attendance_i
$result = Database::query($sql);

$insertId = Database::insert_id();
$sql = "UPDATE $tbl_attendance_sheet SET id = iid WHERE iid = $insertId";
Database::query($sql);
//The table attendance_sheet do not hace id field
//$sql = "UPDATE $tbl_attendance_sheet SET id = iid WHERE iid = $insertId";
//Database::query($sql);

$affected_rows += Database::affected_rows($result);
} else {
Expand Down Expand Up @@ -805,7 +807,7 @@ public function update_users_results($user_ids, $attendance_id)

$attendance_id = intval($attendance_id);
// fill results about presence of students
$attendance_calendar = $this->get_attendance_calendar($attendance_id);
$attendance_calendar = $this->get_attendance_calendar($attendance_id, 'all', null, null, true);
$calendar_ids = array();
// get all dates from calendar by current attendance
foreach ($attendance_calendar as $cal) {
Expand Down Expand Up @@ -948,9 +950,10 @@ public function get_faults_of_user($user_id, $attendance_id, $groupId = null)
$attendance_id = intval($attendance_id);
$results = array();
$attendance_data = $this->get_attendance_by_id($attendance_id);
$calendar_count = self::get_number_of_attendance_calendar($attendance_id, $groupId);
$total_done_attendance = $attendance_data['attendance_qualify_max'];
$attendance_user_score = $this->get_user_score($user_id, $attendance_id);
$calendar_count = self::get_number_of_attendance_calendar($attendance_id, $groupId, NULL, $user_id);
// $total_done_attendance = $attendance_data['attendance_qualify_max'];
$total_done_attendance = self::get_number_of_attendance_calendar($attendance_id, $groupId, true, $user_id);
$attendance_user_score = $this->get_user_score($user_id, $attendance_id, $groupId);

//This is the main change of the BT#1381
//$total_done_attendance = $calendar_count;
Expand Down Expand Up @@ -1082,12 +1085,12 @@ public function get_faults_average_by_course($user_id, $course_code, $session_id
* @param int $user_id for showing data for only one user (optional)
* @return array users attendance sheet data
*/
public function get_users_attendance_sheet($attendance_id, $user_id = 0)
public function get_users_attendance_sheet($attendance_id, $user_id = 0, $groupId = null)
{
$tbl_attendance_sheet = Database::get_course_table(TABLE_ATTENDANCE_SHEET);
$tbl_attendance_calendar= Database::get_course_table(TABLE_ATTENDANCE_CALENDAR);

$attendance_calendar = $this->get_attendance_calendar($attendance_id);
$attendance_calendar = $this->get_attendance_calendar($attendance_id, 'all', null, $groupId);
$calendar_ids = array();
// get all dates from calendar by current attendance
foreach ($attendance_calendar as $cal) {
Expand Down Expand Up @@ -1202,17 +1205,39 @@ public function get_next_attendance_calendar_datetime($attendance_id)
* @param int $attendance_id
* @return int score
*/
public function get_user_score($user_id, $attendance_id)
public function get_user_score($user_id, $attendance_id, $groupId = null)
{
$tbl_attendance_result = Database::get_course_table(TABLE_ATTENDANCE_RESULT);
$tbl_attendance_sheet = Database::get_course_table(TABLE_ATTENDANCE_SHEET);
$tbl_attendance_cal_rel_group = Database::get_course_table(TABLE_ATTENDANCE_CALENDAR_REL_GROUP);
$tbl_attendance_cal = Database::get_course_table(TABLE_ATTENDANCE_CALENDAR);
$user_id = intval($user_id);
$attendance_id = intval($attendance_id);
$course_id = api_get_course_int_id();
$sql = "SELECT score FROM $tbl_attendance_result
WHERE
c_id = $course_id AND
user_id='$user_id' AND
attendance_id='$attendance_id'";
if (empty($groupId))
{
$sql = "SELECT score FROM $tbl_attendance_result
WHERE
c_id = $course_id AND
user_id='$user_id' AND
attendance_id='$attendance_id'";
} else {
$sql = "SELECT count(presence) as score FROM $tbl_attendance_sheet
WHERE
c_id = $course_id AND
user_id='$user_id' AND
presence = 1 AND
attendance_calendar_id IN (
SELECT calendar_id FROM $tbl_attendance_cal_rel_group crg
INNER JOIN $tbl_attendance_cal c
ON (crg.calendar_id = c.id)
WHERE
crg.c_id = $course_id AND
crg.group_id = $groupId AND
c.attendance_id = $attendance_id
)
";
}
$rs = Database::query($sql);
$score = 0;
if (Database::num_rows($rs) > 0) {
Expand Down Expand Up @@ -1264,6 +1289,7 @@ public function get_attendance_calendar(
) {
global $dateFormatShort, $timeNoSecFormat;
$tbl_attendance_calendar = Database::get_course_table(TABLE_ATTENDANCE_CALENDAR);
$tbl_acrg = Database::get_course_table(TABLE_ATTENDANCE_CALENDAR_REL_GROUP);
$attendance_id = intval($attendance_id);
$course_id = api_get_course_int_id();
$groupCondition = null;
Expand All @@ -1277,19 +1303,21 @@ public function get_attendance_calendar(
c_id = $course_id AND
attendance_id = '$attendance_id' AND
id NOT IN (
SELECT calendar_id FROM $table
SELECT calendar_id FROM $tbl_acrg
WHERE c_id = $course_id AND group_id != 0 AND group_id IS NOT NULL
)
";
}

if (!empty($groupId)) {
$groupId = intval($groupId);
$table = Database::get_course_table(TABLE_ATTENDANCE_CALENDAR_REL_GROUP);
$sql = "SELECT c.* FROM $tbl_attendance_calendar c
INNER JOIN $table g
INNER JOIN $tbl_acrg g
ON c.c_id = g.c_id AND c.id = g.calendar_id
WHERE c.c_id = $course_id AND g.group_id = '$groupId' ";
WHERE c.c_id = $course_id AND
g.group_id = '$groupId' AND
c.attendance_id = '$attendance_id'
";
}

if (!in_array($type, array('today', 'all', 'all_done', 'all_not_done','calendar_id'))) {
Expand Down Expand Up @@ -1345,38 +1373,83 @@ public function get_attendance_calendar(
* @param int $groupId
* @return int number of dates in attendance calendar
*/
public static function get_number_of_attendance_calendar($attendance_id, $groupId = 0)
public static function get_number_of_attendance_calendar($attendance_id, $groupId = 0, $done_attendance = NULL, $userId = 0)
{
$tbl_attendance_calendar = Database::get_course_table(TABLE_ATTENDANCE_CALENDAR);
$calendarRelGroup = Database::get_course_table(TABLE_ATTENDANCE_CALENDAR_REL_GROUP);
$tbl_groupRelUser = Database::get_course_table(TABLE_GROUP_USER);
$attendance_id = intval($attendance_id);
$groupId = intval($groupId);
$course_id = api_get_course_int_id();

if (empty($groupId)) {
$sql = "SELECT count(a.id)
FROM $tbl_attendance_calendar a
WHERE
c_id = $course_id AND
attendance_id = '$attendance_id' AND
id NOT IN (
SELECT calendar_id FROM $calendarRelGroup
WHERE
c_id = $course_id AND
group_id != 0 AND
group_id IS NOT NULL
)
";
$where_attendance = '';
if ($done_attendance)
{
$where_attendance = ' done_attendance = 1 AND ';
}
if (empty($userId))
{
if (empty($groupId))
{
$sql = "SELECT count(a.id)
FROM $tbl_attendance_calendar a
WHERE
c_id = $course_id AND
$where_attendance
attendance_id = '$attendance_id' AND
id NOT IN (
SELECT calendar_id FROM $calendarRelGroup
WHERE
c_id = $course_id AND
group_id != 0 AND
group_id IS NOT NULL
)
";
} else {
$sql = "SELECT count(a.id)
FROM $tbl_attendance_calendar a
INNER JOIN $calendarRelGroup g
ON (a.id = g.calendar_id AND a.c_id = g.c_id)
WHERE
a.c_id = $course_id AND
$where_attendance
attendance_id = '$attendance_id' AND
group_id = $groupId
";
}
} else {
$sql = "SELECT count(a.id)
FROM $tbl_attendance_calendar a
INNER JOIN $calendarRelGroup g
ON (a.id = g.calendar_id AND a.c_id = g.c_id)
WHERE
a.c_id = $course_id AND
attendance_id = '$attendance_id' AND
group_id = $groupId
";
if (empty($groupId)) {
$sql = "SELECT count(a.id)
FROM $tbl_attendance_calendar a
WHERE
c_id = $course_id AND
$where_attendance
attendance_id = '$attendance_id' AND
id NOT IN (
SELECT calendar_id FROM $calendarRelGroup
WHERE
c_id = $course_id AND
group_id != 0 AND
group_id IS NOT NULL AND
group_id NOT IN (
SELECT group_id
FROM $tbl_groupRelUser
WHERE user_id = $userId
)
)
";
} else {
$sql = "SELECT count(a.id)
FROM $tbl_attendance_calendar a
INNER JOIN $calendarRelGroup g
ON (a.id = g.calendar_id AND a.c_id = g.c_id)
WHERE
a.c_id = $course_id AND
$where_attendance
attendance_id = '$attendance_id' AND
group_id = $groupId
";
}
}

$rs = Database::query($sql);
Expand Down

0 comments on commit fb77008

Please sign in to comment.