Skip to content

Commit 7c5f2db

Browse files
authored
Merge pull request #6188 from christianbeeznest/conti2-22533
Session: Add Excel export of certified users in course session with extra fields - refs BT#22533
2 parents 75ab03c + d193237 commit 7c5f2db

File tree

3 files changed

+145
-0
lines changed

3 files changed

+145
-0
lines changed

main/inc/lib/sessionmanager.lib.php

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10137,4 +10137,130 @@ private static function compareByCourse($listA, $listB)
1013710137
return -1;
1013810138
}
1013910139
}
10140+
10141+
/**
10142+
* Export an Excel report for a specific course within a session.
10143+
*
10144+
* The report includes session details and a list of certified users
10145+
* with their extra field values.
10146+
*
10147+
* @param int $sessionId ID of the session
10148+
* @param string $courseCode Course code of the course in the session
10149+
*/
10150+
public static function exportCourseSessionReport(int $sessionId, string $courseCode): void
10151+
{
10152+
$courseInfo = api_get_course_info($courseCode);
10153+
$sessionInfo = api_get_session_info($sessionId);
10154+
10155+
if (empty($courseInfo) || empty($sessionInfo)) {
10156+
die('Invalid course or session.');
10157+
}
10158+
10159+
$config = api_get_configuration_value('session_course_excel_export');
10160+
$sessionFields = $config['session_fields'] ?? [];
10161+
$userFieldsBefore = $config['user_fields_before'] ?? [];
10162+
$userFieldsAfter = $config['user_fields_after'] ?? [];
10163+
10164+
// 1. SESSION HEADER
10165+
$header1 = [''];
10166+
$header1[] = get_lang('StartDate');
10167+
$header1[] = get_lang('EndDate');
10168+
10169+
$extraField = new ExtraFieldModel('session');
10170+
$extraDefs = $extraField->get_all();
10171+
$extraDefsByVariable = array_column($extraDefs, null, 'variable');
10172+
10173+
foreach ($sessionFields as $field) {
10174+
if (isset($extraDefsByVariable[$field])) {
10175+
$header1[] = $extraDefsByVariable[$field]['display_text'] ?? strtoupper($field);
10176+
}
10177+
}
10178+
10179+
// 2. SESSION DATA
10180+
$row2 = [$courseInfo['title']];
10181+
$row2[] = $sessionInfo['access_start_date'];
10182+
$row2[] = $sessionInfo['access_end_date'];
10183+
10184+
$extraValuesObj = new ExtraFieldValue('session');
10185+
$sessionExtra = $extraValuesObj->getAllValuesByItem($sessionId);
10186+
$sessionExtraMap = array_column($sessionExtra, 'value', 'variable');
10187+
10188+
foreach ($sessionFields as $field) {
10189+
$value = $sessionExtraMap[$field] ?? '';
10190+
$row2[] = $value;
10191+
}
10192+
10193+
// 3. USER HEADER
10194+
$header3 = [''];
10195+
foreach ($userFieldsBefore as $field) {
10196+
$header3[] = strtoupper($field);
10197+
}
10198+
$header3[] = get_lang('FirstName');
10199+
$header3[] = get_lang('LastName');
10200+
$header3[] = get_lang('OfficialCode');
10201+
foreach ($userFieldsAfter as $field) {
10202+
$header3[] = strtoupper($field);
10203+
}
10204+
10205+
// 4. USERS WITH CERTIFICATE
10206+
$dataRows = [];
10207+
10208+
$tblCat = Database::get_main_table(TABLE_MAIN_GRADEBOOK_CATEGORY);
10209+
$sql = "
10210+
SELECT id FROM $tblCat
10211+
WHERE course_code = '".Database::escape_string($courseCode)."'
10212+
AND session_id = ".intval($sessionId)."
10213+
AND generate_certificates = 1
10214+
LIMIT 1
10215+
";
10216+
$res = Database::query($sql);
10217+
$row = Database::fetch_array($res);
10218+
$catId = $row ? (int) $row['id'] : 0;
10219+
10220+
if ($catId > 0) {
10221+
$tableCertificate = Database::get_main_table(TABLE_MAIN_GRADEBOOK_CERTIFICATE);
10222+
$sql = "SELECT DISTINCT user_id FROM $tableCertificate WHERE cat_id = $catId";
10223+
$res = Database::query($sql);
10224+
10225+
$rowIndex = 0;
10226+
while ($cert = Database::fetch_array($res)) {
10227+
$userId = $cert['user_id'];
10228+
$userInfo = api_get_user_info($userId);
10229+
10230+
$row = [];
10231+
$row[] = $rowIndex === 0 ? get_lang('Learners') : '';
10232+
10233+
$userExtraObj = new ExtraFieldValue('user');
10234+
$userExtra = $userExtraObj->getAllValuesByItem($userId);
10235+
$userExtraMap = array_column($userExtra, 'value', 'variable');
10236+
10237+
foreach ($userFieldsBefore as $field) {
10238+
$value = $userExtraMap[$field] ?? '';
10239+
$row[] = $value;
10240+
}
10241+
10242+
$row[] = $userInfo['firstname'];
10243+
$row[] = $userInfo['lastname'];
10244+
$row[] = $userInfo['official_code'] ?? '';
10245+
10246+
foreach ($userFieldsAfter as $field) {
10247+
$value = $userExtraMap[$field] ?? '';
10248+
$row[] = $value;
10249+
}
10250+
10251+
$dataRows[] = $row;
10252+
$rowIndex++;
10253+
}
10254+
}
10255+
10256+
// 5. EXPORT FINAL
10257+
$rows = [];
10258+
$rows[] = $header1;
10259+
$rows[] = $row2;
10260+
$rows[] = $header3;
10261+
$rows = array_merge($rows, $dataRows);
10262+
10263+
$filename = 'session_'.$sessionId.'_course_'.$courseCode;
10264+
Export::arrayToXls($rows, $filename);
10265+
}
1014010266
}

main/install/configuration.dist.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2628,3 +2628,10 @@
26282628

26292629
// Set the following parameter to true to enable a session lifetime controller that notifies users that their session is about to expire
26302630
//$_configuration['session_lifetime_controller'] = false;
2631+
2632+
// Extra fields to include in session course excel report on main/session/resume_session.php
2633+
/*$_configuration['session_course_excel_export'] = [
2634+
'session_fields' => ['session_extrafield1','session_extrafield2',],
2635+
'user_fields_before' => ['DNI'],
2636+
'user_fields_after' => ['user_extrafield1','user_extrafield2',],
2637+
];*/

main/session/resume_session.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,12 @@
5757
$url_id = api_get_current_access_url_id();
5858

5959
switch ($action) {
60+
case 'export_certified_course_users':
61+
$courseCode = $_GET['course_code'] ?? null;
62+
if (!empty($courseCode)) {
63+
SessionManager::exportCourseSessionReport($sessionId, $courseCode);
64+
}
65+
break;
6066
case 'move_up':
6167
SessionManager::moveUp($sessionId, $_GET['course_id']);
6268
header('Location: resume_session.php?id_session='.$sessionId);
@@ -293,6 +299,12 @@
293299
Display::return_icon('export_csv.png', get_lang('ExportUsersOfACourse')),
294300
$codePath."user/user_export.php?file_type=csv&course_session={$course->getCode()}:$sessionId&addcsvheader=1"
295301
);
302+
303+
$courseItem .= Display::url(
304+
Display::return_icon('excel.png', get_lang('ExportCertifiedUsersExcel')),
305+
api_get_self()."?id_session=$sessionId&action=export_certified_course_users&course_code=".$course->getCode()
306+
);
307+
296308
$courseItem .= Display::url(
297309
Display::return_icon('statistics.gif', get_lang('Tracking')),
298310
$codePath."tracking/courseLog.php?id_session=$sessionId&cidReq={$course->getCode()}$orig_param&hide_course_breadcrumb=1"

0 commit comments

Comments
 (0)