Internal: Fix attendance using resources (WIP)

pull/3513/head
Julio Montoya 5 years ago
parent b0cc9f48c6
commit 9dadb10cb6
  1. 9
      public/main/attendance/index.php
  2. 299
      public/main/inc/lib/attendance.lib.php
  3. 47
      public/main/inc/lib/formvalidator/Element/DatePicker.php
  4. 24
      public/main/inc/lib/formvalidator/FormValidator.class.php
  5. 2
      public/main/template/default/export/pdf_footer.html.twig
  6. 189
      public/main/template/default/export/table_pdf.html.twig
  7. 5
      src/CourseBundle/Entity/CAttendanceCalendar.php

@ -236,7 +236,7 @@ switch ($action) {
$table = new SortableTable( $table = new SortableTable(
'attendance_list', 'attendance_list',
['Attendance', 'getNumberOfAttendances'], ['Attendance', 'getNumberOfAttendances'],
['Attendance', 'get_attendance_data'], ['Attendance', 'getAttendanceData'],
$default_column $default_column
); );
$table->set_additional_parameters($parameters); $table->set_additional_parameters($parameters);
@ -579,7 +579,6 @@ switch ($action) {
); );
$defaults['repeat'] = isset($repeat) ? $repeat : null; $defaults['repeat'] = isset($repeat) ? $repeat : null;
if ($defaults['repeat']) { if ($defaults['repeat']) {
$form->addElement('html', '<div id="repeat-date-attendance" style="display:block">'); $form->addElement('html', '<div id="repeat-date-attendance" style="display:block">');
} else { } else {
@ -593,11 +592,9 @@ switch ($action) {
]; ];
$form->addElement('select', 'repeat_type', get_lang('Repeat type'), $a_repeat_type); $form->addElement('select', 'repeat_type', get_lang('Repeat type'), $a_repeat_type);
$form->addElement( $form->addDatePicker(
'date_picker',
'end_date_time', 'end_date_time',
get_lang('Repeat end date'), get_lang('Repeat end date')
['form_name' => 'attendance_calendar_add']
); );
$defaults['end_date_time'] = date('Y-m-d'); $defaults['end_date_time'] = date('Y-m-d');
$form->addElement('html', '</div>'); $form->addElement('html', '</div>');

@ -5,6 +5,7 @@
use Chamilo\CoreBundle\Entity\ResourceLink; use Chamilo\CoreBundle\Entity\ResourceLink;
use Chamilo\CoreBundle\Framework\Container; use Chamilo\CoreBundle\Framework\Container;
use Chamilo\CourseBundle\Entity\CAttendance; use Chamilo\CourseBundle\Entity\CAttendance;
use Chamilo\CourseBundle\Entity\CAttendanceCalendar;
class Attendance class Attendance
{ {
@ -22,6 +23,42 @@ class Attendance
private $attendance_weight; private $attendance_weight;
private $course_int_id; private $course_int_id;
/**
* Get attendance list only the id, name and attendance_qualify_max fields.
*
* @param int $course_id course db name (optional)
* @param int $session_id session id (optional)
*
* @return array attendances list
*/
public function get_attendances_list($course_id = 0, $session_id = 0)
{
$table = Database::get_course_table(TABLE_ATTENDANCE);
$course_id = (int) $course_id;
if (empty($course_id)) {
$course_id = api_get_course_int_id();
}
$session_id = !empty($session_id) ? (int) $session_id : api_get_session_id();
$condition_session = api_get_session_condition($session_id);
// Get attendance data
$sql = "SELECT iid, name, attendance_qualify_max
FROM $table
WHERE active = 1 $condition_session ";
$result = Database::query($sql);
$data = [];
if (Database::num_rows($result) > 0) {
while ($row = Database::fetch_array($result, 'ASSOC')) {
$data[$row['iid']] = $row;
}
}
return $data;
}
/** /**
* Get the total number of attendance inside current course and current session. * Get the total number of attendance inside current course and current session.
* *
@ -33,6 +70,27 @@ class Attendance
*/ */
public static function getNumberOfAttendances() public static function getNumberOfAttendances()
{ {
$repo = Container::getAttendanceRepository();
$course = api_get_course_entity(api_get_course_int_id());
$session = api_get_session_entity(api_get_session_id());
$group = api_get_group_entity(api_get_group_id());
$qb = $repo->getResourcesByCourse($course, $session, $group);
$qb->select('count(resource)');
$qb->andWhere('resource.active <> 2');
if ((isset($_GET['isStudentView']) && 'true' == $_GET['isStudentView']) ||
!api_is_allowed_to_edit(null, true)
) {
$qb
->andWhere('resource.active = :active')
->setParameter('active', 1);
//$active_plus = ' AND att.active = 1';
}
return $qb->getQuery()->getSingleScalarResult();
$tbl_attendance = Database::get_course_table(TABLE_ATTENDANCE); $tbl_attendance = Database::get_course_table(TABLE_ATTENDANCE);
$session_id = api_get_session_id(); $session_id = api_get_session_id();
$condition_session = ''; $condition_session = '';
@ -58,40 +116,6 @@ class Attendance
return (int) $obj->total_number_of_items; return (int) $obj->total_number_of_items;
} }
/**
* Get attendance list only the id, name and attendance_qualify_max fields.
*
* @param int $course_id course db name (optional)
* @param int $session_id session id (optional)
*
* @return array attendances list
*/
public function get_attendances_list($course_id = 0, $session_id = 0)
{
$table = Database::get_course_table(TABLE_ATTENDANCE);
$course_id = (int) $course_id;
if (empty($course_id)) {
$course_id = api_get_course_int_id();
}
$session_id = !empty($session_id) ? (int) $session_id : api_get_session_id();
$condition_session = api_get_session_condition($session_id);
// Get attendance data
$sql = "SELECT iid, name, attendance_qualify_max
FROM $table
WHERE active = 1 $condition_session ";
$result = Database::query($sql);
$data = [];
if (Database::num_rows($result) > 0) {
while ($row = Database::fetch_array($result, 'ASSOC')) {
$data[$row['iid']] = $row;
}
}
return $data;
}
/** /**
* Get the attendances to display on the current page (fill the sortable-table). * Get the attendances to display on the current page (fill the sortable-table).
* *
@ -104,131 +128,128 @@ class Attendance
* *
* @return array * @return array
*/ */
public static function get_attendance_data( public static function getAttendanceData(
$from, $from,
$number_of_items, $number_of_items,
$column, $column,
$direction $direction
) { ) {
$tbl_attendance = Database::get_course_table(TABLE_ATTENDANCE); $repo = Container::getAttendanceRepository();
$course_id = api_get_course_int_id();
$session_id = api_get_session_id();
$condition_session = '';
$column = (int) $column;
$from = (int) $from;
$number_of_items = (int) $number_of_items;
if (!in_array($direction, ['ASC', 'DESC'])) { $course = api_get_course_entity(api_get_course_int_id());
$direction = 'ASC'; $session = api_get_session_entity(api_get_session_id());
} $group = api_get_group_entity(api_get_group_id());
$qb = $repo->getResourcesByCourse($course, $session, $group);
$qb->select('resource');
$qb->andWhere('resource.active <> 2');
$active_plus = '';
if ((isset($_GET['isStudentView']) && 'true' == $_GET['isStudentView']) || if ((isset($_GET['isStudentView']) && 'true' == $_GET['isStudentView']) ||
!api_is_allowed_to_edit(null, true) !api_is_allowed_to_edit(null, true)
) { ) {
$active_plus = ' AND att.active = 1'; $qb
->andWhere('resource.active = :active')
->setParameter('active', 1);
//$active_plus = ' AND att.active = 1';
} }
$sql = "SELECT $qb
att.iid AS col0, ->setFirstResult($from)
att.name AS col1, ->setMaxResults($number_of_items)
att.description AS col2, ;
att.attendance_qualify_max AS col3,
att.locked AS col4,
att.active AS col5
FROM $tbl_attendance att
WHERE
att.active <> 2
$active_plus $condition_session
ORDER BY col$column $direction
LIMIT $from,$number_of_items ";
$res = Database::query($sql); if (!in_array($direction, ['ASC', 'DESC'])) {
$attendances = []; $direction = 'ASC';
$user_info = api_get_user_info(); }
$allowDelete = api_get_setting('allow_delete_attendance');
$attendances = $qb->getQuery()->getResult();
$allowDelete = api_get_setting('allow_delete_attendance');
$student_param = ''; $student_param = '';
$studentRequestId = isset($_GET['student_id']) ? (int) $_GET['student_id'] : 0; $studentRequestId = isset($_GET['student_id']) ? (int) $_GET['student_id'] : 0;
if (api_is_drh() && !empty($studentRequestId)) { if (api_is_drh() && !empty($studentRequestId)) {
$student_param = '&student_id='.$studentRequestId; $student_param = '&student_id='.$studentRequestId;
} }
while ($attendance = Database::fetch_row($res)) { $list = [];
/** @var CAttendance $attendance */
foreach ($attendances as $attendance) {
$row = [];
$id = $attendance->getIid();
$name = $attendance->getName();
$active = $attendance->getActive();
$session_star = ''; $session_star = '';
/*if ($session_id == $attendance[6]) { /*if ($session_id == $attendance[6]) {
$session_star = api_get_session_image($session_id, $user_info['status']); $session_star = api_get_session_image($session_id, $user_info['status']);
}*/ }*/
if (1 == $active) {
if (1 == $attendance[5]) {
$isDrhOfCourse = CourseManager::isUserSubscribedInCourseAsDrh( $isDrhOfCourse = CourseManager::isUserSubscribedInCourseAsDrh(
api_get_user_id(), api_get_user_id(),
api_get_course_info() api_get_course_info()
) || api_is_drh(); ) || api_is_drh();
if (api_is_allowed_to_edit(null, true) || $isDrhOfCourse) { if ( $isDrhOfCourse || api_is_allowed_to_edit(null, true)) {
// Link to edit // Link to edit
$attendance[1] = '<a href="index.php?'.api_get_cidreq().'&action=attendance_sheet_list&attendance_id='.$attendance[0].$student_param.'">'.$attendance[1].'</a>'.$session_star; $row[1] = '<a href="index.php?'.api_get_cidreq().'&action=attendance_sheet_list&attendance_id='.$id.$student_param.'">'.$name.'</a>'.$session_star;
} else { } else {
// Link to view // Link to view
$attendance[1] = '<a href="index.php?'.api_get_cidreq().'&action=attendance_sheet_list_no_edit&attendance_id='.$attendance[0].$student_param.'">'.$attendance[1].'</a>'.$session_star; $row[1] = '<a href="index.php?'.api_get_cidreq().'&action=attendance_sheet_list_no_edit&attendance_id='.$id.$student_param.'">'.$name.'</a>'.$session_star;
} }
} else { } else {
$attendance[1] = '<a class="muted" href="index.php?'.api_get_cidreq().'&action=attendance_sheet_list&attendance_id='.$attendance[0].$student_param.'">'.$attendance[1].'</a>'.$session_star; $row[1] = '<a class="muted" href="index.php?'.api_get_cidreq().'&action=attendance_sheet_list&attendance_id='.$id.$student_param.'">'.$name.'</a>'.$session_star;
} }
if (1 == $attendance[5]) { if (1 == $active) {
$attendance[3] = '<center>'.$attendance[3].'</center>'; $row[3] = '<center>'.$attendance->getAttendanceQualifyMax().'</center>';
} else { } else {
$attendance[3] = '<center><span class="muted">'.$attendance[3].'</span></center>'; $row[3] = '<center><span class="muted">'.$attendance->getAttendanceQualifyMax().'</span></center>';
} }
$row[2] = '';
$attendance[3] = '<center>'.$attendance[3].'</center>'; $row[3] = '<center>'.$row[3].'</center>';
if (api_is_allowed_to_edit(null, true)) { if (api_is_allowed_to_edit(null, true)) {
$actions = ''; $actions = '';
$actions .= '<center>'; $actions .= '<center>';
if (api_is_platform_admin()) { if (api_is_platform_admin()) {
$actions .= '<a href="index.php?'.api_get_cidreq().'&action=attendance_edit&attendance_id='.$attendance[0].'">'. $actions .= '<a href="index.php?'.api_get_cidreq().'&action=attendance_edit&attendance_id='.$id.'">'.
Display::return_icon('edit.png', get_lang('Edit'), [], ICON_SIZE_SMALL).'</a>&nbsp;'; Display::return_icon('edit.png', get_lang('Edit'), [], ICON_SIZE_SMALL).'</a>&nbsp;';
// Visible // Visible
if (1 == $attendance[5]) { if (1 == $active) {
$actions .= '<a href="index.php?'.api_get_cidreq().'&action=attendance_set_invisible&attendance_id='.$attendance[0].'">'. $actions .= '<a href="index.php?'.api_get_cidreq().'&action=attendance_set_invisible&attendance_id='.$id.'">'.
Display::return_icon('visible.png', get_lang('Hide'), [], ICON_SIZE_SMALL).'</a>'; Display::return_icon('visible.png', get_lang('Hide'), [], ICON_SIZE_SMALL).'</a>';
} else { } else {
$actions .= '<a href="index.php?'.api_get_cidreq().'&action=attendance_set_visible&attendance_id='.$attendance[0].'">'. $actions .= '<a href="index.php?'.api_get_cidreq().'&action=attendance_set_visible&attendance_id='.$id.'">'.
Display::return_icon('invisible.png', get_lang('Show'), [], ICON_SIZE_SMALL).'</a>'; Display::return_icon('invisible.png', get_lang('Show'), [], ICON_SIZE_SMALL).'</a>';
$attendance[2] = '<span class="muted">'.$attendance[2].'</span>'; $row[2] = '<span class="muted">'.$attendance->getDescription().'</span>';
} }
if ('true' === $allowDelete) { if ('true' === $allowDelete) {
$actions .= '<a href="index.php?'.api_get_cidreq().'&action=attendance_delete&attendance_id='.$attendance[0].'">'. $actions .= '<a href="index.php?'.api_get_cidreq().'&action=attendance_delete&attendance_id='.$id.'">'.
Display::return_icon('delete.png', get_lang('Delete'), [], ICON_SIZE_SMALL).'</a>'; Display::return_icon('delete.png', get_lang('Delete'), [], ICON_SIZE_SMALL).'</a>';
} }
} else { } else {
$is_locked_attendance = self::is_locked_attendance($attendance[0]); $is_locked_attendance = self::is_locked_attendance($id);
if ($is_locked_attendance) { if ($is_locked_attendance) {
$actions .= Display::return_icon('edit_na.png', get_lang('Edit')).'&nbsp;'; $actions .= Display::return_icon('edit_na.png', get_lang('Edit')).'&nbsp;';
$actions .= Display::return_icon('visible.png', get_lang('Hide')); $actions .= Display::return_icon('visible.png', get_lang('Hide'));
} else { } else {
$actions .= '<a href="index.php?'.api_get_cidreq().'&action=attendance_edit&attendance_id='.$attendance[0].'">'. $actions .= '<a href="index.php?'.api_get_cidreq().'&action=attendance_edit&attendance_id='.$id.'">'.
Display::return_icon('edit.png', get_lang('Edit'), [], ICON_SIZE_SMALL).'</a>&nbsp;'; Display::return_icon('edit.png', get_lang('Edit'), [], ICON_SIZE_SMALL).'</a>&nbsp;';
if (1 == $attendance[5]) { if (1 == $active) {
$actions .= ' <a href="index.php?'.api_get_cidreq().'&action=attendance_set_invisible&attendance_id='.$attendance[0].'">'. $actions .= ' <a href="index.php?'.api_get_cidreq().'&action=attendance_set_invisible&attendance_id='.$id.'">'.
Display::return_icon('visible.png', get_lang('Hide'), [], ICON_SIZE_SMALL).'</a>'; Display::return_icon('visible.png', get_lang('Hide'), [], ICON_SIZE_SMALL).'</a>';
} else { } else {
$actions .= ' <a href="index.php?'.api_get_cidreq().'&action=attendance_set_visible&attendance_id='.$attendance[0].'">'. $actions .= ' <a href="index.php?'.api_get_cidreq().'&action=attendance_set_visible&attendance_id='.$id.'">'.
Display::return_icon('invisible.png', get_lang('Show'), [], ICON_SIZE_SMALL).'</a>'; Display::return_icon('invisible.png', get_lang('Show'), [], ICON_SIZE_SMALL).'</a>';
$attendance[2] = '<span class="muted">'.$attendance[2].'</span>'; $row[2] = '<span class="muted">'.$attendance->getDescription().'</span>';
} }
if ('true' === $allowDelete) { if ('true' === $allowDelete) {
$actions .= ' <a href="index.php?'.api_get_cidreq().'&action=attendance_delete&attendance_id='.$attendance[0].'">'. $actions .= ' <a href="index.php?'.api_get_cidreq().'&action=attendance_delete&attendance_id='.$id.'">'.
Display::return_icon('delete.png', get_lang('Delete'), [], ICON_SIZE_SMALL).'</a>'; Display::return_icon('delete.png', get_lang('Delete'), [], ICON_SIZE_SMALL).'</a>';
} }
} }
} }
// display lock/unlock icon // display lock/unlock icon
$is_done_all_calendar = self::is_all_attendance_calendar_done($attendance[0]); $is_done_all_calendar = self::is_all_attendance_calendar_done($id);
if ($is_done_all_calendar) { if ($is_done_all_calendar) {
$locked = $attendance[4]; $locked = $attendance[4];
@ -240,13 +261,13 @@ class Attendance
} }
$actions .= '&nbsp;<a $actions .= '&nbsp;<a
onclick="javascript:if(!confirm(\''.$message_alert.'\')) return false;" onclick="javascript:if(!confirm(\''.$message_alert.'\')) return false;"
href="index.php?'.api_get_cidreq().'&action=lock_attendance&attendance_id='.$attendance[0].'">'. href="index.php?'.api_get_cidreq().'&action=lock_attendance&attendance_id='.$id.'">'.
Display::return_icon('unlock.png', get_lang('Lock attendance')).'</a>'; Display::return_icon('unlock.png', get_lang('Lock attendance')).'</a>';
} else { } else {
if (api_is_platform_admin()) { if (api_is_platform_admin()) {
$actions .= '&nbsp;<a $actions .= '&nbsp;<a
onclick="javascript:if(!confirm(\''.get_lang('Are you sure you want to unlock the attendance?').'\')) return false;" onclick="javascript:if(!confirm(\''.get_lang('Are you sure you want to unlock the attendance?').'\')) return false;"
href="index.php?'.api_get_cidreq().'&action=unlock_attendance&attendance_id='.$attendance[0].'">'. href="index.php?'.api_get_cidreq().'&action=unlock_attendance&attendance_id='.$id.'">'.
Display::return_icon('locked.png', get_lang('Unlock attendance')).'</a>'; Display::return_icon('locked.png', get_lang('Unlock attendance')).'</a>';
} else { } else {
$actions .= '&nbsp;'.Display::return_icon('locked_na.png', get_lang('Locked attendance')); $actions .= '&nbsp;'.Display::return_icon('locked_na.png', get_lang('Locked attendance'));
@ -255,25 +276,25 @@ class Attendance
} }
$actions .= '</center>'; $actions .= '</center>';
$attendances[] = [ $list[] = [
$attendance[0], $id,
$attendance[1], $row[1],
$attendance[2], $row[2],
$attendance[3], $row[3],
$actions, $actions,
]; ];
} else { } else {
$attendance[0] = '&nbsp;'; $id = '&nbsp;';
$attendances[] = [ $list[] = [
$attendance[0], $id,
$attendance[1], $row[1],
$attendance[2], $row[2],
$attendance[3], $row[3],
]; ];
} }
} }
return $attendances; return $list;
} }
/** /**
@ -1244,7 +1265,6 @@ class Attendance
ON cal.iid = att.attendance_calendar_id ON cal.iid = att.attendance_calendar_id
WHERE WHERE
att.c_id = $course_id AND att.c_id = $course_id AND
cal.c_id = $course_id AND
att.user_id = '$user_id' AND att.user_id = '$user_id' AND
att.attendance_calendar_id IN (".implode(',', $calendar_ids).") att.attendance_calendar_id IN (".implode(',', $calendar_ids).")
$whereDate $whereDate
@ -1277,7 +1297,6 @@ class Attendance
$sql = "SELECT iid FROM $table $sql = "SELECT iid FROM $table
WHERE WHERE
c_id = $course_id AND
attendance_id = '$attendanceId' AND attendance_id = '$attendanceId' AND
done_attendance = 0 done_attendance = 0
ORDER BY date_time ORDER BY date_time
@ -1306,7 +1325,6 @@ class Attendance
$attendanceId = (int) $attendanceId; $attendanceId = (int) $attendanceId;
$sql = "SELECT iid, date_time FROM $table $sql = "SELECT iid, date_time FROM $table
WHERE WHERE
c_id = $course_id AND
attendance_id = '$attendanceId' AND attendance_id = '$attendanceId' AND
done_attendance = 0 done_attendance = 0
ORDER BY date_time ORDER BY date_time
@ -1388,7 +1406,7 @@ class Attendance
$calendar_id = (int) $calendar_id; $calendar_id = (int) $calendar_id;
$course_id = api_get_course_int_id(); $course_id = api_get_course_int_id();
$sql = "SELECT * FROM $table $sql = "SELECT * FROM $table
WHERE c_id = $course_id AND iid = '$calendar_id' "; WHERE iid = '$calendar_id' ";
$rs = Database::query($sql); $rs = Database::query($sql);
$data = []; $data = [];
if (Database::num_rows($rs) > 0) { if (Database::num_rows($rs) > 0) {
@ -1428,7 +1446,7 @@ class Attendance
$tbl_attendance_calendar = Database::get_course_table(TABLE_ATTENDANCE_CALENDAR); $tbl_attendance_calendar = Database::get_course_table(TABLE_ATTENDANCE_CALENDAR);
$tbl_acrg = Database::get_course_table(TABLE_ATTENDANCE_CALENDAR_REL_GROUP); $tbl_acrg = Database::get_course_table(TABLE_ATTENDANCE_CALENDAR_REL_GROUP);
$attendanceId = (int) $attendanceId; $attendanceId = (int) $attendanceId;
$course_id = (0 == $course_id) ? api_get_course_int_id() : (int) $course_id; $course_id = 0 == $course_id ? api_get_course_int_id() : (int) $course_id;
$whereDate = ''; $whereDate = '';
if (!empty($startDate)) { if (!empty($startDate)) {
$whereDate .= " AND c.date_time >= '".$startDate->format('Y-m-d H:i:s')."'"; $whereDate .= " AND c.date_time >= '".$startDate->format('Y-m-d H:i:s')."'";
@ -1438,13 +1456,12 @@ class Attendance
} }
if ($showAll) { if ($showAll) {
$sql = "SELECT * FROM $tbl_attendance_calendar c $sql = "SELECT * FROM $tbl_attendance_calendar c
WHERE c_id = $course_id WHERE
AND attendance_id = '$attendanceId' attendance_id = '$attendanceId'
$whereDate"; $whereDate";
} else { } else {
$sql = "SELECT * FROM $tbl_attendance_calendar c $sql = "SELECT * FROM $tbl_attendance_calendar c
WHERE WHERE
c_id = $course_id AND
attendance_id = '$attendanceId' AND attendance_id = '$attendanceId' AND
iid NOT IN ( iid NOT IN (
SELECT calendar_id FROM $tbl_acrg SELECT calendar_id FROM $tbl_acrg
@ -1458,9 +1475,8 @@ class Attendance
$groupId = (int) $groupId; $groupId = (int) $groupId;
$sql = "SELECT c.* FROM $tbl_attendance_calendar c $sql = "SELECT c.* FROM $tbl_attendance_calendar c
INNER JOIN $tbl_acrg g INNER JOIN $tbl_acrg g
ON c.c_id = g.c_id AND c.iid = g.calendar_id ON c.iid = g.calendar_id
WHERE WHERE
c.c_id = $course_id AND
g.group_id = '$groupId' AND g.group_id = '$groupId' AND
c.attendance_id = '$attendanceId' c.attendance_id = '$attendanceId'
"; ";
@ -1572,7 +1588,6 @@ class Attendance
$sql = "SELECT count(a.iid) $sql = "SELECT count(a.iid)
FROM $tbl_attendance_calendar a FROM $tbl_attendance_calendar a
WHERE WHERE
c_id = $course_id AND
$where_attendance $where_attendance
attendance_id = '$attendanceId' AND attendance_id = '$attendanceId' AND
iid NOT IN ( iid NOT IN (
@ -1594,7 +1609,6 @@ class Attendance
INNER JOIN $calendarRelGroup g INNER JOIN $calendarRelGroup g
ON (a.iid = g.calendar_id) ON (a.iid = g.calendar_id)
WHERE WHERE
a.c_id = $course_id AND
$where_attendance $where_attendance
attendance_id = '$attendanceId' AND attendance_id = '$attendanceId' AND
group_id = $groupId group_id = $groupId
@ -1679,31 +1693,20 @@ class Attendance
*/ */
public function attendance_calendar_add($attendance, $groupList = []) public function attendance_calendar_add($attendance, $groupList = [])
{ {
$tbl_attendance_calendar = Database::get_course_table(TABLE_ATTENDANCE_CALENDAR);
$affected_rows = 0;
$attendanceId = $attendance->getIid(); $attendanceId = $attendance->getIid();
$course_id = api_get_course_int_id(); $course_id = api_get_course_int_id();
// check if datetime already exists inside the table
/*$sql = "SELECT id FROM $tbl_attendance_calendar
WHERE
c_id = $course_id AND
date_time='".Database::escape_string($this->date_time)."' AND
attendance_id = '$attendanceId'";
$rs = Database::query($sql);
if (Database::num_rows($rs) == 0) {*/
$params = [
'c_id' => $course_id,
'date_time' => $this->date_time,
'attendance_id' => $attendanceId,
'done_attendance' => 0,
];
$id = Database::insert($tbl_attendance_calendar, $params);
if ($id) { $calendar = new CAttendanceCalendar();
$affected_rows++; $calendar
} ->setAttendanceId($attendanceId)
$this->addAttendanceCalendarToGroup($id, $course_id, $groupList); ->setDateTime(new Datetime($this->date_time))
//} ->setDoneAttendance(0);
$em = Database::getManager();
$em->persist($calendar);
$em->flush();
$this->addAttendanceCalendarToGroup($calendar->getIid(), $course_id, $groupList);
// update locked attendance // update locked attendance
$is_all_calendar_done = $this->is_all_attendance_calendar_done($attendanceId); $is_all_calendar_done = $this->is_all_attendance_calendar_done($attendanceId);
@ -1713,7 +1716,7 @@ class Attendance
$this->lock($attendance); $this->lock($attendance);
} }
return $affected_rows; return true;
} }
/** /**
@ -1883,7 +1886,6 @@ class Attendance
// check if datetime already exists inside the table // check if datetime already exists inside the table
$sql = "SELECT iid FROM $tbl_attendance_calendar $sql = "SELECT iid FROM $tbl_attendance_calendar
WHERE WHERE
c_id = $course_id AND
date_time = '".Database::escape_string($this->date_time)."' AND date_time = '".Database::escape_string($this->date_time)."' AND
attendance_id = '$attendanceId'"; attendance_id = '$attendanceId'";
$rs = Database::query($sql); $rs = Database::query($sql);
@ -1891,7 +1893,7 @@ class Attendance
if (0 == Database::num_rows($rs)) { if (0 == Database::num_rows($rs)) {
$sql = "UPDATE $tbl_attendance_calendar $sql = "UPDATE $tbl_attendance_calendar
SET date_time='".Database::escape_string($this->date_time)."' SET date_time='".Database::escape_string($this->date_time)."'
WHERE c_id = $course_id AND iid = '".intval($calendar_id)."'"; WHERE iid = '".$calendar_id."'";
Database::query($sql); Database::query($sql);
} }
@ -1942,7 +1944,7 @@ class Attendance
Database::query($sql); Database::query($sql);
// delete data from attendance calendar // delete data from attendance calendar
$sql = "DELETE FROM $tbl_attendance_calendar $sql = "DELETE FROM $tbl_attendance_calendar
WHERE c_id = $course_id AND iid = '".intval($cal['iid'])."'"; WHERE iid = '".intval($cal['iid'])."'";
Database::query($sql); Database::query($sql);
$this->deleteAttendanceCalendarGroup($cal['iid'], $course_id); $this->deleteAttendanceCalendarGroup($cal['iid'], $course_id);
@ -1956,7 +1958,7 @@ class Attendance
Database::query($sql); Database::query($sql);
// delete data from attendance calendar // delete data from attendance calendar
$sql = "DELETE FROM $tbl_attendance_calendar $sql = "DELETE FROM $tbl_attendance_calendar
WHERE c_id = $course_id AND iid = '".$calendar_id."'"; WHERE iid = '".$calendar_id."'";
Database::query($sql); Database::query($sql);
$this->deleteAttendanceCalendarGroup($calendar_id, $course_id); $this->deleteAttendanceCalendarGroup($calendar_id, $course_id);
@ -2886,13 +2888,13 @@ class Attendance
$result['full_name'] = api_get_person_name($user['firstname'], $user['lastname']); $result['full_name'] = api_get_person_name($user['firstname'], $user['lastname']);
foreach ($data_array['attendant_calendar'] as $class_day) { foreach ($data_array['attendant_calendar'] as $class_day) {
if (1 == $class_day['done_attendance']) { if (1 == $class_day['done_attendance']) {
if (1 == $data_users_presence[$user['user_id']][$class_day['id']]['presence']) { if (1 == $data_users_presence[$user['user_id']][$class_day['iid']]['presence']) {
$result[$class_day['id']] = get_lang('P'); $result[$class_day['iid']] = get_lang('P');
} else { } else {
$result[$class_day['id']] = '<span style="color:red">'.get_lang('NP').'</span>'; $result[$class_day['iid']] = '<span style="color:red">'.get_lang('NP').'</span>';
} }
} else { } else {
$result[$class_day['id']] = ' '; $result[$class_day['iid']] = ' ';
} }
$cols++; $cols++;
} }
@ -2956,7 +2958,6 @@ class Attendance
'format' => 'A4-L', 'format' => 'A4-L',
'orientation' => 'L', 'orientation' => 'L',
]; ];
Export::export_html_to_pdf($content, $params); Export::export_html_to_pdf($content, $params);
exit; exit;
} }

@ -1,4 +1,5 @@
<?php <?php
/* For licensing terms, see /license.txt */ /* For licensing terms, see /license.txt */
/** /**
@ -43,19 +44,17 @@ class DatePicker extends HTML_QuickForm_text
} }
return ' return '
<div class="input-group"> <div id="'.$id.'" class="input-group mb-3">
<span class="input-group-addon cursor-pointer"> <input '.$this->_getAttrString($this->_attributes).'
<input '.$this->_getAttrString($this->_attributes).'> class="form-control" type="text" value="'.$value.'" data-input>
</span> <div class="input-group-prepend" id="button-addon3">
<p class="form-control disabled" id="'.$id.'_alt_text">'.$value.'</p> <button class="btn btn-outline-secondary" type="button" data-toggle>
<input class="form-control" type="hidden" id="'.$id.'_alt" value="'.$value.'"> <i class="fas fa-calendar-alt"></i>
<span class="input-group-btn"> </button>
<button class="btn btn-default" type="button" <button class="btn btn-outline-secondary" type="button" data-clear>
title="'.sprintf(get_lang('Reset %s'), $this->_label).'"> <i class="fas fa-times"></i>
<span class="fa fa-trash text-danger" aria-hidden="true"></span>
<span class="sr-only">'.sprintf(get_lang('Reset %s'), $this->_label).'</span>
</button> </button>
</span> </div>
</div> </div>
'.$this->getElementJS(); '.$this->getElementJS();
} }
@ -103,9 +102,7 @@ class DatePicker extends HTML_QuickForm_text
</label> </label>
<div class="col-sm-'.$size[1].'"> <div class="col-sm-'.$size[1].'">
{icon} {icon}
{element} {element}
<!-- BEGIN label_2 --> <!-- BEGIN label_2 -->
<p class="help-block">{label_2}</p> <p class="help-block">{label_2}</p>
<!-- END label_2 --> <!-- END label_2 -->
@ -136,14 +133,30 @@ class DatePicker extends HTML_QuickForm_text
{ {
$js = null; $js = null;
$id = $this->getAttribute('id'); $id = $this->getAttribute('id');
//timeFormat: 'hh:mm'
$js .= "<script>
$(function() {
var config = {
altInput: true,
altFormat: '".get_lang('F d, Y')."',
enableTime: false,
dateFormat: 'Y-m-d',
wrap: true
};
$('#{$id}').flatpickr(config);
});
</script>";
$js .= "<script> return $js;
$js .= "<script>
$(function() { $(function() {
var txtDate = $('#$id'), var txtDate = $('#$id'),
inputGroup = txtDate.parents('.input-group'), inputGroup = txtDate.parents('.input-group'),
txtDateAlt = $('#{$id}_alt'), txtDateAlt = $('#{$id}_alt'),
txtDateAltText = $('#{$id}_alt_text'); txtDateAltText = $('#{$id}_alt_text');
txtDate txtDate
.hide() .hide()
.datepicker({ .datepicker({
@ -162,7 +175,7 @@ class DatePicker extends HTML_QuickForm_text
.on('change', function (e) { .on('change', function (e) {
txtDateAltText.text(txtDateAlt.val()); txtDateAltText.text(txtDateAlt.val());
}); });
txtDateAltText.on('click', function () { txtDateAltText.on('click', function () {
txtDate.datepicker('show'); txtDate.datepicker('show');
}); });

@ -260,18 +260,6 @@ EOT;
} }
} }
/**
* @param string $name
* @param string $label
* @param array $attributes
*
* @return mixed
*/
public function addDatePicker($name, $label, $attributes = [])
{
return $this->addElement('DatePicker', $name, $label, $attributes);
}
/** /**
* @param string $name * @param string $name
* @param string $label * @param string $label
@ -309,6 +297,18 @@ EOT;
); );
} }
/**
* @param string $name
* @param string $label
* @param array $attributes
*
* @return mixed
*/
public function addDatePicker($name, $label, $attributes = [])
{
return $this->addElement('DatePicker', $name, $label, $attributes);
}
/** /**
* @param string $name * @param string $name
* @param string|array $label * @param string|array $label

@ -3,7 +3,7 @@
<table border="0" class="full-width border-top page-footer"> <table border="0" class="full-width border-top page-footer">
<tr> <tr>
<td class="text-left"> <td class="text-left">
<strong>{{ _s.institution }}</strong> <strong>{{ chamilo_settings_get('platform.institution') }}</strong>
</td> </td>
<td class="text-right"> <td class="text-right">
<strong>{PAGENO} / {nb}</strong> <strong>{PAGENO} / {nb}</strong>

@ -1,114 +1,113 @@
{% autoescape false %} {% autoescape false %}
{% if pdf_title %} {% if pdf_title %}
<h2 align="center"> {{ pdf_title }} </h2> <h2 align="center"> {{ pdf_title }} </h2>
{% endif %}
{% if pdf_description %}
{{ pdf_description }}
<br /><br />
{% endif %}
<table align="center" width="100%" class="full-width border-thin">
{% if pdf_student_info %}
<tr>
<td style="background-color: #E5E5E5; text-align: left; width:130px; ">
<strong>{{ "Student" | get_lang }}:</strong>
</td>
<td>
{{ pdf_student_info.complete_name }}
</td>
</tr>
{% endif %} {% endif %}
{% if pdf_teachers %}
<tr> {% if pdf_description is defined %}
<td style="background-color: #E5E5E5; text-align: left; width:130px;"> {{ pdf_description }}
<strong>{{ "Teacher" | get_lang }}:</strong> <br /><br />
</td>
<td>
{{ pdf_teachers }}
</td>
</tr>
{% endif %} {% endif %}
{% if pdf_session_info %} <table align="center" width="100%" class="table table-bordered data_table">
<tr> {% if pdf_student_info %}
<td style="background-color: #E5E5E5; text-align: left; width:130px;"> <tr>
<strong>{{ "Session" | get_lang }}:</strong> {{ pdf_session_info.name }} <td style="background-color: #E5E5E5; text-align: left; width:130px; ">
</td> <strong>{{ "Student" | get_lang }}:</strong>
</td>
<td>
{{ pdf_student_info.complete_name }}
</td>
</tr>
{% endif %}
{% if pdf_teachers %}
<tr>
<td style="background-color: #E5E5E5; text-align: left; width:130px;">
<strong>{{ "Teacher" | get_lang }}:</strong>
</td>
<td>
{{ pdf_teachers }}
</td>
</tr>
{% endif %}
{% if pdf_session_info %}
<tr>
<td style="background-color: #E5E5E5; text-align: left; width:130px;">
<strong>{{ "Session" | get_lang }}:</strong> {{ pdf_session_info.name }}
</td>
{% if pdf_session_info.description %}
<td>
<strong>{{ "Description" | get_lang }}:</strong> {{ pdf_session_info.description }}
</td>
{% endif %}
</tr>
{% if pdf_session_info.description %} {% if pdf_session_info.access_start_date != '' and pdf_session_info.access_end_date is not empty and pdf_session_info.access_end_date != '0000-00-00' %}
<td> <tr>
<strong>{{ "Description" | get_lang }}:</strong> {{ pdf_session_info.description }} <td style="background-color: #E5E5E5; text-align: left; width:130px;">
</td> <strong>{{ "PeriodToDisplay" | get_lang }}:</strong>
</td>
<td>
{{ "FromDateXToDateY"| get_lang | format(pdf_session_info.access_start_date, pdf_session_info.access_end_date ) }}
</td>
</tr>
{% endif %} {% endif %}
</tr> {% endif %}
{% if pdf_session_info.access_start_date != '' and pdf_session_info.access_end_date is not empty and pdf_session_info.access_end_date != '0000-00-00' %} {% if pdf_course_info %}
<tr> <tr>
<td style="background-color: #E5E5E5; text-align: left; width:130px;"> <td style="background-color: #E5E5E5; text-align: left; width:130px;">
<strong>{{ "PeriodToDisplay" | get_lang }}:</strong> <strong>{{ "Course" | get_lang }}:</strong>
</td> </td>
<td> <td>
{{ "FromDateXToDateY"| get_lang | format(pdf_session_info.access_start_date, pdf_session_info.access_end_date ) }} {{ pdf_course_info.title }} ({{ pdf_course_info.code }})
</td> </td>
</tr> </tr>
{% if pdf_course_category is defined %}
<tr>
<td> <strong>{{ "Category" | get_lang }}:</strong></td>
<td> {{ pdf_course_category }} </td>
</tr>
{% endif %}
{% endif %} {% endif %}
{% endif %}
{% if pdf_course_info %} {% if pdf_date %}
<tr>
<td style="background-color: #E5E5E5; text-align: left; width:130px;">
<strong>{{ "Course" | get_lang }}:</strong>
</td>
<td>
{{ pdf_course_info.title }} ({{ pdf_course_info.code }})
</td>
</tr>
{% if pdf_course_category %}
<tr> <tr>
<td> <strong>{{ "Category" | get_lang }}:</strong></td> <td style="background-color: #E5E5E5; text-align: left; width:130px;">
<td> {{ pdf_course_category }} </td> <strong>{{ "Date" | get_lang }}:</strong>
</td>
<td>
{{ pdf_date }}
</td>
</tr> </tr>
{% endif %} {% endif %}
{% endif %} </table>
<br />
{% if pdf_date %} {% if show_grade_generated_date == true %}
<tr> <h5 align="right">
<td style="background-color: #E5E5E5; text-align: left; width:130px;"> {{ 'GradeGeneratedOnX' | get_lang | format("now"| date("d/m/Y")) }}
<strong>{{ "Date" | get_lang }}:</strong> </h5>
</td>
<td>
{{ pdf_date }}
</td>
</tr>
{% endif %} {% endif %}
</table>
<br />
{% if show_grade_generated_date == true %} {{ pdf_content }}
<h5 align="right">
{{ 'GradeGeneratedOnX' | get_lang | format("now"| date("d/m/Y")) }}
</h5>
{% endif %}
{{ pdf_content }} {% if not add_signatures is empty %}
<br />
{% if not add_signatures is empty %} <br />
<br /> <table class="table">
<br /> <tr>
{% for signature in add_signatures %}
<table class="full-width"> <td class="text-center">
<tr> _____________________________
{% for signature in add_signatures %} <br />
<td class="text-center"> {{ signature|get_lang }}
_____________________________ </td>
<br /> {% endfor %}
{{ signature|get_lang }} </tr>
</td> </table>
{% endfor %} {% endif %}
</tr>
</table>
{% endif %}
{% endautoescape %} {% endautoescape %}

@ -50,6 +50,11 @@ class CAttendanceCalendar
*/ */
protected $doneAttendance; protected $doneAttendance;
public function getIid(): int
{
return $this->iid;
}
/** /**
* Set attendanceId. * Set attendanceId.
* *

Loading…
Cancel
Save