Attendance - Add sign for user as student - refs BT#18271

pull/4300/head
Christian 3 years ago
parent ccfec6298f
commit 31656269da
  1. 5
      main/attendance/attendance_controller.php
  2. 64
      main/attendance/attendance_sheet.php
  3. 2
      main/attendance/index.php
  4. 6
      main/inc/ajax/user_manager.ajax.php
  5. 30
      main/inc/lib/attendance.lib.php

@ -349,6 +349,8 @@ class AttendanceController
); );
if (strtoupper($_SERVER['REQUEST_METHOD']) == 'POST') { if (strtoupper($_SERVER['REQUEST_METHOD']) == 'POST') {
$check = Security::check_token();
if ($check) {
if (isset($_POST['hidden_input'])) { if (isset($_POST['hidden_input'])) {
foreach ($_POST['hidden_input'] as $cal_id) { foreach ($_POST['hidden_input'] as $cal_id) {
$users_present = []; $users_present = [];
@ -362,7 +364,8 @@ class AttendanceController
); );
} }
} }
Security::clear_token();
}
$data['users_in_course'] = $attendance->get_users_rel_course($attendance_id, $groupId); $data['users_in_course'] = $attendance->get_users_rel_course($attendance_id, $groupId);
$my_calendar_id = null; $my_calendar_id = null;
if (is_numeric($filter_type)) { if (is_numeric($filter_type)) {

@ -19,6 +19,7 @@ $isDrhOfCourse = CourseManager::isUserSubscribedInCourseAsDrh(
) || api_is_drh(); ) || api_is_drh();
$allowSignature = api_get_configuration_value('enable_sign_attendance_sheet'); $allowSignature = api_get_configuration_value('enable_sign_attendance_sheet');
$token = Security::get_token();
if (api_is_allowed_to_edit(null, true) || if (api_is_allowed_to_edit(null, true) ||
api_is_coach(api_get_session_id(), api_get_course_int_id()) || api_is_coach(api_get_session_id(), api_get_course_int_id()) ||
@ -109,6 +110,7 @@ if (api_is_allowed_to_edit(null, true) ||
] ]
); );
if (!$is_locked_attendance || api_is_platform_admin()) { if (!$is_locked_attendance || api_is_platform_admin()) {
$actionsLeft = '<a style="float:left;" href="index.php?'.api_get_cidreq().'&action=calendar_list&attendance_id='.$attendance_id.'">'. $actionsLeft = '<a style="float:left;" href="index.php?'.api_get_cidreq().'&action=calendar_list&attendance_id='.$attendance_id.'">'.
Display::return_icon('attendance_calendar.png', get_lang('AttendanceCalendar'), '', ICON_SIZE_MEDIUM).'</a>'; Display::return_icon('attendance_calendar.png', get_lang('AttendanceCalendar'), '', ICON_SIZE_MEDIUM).'</a>';
@ -355,13 +357,11 @@ if (api_is_allowed_to_edit(null, true) ||
$disabled = ''; $disabled = '';
} }
$signed = false;
if ($allowSignature) { if ($allowSignature) {
$attendance = new Attendance(); $attendance = new Attendance();
$signature = $attendance->getSignature($user['user_id'], $calendar['id']); $signature = $attendance->getSignature($user['user_id'], $calendar['id']);
if (!empty($signature)) { $signed = !empty($signature);
$disabled = 'disabled';
$checked = 'checked';
}
} }
echo '<td style="'.$style_td.'" class="checkboxes_col_'.$calendar['id'].'">'; echo '<td style="'.$style_td.'" class="checkboxes_col_'.$calendar['id'].'">';
@ -369,10 +369,10 @@ if (api_is_allowed_to_edit(null, true) ||
if (api_is_allowed_to_edit(null, true)) { if (api_is_allowed_to_edit(null, true)) {
if (!$is_locked_attendance || api_is_platform_admin()) { if (!$is_locked_attendance || api_is_platform_admin()) {
echo '<input type="checkbox" name="check_presence['.$calendar['id'].'][]" value="'.$user['user_id'].'" '.$disabled.' '.$checked.' />';
echo '<span class="anchor_'.$calendar['id'].'"></span>';
if ($allowSignature) { if ($allowSignature) {
if (!empty($signature)) { if ($signed) {
echo Display::return_icon('checkbox_on.png', get_lang('Presence'), null, ICON_SIZE_TINY);
echo '<input type="hidden" name="check_presence['.$calendar['id'].'][]" value="'.$user['user_id'].'" />';
echo '<div class="list-data"> echo '<div class="list-data">
<span class="item"></span> <span class="item"></span>
<a id="sign-'.$user['user_id'].'-'.$calendar['id'].'" class="btn btn-primary attendance-sign-view" href="javascript:void(0)"> <a id="sign-'.$user['user_id'].'-'.$calendar['id'].'" class="btn btn-primary attendance-sign-view" href="javascript:void(0)">
@ -380,6 +380,8 @@ if (api_is_allowed_to_edit(null, true) ||
</a> </a>
</div>'; </div>';
} else { } else {
echo '<input type="checkbox" name="check_presence['.$calendar['id'].'][]" value="'.$user['user_id'].'" '.$disabled.' '.$checked.' />';
echo '<span class="anchor_'.$calendar['id'].'"></span>';
echo '<div class="list-data"> echo '<div class="list-data">
<span class="item"></span> <span class="item"></span>
<a id="sign-'.$user['user_id'].'-'.$calendar['id'].'" class="btn btn-primary attendance-sign" href="javascript:void(0)"> <a id="sign-'.$user['user_id'].'-'.$calendar['id'].'" class="btn btn-primary attendance-sign" href="javascript:void(0)">
@ -387,6 +389,9 @@ if (api_is_allowed_to_edit(null, true) ||
</a> </a>
</div>'; </div>';
} }
} else {
echo '<input type="checkbox" name="check_presence['.$calendar['id'].'][]" value="'.$user['user_id'].'" '.$disabled.' '.$checked.' />';
echo '<span class="anchor_'.$calendar['id'].'"></span>';
} }
} else { } else {
echo $presence ? Display::return_icon('checkbox_on.png', get_lang('Presence'), null, ICON_SIZE_TINY) : Display::return_icon('checkbox_off.png', get_lang('Presence'), null, ICON_SIZE_TINY); echo $presence ? Display::return_icon('checkbox_on.png', get_lang('Presence'), null, ICON_SIZE_TINY) : Display::return_icon('checkbox_off.png', get_lang('Presence'), null, ICON_SIZE_TINY);
@ -436,6 +441,7 @@ if (api_is_allowed_to_edit(null, true) ||
} ?> } ?>
</div> </div>
</div> </div>
<input type="hidden" name="sec_token" value="<?php echo $token; ?>" />
</form> </form>
<?php <?php
} else { } else {
@ -473,6 +479,12 @@ if (api_is_allowed_to_edit(null, true) ||
if (!empty($users_presence)) { if (!empty($users_presence)) {
$i = 0; $i = 0;
foreach ($users_presence[$user_id] as $presence) { foreach ($users_presence[$user_id] as $presence) {
$signed = false;
if ($allowSignature) {
$attendance = new Attendance();
$signature = $attendance->getSignature($user_id, $presence['calendar_id']);
$signed = !empty($signature);
}
$class = ''; $class = '';
if ($i % 2 == 0) { if ($i % 2 == 0) {
$class = 'row_even'; $class = 'row_even';
@ -483,6 +495,27 @@ if (api_is_allowed_to_edit(null, true) ||
<td> <td>
<?php echo $presence['presence'] ? Display::return_icon('checkbox_on.png', get_lang('Presence'), null, ICON_SIZE_TINY) : Display::return_icon('checkbox_off.png', get_lang('Presence'), null, ICON_SIZE_TINY); ?> <?php echo $presence['presence'] ? Display::return_icon('checkbox_on.png', get_lang('Presence'), null, ICON_SIZE_TINY) : Display::return_icon('checkbox_off.png', get_lang('Presence'), null, ICON_SIZE_TINY); ?>
<?php echo "&nbsp; ".$presence['date_time']; ?> <?php echo "&nbsp; ".$presence['date_time']; ?>
<?php
if ($allowSignature) {
if ($signed) {
echo '<span class="list-data">
<a id="sign-'.$user_id.'-'.$presence['calendar_id'].'" class="btn btn-primary attendance-sign-view" href="javascript:void(0)">
<em class="fa fa-search"></em> '.get_lang('SignView').'
</a>
</span>';
} else {
echo '<span class="list-data">
<a id="sign-'.$user_id.'-'.$presence['calendar_id'].'" class="btn btn-primary attendance-sign" href="javascript:void(0)">
<em class="fa fa-pencil"></em> '.get_lang('Sign').'
</a>
</span>';
}
}
?>
</td> </td>
</tr> </tr>
<?php <?php
@ -504,7 +537,6 @@ if ($allowSignature) {
<div id="signature_area" class="well"> <div id="signature_area" class="well">
<canvas width="400px"></canvas> <canvas width="400px"></canvas>
</div> </div>
<span class="loading" style="display: none"><em class="fa fa-spinner"></em></span>
<span id="save_controls"> <span id="save_controls">
<button id="sign_popup_save" class="btn btn-primary" type="submit"> <button id="sign_popup_save" class="btn btn-primary" type="submit">
<em class="fa fa-save"></em> <?php echo get_lang('Save'); ?> <em class="fa fa-save"></em> <?php echo get_lang('Save'); ?>
@ -525,6 +557,7 @@ if ($allowSignature) {
<?php echo get_lang('Close'); ?> <?php echo get_lang('Close'); ?>
</button> </button>
</span> </span>
<span class="loading" style="display: none"><em class="fa fa-spinner"></em></span>
<input type="hidden" id="sign-selected" /> <input type="hidden" id="sign-selected" />
</div> </div>
@ -533,6 +566,7 @@ if ($allowSignature) {
var canvas = document.querySelector("#signature_area canvas"); var canvas = document.querySelector("#signature_area canvas");
var signaturePad = new SignaturePad(canvas); var signaturePad = new SignaturePad(canvas);
var urlAjax = "<?php echo api_get_path(WEB_AJAX_PATH).'user_manager.ajax.php?'.api_get_cidreq(); ?>"; var urlAjax = "<?php echo api_get_path(WEB_AJAX_PATH).'user_manager.ajax.php?'.api_get_cidreq(); ?>";
var attendance_id = "<?php echo $attendance_id; ?>";
$(function() { $(function() {
$("#sign_popup_close").on("click", function() { $("#sign_popup_close").on("click", function() {
@ -550,9 +584,12 @@ if ($allowSignature) {
$("#sign_popup_remove").on("click", function() { $("#sign_popup_remove").on("click", function() {
var selected = $("#sign-selected").val(); var selected = $("#sign-selected").val();
$.ajax({ $.ajax({
beforeSend: function(result) {
$('#loading').show();
},
type: "POST", type: "POST",
url: urlAjax, url: urlAjax,
data: "a=remove_attendance_sign&selected="+selected, data: "a=remove_attendance_sign&selected="+selected+"&attendance_id="+attendance_id,
success: function(data) { success: function(data) {
location.reload(); location.reload();
}, },
@ -572,7 +609,7 @@ if ($allowSignature) {
}, },
type: "POST", type: "POST",
url: urlAjax, url: urlAjax,
data: "a=sign_attendance&selected="+selected+"&file="+dataURL, data: "a=sign_attendance&selected="+selected+"&file="+dataURL+"&attendance_id="+attendance_id,
success: function(data) { success: function(data) {
$('#loading').hide(); $('#loading').hide();
$('#save_controls').hide(); $('#save_controls').hide();
@ -585,7 +622,7 @@ if ($allowSignature) {
} else { } else {
$('#sign_results').html('<?php echo get_lang('Error'); ?>'); $('#sign_results').html('<?php echo get_lang('Error'); ?>');
} }
$('#close_controls').hide(); $('#sign_popup_close').hide();
location.reload(); location.reload();
}, },
}); });
@ -611,15 +648,16 @@ if ($allowSignature) {
$(".attendance-sign-view").on("click", function() { $(".attendance-sign-view").on("click", function() {
var selected = $(this).attr("id"); var selected = $(this).attr("id");
$('#loading').show();
$.ajax({ $.ajax({
beforeSend: function(result) { beforeSend: function(result) {
$('#signature_area').html(""); $('#signature_area').html("<em class='fa fa-spinner'></em>");
$('#loading').show();
}, },
type: "POST", type: "POST",
url: urlAjax, url: urlAjax,
data: "a=get_attendance_sign&selected="+selected, data: "a=get_attendance_sign&selected="+selected,
success: function(sign) { success: function(sign) {
$('#loading').hide();
$('#signature_area').show(); $('#signature_area').show();
$('#signature_area').html("<img src='"+sign+"' />"); $('#signature_area').html("<img src='"+sign+"' />");
}, },

@ -39,6 +39,8 @@ $actions = [
'attendance_sheet_export_to_pdf', 'attendance_sheet_export_to_pdf',
'attendance_sheet_list_no_edit', 'attendance_sheet_list_no_edit',
'calendar_logins', 'calendar_logins',
'lock_attendance',
'unlock_attendance'
]; ];
$actions_calendar = [ $actions_calendar = [

@ -28,20 +28,22 @@ switch ($action) {
break; break;
case 'remove_attendance_sign': case 'remove_attendance_sign':
$selected = $_REQUEST['selected']; $selected = $_REQUEST['selected'];
$attendanceId = $_REQUEST['attendance_id'];
if (!empty($selected)) { if (!empty($selected)) {
list($prefix, $userId, $attendanceCalendarId) = explode('-', $selected); list($prefix, $userId, $attendanceCalendarId) = explode('-', $selected);
$attendance = new Attendance(); $attendance = new Attendance();
$attendance->deleteSignature($userId, $attendanceCalendarId); $attendance->deleteSignature($userId, $attendanceCalendarId, $attendanceId);
} }
break; break;
case 'sign_attendance': case 'sign_attendance':
$selected = $_REQUEST['selected']; $selected = $_REQUEST['selected'];
$file = isset($_REQUEST['file']) ? $_REQUEST['file'] : ''; $file = isset($_REQUEST['file']) ? $_REQUEST['file'] : '';
$file = str_replace(' ', '+', $file); $file = str_replace(' ', '+', $file);
$attendanceId = $_REQUEST['attendance_id'];
if (!empty($selected)) { if (!empty($selected)) {
list($prefix, $userId, $attendanceCalendarId) = explode('-', $selected); list($prefix, $userId, $attendanceCalendarId) = explode('-', $selected);
$attendance = new Attendance(); $attendance = new Attendance();
$attendance->saveSignature($userId, $attendanceCalendarId, $file); $attendance->saveSignature($userId, $attendanceCalendarId, $file, $attendanceId);
echo 1; echo 1;
exit; exit;
} }

@ -267,11 +267,11 @@ class Attendance
$message_alert = get_lang('UnlockMessageInformation'); $message_alert = get_lang('UnlockMessageInformation');
} }
$actions .= '&nbsp;<a onclick="javascript:if(!confirm(\''.$message_alert.'\')) return false;" href="index.php?'.api_get_cidreq().'&action=lock_attendance&attendance_id='.$attendance[0].'">'. $actions .= '&nbsp;<a onclick="javascript:if(!confirm(\''.$message_alert.'\')) return false;" href="index.php?'.api_get_cidreq().'&action=lock_attendance&attendance_id='.$attendance[0].'">'.
Display::return_icon('unlock.png', get_lang('LockAttendance')).'</a>'; Display::return_icon('lock-open.png', get_lang('LockAttendance')).'</a>';
} else { } else {
if (api_is_platform_admin()) { if (api_is_platform_admin()) {
$actions .= '&nbsp;<a onclick="javascript:if(!confirm(\''.get_lang('AreYouSureToUnlockTheAttendance').'\')) return false;" href="index.php?'.api_get_cidreq().'&action=unlock_attendance&attendance_id='.$attendance[0].'">'. $actions .= '&nbsp;<a onclick="javascript:if(!confirm(\''.get_lang('AreYouSureToUnlockTheAttendance').'\')) return false;" href="index.php?'.api_get_cidreq().'&action=unlock_attendance&attendance_id='.$attendance[0].'">'.
Display::return_icon('locked.png', get_lang('UnlockAttendance')).'</a>'; Display::return_icon('lock-closed.png', get_lang('UnlockAttendance')).'</a>';
} else { } else {
$actions .= '&nbsp;'.Display::return_icon('locked_na.png', get_lang('LockedAttendance')); $actions .= '&nbsp;'.Display::return_icon('locked_na.png', get_lang('LockedAttendance'));
} }
@ -1304,7 +1304,7 @@ class Attendance
// Get attendance for current user // Get attendance for current user
$user_id = (int) $user_id; $user_id = (int) $user_id;
if (count($calendar_ids) > 0) { if (count($calendar_ids) > 0) {
$sql = "SELECT cal.date_time, att.presence $sql = "SELECT cal.date_time, att.presence, cal.iid as calendar_id
FROM $tbl_attendance_sheet att FROM $tbl_attendance_sheet att
INNER JOIN $tbl_attendance_calendar cal INNER JOIN $tbl_attendance_calendar cal
ON cal.id = att.attendance_calendar_id ON cal.id = att.attendance_calendar_id
@ -1324,7 +1324,6 @@ class Attendance
} }
} }
} }
return $data; return $data;
} }
@ -2520,7 +2519,8 @@ class Attendance
*/ */
public function deleteSignature( public function deleteSignature(
$userId, $userId,
$attendanceCalendarId $attendanceCalendarId,
$attendanceId
) { ) {
$allowSignature = api_get_configuration_value('enable_sign_attendance_sheet'); $allowSignature = api_get_configuration_value('enable_sign_attendance_sheet');
if (!$allowSignature) { if (!$allowSignature) {
@ -2536,16 +2536,16 @@ class Attendance
]; ];
$repo = $em->getRepository('ChamiloCourseBundle:CAttendanceSheet'); $repo = $em->getRepository('ChamiloCourseBundle:CAttendanceSheet');
$result = $repo->findBy($criteria); $attendanceSheet = $repo->findOneBy($criteria);
if (count($result) > 0) { if ($attendanceSheet) {
/** @var CAttendanceSheet $attendanceSheet */ /** @var CAttendanceSheet $attendanceSheet */
$attendanceSheet = $result[0];
$attendanceSheet->setPresence(0); $attendanceSheet->setPresence(0);
$attendanceSheet->setSignature(''); $attendanceSheet->setSignature('');
$em->persist($attendanceSheet); $em->persist($attendanceSheet);
$em->flush(); $em->flush();
$this->updateUsersResults([$userId], $attendanceId);
} }
} }
@ -2575,12 +2575,11 @@ class Attendance
'attendanceCalendarId' => $attendanceCalendarId, 'attendanceCalendarId' => $attendanceCalendarId,
'cId' => $courseId, 'cId' => $courseId,
]; ];
$result = $repo->findBy($criteria); $attendanceSheet = $repo->findOneBy($criteria);
$signature = ""; $signature = "";
if (count($result) > 0) { if ($attendanceSheet) {
/** @var CAttendanceSheet $attendanceSheet */ /** @var CAttendanceSheet $attendanceSheet */
$attendanceSheet = $result[0];
$signature = $attendanceSheet->getSignature(); $signature = $attendanceSheet->getSignature();
} }
@ -2599,7 +2598,8 @@ class Attendance
public function saveSignature( public function saveSignature(
$userId, $userId,
$attendanceCalendarId, $attendanceCalendarId,
$file $file,
$attendanceId
) { ) {
$allowSignature = api_get_configuration_value('enable_sign_attendance_sheet'); $allowSignature = api_get_configuration_value('enable_sign_attendance_sheet');
if (!$allowSignature) { if (!$allowSignature) {
@ -2615,11 +2615,10 @@ class Attendance
]; ];
$repo = $em->getRepository('ChamiloCourseBundle:CAttendanceSheet'); $repo = $em->getRepository('ChamiloCourseBundle:CAttendanceSheet');
$result = $repo->findBy($criteria); $attendanceSheet = $repo->findOneBy($criteria);
/** @var CAttendanceSheet $attendanceSheet */ /** @var CAttendanceSheet $attendanceSheet */
if (count($result) > 0) { if ($attendanceSheet) {
$attendanceSheet = $result[0];
$attendanceSheet->setPresence(1); $attendanceSheet->setPresence(1);
$attendanceSheet->setSignature($file); $attendanceSheet->setSignature($file);
$em->persist($attendanceSheet); $em->persist($attendanceSheet);
@ -2636,5 +2635,6 @@ class Attendance
$em->persist($attendanceSheet); $em->persist($attendanceSheet);
$em->flush(); $em->flush();
} }
$this->updateUsersResults([$userId], $attendanceId);
} }
} }

Loading…
Cancel
Save