diff --git a/main/attendance/attendance_sheet.php b/main/attendance/attendance_sheet.php index e63daeff67..5f36fc0802 100755 --- a/main/attendance/attendance_sheet.php +++ b/main/attendance/attendance_sheet.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 ''; echo '
'; @@ -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 '
+ + + '.get_lang('SignView').' + +
'; + } else { + echo '
+ + + '.get_lang('Sign').' + +
'; + } + } } 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; + } }