/**
  * Generate the report for given certificate
  *
  * @param srCertificate $cert
  * @throws ilException
  * @return bool
  */
 public function generate(srCertificate $cert)
 {
     if (!$this->isAvailable()) {
         throw new ilException("Generating certificates with TemplateTypeHtml is only available for ILIAS > 4.4");
     }
     $template = $cert->getDefinition()->getType()->getCertificateTemplatesPath(true);
     // A template is required, so quit early if it does not exist for some reason
     if (!is_file($template)) {
         return false;
     }
     require_once './Services/PDFGeneration/classes/class.ilPDFGeneration.php';
     // Get HTML markup by parsing the template and replace placeholders
     $markup = file_get_contents($template);
     $markup = srCertificatePlaceholdersParser::getInstance()->parse($markup, $cert->getPlaceholders());
     try {
         $job = new ilPDFGenerationJob();
         $job->setMarginLeft('20');
         $job->setMarginBottom('20');
         $job->setMarginRight('20');
         $job->setMarginTop('20');
         $job->setOutputMode('F');
         // Save to disk
         $job->setFilename($cert->getFilePath());
         $job->addPage($markup);
         ilPDFGeneration::doJob($job);
         return true;
         // Method above gives no feedback so assume true -.-
     } catch (Exception $e) {
         $this->log->write("srCertificateTemplyteTypeHtml::generate() : " . $e->getMessage());
         return false;
     }
 }
 /**
  * Generate the report for given certificate
  *
  * @param srCertificate $cert
  * @throws ilException
  * @return bool
  */
 public function generate(srCertificate $cert)
 {
     if (!$this->isAvailable()) {
         throw new ilException("Generating certificates with TemplateTypeJasper is only available if the JasperReport service is installed");
     }
     require_once self::JASPER_CLASS;
     $template = $cert->getDefinition()->getType()->getCertificateTemplatesPath(true);
     // A template is required, so quit early if it does not exist for some reason
     if (!is_file($template)) {
         return false;
     }
     $placeholders = $cert->getPlaceholders();
     try {
         $defined_placeholders = $this->parseDefinedPlaceholders($template);
     } catch (Exception $e) {
         // XML is not valid
         return false;
     }
     // Only send defined placeholders to jasper, otherwise the template file is not considered as valid
     $placeholders = array_intersect_key($placeholders, $defined_placeholders);
     $placeholders = $this->nl2br($placeholders);
     $report = new JasperReport($template, $cert->getFilename(false));
     if ($locale = $this->pl->config('jasper_locale')) {
         $report->setLocale($this->pl->config('jasper_locale'));
     }
     if ($java = $this->pl->config('jasper_path_java')) {
         $report->setPathJava($java);
     }
     $report->setDataSource(JasperReport::DATASOURCE_EMPTY);
     $report->setParameters($placeholders);
     try {
         $report->generateOutput();
         $report_file = $report->getOutputFile();
         // Move pdf to correct certificate location
         $cert_path = $cert->getCertificatePath();
         if (!file_exists($cert_path)) {
             ilUtil::makeDirParents($cert_path);
         }
         $from = $report_file . '.pdf';
         $to = $cert->getFilePath();
         return ilUtil::moveUploadedFile($from, '', $to, false, 'rename');
     } catch (JasperReportException $e) {
         $this->log->write("srCertificateTemplyteTypeJasper::generate() Report file of certificate with ID {$cert->getId()} was not created by Jasper: " . implode(', ', $e->getErrors()));
         return false;
     }
 }
 /**
  * Return all Placeholders of Learning Progress data
  *
  * @param ilObjCourse $course
  * @param ilObjUser $user
  * @return array
  */
 protected function parseLearningProgressPlaceholders(ilObjCourse $course, ilObjUser $user)
 {
     $passed_datetime = ilCourseParticipants::getDateTimeOfPassed($course->getId(), $user->getId());
     $lp_fields = array('first_access', 'last_access', 'percentage', 'status', 'read_count', 'childs_spent_seconds');
     $lp_data = ilTrQuery::getObjectsDataForUser($user->getId(), $course->getId(), $course->getRefId(), '', '', 0, 9999, null, $lp_fields);
     $lp_avg = $this->buildAvgPercentageOfCourseObjects($lp_data);
     $lp_crs = array();
     $max_last_access = 0;
     foreach ($lp_data['set'] as $v) {
         if ($v['type'] == 'crs') {
             $lp_crs = $v;
             $lp_crs['first_access'] = strtotime($v['first_access']);
             // First access is not stored as UNIX timestamp...
         }
         if ($v['last_access'] > $max_last_access) {
             $max_last_access = $v['last_access'];
         }
     }
     $lp_crs['last_access'] = $max_last_access;
     // calculates spent time different for scorm modules if enabled in config
     /** @var $cert_def srCertificateDefinition */
     $cert_definition = $this->certificate->getDefinition();
     if ($cert_definition->getScormTiming()) {
         $spent_seconds = 0;
         require_once './Services/Object/classes/class.ilObjectLP.php';
         $ilScormLP = ilObjectLP::getInstance($course->getId());
         /**
          * @var $ilLPCollection ilLPCollection
          */
         $ilLPCollection = $ilScormLP->getCollectionInstance();
         if ($ilLPCollection instanceof ilLPCollection) {
             foreach ($ilLPCollection->getItems() as $item) {
                 $spent_seconds += $this->getSpentSeconds(ilObject::_lookupObjectId($item), $user->getId());
             }
         }
         $lp_crs['childs_spent_seconds'] = $spent_seconds;
     }
     $lp_spent_time = $this->buildLpSpentTime($lp_crs);
     return array('DATE_COMPLETED' => $this->formatDate('DATE_COMPLETED', strtotime($passed_datetime)), 'DATETIME_COMPLETED' => $this->formatDateTime('DATETIME_COMPLETED', strtotime($passed_datetime)), 'LP_FIRST_ACCESS' => $this->formatDateTime('LP_FIRST_ACCESS', (int) $lp_crs['first_access']), 'LP_LAST_ACCESS' => $this->formatDateTime('LP_LAST_ACCESS', (int) $lp_crs['last_access']), 'LP_SPENT_TIME' => $lp_spent_time, 'LP_SPENT_SECONDS' => $lp_crs['childs_spent_seconds'], 'LP_READ_COUNT' => $lp_crs['read_count'], 'LP_STATUS' => $lp_crs['status'], 'LP_AVG_PERCENTAGE' => $lp_avg);
 }
 /**
  * Get timestamp of the last_status according to LP
  *
  * @param srCertificate $cert
  * @return int|null
  */
 protected function getLastLPStatus(srCertificate $cert)
 {
     $ref_id = $cert->getDefinition()->getRefId();
     $obj_id = ilObject::_lookupObjectId($ref_id);
     $lp_data = ilTrQuery::getObjectsDataForUser($cert->getUserId(), $obj_id, $ref_id, '', '', 0, 9999, null, array('last_access'));
     $last_status = null;
     foreach ($lp_data['set'] as $data) {
         if ($data['type'] == 'crs') {
             $last_status = $data['last_access'];
             break;
         }
     }
     return (int) $last_status;
 }