assessment.php 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878
  1. <?php
  2. /****************************
  3. * File : assessment.php
  4. * Author : Cygnusa
  5. * @2018
  6. ****************************/
  7. //SECURITY
  8. if ( ! defined('APPLICATION_PATH')) exit('No direct script access allowed');
  9. //FUNCTION LISTS
  10. class assessment
  11. {
  12. function __construct($parent)
  13. {
  14. //GET PAGE MESSAGE
  15. $this->page_data=globalfunc::getMessage($parent,$parent->lang,'assessment');
  16. if(count($parent->params)==0)
  17. {
  18. $this->assessmentfunc($parent);
  19. }else
  20. {
  21. $qry_params=explode ("?",$parent->params[0]);
  22. $parameter_val=strtolower($qry_params[0]);
  23. if(strtolower($parent->device_type)=='app')
  24. {
  25. switch($parameter_val){
  26. case "question":
  27. case "startexam":
  28. case "review":
  29. case "assessment_status":
  30. $this->$parameter_val($parent );
  31. break;
  32. default:
  33. $this->assessmentfunc($parent);
  34. break;
  35. }
  36. }else if(strtolower($parent->device_type)=='web')
  37. {
  38. switch($parameter_val){
  39. case "question":
  40. case "startexam":
  41. case "review":
  42. case "assessment_status":
  43. $this->$parameter_val($parent );
  44. break;
  45. default:
  46. $this->assessmentfunc($parent);
  47. break;
  48. }
  49. }
  50. }
  51. $parent->response(array('response'=>'failed', 'message' => 'PAGE NOT FOUND'), 404);
  52. }
  53. /* /////////////////////////////// ASSESSMENT MAIN FUNCTION //////////////////////////////////////////////// */
  54. private function assessmentfunc($parent){
  55. globalfunc::checkMethodType($parent,array('GET','POST'));
  56. switch ($parent->get_request_method()){
  57. case "GET":
  58. globalfunc::checkParamCount($parent,0);
  59. globalfunc::checkAuthrozation($parent,array('type'=>'user'));
  60. //USER COND
  61. $user_cond_arr=projectfunc::getUserAssessmentCond($parent);
  62. $user_cond=" AND ".@implode(' AND ',$user_cond_arr);
  63. //NEW ROLE CONDITION
  64. //$user_cond.=($parent->current_user_role>7 && $parent->current_user_role<14)?" AND a.user_type=0 ":" AND a.user_type=1 ";
  65. //NEW MANANGER LEVEL
  66. //ALTER TABLE `tbl__assessment` CHANGE `user_type` `user_type` TINYINT(1) NOT NULL DEFAULT '0' COMMENT '0- Normal DSE, 1-Super bike, 2-HO, 3-ZM, 4-Trainer, 5-RM, 6-AM, 7-Dealer, 8-Customer Experience';
  67. switch($parent->current_user_role)
  68. {
  69. //NORMAL DSE
  70. case '8':
  71. case '9':
  72. case '10':
  73. case '11':
  74. case '12':
  75. case '13':
  76. $user_cond.=" AND a.user_type=0 ";
  77. break;
  78. //International Bike Sales Executive
  79. case '15':
  80. $user_cond.=" AND a.user_type=1 ";
  81. break;
  82. //HO Manager
  83. case '3':
  84. $user_cond.=" AND a.user_type=2 ";
  85. break;
  86. //Zonal Manager
  87. case '4':
  88. $user_cond.=" AND a.user_type=3 ";
  89. break;
  90. //Trainer
  91. case '5':
  92. $user_cond.=" AND a.user_type=4 ";
  93. break;
  94. //Regional Manager
  95. case '6':
  96. $user_cond.=" AND a.user_type=5 ";
  97. break;
  98. //Area Manager
  99. case '7':
  100. $user_cond.=" AND a.user_type=6 ";
  101. break;
  102. //Dealer
  103. case '14':
  104. $user_cond.=" AND a.user_type=7 ";
  105. break;
  106. //Customer Experience
  107. case '16':
  108. $user_cond.=" AND a.user_type=8 ";
  109. break;
  110. //Customer Experience
  111. case '17':
  112. $user_cond.=" AND a.user_type=9 ";
  113. break;
  114. }
  115. //NEW SEGMENT CONDITION
  116. if($parent->current_user_role>7 && $parent->current_user_role<14)
  117. {
  118. $user_cond.=" AND (a.segment='0' OR a.segment='".$parent->current_user_data->segment."')";
  119. }
  120. $status_arr=array();
  121. //TRAINING VALIDATION
  122. //$assessment_str = "SELECT a.*,au.attemptslimit,au.publisheddate,au.enddate FROM ".TABLE_ASSESSMENT_USER." as au JOIN ".TABLE_ASSESSMENT." as a ON au.assessmentid=a.assessmentid WHERE a.status='1' AND a.assettypeid='1' AND au.status='1' AND au.userid='".$parent->current_user_id."' AND au.publisheddate<='".NOW."' ".$user_cond;
  123. $assessment_str = "SELECT a.* FROM ".TABLE_ASSESSMENT." as a WHERE a.status='1' AND a.assettypeid='1' AND a.publisheddate<='".NOW."' ".$user_cond." ORDER BY a.publisheddate DESC";
  124. $assessment_arr=$parent->getQueryValue($assessment_str);
  125. //$parent->executeQuery("INSERT INTO `".TABLE_QUERY_LOG."`( `query_str`, `query_type`, `created_on`) VALUES ('". escape_str($assessment_str)."', 'assessment', '".NOW."')");
  126. if(count($assessment_arr)>0)
  127. {
  128. //GET ALL STATUS
  129. $status_str = "SELECT * FROM ".TABLE_STATUS;
  130. $status_res_arr=$parent->getQueryValue($status_str);
  131. //print_r($status_res_arr);
  132. if(count($status_res_arr)>0)
  133. {
  134. foreach($status_res_arr as $res)
  135. {
  136. $obj_key=$res->statusid;
  137. $status_arr[$obj_key]=$res->status;
  138. }
  139. }
  140. /*
  141. * 1 Active
  142. //2 Inactive
  143. 3 Completed
  144. //4 In Progress
  145. //5 Published
  146. //6 Closed
  147. 7 Not started
  148. 8 Expired
  149. *
  150. */
  151. //S3 OBJECT
  152. $s3=awsfileserver::connectS3();
  153. //ADD EXTRA FIELDS
  154. foreach($assessment_arr as $key=>$res_assessment)
  155. {
  156. //assessmenttype 0-Offline,1-Online
  157. $assessment_arr[$key]->assessmenttype_str=($res_assessment->assessmenttype=='0')?'Offline':'Online';
  158. $assessment_arr[$key]->is_expired ='0';
  159. //CHECK ALREADY ATTENDTED
  160. $assessment_result_str = "SELECT * FROM ".TABLE_ASSESSMENTRESULT." WHERE assessmentid='".$res_assessment->assessmentid."' AND userid='".$parent->current_user_id."' ORDER BY arid DESC";
  161. $assessment_result_arr=$parent->getQueryValue($assessment_result_str);
  162. if(count($assessment_result_arr)>0)
  163. {
  164. // 3-Completed , 4 - In Progress
  165. $assessment_arr[$key]->status =($assessment_result_arr[0]->status=='1')?'3':'1';
  166. $res_assessment->status = $assessment_arr[$key]->status;
  167. } else {
  168. $assessment_arr[$key]->status ='7';
  169. $res_assessment->status = $assessment_arr[$key]->status;
  170. }
  171. //EXPIRED
  172. if(strtotime($res_assessment->enddate)<strtotime(NOW) AND count($assessment_result_arr)==0 )
  173. {
  174. $assessment_arr[$key]->is_expired='1';
  175. $assessment_arr[$key]->status = '8';
  176. $res_assessment->status = '8';
  177. }
  178. //STATUS STRING
  179. $assessment_arr[$key]->statusname=(isset($status_arr[$res_assessment->status]))?$status_arr[$res_assessment->status]:"";
  180. //ATTEMPT TIME
  181. $attempt_time_str = "SELECT * FROM ".TABLE_ASSESSMENTRESULT." WHERE assessmentid='".$res_assessment->assessmentid."' AND userid='".$parent->current_user_id."' ORDER by attempt_time DESC";
  182. $attempt_time_arr=$parent->getQueryValue($attempt_time_str);
  183. $assessment_arr[$key]->attempt_time=(count($attempt_time_arr)>0)?$attempt_time_arr[0]->attempt_time:0;
  184. //IS ATTENDED
  185. $assessment_arr[$key]->is_attended='0';
  186. $assessment_arr[$key]->completed_time='';
  187. //HIGHSCORE
  188. $assessment_arr[$key]->highscore='0';
  189. if(count($attempt_time_arr)>0)
  190. {
  191. $user_assessment_score_arr=array_column($attempt_time_arr,'percentage_score');
  192. rsort( $user_assessment_score_arr);
  193. $assessment_arr[$key]->highscore=(string)$user_assessment_score_arr[0];
  194. $assessment_arr[$key]->is_attended='1';
  195. $assessment_arr[$key]->completed_time=$attempt_time_arr[0]->enddatetime;
  196. }
  197. }
  198. }
  199. //LOG
  200. $logstr='ASSESSMENT LIST';
  201. globalfunc::insertUserLog($parent,$logstr);
  202. $parent->response(array('response'=>'success', 'data'=>$assessment_arr, 'message'=>$this->page_data['success1']),200);
  203. break;
  204. case "POST":
  205. //ASSESSMENT SUBMIT
  206. globalfunc::checkParamCount($parent,1);
  207. globalfunc::checkAuthrozation($parent,array('type'=>'user'));
  208. $userid=$parent->current_user_id;
  209. $assessmentid = escape_str($parent->params['0']);
  210. //USER ASSESSMENT CHECK
  211. $assessment_user_str = "SELECT * FROM ".TABLE_ASSESSMENT_USER." WHERE assessmentid='".$assessmentid."' AND userid='".$parent->current_user_id."' AND status='1' LIMIT 1";
  212. $assessment_user_arr=$parent->getQueryValue($assessment_user_str);
  213. //VALIDATE ASSESSMENT
  214. projectfunc::userAssessmentValid($parent,$parent->current_user_id,$assessmentid);
  215. //ASSESSMENT VALIDATION
  216. $assessment_str = "SELECT * FROM ".TABLE_ASSESSMENT." WHERE assessmentid='".$assessmentid."' AND status='1' AND assettypeid='1' ".$user_cond." AND enddate>='".NOW."' LIMIT 1";
  217. $assessment_arr=$parent->getQueryValue($assessment_str);
  218. if(count($assessment_arr)!=1) $parent->response(array('response'=>'failed','message'=>$this->page_data["error2"]),406);
  219. //FIELDS VALIDATION
  220. $REQUEST_KEYS=array('ans_arr'=>'string','startdatetime'=>'date|Y-m-d H:i:s','enddatetime'=>'date|Y-m-d H:i:s');
  221. globalfunc::mandatoryKey($parent,$REQUEST_KEYS);
  222. //CHECK ANS ARRAY
  223. $ans_arr = json_decode($parent->_request["ans_arr"]);
  224. if(count($ans_arr)==0)
  225. {
  226. $parent->response(array('response'=>'failed','message'=>$this->page_data["error5"]), 406);
  227. }
  228. $startdatetime = isset($parent->_request["startdatetime"])?escape_str($parent->_request["startdatetime"]):NOW;
  229. $enddatetime = isset($parent->_request["enddatetime"])?escape_str($parent->_request["enddatetime"]):NOW;
  230. $attempt_time=1;
  231. usleep(rand(100000,1000000));
  232. //CHECK USER ATTEMPT LIMIT
  233. $get_userresult_str="SELECT * FROM ".TABLE_ASSESSMENTRESULT." WHERE assessmentid='".$assessmentid."' AND userid='".$parent->current_user_id."' AND status=0 ORDER BY arid DESC";
  234. $userresult_arr=$parent->getQueryValue($get_userresult_str);
  235. //if(!(count($userresult_arr)>0)) $parent->response(array('response'=>'failed','message'=>$this->page_data["error8"]), 406);
  236. if(count($userresult_arr)>0 &&$userresult_arr[0]->status=='0')
  237. {
  238. //RESULT ALREADY STARTED NEED TO RESET
  239. $parent->executeQuery("UPDATE ".TABLE_ASSESSMENTRESULT." SET `assessmentdate`='".NOW."', `startdatetime`='".NOW."', `modified_on`='".NOW."' WHERE arid='".$userresult_arr[0]->arid."'");
  240. }else
  241. {
  242. $get_userresult_str="SELECT * FROM ".TABLE_ASSESSMENTRESULT." WHERE assessmentid='".$assessmentid."' AND userid='".$parent->current_user_id."' ORDER BY arid DESC";
  243. $userresult_arr=$parent->getQueryValue($get_userresult_str);
  244. $attempt_time=count($userresult_arr)+1;
  245. if($assessment_arr[0]->attemptslimit<=count($userresult_arr))
  246. {
  247. $parent->response(array('response'=>'failed','message'=>$this->page_data["error6"]), 406);
  248. }
  249. //RESULT INSERT
  250. $parent->executeQuery("INSERT INTO ".TABLE_ASSESSMENTRESULT." (`assessmentid`, `attempt_time`, `userid`, `assettypeid`, `assessmenttype`,`assessmentdate` , `startdatetime`,`status`, `created_on`, `modified_on`)VALUES('".$assessmentid."','".$attempt_time."','".$parent->current_user_id."','".$assessment_arr[0]->assettypeid."','".$assessment_arr[0]->assessmenttype."', '".NOW."','".NOW."','0','".NOW."','".NOW."')");
  251. $get_userresult_str="SELECT * FROM ".TABLE_ASSESSMENTRESULT." WHERE assessmentid='".$assessmentid."' AND userid='".$parent->current_user_id."' ORDER BY arid DESC";
  252. $userresult_arr=$parent->getQueryValue($get_userresult_str);
  253. }
  254. //ASSESSMENT SCORE
  255. $ques_arr=array();
  256. $assessment_ques_arr=array();
  257. if(count($ans_arr)>0)
  258. {
  259. //GET QUESTION ARRAY
  260. foreach($ans_arr as $res)
  261. {
  262. //print_r($res);
  263. $question_arr[]=$res->qid;
  264. $assessment_ques_arr[]=$res->aqid;
  265. }
  266. }
  267. //CHECK QUESTION COUNT
  268. if(!(count($question_arr)>0) || !(count($assessment_ques_arr)>0))
  269. {
  270. $parent->response(array('response'=>'failed','message'=>$this->page_data["error7"]), 406);
  271. }
  272. //VALIDATE QUESTION
  273. $validate_assessment_ques_str =" SELECT * FROM ".TABLE_ASSESSMENT_QUESTION." WHERE assessmentid='".$assessmentid."' AND aqid IN (".@implode(',',$assessment_ques_arr).") AND qid IN (".@implode(',',$question_arr).") ";
  274. $validate_assessment_ques_arr=$parent->getQueryValue($validate_assessment_ques_str);
  275. if(!(count($validate_assessment_ques_arr)>0)) $parent->response(array('response'=>'failed','message'=>$this->page_data["error9"]), 406);
  276. //if(!(count($validate_assessment_ques_arr)==count($assessment_ques_arr))) $parent->response(array('response'=>'failed','message'=>$this->page_data["error9"]), 406);
  277. //SCORE CALCULATION
  278. $assessmentscore_str = "SELECT SUM(op.score) as totalscore FROM (SELECT * FROM ".TABLE_QUESTIONOPTION." WHERE qid IN (".@implode(',',$question_arr).") )as op JOIN (SELECT * FROM ".TABLE_QUESTION." WHERE id IN (".@implode(',',$question_arr).") ) as q ON op.qid=q.id JOIN (SELECT * FROM ".TABLE_ASSESSMENT_QUESTION." WHERE assessmentid='".$assessmentid."' AND aqid IN (".@implode(',',$assessment_ques_arr).") ) aq ON aq.qid=q.id WHERE aq.assessmentid='".$assessmentid."' AND op.iscorrect=1";
  279. $assessmentscore_arr=$parent->getQueryValue($assessmentscore_str);
  280. $total_score='0';
  281. if(count($assessmentscore_arr)>0)
  282. {
  283. $total_score=($assessmentscore_arr[0]->totalscore)?$assessmentscore_arr[0]->totalscore:'0';
  284. }
  285. //INSERT OPTIONS
  286. $insert_result_arr=array();
  287. for($mid = 0; $mid < count($ans_arr);$mid++)
  288. {
  289. $aqid = $ans_arr[$mid]->aqid;
  290. $qid = $ans_arr[$mid]->qid;
  291. $options_arr = $ans_arr[$mid]->options;
  292. if(is_array($options_arr) && count($options_arr)>0)
  293. {
  294. for($nid = 0; $nid < count($options_arr);$nid++)
  295. {
  296. $option_id = $options_arr[$nid];
  297. $insert_result_arr[] = " ('".$userresult_arr[0]->arid."','".$assessmentid."','".$parent->current_user_id."','".$aqid."','".$qid."','".$option_id."','".NOW."','".NOW."')";
  298. }
  299. } else{
  300. $insert_result_arr[] = " ('".$userresult_arr[0]->arid."','".$assessmentid."','".$parent->current_user_id."','".$aqid."','".$qid."','0','".NOW."','".NOW."')";
  301. }
  302. }
  303. //DELETE USER RESULT
  304. $parent->executeQuery("DELETE FROM ".TABLE_ASSESSMENT_USERRESULT." WHERE arid='".$userresult_arr[0]->arid."' AND userid='".$parent->current_user_id."' AND assessmentid='".$assessmentid."'");
  305. if(count($insert_result_arr)>0)
  306. {
  307. $parent->executeQuery("INSERT INTO ".TABLE_ASSESSMENT_USERRESULT." (arid,assessmentid,userid,aqid,qid,choiseid,created_on,modified_on)VALUES ".@implode(',',$insert_result_arr)."");
  308. }
  309. //CALCULATE USER SCORE SINGLE CHOISE
  310. // $userscore_str = "SELECT SUM(op.score) as totalscore FROM ".TABLE_QUESTIONOPTION." as op JOIN ".TABLE_ASSESSMENT_USERRESULT." ar ON ar.choiseid=op.optid WHERE ar.assessmentid='".$assessmentid."' AND op.iscorrect=1 AND userid='".$parent->current_user_id."' AND arid='".$userresult_arr[0]->arid."'";
  311. $userscore_str = "SELECT SUM(op.score) as totalscore FROM ".TABLE_QUESTIONOPTION." as op JOIN ".TABLE_ASSESSMENT_USERRESULT." ar ON ar.choiseid=op.optid JOIN ".TABLE_QUESTION." as q ON ar.qid=q.id WHERE ar.assessmentid='".$assessmentid."' AND q.questiontypeid='1' AND op.iscorrect=1 AND userid='".$parent->current_user_id."' AND arid='".$userresult_arr[0]->arid."'";
  312. //$userscore_arr = $userscore_qry->fetchAll(PDO::FETCH_OBJ);
  313. $userscore_arr=$parent->getQueryValue($userscore_str);
  314. $user_score='0';
  315. if(count($userscore_arr)>0)
  316. {
  317. $user_score=($userscore_arr[0]->totalscore)?$userscore_arr[0]->totalscore:'0';
  318. }
  319. //CHECK MULTI CHOICE
  320. $get_multi_choice_ques_str = "SELECT ar.* FROM ".TABLE_ASSESSMENT_USERRESULT." as ar JOIN ".TABLE_QUESTION." as q ON ar.qid=q.id WHERE ar.assessmentid='".$assessmentid."' AND q.questiontypeid='2' AND ar.userid='".$parent->current_user_id."' AND ar.arid='".$userresult_arr[0]->arid."' GROUP BY ar.aqid ";
  321. $get_multi_choice_arr=$parent->getQueryValue($get_multi_choice_ques_str);
  322. if(count($userscore_arr)>0)
  323. {
  324. foreach($get_multi_choice_arr as $res_multi)
  325. {
  326. $ques_score=0;
  327. //GET ALL QUESTION OPTIONS
  328. $ques_option_str ="SELECT op.optid,op.opttext,op.score,op.iscorrect FROM ".TABLE_QUESTIONOPTION." as op WHERE op.qid='".$res_multi->qid."'";
  329. $ques_option_arr=$parent->getQueryValue($ques_option_str);
  330. //GET USER ANSWERED OPTIONS
  331. $user_answer_str ="SELECT * FROM ".TABLE_ASSESSMENT_USERRESULT." WHERE userid='".$parent->current_user_id."' AND arid='".$userresult_arr[0]->arid."' AND aqid='".$res_multi->aqid."'";
  332. $user_answer_arr=$parent->getQueryValue($user_answer_str);
  333. $correct_ans_arr=array();
  334. $choise_arr=array();
  335. if(count($ques_option_arr)>0)
  336. {
  337. if(count($user_answer_arr)>0)
  338. {
  339. $choise_arr=array_column($user_answer_arr,'choiseid');
  340. }
  341. foreach($ques_option_arr as $mkey=>$res_opt)
  342. {
  343. //correct ans
  344. if($res_opt->iscorrect=='1')
  345. {
  346. $correct_ans_arr[]=$res_opt->optid;
  347. $ques_score+=$res_opt->score;
  348. }
  349. }
  350. }
  351. //MUTIPLE CHOISE CORRECT ANSWER CHECK
  352. if(count($correct_ans_arr)==count($choise_arr))
  353. {
  354. $result=array_diff($correct_ans_arr,$choise_arr);
  355. $is_correct=(count($result)==0)?'1':'0';
  356. if($is_correct=='1'){ $user_score+=$ques_score;}
  357. }
  358. }
  359. }
  360. $percentage_score=($user_score>0 && $total_score>0)?round(($user_score/$total_score)*100):'0';
  361. //ASSESSMENT RESULT
  362. $exam_time_diff=strtotime($enddatetime)-strtotime($startdatetime);
  363. $parent->executeQuery("UPDATE ".TABLE_ASSESSMENTRESULT." SET userscore='".$user_score."',totalscore='".$total_score."', percentage_score='".$percentage_score."', `startdatetime`='".$startdatetime."',`enddatetime`='".$enddatetime."', time_taken='".$exam_time_diff."', `status`='1', `modified_on`='".NOW."' WHERE arid='".$userresult_arr[0]->arid."'");
  364. //UPDATE HIGHSCORE IN TABLE_ASSESSMENT_USER
  365. $exam_highscore_str = "SELECT * FROM ".TABLE_ASSESSMENTRESULT." WHERE assessmentid='".$assessmentid."' AND userid='".$parent->current_user_id."' ORDER by percentage_score DESC LIMIT 1";
  366. $exam_highscore_arr=$parent->getQueryValue($exam_highscore_str);
  367. $highscore=(count($exam_highscore_arr)>0)?$exam_highscore_arr[0]->percentage_score:0;
  368. $highscorearid=(count($exam_highscore_arr)>0)?$exam_highscore_arr[0]->arid:0;
  369. if(count($assessment_user_arr)>0)
  370. {
  371. $parent->executeQuery("UPDATE ".TABLE_ASSESSMENT_USER." SET highscore='".$highscore."',highscorearid='".$highscorearid."',modified_on='".NOW."' WHERE id='".$assessment_user_arr[0]->id."' AND userid='".$parent->current_user_id."'");
  372. }else
  373. {
  374. $parent->executeQuery("INSERT INTO `".TABLE_ASSESSMENT_USER."`( `assessmentid`, `userid`, `highscore`, `highscorearid`, `status`, `created_on`, `modified_on`) VALUES ('".$assessmentid."','".$parent->current_user_id."','".$highscore."','".$highscorearid."','1','".NOW."','".NOW."')");
  375. }
  376. //LOG
  377. $logstr='ASSESSMENT SUBMIT';
  378. globalfunc::insertUserLog($parent,$logstr,$assessmentid);
  379. //ASSESSMENT SCORE > 80
  380. //if($percentage_score>=ASSESSMENT_PASS_PERCENT)
  381. if($percentage_score>=$assessment_arr[0]->pass_score)
  382. {
  383. $msg="You have successfully qualified in ".$assessment_arr[0]->assessmentname."";
  384. if($assessment_arr[0]->assessmentpoints>0 && in_array($parent->current_user_role,array('8','9','10','11','12','13')))
  385. {
  386. //ADD REWARD POINTS
  387. $obj=new stdClass();
  388. $obj->type="assessment";
  389. $obj->type_id=$assessmentid;
  390. $obj->description="Points for Assessment - ".$assessment_arr[0]->assessmentname."";
  391. $obj->points=$assessment_arr[0]->assessmentpoints;
  392. $status=projectfunc::userAddPoints($parent,$obj,$parent->current_user_id);
  393. if($status==1)
  394. {
  395. //SEND NOTIFICATION ON POINT ADD
  396. $nobj=new stdClass();
  397. $nobj->notificationtitle='Reward points '.$assessment_arr[0]->assessmentpoints.' added ';
  398. $nobj->notificationtext='Reward points '.$assessment_arr[0]->assessmentpoints.' has been added for qualifying assessment - '.$assessment_arr[0]->assessmentname;
  399. $nobj->notificationtype='6';
  400. $nobj->notificationdata=new stdClass();
  401. // projectfunc::sendUserNotification($parent,$nobj);
  402. }
  403. }
  404. }else
  405. {
  406. $msg="You must achieve ".$assessment_arr[0]->pass_score."% in order to pass.";
  407. }
  408. if ($assessment_arr[0]->schedule_id != 0) {
  409. $msg = "You have completed assessment successfully";
  410. }
  411. $parent->response(array('response'=>'success', 'data'=>array('result_id'=>$userresult_arr[0]->arid,'user_score'=>$user_score,'total_score'=>$total_score,'percentage_score'=>$percentage_score),'assessment_msg'=>$msg,'message'=>$this->page_data['success1']),200);
  412. break;
  413. }
  414. }
  415. /* //////////////////////////////////////////////////////////////////////////////////////////// */
  416. /* /////////////////////////////// ASSESSMENT STATUS //////////////////////////////////////////////// */
  417. private function assessment_status($parent){
  418. globalfunc::checkMethodType($parent,array('GET'));
  419. globalfunc::checkAuthrozation($parent,array('type'=>'user'));
  420. globalfunc::checkParamCount($parent,2);
  421. $assessmentid = escape_str($parent->params['1']);
  422. //USER COND
  423. $user_cond_arr=projectfunc::getUserAssessmentCond($parent);
  424. $user_cond=" AND ".@implode(' AND ',$user_cond_arr);
  425. //NEW ROLE CONDITION
  426. switch($parent->current_user_role)
  427. {
  428. //NORMAL DSE
  429. case '8':
  430. case '9':
  431. case '10':
  432. case '11':
  433. case '12':
  434. case '13':
  435. $user_cond.=" AND a.user_type=0 ";
  436. break;
  437. //International Bike Sales Executive
  438. case '15':
  439. $user_cond.=" AND a.user_type=1 ";
  440. break;
  441. //HO Manager
  442. case '3':
  443. $user_cond.=" AND a.user_type=2 ";
  444. break;
  445. //Zonal Manager
  446. case '4':
  447. $user_cond.=" AND a.user_type=3 ";
  448. break;
  449. //Trainer
  450. case '5':
  451. $user_cond.=" AND a.user_type=4 ";
  452. break;
  453. //Regional Manager
  454. case '6':
  455. $user_cond.=" AND a.user_type=5 ";
  456. break;
  457. //Area Manager
  458. case '7':
  459. $user_cond.=" AND a.user_type=6 ";
  460. break;
  461. //Dealer
  462. case '14':
  463. $user_cond.=" AND a.user_type=7 ";
  464. break;
  465. case '16':
  466. $user_cond.=" AND a.user_type=8 ";
  467. break;
  468. }
  469. if($parent->current_user_role>7 && $parent->current_user_role<14)
  470. {
  471. $user_cond.=" AND (segment='0' OR segment='".$parent->current_user_data->segment."')";
  472. }
  473. $status_arr=array();
  474. $assessment_str = "SELECT a.* FROM ".TABLE_ASSESSMENT." as a WHERE a.status='1' AND a.assettypeid='1' AND a.assessmentid='".$assessmentid."' AND a.publisheddate<='".NOW."' ".$user_cond." LIMIT 1";
  475. $assessment_arr=$parent->getQueryValue($assessment_str);
  476. if(count($assessment_arr)>0)
  477. {
  478. //GET ALL STATUS
  479. $status_str = "SELECT * FROM ".TABLE_STATUS;
  480. $status_res_arr=$parent->getQueryValue($status_str);
  481. //print_r($status_res_arr);
  482. if(count($status_res_arr)>0)
  483. {
  484. foreach($status_res_arr as $res)
  485. {
  486. $obj_key=$res->statusid;
  487. $status_arr[$obj_key]=$res->status;
  488. }
  489. }
  490. /*
  491. *
  492. 1 Active
  493. //2 Inactive
  494. 3 Completed
  495. //4 In Progress
  496. //5 Published
  497. //6 Closed
  498. 7 Not started
  499. 8 Expired
  500. *
  501. */
  502. //S3 OBJECT
  503. $s3=awsfileserver::connectS3();
  504. //ADD EXTRA FIELDS
  505. foreach($assessment_arr as $key=>$res_assessment)
  506. {
  507. //assessmenttype 0-Offline,1-Online
  508. $assessment_arr[$key]->assessmenttype_str=($res_assessment->assessmenttype=='0')?'Offline':'Online';
  509. $assessment_arr[$key]->is_expired ='0';
  510. //$assessment_arr[$key]->is_expired ='2';
  511. //CHECK ALREADY ATTENDTED
  512. $assessment_result_str = "SELECT * FROM ".TABLE_ASSESSMENTRESULT." WHERE assessmentid='".$res_assessment->assessmentid."' AND userid='".$parent->current_user_id."' ORDER BY arid DESC";
  513. $assessment_result_arr=$parent->getQueryValue($assessment_result_str);
  514. if(count($assessment_result_arr)>0)
  515. {
  516. // 3-Completed , 4 - In Progress
  517. $assessment_arr[$key]->status =($assessment_result_arr[0]->status=='1')?'3':'1';
  518. $res_assessment->status = $assessment_arr[$key]->status;
  519. } else {
  520. $assessment_arr[$key]->status ='7';
  521. $res_assessment->status = $assessment_arr[$key]->status;
  522. }
  523. //EXPIRED
  524. if(strtotime($res_assessment->enddate)<strtotime(NOW))
  525. {
  526. $assessment_arr[$key]->is_expired='1';
  527. $assessment_arr[$key]->status = '8';
  528. $res_assessment->status = '8';
  529. }
  530. //STATUS STRING
  531. $assessment_arr[$key]->statusname=(isset($status_arr[$res_assessment->status]))?$status_arr[$res_assessment->status]:"";
  532. //ATTEMPT TIME
  533. $attempt_time_str = "SELECT * FROM ".TABLE_ASSESSMENTRESULT." WHERE assessmentid='".$res_assessment->assessmentid."' AND userid='".$parent->current_user_id."' ORDER by attempt_time DESC";
  534. $attempt_time_arr=$parent->getQueryValue($attempt_time_str);
  535. $assessment_arr[$key]->attempt_time=(count($attempt_time_arr)>0)?$attempt_time_arr[0]->attempt_time:0;
  536. //IS ATTENDED
  537. $assessment_arr[$key]->is_attended='0';
  538. //HIGHSCORE
  539. $assessment_arr[$key]->highscore='0';
  540. if(count($attempt_time_arr)>0)
  541. {
  542. $user_assessment_score_arr=array_column($attempt_time_arr,'percentage_score');
  543. rsort( $user_assessment_score_arr);
  544. $assessment_arr[$key]->highscore=(string)$user_assessment_score_arr[0];
  545. $assessment_arr[$key]->is_attended='1';
  546. }
  547. }
  548. }else
  549. {
  550. $parent->response(array('response'=>'failed', 'message'=>$this->page_data['error2']),406);
  551. }
  552. //LOG
  553. $logstr='ASSESSMENT STATUS';
  554. globalfunc::insertUserLog($parent,$logstr,$assessmentid);
  555. $parent->response(array('response'=>'success', 'data'=>$assessment_arr[0],'message'=>$this->page_data['success1']),200);
  556. }
  557. /* //////////////////////////////////////////////////////////////////////////////////////////// */
  558. /* /////////////////////////////// QUESTION //////////////////////////////////////// */
  559. private function question($parent){
  560. globalfunc::checkMethodType($parent,array('GET'));
  561. globalfunc::checkParamCount($parent,2);
  562. globalfunc::checkAuthrozation($parent,array('type'=>'user'));
  563. $assessmentid = escape_str($parent->params['1']);
  564. //VALIDATE ASSESSMENT
  565. projectfunc::userAssessmentValid($parent,$parent->current_user_id,$assessmentid);
  566. //ASSESSMENT VALIDATION
  567. $assessment_str = "SELECT * FROM ".TABLE_ASSESSMENT." WHERE assessmentid='".$assessmentid."' AND status='1' AND assettypeid='1' LIMIT 1";
  568. $assessment_arr=$parent->getQueryValue($assessment_str);
  569. if(count($assessment_arr)!=1) $parent->response(array('response'=>'failed','message'=>$this->page_data["error2"]),406);
  570. //S3 OBJECT
  571. $s3=awsfileserver::connectS3();
  572. if($assessment_arr[0]->randomcond=='1' )
  573. {
  574. $econd=" ORDER BY RAND() ";
  575. }else
  576. {
  577. $econd=" ORDER BY aq.aqid ASC";
  578. }
  579. $limit_str=" LIMIT 0,".$assessment_arr[0]->total_question." ";
  580. $ques_str ="SELECT aq.aqid,aq.is_mandatory,q.id as qid, q.`questiontypeid`, q.`questiontext`, q.`qimage`, q.`qvideo` FROM ".TABLE_QUESTION." as q JOIN (SELECT * FROM ".TABLE_ASSESSMENT_QUESTION." WHERE assessmentid='".$assessmentid."')as aq ON q.id=aq.qid WHERE 1=1 ".$econd.$limit_str;
  581. $ques_arr=$parent->getQueryValue($ques_str);
  582. if(count($ques_arr)>0)
  583. {
  584. //CONNECT S3
  585. $s3=awsfileserver::connectS3();
  586. foreach($ques_arr as $key=>$res_ques)
  587. {
  588. //QUESTION IMAGE
  589. $res_ques->qimage_url='';
  590. if($res_ques->qimage!='')
  591. {
  592. $res_ques->qimage_url=awsfileserver::getS3FileUrl($s3,S3_BUCKET,S3_QUESTION_URL.$res_ques->qimage);
  593. }
  594. //QUESTION VIDEO
  595. $res_ques->qvideo_url='';
  596. if($res_ques->qvideo!='')
  597. {
  598. $res_ques->qvideo_url=awsfileserver::getS3FileUrl($s3,S3_BUCKET,S3_QUESTION_URL.$res_ques->qvideo);
  599. }
  600. //CHOICE
  601. $chocie_arr=array();
  602. //WEB NEED selected
  603. $wed_cond=($parent->device_type=='web')?" ,'0' as selected ":'';
  604. $quesoption_str = "SELECT optid,opttext ".$wed_cond." FROM ".TABLE_QUESTIONOPTION." WHERE qid='".$res_ques->qid."'";
  605. $quesoption_arr=$parent->getQueryValue($quesoption_str);
  606. $res_ques->options = $quesoption_arr;
  607. $question_arr[]=$res_ques;
  608. }
  609. }
  610. //LOG
  611. $logstr='ASSESSMENT QUESTION';
  612. globalfunc::insertUserLog($parent,$logstr,$assessmentid);
  613. $parent->response(array('response'=>'success', 'data'=>$question_arr,'message'=>$this->page_data['success1']),200);
  614. }
  615. /* //////////////////////////////////////////////////////////////////////////////////////////// */
  616. /* /////////////////////////////// STARTEXAM //////////////////////////////////////// */
  617. private function startexam($parent){
  618. globalfunc::checkMethodType($parent,array('GET'));
  619. globalfunc::checkAuthrozation($parent,array('type'=>'user'));
  620. globalfunc::checkParamCount($parent,2);
  621. //GET ASSESSMENTID
  622. $assessmentid = escape_str($parent->params[1]);
  623. //VALIDATE ASSESSMENT
  624. projectfunc::userAssessmentValid($parent,$parent->current_user_id,$assessmentid);
  625. //ASSESSMENT VALIDATION
  626. $assessment_str = "SELECT * FROM ".TABLE_ASSESSMENT." WHERE assessmentid='".$assessmentid."' AND status='1' AND assettypeid='1' LIMIT 1";
  627. $assessment_arr=$parent->getQueryValue($assessment_str);
  628. if(count($assessment_arr)!=1) $parent->response(array('response'=>'failed','message'=>$this->page_data["error2"]),406);
  629. $attempt_time=1;
  630. //CHECK USER ATTEMPT LIMIT
  631. $get_userresult_str="SELECT * FROM ".TABLE_ASSESSMENTRESULT." WHERE assessmentid='".$assessmentid."' AND userid='".$parent->current_user_id."' ORDER BY arid DESC";
  632. $userresult_arr=$parent->getQueryValue($get_userresult_str);
  633. if($assessment_arr[0]->attemptslimit<=count($userresult_arr))
  634. {
  635. $parent->response(array('response'=>'failed','message'=>$this->page_data["error6"]), 406);
  636. }
  637. else
  638. {
  639. $attempt_time=count($userresult_arr)+1;
  640. }
  641. //CHECK IN PROGRESS EXAM EXIST
  642. if($userresult_arr[0]->status=='0')
  643. {
  644. //RESULT ALREADY STARTED NEED TO RESET
  645. $parent->executeQuery("UPDATE ".TABLE_ASSESSMENTRESULT." SET `assessmentdate`='".NOW."', `startdatetime`='".NOW."', `modified_on`='".NOW."' WHERE arid='".$userresult_arr[0]->arid."'");
  646. }else
  647. {
  648. //RESULT INSERT
  649. $parent->executeQuery("INSERT INTO ".TABLE_ASSESSMENTRESULT." (`assessmentid`, `attempt_time`, `userid`, `assettypeid`, `assessmenttype`,`assessmentdate` , `startdatetime`,`status`, `created_on`, `modified_on`)VALUES('".$assessmentid."','".$attempt_time."','".$parent->current_user_id."','".$assessment_arr[0]->assettypeid."','".$assessment_arr[0]->assessmenttype."', '".NOW."','".NOW."','0','".NOW."','".NOW."')");
  650. }
  651. //LOG
  652. $logstr='START ASSESSMENT';
  653. globalfunc::insertUserLog($parent,$logstr,$assessmentid);
  654. $parent->response(array('response'=>'success','message'=>$this->page_data['success1']),200);
  655. }
  656. /* //////////////////////////////////////////////////////////////////////////////////////////// */
  657. /* /////////////////////////////// REVIEW //////////////////////////////////////// */
  658. private function review($parent){
  659. globalfunc::checkMethodType($parent,array('GET'));
  660. globalfunc::checkAuthrozation($parent,array('type'=>'user'));
  661. globalfunc::checkParamCount($parent,2);
  662. //GET RESULTID
  663. $arid = escape_str($parent->params[1]);
  664. $get_user_assessmentresult_str="SELECT * FROM ".TABLE_ASSESSMENTRESULT." WHERE userid='".$parent->current_user_id."' AND arid='".$arid."'";
  665. $user_assessmentresult_arr=$parent->getQueryValue($get_user_assessmentresult_str);
  666. if(!(count($user_assessmentresult_arr)>0))
  667. {
  668. $parent->response(array('response'=>'failed','message'=>$this->page_data["error2"]), 406);
  669. }
  670. //CONNECT S3
  671. $s3=awsfileserver::connectS3();
  672. $result_arr=array();
  673. //GET ASSESSMENT RESULT
  674. $get_user_ques_result_str="SELECT * FROM ".TABLE_ASSESSMENT_USERRESULT." WHERE userid='".$parent->current_user_id."' AND arid='".$arid."' GROUP BY aqid ORDER BY userresultid ASC";
  675. $user_ques_result_arr=$parent->getQueryValue($get_user_ques_result_str);
  676. if(count($user_ques_result_arr)>0)
  677. {
  678. foreach($user_ques_result_arr as $res_value)
  679. {
  680. $ques_str ="SELECT q.id as qid, q.`questiontypeid`, q.`questiontext`, q.`qimage`, q.`qvideo` FROM ".TABLE_QUESTION." as q WHERE id='".$res_value->qid."' LIMIT 1";
  681. $ques_arr=$parent->getQueryValue($ques_str);
  682. if(count($ques_arr)>0)
  683. {
  684. //QUESTION IMAGE
  685. $ques_arr[0]->qimage_url='';
  686. if($ques_arr[0]->qimage!='')
  687. {
  688. $ques_arr[0]->qimage_url=awsfileserver::getS3FileUrl($s3,S3_BUCKET,S3_QUESTION_URL.$ques_arr[0]->qimage);
  689. }
  690. //QUESTION VIDEO
  691. $ques_arr[0]->qvideo_url='';
  692. if($ques_arr[0]->qvideo!='')
  693. {
  694. $ques_arr[0]->qvideo_url=awsfileserver::getS3FileUrl($s3,S3_BUCKET,S3_QUESTION_URL.$ques_arr[0]->qvideo);
  695. }
  696. //GET ALL QUESTION OPTIONS
  697. $ques_option_str ="SELECT op.optid,op.opttext,op.score,op.iscorrect,'0' as selected FROM ".TABLE_QUESTIONOPTION." as op WHERE op.qid='".$res_value->qid."'";
  698. $ques_option_arr=$parent->getQueryValue($ques_option_str);
  699. //GET USER ANSWERED OPTIONS
  700. $user_answer_str ="SELECT * FROM ".TABLE_ASSESSMENT_USERRESULT." WHERE userid='".$parent->current_user_id."' AND arid='".$arid."' AND aqid='".$res_value->aqid."'";
  701. $user_answer_arr=$parent->getQueryValue($user_answer_str);
  702. //CORRECT ANSWER CHECK
  703. $ques_arr[0]->is_correct='0';
  704. $correct_ans_arr=array();
  705. $choise_arr=array();
  706. if(count($ques_option_arr)>0)
  707. {
  708. if(count($user_answer_arr)>0)
  709. {
  710. $choise_arr=array_column($user_answer_arr,'choiseid');
  711. }
  712. foreach($ques_option_arr as $mkey=>$res_opt)
  713. {
  714. if(count($user_answer_arr)>0)
  715. {
  716. $ques_option_arr[$mkey]->selected=(in_array($res_opt->optid,$choise_arr))?'1':'0';
  717. }
  718. //correct ans
  719. if($res_opt->iscorrect=='1')
  720. {
  721. $correct_ans_arr[]=$res_opt->optid;
  722. }
  723. }
  724. }
  725. //MUTIPLE CHOISE CORRECT ANSWER CHECK
  726. if(count($correct_ans_arr)==count($choise_arr))
  727. {
  728. $result=array_diff($correct_ans_arr,$choise_arr);
  729. $ques_arr[0]->is_correct=(count($result)==0)?'1':'0';
  730. }
  731. $ques_arr[0]->options=$ques_option_arr;
  732. $result_arr[]=$ques_arr[0];
  733. }
  734. }
  735. }
  736. //LOG
  737. $logstr='ASSESSMENT REVIEW';
  738. globalfunc::insertUserLog($parent,$logstr,$arid);
  739. $parent->response(array('response'=>'success','data'=>$result_arr,'message'=>$this->page_data['success1']),200);
  740. }
  741. /* //////////////////////////////////////////////////////////////////////////////////////////// */
  742. }
  743. ?>