sessionmanager.lib.php 98 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396
  1. <?php
  2. /* For licensing terms, see /license.txt */
  3. /**
  4. * This is the session library for Chamilo.
  5. * All main sessions functions should be placed here.
  6. * This class provides methods for sessions management.
  7. * Include/require it in your code to use its features.
  8. * @package chamilo.library
  9. */
  10. /**
  11. * Code
  12. */
  13. /**
  14. * Class SessionManager
  15. */
  16. class SessionManager
  17. {
  18. private function __construct()
  19. {
  20. }
  21. /**
  22. * Fetches a session from the database
  23. * @param int Session ID
  24. * @return array Session details (id, id_coach, name, nbr_courses, nbr_users, nbr_classes, date_start, date_end, nb_days_access_before_beginning,nb_days_access_after_end, session_admin_id)
  25. */
  26. public static function fetch($id)
  27. {
  28. $t = Database::get_main_table(TABLE_MAIN_SESSION);
  29. if ($id != strval(intval($id))) { return array(); }
  30. $s = "SELECT * FROM $t WHERE id = $id";
  31. $r = Database::query($s);
  32. if (Database::num_rows($r) != 1) { return array(); }
  33. return Database::fetch_array($r,'ASSOC');
  34. }
  35. /**
  36. * Create a session
  37. * @author Carlos Vargas from existing code
  38. * @param string name
  39. * @param integer Start year (yyyy)
  40. * @param integer Start month (mm)
  41. * @param integer Start day (dd)
  42. * @param integer End year (yyyy)
  43. * @param integer End month (mm)
  44. * @param integer End day (dd)
  45. * @param integer Number of days that the coach can access the session before the start date
  46. * @param integer Number of days that the coach can access the session after the end date
  47. * @param integer If 1, means there are no date limits
  48. * @param mixed If integer, this is the session coach id, if string, the coach ID will be looked for from the user table
  49. * @param integer ID of the session category in which this session is registered
  50. * @param integer Visibility after end date (0 = read-only, 1 = invisible, 2 = accessible)
  51. * @param string Start limit = true if the start date has to be considered
  52. * @param string End limit = true if the end date has to be considered
  53. * @todo use an array to replace all this parameters or use the model.lib.php ...
  54. * @return mixed Session ID on success, error message otherwise
  55. **/
  56. public static function create_session($sname,$syear_start,$smonth_start,$sday_start,$syear_end,$smonth_end,$sday_end,$snb_days_acess_before,$snb_days_acess_after, $nolimit,$coach_username, $id_session_category,$id_visibility, $start_limit = true, $end_limit = true, $fix_name = false) {
  57. global $_configuration;
  58. //Check portal limits
  59. $access_url_id = 1;
  60. if (api_get_multiple_access_url()) {
  61. $access_url_id = api_get_current_access_url_id();
  62. }
  63. if (is_array($_configuration[$access_url_id]) && isset($_configuration[$access_url_id]['hosting_limit_sessions']) && $_configuration[$access_url_id]['hosting_limit_sessions'] > 0) {
  64. $num = self::count_sessions();
  65. if ($num >= $_configuration[$access_url_id]['hosting_limit_sessions']) {
  66. return get_lang('PortalSessionsLimitReached');
  67. }
  68. }
  69. $name = Database::escape_string(trim($sname));
  70. $year_start = intval($syear_start);
  71. $month_start = intval($smonth_start);
  72. $day_start = intval($sday_start);
  73. $year_end = intval($syear_end);
  74. $month_end = intval($smonth_end);
  75. $day_end = intval($sday_end);
  76. $nb_days_acess_before = intval($snb_days_acess_before);
  77. $nb_days_acess_after = intval($snb_days_acess_after);
  78. $id_session_category = intval($id_session_category);
  79. $id_visibility = intval($id_visibility);
  80. $tbl_user = Database::get_main_table(TABLE_MAIN_USER);
  81. $tbl_session = Database::get_main_table(TABLE_MAIN_SESSION);
  82. if (is_int($coach_username)) {
  83. $id_coach = $coach_username;
  84. } else {
  85. $sql = 'SELECT user_id FROM '.$tbl_user.' WHERE username="'.Database::escape_string($coach_username).'"';
  86. $rs = Database::query($sql);
  87. $id_coach = Database::result($rs,0,'user_id');
  88. }
  89. if (empty($nolimit)) {
  90. $date_start ="$year_start-".(($month_start < 10)?"0$month_start":$month_start)."-".(($day_start < 10)?"0$day_start":$day_start);
  91. $date_end ="$year_end-".(($month_end < 10)?"0$month_end":$month_end)."-".(($day_end < 10)?"0$day_end":$day_end);
  92. } else {
  93. $id_visibility = 1; // by default session visibility is read only
  94. $date_start ="0000-00-00";
  95. $date_end ="0000-00-00";
  96. }
  97. if (empty($end_limit)) {
  98. $date_end ="0000-00-00";
  99. $id_visibility = 1; // by default session visibility is read only
  100. }
  101. if (empty($start_limit)) {
  102. $date_start ="0000-00-00";
  103. }
  104. if (empty($name)) {
  105. $msg=get_lang('SessionNameIsRequired');
  106. return $msg;
  107. } elseif (empty($coach_username)) {
  108. $msg=get_lang('CoachIsRequired');
  109. return $msg;
  110. } elseif (!empty($start_limit) && empty($nolimit) && (!$month_start || !$day_start || !$year_start || !checkdate($month_start,$day_start,$year_start))) {
  111. $msg=get_lang('InvalidStartDate');
  112. return $msg;
  113. } elseif (!empty($end_limit) && empty($nolimit) && (!$month_end || !$day_end || !$year_end || !checkdate($month_end,$day_end,$year_end))) {
  114. $msg=get_lang('InvalidEndDate');
  115. return $msg;
  116. } elseif(!empty($start_limit) && !empty($end_limit) && empty($nolimit) && $date_start >= $date_end) {
  117. $msg=get_lang('StartDateShouldBeBeforeEndDate');
  118. return $msg;
  119. } else {
  120. $ready_to_create = false;
  121. if ($fix_name) {
  122. $name = self::generate_nice_next_session_name($name);
  123. if ($name) {
  124. $ready_to_create = true;
  125. } else {
  126. $msg=get_lang('SessionNameAlreadyExists');
  127. return $msg;
  128. }
  129. } else {
  130. $rs = Database::query("SELECT 1 FROM $tbl_session WHERE name='".$name."'");
  131. if (Database::num_rows($rs)) {
  132. $msg=get_lang('SessionNameAlreadyExists');
  133. return $msg;
  134. }
  135. $ready_to_create = true;
  136. }
  137. if ($ready_to_create) {
  138. $sql_insert = "INSERT INTO $tbl_session(name,date_start,date_end,id_coach,session_admin_id, nb_days_access_before_beginning, nb_days_access_after_end, session_category_id,visibility)
  139. VALUES('".$name."','$date_start','$date_end','$id_coach',".api_get_user_id().",".$nb_days_acess_before.", ".$nb_days_acess_after.", ".$id_session_category.", ".$id_visibility.")";
  140. Database::query($sql_insert);
  141. $session_id = Database::insert_id();
  142. if (!empty($session_id)) {
  143. /*
  144. Sends a message to the user_id = 1
  145. $user_info = api_get_user_info(1);
  146. $complete_name = $user_info['firstname'].' '.$user_info['lastname'];
  147. $subject = api_get_setting('siteName').' - '.get_lang('ANewSessionWasCreated');
  148. $message = get_lang('ANewSessionWasCreated')." <br /> ".get_lang('NameOfTheSession').' : '.$name;
  149. api_mail_html($complete_name, $user_info['email'], $subject, $message);
  150. *
  151. */
  152. //Adding to the correct URL
  153. $access_url_id = api_get_current_access_url_id();
  154. UrlManager::add_session_to_url($session_id,$access_url_id);
  155. // add event to system log
  156. $user_id = api_get_user_id();
  157. event_system(LOG_SESSION_CREATE, LOG_SESSION_ID, $session_id, api_get_utc_datetime(), $user_id);
  158. }
  159. return $session_id;
  160. }
  161. }
  162. }
  163. function session_name_exists($session_name) {
  164. $session_name = Database::escape_string($session_name);
  165. $result = Database::fetch_array(Database::query("SELECT COUNT(*) as count FROM ".Database::get_main_table(TABLE_MAIN_SESSION)." WHERE name = '$session_name' "));
  166. return $result['count'] > 0;
  167. }
  168. /**
  169. * @param string $where_condition
  170. * @return mixed
  171. */
  172. static function get_count_admin($where_condition = null)
  173. {
  174. $tbl_session = Database::get_main_table(TABLE_MAIN_SESSION);
  175. $tbl_session_category = Database::get_main_table(TABLE_MAIN_SESSION_CATEGORY);
  176. $tbl_user = Database::get_main_table(TABLE_MAIN_USER);
  177. $table_access_url_rel_session= Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_SESSION);
  178. $tbl_session_rel_user = Database::get_main_table(TABLE_MAIN_SESSION_USER);
  179. $where = 'WHERE 1=1 ';
  180. $user_id = api_get_user_id();
  181. $extraJoin = null;
  182. if (api_is_session_admin() && api_get_setting('allow_session_admins_to_manage_all_sessions') == 'false') {
  183. $where .= " AND (
  184. s.session_admin_id = $user_id OR
  185. sru.id_user = '$user_id' AND
  186. sru.relation_type = '".SESSION_RELATION_TYPE_RRHH."'
  187. )
  188. ";
  189. $extraJoin = " INNER JOIN $tbl_session_rel_user sru
  190. ON sru.id_session = s.id ";
  191. }
  192. $today = api_get_utc_datetime();
  193. $today = api_strtotime($today, 'UTC');
  194. $today = date('Y-m-d', $today);
  195. if (!empty($where_condition)) {
  196. $where_condition = str_replace('category_name', 'sc.name', $where_condition);
  197. $where_condition = str_replace(
  198. array("AND session_active = '1' )", " AND ( session_active = '1' )"),
  199. array(') GROUP BY s.name HAVING session_active = 1 ', " GROUP BY s.name HAVING session_active = 1 " )
  200. , $where_condition
  201. );
  202. $where_condition = str_replace(
  203. array("AND session_active = '0' )", " AND ( session_active = '0' )"),
  204. array(') GROUP BY s.name HAVING session_active = 0 ', " GROUP BY s.name HAVING session_active = '0' "),
  205. $where_condition
  206. );
  207. } else {
  208. $where_condition = "1 = 1";
  209. }
  210. $sql = "SELECT count(id) as total_rows FROM (
  211. SELECT
  212. IF (
  213. (s.date_start <= '$today' AND '$today' < s.date_end) OR
  214. (s.nb_days_access_before_beginning > 0 AND DATEDIFF(s.date_start,'".$today."' ".") <= s.nb_days_access_before_beginning) OR
  215. (s.nb_days_access_after_end > 0 AND DATEDIFF('".$today."',s.date_end) <= s.nb_days_access_after_end) OR
  216. (s.date_start = '0000-00-00' AND s.date_end = '0000-00-00' ) OR
  217. (s.date_start <= '$today' AND '0000-00-00' = s.date_end) OR
  218. ('$today' < s.date_end AND '0000-00-00' = s.date_start)
  219. , 1, 0)
  220. as session_active,
  221. s.id,
  222. count(*) as total_rows
  223. FROM $tbl_session s
  224. LEFT JOIN $tbl_session_category sc ON s.session_category_id = sc.id
  225. INNER JOIN $tbl_user u ON s.id_coach = u.user_id
  226. $extraJoin
  227. $where AND $where_condition ) as session_table";
  228. if (api_is_multiple_url_enabled()) {
  229. $access_url_id = api_get_current_access_url_id();
  230. if ($access_url_id != -1) {
  231. $where.= " AND ar.access_url_id = $access_url_id ";
  232. $sql = "SELECT count(id) as total_rows FROM (
  233. SELECT
  234. IF (
  235. (s.date_start <= '$today' AND '$today' < s.date_end) OR
  236. (s.nb_days_access_before_beginning > 0 AND DATEDIFF(s.date_start,'".$today."' ".") <= s.nb_days_access_before_beginning) OR
  237. (s.nb_days_access_after_end > 0 AND DATEDIFF('".$today."',s.date_end) <= s.nb_days_access_after_end) OR
  238. (s.date_start = '0000-00-00' AND s.date_end = '0000-00-00' ) OR
  239. (s.date_start <= '$today' AND '0000-00-00' = s.date_end) OR
  240. ('$today' < s.date_end AND '0000-00-00' = s.date_start)
  241. , 1, 0)
  242. as session_active,
  243. s.id
  244. FROM $tbl_session s
  245. LEFT JOIN $tbl_session_category sc ON s.session_category_id = sc.id
  246. INNER JOIN $tbl_user u ON s.id_coach = u.user_id
  247. INNER JOIN $table_access_url_rel_session ar ON ar.session_id = s.id
  248. $extraJoin
  249. $where AND $where_condition) as session_table";
  250. }
  251. }
  252. $result_rows = Database::query($sql);
  253. $row = Database::fetch_array($result_rows);
  254. $num = $row['total_rows'];
  255. return $num;
  256. }
  257. /**
  258. * Gets the admin session list callback of the admin/session_list.php page
  259. * @param array $options order and limit keys
  260. * @return array
  261. */
  262. public static function get_sessions_admin($options)
  263. {
  264. $tbl_session = Database::get_main_table(TABLE_MAIN_SESSION);
  265. $tbl_session_category = Database::get_main_table(TABLE_MAIN_SESSION_CATEGORY);
  266. $tbl_user = Database::get_main_table(TABLE_MAIN_USER);
  267. $tbl_session_rel_user = Database::get_main_table(TABLE_MAIN_SESSION_USER);
  268. $table_access_url_rel_session = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_SESSION);
  269. $where = ' WHERE 1=1 ';
  270. $user_id = api_get_user_id();
  271. $extraJoin = null;
  272. if (api_is_session_admin() && api_get_setting('allow_session_admins_to_manage_all_sessions') == 'false') {
  273. $where .= " AND (
  274. s.session_admin_id = $user_id OR
  275. sru.id_user = '$user_id' AND
  276. sru.relation_type = '".SESSION_RELATION_TYPE_RRHH."'
  277. )
  278. ";
  279. $extraJoin = " INNER JOIN $tbl_session_rel_user sru
  280. ON sru.id_session = s.id ";
  281. }
  282. $coach_name = " CONCAT(u.lastname , ' ', u.firstname) as coach_name ";
  283. if (api_is_western_name_order()) {
  284. $coach_name = " CONCAT(u.firstname, ' ', u.lastname) as coach_name ";
  285. }
  286. $options['where'] = str_replace(
  287. array("AND session_active = '1' )", " AND ( session_active = '1' )"),
  288. array(') GROUP BY s.name HAVING session_active = 1 ', " GROUP BY s.name HAVING session_active = 1 " )
  289. , $options['where']
  290. );
  291. $options['where'] = str_replace(
  292. array("AND session_active = '0' )", " AND ( session_active = '0' )"),
  293. array(') GROUP BY s.name HAVING session_active = 0 ', " GROUP BY s.name HAVING session_active = '0' "),
  294. $options['where']
  295. );
  296. $today = api_get_utc_datetime();
  297. $today = api_strtotime($today, 'UTC');
  298. $today = date('Y-m-d', $today);
  299. $select = "SELECT * FROM (SELECT
  300. IF (
  301. (s.date_start <= '$today' AND '$today' < s.date_end) OR
  302. (s.nb_days_access_before_beginning > 0 AND DATEDIFF(s.date_start,'".$today."' ".") <= s.nb_days_access_before_beginning) OR
  303. (s.nb_days_access_after_end > 0 AND DATEDIFF('".$today."',s.date_end) <= s.nb_days_access_after_end) OR
  304. (s.date_start = '0000-00-00' AND s.date_end = '0000-00-00' ) OR
  305. (s.date_start <= '$today' AND '0000-00-00' = s.date_end) OR
  306. ('$today' < s.date_end AND '0000-00-00' = s.date_start)
  307. , 1, 0)
  308. as session_active,
  309. s.name,
  310. nbr_courses,
  311. nbr_users,
  312. s.date_start,
  313. s.date_end,
  314. $coach_name,
  315. sc.name as category_name,
  316. s.visibility,
  317. u.user_id,
  318. s.id";
  319. $limit = null;
  320. if (!empty($options['limit'])) {
  321. $limit = " LIMIT ".$options['limit'];
  322. }
  323. if (!empty($options['where'])) {
  324. $where .= ' AND '.$options['where'];
  325. }
  326. $order = null;
  327. if (!empty($options['order'])) {
  328. $order = " ORDER BY ".$options['order'];
  329. }
  330. $query = "$select FROM $tbl_session s
  331. LEFT JOIN $tbl_session_category sc ON s.session_category_id = sc.id
  332. LEFT JOIN $tbl_user u ON s.id_coach = u.user_id
  333. $extraJoin
  334. $where $order $limit";
  335. if (api_is_multiple_url_enabled()) {
  336. $access_url_id = api_get_current_access_url_id();
  337. if ($access_url_id != -1) {
  338. $query = " $select
  339. FROM $tbl_session s
  340. LEFT JOIN $tbl_session_category sc ON s.session_category_id = sc.id
  341. INNER JOIN $tbl_user u ON s.id_coach = u.user_id
  342. INNER JOIN $table_access_url_rel_session ar ON ar.session_id = s.id AND ar.access_url_id = $access_url_id
  343. $extraJoin
  344. $where $order $limit";
  345. }
  346. }
  347. $query .= ") AS session_table";
  348. $result = Database::query($query);
  349. $formatted_sessions = array();
  350. if (Database::num_rows($result)) {
  351. $sessions = Database::store_result($result);
  352. foreach ($sessions as $session) {
  353. $session['name'] = Display::url($session['name'], "resume_session.php?id_session=".$session['id']);
  354. $session['coach_name'] = Display::url($session['coach_name'], "user_information.php?user_id=".$session['user_id']);
  355. if ($session['date_start'] == '0000-00-00' && $session['date_end'] == '0000-00-00') {
  356. // $session['session_active'] = 1;
  357. }
  358. if ($session['session_active'] == 1) {
  359. $session['session_active'] = Display::return_icon('accept.png', get_lang('Active'), array(), ICON_SIZE_SMALL);
  360. } else {
  361. $session['session_active'] = Display::return_icon('error.png', get_lang('Inactive'), array(), ICON_SIZE_SMALL);
  362. }
  363. if ($session['date_start'] == '0000-00-00') {
  364. $session['date_start'] = '';
  365. }
  366. if ($session['date_end'] == '0000-00-00') {
  367. $session['date_end'] = '';
  368. }
  369. switch ($session['visibility']) {
  370. case SESSION_VISIBLE_READ_ONLY: //1
  371. $session['visibility'] = get_lang('ReadOnly');
  372. break;
  373. case SESSION_VISIBLE: //2
  374. $session['visibility'] = get_lang('Visible');
  375. break;
  376. case SESSION_INVISIBLE: //3
  377. $session['visibility'] = api_ucfirst(get_lang('Invisible'));
  378. break;
  379. }
  380. $formatted_sessions[] = $session;
  381. }
  382. }
  383. return $formatted_sessions;
  384. }
  385. /**
  386. * Creates a new course code based in given code
  387. *
  388. * @param string wanted code
  389. * <code>
  390. * $wanted_code = 'curse' if there are in the DB codes like curse1 curse2 the function will return: course3
  391. * if the course code doest not exist in the DB the same course code will be returned
  392. * </code>
  393. * @return string wanted unused code
  394. */
  395. function generate_nice_next_session_name($session_name) {
  396. $session_name_ok = !self::session_name_exists($session_name);
  397. if (!$session_name_ok) {
  398. $table = Database::get_main_table(TABLE_MAIN_SESSION);
  399. $session_name = Database::escape_string($session_name);
  400. $sql = "SELECT count(*) as count FROM $table WHERE name LIKE '$session_name%'";
  401. $result = Database::query($sql);
  402. if (Database::num_rows($result) > 0 ) {
  403. $row = Database::fetch_array($result);
  404. $count = $row['count'] + 1;
  405. $session_name = $session_name.'_'.$count;
  406. $result = self::session_name_exists($session_name);
  407. if (!$result) {
  408. return $session_name;
  409. }
  410. }
  411. return false;
  412. }
  413. return $session_name;
  414. }
  415. /**
  416. * Edit a session
  417. * @author Carlos Vargas from existing code
  418. * @param integer id
  419. * @param string name
  420. * @param integer year_start
  421. * @param integer month_start
  422. * @param integer day_start
  423. * @param integer year_end
  424. * @param integer month_end
  425. * @param integer day_end
  426. * @param integer nb_days_acess_before
  427. * @param integer nb_days_acess_after
  428. * @param integer nolimit
  429. * @param integer id_coach
  430. * @param integer id_session_category
  431. * @return $id;
  432. * The parameter id is a primary key
  433. **/
  434. public static function edit_session (
  435. $id,
  436. $name,
  437. $year_start,
  438. $month_start,
  439. $day_start,
  440. $year_end,
  441. $month_end,
  442. $day_end,
  443. $nb_days_acess_before,
  444. $nb_days_acess_after,
  445. $nolimit,
  446. $id_coach,
  447. $id_session_category,
  448. $id_visibility,
  449. $start_limit = true,
  450. $end_limit = true,
  451. $description = null,
  452. $showDescription = null
  453. )
  454. {
  455. $name = trim(stripslashes($name));
  456. $year_start=intval($year_start);
  457. $month_start=intval($month_start);
  458. $day_start=intval($day_start);
  459. $year_end=intval($year_end);
  460. $month_end=intval($month_end);
  461. $day_end=intval($day_end);
  462. $id_coach= intval($id_coach);
  463. $nb_days_acess_before= intval($nb_days_acess_before);
  464. $nb_days_acess_after = intval($nb_days_acess_after);
  465. $id_session_category = intval($id_session_category);
  466. $id_visibility = intval($id_visibility);
  467. $tbl_session = Database::get_main_table(TABLE_MAIN_SESSION);
  468. if (empty($nolimit)) {
  469. $date_start = "$year_start-".(($month_start < 10)?"0$month_start":$month_start)."-".(($day_start < 10)?"0$day_start":$day_start);
  470. $date_end = "$year_end-".(($month_end < 10)?"0$month_end":$month_end)."-".(($day_end < 10)?"0$day_end":$day_end);
  471. } else {
  472. $date_start = "0000-00-00";
  473. $date_end = "0000-00-00";
  474. $id_visibility = 1;//force read only
  475. }
  476. if (!empty($no_end_limit)) {
  477. $date_end = "0000-00-00";
  478. }
  479. if (empty($end_limit)) {
  480. $date_end ="0000-00-00";
  481. $id_visibility = 1;//force read only
  482. }
  483. if (empty($start_limit)) {
  484. $date_start ="0000-00-00";
  485. }
  486. if (empty($name)) {
  487. $msg=get_lang('SessionNameIsRequired');
  488. return $msg;
  489. } elseif (empty($id_coach)) {
  490. $msg=get_lang('CoachIsRequired');
  491. return $msg;
  492. } elseif (!empty($start_limit) && empty($nolimit) && (!$month_start || !$day_start || !$year_start || !checkdate($month_start,$day_start,$year_start))) {
  493. $msg=get_lang('InvalidStartDate');
  494. return $msg;
  495. } elseif (!empty($end_limit) && empty($nolimit) && (!$month_end || !$day_end || !$year_end || !checkdate($month_end,$day_end,$year_end))) {
  496. $msg=get_lang('InvalidEndDate');
  497. return $msg;
  498. } elseif (!empty($start_limit) && !empty($end_limit) && empty($nolimit) && $date_start >= $date_end) {
  499. $msg=get_lang('StartDateShouldBeBeforeEndDate');
  500. return $msg;
  501. } else {
  502. $rs = Database::query("SELECT id FROM $tbl_session WHERE name='".Database::escape_string($name)."'");
  503. $exists = false;
  504. while ($row = Database::fetch_array($rs)) {
  505. if ($row['id'] != $id)
  506. $exists = true;
  507. }
  508. if ($exists) {
  509. $msg = get_lang('SessionNameAlreadyExists');
  510. return $msg;
  511. } else {
  512. $sessionInfo = SessionManager::fetch($id);
  513. $descriptionCondition = null;
  514. if (array_key_exists('description', $sessionInfo)) {
  515. $descriptionCondition = ' description = "'.Database::escape_string($description).'" ,';
  516. }
  517. $showDescriptionCondition = null;
  518. if (array_key_exists('show_description', $sessionInfo)) {
  519. $showDescriptionCondition = ' show_description = "'.Database::escape_string($showDescription).'" ,';
  520. }
  521. $sql = "UPDATE $tbl_session " .
  522. "SET name='".Database::escape_string($name)."',
  523. date_start='".$date_start."',
  524. date_end='".$date_end."',
  525. id_coach='".$id_coach."',
  526. nb_days_access_before_beginning = ".$nb_days_acess_before.",
  527. nb_days_access_after_end = ".$nb_days_acess_after.",
  528. session_category_id = ".$id_session_category." ,
  529. $descriptionCondition
  530. $showDescriptionCondition
  531. visibility= ".$id_visibility."
  532. WHERE id='$id'";
  533. Database::query($sql);
  534. return $id;
  535. }
  536. }
  537. }
  538. /**
  539. * Delete session
  540. * @author Carlos Vargas from existing code
  541. * @param array id_checked an array to delete sessions
  542. * @param boolean optional, true if the function is called by a webservice, false otherwise.
  543. * @return void Nothing, or false on error
  544. **/
  545. public static function delete_session($id_checked, $from_ws = false)
  546. {
  547. $tbl_session= Database::get_main_table(TABLE_MAIN_SESSION);
  548. $tbl_session_rel_course= Database::get_main_table(TABLE_MAIN_SESSION_COURSE);
  549. $tbl_session_rel_course_rel_user= Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER);
  550. $tbl_session_rel_user= Database::get_main_table(TABLE_MAIN_SESSION_USER);
  551. $tbl_url_session = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_SESSION);
  552. $t_sfv = Database::get_main_table(TABLE_MAIN_SESSION_FIELD_VALUES);
  553. $userId = api_get_user_id();
  554. if (is_array($id_checked)) {
  555. $id_checked = Database::escape_string(implode(',',$id_checked));
  556. } else {
  557. $id_checked = intval($id_checked);
  558. }
  559. if (!api_is_platform_admin() && !$from_ws) {
  560. $sql = 'SELECT session_admin_id FROM '.Database :: get_main_table(TABLE_MAIN_SESSION).' WHERE id='.$id_checked;
  561. $rs = Database::query($sql);
  562. if (Database::result($rs, 0, 0) != $userId) {
  563. api_not_allowed(true);
  564. }
  565. }
  566. Database::query("DELETE FROM $tbl_session WHERE id IN($id_checked)");
  567. Database::query("DELETE FROM $tbl_session_rel_course WHERE id_session IN($id_checked)");
  568. Database::query("DELETE FROM $tbl_session_rel_course_rel_user WHERE id_session IN($id_checked)");
  569. Database::query("DELETE FROM $tbl_session_rel_user WHERE id_session IN($id_checked)");
  570. Database::query("DELETE FROM $tbl_url_session WHERE session_id IN($id_checked)");
  571. $sql_delete_sfv = "DELETE FROM $t_sfv WHERE session_id = '$id_checked'";
  572. Database::query($sql_delete_sfv);
  573. // Add event to system log
  574. event_system(LOG_SESSION_DELETE, LOG_SESSION_ID, $id_checked, api_get_utc_datetime(), $userId);
  575. }
  576. public static function clear_session_ref_promotion($id_promotion) {
  577. $tbl_session = Database::get_main_table(TABLE_MAIN_SESSION);
  578. $id_promotion = intval($id_promotion);
  579. $update_sql = "UPDATE $tbl_session SET promotion_id=0 WHERE promotion_id='$id_promotion'";
  580. if (Database::query($update_sql)) {
  581. return true;
  582. } else {
  583. return false;
  584. }
  585. }
  586. /**
  587. * Subscribes users (students) to the given session and optionally (default) unsubscribes previous users
  588. * @author Carlos Vargas from existing code
  589. * @param integer Session ID
  590. * @param array List of user IDs
  591. * @param bool Whether to unsubscribe existing users (true, default) or not (false)
  592. * @return void Nothing, or false on error
  593. **/
  594. public static function suscribe_users_to_session($id_session, $user_list, $session_visibility = SESSION_VISIBLE_READ_ONLY, $empty_users = true, $send_email = false) {
  595. if ($id_session!= strval(intval($id_session))) return false;
  596. foreach($user_list as $intUser){
  597. if ($intUser!= strval(intval($intUser))) return false;
  598. }
  599. $tbl_session_rel_course = Database::get_main_table(TABLE_MAIN_SESSION_COURSE);
  600. $tbl_session_rel_course_rel_user = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER);
  601. $tbl_session_rel_user = Database::get_main_table(TABLE_MAIN_SESSION_USER);
  602. $tbl_session = Database::get_main_table(TABLE_MAIN_SESSION);
  603. $session_info = api_get_session_info($id_session);
  604. $session_name = $session_info['name'];
  605. //from function parameter
  606. if (empty($session_visibility)) {
  607. $session_visibility = $session_info['visibility']; //loaded from DB
  608. //default status loaded if empty
  609. if (empty($session_visibility))
  610. $session_visibility = SESSION_VISIBLE_READ_ONLY; // by default readonly 1
  611. } else {
  612. if (!in_array($session_visibility, array(SESSION_VISIBLE_READ_ONLY, SESSION_VISIBLE, SESSION_INVISIBLE))) {
  613. $session_visibility = SESSION_VISIBLE_READ_ONLY;
  614. }
  615. }
  616. $sql = "SELECT id_user FROM $tbl_session_rel_course_rel_user WHERE id_session = '$id_session' AND status = 0";
  617. $result = Database::query($sql);
  618. $existingUsers = array();
  619. while ($row = Database::fetch_array($result)) {
  620. $existingUsers[] = $row['id_user'];
  621. }
  622. $sql = "SELECT course_code FROM $tbl_session_rel_course WHERE id_session = '$id_session'";
  623. $result = Database::query($sql);
  624. $course_list = array();
  625. while ($row = Database::fetch_array($result)) {
  626. $course_list[] = $row['course_code'];
  627. }
  628. if ($send_email) {
  629. //sending emails only
  630. if (is_array($user_list) && count($user_list)>0) {
  631. foreach ($user_list as $user_id) {
  632. if (!in_array($user_id, $existingUsers)) {
  633. $subject = '['.get_setting('siteName').'] '.get_lang('YourReg').' '.get_setting('siteName');
  634. $user_info = api_get_user_info($user_id);
  635. $content = get_lang('Dear')." ".stripslashes($user_info['complete_name']).",\n\n".sprintf(get_lang('YouAreRegisterToSessionX'), $session_name) ." \n\n" .get_lang('Address') ." ". get_setting('siteName') ." ". get_lang('Is') ." : ". api_get_path(WEB_PATH) ."\n\n". get_lang('Problem'). "\n\n". get_lang('Formula').",\n\n".get_setting('administratorName')." ".get_setting('administratorSurname')."\n". get_lang('Manager'). " ".get_setting('siteName')."\nT. ".get_setting('administratorTelephone')."\n" .get_lang('Email') ." : ".get_setting('emailAdministrator');
  636. MessageManager::send_message($user_id, $subject, $content, array(), array(), null, null, null, null, null);
  637. }
  638. }
  639. }
  640. }
  641. foreach ($course_list as $enreg_course) {
  642. // for each course in the session
  643. $nbr_users = 0;
  644. $enreg_course = Database::escape_string($enreg_course);
  645. // delete existing users
  646. if ($empty_users) {
  647. foreach ($existingUsers as $existing_user) {
  648. if (!in_array($existing_user, $user_list)) {
  649. $sql = "DELETE FROM $tbl_session_rel_course_rel_user WHERE id_session='$id_session' AND course_code='$enreg_course' AND id_user='$existing_user' AND status = 0";
  650. Database::query($sql);
  651. if (Database::affected_rows()) {
  652. $nbr_users--;
  653. }
  654. }
  655. }
  656. }
  657. //Replace with this new function
  658. //
  659. // insert new users into session_rel_course_rel_user and ignore if they already exist
  660. foreach ($user_list as $enreg_user) {
  661. if(!in_array($enreg_user, $existingUsers)) {
  662. $enreg_user = Database::escape_string($enreg_user);
  663. $insert_sql = "INSERT IGNORE INTO $tbl_session_rel_course_rel_user(id_session, course_code, id_user, visibility, status) VALUES('$id_session','$enreg_course','$enreg_user','$session_visibility', '0')";
  664. Database::query($insert_sql);
  665. if(Database::affected_rows()) {
  666. $nbr_users++;
  667. }
  668. }
  669. }
  670. // count users in this session-course relation
  671. $sql = "SELECT COUNT(id_user) as nbUsers FROM $tbl_session_rel_course_rel_user WHERE id_session='$id_session' AND course_code='$enreg_course' AND status<>2";
  672. $rs = Database::query($sql);
  673. list($nbr_users) = Database::fetch_array($rs);
  674. // update the session-course relation to add the users total
  675. $update_sql = "UPDATE $tbl_session_rel_course SET nbr_users=$nbr_users WHERE id_session='$id_session' AND course_code='$enreg_course'";
  676. Database::query($update_sql);
  677. }
  678. // Delete users from the session
  679. if ($empty_users===true) {
  680. Database::query("DELETE FROM $tbl_session_rel_user WHERE id_session = $id_session AND relation_type<>".SESSION_RELATION_TYPE_RRHH."");
  681. }
  682. // Insert missing users into session
  683. $nbr_users = 0;
  684. foreach ($user_list as $enreg_user) {
  685. $enreg_user = Database::escape_string($enreg_user);
  686. $nbr_users++;
  687. $insert_sql = "INSERT IGNORE INTO $tbl_session_rel_user (id_session, id_user) VALUES ('$id_session','$enreg_user')";
  688. Database::query($insert_sql);
  689. }
  690. // update number of users in the session
  691. $nbr_users = count($user_list);
  692. if ($empty_users) {
  693. // update number of users in the session
  694. $update_sql = "UPDATE $tbl_session SET nbr_users= $nbr_users WHERE id='$id_session' ";
  695. Database::query($update_sql);
  696. } else {
  697. $update_sql = "UPDATE $tbl_session SET nbr_users= nbr_users + $nbr_users WHERE id='$id_session' ";
  698. Database::query($update_sql);
  699. }
  700. }
  701. function subscribe_users_to_session_course($user_list, $session_id, $course_code, $session_visibility = SESSION_VISIBLE_READ_ONLY ) {
  702. $tbl_session_rel_course = Database::get_main_table(TABLE_MAIN_SESSION_COURSE);
  703. $tbl_session_rel_course_rel_user = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER);
  704. if (empty($user_list) || empty($session_id) || empty($course_code)) {
  705. return false;
  706. }
  707. $session_id = intval($session_id);
  708. $course_code = Database::escape_string($course_code);
  709. $session_visibility = intval($session_visibility);
  710. $nbr_users = 0;
  711. foreach ($user_list as $enreg_user) {
  712. //if (!in_array($enreg_user, $existingUsers)) {
  713. $enreg_user = intval($enreg_user);
  714. $insert_sql = "INSERT IGNORE INTO $tbl_session_rel_course_rel_user(id_session,course_code,id_user,visibility)
  715. VALUES ('$session_id','$course_code','$enreg_user','$session_visibility')";
  716. Database::query($insert_sql);
  717. if (Database::affected_rows()) {
  718. $nbr_users++;
  719. }
  720. //}
  721. }
  722. // count users in this session-course relation
  723. $sql = "SELECT COUNT(id_user) as nbUsers FROM $tbl_session_rel_course_rel_user WHERE id_session='$session_id' AND course_code='$course_code' AND status<>2";
  724. $rs = Database::query($sql);
  725. list($nbr_users) = Database::fetch_array($rs);
  726. // update the session-course relation to add the users total
  727. $update_sql = "UPDATE $tbl_session_rel_course SET nbr_users=$nbr_users WHERE id_session='$session_id' AND course_code='$course_code'";
  728. Database::query($update_sql);
  729. }
  730. /**
  731. * Unsubscribe user from session
  732. *
  733. * @param int Session id
  734. * @param int User id
  735. * @return bool True in case of success, false in case of error
  736. */
  737. public static function unsubscribe_user_from_session($session_id, $user_id) {
  738. $session_id = (int)$session_id;
  739. $user_id = (int)$user_id;
  740. $tbl_session_rel_course_rel_user = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER);
  741. $tbl_session_rel_course = Database::get_main_table(TABLE_MAIN_SESSION_COURSE);
  742. $tbl_session_rel_user = Database::get_main_table(TABLE_MAIN_SESSION_USER);
  743. $tbl_session = Database::get_main_table(TABLE_MAIN_SESSION);
  744. $delete_sql = "DELETE FROM $tbl_session_rel_user WHERE id_session = '$session_id' AND id_user ='$user_id' AND relation_type<>".SESSION_RELATION_TYPE_RRHH."";
  745. Database::query($delete_sql);
  746. $return = Database::affected_rows();
  747. // Update number of users
  748. $update_sql = "UPDATE $tbl_session SET nbr_users= nbr_users - $return WHERE id='$session_id' ";
  749. Database::query($update_sql);
  750. // Get the list of courses related to this session
  751. $course_list = SessionManager::get_course_list_by_session_id($session_id);
  752. if(!empty($course_list)) {
  753. foreach($course_list as $course) {
  754. $course_code = $course['code'];
  755. // Delete user from course
  756. Database::query("DELETE FROM $tbl_session_rel_course_rel_user WHERE id_session='$session_id' AND course_code='$course_code' AND id_user='$user_id'");
  757. if(Database::affected_rows()) {
  758. // Update number of users in this relation
  759. Database::query("UPDATE $tbl_session_rel_course SET nbr_users=nbr_users - 1 WHERE id_session='$session_id' AND course_code='$course_code'");
  760. }
  761. }
  762. }
  763. return true;
  764. }
  765. /** Subscribes courses to the given session and optionally (default) unsubscribes previous users
  766. * @author Carlos Vargas from existing code
  767. * @param int Session ID
  768. * @param array List of courses IDs
  769. * @param bool Whether to unsubscribe existing users (true, default) or not (false)
  770. * @return void Nothing, or false on error
  771. **/
  772. public static function add_courses_to_session ($id_session, $course_list, $empty_courses=true) {
  773. // security checks
  774. if ($id_session!= strval(intval($id_session))) { return false; }
  775. //foreach($course_list as $intCourse){
  776. // if ($intCourse!= strval(intval($intCourse))) { return false; }
  777. //}
  778. // initialisation
  779. $tbl_session_rel_course_rel_user = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER);
  780. $tbl_session = Database::get_main_table(TABLE_MAIN_SESSION);
  781. $tbl_session_rel_user = Database::get_main_table(TABLE_MAIN_SESSION_USER);
  782. $tbl_session_rel_course = Database::get_main_table(TABLE_MAIN_SESSION_COURSE);
  783. $tbl_course = Database::get_main_table(TABLE_MAIN_COURSE);
  784. // get general coach ID
  785. $id_coach = Database::query("SELECT id_coach FROM $tbl_session WHERE id=$id_session");
  786. $id_coach = Database::fetch_array($id_coach);
  787. $id_coach = $id_coach[0];
  788. // get list of courses subscribed to this session
  789. $rs = Database::query("SELECT course_code FROM $tbl_session_rel_course WHERE id_session=$id_session");
  790. $existingCourses = Database::store_result($rs);
  791. $nbr_courses=count($existingCourses);
  792. // get list of users subscribed to this session
  793. $sql="SELECT id_user
  794. FROM $tbl_session_rel_user
  795. WHERE id_session = $id_session AND relation_type<>".SESSION_RELATION_TYPE_RRHH."";
  796. $result=Database::query($sql);
  797. $user_list=Database::store_result($result);
  798. // remove existing courses from the session
  799. if ($empty_courses===true) {
  800. foreach ($existingCourses as $existingCourse) {
  801. if (!in_array($existingCourse['course_code'], $course_list)){
  802. Database::query("DELETE FROM $tbl_session_rel_course WHERE course_code='".$existingCourse['course_code']."' AND id_session=$id_session");
  803. Database::query("DELETE FROM $tbl_session_rel_course_rel_user WHERE course_code='".$existingCourse['course_code']."' AND id_session=$id_session");
  804. }
  805. }
  806. $nbr_courses=0;
  807. }
  808. // Pass through the courses list we want to add to the session
  809. foreach ($course_list as $enreg_course) {
  810. $enreg_course = Database::escape_string($enreg_course);
  811. $exists = false;
  812. // check if the course we want to add is already subscribed
  813. foreach ($existingCourses as $existingCourse) {
  814. if ($enreg_course == $existingCourse['course_code']) {
  815. $exists=true;
  816. }
  817. }
  818. if (!$exists) {
  819. //if the course isn't subscribed yet
  820. $sql_insert_rel_course= "INSERT INTO $tbl_session_rel_course (id_session,course_code) VALUES ('$id_session','$enreg_course')";
  821. Database::query($sql_insert_rel_course);
  822. //We add the current course in the existing courses array, to avoid adding another time the current course
  823. $existingCourses[]=array('course_code'=>$enreg_course);
  824. $nbr_courses++;
  825. // subscribe all the users from the session to this course inside the session
  826. $nbr_users=0;
  827. foreach ($user_list as $enreg_user) {
  828. $enreg_user_id = Database::escape_string($enreg_user['id_user']);
  829. $sql_insert = "INSERT IGNORE INTO $tbl_session_rel_course_rel_user (id_session,course_code,id_user) VALUES ('$id_session','$enreg_course','$enreg_user_id')";
  830. Database::query($sql_insert);
  831. if (Database::affected_rows()) {
  832. $nbr_users++;
  833. }
  834. }
  835. Database::query("UPDATE $tbl_session_rel_course SET nbr_users=$nbr_users WHERE id_session='$id_session' AND course_code='$enreg_course'");
  836. }
  837. }
  838. Database::query("UPDATE $tbl_session SET nbr_courses=$nbr_courses WHERE id='$id_session'");
  839. }
  840. /**
  841. * Unsubscribe course from a session
  842. *
  843. * @param int Session id
  844. * @param int Course id
  845. * @return bool True in case of success, false otherwise
  846. */
  847. public static function unsubscribe_course_from_session($session_id, $course_id) {
  848. $session_id = (int)$session_id;
  849. $course_id = (int)$course_id;
  850. $tbl_session_rel_course = Database::get_main_table(TABLE_MAIN_SESSION_COURSE);
  851. $tbl_session_rel_course_rel_user = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER);
  852. $tbl_session = Database::get_main_table(TABLE_MAIN_SESSION);
  853. // Get course code
  854. $course_code = CourseManager::get_course_code_from_course_id($course_id);
  855. if($course_code == 0) {
  856. return false;
  857. }
  858. // Unsubscribe course
  859. Database::query("DELETE FROM $tbl_session_rel_course WHERE course_code='$course_code' AND id_session='$session_id'");
  860. $nb_affected = Database::affected_rows();
  861. Database::query("DELETE FROM $tbl_session_rel_course_rel_user WHERE course_code='$course_code' AND id_session='$session_id'");
  862. if($nb_affected > 0) {
  863. // Update number of courses in the session
  864. Database::query("UPDATE $tbl_session SET nbr_courses= nbr_courses + $nb_affected WHERE id='$session_id' ");
  865. return true;
  866. } else {
  867. return false;
  868. }
  869. }
  870. /**
  871. * Creates a new extra field for a given session
  872. * @param string Field's internal variable name
  873. * @param int Field's type
  874. * @param string Field's language var name
  875. * @return int new extra field id
  876. */
  877. public static function create_session_extra_field ($fieldvarname, $fieldtype, $fieldtitle) {
  878. // database table definition
  879. $t_sf = Database::get_main_table(TABLE_MAIN_SESSION_FIELD);
  880. $fieldvarname = Database::escape_string($fieldvarname);
  881. $fieldtitle = Database::escape_string($fieldtitle);
  882. $fieldtype = (int)$fieldtype;
  883. $time = time();
  884. $sql_field = "SELECT id FROM $t_sf WHERE field_variable = '$fieldvarname'";
  885. $res_field = Database::query($sql_field);
  886. $r_field = Database::fetch_row($res_field);
  887. if (Database::num_rows($res_field)>0) {
  888. $field_id = $r_field[0];
  889. } else {
  890. // save new fieldlabel into course_field table
  891. $sql = "SELECT MAX(field_order) FROM $t_sf";
  892. $res = Database::query($sql);
  893. $order = 0;
  894. if (Database::num_rows($res)>0) {
  895. $row = Database::fetch_row($res);
  896. $order = $row[0]+1;
  897. }
  898. $sql = "INSERT INTO $t_sf
  899. SET field_type = '$fieldtype',
  900. field_variable = '$fieldvarname',
  901. field_display_text = '$fieldtitle',
  902. field_order = '$order',
  903. tms = FROM_UNIXTIME($time)";
  904. $result = Database::query($sql);
  905. $field_id=Database::insert_id();
  906. }
  907. return $field_id;
  908. }
  909. /**
  910. * Update an extra field value for a given session
  911. * @param integer Course ID
  912. * @param string Field variable name
  913. * @param string Field value
  914. * @return boolean true if field updated, false otherwise
  915. */
  916. public static function update_session_extra_field_value ($session_id,$fname,$fvalue='') {
  917. $t_sf = Database::get_main_table(TABLE_MAIN_SESSION_FIELD);
  918. $t_sfv = Database::get_main_table(TABLE_MAIN_SESSION_FIELD_VALUES);
  919. $fname = Database::escape_string($fname);
  920. $session_id = (int)$session_id;
  921. $fvalues = '';
  922. if(is_array($fvalue)) {
  923. foreach($fvalue as $val) {
  924. $fvalues .= Database::escape_string($val).';';
  925. }
  926. if(!empty($fvalues)) {
  927. $fvalues = substr($fvalues,0,-1);
  928. }
  929. }
  930. else
  931. {
  932. $fvalues = Database::escape_string($fvalue);
  933. }
  934. $sqlsf = "SELECT * FROM $t_sf WHERE field_variable='$fname'";
  935. $ressf = Database::query($sqlsf);
  936. if(Database::num_rows($ressf)==1)
  937. { //ok, the field exists
  938. // Check if enumerated field, if the option is available
  939. $rowsf = Database::fetch_array($ressf);
  940. $tms = time();
  941. $sqlsfv = "SELECT * FROM $t_sfv WHERE session_id = '$session_id' AND field_id = '".$rowsf['id']."' ORDER BY id";
  942. $ressfv = Database::query($sqlsfv);
  943. $n = Database::num_rows($ressfv);
  944. if ($n>1) {
  945. //problem, we already have to values for this field and user combination - keep last one
  946. while($rowsfv = Database::fetch_array($ressfv))
  947. {
  948. if($n > 1)
  949. {
  950. $sqld = "DELETE FROM $t_sfv WHERE id = ".$rowsfv['id'];
  951. $resd = Database::query($sqld);
  952. $n--;
  953. }
  954. $rowsfv = Database::fetch_array($ressfv);
  955. if($rowsfv['field_value'] != $fvalues)
  956. {
  957. $sqlu = "UPDATE $t_sfv SET field_value = '$fvalues', tms = FROM_UNIXTIME($tms) WHERE id = ".$rowsfv['id'];
  958. $resu = Database::query($sqlu);
  959. return($resu?true:false);
  960. }
  961. return true;
  962. }
  963. } else if ($n==1) {
  964. //we need to update the current record
  965. $rowsfv = Database::fetch_array($ressfv);
  966. if($rowsfv['field_value'] != $fvalues)
  967. {
  968. $sqlu = "UPDATE $t_sfv SET field_value = '$fvalues', tms = FROM_UNIXTIME($tms) WHERE id = ".$rowsfv['id'];
  969. //error_log('UM::update_extra_field_value: '.$sqlu);
  970. $resu = Database::query($sqlu);
  971. return($resu?true:false);
  972. }
  973. return true;
  974. } else {
  975. $sqli = "INSERT INTO $t_sfv (session_id,field_id,field_value,tms) " .
  976. "VALUES ('$session_id',".$rowsf['id'].",'$fvalues',FROM_UNIXTIME($tms))";
  977. //error_log('UM::update_extra_field_value: '.$sqli);
  978. $resi = Database::query($sqli);
  979. return($resi?true:false);
  980. }
  981. } else {
  982. return false; //field not found
  983. }
  984. }
  985. /**
  986. * Checks the relationship between a session and a course.
  987. * @param int $session_id
  988. * @param int $course_id
  989. * @return bool Returns TRUE if the session and the course are related, FALSE otherwise.
  990. * */
  991. public static function relation_session_course_exist ($session_id, $course_id) {
  992. $tbl_session_course = Database::get_main_table(TABLE_MAIN_SESSION_COURSE);
  993. $return_value = false;
  994. $sql= "SELECT course_code FROM $tbl_session_course WHERE id_session = ".Database::escape_string($session_id)." AND course_code = '".Database::escape_string($course_id)."'";
  995. $result = Database::query($sql);
  996. $num = Database::num_rows($result);
  997. if ($num>0) {
  998. $return_value = true;
  999. }
  1000. return $return_value;
  1001. }
  1002. /**
  1003. * Get the session information by name
  1004. * @param string session name
  1005. * @return mixed false if the session does not exist, array if the session exist
  1006. * */
  1007. public static function get_session_by_name ($session_name) {
  1008. $tbl_session = Database::get_main_table(TABLE_MAIN_SESSION);
  1009. $sql = 'SELECT id, id_coach, date_start, date_end FROM '.$tbl_session.' WHERE name="'.Database::escape_string($session_name).'"';
  1010. $result = Database::query($sql);
  1011. $num = Database::num_rows($result);
  1012. if ($num>0){
  1013. return Database::fetch_array($result);
  1014. } else {
  1015. return false;
  1016. }
  1017. }
  1018. /**
  1019. * Create a session category
  1020. * @author Jhon Hinojosa <jhon.hinojosa@dokeos.com>, from existing code
  1021. * @param string name
  1022. * @param integer year_start
  1023. * @param integer month_start
  1024. * @param integer day_start
  1025. * @param integer year_end
  1026. * @param integer month_end
  1027. * @param integer day_end
  1028. * @return $id_session;
  1029. **/
  1030. public static function create_category_session($sname,$syear_start,$smonth_start,$sday_start,$syear_end,$smonth_end, $sday_end){
  1031. $tbl_session_category = Database::get_main_table(TABLE_MAIN_SESSION_CATEGORY);
  1032. $name= trim($sname);
  1033. $year_start= intval($syear_start);
  1034. $month_start=intval($smonth_start);
  1035. $day_start=intval($sday_start);
  1036. $year_end=intval($syear_end);
  1037. $month_end=intval($smonth_end);
  1038. $day_end=intval($sday_end);
  1039. $date_start = "$year_start-".(($month_start < 10)?"0$month_start":$month_start)."-".(($day_start < 10)?"0$day_start":$day_start);
  1040. $date_end = "$year_end-".(($month_end < 10)?"0$month_end":$month_end)."-".(($day_end < 10)?"0$day_end":$day_end);
  1041. if (empty($name)) {
  1042. $msg=get_lang('SessionCategoryNameIsRequired');
  1043. return $msg;
  1044. } elseif (!$month_start || !$day_start || !$year_start || !checkdate($month_start,$day_start,$year_start)) {
  1045. $msg=get_lang('InvalidStartDate');
  1046. return $msg;
  1047. } elseif (!$month_end && !$day_end && !$year_end) {
  1048. $date_end = "null";
  1049. } elseif (!$month_end || !$day_end || !$year_end || !checkdate($month_end,$day_end,$year_end)) {
  1050. $msg=get_lang('InvalidEndDate');
  1051. return $msg;
  1052. } elseif($date_start >= $date_end) {
  1053. $msg=get_lang('StartDateShouldBeBeforeEndDate');
  1054. return $msg;
  1055. }
  1056. $access_url_id = api_get_current_access_url_id();
  1057. $sql = "INSERT INTO $tbl_session_category (name, date_start, date_end, access_url_id)
  1058. VALUES('".Database::escape_string($name)."','$date_start','$date_end', '$access_url_id')";
  1059. Database::query($sql);
  1060. $id_session = Database::insert_id();
  1061. // Add event to system log
  1062. $user_id = api_get_user_id();
  1063. event_system(LOG_SESSION_CATEGORY_CREATE, LOG_SESSION_CATEGORY_ID, $id_session, api_get_utc_datetime(), $user_id);
  1064. return $id_session;
  1065. }
  1066. /**
  1067. * Edit a sessions categories
  1068. * @author Jhon Hinojosa <jhon.hinojosa@dokeos.com>,from existing code
  1069. * @param integer id
  1070. * @param string name
  1071. * @param integer year_start
  1072. * @param integer month_start
  1073. * @param integer day_start
  1074. * @param integer year_end
  1075. * @param integer month_end
  1076. * @param integer day_end
  1077. * @return $id;
  1078. * The parameter id is a primary key
  1079. **/
  1080. public static function edit_category_session($id, $sname,$syear_start,$smonth_start,$sday_start,$syear_end,$smonth_end, $sday_end){
  1081. $tbl_session_category = Database::get_main_table(TABLE_MAIN_SESSION_CATEGORY);
  1082. $name= trim($sname);
  1083. $year_start= intval($syear_start);
  1084. $month_start=intval($smonth_start);
  1085. $day_start=intval($sday_start);
  1086. $year_end=intval($syear_end);
  1087. $month_end=intval($smonth_end);
  1088. $day_end=intval($sday_end);
  1089. $id=intval($id);
  1090. $date_start = "$year_start-".(($month_start < 10)?"0$month_start":$month_start)."-".(($day_start < 10)?"0$day_start":$day_start);
  1091. $date_end = "$year_end-".(($month_end < 10)?"0$month_end":$month_end)."-".(($day_end < 10)?"0$day_end":$day_end);
  1092. if (empty($name)) {
  1093. $msg=get_lang('SessionCategoryNameIsRequired');
  1094. return $msg;
  1095. } elseif (!$month_start || !$day_start || !$year_start || !checkdate($month_start,$day_start,$year_start)) {
  1096. $msg=get_lang('InvalidStartDate');
  1097. return $msg;
  1098. } elseif (!$month_end && !$day_end && !$year_end) {
  1099. $date_end = null;
  1100. } elseif (!$month_end || !$day_end || !$year_end || !checkdate($month_end,$day_end,$year_end)) {
  1101. $msg=get_lang('InvalidEndDate');
  1102. return $msg;
  1103. } elseif($date_start >= $date_end) {
  1104. $msg=get_lang('StartDateShouldBeBeforeEndDate');
  1105. return $msg;
  1106. }
  1107. if ( $date_end <> null ) {
  1108. $sql = "UPDATE $tbl_session_category SET name = '".Database::escape_string($name)."', date_start = '$date_start' ".
  1109. ", date_end = '$date_end' WHERE id= '".$id."' ";
  1110. } else {
  1111. $sql = "UPDATE $tbl_session_category SET name = '".Database::escape_string($name)."', date_start = '$date_start' ".
  1112. ", date_end = NULL WHERE id= '".$id."' ";
  1113. }
  1114. $result = Database::query($sql);
  1115. return ($result? true:false);
  1116. }
  1117. /**
  1118. * Delete sessions categories
  1119. * @author Jhon Hinojosa <jhon.hinojosa@dokeos.com>, from existing code
  1120. * @param array id_checked
  1121. * @param bool include delete session
  1122. * @param bool optional, true if the function is called by a webservice, false otherwise.
  1123. * @return void Nothing, or false on error
  1124. * The parameters is a array to delete sessions
  1125. **/
  1126. public static function delete_session_category($id_checked, $delete_session = false,$from_ws = false){
  1127. $tbl_session_category = Database::get_main_table(TABLE_MAIN_SESSION_CATEGORY);
  1128. $tbl_session = Database::get_main_table(TABLE_MAIN_SESSION);
  1129. if (is_array($id_checked)) {
  1130. $id_checked = Database::escape_string(implode(',',$id_checked));
  1131. } else {
  1132. $id_checked = intval($id_checked);
  1133. }
  1134. //Setting session_category_id to 0
  1135. $sql = "UPDATE $tbl_session SET session_category_id = 0 WHERE session_category_id IN (".$id_checked.")";
  1136. Database::query($sql);
  1137. $sql = "SELECT id FROM $tbl_session WHERE session_category_id IN (".$id_checked.")";
  1138. $result = @Database::query($sql);
  1139. while ($rows = Database::fetch_array($result)) {
  1140. $session_id = $rows['id'];
  1141. if ($delete_session) {
  1142. if ($from_ws) {
  1143. SessionManager::delete_session($session_id,true);
  1144. } else {
  1145. SessionManager::delete_session($session_id);
  1146. }
  1147. }
  1148. }
  1149. $sql = "DELETE FROM $tbl_session_category WHERE id IN (".$id_checked.")";
  1150. $rs = @Database::query($sql);
  1151. $result = Database::affected_rows();
  1152. // Add event to system log
  1153. $user_id = api_get_user_id();
  1154. event_system(LOG_SESSION_CATEGORY_DELETE, LOG_SESSION_CATEGORY_ID, $id_checked, api_get_utc_datetime(), $user_id);
  1155. // delete extra session fields where field variable is "PERIODO"
  1156. $t_sf = Database::get_main_table(TABLE_MAIN_SESSION_FIELD);
  1157. $t_sfv = Database::get_main_table(TABLE_MAIN_SESSION_FIELD_VALUES);
  1158. $sql = "SELECT t_sfv.field_id FROM $t_sfv t_sfv, $t_sf t_sf WHERE t_sfv.session_id = '$id_checked' AND t_sf.field_variable = 'PERIODO' ";
  1159. $rs_field = Database::query($sql);
  1160. $field_id = 0;
  1161. if (Database::num_rows($rs_field) > 0) {
  1162. $row_field = Database::fetch_row($rs_field);
  1163. $field_id = $row_field[0];
  1164. $sql_delete_sfv = "DELETE FROM $t_sfv WHERE session_id = '$id_checked' AND field_id = '$field_id'";
  1165. $rs_delete_sfv = Database::query($sql_delete_sfv);
  1166. }
  1167. $sql = "SELECT * FROM $t_sfv WHERE field_id = '$field_id' ";
  1168. $rs_field_id = Database::query($sql);
  1169. if (Database::num_rows($rs_field_id) == 0) {
  1170. $sql_delete_sf = "DELETE FROM $t_sf WHERE id = '$field_id'";
  1171. $rs_delete_sf = Database::query($sql_delete_sf);
  1172. }
  1173. return true;
  1174. }
  1175. /**
  1176. * Get a list of sessions of which the given conditions match with an = 'cond'
  1177. * @param array $conditions a list of condition (exemple : array('status =' =>STUDENT) or array('s.name LIKE' => "%$needle%")
  1178. * @param array $order_by a list of fields on which sort
  1179. * @return array An array with all sessions of the platform.
  1180. * @todo optional course code parameter, optional sorting parameters...
  1181. */
  1182. public static function get_sessions_list($conditions = array(), $order_by = array()) {
  1183. $session_table = Database::get_main_table(TABLE_MAIN_SESSION);
  1184. $session_category_table = Database::get_main_table(TABLE_MAIN_SESSION_CATEGORY);
  1185. $user_table = Database::get_main_table(TABLE_MAIN_USER);
  1186. $table_access_url_rel_session = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_SESSION);
  1187. $access_url_id = api_get_current_access_url_id();
  1188. $return_array = array();
  1189. $sql_query = " SELECT s.id, s.name, s.nbr_courses, s.date_start, s.date_end, u.firstname, u.lastname, sc.name as category_name, s.promotion_id
  1190. FROM $session_table s
  1191. INNER JOIN $user_table u ON s.id_coach = u.user_id
  1192. INNER JOIN $table_access_url_rel_session ar ON ar.session_id = s.id
  1193. LEFT JOIN $session_category_table sc ON s.session_category_id = sc.id
  1194. WHERE ar.access_url_id = $access_url_id ";
  1195. if (count($conditions)>0) {
  1196. $sql_query .= ' AND ';
  1197. foreach ($conditions as $field=>$value) {
  1198. $field = Database::escape_string($field);
  1199. $value = Database::escape_string($value);
  1200. $sql_query .= $field." '".$value."'";
  1201. }
  1202. }
  1203. if (count($order_by)>0) {
  1204. $sql_query .= ' ORDER BY '.Database::escape_string(implode(',',$order_by));
  1205. }
  1206. //echo $sql_query;
  1207. $sql_result = Database::query($sql_query);
  1208. if (Database::num_rows($sql_result)>0) {
  1209. while ($result = Database::fetch_array($sql_result)) {
  1210. $return_array[$result['id']] = $result;
  1211. }
  1212. }
  1213. return $return_array;
  1214. }
  1215. /**
  1216. * Get the session category information by id
  1217. * @param string session category ID
  1218. * @return mixed false if the session category does not exist, array if the session category exists
  1219. */
  1220. public static function get_session_category ($id) {
  1221. $id = intval($id);
  1222. $tbl_session_category = Database::get_main_table(TABLE_MAIN_SESSION_CATEGORY);
  1223. $sql = "SELECT id, name, date_start, date_end FROM $tbl_session_category WHERE id= $id";
  1224. $result = Database::query($sql);
  1225. $num = Database::num_rows($result);
  1226. if ($num>0){
  1227. return Database::fetch_array($result);
  1228. } else {
  1229. return false;
  1230. }
  1231. }
  1232. /**
  1233. * Get all session categories (filter by access_url_id)
  1234. * @return mixed false if the session category does not exist, array if the session category exists
  1235. */
  1236. public static function get_all_session_category() {
  1237. $tbl_session_category = Database::get_main_table(TABLE_MAIN_SESSION_CATEGORY);
  1238. $id = api_get_current_access_url_id();
  1239. $sql = 'SELECT * FROM '.$tbl_session_category.' WHERE access_url_id ="'.$id.'" ORDER BY name ASC';
  1240. $result = Database::query($sql);
  1241. if (Database::num_rows($result) > 0 ){
  1242. $data = Database::store_result($result,'ASSOC');
  1243. return $data;
  1244. } else {
  1245. return false;
  1246. }
  1247. }
  1248. /**
  1249. * Assign a coach to course in session with status = 2
  1250. * @param int - user id
  1251. * @param int - session id
  1252. * @param string - course code
  1253. * @param bool - optional, if is true the user don't be a coach now, otherwise it'll assign a coach
  1254. * @return bool true if there are affected rows, otherwise false
  1255. */
  1256. public static function set_coach_to_course_session($user_id, $session_id = 0, $course_code = '', $nocoach = false) {
  1257. // Definition of variables
  1258. $user_id = intval($user_id);
  1259. if (!empty($session_id)) {
  1260. $session_id = intval($session_id);
  1261. } else {
  1262. $session_id = api_get_session_id();
  1263. }
  1264. if (!empty($course_code)) {
  1265. $course_code = Database::escape_string($course_code);
  1266. } else {
  1267. $course_code = api_get_course_id();
  1268. }
  1269. // definitios of tables
  1270. $tbl_session_rel_course_rel_user = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER);
  1271. $tbl_session_rel_user = Database::get_main_table(TABLE_MAIN_SESSION_USER);
  1272. $tbl_user = Database::get_main_table(TABLE_MAIN_USER);
  1273. // check if user is a teacher
  1274. $sql= "SELECT * FROM $tbl_user WHERE status='1' AND user_id = '$user_id'";
  1275. $rs_check_user = Database::query($sql);
  1276. if (Database::num_rows($rs_check_user) > 0) {
  1277. if ($nocoach) {
  1278. // check if user_id exits int session_rel_user
  1279. $sql = "SELECT id_user FROM $tbl_session_rel_user WHERE id_session = '$session_id' AND id_user = '$user_id'";
  1280. $res = Database::query($sql);
  1281. if (Database::num_rows($res) > 0) {
  1282. // The user don't be a coach now
  1283. $sql = "UPDATE $tbl_session_rel_course_rel_user SET status = 0 WHERE id_session = '$session_id' AND course_code = '$course_code' AND id_user = '$user_id' ";
  1284. $rs_update = Database::query($sql);
  1285. if (Database::affected_rows() > 0) return true;
  1286. else return false;
  1287. } else {
  1288. // The user don't be a coach now
  1289. $sql = "DELETE FROM $tbl_session_rel_course_rel_user WHERE id_session = '$session_id' AND course_code = '$course_code' AND id_user = '$user_id' ";
  1290. $rs_delete = Database::query($sql);
  1291. if (Database::affected_rows() > 0) return true;
  1292. else return false;
  1293. }
  1294. } else {
  1295. // Assign user like a coach to course
  1296. // First check if the user is registered in the course
  1297. $sql = "SELECT id_user FROM $tbl_session_rel_course_rel_user WHERE id_session = '$session_id' AND course_code = '$course_code' AND id_user = '$user_id'";
  1298. $rs_check = Database::query($sql);
  1299. //Then update or insert
  1300. if (Database::num_rows($rs_check) > 0) {
  1301. $sql = "UPDATE $tbl_session_rel_course_rel_user SET status = 2 WHERE id_session = '$session_id' AND course_code = '$course_code' AND id_user = '$user_id' ";
  1302. $rs_update = Database::query($sql);
  1303. if (Database::affected_rows() > 0) return true;
  1304. else return false;
  1305. } else {
  1306. $sql = "INSERT INTO $tbl_session_rel_course_rel_user(id_session, course_code, id_user, status) VALUES('$session_id', '$course_code', '$user_id', 2)";
  1307. Database::query($sql);
  1308. if (Database::affected_rows() > 0) return true;
  1309. else return false;
  1310. }
  1311. }
  1312. } else {
  1313. return false;
  1314. }
  1315. }
  1316. /**
  1317. * Subscribes sessions to human resource manager (Dashboard feature)
  1318. * @param int Human Resource Manager id
  1319. * @param array Sessions id
  1320. * @param int Relation type
  1321. **/
  1322. public static function suscribe_sessions_to_hr_manager($hr_manager_id,$sessions_list) {
  1323. global $_configuration;
  1324. // Database Table Definitions
  1325. $tbl_session = Database::get_main_table(TABLE_MAIN_SESSION);
  1326. $tbl_session_rel_user = Database::get_main_table(TABLE_MAIN_SESSION_USER);
  1327. $tbl_session_rel_course_user = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER);
  1328. $tbl_session_rel_access_url = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_SESSION);
  1329. $hr_manager_id = intval($hr_manager_id);
  1330. $affected_rows = 0;
  1331. //Deleting assigned sessions to hrm_id
  1332. if ($_configuration['multiple_access_urls']) {
  1333. $sql = "SELECT id_session FROM $tbl_session_rel_user s INNER JOIN $tbl_session_rel_access_url a ON (a.session_id = s.id_session) WHERE id_user = $hr_manager_id AND relation_type=".SESSION_RELATION_TYPE_RRHH." AND access_url_id = ".api_get_current_access_url_id()."";
  1334. } else {
  1335. $sql = "SELECT id_session FROM $tbl_session_rel_user s WHERE id_user = $hr_manager_id AND relation_type=".SESSION_RELATION_TYPE_RRHH."";
  1336. }
  1337. $result = Database::query($sql);
  1338. if (Database::num_rows($result) > 0) {
  1339. while ($row = Database::fetch_array($result)) {
  1340. $sql = "DELETE FROM $tbl_session_rel_user WHERE id_session = {$row['id_session']} AND id_user = $hr_manager_id AND relation_type=".SESSION_RELATION_TYPE_RRHH." ";
  1341. Database::query($sql);
  1342. }
  1343. }
  1344. /*
  1345. //Deleting assigned courses in sessions to hrm_id
  1346. $sql = "SELECT * FROM $tbl_session_rel_course_user WHERE id_user = $hr_manager_id ";
  1347. $result = Database::query($sql);
  1348. if (Database::num_rows($result) > 0) {
  1349. $sql = "DELETE FROM $tbl_session_rel_course_user WHERE id_user = $hr_manager_id ";
  1350. Database::query($sql);
  1351. }
  1352. */
  1353. // inserting new sessions list
  1354. if (is_array($sessions_list)) {
  1355. foreach ($sessions_list as $session_id) {
  1356. $session_id = intval($session_id);
  1357. $insert_sql = "INSERT IGNORE INTO $tbl_session_rel_user(id_session, id_user, relation_type) VALUES($session_id, $hr_manager_id, '".SESSION_RELATION_TYPE_RRHH."')";
  1358. Database::query($insert_sql);
  1359. $affected_rows = Database::affected_rows();
  1360. }
  1361. }
  1362. return $affected_rows;
  1363. }
  1364. /**
  1365. * Get sessions followed by human resources manager
  1366. * @param int Human resources manager or Session admin id
  1367. * @return array sessions
  1368. */
  1369. public static function get_sessions_followed_by_drh($hr_manager_id)
  1370. {
  1371. // Database Table Definitions
  1372. $tbl_session = Database::get_main_table(TABLE_MAIN_SESSION);
  1373. $tbl_session_rel_user = Database::get_main_table(TABLE_MAIN_SESSION_USER);
  1374. $tbl_session_rel_access_url = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_SESSION);
  1375. $hr_manager_id = intval($hr_manager_id);
  1376. $assigned_sessions_to_hrm = array();
  1377. if (api_is_multiple_url_enabled()) {
  1378. $sql = "SELECT * FROM $tbl_session s
  1379. INNER JOIN $tbl_session_rel_user sru ON (sru.id_session = s.id)
  1380. LEFT JOIN $tbl_session_rel_access_url a ON (s.id = a.session_id)
  1381. WHERE
  1382. sru.id_user = '$hr_manager_id' AND
  1383. sru.relation_type = '".SESSION_RELATION_TYPE_RRHH."' AND
  1384. access_url_id = ".api_get_current_access_url_id()."";
  1385. } else {
  1386. $sql = "SELECT * FROM $tbl_session s
  1387. INNER JOIN $tbl_session_rel_user sru
  1388. ON
  1389. sru.id_session = s.id AND
  1390. sru.id_user = '$hr_manager_id' AND
  1391. sru.relation_type = '".SESSION_RELATION_TYPE_RRHH."' ";
  1392. }
  1393. $rs_assigned_sessions = Database::query($sql);
  1394. if (Database::num_rows($rs_assigned_sessions) > 0) {
  1395. while ($row_assigned_sessions = Database::fetch_array($rs_assigned_sessions)) {
  1396. $assigned_sessions_to_hrm[$row_assigned_sessions['id']] = $row_assigned_sessions;
  1397. }
  1398. }
  1399. return $assigned_sessions_to_hrm;
  1400. }
  1401. /**
  1402. * Gets the list of courses by session filtered by access_url
  1403. * @param int session id
  1404. * @return array list of courses
  1405. */
  1406. public static function get_course_list_by_session_id($session_id) {
  1407. $tbl_course = Database::get_main_table(TABLE_MAIN_COURSE);
  1408. $tbl_session_rel_course = Database::get_main_table(TABLE_MAIN_SESSION_COURSE);
  1409. // select the courses
  1410. $sql = "SELECT * FROM $tbl_course c INNER JOIN $tbl_session_rel_course src ON c.code = src.course_code
  1411. WHERE src.id_session = '$session_id' ORDER BY title;";
  1412. $result = Database::query($sql);
  1413. $num_rows = Database::num_rows($result);
  1414. $courses = array();
  1415. if ($num_rows > 0) {
  1416. while ($row = Database::fetch_array($result,'ASSOC')) {
  1417. $courses[$row['id']] = $row;
  1418. }
  1419. }
  1420. return $courses;
  1421. }
  1422. /**
  1423. * Get the session id based on the original id and field name in the extra fields. Returns 0 if session was not found
  1424. *
  1425. * @param string Original session id
  1426. * @param string Original field name
  1427. * @return int Session id
  1428. */
  1429. public static function get_session_id_from_original_id($original_session_id_value, $original_session_id_name) {
  1430. $t_sfv = Database::get_main_table(TABLE_MAIN_SESSION_FIELD_VALUES);
  1431. $table_field = Database::get_main_table(TABLE_MAIN_SESSION_FIELD);
  1432. $sql_session = "SELECT session_id FROM $table_field sf INNER JOIN $t_sfv sfv ON sfv.field_id=sf.id WHERE field_variable='$original_session_id_name' AND field_value='$original_session_id_value'";
  1433. $res_session = Database::query($sql_session);
  1434. $row = Database::fetch_object($res_session);
  1435. if ($row) {
  1436. return $row->session_id;
  1437. } else {
  1438. return 0;
  1439. }
  1440. }
  1441. /**
  1442. * Get users by session
  1443. * @param int session id
  1444. * @param int filter by status coach = 2
  1445. * @return array a list with an user list
  1446. */
  1447. public static function get_users_by_session($id, $with_status = null)
  1448. {
  1449. if (empty($id)) {
  1450. return array();
  1451. }
  1452. $id = intval($id);
  1453. $tbl_user = Database::get_main_table(TABLE_MAIN_USER);
  1454. $tbl_session_rel_user = Database::get_main_table(TABLE_MAIN_SESSION_USER);
  1455. $sql = "SELECT $tbl_user.user_id, lastname, firstname, username
  1456. FROM $tbl_user INNER JOIN $tbl_session_rel_user
  1457. ON $tbl_user.user_id = $tbl_session_rel_user.id_user
  1458. AND $tbl_session_rel_user.id_session = $id";
  1459. if (isset($with_status) && $with_status != '') {
  1460. $with_status = intval($with_status);
  1461. $sql .= " WHERE relation_type = $with_status ";
  1462. }
  1463. $result = Database::query($sql);
  1464. while ($row = Database::fetch_array($result,'ASSOC')) {
  1465. $return_array[] = $row;
  1466. }
  1467. return $return_array;
  1468. }
  1469. /**
  1470. * The general coach (field: session.id_coach)
  1471. * @param int user id
  1472. */
  1473. public static function get_sessions_by_general_coach($user_id) {
  1474. $session_table = Database::get_main_table(TABLE_MAIN_SESSION);
  1475. $user_id = intval($user_id);
  1476. // session where we are general coach
  1477. $sql = "SELECT DISTINCT *
  1478. FROM $session_table
  1479. WHERE id_coach = $user_id";
  1480. if (api_is_multiple_url_enabled()) {
  1481. $tbl_session_rel_access_url= Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_SESSION);
  1482. $access_url_id = api_get_current_access_url_id();
  1483. if ($access_url_id != -1) {
  1484. $sql = 'SELECT DISTINCT session.*
  1485. FROM '.$session_table.' session INNER JOIN '.$tbl_session_rel_access_url.' session_rel_url
  1486. ON (session.id = session_rel_url.session_id)
  1487. WHERE id_coach = '.$user_id.' AND access_url_id = '.$access_url_id;
  1488. }
  1489. }
  1490. $sql .= ' ORDER by name';
  1491. $result = Database::query($sql);
  1492. return Database::store_result($result, 'ASSOC');
  1493. }
  1494. public static function get_sessions_by_coach($user_id) {
  1495. $session_table = Database::get_main_table(TABLE_MAIN_SESSION);
  1496. return Database::select('*', $session_table, array('where'=>array('id_coach = ?'=>$user_id)));
  1497. }
  1498. public static function get_user_status_in_course_session($user_id, $course_code, $session_id) {
  1499. $tbl_session_rel_course_rel_user = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER);
  1500. $tbl_user = Database::get_main_table(TABLE_MAIN_USER);
  1501. $sql = "SELECT session_rcru.status
  1502. FROM $tbl_session_rel_course_rel_user session_rcru, $tbl_user user
  1503. WHERE session_rcru.id_user = user.user_id AND
  1504. session_rcru.id_session = '".intval($session_id)."' AND
  1505. session_rcru.course_code ='".Database::escape_string($course_code)."' AND
  1506. user.user_id = ".intval($user_id);
  1507. $result = Database::query($sql);
  1508. $status = false;
  1509. if (Database::num_rows($result)) {
  1510. $status = Database::fetch_row($result);
  1511. $status = $status['0'];
  1512. }
  1513. return $status;
  1514. }
  1515. /**
  1516. * Gets user status within a session
  1517. * @param $user_id
  1518. * @param $course_code
  1519. * @param $session_id
  1520. * @return unknown_type
  1521. */
  1522. public static function get_user_status_in_session($user_id, $course_code, $session_id) {
  1523. $tbl_session_rel_course_rel_user = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER);
  1524. $tbl_user = Database::get_main_table(TABLE_MAIN_USER);
  1525. $sql = "SELECT session_rcru.status
  1526. FROM $tbl_session_rel_course_rel_user session_rcru, $tbl_user user
  1527. WHERE session_rcru.id_user = user.user_id AND
  1528. session_rcru.id_session = '".intval($session_id)."' AND
  1529. session_rcru.course_code ='".Database::escape_string($course_code)."' AND
  1530. user.user_id = ".intval($user_id);
  1531. $result = Database::query($sql);
  1532. $status = false;
  1533. if (Database::num_rows($result)) {
  1534. $status = Database::fetch_row($result);
  1535. $status = $status['0'];
  1536. }
  1537. return $status;
  1538. }
  1539. static function get_all_sessions_by_promotion($id) {
  1540. $t = Database::get_main_table(TABLE_MAIN_SESSION);
  1541. return Database::select('*', $t, array('where'=>array('promotion_id = ?'=>$id)));
  1542. }
  1543. static function suscribe_sessions_to_promotion($promotion_id, $list) {
  1544. $t = Database::get_main_table(TABLE_MAIN_SESSION);
  1545. $params = array();
  1546. $params['promotion_id'] = 0;
  1547. Database::update($t, $params, array('promotion_id = ?'=>$promotion_id));
  1548. $params['promotion_id'] = $promotion_id;
  1549. if (!empty($list)) {
  1550. foreach ($list as $session_id) {
  1551. $session_id= intval($session_id);
  1552. Database::update($t, $params, array('id = ?'=>$session_id));
  1553. }
  1554. }
  1555. }
  1556. /**
  1557. * Updates a session status
  1558. * @param int session id
  1559. * @param int status
  1560. */
  1561. public static function set_session_status($session_id, $status) {
  1562. $t = Database::get_main_table(TABLE_MAIN_SESSION);
  1563. $params['visibility'] = $status;
  1564. Database::update($t, $params, array('id = ?'=>$session_id));
  1565. }
  1566. /**
  1567. * Copies a session with the same data to a new session.
  1568. * The new copy is not assigned to the same promotion. @see suscribe_sessions_to_promotions() for that
  1569. * @param int Session ID
  1570. * @param bool Whether to copy the relationship with courses
  1571. * @param bool Whether to copy the relationship with users
  1572. * @param bool New courses will be created
  1573. * @return int The new session ID on success, 0 otherwise
  1574. * @todo make sure the extra session fields are copied too
  1575. */
  1576. /**
  1577. * @param $id
  1578. * @param $copy_courses
  1579. * @param $copy_users
  1580. * @param $create_new_courses
  1581. * @param $set_exercises_lp_invisible
  1582. * @return int
  1583. */
  1584. public function copy_session($id, $copy_courses = true, $copy_users = true, $create_new_courses = false, $set_exercises_lp_invisible = false) {
  1585. $id = intval($id);
  1586. $s = self::fetch($id);
  1587. $s['year_start'] = substr($s['date_start'],0,4);
  1588. $s['month_start'] = substr($s['date_start'],5,2);
  1589. $s['day_start'] = substr($s['date_start'],8,2);
  1590. $s['year_end'] = substr($s['date_end'],0,4);
  1591. $s['month_end'] = substr($s['date_end'],5,2);
  1592. $s['day_end'] = substr($s['date_end'],8,2);
  1593. $consider_start = true;
  1594. if ($s['year_start'].'-'.$s['month_start'].'-'.$s['day_start'] == '0000-00-00') {
  1595. $consider_start = false;
  1596. }
  1597. $consider_end = true;
  1598. if ($s['year_end'].'-'.$s['month_end'].'-'.$s['day_end'] == '0000-00-00') {
  1599. $consider_end = false;
  1600. }
  1601. $sid = self::create_session($s['name'].' '.get_lang('CopyLabelSuffix'),
  1602. $s['year_start'], $s['month_start'], $s['day_start'],
  1603. $s['year_end'],$s['month_end'],$s['day_end'],
  1604. $s['nb_days_acess_before_beginning'],$s['nb_days_acess_after_end'],
  1605. false,(int)$s['id_coach'], $s['session_category_id'],
  1606. (int)$s['visibility'],$consider_start, $consider_end, true);
  1607. if (!is_numeric($sid) || empty($sid)) {
  1608. return false;
  1609. }
  1610. if ($copy_courses) {
  1611. // Register courses from the original session to the new session
  1612. $courses = self::get_course_list_by_session_id($id);
  1613. $short_courses = $new_short_courses = array();
  1614. if (is_array($courses) && count($courses)>0) {
  1615. foreach ($courses as $course) {
  1616. $short_courses[] = $course;
  1617. }
  1618. }
  1619. $courses = null;
  1620. //We will copy the current courses of the session to new courses
  1621. if (!empty($short_courses)) {
  1622. if ($create_new_courses) {
  1623. //Just in case
  1624. if (function_exists('ini_set')) {
  1625. api_set_memory_limit('256M');
  1626. ini_set('max_execution_time',0);
  1627. }
  1628. $params = array();
  1629. $params['skip_lp_dates'] = true;
  1630. foreach ($short_courses as $course_data) {
  1631. $course_info = CourseManager::copy_course_simple($course_data['title'].' '.get_lang('CopyLabelSuffix'), $course_data['course_code'], $id, $sid, $params);
  1632. if ($course_info) {
  1633. //By default new elements are invisible
  1634. if ($set_exercises_lp_invisible) {
  1635. require_once api_get_path(SYS_CODE_PATH).'newscorm/learnpathList.class.php';
  1636. $list = new LearnpathList('', $course_info['code'], $sid);
  1637. $flat_list = $list->get_flat_list();
  1638. if (!empty($flat_list)) {
  1639. foreach($flat_list as $lp_id => $data) {
  1640. api_item_property_update($course_info, TOOL_LEARNPATH, $lp_id, 'invisible', api_get_user_id(), 0 ,0, 0, 0, $sid);
  1641. api_item_property_update($course_info, TOOL_LEARNPATH, $lp_id, 'invisible', api_get_user_id(), 0 ,0, 0, 0);
  1642. }
  1643. }
  1644. $quiz_table = Database::get_course_table(TABLE_QUIZ_TEST);
  1645. $course_id = $course_info['real_id'];
  1646. //@todo check this query
  1647. $sql = "UPDATE $quiz_table SET active = 0 WHERE c_id = $course_id ";
  1648. $result=Database::query($sql);
  1649. }
  1650. $new_short_courses[] = $course_info['code'];
  1651. }
  1652. }
  1653. } else {
  1654. foreach($short_courses as $course_data) {
  1655. $new_short_courses[] = $course_data['code'];
  1656. }
  1657. }
  1658. $short_courses = $new_short_courses;
  1659. $res = self::add_courses_to_session($sid, $short_courses, true);
  1660. $short_courses = null;
  1661. }
  1662. }
  1663. if ($copy_users) {
  1664. // Register users from the original session to the new session
  1665. $users = self::get_users_by_session($id);
  1666. $short_users = array();
  1667. if (is_array($users) && count($users)>0) {
  1668. foreach ($users as $user) {
  1669. $short_users[] = $user['user_id'];
  1670. }
  1671. }
  1672. $users = null;
  1673. //Subscribing in read only mode
  1674. $res = self::suscribe_users_to_session($sid, $short_users, SESSION_VISIBLE_READ_ONLY, true, false);
  1675. $short_users = null;
  1676. }
  1677. return $sid;
  1678. }
  1679. static function user_is_general_coach($user_id, $session_id) {
  1680. $session_id = intval($session_id);
  1681. $user_id = intval($user_id);
  1682. $session_table = Database::get_main_table(TABLE_MAIN_SESSION);
  1683. $sql = "SELECT DISTINCT id
  1684. FROM $session_table
  1685. WHERE session.id_coach = '".$user_id."' AND id = '$session_id'";
  1686. $result = Database::query($sql);
  1687. if ($result && Database::num_rows($result)) {
  1688. return true;
  1689. }
  1690. return false;
  1691. }
  1692. /**
  1693. * Get the number of sessions
  1694. * @param int ID of the URL we want to filter on (optional)
  1695. * @return int Number of sessions
  1696. */
  1697. public static function count_sessions($access_url_id=null) {
  1698. $session_table = Database::get_main_table(TABLE_MAIN_SESSION);
  1699. $access_url_rel_session_table = Database::get_main_table(TABLE_MAIN_ACCESS_URL_REL_SESSION);
  1700. $sql = "SELECT count(id) FROM $session_table s";
  1701. if (!empty($access_url_id) && $access_url_id == intval($access_url_id)) {
  1702. $sql .= ", $access_url_rel_session_table u ".
  1703. " WHERE s.id = u.session_id AND u.access_url_id = $access_url_id";
  1704. }
  1705. $res = Database::query($sql);
  1706. $row = Database::fetch_row($res);
  1707. return $row[0];
  1708. }
  1709. static function protect_session_edit($id) {
  1710. api_protect_admin_script(true);
  1711. $session_info = self::fetch($id);
  1712. if (!api_is_platform_admin() && api_get_setting('allow_session_admins_to_manage_all_sessions') != 'true') {
  1713. if ($session_info['session_admin_id'] != api_get_user_id()) {
  1714. api_not_allowed(true);
  1715. }
  1716. }
  1717. }
  1718. /**
  1719. * @param $course_code
  1720. * @return array
  1721. */
  1722. public static function get_session_by_course($course_code) {
  1723. $table_session_course = Database::get_main_table(TABLE_MAIN_SESSION_COURSE);
  1724. $table_session = Database::get_main_table(TABLE_MAIN_SESSION);
  1725. $course_code = Database::escape_string($course_code);
  1726. $sql = "SELECT name, s.id FROM $table_session_course sc INNER JOIN $table_session s ON (sc.id_session = s.id)
  1727. WHERE sc.course_code = '$course_code' ";
  1728. $result = Database::query($sql);
  1729. return Database::store_result($result);
  1730. }
  1731. /**
  1732. * @param int $user_id
  1733. * @param bool $ignore_visibility_for_admins
  1734. * @return array
  1735. */
  1736. public static function get_sessions_by_user($user_id, $ignore_visibility_for_admins = false)
  1737. {
  1738. $session_categories = UserManager::get_sessions_by_category($user_id, false, $ignore_visibility_for_admins);
  1739. $session_array = array();
  1740. if (!empty($session_categories)) {
  1741. foreach ($session_categories as $category) {
  1742. if (isset($category['sessions'])) {
  1743. foreach ($category['sessions'] as $session) {
  1744. $session_array[] = $session;
  1745. }
  1746. }
  1747. }
  1748. }
  1749. return $session_array;
  1750. }
  1751. /**
  1752. * @param string $file
  1753. * @param bool $updatesession options:
  1754. * true: if the session exists it will be updated
  1755. * false: if session exists a new session will be created adding a counter session1, session2, etc
  1756. * @param int $user_id
  1757. * @param $logger
  1758. * @param array convert a file row to an extra field. Example in CSV file there's a SessionID then it will
  1759. * converted to extra_external_session_id if you set this: array('SessionId' => 'extra_external_session_id')
  1760. * @param array extra fields
  1761. * @param string extra field id
  1762. * @param int $daysCoachAccessBeforeBeginning
  1763. * @param int $daysCoachAccessAfterBeginning
  1764. * @param int $sessionVisibility
  1765. * @return array
  1766. */
  1767. static function importCSV(
  1768. $file,
  1769. $updatesession,
  1770. $defaultUserId = null,
  1771. $logger = null,
  1772. $extraFields = array(),
  1773. $extraFieldId = null,
  1774. $daysCoachAccessBeforeBeginning = null,
  1775. $daysCoachAccessAfterBeginning = null,
  1776. $sessionVisibility = 1,
  1777. $fieldsToAvoidUpdate = array()
  1778. )
  1779. {
  1780. $content = file($file);
  1781. $error_message = null;
  1782. $session_counter = 0;
  1783. if (empty($defaultUserId)) {
  1784. $defaultUserId = api_get_user_id();
  1785. }
  1786. $eol = PHP_EOL;
  1787. if (PHP_SAPI !='cli') {
  1788. $eol = '<br />';
  1789. }
  1790. $debug = false;
  1791. if (isset($logger)) {
  1792. $debug = true;
  1793. }
  1794. $extraParameters = null;
  1795. if (!empty($daysCoachAccessBeforeBeginning) && !empty($daysCoachAccessAfterBeginning)) {
  1796. $extraParameters .= ' , nb_days_access_before_beginning = '.intval($daysCoachAccessBeforeBeginning);
  1797. $extraParameters .= ' , nb_days_access_after_end = '.intval($daysCoachAccessAfterBeginning);
  1798. }
  1799. $tbl_session = Database::get_main_table(TABLE_MAIN_SESSION);
  1800. $tbl_session_user = Database::get_main_table(TABLE_MAIN_SESSION_USER);
  1801. $tbl_session_course = Database::get_main_table(TABLE_MAIN_SESSION_COURSE);
  1802. $tbl_session_course_user = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER);
  1803. $sessions = array();
  1804. if (!api_strstr($content[0], ';')) {
  1805. $error_message = get_lang('NotCSV');
  1806. } else {
  1807. $tag_names = array();
  1808. foreach ($content as $key => $enreg) {
  1809. $enreg = explode(';', trim($enreg));
  1810. if ($key) {
  1811. foreach ($tag_names as $tag_key => $tag_name) {
  1812. $sessions[$key - 1][$tag_name] = $enreg[$tag_key];
  1813. }
  1814. } else {
  1815. foreach ($enreg as $tag_name) {
  1816. $tag_names[] = api_preg_replace('/[^a-zA-Z0-9_\-]/', '', $tag_name);
  1817. }
  1818. if (!in_array('SessionName', $tag_names) || !in_array('DateStart', $tag_names) || !in_array('DateEnd', $tag_names)) {
  1819. $error_message = get_lang('NoNeededData');
  1820. break;
  1821. }
  1822. }
  1823. }
  1824. // Looping the sessions.
  1825. foreach ($sessions as $enreg) {
  1826. $user_counter = 0;
  1827. $course_counter = 0;
  1828. if (isset($extraFields) && !empty($extraFields)) {
  1829. foreach ($extraFields as $original => $to) {
  1830. $enreg[$to] = $enreg[$original];
  1831. }
  1832. }
  1833. $session_name = Database::escape_string($enreg['SessionName']);
  1834. $date_start = $enreg['DateStart'];
  1835. $date_end = $enreg['DateEnd'];
  1836. $visibility = isset($enreg['Visibility']) ? $enreg['Visibility'] : $sessionVisibility;
  1837. $session_category_id = isset($enreg['SessionCategory']) ? $enreg['SessionCategory'] : null;
  1838. $sessionDescription = isset($enreg['SessionDescription']) ? $enreg['SessionDescription'] : null;
  1839. $extraSessionParameters = null;
  1840. if (!empty($sessionDescription)) {
  1841. $extraSessionParameters = " , description = '".Database::escape_string($sessionDescription)."'";
  1842. }
  1843. // Searching a general coach.
  1844. if (!empty($enreg['Coach'])) {
  1845. $coach_id = UserManager::get_user_id_from_username($enreg['Coach']);
  1846. if ($coach_id === false) {
  1847. // If the coach-user does not exist - I'm the coach.
  1848. $coach_id = $defaultUserId;
  1849. }
  1850. } else {
  1851. $coach_id = $defaultUserId;
  1852. }
  1853. if (!$updatesession) {
  1854. // Always create a session.
  1855. $unique_name = false; // This MUST be initializead.
  1856. $i = 0;
  1857. // Change session name, verify that session doesn't exist.
  1858. $suffix = null;
  1859. while (!$unique_name) {
  1860. if ($i > 1) {
  1861. $suffix = ' - '.$i;
  1862. }
  1863. $sql = 'SELECT 1 FROM '.$tbl_session.' WHERE name="'.$session_name.$suffix.'"';
  1864. $rs = Database::query($sql);
  1865. if (Database::result($rs, 0, 0)) {
  1866. $i++;
  1867. } else {
  1868. $unique_name = true;
  1869. $session_name .= $suffix;
  1870. }
  1871. }
  1872. // Creating the session.
  1873. $sql_session = "INSERT IGNORE INTO $tbl_session SET
  1874. name = '".$session_name."',
  1875. id_coach = '$coach_id',
  1876. date_start = '$date_start',
  1877. date_end = '$date_end',
  1878. visibility = '$visibility',
  1879. session_category_id = '$session_category_id',
  1880. session_admin_id=".intval($defaultUserId).$extraParameters.$extraSessionParameters;
  1881. Database::query($sql_session);
  1882. $session_id = Database::insert_id();
  1883. if ($debug) {
  1884. if ($session_id) {
  1885. foreach ($enreg as $key => $value) {
  1886. if (substr($key, 0, 6) == 'extra_') { //an extra field
  1887. self::update_session_extra_field_value($session_id, substr($key, 6), $value);
  1888. }
  1889. }
  1890. $logger->addInfo("Sessions - Session created: #$session_id - $session_name");
  1891. } else {
  1892. $logger->addError("Sessions - Session NOT created: $session_name");
  1893. }
  1894. }
  1895. $session_counter++;
  1896. } else {
  1897. $sessionId = null;
  1898. if (isset($extraFields) && !empty($extraFields)) {
  1899. $sessionId = self::get_session_id_from_original_id($enreg['extra_'.$extraFieldId], $extraFieldId);
  1900. if (empty($sessionId)) {
  1901. $my_session_result = false;
  1902. } else {
  1903. $my_session_result = true;
  1904. }
  1905. } else {
  1906. $my_session_result = self::get_session_by_name($enreg['SessionName']);
  1907. }
  1908. if ($my_session_result === false) {
  1909. // Creating a session.
  1910. $sql_session = "INSERT IGNORE INTO $tbl_session SET
  1911. name = '$session_name',
  1912. id_coach = '$coach_id',
  1913. date_start = '$date_start',
  1914. date_end = '$date_end',
  1915. visibility = '$visibility',
  1916. session_category_id = '$session_category_id' ".$extraParameters.$extraSessionParameters;
  1917. Database::query($sql_session);
  1918. // We get the last insert id.
  1919. $my_session_result = SessionManager::get_session_by_name($enreg['SessionName']);
  1920. $session_id = $my_session_result['id'];
  1921. if ($debug) {
  1922. if ($session_id) {
  1923. foreach ($enreg as $key => $value) {
  1924. if (substr($key, 0, 6) == 'extra_') { //an extra field
  1925. self::update_session_extra_field_value($session_id, substr($key, 6), $value);
  1926. }
  1927. }
  1928. $logger->addInfo("Sessions - #$session_id created: $session_name");
  1929. } else {
  1930. $logger->addError("Sessions - Session NOT created: $session_name");
  1931. }
  1932. }
  1933. } else {
  1934. $params = array(
  1935. 'id_coach' => $coach_id,
  1936. 'date_start' => $date_start,
  1937. 'date_end' => $date_end,
  1938. 'visibility' => $visibility,
  1939. 'session_category_id' => $session_category_id
  1940. );
  1941. if (!empty($sessionDescription)) {
  1942. $params['description'] = $sessionDescription;
  1943. }
  1944. if (!empty($fieldsToAvoidUpdate)) {
  1945. foreach ($fieldsToAvoidUpdate as $field) {
  1946. unset($params[$field]);
  1947. }
  1948. }
  1949. if (isset($sessionId) && !empty($sessionId)) {
  1950. // The session already exists, update it then.
  1951. Database::update($tbl_session, $params, array('id = ?' => $sessionId));
  1952. $session_id = $sessionId;
  1953. } else {
  1954. Database::update($tbl_session, $params, array("name = '?' " => $enreg['SessionName']));
  1955. $row = Database::query("SELECT id FROM $tbl_session WHERE name = '$session_name'");
  1956. list($session_id) = Database::fetch_array($row);
  1957. }
  1958. foreach ($enreg as $key => $value) {
  1959. if (substr($key, 0, 6) == 'extra_') { //an extra field
  1960. self::update_session_extra_field_value($session_id, substr($key, 6), $value);
  1961. }
  1962. }
  1963. Database::query("DELETE FROM $tbl_session_user WHERE id_session='$session_id'");
  1964. Database::query("DELETE FROM $tbl_session_course WHERE id_session='$session_id'");
  1965. Database::query("DELETE FROM $tbl_session_course_user WHERE id_session='$session_id'");
  1966. }
  1967. $session_counter++;
  1968. }
  1969. $users = explode('|', $enreg['Users']);
  1970. // Adding the relationship "Session - User".
  1971. if (is_array($users)) {
  1972. foreach ($users as $user) {
  1973. $user_id = UserManager::get_user_id_from_username($user);
  1974. if ($user_id !== false) {
  1975. // Insert new users.
  1976. $sql = "INSERT IGNORE INTO $tbl_session_user SET
  1977. id_user = '$user_id',
  1978. id_session = '$session_id'";
  1979. Database::query($sql);
  1980. if ($debug) {
  1981. $logger->addInfo("Sessions - Adding User #$user_id ($user) to session #$session_id");
  1982. }
  1983. $user_counter++;
  1984. }
  1985. }
  1986. }
  1987. $courses = explode('|', $enreg['Courses']);
  1988. foreach ($courses as $course) {
  1989. $course_code = api_strtoupper(api_substr($course, 0, api_strpos($course, '[')));
  1990. if (CourseManager::course_exists($course_code)) {
  1991. // Adding the course to a session.
  1992. $sql_course = "INSERT IGNORE INTO $tbl_session_course
  1993. SET course_code = '$course_code', id_session='$session_id'";
  1994. Database::query($sql_course);
  1995. if ($debug) {
  1996. $logger->addInfo("Sessions - Adding course '$course_code' to session #$session_id");
  1997. }
  1998. $course_counter++;
  1999. $pattern = "/\[(.*?)\]/";
  2000. preg_match_all($pattern, $course, $matches);
  2001. if (isset($matches[1])) {
  2002. $course_coaches = $matches[1][0];
  2003. $course_users = $matches[1][1];
  2004. }
  2005. $course_users = explode(',', $course_users);
  2006. $course_coaches = explode(',', $course_coaches);
  2007. // Adding coaches to session course user
  2008. if (!empty($course_coaches)) {
  2009. $savedCoaches = array();
  2010. // Adding course teachers as course session teachers
  2011. $alreadyAddedTeachers = CourseManager::get_teacher_list_from_course_code($course_code);
  2012. if (!empty($alreadyAddedTeachers)) {
  2013. $teachersToAdd = array();
  2014. foreach ($alreadyAddedTeachers as $user) {
  2015. $teachersToAdd[] = $user['username'];
  2016. }
  2017. $course_coaches = array_merge($course_coaches, $teachersToAdd);
  2018. }
  2019. foreach ($course_coaches as $course_coach) {
  2020. $course_coach = trim($course_coach);
  2021. $coach_id = UserManager::get_user_id_from_username($course_coach);
  2022. if ($coach_id !== false) {
  2023. $sql = "INSERT IGNORE INTO $tbl_session_course_user SET
  2024. id_user = '$coach_id',
  2025. course_code = '$course_code',
  2026. id_session = '$session_id',
  2027. status = 2 ";
  2028. Database::query($sql);
  2029. if ($debug) {
  2030. $logger->addInfo("Sessions - Adding course coach: user #$coach_id ($course_coach) to course: '$course_code' and session #$session_id");
  2031. }
  2032. $savedCoaches[] = $coach_id;
  2033. } else {
  2034. $error_message .= get_lang('UserDoesNotExist').' : '.$course_coach.$eol;
  2035. }
  2036. }
  2037. }
  2038. $users_in_course_counter = 0;
  2039. // Adding the relationship "Session - Course - User".
  2040. foreach ($course_users as $user) {
  2041. $user = trim($user);
  2042. $user_id = UserManager::get_user_id_from_username($user);
  2043. if ($user_id !== false) {
  2044. $sql = "INSERT IGNORE INTO $tbl_session_course_user SET
  2045. id_user='$user_id',
  2046. course_code='$course_code',
  2047. id_session = '$session_id'";
  2048. Database::query($sql);
  2049. if ($debug) {
  2050. $logger->addInfo("Sessions - Adding student: user #$user_id ($user) to course: '$course_code' and session #$session_id");
  2051. }
  2052. $users_in_course_counter++;
  2053. } else {
  2054. $error_message .= get_lang('UserDoesNotExist').': '.$user.$eol;
  2055. }
  2056. }
  2057. $sql = "UPDATE $tbl_session_course SET nbr_users='$users_in_course_counter' WHERE course_code='$course_code'";
  2058. Database::query($sql);
  2059. $course_info = CourseManager::get_course_information($course_code);
  2060. $inserted_in_course[$course_code] = $course_info['title'];
  2061. }
  2062. }
  2063. $access_url_id = api_get_current_access_url_id();
  2064. UrlManager::add_session_to_url($session_id, $access_url_id);
  2065. $sql_update_users = "UPDATE $tbl_session SET nbr_users='$user_counter', nbr_courses='$course_counter' WHERE id='$session_id'";
  2066. Database::query($sql_update_users);
  2067. }
  2068. }
  2069. return array(
  2070. 'error_message' => $error_message,
  2071. 'session_counter' => $session_counter
  2072. );
  2073. }
  2074. /**
  2075. * @param int $sessionId
  2076. * @param string $courseCode
  2077. * @return array
  2078. */
  2079. public static function getCoachesByCourseSession($sessionId, $courseCode)
  2080. {
  2081. $tbl_session_rel_course_rel_user = Database::get_main_table(TABLE_MAIN_SESSION_COURSE_USER);
  2082. $sessionId = intval($sessionId);
  2083. $courseCode = Database::escape_string($courseCode);
  2084. $sql = "SELECT id_user FROM $tbl_session_rel_course_rel_user WHERE id_session = '$sessionId' AND course_code = '$courseCode' AND status = 2";
  2085. $result = Database::query($sql);
  2086. $coaches = array();
  2087. if (Database::num_rows($result) > 0) {
  2088. while ($row = Database::fetch_row($result)) {
  2089. $coaches[] = $row[0];
  2090. }
  2091. }
  2092. return $coaches;
  2093. }
  2094. /**
  2095. * @param int $userId
  2096. * @return array
  2097. */
  2098. public static function getAllCoursesFromAllSessionFromDrh($userId)
  2099. {
  2100. $sessions = SessionManager::get_sessions_followed_by_drh($userId);
  2101. $coursesFromSession = array();
  2102. if (!empty($sessions)) {
  2103. foreach ($sessions as $session) {
  2104. $courseList = SessionManager::get_course_list_by_session_id($session['id']);
  2105. foreach ($courseList as $course) {
  2106. $coursesFromSession[] = $course['code'];
  2107. }
  2108. }
  2109. }
  2110. return $coursesFromSession;
  2111. }
  2112. /**
  2113. * @param int $userId
  2114. * @return array
  2115. */
  2116. public static function getAllUsersFromCoursesFromAllSessionFromDrh($userId)
  2117. {
  2118. $sessions = SessionManager::get_sessions_followed_by_drh($userId);
  2119. $userList = array();
  2120. if (!empty($sessions)) {
  2121. foreach ($sessions as $session) {
  2122. $courseList = SessionManager::get_course_list_by_session_id($session['id']);
  2123. foreach ($courseList as $course) {
  2124. $users = CourseManager::get_user_list_from_course_code($course['code'], $session['id']);
  2125. foreach ($users as $user) {
  2126. $userList[] = $user['user_id'];
  2127. }
  2128. }
  2129. }
  2130. }
  2131. return $userList;
  2132. }
  2133. }