1<?php 2 3/* Copyright (c) 2015 Richard Klees <richard.klees@concepts-and-training.de> Extended GPL, see docs/LICENSE */ 4 5 6/** 7 * Class ilObjStudyProgrammeIndividualPlanGUI 8 * 9 * @author: Richard Klees <richard.klees@concepts-and-training.de> 10 */ 11 12class ilObjStudyProgrammeIndividualPlanGUI 13{ 14 /** 15 * @var ilCtrl 16 */ 17 public $ctrl; 18 19 /** 20 * @var ilTemplate 21 */ 22 public $tpl; 23 24 /** 25 * @var ilAccessHandler 26 */ 27 protected $ilAccess; 28 29 /** 30 * @var ilObjStudyProgramme 31 */ 32 public $object; 33 34 /** 35 * @var ilLog 36 */ 37 protected $ilLog; 38 39 /** 40 * @var Ilias 41 */ 42 public $ilias; 43 44 /** 45 * @var ilLng 46 */ 47 public $lng; 48 49 /** 50 * @var ilToolbarGUI 51 */ 52 public $toolbar; 53 54 /** 55 * @var ilObjUser 56 */ 57 public $user; 58 59 protected $parent_gui; 60 61 /** 62 * @var ilStudyProgrammeUserProgressDB 63 */ 64 protected $sp_user_progress_db; 65 66 public function __construct($a_parent_gui, $a_ref_id, ilStudyProgrammeUserProgressDB $sp_user_progress_db) 67 { 68 global $DIC; 69 $tpl = $DIC['tpl']; 70 $ilCtrl = $DIC['ilCtrl']; 71 $ilAccess = $DIC['ilAccess']; 72 $ilToolbar = $DIC['ilToolbar']; 73 $ilLocator = $DIC['ilLocator']; 74 $tree = $DIC['tree']; 75 $lng = $DIC['lng']; 76 $ilLog = $DIC['ilLog']; 77 $ilias = $DIC['ilias']; 78 $ilUser = $DIC['ilUser']; 79 80 $this->ref_id = $a_ref_id; 81 $this->parent_gui = $a_parent_gui; 82 $this->tpl = $tpl; 83 $this->ctrl = $ilCtrl; 84 $this->ilAccess = $ilAccess; 85 $this->ilLocator = $ilLocator; 86 $this->tree = $tree; 87 $this->toolbar = $ilToolbar; 88 $this->ilLog = $ilLog; 89 $this->ilias = $ilias; 90 $this->lng = $lng; 91 $this->user = $ilUser; 92 $this->assignment_object = null; 93 $this->sp_user_progress_db = $sp_user_progress_db; 94 95 $this->object = null; 96 97 $lng->loadLanguageModule("prg"); 98 99 $this->tpl->addCss("Modules/StudyProgramme/templates/css/ilStudyProgramme.css"); 100 } 101 102 public function executeCommand() 103 { 104 $cmd = $this->ctrl->getCmd(); 105 106 if ($cmd == "") { 107 $cmd = "view"; 108 } 109 110 switch ($cmd) { 111 case "view": 112 case "manage": 113 case "updateFromCurrentPlan": 114 case "updateFromInput": 115 $cont = $this->$cmd(); 116 break; 117 default: 118 throw new ilException("ilObjStudyProgrammeMembersGUI: " . 119 "Command not supported: $cmd"); 120 } 121 122 $this->tpl->setContent($cont); 123 } 124 125 protected function getAssignmentId() 126 { 127 require_once("Modules/StudyProgramme/classes/class.ilStudyProgrammeUserAssignment.php"); 128 if (!is_numeric($_GET["ass_id"])) { 129 throw new ilException("Expected integer 'ass_id'"); 130 } 131 return (int) $_GET["ass_id"]; 132 } 133 134 protected function getAssignmentObject() 135 { 136 if ($this->assignment_object === null) { 137 $id = $this->getAssignmentId(); 138 $this->assignment_object = ilStudyProgrammeUserAssignment::getInstance($id); 139 } 140 return $this->assignment_object; 141 } 142 143 protected function view() 144 { 145 require_once("Modules/StudyProgramme/classes/class.ilStudyProgrammeIndividualPlanProgressListGUI.php"); 146 $gui = new ilStudyProgrammeIndividualPlanProgressListGUI($this->getAssignmentObject()->getRootProgress()); 147 $gui->setOnlyRelevant(true); 148 // Wrap a frame around the original gui element to correct rendering. 149 $tpl = new ilTemplate("tpl.individual_plan_tree_frame.html", false, false, "Modules/StudyProgramme"); 150 $tpl->setVariable("CONTENT", $gui->getHTML()); 151 return $this->buildFrame("view", $tpl->get()); 152 } 153 154 protected function manage() 155 { 156 require_once("Modules/StudyProgramme/classes/class.ilStudyProgrammeIndividualPlanTableGUI.php"); 157 $ass = $this->getAssignmentObject(); 158 $this->ctrl->setParameter($this, "ass_id", $ass->getId()); 159 $this->ctrl->setParameter($this, "cmd", "manage"); 160 $table = new ilStudyProgrammeIndividualPlanTableGUI($this, $ass, $this->sp_user_progress_db); 161 $frame = $this->buildFrame("manage", $table->getHTML()); 162 $this->ctrl->setParameter($this, "ass_id", null); 163 return $frame; 164 } 165 166 protected function updateFromCurrentPlan() 167 { 168 $ass = $this->getAssignmentObject(); 169 $ass->updateFromProgram(); 170 $this->ctrl->setParameter($this, "ass_id", $ass->getId()); 171 $this->showSuccessMessage("update_from_plan_successful"); 172 $this->ctrl->redirect($this, "manage"); 173 } 174 175 protected function updateFromInput() 176 { 177 require_once("Modules/StudyProgramme/classes/class.ilStudyProgrammeUserProgress.php"); 178 179 $changed = false; 180 181 $changed = $this->updateStatus(); 182 183 $this->ctrl->setParameter($this, "ass_id", $this->getAssignmentId()); 184 if ($changed) { 185 $this->showSuccessMessage("update_successful"); 186 } 187 $this->ctrl->redirect($this, "manage"); 188 } 189 190 protected function updateStatus() 191 { 192 $status_updates = $this->getManualStatusUpdates(); 193 $changed = false; 194 foreach ($status_updates as $prgrs_id => $status) { 195 $prgrs = $this->sp_user_progress_db->getInstanceById($prgrs_id); 196 $cur_status = $prgrs->getStatus(); 197 198 if ($status == self::MANUAL_STATUS_NONE && $cur_status == ilStudyProgrammeProgress::STATUS_ACCREDITED) { 199 $prgrs->unmarkAccredited($this->user->getId()); 200 $changed = true; 201 } elseif ($status == self::MANUAL_STATUS_NONE && $cur_status == ilStudyProgrammeProgress::STATUS_NOT_RELEVANT) { 202 $prgrs->markRelevant($this->user->getId()); 203 $changed = true; 204 } elseif ($status == self::MANUAL_STATUS_NOT_RELEVANT && $cur_status != ilStudyProgrammeProgress::STATUS_NOT_RELEVANT) { 205 $prgrs->markNotRelevant($this->user->getId()); 206 $changed = true; 207 } elseif ($status == self::MANUAL_STATUS_ACCREDITED && $cur_status != ilStudyProgrammeProgress::STATUS_ACCREDITED) { 208 $prgrs->markAccredited($this->user->getId()); 209 $changed = true; 210 } 211 212 $deadline = null; 213 if ($this->postContainDeadline()) { 214 $deadline = $this->updateDeadline($prgrs); 215 } 216 217 if ($cur_status == ilStudyProgrammeProgress::STATUS_IN_PROGRESS) { 218 $changed = $this->updateRequiredPoints($prgrs_id) || $changed; 219 220 if ($deadline !== null && $deadline->get(IL_CAL_DATE) < date("Y-m-d")) { 221 $prgrs->markFailed($this->user->getId()); 222 } 223 } elseif ($cur_status == ilStudyProgrammeProgress::STATUS_FAILED) { 224 if ($deadline === null || $deadline->get(IL_CAL_DATE) > date("Y-m-d")) { 225 $prgrs->markNotFailed($this->user->getId()); 226 } 227 } 228 } 229 return $changed; 230 } 231 232 /** 233 * Updates current deadline 234 * 235 * @param ilStudyProgrammeUserProgress $prgrs 236 * 237 * @return ilDateTime 238 */ 239 protected function updateDeadline(ilStudyProgrammeUserProgress $prgrs) 240 { 241 $deadline = $this->getDeadlineFromForm($prgrs->getId()); 242 $prgrs->setDeadline($deadline); 243 $prgrs->updateProgress($this->user->getId()); 244 245 return $deadline; 246 } 247 248 protected function updateRequiredPoints($prgrs_id) 249 { 250 $required_points = $this->getRequiredPointsUpdates($prgrs_id); 251 $changed = false; 252 253 $prgrs = $this->sp_user_progress_db->getInstanceById($prgrs_id); 254 $cur_status = $prgrs->getStatus(); 255 if ($cur_status != ilStudyProgrammeProgress::STATUS_IN_PROGRESS) { 256 return false; 257 } 258 259 if ($required_points < 0) { 260 $required_points = 0; 261 } 262 263 if ($required_points == $prgrs->getAmountOfPoints()) { 264 return false; 265 } 266 267 $prgrs->setRequiredAmountOfPoints($required_points, $this->user->getId()); 268 return true; 269 } 270 271 /** 272 * Get the deadline from form 273 * 274 * @param int $prgrs_id 275 * 276 * @return ilDateTime 277 */ 278 protected function getDeadlineFromForm($prgrs_id) 279 { 280 $post_var = $this->getDeadlinePostVarTitle(); 281 if (!$this->postContainDeadline()) { 282 throw new ilException("Expected array $post_var in POST"); 283 } 284 285 $post_value = $_POST[$post_var]; 286 $deadline = $post_value[$prgrs_id]; 287 288 if ($deadline == "") { 289 return null; 290 } 291 292 return new ilDateTime($deadline, IL_CAL_DATE); 293 } 294 295 /** 296 * Checks whether $_POST contains deadline 297 * 298 * @return bool 299 */ 300 protected function postContainDeadline() 301 { 302 $post_var = $this->getDeadlinePostVarTitle(); 303 if (array_key_exists($post_var, $_POST)) { 304 return true; 305 } 306 return false; 307 } 308 309 protected function showSuccessMessage($a_lng_var) 310 { 311 require_once("Services/Utilities/classes/class.ilUtil.php"); 312 ilUtil::sendSuccess($this->lng->txt("prg_$a_lng_var"), true); 313 } 314 315 protected function getManualStatusUpdates() 316 { 317 $post_var = $this->getManualStatusPostVarTitle(); 318 if (!array_key_exists($post_var, $_POST)) { 319 throw new ilException("Expected array $post_var in POST"); 320 } 321 return $_POST[$post_var]; 322 } 323 324 protected function getRequiredPointsUpdates($prgrs_id) 325 { 326 $post_var = $this->getRequiredPointsPostVarTitle(); 327 if (!array_key_exists($post_var, $_POST)) { 328 throw new ilException("Expected array $post_var in POST"); 329 } 330 331 $post_value = $_POST[$post_var]; 332 return (int) $post_value[$prgrs_id]; 333 } 334 335 336 protected function buildFrame($tab, $content) 337 { 338 $tpl = new ilTemplate("tpl.indivdual_plan_frame.html", true, true, "Modules/StudyProgramme"); 339 $ass = $this->getAssignmentObject(); 340 341 $tpl->setVariable("USERNAME", ilObjUser::_lookupFullname($ass->getUserId())); 342 foreach (array("view", "manage") as $_tab) { 343 $tpl->setCurrentBlock("sub_tab"); 344 $tpl->setVariable("CLASS", $_tab == $tab ? "active" : ""); 345 $tpl->setVariable("LINK", $this->getLinkTargetForSubTab($_tab, $ass->getId())); 346 $tpl->setVariable("TITLE", $this->lng->txt("prg_$_tab")); 347 $tpl->parseCurrentBlock(); 348 } 349 $tpl->setVariable("CONTENT", $content); 350 351 return $tpl->get(); 352 } 353 354 protected function getLinkTargetForSubTab($a_tab, $a_ass_id) 355 { 356 $this->ctrl->setParameter($this, "ass_id", $a_ass_id); 357 $lnk = $this->ctrl->getLinkTarget($this, $a_tab); 358 $this->ctrl->setParameter($this, "ass_id", null); 359 return $lnk; 360 } 361 362 public function appendIndividualPlanActions(ilTable2GUI $a_table) 363 { 364 $a_table->setFormAction($this->ctrl->getFormAction($this)); 365 $a_table->addCommandButton("updateFromCurrentPlan", $this->lng->txt("prg_update_from_current_plan")); 366 $a_table->addCommandButton("updateFromInput", $this->lng->txt("save")); 367 } 368 369 const POST_VAR_STATUS = "status"; 370 const POST_VAR_REQUIRED_POINTS = "required_points"; 371 const POST_VAR_DEADLINE = "deadline"; 372 const MANUAL_STATUS_NONE = 0; 373 const MANUAL_STATUS_NOT_RELEVANT = 1; 374 const MANUAL_STATUS_ACCREDITED = 2; 375 376 public function getManualStatusPostVarTitle() 377 { 378 return self::POST_VAR_STATUS; 379 } 380 381 public function getRequiredPointsPostVarTitle() 382 { 383 return self::POST_VAR_REQUIRED_POINTS; 384 } 385 386 public function getDeadlinePostVarTitle() 387 { 388 return self::POST_VAR_DEADLINE; 389 } 390 391 public function getManualStatusNone() 392 { 393 return self::MANUAL_STATUS_NONE; 394 } 395 396 public function getManualStatusNotRelevant() 397 { 398 return self::MANUAL_STATUS_NOT_RELEVANT; 399 } 400 401 public function getManualStatusAccredited() 402 { 403 return self::MANUAL_STATUS_ACCREDITED; 404 } 405 406 public static function getLinkTargetView($ctrl, $a_ass_id) 407 { 408 $cl = "ilObjStudyProgrammeIndividualPlanGUI"; 409 $ctrl->setParameterByClass($cl, "ass_id", $a_ass_id); 410 $link = $ctrl->getLinkTargetByClass($cl, "view"); 411 $ctrl->setParameterByClass($cl, "ass_id", null); 412 return $link; 413 } 414} 415