/**
  * Parse data
  * @return
  *
  * @global ilRbacReview $rbacreview
  */
 public function parse()
 {
     global $rbacreview;
     $this->determineOffsetAndOrder();
     include_once './Services/User/classes/class.ilUserQuery.php';
     $additional_fields = $this->getSelectedColumns();
     unset($additional_fields["firstname"]);
     unset($additional_fields["lastname"]);
     unset($additional_fields["last_login"]);
     unset($additional_fields["access_until"]);
     unset($additional_fields['consultation_hour']);
     unset($additional_fields['prtf']);
     $udf_ids = $usr_data_fields = $odf_ids = array();
     foreach ($additional_fields as $field) {
         if (substr($field, 0, 3) == 'udf') {
             $udf_ids[] = substr($field, 4);
             continue;
         }
         if (substr($field, 0, 3) == 'odf') {
             $odf_ids[] = substr($field, 4);
             continue;
         }
         $usr_data_fields[] = $field;
     }
     $usr_data = ilUserQuery::getUserListData($this->getOrderField(), $this->getOrderDirection(), $this->getOffset(), $this->getLimit(), '', '', null, false, false, 0, $this->getRoleId(), null, $usr_data_fields, $part);
     foreach ((array) $usr_data['set'] as $user) {
         $usr_ids[] = $user['usr_id'];
     }
     // merge course data
     $course_user_data = $this->getParentObject()->readMemberData($usr_ids, $this->type == 'admin', $this->getSelectedColumns());
     $a_user_data = array();
     foreach ((array) $usr_data['set'] as $ud) {
         $a_user_data[$ud['usr_id']] = array_merge($ud, $course_user_data[$ud['usr_id']]);
         if ($this->show_lp_status_sync) {
             // #9912 / #13208
             $passed_info = "";
             if ($a_user_data[$ud['usr_id']]["passed_info"]) {
                 $pinfo = $a_user_data[$ud['usr_id']]["passed_info"];
                 if ($pinfo["user_id"]) {
                     if ($pinfo["user_id"] < 0) {
                         $passed_info = $this->lng->txt("crs_passed_status_system");
                     } else {
                         if ($pinfo["user_id"] > 0) {
                             $name = ilObjUser::_lookupName($pinfo["user_id"]);
                             $passed_info = $this->lng->txt("crs_passed_status_manual_by") . ": " . $name["login"];
                         }
                     }
                 }
                 if ($pinfo["timestamp"]) {
                     $passed_info .= "<br />" . ilDatePresentation::formatDate($pinfo["timestamp"]);
                 }
             }
             $a_user_data[$ud['usr_id']]["passed_info"] = $passed_info;
         }
     }
     // Custom user data fields
     if ($udf_ids) {
         include_once './Services/User/classes/class.ilUserDefinedData.php';
         $data = ilUserDefinedData::lookupData($usr_ids, $udf_ids);
         foreach ($data as $usr_id => $fields) {
             if (!$this->checkAcceptance($usr_id)) {
                 continue;
             }
             foreach ($fields as $field_id => $value) {
                 $a_user_data[$usr_id]['udf_' . $field_id] = $value;
             }
         }
     }
     // Object specific user data fields
     if ($odf_ids) {
         include_once './Modules/Course/classes/Export/class.ilCourseUserData.php';
         $data = ilCourseUserData::_getValuesByObjId($this->getParentObject()->object->getId());
         foreach ($data as $usr_id => $fields) {
             // #7264: as we get data for all course members filter against user data
             if (!$this->checkAcceptance($usr_id) || !in_array($usr_id, $usr_ids)) {
                 continue;
             }
             foreach ($fields as $field_id => $value) {
                 $a_user_data[$usr_id]['odf_' . $field_id] = $value;
             }
         }
         // add last edit date
         include_once './Services/Membership/classes/class.ilObjectCustomUserFieldHistory.php';
         foreach (ilObjectCustomUserFieldHistory::lookupEntriesByObjectId($this->getParentObject()->object->getId()) as $usr_id => $edit_info) {
             if (!isset($a_user_data[$usr_id])) {
                 continue;
             }
             include_once './Services/PrivacySecurity/classes/class.ilPrivacySettings.php';
             if ($usr_id == $edit_info['update_user']) {
                 $a_user_data[$usr_id]['odf_last_update'] = '';
                 $a_user_data[$usr_id]['odf_info_txt'] = $GLOBALS['lng']->txt('cdf_edited_by_self');
                 if (ilPrivacySettings::_getInstance()->enabledAccessTimesByType($this->getParentObject()->object->getType())) {
                     $a_user_data[$usr_id]['odf_last_update'] .= '_' . $edit_info['editing_time']->get(IL_CAL_UNIX);
                     $a_user_data[$usr_id]['odf_info_txt'] .= ', ' . ilDatePresentation::formatDate($edit_info['editing_time']);
                 }
             } else {
                 $a_user_data[$usr_id]['odf_last_update'] = $edit_info['update_user'];
                 $a_user_data[$usr_id]['odf_last_update'] .= '_' . $edit_info['editing_time']->get(IL_CAL_UNIX);
                 $name = ilObjUser::_lookupName($edit_info['update_user']);
                 $a_user_data[$usr_id]['odf_info_txt'] = $name['firstname'] . ' ' . $name['lastname'] . ', ' . ilDatePresentation::formatDate($edit_info['editing_time']);
             }
         }
     }
     foreach ($usr_data['set'] as $user) {
         // Check acceptance
         if (!$this->checkAcceptance($user['usr_id'])) {
             continue;
         }
         // DONE: accepted
         foreach ($usr_data_fields as $field) {
             $a_user_data[$user['usr_id']][$field] = $user[$field] ? $user[$field] : '';
         }
     }
     // consultation hours
     if ($this->isColumnSelected('consultation_hour')) {
         include_once './Services/Booking/classes/class.ilBookingEntry.php';
         foreach (ilBookingEntry::lookupManagedBookingsForObject($this->getParentObject()->object->getId(), $GLOBALS['ilUser']->getId()) as $buser => $booking) {
             if (isset($a_user_data[$buser])) {
                 $a_user_data[$buser]['consultation_hour'] = $booking[0]['dt'];
                 $a_user_data[$buser]['consultation_hour_end'] = $booking[0]['dtend'];
                 $a_user_data[$buser]['consultation_hours'] = $booking;
             }
         }
     }
     $this->setMaxCount($usr_data['cnt'] ? $usr_data['cnt'] : 0);
     return $this->setData($a_user_data);
 }
 /**
  * Parse user data
  * @param array $a_user_data
  * @return 
  */
 public function parse($a_user_data)
 {
     include_once './Services/User/classes/class.ilUserQuery.php';
     $additional_fields = $this->getSelectedColumns();
     unset($additional_fields["firstname"]);
     unset($additional_fields["lastname"]);
     unset($additional_fields["last_login"]);
     unset($additional_fields["access_until"]);
     unset($additional_fields['consultation_hour']);
     unset($additional_fields['prtf']);
     switch ($this->type) {
         case 'admin':
             $part = ilGroupParticipants::_getInstanceByObjId($this->getParentObject()->object->getId())->getAdmins();
             break;
         case 'member':
             $part = $GLOBALS['rbacreview']->assignedUsers($this->getRole());
             break;
         case 'role':
             $part = $GLOBALS['rbacreview']->assignedUsers($this->getRole());
             break;
     }
     $udf_ids = $usr_data_fields = $odf_ids = array();
     foreach ($additional_fields as $field) {
         if (substr($field, 0, 3) == 'udf') {
             $udf_ids[] = substr($field, 4);
             continue;
         }
         if (substr($field, 0, 3) == 'odf') {
             $odf_ids[] = substr($field, 4);
             continue;
         }
         $usr_data_fields[] = $field;
     }
     $usr_data = ilUserQuery::getUserListData('login', 'ASC', 0, 9999, '', '', null, false, false, 0, 0, null, $usr_data_fields, $part);
     // Custom user data fields
     if ($udf_ids) {
         include_once './Services/User/classes/class.ilUserDefinedData.php';
         $data = ilUserDefinedData::lookupData($part, $udf_ids);
         foreach ($data as $usr_id => $fields) {
             if (!$this->checkAcceptance($usr_id)) {
                 continue;
             }
             foreach ($fields as $field_id => $value) {
                 $a_user_data[$usr_id]['udf_' . $field_id] = $value;
             }
         }
     }
     // Object specific user data fields
     if ($odf_ids) {
         include_once './Modules/Course/classes/Export/class.ilCourseUserData.php';
         $data = ilCourseUserData::_getValuesByObjId($this->getParentObject()->object->getId());
         foreach ($data as $usr_id => $fields) {
             if (!$this->checkAcceptance($usr_id)) {
                 continue;
             }
             foreach ($fields as $field_id => $value) {
                 if ($a_user_data[$usr_id]) {
                     $a_user_data[$usr_id]['odf_' . $field_id] = $value;
                 }
             }
         }
     }
     foreach ($usr_data['set'] as $user) {
         // Check acceptance
         if (!$this->checkAcceptance($user['usr_id'])) {
             continue;
         }
         // DONE: accepted
         foreach ($usr_data_fields as $field) {
             $a_user_data[$user['usr_id']][$field] = $user[$field] ? $user[$field] : '';
         }
     }
     // consultation hours
     if ($this->isColumnSelected('consultation_hour')) {
         include_once './Services/Booking/classes/class.ilBookingEntry.php';
         foreach (ilBookingEntry::lookupManagedBookingsForObject($this->getParentObject()->object->getId(), $GLOBALS['ilUser']->getId()) as $buser => $booking) {
             if (isset($a_user_data[$buser])) {
                 $a_user_data[$buser]['consultation_hour'] = $booking[0]['dt'];
                 $a_user_data[$buser]['consultation_hour_end'] = $booking[0]['dtend'];
                 $a_user_data[$buser]['consultation_hours'] = $booking;
             }
         }
     }
     return $this->setData($a_user_data);
 }
 /**
  * Write data
  * @return 
  */
 protected function write()
 {
     // Add header line
     $row = 0;
     $col = 0;
     foreach ($all_fields = $this->getOrderedExportableFields() as $field) {
         switch ($field) {
             case 'role':
                 #$this->csv->addColumn($this->lng->txt($this->getType().'_role_status'));
                 $this->addCol($this->lng->txt($this->getType() . '_role_status'), $row, $col++);
                 break;
             case 'agreement':
                 #$this->csv->addColumn($this->lng->txt('ps_agreement_accepted'));
                 $this->addCol($this->lng->txt('ps_agreement_accepted'), $row, $col++);
                 break;
             case 'consultation_hour':
                 $this->lng->loadLanguageModule('dateplaner');
                 $this->addCol($this->lng->txt('cal_ch_field_ch'), $row, $col++);
                 break;
             default:
                 if (substr($field, 0, 4) == 'udf_') {
                     $field_id = explode('_', $field);
                     include_once 'Services/User/classes/class.ilUserDefinedFields.php';
                     $udf = ilUserDefinedFields::_getInstance();
                     $def = $udf->getDefinition($field_id[1]);
                     #$this->csv->addColumn($def['field_name']);
                     $this->addCol($def['field_name'], $row, $col++);
                 } elseif (substr($field, 0, 4) == 'cdf_') {
                     $field_id = explode('_', $field);
                     #$this->csv->addColumn(ilCourseDefinedFieldDefinition::_lookupName($field_id[1]));
                     $this->addCol(ilCourseDefinedFieldDefinition::_lookupName($field_id[1]), $row, $col++);
                 } else {
                     #$this->csv->addColumn($this->lng->txt($field));
                     $this->addCol($this->lng->txt($field), $row, $col++);
                 }
                 break;
         }
     }
     #$this->csv->addRow();
     $this->addRow();
     // Add user data
     foreach ($this->user_ids as $usr_id) {
         $row++;
         $col = 0;
         $udf_data = new ilUserDefinedData($usr_id);
         foreach ($all_fields as $field) {
             // Handle course defined fields
             if ($this->addUserDefinedField($udf_data, $field, $row, $col)) {
                 $col++;
                 continue;
             }
             if ($this->addCourseField($usr_id, $field, $row, $col)) {
                 $col++;
                 continue;
             }
             switch ($field) {
                 case 'role':
                     switch ($this->user_course_data[$usr_id]['role']) {
                         case IL_CRS_ADMIN:
                             #$this->csv->addColumn($this->lng->txt('crs_admin'));
                             $this->addCol($this->lng->txt('crs_admin'), $row, $col++);
                             break;
                         case IL_CRS_TUTOR:
                             #$this->csv->addColumn($this->lng->txt('crs_tutor'));
                             $this->addCol($this->lng->txt('crs_tutor'), $row, $col++);
                             break;
                         case IL_CRS_MEMBER:
                             #$this->csv->addColumn($this->lng->txt('crs_member'));
                             $this->addCol($this->lng->txt('crs_member'), $row, $col++);
                             break;
                         case IL_GRP_ADMIN:
                             #$this->csv->addColumn($this->lng->txt('il_grp_admin'));
                             $this->addCol($this->lng->txt('il_grp_admin'), $row, $col++);
                             break;
                         case IL_GRP_MEMBER:
                             #$this->csv->addColumn($this->lng->txt('il_grp_member'));
                             $this->addCol($this->lng->txt('il_grp_member'), $row, $col++);
                             break;
                         case 'subscriber':
                             #$this->csv->addColumn($this->lng->txt($this->getType().'_subscriber'));
                             $this->addCol($this->lng->txt($this->getType() . '_subscriber'), $row, $col++);
                             break;
                         default:
                             #$this->csv->addColumn($this->lng->txt('crs_waiting_list'));
                             $this->addCol($this->lng->txt('crs_waiting_list'), $row, $col++);
                             break;
                     }
                     break;
                 case 'agreement':
                     if (isset($this->agreement[$usr_id])) {
                         if ($this->agreement[$usr_id]['accepted']) {
                             #$this->csv->addColumn(ilFormat::formatUnixTime($this->agreement[$usr_id]['acceptance_time'],true));
                             $this->addCol(ilFormat::formatUnixTime($this->agreement[$usr_id]['acceptance_time'], true), $row, $col++);
                         } else {
                             #$this->csv->addColumn($this->lng->txt('ps_not_accepted'));
                             $this->addCol($this->lng->txt('ps_not_accepted'), $row, $col++);
                         }
                     } else {
                         #$this->csv->addColumn($this->lng->txt('ps_not_accepted'));
                         $this->addCol($this->lng->txt('ps_not_accepted'), $row, $col++);
                     }
                     break;
                     // These fields are always enabled
                 // These fields are always enabled
                 case 'username':
                     #$this->csv->addColumn($this->user_profile_data[$usr_id]['login']);
                     $this->addCol($this->user_profile_data[$usr_id]['login'], $row, $col++);
                     break;
                 case 'firstname':
                 case 'lastname':
                     #$this->csv->addColumn($this->user_profile_data[$usr_id][$field]);
                     $this->addCol($this->user_profile_data[$usr_id][$field], $row, $col++);
                     break;
                 case 'consultation_hour':
                     include_once './Services/Booking/classes/class.ilBookingEntry.php';
                     $bookings = ilBookingEntry::lookupManagedBookingsForObject($this->obj_id, $GLOBALS['ilUser']->getId());
                     $uts = array();
                     foreach ((array) $bookings[$usr_id] as $ut) {
                         ilDatePresentation::setUseRelativeDates(false);
                         $tmp = ilDatePresentation::formatPeriod(new ilDateTime($ut['dt'], IL_CAL_UNIX), new ilDateTime($ut['dtend'], IL_CAL_UNIX));
                         if (strlen($ut['explanation'])) {
                             $tmp .= ' ' . $ut['explanation'];
                         }
                         $uts[] = $tmp;
                     }
                     $uts_str = implode(',', $uts);
                     $this->addCol($uts_str, $row, $col++);
                     break;
                 default:
                     // Check aggreement
                     if (!$this->privacy->courseConfirmationRequired() and !ilCourseDefinedFieldDefinition::_getFields($this->obj_id) or $this->agreement[$usr_id]['accepted']) {
                         #$this->csv->addColumn($this->user_profile_data[$usr_id][$field]);
                         $this->addCol($this->user_profile_data[$usr_id][$field], $row, $col++);
                     } else {
                         #$this->csv->addColumn('');
                         $this->addCol('', $row, $col++);
                     }
                     break;
             }
         }
         #$this->csv->addRow();
         $this->addRow();
     }
 }
 /**
  * Parse user data
  * @param array $a_user_data
  * @return 
  */
 public function parse($a_user_data)
 {
     include_once './Services/User/classes/class.ilUserQuery.php';
     $additional_fields = $this->getSelectedColumns();
     unset($additional_fields["firstname"]);
     unset($additional_fields["lastname"]);
     unset($additional_fields["last_login"]);
     unset($additional_fields["access_until"]);
     unset($additional_fields['consultation_hour']);
     unset($additional_fields['prtf']);
     switch ($this->type) {
         case 'admin':
             $part = ilGroupParticipants::_getInstanceByObjId($this->getParentObject()->object->getId())->getAdmins();
             break;
         case 'member':
             $part = $GLOBALS['rbacreview']->assignedUsers($this->getRole());
             break;
         case 'role':
             $part = $GLOBALS['rbacreview']->assignedUsers($this->getRole());
             break;
     }
     $udf_ids = $usr_data_fields = $odf_ids = array();
     foreach ($additional_fields as $field) {
         if (substr($field, 0, 3) == 'udf') {
             $udf_ids[] = substr($field, 4);
             continue;
         }
         if (substr($field, 0, 3) == 'odf') {
             $odf_ids[] = substr($field, 4);
             continue;
         }
         $usr_data_fields[] = $field;
     }
     $usr_data = ilUserQuery::getUserListData('login', 'ASC', 0, 9999, '', '', null, false, false, 0, 0, null, $usr_data_fields, $part);
     // Custom user data fields
     if ($udf_ids) {
         include_once './Services/User/classes/class.ilUserDefinedData.php';
         $data = ilUserDefinedData::lookupData($part, $udf_ids);
         foreach ($data as $usr_id => $fields) {
             if (!$this->checkAcceptance($usr_id)) {
                 continue;
             }
             foreach ($fields as $field_id => $value) {
                 $a_user_data[$usr_id]['udf_' . $field_id] = $value;
             }
         }
     }
     // Object specific user data fields
     if ($odf_ids) {
         include_once './Modules/Course/classes/Export/class.ilCourseUserData.php';
         $data = ilCourseUserData::_getValuesByObjId($this->getParentObject()->object->getId());
         foreach ($data as $usr_id => $fields) {
             if (!$this->checkAcceptance($usr_id)) {
                 continue;
             }
             foreach ($fields as $field_id => $value) {
                 if ($a_user_data[$usr_id]) {
                     $a_user_data[$usr_id]['odf_' . $field_id] = $value;
                 }
             }
         }
         // add last edit date
         include_once './Services/Membership/classes/class.ilObjectCustomUserFieldHistory.php';
         foreach (ilObjectCustomUserFieldHistory::lookupEntriesByObjectId($this->getParentObject()->object->getId()) as $usr_id => $edit_info) {
             if (!isset($a_user_data[$usr_id])) {
                 continue;
             }
             include_once './Services/PrivacySecurity/classes/class.ilPrivacySettings.php';
             if ($usr_id == $edit_info['update_user']) {
                 $a_user_data[$usr_id]['odf_last_update'] = '';
                 $a_user_data[$usr_id]['odf_info_txt'] = $GLOBALS['lng']->txt('cdf_edited_by_self');
                 if (ilPrivacySettings::_getInstance()->enabledAccessTimesByType($this->getParentObject()->object->getType())) {
                     $a_user_data[$usr_id]['odf_last_update'] .= '_' . $edit_info['editing_time']->get(IL_CAL_UNIX);
                     $a_user_data[$usr_id]['odf_info_txt'] .= ', ' . ilDatePresentation::formatDate($edit_info['editing_time']);
                 }
             } else {
                 $a_user_data[$usr_id]['odf_last_update'] = $edit_info['edit_user'];
                 $a_user_data[$usr_id]['odf_last_update'] .= '_' . $edit_info['editing_time']->get(IL_CAL_UNIX);
                 $name = ilObjUser::_lookupName($edit_info['update_user']);
                 $a_user_data[$usr_id]['odf_info_txt'] = $name['firstname'] . ' ' . $name['lastname'] . ', ' . ilDatePresentation::formatDate($edit_info['editing_time']);
             }
         }
     }
     foreach ($usr_data['set'] as $user) {
         // Check acceptance
         if (!$this->checkAcceptance($user['usr_id'])) {
             continue;
         }
         // DONE: accepted
         foreach ($usr_data_fields as $field) {
             $a_user_data[$user['usr_id']][$field] = $user[$field] ? $user[$field] : '';
         }
     }
     // consultation hours
     if ($this->isColumnSelected('consultation_hour')) {
         include_once './Services/Booking/classes/class.ilBookingEntry.php';
         foreach (ilBookingEntry::lookupManagedBookingsForObject($this->getParentObject()->object->getId(), $GLOBALS['ilUser']->getId()) as $buser => $booking) {
             if (isset($a_user_data[$buser])) {
                 $a_user_data[$buser]['consultation_hour'] = $booking[0]['dt'];
                 $a_user_data[$buser]['consultation_hour_end'] = $booking[0]['dtend'];
                 $a_user_data[$buser]['consultation_hours'] = $booking;
             }
         }
     }
     return $this->setData($a_user_data);
 }