+
+ function handler_profile($page)
+ {
+ $page->changeTpl('admin/profile.tpl');
+
+ if (Post::has('checked')) {
+ S::assert_xsrf_token();
+ $res = XDB::iterator('SELECT DISTINCT(pm.pid), pd.public_name
+ FROM profile_modifications AS pm
+ INNER JOIN profile_display AS pd ON (pm.pid = pd.pid)
+ WHERE pm.type = \'self\'');
+
+ while ($profile = $res->next()) {
+ if (Post::has('checked_' . $profile['pid'])) {
+ XDB::execute('DELETE FROM profile_modifications
+ WHERE type = \'self\' AND pid = {?}', $profile['pid']);
+
+ $page->trigSuccess('Profil de ' . $profile['public_name'] . ' vérifié.');
+ }
+ }
+ }
+
+ $res = XDB::iterator('SELECT p.hrpid, pm.pid, pd.directory_name, GROUP_CONCAT(pm.field SEPARATOR \', \') AS field
+ FROM profile_modifications AS pm
+ INNER JOIN profiles AS p ON (pm.pid = p.pid)
+ INNER JOIN profile_display AS pd ON (pm.pid = pd.pid)
+ WHERE pm.type = \'self\'
+ GROUP BY pd.directory_name
+ ORDER BY pd.directory_name');
+ $page->assign('updates', $res);
+ }
+
+ function handler_phd($page, $promo = null, $validate = false)
+ {
+ $page->changeTpl('admin/phd.tpl');
+ $eduDegrees = DirEnum::getOptions(DirEnum::EDUDEGREES);
+ $eduDegrees = array_flip($eduDegrees);
+
+ if (is_null($promo)) {
+ $promo_list = XDB::fetchColumn('SELECT DISTINCT(grad_year)
+ FROM profile_education
+ WHERE FIND_IN_SET(\'primary\', flags) AND NOT FIND_IN_SET(\'completed\', flags) AND degreeid = {?}
+ ORDER BY grad_year',
+ $eduDegrees[Profile::DEGREE_D]);
+ $page->assign('promo_list', $promo_list);
+ $page->assign('nothing', count($promo_list) == 0);
+ return;
+ }
+
+ if ($validate) {
+ S::assert_xsrf_token();
+
+ $list = XDB::iterator('SELECT pe.pid, pd.directory_name
+ FROM profile_education AS pe
+ INNER JOIN profile_display AS pd ON (pe.pid = pd.pid)
+ WHERE FIND_IN_SET(\'primary\', pe.flags) AND NOT FIND_IN_SET(\'completed\', pe.flags)
+ AND pe.degreeid = {?} AND pe.grad_year = {?}',
+ $eduDegrees[Profile::DEGREE_D], $promo);
+ while ($res = $list->next()) {
+ $pid = $res['pid'];
+ $name = $res['directory_name'];
+ if (Post::b('completed_' . $pid)) {
+ $grad_year = Post::t('grad_year_' . $pid);
+ XDB::execute('UPDATE profile_education
+ SET flags = \'primary,completed\', grad_year = {?}
+ WHERE FIND_IN_SET(\'primary\', flags) AND pid = {?}',
+ $grad_year, $pid);
+ XDB::execute('UPDATE profile_display
+ SET promo = {?}
+ WHERE pid = {?}',
+ 'D' . $grad_year, $pid);
+ $page->trigSuccess("Promotion de $name validée.");
+ }
+ }
+ }
+
+ $list = XDB::iterator('SELECT pe.pid, pd.directory_name
+ FROM profile_education AS pe
+ INNER JOIN profile_display AS pd ON (pe.pid = pd.pid)
+ WHERE FIND_IN_SET(\'primary\', pe.flags) AND NOT FIND_IN_SET(\'completed\', pe.flags)
+ AND pe.degreeid = {?} AND pe.grad_year = {?}
+ ORDER BY pd.directory_name',
+ $eduDegrees[Profile::DEGREE_D], $promo);
+ $page->assign('list', $list);
+ $page->assign('promo', $promo);
+ }
+
+ function handler_add_secondary_edu($page)
+ {
+ $page->changeTpl('admin/add_secondary_edu.tpl');
+
+ if (!(Post::has('verify') || Post::has('add'))) {
+ return;
+ } elseif (!Post::has('people')) {
+ $page->trigWarning("Aucune information n'a été fournie.");
+ return;
+ }
+
+ require_once 'name.func.inc.php';
+ $lines = explode("\n", Post::t('people'));
+ $separator = Post::t('separator');
+ $degree = Post::v('degree');
+ $promotion = Post::i('promotion');
+ $schoolsList = array_flip(DirEnum::getOptions(DirEnum::EDUSCHOOLS));
+ $degreesList = array_flip(DirEnum::getOptions(DirEnum::EDUDEGREES));
+ $edu_id = $schoolsList[Profile::EDU_X];
+ $degree_id = $degreesList[$degree];
+
+ $res = array(
+ 'incomplete' => array(),
+ 'empty' => array(),
+ 'multiple' => array(),
+ 'already' => array(),
+ 'new' => array()
+ );
+ $old_pids = array();
+ $new_pids = array();
+ foreach ($lines as $line) {
+ $line = trim($line);
+ $line_array = explode($separator, $line);
+ array_walk($line_array, 'trim');
+ if (count($line_array) != 3) {
+ $page->trigError("La ligne « $line » est incomplète.");
+ $res['incomplete'][] = $line;
+ continue;
+ }
+ $cond = new PFC_And(new UFC_NameTokens(split_name_for_search($line_array[0]), array(), false, false, Profile::LASTNAME));
+ $cond->addChild(new UFC_NameTokens(split_name_for_search($line_array[1]), array(), false, false, Profile::FIRSTNAME));
+ $cond->addChild(new UFC_Promo('=', UserFilter::DISPLAY, $line_array[2]));
+ $uf = new UserFilter($cond);
+ $pid = $uf->getPIDs();
+ $count = count($pid);
+ if ($count == 0) {
+ $page->trigError("La ligne « $line » ne correspond à aucun profil existant.");
+ $res['empty'][] = $line;
+ continue;
+ } elseif ($count > 1) {
+ $page->trigError("La ligne « $line » correspond à plusieurs profils existant.");
+ $res['multiple'][] = $line;
+ continue;
+ } else {
+ $count = XDB::fetchOneCell('SELECT COUNT(*) AS count
+ FROM profile_education
+ WHERE pid = {?} AND eduid = {?} AND degreeid = {?}',
+ $pid, $edu_id, $degree_id);
+ if ($count == 1) {
+ $res['already'][] = $line;
+ $old_pids[] = $pid[0];
+ } else {
+ $res['new'][] = $line;
+ $new_pids[] = $pid[0];
+ }
+ }
+ }
+
+ $display = array();
+ foreach ($res as $type => $res_type) {
+ if (count($res_type) > 0) {
+ $display = array_merge($display, array('--------------------' . $type . ':'), $res_type);
+ }
+ }
+ $page->assign('people', implode("\n", $display));
+ $page->assign('promotion', $promotion);
+ $page->assign('degree', $degree);
+
+ if (Post::has('add')) {
+ $entry_year = $promotion - Profile::educationDuration($degree);
+
+ if (Post::b('force_addition')) {
+ $pids = array_unique(array_merge($old_pids, $new_pids));
+ } else {
+ $pids = array_unique($new_pids);
+
+ // Updates years.
+ if (count($old_pids)) {
+ XDB::execute('UPDATE profile_education
+ SET entry_year = {?}, grad_year = {?}, promo_year = {?}
+ WHERE pid IN {?} AND eduid = {?} AND degreeid = {?}',
+ $entry_year, $promotion, $promotion, $old_pids, $edu_id, $degree_id);
+ }
+ }
+
+ // Precomputes values common to all users.
+ $select = XDB::format('MAX(id) + 1, pid, {?}, {?}, {?}, {?}, {?}, \'secondary\'',
+ $edu_id, $degree_id, $entry_year, $promotion, $promotion );
+ XDB::startTransaction();
+ foreach ($pids as $pid) {
+ XDB::execute('INSERT INTO profile_education (id, pid, eduid, degreeid, entry_year, grad_year, promo_year, flags)
+ SELECT ' . $select . '
+ FROM profile_education
+ WHERE pid = {?}
+ GROUP BY pid',
+ $pid);
+ }
+ XDB::commit();
+ }
+
+ }
+
+ function handler_admin_name($page, $hruid = null)
+ {
+ $page->changeTpl('admin/admin_name.tpl');
+
+ if (Post::has('id')) {
+ $user = User::get(Post::t('id'));
+ if (is_null($user)) {
+ $page->trigError("L'identifiant donné ne correspond à personne ou est ambigu.");
+ exit();
+ }
+ pl_redirect('admin/name/' . $user->hruid);
+ }
+
+ $user = User::getSilent($hruid);
+ if (!is_null($user)) {
+ require_once 'name.func.inc.php';
+
+ if ($user->hasProfile()) {
+ $name_types = array(
+ 'lastname_main' => 'Nom patronymique',
+ 'lastname_marital' => 'Nom marital',
+ 'lastname_ordinary' => 'Nom usuel',
+ 'firstname_main' => 'Prénom',
+ 'firstname_ordinary' => 'Prénom usuel',
+ 'pseudonym' => 'Pseudonyme'
+ );
+ $names = XDB::fetchOneAssoc('SELECT lastname_main, lastname_marital, lastname_ordinary,
+ firstname_main, firstname_ordinary, pseudonym
+ FROM profile_public_names
+ WHERE pid = {?}',
+ $user->profile()->id());
+ } else {
+ $name_types = array(
+ 'lastname' => 'Nom',
+ 'firstname' => 'Prénom'
+ );
+ $names = XDB::fetchOneAssoc('SELECT lastname, firstname
+ FROM accounts
+ WHERE uid = {?}',
+ $user->id());
+ }
+
+ if (Post::has('correct')) {
+ $new_names = array();
+ $update = true;
+ foreach ($name_types as $key => $fullname) {
+ $new_names[$key] = Post::t($key);
+ if (mb_strtolower($new_names[$key]) != mb_strtolower($names[$key])) {
+ $update = false;
+ }
+ }
+
+ if ($update) {
+ if ($user->hasProfile()) {
+ update_public_names($user->profile()->id(), $new_names);
+ update_display_names($user->profile(), $new_names);
+ } else {
+ $new_names['full_name'] = build_full_name($new_names['firstname'], $new_names['lastname']);
+ $new_names['directory_name'] = build_directory_name($new_names['firstname'], $new_names['lastname']);
+ $new_names['sort_name'] = build_sort_name($new_names['firstname'], $new_names['lastname']);
+ XDB::execute('UPDATE accounts
+ SET lastname = {?}, firstname = {?}, full_name = {?},
+ directory_name = {?}, sort_name = {?}
+ WHERE uid = {?}',
+ $new_names['lastname'], $new_names['firstname'], $new_names['full_name'],
+ $new_names['directory_name'], $new_names['sort_name'], $user->id());
+ }
+ $page->trigSuccess('Mise à jour réussie.');
+ } else {
+ $page->trigError('Seuls des changements de casse sont autorisés ici.');
+ }
+ }
+
+ if ($user->hasProfile()) {
+ $names = XDB::fetchOneAssoc('SELECT lastname_main, lastname_marital, lastname_ordinary,
+ firstname_main, firstname_ordinary, pseudonym
+ FROM profile_public_names
+ WHERE pid = {?}',
+ $user->profile()->id());
+ } else {
+ $names = XDB::fetchOneAssoc('SELECT lastname, firstname
+ FROM accounts
+ WHERE uid = {?}',
+ $user->id());
+ }
+
+ foreach ($names as $key => $name) {
+ $names[$key] = array(
+ 'value' => $name,
+ 'standard' => capitalize_name($name)
+ );
+ $names[$key]['different'] = ($names[$key]['value'] != $names[$key]['standard']);
+ }
+
+ $page->assign('uid', $user->id());
+ $page->assign('hruid', $user->hruid);
+ $page->assign('names', $names);
+ $page->assign('name_types', $name_types);
+ }
+ }