Adapts site inscription.
[platal.git] / modules / admin.php
index 1caaa6c..3bf9b1b 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /***************************************************************************
- *  Copyright (C) 2003-2009 Polytechnique.org                              *
+ *  Copyright (C) 2003-2010 Polytechnique.org                              *
  *  http://opensource.polytechnique.org/                                   *
  *                                                                         *
  *  This program is free software; you can redistribute it and/or modify   *
@@ -24,33 +24,32 @@ class AdminModule extends PLModule
     function handlers()
     {
         return array(
-            'phpinfo'                      => $this->make_hook('phpinfo', AUTH_MDP, 'admin'),
-            'get_rights'                   => $this->make_hook('get_rights', AUTH_MDP, 'admin'),
-            'admin'                        => $this->make_hook('default', AUTH_MDP, 'admin'),
-            'admin/ax-xorg'                => $this->make_hook('ax_xorg', AUTH_MDP, 'admin'),
-            'admin/dead-but-active'        => $this->make_hook('dead_but_active', AUTH_MDP, 'admin'),
-            'admin/deaths'                 => $this->make_hook('deaths', AUTH_MDP, 'admin'),
-            'admin/downtime'               => $this->make_hook('downtime', AUTH_MDP, 'admin'),
-            'admin/homonyms'               => $this->make_hook('homonyms', AUTH_MDP, 'admin'),
-            'admin/logger'                 => $this->make_hook('logger', AUTH_MDP, 'admin'),
-            'admin/logger/actions'         => $this->make_hook('logger_actions', AUTH_MDP, 'admin'),
-            'admin/postfix/blacklist'      => $this->make_hook('postfix_blacklist', AUTH_MDP, 'admin'),
-            'admin/postfix/delayed'        => $this->make_hook('postfix_delayed', AUTH_MDP, 'admin'),
+            'phpinfo'                      => $this->make_hook('phpinfo',                AUTH_MDP, 'admin'),
+            'get_rights'                   => $this->make_hook('get_rights',             AUTH_MDP, 'admin'),
+            'admin'                        => $this->make_hook('default',                AUTH_MDP, 'admin'),
+            'admin/ax-xorg'                => $this->make_hook('ax_xorg',                AUTH_MDP, 'admin'),
+            'admin/dead-but-active'        => $this->make_hook('dead_but_active',        AUTH_MDP, 'admin'),
+            'admin/deaths'                 => $this->make_hook('deaths',                 AUTH_MDP, 'admin'),
+            'admin/downtime'               => $this->make_hook('downtime',               AUTH_MDP, 'admin'),
+            'admin/homonyms'               => $this->make_hook('homonyms',               AUTH_MDP, 'admin'),
+            'admin/logger'                 => $this->make_hook('logger',                 AUTH_MDP, 'admin'),
+            'admin/logger/actions'         => $this->make_hook('logger_actions',         AUTH_MDP, 'admin'),
+            'admin/postfix/blacklist'      => $this->make_hook('postfix_blacklist',      AUTH_MDP, 'admin'),
+            'admin/postfix/delayed'        => $this->make_hook('postfix_delayed',        AUTH_MDP, 'admin'),
             'admin/postfix/regexp_bounces' => $this->make_hook('postfix_regexpsbounces', AUTH_MDP, 'admin'),
-            'admin/postfix/whitelist'      => $this->make_hook('postfix_whitelist', AUTH_MDP, 'admin'),
-            'admin/mx/broken'              => $this->make_hook('mx_broken', AUTH_MDP, 'admin'),
-            'admin/skins'                  => $this->make_hook('skins', AUTH_MDP, 'admin'),
-            'admin/synchro_ax'             => $this->make_hook('synchro_ax', AUTH_MDP, 'admin'),
-            'admin/user'                   => $this->make_hook('user', AUTH_MDP, 'admin'),
-            'admin/promo'                  => $this->make_hook('promo', AUTH_MDP, 'admin'),
-            'admin/validate'               => $this->make_hook('validate', AUTH_MDP, 'admin'),
-            'admin/validate/answers'       => $this->make_hook('validate_answers', AUTH_MDP, 'admin'),
-            'admin/wiki'                   => $this->make_hook('wiki', AUTH_MDP, 'admin'),
-            'admin/ipwatch'                => $this->make_hook('ipwatch', AUTH_MDP, 'admin'),
-            'admin/icons'                  => $this->make_hook('icons', AUTH_MDP, 'admin'),
-            'admin/accounts'               => $this->make_hook('accounts', AUTH_MDP, 'admin'),
-            'admin/account/types'          => $this->make_hook('account_types', AUTH_MDP, 'admin'),
-            'admin/jobs'                   => $this->make_hook('jobs', AUTH_MDP, 'admin'),
+            'admin/postfix/whitelist'      => $this->make_hook('postfix_whitelist',      AUTH_MDP, 'admin'),
+            'admin/mx/broken'              => $this->make_hook('mx_broken',              AUTH_MDP, 'admin'),
+            'admin/skins'                  => $this->make_hook('skins',                  AUTH_MDP, 'admin'),
+            'admin/user'                   => $this->make_hook('user',                   AUTH_MDP, 'admin'),
+            'admin/add_accounts'           => $this->make_hook('add_accounts',           AUTH_MDP, 'admin'),
+            'admin/validate'               => $this->make_hook('validate',               AUTH_MDP, 'admin'),
+            'admin/validate/answers'       => $this->make_hook('validate_answers',       AUTH_MDP, 'admin'),
+            'admin/wiki'                   => $this->make_hook('wiki',                   AUTH_MDP, 'admin'),
+            'admin/ipwatch'                => $this->make_hook('ipwatch',                AUTH_MDP, 'admin'),
+            'admin/icons'                  => $this->make_hook('icons',                  AUTH_MDP, 'admin'),
+            'admin/accounts'               => $this->make_hook('accounts',               AUTH_MDP, 'admin'),
+            'admin/account/types'          => $this->make_hook('account_types',          AUTH_MDP, 'admin'),
+            'admin/jobs'                   => $this->make_hook('jobs',                   AUTH_MDP, 'admin'),
         );
     }
 
@@ -85,20 +84,20 @@ class AdminModule extends PLModule
         if (Env::has('del')) {
             $crc = Env::v('crc');
             XDB::execute("UPDATE postfix_mailseen SET release = 'del' WHERE crc = {?}", $crc);
-            $page->trigSuccess($crc." verra tous ses emails supprimés !");
+            $page->trigSuccess($crc . " verra tous ses emails supprimés&nbsp;!");
         } elseif (Env::has('ok')) {
             $crc = Env::v('crc');
             XDB::execute("UPDATE postfix_mailseen SET release = 'ok' WHERE crc = {?}", $crc);
-            $page->trigSuccess($crc." a le droit de passer !");
+            $page->trigSuccess($crc . " a le droit de passer&nbsp;!");
         }
 
         $sql = XDB::iterator(
                 "SELECT  crc, nb, update_time, create_time,
-                         FIND_IN_SET('del', release) AS del,
-                         FIND_IN_SET('ok', release) AS ok
-                   FROM  postfix_mailseen
+                         FIND_IN_SET('del', p.release) AS del,
+                         FIND_IN_SET('ok', p.release) AS ok
+                   FROM  postfix_mailseen AS p
                   WHERE  nb >= 30
-               ORDER BY  release != ''");
+               ORDER BY  p.release != ''");
 
         $page->assign_by_ref('mails', $sql);
     }
@@ -143,7 +142,7 @@ class AdminModule extends PLModule
                                       MONTH(MAX(start)), MONTH(MIN(start)),
                                       DAYOFMONTH(MAX(start)),
                                       DAYOFMONTH(MIN(start))
-                                 FROM logger.sessions");
+                                 FROM log_sessions");
             list($ymax, $ymin, $mmax, $mmin, $dmax, $dmin) = $res->fetchOneRow();
 
             if (($year < $ymin) || ($year == $ymin && $month < $mmin)) {
@@ -181,7 +180,7 @@ class AdminModule extends PLModule
         if ($year) {
             $res = XDB::query("SELECT YEAR (MAX(start)), YEAR (MIN(start)),
                                       MONTH(MAX(start)), MONTH(MIN(start))
-                                 FROM logger.sessions");
+                                 FROM log_sessions");
             list($ymax, $ymin, $mmax, $mmin) = $res->fetchOneRow();
 
             if (($year < $ymin) || ($year > $ymax)) {
@@ -211,7 +210,7 @@ class AdminModule extends PLModule
         $years[0] = "----";
 
         // retrieve available years
-        $res = XDB::query("select YEAR(MAX(start)), YEAR(MIN(start)) FROM logger.sessions");
+        $res = XDB::query("select YEAR(MAX(start)), YEAR(MIN(start)) FROM log_sessions");
         list($max, $min) = $res->fetchOneRow();
 
         for($i = intval($min); $i<=$max; $i++) {
@@ -271,16 +270,16 @@ class AdminModule extends PLModule
 
             // we are viewing a session
             $res = XDB::query("SELECT  ls.*, a.alias AS username, sa.alias AS suer
-                                 FROM  logger.sessions AS ls
-                            LEFT JOIN  aliases         AS a  ON (a.id = ls.uid AND a.type='a_vie')
-                            LEFT JOIN  aliases         AS sa ON (sa.id = ls.suid AND sa.type='a_vie')
+                                 FROM  log_sessions AS ls
+                            LEFT JOIN  aliases   AS a  ON (a.uid = ls.uid AND a.type='a_vie')
+                            LEFT JOIN  aliases   AS sa ON (sa.uid = ls.suid AND sa.type='a_vie')
                                 WHERE  ls.id = {?}", $arg);
 
             $page->assign('session', $a = $res->fetchOneAssoc());
 
             $res = XDB::iterator('SELECT  a.text, e.data, e.stamp
-                                    FROM  logger.events  AS e
-                               LEFT JOIN  logger.actions AS a ON e.action=a.id
+                                    FROM  log_events  AS e
+                               LEFT JOIN  log_actions AS a ON e.action=a.id
                                    WHERE  e.session={?}', $arg);
             while ($myarr = $res->next()) {
                $page->append('events', $myarr);
@@ -289,7 +288,7 @@ class AdminModule extends PLModule
         } else {
             $loguser = $action == 'user' ? $arg : Env::v('loguser');
 
-            $res = XDB::query('SELECT id FROM aliases WHERE alias={?}',
+            $res = XDB::query('SELECT uid FROM aliases WHERE alias={?}',
                               $loguser);
             $loguid  = $res->fetchOneCell();
 
@@ -330,8 +329,8 @@ class AdminModule extends PLModule
                 $where  = $this->_makeWhere($year, $month, $day, $loguid);
                 $select = "SELECT  s.id, s.start, s.uid,
                                    a.alias as username
-                             FROM  logger.sessions AS s
-                        LEFT JOIN  aliases         AS a  ON (a.id = s.uid AND a.type='a_vie')
+                             FROM  log_sessions AS s
+                        LEFT JOIN  aliases   AS a  ON (a.uid = s.uid AND a.type='a_vie')
                     $where
                     ORDER BY start DESC";
                 $res = XDB::iterator($select);
@@ -345,9 +344,9 @@ class AdminModule extends PLModule
 
                 // attach events
                 $sql = "SELECT  s.id, a.text
-                          FROM  logger.sessions AS s
-                    LEFT  JOIN  logger.events   AS e ON(e.session=s.id)
-                    INNER JOIN  logger.actions  AS a ON(a.id=e.action)
+                          FROM  log_sessions AS s
+                    LEFT  JOIN  log_events   AS e ON(e.session=s.id)
+                    INNER JOIN  log_actions  AS a ON(a.id=e.action)
                         $where";
 
                 $res = XDB::iterator($sql);
@@ -368,11 +367,11 @@ class AdminModule extends PLModule
     function handler_user(&$page, $login = false)
     {
         global $globals;
-        $page->changeTpl('admin/utilisateurs.tpl');
+        $page->changeTpl('admin/user.tpl');
         $page->setTitle('Administration - Compte');
 
         if (S::suid()) {
-            $page->kill("Déjà en SUID !!!");
+            $page->kill("Déjà en SUID&nbsp;!!!");
         }
 
         // Loads the user identity using the environment.
@@ -546,7 +545,7 @@ class AdminModule extends PLModule
                     $page->trigError("Impossible d'ajouter l'alias '$alias@$domain', il est probablement déjà attribué");
                 }
             } elseif ($domain == $globals->mail->domain || $domain == $globals->mail->domain2) {
-                $res = XDB::execute("INSERT INTO  aliases (id, alias, type)
+                $res = XDB::execute("INSERT INTO  aliases (uid, alias, type)
                                           VALUES  ({?}, {?}, 'alias')",
                                     $user->id(), $alias);
                 $page->trigSuccess("Nouvel alias '$alias' ajouté");
@@ -555,7 +554,7 @@ class AdminModule extends PLModule
             }
         } else if (!Post::blank('del_alias')) {
             XDB::execute("DELETE FROM  aliases
-                                WHERE  id = {?} AND alias = {?} AND
+                                WHERE  uid = {?} AND alias = {?} AND
                                        type NOT IN ('a_vie', 'homonyme')",
                          $user->id(), $val);
             XDB::execute("UPDATE  emails
@@ -567,10 +566,10 @@ class AdminModule extends PLModule
         } else if (!Post::blank('best')) {
             XDB::execute("UPDATE  aliases
                              SET  flags = TRIM(BOTH ',' FROM REPLACE(CONCAT(',', flags, ','), ',bestalias,', ','))
-                           WHERE  id = {?}", $user->id());
+                           WHERE  uid = {?}", $user->id());
             XDB::execute("UPDATE  aliases
                              SET  flags = CONCAT_WS(',', IF(flags = '', NULL, flags), 'bestalias')
-                           WHERE  id = {?} AND alias = {?}", $user->id(), $val);
+                           WHERE  uid = {?} AND alias = {?}", $user->id(), $val);
             // As having a non-null bestalias value is critical in
             // plat/al's code, we do an a posteriori check on the
             // validity of the bestalias.
@@ -578,6 +577,13 @@ class AdminModule extends PLModule
         }
         // }}}
 
+        // OpenId form {{{
+        if (Post::has('del_openid')) {
+            XDB::execute('DELETE FROM  openid_trusted
+                                WHERE  id = {?}', Post::i('del_openid'));
+        }
+        // }}}
+
         // Forum form {{{
         if (Post::has('b_edit')) {
             XDB::execute("DELETE FROM  forum_innd
@@ -596,10 +602,9 @@ class AdminModule extends PLModule
         $page->addJsLink('ui.core.js');
         $page->addJsLink('ui.tabs.js');
 
-
         // Displays last login and last host information.
         $res = XDB::query("SELECT  start, host
-                             FROM  logger.sessions
+                             FROM  log_sessions
                             WHERE  uid = {?} AND suid = 0
                          ORDER BY  start DESC
                             LIMIT  1", $user->id());
@@ -612,7 +617,7 @@ class AdminModule extends PLModule
         $page->assign('aliases', XDB::iterator("SELECT  alias, type='a_vie' AS for_life,
                                                         FIND_IN_SET('bestalias',flags) AS best, expire
                                                   FROM  aliases
-                                                 WHERE  id = {?} AND type != 'homonyme'
+                                                 WHERE  uid = {?} AND type != 'homonyme'
                                               ORDER BY  type != 'a_vie'", $user->id()));
         $page->assign('account_types', XDB::iterator('SELECT * FROM account_types ORDER BY type'));
         $page->assign('skins', XDB::iterator('SELECT id, name FROM skins ORDER BY name'));
@@ -620,6 +625,9 @@ class AdminModule extends PLModule
                                                    FROM  account_profiles AS ap
                                              INNER JOIN  profiles AS p ON (ap.pid = p.pid)
                                                   WHERE  ap.uid = {?}', $user->id()));
+        $page->assign('openid', XDB::iterator('SELECT  id, url
+                                                 FROM  openid_trusted
+                                                WHERE  user_id = {?}', $user->id()));
 
         // Displays email redirection and the general profile.
         if ($registered && $redirect) {
@@ -636,65 +644,164 @@ class AdminModule extends PLModule
         $page->assign('bans', $bans);
     }
 
-    function getHruid($line, $partial_result, $key)
+    private static function getHrid($firstname, $lastname, $promo)
     {
-        if (!isset($partial_result['nom']) ||
-            !isset($partial_result['prenom']) ||
-            !isset($partial_result['promo'])) {
-            return null;
+        if ($firstname != null && $lastname != null && $promo != null) {
+            return User::makeHrid($firstname, $lastname, $promo);
         }
-        return make_forlife($partial_result['prenom'], $partial_result['nom'], $partial_result['promo']);
+        return null;
     }
 
-    function getMatricule($line, $key)
+    private static function formatNewUser($infosLine, $separator, $promo, $size)
     {
-        $mat = $line['matricule'];
-        $year = intval(substr($mat, 0, 3));
-        $rang = intval(substr($mat, 3, 3));
-        if ($year > 200) { $year /= 10; };
-        if ($year < 96) {
-            return null;
-        } else {
-            return sprintf('%04u%04u', 1900+$year, $rang);
+        $infos = explode($separator, $infosLine);
+        if (sizeof($infos) != $size) {
+            return false;
+        }
+
+        array_map('trim', $infos);
+        $hrid = self::getHrid($infos[1], $infos[0], $promo);
+        $res1 = XDB::query('SELECT  COUNT(*)
+                              FROM  accounts
+                             WHERE  hruid = {?}', $hrid);
+        $res2 = XDB::query('SELECT  COUNT(*)
+                              FROM  profiles
+                             WHERE  hrpid = {?}', $hrid);
+        if (is_null($hrid) || $res1->fetchOneCell() > 0 || $res2->fetchOneCell() > 0) {
+            $page->trigError("La ligne $line n'a pas été ajoutée.");
+            return false;
         }
+        $infos['hrid'] = $hrid;
+        return $infos;
     }
 
-    function handler_promo(&$page, $action = null, $promo = null)
+    private static function formatSex(&$page, $sex, $line)
     {
-        if (Env::has('promo')) {
-            if(Env::i('promo') > 1900 && Env::i('promo') < 2050) {
-                $action = Env::v('valid_promo') == 'Ajouter des membres' ? 'add' : 'ax';
-                pl_redirect('admin/promo/' . $action . '/' . Env::i('promo'));
-            } else {
-                $page->trigError('Promotion non valide.');
-            }
+        switch ($sex) {
+          case 'F':
+            return PlUser::GENDER_FEMALE;
+          case 'M':
+            return PlUser::GENDER_MALE;
+          default:
+            $page->trigError("La ligne $line n'a pas été ajoutée car le sexe $sex n'est pas pris en compte.");
+            return null;
         }
+    }
 
-        $page->changeTpl('admin/promo.tpl');
-        if ($promo > 1900 && $promo < 2050 && ($action == 'add' || $action == 'ax')) {
-            $page->assign('promo', $promo);
-        } else {
-            return;
-        }
+    private static function formatBirthDate($birthDate)
+    {
+        return date("Y-m-d", strtotime($birthDate));
+    }
 
-        $importer = new CSVImporter('auth_user_md5', 'matricule');
-        $importer->registerFunction('matricule', 'matricule Ecole vers X.org', array($this, 'getMatricule'));
-        switch ($action) {
-          case 'add':
-            $fields = array('hruid', 'nom', 'nom_ini', 'prenom', 'naissance_ini',
-                            'prenom_ini', 'promo', 'promo_sortie', 'flags',
-                            'matricule', 'matricule_ax', 'perms');
-            $importer->forceValue('promo', $promo);
-            $importer->forceValue('promo_sortie', $promo + 3);
-            // The hruid generation callback is set last, so that it is called once 'promo'
-            // has already been computed for that line.
-            $importer->forceValue('hruid', array($this, 'getHruid'));
-            break;
-          case 'ax':
-            $fields = array('matricule', 'matricule_ax');
-            break;
+    function handler_add_accounts(&$page, $action = null, $promo = null)
+    {
+        $page->changeTpl('admin/add_accounts.tpl');
+
+        if (Env::has('add_type') && Env::has('people')) {
+            require_once 'directory.enums.inc.php';
+            $lines = explode("\n", Env::t('people'));
+            $separator = Env::t('separator');
+            $promotion = Env::i('promotion');
+            $nameTypes = DirEnum::getOptions(DirEnum::NAMETYPES);
+            $nameTypes = array_flip($nameTypes);
+
+            if (Env::t('add_type') == 'promo') {
+                $type = 'x';
+                $eduSchools = DirEnum::getOptions(DirEnum::EDUSCHOOLS);
+                $eduSchools = array_flip($eduSchools);
+                $eduDegrees = DirEnum::getOptions(DirEnum::EDUDEGREES);
+                $eduDegrees = array_flip($eduDegrees);
+                var_dump($eduDegrees);
+                switch (Env::t('edu_type')) {
+                  case 'X':
+                    $degreeid = $eduDegrees[Profile::DEGREE_X];
+                    $entry_year = $promotion;
+                    $grad_year = $promotion + 3;
+                    $promo = 'X' . $promotion;
+                    break;
+                  case 'M':
+                    $degreeid = $eduDegrees[Profile::DEGREE_M];
+                    $grad_year = $promotion;
+                    $entry_year = $promotion - 2;
+                    $promo = 'M' . $promotion;
+                    break;
+                  case 'D':
+                    $degreeid = $eduDegrees[Profile::DEGREE_D];
+                    $grad_year = $promotion;
+                    $entry_year = $promotion - 3;
+                    $promo = 'D' . $promotion;
+                    break;
+                  default:
+                    $page->killError("La formation n'est pas reconnue:" . Env::t('edu_type') . '.');
+                }
+
+                foreach ($lines as $line) {
+                    if (($infos = self::formatNewUser($line, $separator, $promotion, 6))
+                        && ($sex = self::formatSex($page, $infos[3], $line))) {
+                        $name = $infos[1] . ' ' . $infos[0];
+                        $birthDate = self::formatBirthDate($infos[2]);
+                        $xorgId = Profile::getXorgId($infos[4]);
+
+                        XDB::execute('INSERT INTO  profiles (hrpid, xorg_id, ax_id, birthdate_ref, sex)
+                                           VALUES  ({?}, {?}, {?}, {?})',
+                                     $infos['hrid'], $xorgId, $infos[5], $birthDate, $sex);
+                        $pid = XDB::insertId();
+                        XDB::execute('INSERT INTO  profile_name (pid, name, typeid)
+                                           VALUES  ({?}, {?}, {?})',
+                                     $pid, $infos[0], $nameTypes['name_ini']);
+                        XDB::execute('INSERT INTO  profile_name (pid, name, typeid)
+                                           VALUES  ({?}, {?}, {?})',
+                                     $pid, $infos[1], $nameTypes['firstname_ini']);
+                        XDB::execute('INSERT INTO  profile_display (pid, yourself, public_name, private_name,
+                                                                    directory_name, short_name, sort_name, promo)
+                                           VALUES  ({?}, {?}, {?}, {?}, {?}, {?}, {?}, {?})',
+                                     $pid, $infos[1], $name, $name, $name, $name, $infos[0] . ' ' . $infos[1], $promo);
+                        XDB::execute('INSERT INTO  profile_education (pid, eduid, degreeid, entry_year, grad_year, flags)
+                                           VALUES  ({?}, {?}, {?}, {?}, {?}, {?})',
+                                     $pid, $eduSchools[Profile::EDU_X], $degreeid, $entry_year, $grad_year, 'primary');
+                        XDB::execute('INSERT INTO  accounts (hruid, type, is_admin, state, full_name, display_name, sex)
+                                           VALUES  ({?}, {?}, {?}, {?}, {?}, {?}, {?})',
+                                     $infos['hrid'], $type, 0, 'active', $name, $infos[1], $sex);
+                        $uid = XDB::insertId();
+                        XDB::execute('INSERT INTO  account_profiles (uid, pid, perms)
+                                           VALUES  ({?}, {?}, {?})',
+                                     $uid, $pid, 'owner');
+                    }
+                }
+            } else if (Env::t('add_type') == 'account') {
+                $type = Env::t('type');
+                foreach ($lines as $line) {
+                    if (($infos = self::formatNewUser($line, $separator, $type, 4))
+                        && ($sex = self::formatSex(&$page, $infos[3], $line))) {
+                        XDB::execute('INSERT INTO  accounts (hruid, type, is_admin, state, email, full_name, display_name, sex)
+                                           VALUES  ({?}, {?}, {?}, {?}, {?}, {?}, {?}, {?})',
+                                     $infos['hrid'], $type, 0, 'active', $infos[2], $infos[1] . ' ' . $infos[0], $infos[1], $sex);
+                    }
+                }
+            } else if (Env::t('add_type') == 'ax_id') {
+                $type = 'x';
+                foreach ($lines as $line) {
+                    if ($infos = self::formatNewUser($line, $separator, $promotion, 3)) {
+                        XDB::execute('UPDATE  profiles
+                                         SET  ax_id = {?}
+                                       WHERE  hrpid = {?}',
+                                     $infos[2], $infos['hrid']);
+                    }
+                }
+            }
+
+            if ($page->nb_errs == 0) {
+                $page->trigSuccess("L'opération a été effectuée avec succès.");
+            } else {
+                $page->trigSuccess("L'opération a été effectuée avec succès, sauf pour les "
+                                   . $page->nb_errs . 'erreurs signalées ci-dessus.');
+            }
+        } else if (Env::has('add_type')) {
+            $res = XDB::query('SELECT  type
+                                 FROM  account_types');
+            $page->assign('account_types', $res->fetchColumn());
+            $page->assign('add_type', Env::s('add_type'));
         }
-        $importer->apply($page, "admin/promo/$action/$promo", $fields);
     }
 
     function handler_homonyms(&$page, $op = 'list', $target = null)
@@ -736,7 +843,7 @@ class AdminModule extends PLModule
                     XDB::execute("UPDATE  aliases
                                      SET  type = 'homonyme', expire=NOW()
                                    WHERE  alias = {?}", $loginbis);
-                    XDB::execute("REPLACE INTO  homonymes (homonyme_id,user_id)
+                    XDB::execute("REPLACE INTO  homonyms (homonyme_id, uid)
                                         VALUES  ({?}, {?})", $target, $target);
                     send_robot_homonyme($user, $loginbis);
                     $op = 'list';
@@ -752,9 +859,9 @@ class AdminModule extends PLModule
                              IF(h.homonyme_id = s.id, a.type, NULL) AS type,
                              ac.uid AS user_id
                        FROM  aliases       AS a
-                  LEFT JOIN  homonymes     AS h ON (h.homonyme_id = a.id)
-                 INNER JOIN  aliases       AS s ON (s.id = h.user_id AND s.type='a_vie')
-                 INNER JOIN  accounts      AS ac ON (ac.uid = a.id)
+                  LEFT JOIN  homonyms      AS h ON (h.homonyme_id = a.uid)
+                 INNER JOIN  aliases       AS s ON (s.uid = h.uid AND s.type='a_vie')
+                 INNER JOIN  accounts      AS ac ON (ac.uid = a.uid)
                       WHERE  a.type = 'homonyme' OR a.expire != ''
                    ORDER BY  a.alias, forlife");
             $hnymes = Array();
@@ -817,15 +924,15 @@ class AdminModule extends PLModule
         $page->setTitle('Administration - Décédés');
 
         $res = XDB::iterator(
-                'SELECT  a.hruid, pd.promo, p.ax_id, pd.directory_name, p.deathdate, DATE(MAX(s.start)) AS last
-                   FROM  accounts AS a
-             INNER JOIN  account_profiles AS ap ON (ap.uid = a.uid AND FIND_IN_SET(\'owner\', ap.perms))
-             INNER JOIN  profiles AS p ON (p.pid = ap.pid)
-             INNER JOIN  profile_display AS pd ON (pd.pid = p.pid)
-              LEFT JOIN  logger.sessions AS s ON (s.uid = a.uid AND suid = 0)
-                  WHERE  a.state = \'active\' AND p.deathdate IS NOT NULL
+                "SELECT  a.hruid, pd.promo, p.ax_id, pd.directory_name, p.deathdate, DATE(MAX(s.start)) AS last
+                   FROM  accounts         AS a
+             INNER JOIN  account_profiles AS ap ON (ap.uid = a.uid AND FIND_IN_SET('owner', ap.perms))
+             INNER JOIN  profiles         AS p ON (p.pid = ap.pid)
+             INNER JOIN  profile_display  AS pd ON (pd.pid = p.pid)
+              LEFT JOIN  log_sessions        AS s ON (s.uid = a.uid AND suid = 0)
+                  WHERE  a.state = 'active' AND p.deathdate IS NOT NULL
                GROUP BY  a.uid
-               ORDER BY  pd.promo, pd.sort_name');
+               ORDER BY  pd.promo, pd.sort_name");
         $page->assign('dead', $res);
     }
 
@@ -942,7 +1049,7 @@ class AdminModule extends PLModule
     {
         $page->setTitle('Administration - Actions');
         $page->assign('title', 'Gestion des actions de logger');
-        $table_editor = new PLTableEditor('admin/logger/actions','logger.actions','id');
+        $table_editor = new PLTableEditor('admin/logger/actions','log_actions','id');
         $table_editor->describe('text','intitulé',true);
         $table_editor->describe('description','description',true);
         $table_editor->apply($page, $action, $id);
@@ -952,7 +1059,7 @@ class AdminModule extends PLModule
     {
         $page->setTitle('Administration - Coupures');
         $page->assign('title', 'Gestion des coupures');
-        $table_editor = new PLTableEditor('admin/downtime','coupures','id');
+        $table_editor = new PLTableEditor('admin/downtime','downtimes','id');
         $table_editor->describe('debut','date',true);
         $table_editor->describe('duree','durée',false);
         $table_editor->describe('resume','résumé',true);
@@ -1084,10 +1191,10 @@ class AdminModule extends PLModule
                                      IF(w.ip = s2.ip, s2.host, s2.forward_host),
                                      IF(w.ip = s.ip, s.host, s.forward_host)),
                             w.mask, w.detection, w.state, a.hruid
-                      FROM  ip_watch        AS w
-                 LEFT JOIN  logger.sessions AS s  ON (s.ip = w.ip)
-                 LEFT JOIN  logger.sessions AS s2 ON (s2.forward_ip = w.ip)
-                 LEFT JOIN  accounts        AS a  ON (a.uid = s.uid)
+                      FROM  ip_watch  AS w
+                 LEFT JOIN  log_sessions AS s  ON (s.ip = w.ip)
+                 LEFT JOIN  log_sessions AS s2 ON (s2.forward_ip = w.ip)
+                 LEFT JOIN  accounts  AS a  ON (a.uid = s.uid)
                   GROUP BY  w.ip, a.hruid
                   ORDER BY  w.state, w.ip, a.hruid";
             $it = Xdb::iterRow($sql);
@@ -1118,10 +1225,10 @@ class AdminModule extends PLModule
         } elseif ($action == 'edit') {
             $sql = "SELECT  w.detection, w.state, w.last, w.description, w.mask,
                             a1.hruid AS edit, a2.hruid AS hruid, s.host
-                      FROM  ip_watch        AS w
-                 LEFT JOIN  accounts        AS a1 ON (a1.uid = w.uid)
-                 LEFT JOIN  logger.sessions AS s  ON (w.ip = s.ip)
-                 LEFT JOIN  accounts        AS a2 ON (a2.uid = s.uid)
+                      FROM  ip_watch  AS w
+                 LEFT JOIN  accounts  AS a1 ON (a1.uid = w.uid)
+                 LEFT JOIN  log_sessions AS s  ON (w.ip = s.ip)
+                 LEFT JOIN  accounts  AS a2 ON (a2.uid = s.uid)
                      WHERE  w.ip = {?}
                   GROUP BY  a2.hruid
                   ORDER BY  a2.hruid";
@@ -1199,20 +1306,41 @@ class AdminModule extends PLModule
         }
 
         if (Env::has('edit')) {
+            // TODO: use address and phone classes to update profile_job_enum and profile_phones once they are done.
+
             S::assert_xsrf_token();
             $selectedJob = Env::has('selectedJob');
 
+            XDB::execute("DELETE FROM  profile_phones
+                                WHERE  pid = {?} AND link_type = 'hq'",
+                         $id);
+            XDB::execute("DELETE FROM  profile_addresses
+                                WHERE  jobid = {?} AND type = 'hq'",
+                         $id);
+            XDB::execute('DELETE FROM  profile_job_enum
+                                WHERE  id = {?}',
+                         $id);
+
             if (Env::has('change')) {
                 XDB::execute('UPDATE  profile_job
                                  SET  jobid = {?}
                                WHERE  jobid = {?}',
                              Env::i('newJobId'), $id);
-                XDB::execute('DELETE FROM  profile_job_enum
-                                    WHERE  id = {?}',
-                             $id);
 
                 $page->trigSuccess("L'entreprise a bien été remplacée.");
             } else {
+                require_once 'profil.func.inc.php';
+                require_once 'geocoding.inc.php';
+
+                $display_tel = format_display_number(Env::v('tel'), $error_tel);
+                $display_fax = format_display_number(Env::v('fax'), $error_fax);
+                $gmapsGeocoder = new GMapsGeocoder();
+                $address = array('text' => Env::t('address'));
+                $address = $gmapsGeocoder->getGeocodedAddress($address);
+                Geocoder::getAreaId($address, 'administrativeArea');
+                Geocoder::getAreaId($address, 'subAdministrativeArea');
+                Geocoder::getAreaId($address, 'locality');
+
                 XDB::execute('UPDATE  profile_job_enum
                                  SET  name = {?}, acronym = {?}, url = {?}, email = {?},
                                       NAF_code = {?}, AX_code = {?}, holdingid = {?}
@@ -1220,16 +1348,41 @@ class AdminModule extends PLModule
                              Env::t('name'), Env::t('acronym'), Env::t('url'), Env::t('email'),
                              Env::t('NAF_code'), Env::i('AX_code'), Env::i('holdingId'), $id);
 
+                XDB::execute("INSERT INTO  profile_phones (pid, link_type, link_id, tel_id, tel_type,
+                                           search_tel, display_tel, pub)
+                                   VALUES  ({?}, 'hq', 0, 0, 'fixed', {?}, {?}, 'public'),
+                                           ({?}, 'hq', 0, 1, 'fax', {?}, {?}, 'public')",
+                             $id, format_phone_number(Env::v('tel')), $display_tel,
+                             $id, format_phone_number(Env::v('fax')), $display_fax);
+
+                XDB::execute("INSERT INTO  profile_addresses (jobid, type, id, accuracy,
+                                                              text, postalText, postalCode, localityId,
+                                                              subAdministrativeAreaId, administrativeAreaId,
+                                                              countryId, latitude, longitude, updateTime,
+                                                              north, south, east, west)
+                                   VALUES  ({?}, 'hq', 0, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?},
+                                            {?}, {?}, FROM_UNIXTIME({?}), {?}, {?}, {?}, {?})",
+                             $id, $address['accuracy'], $address['text'], $address['postalText'],
+                             $address['postalCode'], $address['localityId'],
+                             $address['subAdministrativeAreaId'], $address['administrativeAreaId'],
+                             $address['countryId'], $address['latitude'], $address['longitude'],
+                             $address['updateTime'], $address['north'], $address['south'],
+                             $address['east'], $address['west']);
+
                 $page->trigSuccess("L'entreprise a bien été mise à jour.");
             }
         }
 
         if (!Env::has('change') && $id != -1) {
-            $res = XDB::query('SELECT  e.id, e.name, e.acronym, e.url, e.email, e.NAF_code, e.AX_code,
-                                       h.id AS holdingId, h.name AS holdingName, h.acronym AS holdingAcronym
-                                 FROM  profile_job_enum AS e
-                            LEFT JOIN  profile_job_enum AS h ON (e.holdingid = h.id)
-                                WHERE  e.id = {?}',
+            $res = XDB::query("SELECT  e.id, e.name, e.acronym, e.url, e.email, e.NAF_code, e.AX_code,
+                                       h.id AS holdingId, h.name AS holdingName, h.acronym AS holdingAcronym,
+                                       t.display_tel AS tel, f.display_tel AS fax, a.text AS address
+                                 FROM  profile_job_enum  AS e
+                            LEFT JOIN  profile_job_enum  AS h ON (e.holdingid = h.id)
+                            LEFT JOIN  profile_phones    AS t ON (t.pid = e.id AND link_type = 'hq' AND tel_id = 0)
+                            LEFT JOIN  profile_phones    AS f ON (f.pid = e.id AND link_type = 'hq' AND tel_id = 1)
+                            LEFT JOIN  profile_addresses AS a ON (a.jobid = e.id AND a.type = 'hq')
+                                WHERE  e.id = {?}",
                               $id);
 
             if ($res->numRows() == 0) {