Attendance - Add sign for user in attendance sheet - refs BT#18271

pull/4300/head
Christian 3 years ago
parent d848f21f29
commit ccfec6298f
  1. 175
      main/attendance/attendance_sheet.php
  2. 20
      main/attendance/index.php
  3. 32
      main/inc/ajax/user_manager.ajax.php
  4. 139
      main/inc/lib/attendance.lib.php
  5. 6
      main/install/configuration.dist.php
  6. 37
      src/Chamilo/CourseBundle/Entity/CAttendanceSheet.php

@ -18,6 +18,8 @@ $isDrhOfCourse = CourseManager::isUserSubscribedInCourseAsDrh(
api_get_course_info()
) || api_is_drh();
$allowSignature = api_get_configuration_value('enable_sign_attendance_sheet');
if (api_is_allowed_to_edit(null, true) ||
api_is_coach(api_get_session_id(), api_get_course_int_id()) ||
$isDrhOfCourse
@ -353,6 +355,15 @@ if (api_is_allowed_to_edit(null, true) ||
$disabled = '';
}
if ($allowSignature) {
$attendance = new Attendance();
$signature = $attendance->getSignature($user['user_id'], $calendar['id']);
if (!empty($signature)) {
$disabled = 'disabled';
$checked = 'checked';
}
}
echo '<td style="'.$style_td.'" class="checkboxes_col_'.$calendar['id'].'">';
echo '<div class="check">';
@ -360,6 +371,23 @@ if (api_is_allowed_to_edit(null, true) ||
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 (!empty($signature)) {
echo '<div class="list-data">
<span class="item"></span>
<a id="sign-'.$user['user_id'].'-'.$calendar['id'].'" class="btn btn-primary attendance-sign-view" href="javascript:void(0)">
<em class="fa fa-search"></em> '.get_lang('SignView').'
</a>
</div>';
} else {
echo '<div class="list-data">
<span class="item"></span>
<a id="sign-'.$user['user_id'].'-'.$calendar['id'].'" class="btn btn-primary attendance-sign" href="javascript:void(0)">
<em class="fa fa-pencil"></em> '.get_lang('Sign').'
</a>
</div>';
}
}
} 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);
}
@ -468,4 +496,149 @@ if (api_is_allowed_to_edit(null, true) ||
} ?>
</table>
<?php
} ?>
}
if ($allowSignature) {
?>
<div id="sign_popup" style="display: none">
<div id="signature_area" class="well">
<canvas width="400px"></canvas>
</div>
<span class="loading" style="display: none"><em class="fa fa-spinner"></em></span>
<span id="save_controls">
<button id="sign_popup_save" class="btn btn-primary" type="submit">
<em class="fa fa-save"></em> <?php echo get_lang('Save'); ?>
</button>
<button id="sign_popup_clean" class="btn btn-default" type="submit">
<em class="fa fa-eraser"></em> <?php echo get_lang('Clean'); ?>
</button>
</span>
<span id="remove_controls" clase="hidden">
<button id="sign_popup_remove" class="btn btn-danger" type="submit">
<em class="fa fa-remove"></em> <?php echo get_lang('Remove'); ?>
</button>
</span>
<span id="close_controls" style="display: none">
<span id="sign_results"></span>
<hr />
<button id="sign_popup_close" class="btn btn-default" type="submit">
<?php echo get_lang('Close'); ?>
</button>
</span>
<input type="hidden" id="sign-selected" />
</div>
<script>
var imageFormat = 'image/png';
var canvas = document.querySelector("#signature_area canvas");
var signaturePad = new SignaturePad(canvas);
var urlAjax = "<?php echo api_get_path(WEB_AJAX_PATH).'user_manager.ajax.php?'.api_get_cidreq(); ?>";
$(function() {
$("#sign_popup_close").on("click", function() {
$("#sign_popup").dialog("close");
$('#loading').hide();
$('#save_controls').show();
$('#close_controls').hide();
$('#signature_area').show();
});
$("#sign_popup_clean").on("click", function() {
signaturePad.clear();
});
$("#sign_popup_remove").on("click", function() {
var selected = $("#sign-selected").val();
$.ajax({
type: "POST",
url: urlAjax,
data: "a=remove_attendance_sign&selected="+selected,
success: function(data) {
location.reload();
},
});
});
$("#sign_popup_save").on("click", function() {
if (signaturePad.isEmpty()) {
alert('<?php echo get_lang('ProvideASignatureFirst'); ?>');
return false;
}
var selected = $("#sign-selected").val();
var dataURL = signaturePad.toDataURL(imageFormat);
$.ajax({
beforeSend: function(result) {
$('#loading').show();
},
type: "POST",
url: urlAjax,
data: "a=sign_attendance&selected="+selected+"&file="+dataURL,
success: function(data) {
$('#loading').hide();
$('#save_controls').hide();
$('#close_controls').show();
$('#signature_area').hide();
signaturePad.clear();
if (1 == data) {
$('#sign_results').html('<?php echo get_lang('Saved'); ?>');
} else {
$('#sign_results').html('<?php echo get_lang('Error'); ?>');
}
$('#close_controls').hide();
location.reload();
},
});
});
$(".attendance-sign").on("click", function() {
$("#sign-selected").val($(this).attr("id"));
$("#sign_popup").dialog({
autoOpen: false,
width: 500,
height: 'auto',
close: function(){
}
});
$("#sign_popup").dialog("open");
$("#save_controls").show();
$("#remove_controls").hide();
$('#signature_area').show();
$('#signature_area').html("<canvas width='400px'></canvas>");
canvas = document.querySelector("#signature_area canvas");
signaturePad = new SignaturePad(canvas);
});
$(".attendance-sign-view").on("click", function() {
var selected = $(this).attr("id");
$.ajax({
beforeSend: function(result) {
$('#signature_area').html("");
$('#loading').show();
},
type: "POST",
url: urlAjax,
data: "a=get_attendance_sign&selected="+selected,
success: function(sign) {
$('#signature_area').show();
$('#signature_area').html("<img src='"+sign+"' />");
},
});
$("#sign_popup").dialog({
autoOpen: false,
width: 500,
height: 'auto',
close: function(){
}
});
$("#sign-selected").val(selected);
$("#sign_popup").dialog("open");
$("#save_controls").hide();
$("#remove_controls").show();
});
});
</script>
<?php
}
?>

@ -103,7 +103,7 @@ $(function() {
$(".row_odd td.checkboxes_col_"+calendar_id).css({
"opacity":"1",
"background-color":"#F9F9F9",
"background-color":"#F9F9F9",
"border-left":"none",
"border-right":"none"
});
@ -125,16 +125,16 @@ $(function() {
$(".row_odd td.checkboxes_col_"+calendar_id).css({
"opacity":"1",
"background-color":"#dcdcdc",
"border-left":"1px #bbb solid",
"border-right":"1px #bbb solid",
"background-color":"#dcdcdc",
"border-left":"1px #bbb solid",
"border-right":"1px #bbb solid",
"z-index":"1"
});
$(".row_even td.checkboxes_col_"+calendar_id).css({
"opacity":"1",
"background-color":"#eee",
"border-left":"1px #bbb solid",
"border-right":"1px #bbb solid",
"background-color":"#eee",
"border-left":"1px #bbb solid",
"border-right":"1px #bbb solid",
"z-index":"1"
});
@ -185,6 +185,12 @@ $(function() {
});
</script>';
$allowSignature = api_get_configuration_value('enable_sign_attendance_sheet');
if ($allowSignature) {
$htmlHeadXtra[] = api_get_asset('signature_pad/signature_pad.umd.js');
}
$student_param = '';
$student_id = null;

@ -14,9 +14,39 @@ require_once __DIR__.'/../global.inc.php';
$request = HttpRequest::createFromGlobals();
$isRequestByAjax = $request->isXmlHttpRequest();
$action = $_GET['a'];
$action = $_REQUEST['a'];
switch ($action) {
case 'get_attendance_sign':
$selected = $_REQUEST['selected'];
if (!empty($selected)) {
list($prefix, $userId, $attendanceCalendarId) = explode('-', $selected);
$attendance = new Attendance();
$signature = $attendance->getSignature($userId, $attendanceCalendarId);
echo $signature;
}
break;
case 'remove_attendance_sign':
$selected = $_REQUEST['selected'];
if (!empty($selected)) {
list($prefix, $userId, $attendanceCalendarId) = explode('-', $selected);
$attendance = new Attendance();
$attendance->deleteSignature($userId, $attendanceCalendarId);
}
break;
case 'sign_attendance':
$selected = $_REQUEST['selected'];
$file = isset($_REQUEST['file']) ? $_REQUEST['file'] : '';
$file = str_replace(' ', '+', $file);
if (!empty($selected)) {
list($prefix, $userId, $attendanceCalendarId) = explode('-', $selected);
$attendance = new Attendance();
$attendance->saveSignature($userId, $attendanceCalendarId, $file);
echo 1;
exit;
}
echo 0;
break;
case 'set_expiration_date':
$status = (int) $_REQUEST['status'];
$dates = UserManager::getExpirationDateByRole($status);

@ -10,6 +10,9 @@
*
* @package chamilo.attendance
*/
use Chamilo\CourseBundle\Entity\CAttendanceSheet;
class Attendance
{
// constants
@ -181,22 +184,22 @@ class Attendance
) || api_is_drh();
if (api_is_allowed_to_edit(null, true) || $isDrhOfCourse) {
// Link to edit
$attendance[1] = '<a
$attendance[1] = '<a
href="index.php?'.api_get_cidreq().'&action=attendance_sheet_list&attendance_id='.$attendance[0].$student_param.'">'.
Security::remove_XSS($attendance[1]).
'</a>'.
$session_star;
} else {
// Link to view
$attendance[1] = '<a
$attendance[1] = '<a
href="index.php?'.api_get_cidreq().'&action=attendance_sheet_list_no_edit&attendance_id='.$attendance[0].$student_param.'">'.
Security::remove_XSS($attendance[1]).
'</a>'.
$session_star;
}
} else {
$attendance[1] = '<a
class="muted"
$attendance[1] = '<a
class="muted"
href="index.php?'.api_get_cidreq().'&action=attendance_sheet_list&attendance_id='.$attendance[0].$student_param.'">'.
Security::remove_XSS($attendance[1]).
'</a>'.
@ -2506,4 +2509,132 @@ class Attendance
return $data;
}
/**
* Clean a sing of a user in attendance sheet.
*
* @param $userId
* @param $attendanceCalendarId
*
* @return false or void when it is deleted.
*/
public function deleteSignature(
$userId,
$attendanceCalendarId
) {
$allowSignature = api_get_configuration_value('enable_sign_attendance_sheet');
if (!$allowSignature) {
return false;
}
$courseId = api_get_course_int_id();
$em = Database::getManager();
$criteria = [
'userId' => $userId,
'attendanceCalendarId' => $attendanceCalendarId,
'cId' => $courseId,
];
$repo = $em->getRepository('ChamiloCourseBundle:CAttendanceSheet');
$result = $repo->findBy($criteria);
if (count($result) > 0) {
/** @var CAttendanceSheet $attendanceSheet */
$attendanceSheet = $result[0];
$attendanceSheet->setPresence(0);
$attendanceSheet->setSignature('');
$em->persist($attendanceSheet);
$em->flush();
}
}
/**
* Get the user sign in attendance sheet.
*
* @param $userId
* @param $attendanceCalendarId
*
* @return false|string
*/
public function getSignature(
$userId,
$attendanceCalendarId
) {
$allowSignature = api_get_configuration_value('enable_sign_attendance_sheet');
if (!$allowSignature) {
return false;
}
$courseId = api_get_course_int_id();
$em = Database::getManager();
$repo = $em->getRepository('ChamiloCourseBundle:CAttendanceSheet');
$criteria = [
'userId' => $userId,
'attendanceCalendarId' => $attendanceCalendarId,
'cId' => $courseId,
];
$result = $repo->findBy($criteria);
$signature = "";
if (count($result) > 0) {
/** @var CAttendanceSheet $attendanceSheet */
$attendanceSheet = $result[0];
$signature = $attendanceSheet->getSignature();
}
return $signature;
}
/**
* It saves the user sign from attendance sheet.
*
* @param $userId
* @param $attendanceCalendarId
* @param $file string in base64
*
* @return false or void when it is saved.
*/
public function saveSignature(
$userId,
$attendanceCalendarId,
$file
) {
$allowSignature = api_get_configuration_value('enable_sign_attendance_sheet');
if (!$allowSignature) {
return false;
}
$courseId = api_get_course_int_id();
$em = Database::getManager();
$criteria = [
'userId' => $userId,
'attendanceCalendarId' => $attendanceCalendarId,
'cId' => $courseId,
];
$repo = $em->getRepository('ChamiloCourseBundle:CAttendanceSheet');
$result = $repo->findBy($criteria);
/** @var CAttendanceSheet $attendanceSheet */
if (count($result) > 0) {
$attendanceSheet = $result[0];
$attendanceSheet->setPresence(1);
$attendanceSheet->setSignature($file);
$em->persist($attendanceSheet);
$em->flush();
} else {
$attendanceSheet = new CAttendanceSheet();
$attendanceSheet
->setCId($courseId)
->setPresence(1)
->setUserId($userId)
->setAttendanceCalendarId($attendanceCalendarId)
->setSignature($file);
$em->persist($attendanceSheet);
$em->flush();
}
}
}

@ -2221,6 +2221,12 @@ INSERT INTO `extra_field` (`extra_field_type`, `field_type`, `variable`, `displa
// Shows the deleted quizzes in my progress page.
//$_configuration['tracking_my_progress_show_deleted_exercises'] = true;
// Enable sign in attendance sheet for users
// Require DB changes:
// ALTER TABLE c_attendance_sheet ADD signature longtext NULL;
// Requires edit Entity CAttendanceSheet : src/Chamilo/CourseBundle/Entity/CAttendanceSheet.php uncomment "signature" variable.
//$_configuration['enable_sign_attendance_sheet'] = false;
// KEEP THIS AT THE END
// -------- Custom DB changes
// Add user activation by confirmation email

@ -57,6 +57,13 @@ class CAttendanceSheet
*/
protected $attendanceCalendarId;
/**
* @var string
*
* @ORM\Column(name="signature", type="string", nullable=true)
*/
//protected $signature;
/**
* Set presence.
*
@ -152,4 +159,34 @@ class CAttendanceSheet
{
return $this->attendanceCalendarId;
}
/**
* @return int
*/
public function getIid()
{
return $this->iid;
}
/**
* Set signature.
*
* @return CAttendanceSheet
*/
public function setSignature(string $signature)
{
$this->signature = $signature;
return $this;
}
/**
* Get signature.
*
* @return string
*/
public function getSignature()
{
return $this->signature;
}
}

Loading…
Cancel
Save