';
@@ -360,6 +371,23 @@ if (api_is_allowed_to_edit(null, true) ||
if (!$is_locked_attendance || api_is_platform_admin()) {
echo '
';
echo '
';
+ if ($allowSignature) {
+ if (!empty($signature)) {
+ echo '
';
+ } else {
+ echo '
';
+ }
+ }
} 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) ||
} ?>
+}
+
+if ($allowSignature) {
+ ?>
+
+
+
+
+
diff --git a/main/attendance/index.php b/main/attendance/index.php
index b70f11290c..6f68b8718d 100755
--- a/main/attendance/index.php
+++ b/main/attendance/index.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() {
});
';
+
+$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;
diff --git a/main/inc/ajax/user_manager.ajax.php b/main/inc/ajax/user_manager.ajax.php
index 865f5f1301..611c2b635e 100755
--- a/main/inc/ajax/user_manager.ajax.php
+++ b/main/inc/ajax/user_manager.ajax.php
@@ -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);
diff --git a/main/inc/lib/attendance.lib.php b/main/inc/lib/attendance.lib.php
index b203f0a525..da9c37e0dd 100755
--- a/main/inc/lib/attendance.lib.php
+++ b/main/inc/lib/attendance.lib.php
@@ -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] = '
'.
Security::remove_XSS($attendance[1]).
''.
$session_star;
} else {
// Link to view
- $attendance[1] = '
'.
Security::remove_XSS($attendance[1]).
''.
$session_star;
}
} else {
- $attendance[1] = '
'.
Security::remove_XSS($attendance[1]).
''.
@@ -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();
+ }
+ }
}
diff --git a/main/install/configuration.dist.php b/main/install/configuration.dist.php
index a8c1e1298b..7307577c65 100755
--- a/main/install/configuration.dist.php
+++ b/main/install/configuration.dist.php
@@ -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
diff --git a/src/Chamilo/CourseBundle/Entity/CAttendanceSheet.php b/src/Chamilo/CourseBundle/Entity/CAttendanceSheet.php
index 7935891b63..1035ac2305 100644
--- a/src/Chamilo/CourseBundle/Entity/CAttendanceSheet.php
+++ b/src/Chamilo/CourseBundle/Entity/CAttendanceSheet.php
@@ -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;
+ }
}