attendance_controller.php 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531
  1. <?php
  2. /* For licensing terms, see /license.txt */
  3. /**
  4. * This file contains class used like controller, it should be included inside a dispatcher file (e.g: index.php)
  5. *
  6. * !!! WARNING !!! : ALL DATES IN THIS MODULE ARE STORED IN UTC ! DO NOT CONVERT DURING THE TRANSITION FROM CHAMILO 1.8.x TO 2.0
  7. *
  8. * @author Christian Fasanando <christian1827@gmail.com>
  9. * @author Julio Montoya <gugli100@gmail.com> lot of bugfixes + improvements
  10. * @package chamilo.attendance
  11. */
  12. /**
  13. * Controller script. Prepares the common background variables to give to the scripts corresponding to
  14. * the requested action
  15. * @package chamilo.attendance
  16. */
  17. class AttendanceController
  18. {
  19. /**
  20. * Constructor
  21. */
  22. public function __construct() {
  23. $this->toolname = 'attendance';
  24. $this->view = new View($this->toolname);
  25. }
  26. /**
  27. * It's used for listing attendace,
  28. * render to attendance_list view
  29. * @param boolean true for listing history (optional)
  30. * @param array message for showing by action['edit','add','delete'] (optional)
  31. */
  32. public function attendance_list($history=false,$messages=array()) {
  33. $attendance = new Attendance();
  34. $data = array();
  35. // render to the view
  36. $this->view->set_data($data);
  37. $this->view->set_layout('layout');
  38. $this->view->set_template('attendance_list');
  39. $this->view->render();
  40. }
  41. /**
  42. * It's used for adding attendace,
  43. * render to attendance_add or attendance_list view
  44. */
  45. public function attendance_add() {
  46. $attendance = new Attendance();
  47. $data = array();
  48. if (strtoupper($_SERVER['REQUEST_METHOD']) == "POST") {
  49. if (!empty($_POST['title'])) {
  50. $check = Security::check_token();
  51. if ($check) {
  52. $attendance->set_name($_POST['title']);
  53. $attendance->set_description($_POST['description']);
  54. $attendance->set_attendance_qualify_title($_POST['attendance_qualify_title']);
  55. $attendance->set_attendance_weight($_POST['attendance_weight']);
  56. $link_to_gradebook = false;
  57. if ( isset($_POST['attendance_qualify_gradebook']) && $_POST['attendance_qualify_gradebook'] == 1 ) {
  58. $link_to_gradebook = true;
  59. }
  60. $last_id = $attendance->attendance_add($link_to_gradebook);
  61. Security::clear_token();
  62. }
  63. $param_gradebook = '';
  64. if (isset($_SESSION['gradebook'])) {
  65. $param_gradebook = '&gradebook='.Security::remove_XSS($_SESSION['gradebook']);
  66. }
  67. header('location:index.php?action=attendance_sheet_list&attendance_id='.$last_id.'&'.api_get_cidreq().$param_gradebook);
  68. exit;
  69. } else {
  70. $data['error'] = true;
  71. $this->view->set_data($data);
  72. $this->view->set_layout('layout');
  73. $this->view->set_template('attendance_add');
  74. $this->view->render();
  75. }
  76. } else {
  77. $this->view->set_data($data);
  78. $this->view->set_layout('layout');
  79. $this->view->set_template('attendance_add');
  80. $this->view->render();
  81. }
  82. }
  83. /**
  84. * It's used for editing attendace,
  85. * render to attendance_edit or attendance_list view
  86. * @param int attendance id
  87. */
  88. public function attendance_edit($attendance_id) {
  89. $attendance = new Attendance();
  90. $data = array();
  91. $attendance_id = intval($attendance_id);
  92. if (strtoupper($_SERVER['REQUEST_METHOD']) == "POST") {
  93. if (!empty($_POST['title'])) {
  94. $check = Security::check_token();
  95. if ($check) {
  96. $attendance->set_name($_POST['title']);
  97. $attendance->set_description($_POST['description']);
  98. $attendance->set_attendance_qualify_title($_POST['attendance_qualify_title']);
  99. $attendance->set_attendance_weight($_POST['attendance_weight']);
  100. $link_to_gradebook = false;
  101. if ( isset($_POST['attendance_qualify_gradebook']) && $_POST['attendance_qualify_gradebook'] == 1 ) {
  102. $link_to_gradebook = true;
  103. }
  104. $last_id = $attendance->attendance_edit($attendance_id,$link_to_gradebook);
  105. Security::clear_token();
  106. $param_gradebook = '';
  107. if (isset($_SESSION['gradebook'])) {
  108. $param_gradebook = '&gradebook='.Security::remove_XSS($_SESSION['gradebook']);
  109. }
  110. header('location:index.php?action=attendance_list&'.api_get_cidreq().$param_gradebook);
  111. exit;
  112. }
  113. } else {
  114. $data['attendance_id'] = $_POST['attendance_id'];
  115. $data['error'] = true;
  116. $this->view->set_data($data);
  117. $this->view->set_layout('layout');
  118. $this->view->set_template('attendance_edit');
  119. $this->view->render();
  120. }
  121. } else {
  122. // default values
  123. $attendance_data = $attendance->get_attendance_by_id($attendance_id);
  124. $data['attendance_id'] = $attendance_data['id'];
  125. $data['title'] = $attendance_data['name'];
  126. $data['description'] = $attendance_data['description'];
  127. $data['attendance_qualify_title'] = $attendance_data['attendance_qualify_title'];
  128. $data['attendance_weight'] = $attendance_data['attendance_weight'];
  129. $this->view->set_data($data);
  130. $this->view->set_layout('layout');
  131. $this->view->set_template('attendance_edit');
  132. $this->view->render();
  133. }
  134. }
  135. /**
  136. * It's used for delete attendaces
  137. * render to attendance_list view
  138. * @param int attendance id
  139. */
  140. public function attendance_delete($attendance_id) {
  141. $attendance = new Attendance();
  142. //$attendance_id = intval($attendance_id);
  143. if (!empty($attendance_id)) {
  144. $affected_rows = $attendance->attendance_delete($attendance_id);
  145. }
  146. if ($affected_rows) {
  147. $message['message_attendance_delete'] = true;
  148. }
  149. $this->attendance_list();
  150. }
  151. /**
  152. * Restores an attendance entry and fallback to attendances rendering
  153. * @param int attendance id
  154. */
  155. public function attendance_restore($attendance_id) {
  156. $attendance = new Attendance();
  157. //$attendance_id = intval($attendance_id);
  158. if (!empty($attendance_id)) {
  159. $affected_rows = $attendance->attendance_restore($attendance_id);
  160. }
  161. if ($affected_rows) {
  162. $message['message_attendance_restore'] = true;
  163. }
  164. $this->attendance_list();
  165. }
  166. /**
  167. * Lock or unlock an attendance
  168. * render to attendance_list view
  169. * @param string action (lock_attendance or unlock_attendance)
  170. * @param int attendance id
  171. * render to attendance_list view
  172. */
  173. public function lock_attendance($action, $attendance_id) {
  174. $attendance = new Attendance();
  175. $attendance_id = intval($attendance_id);
  176. if ($action == 'lock_attendance') {
  177. $result = $attendance->lock_attendance($attendance_id);
  178. } else {
  179. $result = $attendance->lock_attendance($attendance_id, false);
  180. }
  181. if ($result) {
  182. $message['message_locked_attendance'] = true;
  183. }
  184. $this->attendance_list();
  185. }
  186. /**
  187. * It's used for controlling attendace sheet (list, add),
  188. * render to attendance_sheet view
  189. * @param string action
  190. * @param int attendance id
  191. */
  192. public function attendance_sheet($action, $attendance_id, $student_id = 0) {
  193. $attendance = new Attendance();
  194. $data = array();
  195. $data['attendance_id'] = $attendance_id;
  196. $data['users_in_course'] = $attendance->get_users_rel_course($attendance_id);
  197. $filter_type = 'all';
  198. if (!empty($_REQUEST['filter'])) {
  199. $filter_type = $_REQUEST['filter'];
  200. }
  201. if (api_is_allowed_to_edit(null, true)) {
  202. $data['users_presence'] = $attendance->get_users_attendance_sheet($attendance_id);
  203. } else {
  204. if (!empty($student_id)) {
  205. $user_id = intval($student_id);
  206. } else {
  207. $user_id = api_get_user_id();
  208. }
  209. $data['users_presence'] = $attendance->get_users_attendance_sheet($attendance_id, $user_id);
  210. $data['faults'] = $attendance->get_faults_of_user($user_id, $attendance_id);
  211. $data['user_id'] = $user_id;
  212. }
  213. $data['next_attendance_calendar_id'] = $attendance->get_next_attendance_calendar_id($attendance_id);
  214. $data['next_attendance_calendar_datetime'] = $attendance->get_next_attendance_calendar_datetime($attendance_id);
  215. if (strtoupper($_SERVER['REQUEST_METHOD']) == "POST") {
  216. if (isset($_POST['hidden_input'])) {
  217. foreach ($_POST['hidden_input'] as $cal_id) {
  218. $users_present = array();
  219. if (isset($_POST['check_presence'][$cal_id])) {
  220. $users_present = $_POST['check_presence'][$cal_id];
  221. }
  222. $affected_rows = $attendance->attendance_sheet_add($cal_id,$users_present,$attendance_id);
  223. }
  224. }
  225. $data['users_in_course'] = $attendance->get_users_rel_course($attendance_id);
  226. $my_calendar_id = null;
  227. if (is_numeric($filter_type)) {
  228. $my_calendar_id = $filter_type;
  229. $filter_type = 'calendar_id';
  230. }
  231. $data['attendant_calendar'] = $attendance->get_attendance_calendar($attendance_id, $filter_type, $my_calendar_id);
  232. $data['attendant_calendar_all'] = $attendance->get_attendance_calendar($attendance_id);
  233. $data['users_presence'] = $attendance->get_users_attendance_sheet($attendance_id);
  234. $data['next_attendance_calendar_id'] = $attendance->get_next_attendance_calendar_id($attendance_id);
  235. $data['next_attendance_calendar_datetime'] = $attendance->get_next_attendance_calendar_datetime($attendance_id);
  236. } else {
  237. $data['attendant_calendar_all'] = $attendance->get_attendance_calendar($attendance_id);
  238. $data['attendant_calendar'] = $attendance->get_attendance_calendar($attendance_id, $filter_type);
  239. }
  240. $data['is_locked_attendance'] = $attendance->is_locked_attendance($attendance_id);
  241. $this->view->set_data($data);
  242. $this->view->set_layout('layout');
  243. $this->view->set_template('attendance_sheet');
  244. $this->view->render();
  245. }
  246. /**
  247. * It's used for controlling attendace calendar (list, add, edit, delete),
  248. * render to attendance_calendar view
  249. * @param string action (optional, by default 'calendar_list')
  250. * @param int attendance id (optional)
  251. * @param int calendar id (optional)
  252. */
  253. public function attendance_calendar($action = 'calendar_list',$attendance_id = 0, $calendar_id = 0) {
  254. $attendance = new Attendance();
  255. $calendar_id = intval($calendar_id);
  256. $data = array();
  257. $data['attendance_id'] = $attendance_id;
  258. $attendance_id = intval($attendance_id);
  259. if ($action == 'calendar_add') {
  260. if (strtoupper($_SERVER['REQUEST_METHOD']) == "POST") {
  261. if (!isset($_POST['cancel'])) {
  262. if (isset($_POST['repeat'])) {
  263. error_log($attendance->build_datetime_from_array($_POST['date_time']));
  264. //$start_datetime = api_strtotime($attendance->build_datetime_from_array($_POST['date_time']));
  265. $start_datetime = api_strtotime(api_get_utc_datetime($attendance->build_datetime_from_array($_POST['date_time'])),'UTC');
  266. error_log('$start_datetime '.$start_datetime);
  267. $_POST['end_date_time']['H'] = $_POST['date_time']['H'];
  268. $_POST['end_date_time']['i'] = $_POST['date_time']['i'];
  269. error_log($attendance->build_datetime_from_array($_POST['end_date_time']));
  270. $end_datetime = api_strtotime(api_get_utc_datetime($attendance->build_datetime_from_array($_POST['end_date_time'])),'UTC');
  271. error_log('$end_datetime '.$end_datetime);
  272. $checkdate = checkdate($_POST['end_date_time']['F'], $_POST['end_date_time']['d'], $_POST['end_date_time']['Y']);
  273. $repeat_type = $_POST['repeat_type'];
  274. if (($end_datetime > $start_datetime) && $checkdate) {
  275. $affected_rows = $attendance->attendance_repeat_calendar_add($attendance_id, $start_datetime, $end_datetime, $repeat_type);
  276. $action = 'calendar_list';
  277. } else {
  278. if (!$checkdate) {
  279. $data['error_checkdate'] = true;
  280. } else {
  281. $data['error_repeat_date'] = true;
  282. }
  283. $data['repeat'] = true;
  284. $action = 'calendar_add';
  285. }
  286. } else {
  287. $datetime = $attendance->build_datetime_from_array($_POST['date_time']);
  288. $datetimezone = api_get_utc_datetime($datetime);
  289. if (!empty($datetime)) {
  290. $attendance->set_date_time($datetimezone);
  291. $affected_rows = $attendance->attendance_calendar_add($attendance_id);
  292. $action = 'calendar_list';
  293. } else {
  294. $data['error_date'] = true;
  295. $action = 'calendar_add';
  296. }
  297. }
  298. } else {
  299. $action = 'calendar_list';
  300. }
  301. }
  302. } else if ($action == 'calendar_edit') {
  303. $data['calendar_id'] = $calendar_id;
  304. if (strtoupper($_SERVER['REQUEST_METHOD']) == "POST") {
  305. if (!isset($_POST['cancel'])) {
  306. $datetime = $attendance->build_datetime_from_array($_POST['date_time']);
  307. $datetimezone = api_get_utc_datetime($datetime);
  308. $attendance->set_date_time($datetimezone);
  309. $affected_rows = $attendance->attendance_calendar_edit($calendar_id, $attendance_id);
  310. $data['calendar_id'] = 0;
  311. $action = 'calendar_list';
  312. } else {
  313. $action = 'calendar_list';
  314. }
  315. }
  316. } else if ($action == 'calendar_delete') {
  317. $affected_rows = $attendance->attendance_calendar_delete($calendar_id, $attendance_id);
  318. $action = 'calendar_list';
  319. } else if ($action == 'calendar_all_delete') {
  320. $affected_rows = $attendance->attendance_calendar_delete(0, $attendance_id, true);
  321. $action = 'calendar_list';
  322. }
  323. $data['action'] = $action;
  324. $data['attendance_calendar'] = $attendance->get_attendance_calendar($attendance_id);
  325. $data['is_locked_attendance'] = $attendance->is_locked_attendance($attendance_id);
  326. // render to the view
  327. $this->view->set_data($data);
  328. $this->view->set_layout('layout');
  329. $this->view->set_template('attendance_calendar');
  330. $this->view->render();
  331. }
  332. /**
  333. * It's used to print attendance sheet
  334. * @param string action
  335. * @param int attendance id
  336. */
  337. public function attendance_sheet_print($action, $attendance_id, $student_id = 0, $course_id = '') {
  338. $attendance = new Attendance();
  339. $courseInfo = CourseManager::get_course_information($course_id);
  340. $attendance->set_course_id($courseInfo['code']);
  341. $data_array = array();
  342. $data_array['attendance_id'] = $attendance_id;
  343. $data_array['users_in_course'] = $attendance->get_users_rel_course($attendance_id);
  344. $data_array['attendant_calendar'] = $attendance->get_attendance_calendar($attendance_id);
  345. if (api_is_allowed_to_edit(null, true) || api_is_drh()) {
  346. $data_array['users_presence'] = $attendance->get_users_attendance_sheet($attendance_id);
  347. } else {
  348. if (!empty($student_id)) {
  349. $user_id = intval($student_id);
  350. } else {
  351. $user_id = api_get_user_id();
  352. }
  353. $data_array['users_presence'] = $attendance->get_users_attendance_sheet($attendance_id, $user_id);
  354. $data_array['faults'] = $attendance->get_faults_of_user($user_id, $attendance_id);
  355. $data_array['user_id'] = $user_id;
  356. }
  357. $data_array['next_attendance_calendar_id'] = $attendance->get_next_attendance_calendar_id($attendance_id);
  358. // set headers pdf
  359. !empty($_user['official_code'])? $officialcode=$_user['official_code'].' - ':'';
  360. $courseCategory = CourseManager::get_course_category($courseInfo['category_code']);
  361. $teacherInfo = CourseManager::get_teacher_list_from_course_code($courseInfo['code']);
  362. $teacherName = null;
  363. foreach($teacherInfo as $dados) {
  364. if($teacherName != null)
  365. $teacherName = $teacherName . " / ";
  366. $teacherName.= $dados['firstname']." ".$dados['lastname'];
  367. }
  368. $h1 = array(get_lang('Category'), $courseCategory['name']);
  369. $h3 = array(get_lang("Title"), $courseInfo['title']);
  370. $h4 = array(get_lang('Teacher'), $teacherName);
  371. $h5 = array("", "");
  372. $date = date('d-m-Y H:i:s', time());
  373. $h6 = array(get_lang('DateTime'),api_convert_and_format_date($date, "%d/%m/%Y %H:%M"));
  374. $header_pdf = array($h4, $h1, $h5, $h5, $h6);
  375. // set footer pdf
  376. $f1 = '<hr />'.get_lang('Responsable');
  377. $f2 = '<hr />'.get_lang('Teacher');
  378. $f3 = '<hr />'.get_lang('Date');
  379. $footer_pdf = array($f1, $f2, $f3);
  380. // set title pdf
  381. $title_pdf = $h3[1];
  382. // set headers data table
  383. $head_ape_name = get_lang('Name');
  384. // get data table
  385. // Marco - ordenacao fixa - just fullname
  386. $data_table = array();
  387. $dataClass = array();
  388. $data_attendant_calendar = array();
  389. $data_users_presence = array();
  390. $data_attendant_calendar = $data_array['attendant_calendar'];
  391. $data_users_presence = $data_array['users_presence'];
  392. foreach ($data_array['users_in_course'] as $user) {
  393. $result = array();
  394. $user_info = api_get_user_info($user['id']);
  395. // $result['official_code'] = $user['official_code'];
  396. $result['fullname'] = $user['firstname']." ".$user['lastname'];
  397. foreach ($data_array['attendant_calendar'] as $class_day) {
  398. if($class_day['done_attendance'] == 1) {
  399. if($data_users_presence[$user['user_id']][$class_day['id']]['presence'] == 1)
  400. $result[$class_day['id']] = " . ";
  401. else
  402. $result[$class_day['id']] = " F ";
  403. } else {
  404. $result[$class_day['id']] = " \ ";
  405. }
  406. }
  407. $data_table[] = $result;
  408. }
  409. $head_table = array(
  410. array(get_lang('#'),5),
  411. // array(get_lang('langOfficialCode'),15),
  412. array(get_lang('Name'), 40),
  413. );
  414. foreach ($data_array['attendant_calendar'] as $class_day) {
  415. $dataClass[] = array($class_day['date'], 2);
  416. }
  417. $head_table = array_merge($head_table, $dataClass);
  418. // split page
  419. /*
  420. $array_nome = array();
  421. $array_p1 = array(); // page 1
  422. $array_p2 = array(); // page 2
  423. foreach ($data_table as $frequencia)
  424. {
  425. $array_nome[] = array_slice($frequencia, 0, 2, true);
  426. $array_p1[] = array_slice($frequencia, 2, 36, true);
  427. $array_p2[] = array_slice($frequencia, 38, count($frequencia), true);
  428. }
  429. $narray1 = array();
  430. $narray2 = array();
  431. for($i = 0; $i < count($array_nome); $i++)
  432. {
  433. $narray1[] = $array_nome[$i]+$array_p1[$i];
  434. $narray2[] = $array_nome[$i]+$array_p2[$i];
  435. }
  436. $data_table = array_merge($narray1, $narray2);
  437. unset($narray1); unset($narray2); unset($array_p1); unset($array_p2); unset($array_nome);
  438. $array_nome = array();
  439. $array_p1 = array();
  440. $array_p2 = array();
  441. foreach($head_table as $head)
  442. {
  443. $array_nome = array_slice($head_table, 0, 3, true);
  444. $array_p1 = array_slice($head_table, 3, 36, true);
  445. $array_p2 = array_slice($head_table, 39, count($head_table), true);
  446. }
  447. $array_p1 = array_merge($array_nome, $array_p1);
  448. $array_p2 = array_merge($array_nome, $array_p2);
  449. unset($head_table); $head_table = array();
  450. $head_table[] = $array_p1;
  451. $head_table[] = $array_p2;
  452. */
  453. //echo "<pre>"; print_r($head_table); echo "</pre>"; exit();
  454. export_pdf_attendance(&$head_table, &$data_table, &$header_pdf, $footer_pdf, $title_pdf);
  455. }
  456. }