Skip to content

Commit a12dae7

Browse files
committed
Admin: Statistics: Add list of duplicated users by e-mail - refs BT#21146
1 parent 44b313e commit a12dae7

File tree

2 files changed

+130
-4
lines changed

2 files changed

+130
-4
lines changed

main/admin/statistics/index.php

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,7 @@
356356
'report=users_online' => get_lang('UsersOnline'),
357357
'report=invoicing' => get_lang('InvoicingByAccessUrl'),
358358
'report=duplicated_users' => get_lang('DuplicatedUsers'),
359+
'report=duplicated_users_by_mail' => get_lang('DuplicatedUsersByMail'),
359360
],
360361
get_lang('System') => [
361362
'report=activities' => get_lang('ImportantActivities'),
@@ -1859,7 +1860,7 @@ function loadReportQuarterlyTotalDiskUsage () {
18591860
$additionalExtraFieldsInfo = TrackingCourseLog::getAdditionalProfileExtraFields();
18601861

18611862
$frmFields = TrackingCourseLog::displayAdditionalProfileFields([], api_get_self());
1862-
$table = Statistics::returnDuplicatedUsersTable($additionalExtraFieldsInfo);
1863+
$table = Statistics::returnDuplicatedUsersTable('name', $additionalExtraFieldsInfo);
18631864

18641865
if (isset($_GET['action_table'])) {
18651866
$data = $table->toArray(true, true);
@@ -1878,6 +1879,37 @@ function loadReportQuarterlyTotalDiskUsage () {
18781879
$content .= Display::page_subheader2(get_lang('DuplicatedUsers'));
18791880
$content .= Display::return_message(get_lang('ThisReportOnlyListsUsersThatHaveTheSameFirstnameAndLastname'));
18801881

1882+
$content .= $frmFields;
1883+
$content .= $table->return_table();
1884+
break;
1885+
case 'duplicated_users_by_mail':
1886+
$interbreadcrumb[] = [
1887+
'name' => $tool_name,
1888+
'url' => 'index.php',
1889+
];
1890+
1891+
$additionalExtraFieldsInfo = TrackingCourseLog::getAdditionalProfileExtraFields();
1892+
1893+
$frmFields = TrackingCourseLog::displayAdditionalProfileFields([], api_get_self());
1894+
$table = Statistics::returnDuplicatedUsersTable('email', $additionalExtraFieldsInfo);
1895+
1896+
if (isset($_GET['action_table'])) {
1897+
$data = $table->toArray(true, true);
1898+
1899+
if ('export_excel' === $_GET['action_table']) {
1900+
Export::arrayToXls($data);
1901+
} elseif ('export_csv' === $_GET['action_table']) {
1902+
Export::arrayToCsv($data);
1903+
}
1904+
1905+
exit;
1906+
}
1907+
1908+
$htmlHeadXtra[] = '<script>'.UserManager::getScriptFunctionForActiveFilter().'</script>';
1909+
1910+
$content .= Display::page_subheader2(get_lang('DuplicatedUsersByMail'));
1911+
$content .= Display::return_message(get_lang('ThisReportOnlyListsUsersThatHaveTheSameEmail'));
1912+
18811913
$content .= $frmFields;
18821914
$content .= $table->return_table();
18831915
break;

main/inc/lib/statistics.lib.php

Lines changed: 97 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1788,10 +1788,18 @@ public static function getSessionsByDuration(string $dateFrom, string $dateUntil
17881788

17891789
/**
17901790
* Return duplicate users at a SortableTableFromArray object
1791+
* @param string $type The type of duplication we are checking for ('name' or 'email')
17911792
*/
1792-
public static function returnDuplicatedUsersTable(array $additionalExtraFieldsInfo): SortableTableFromArray
1793+
public static function returnDuplicatedUsersTable(
1794+
string $type = 'name',
1795+
array $additionalExtraFieldsInfo
1796+
): SortableTableFromArray
17931797
{
1794-
$usersInfo = Statistics::getDuplicatedUsers($additionalExtraFieldsInfo);
1798+
if ($type == 'email') {
1799+
$usersInfo = Statistics::getDuplicatedUserMails($additionalExtraFieldsInfo);
1800+
} else {
1801+
$usersInfo = Statistics::getDuplicatedUsers($additionalExtraFieldsInfo);
1802+
}
17951803

17961804
$column = 0;
17971805

@@ -1802,15 +1810,20 @@ public static function returnDuplicatedUsersTable(array $additionalExtraFieldsIn
18021810
]);
18031811
$table->set_header($column++, get_lang('Id'));
18041812

1813+
if ($type == 'email') {
1814+
$table->set_header($column++, get_lang('Email'));
1815+
}
18051816
if (api_is_western_name_order()) {
18061817
$table->set_header($column++, get_lang('FirstName'));
18071818
$table->set_header($column++, get_lang('LastName'));
18081819
} else {
18091820
$table->set_header($column++, get_lang('LastName'));
18101821
$table->set_header($column++, get_lang('FirstName'));
18111822
}
1823+
if ($type == 'name') {
1824+
$table->set_header($column++, get_lang('Email'));
1825+
}
18121826

1813-
$table->set_header($column++, get_lang('Email'));
18141827
$table->set_header($column++, get_lang('RegistrationDate'));
18151828
$table->set_column_filter(
18161829
$column - 1,
@@ -1984,4 +1997,85 @@ private static function getDuplicatedUsers(array $additionalExtraFieldsInfo): ar
19841997

19851998
return $usersInfo;
19861999
}
2000+
2001+
/**
2002+
* Get a list of duplicated user emails
2003+
* @param array $additionalExtraFieldsInfo A list of extra fields we want to get in return, additional to the user details
2004+
* @return array
2005+
*/
2006+
private static function getDuplicatedUserMails(array $additionalExtraFieldsInfo): array
2007+
{
2008+
$sql = "SELECT email, COUNT(*) as count
2009+
FROM user
2010+
GROUP BY email
2011+
HAVING count > 1
2012+
ORDER BY email"
2013+
;
2014+
2015+
$result = Database::query($sql);
2016+
2017+
if (1 > Database::num_rows($result)) {
2018+
return [];
2019+
}
2020+
2021+
$usersInfo = [];
2022+
2023+
while ($rowStat = Database::fetch_assoc($result)) {
2024+
$email = Database::escape_string($rowStat['email']);
2025+
$subsql = "SELECT id, firstname, lastname, registration_date, status, active
2026+
FROM user WHERE email = '$email'"
2027+
;
2028+
2029+
$subResult = Database::query($subsql);
2030+
2031+
if (1 > Database::num_rows($subResult)) {
2032+
continue;
2033+
}
2034+
2035+
$objExtraValue = new ExtraFieldValue('user');
2036+
2037+
while ($rowUser = Database::fetch_assoc($subResult)) {
2038+
$studentId = $rowUser['id'];
2039+
2040+
$studentInfo = [];
2041+
$studentInfo[] = $rowUser['id'];
2042+
2043+
$studentInfo[] = $rowStat['email'];
2044+
if (api_is_western_name_order()) {
2045+
$studentInfo[] = $rowUser['firstname'];
2046+
$studentInfo[] = $rowUser['lastname'];
2047+
} else {
2048+
$studentInfo[] = $rowUser['lastname'];
2049+
$studentInfo[] = $rowUser['firstname'];
2050+
}
2051+
2052+
$studentInfo[] = $rowUser['registration_date'];
2053+
$studentInfo[] = Tracking::get_first_connection_date(
2054+
$studentId,
2055+
DATE_TIME_FORMAT_LONG
2056+
);
2057+
$studentInfo[] = Tracking::get_last_connection_date(
2058+
$studentId,
2059+
true,
2060+
false,
2061+
DATE_TIME_FORMAT_LONG
2062+
);
2063+
$studentInfo[] = $rowUser['status'];
2064+
$studentInfo[] = Tracking::count_course_per_student($studentId);
2065+
$studentInfo[] = Tracking::countSessionsPerStudent($studentId);
2066+
2067+
foreach ($additionalExtraFieldsInfo as $fieldInfo) {
2068+
$extraValue = $objExtraValue->get_values_by_handler_and_field_id($studentId, $fieldInfo['id'], true);
2069+
$studentInfo[] = $extraValue['value'] ?? null;
2070+
}
2071+
2072+
$studentInfo[] = $rowUser['active']; // once to show status
2073+
$studentInfo[] = $rowUser['active']; // twice to show actions
2074+
2075+
$usersInfo[] = $studentInfo;
2076+
}
2077+
}
2078+
2079+
return $usersInfo;
2080+
}
19872081
}

0 commit comments

Comments
 (0)