Merge commit 'origin/master' into fusionax
authorFlorent Bruneau <florent.bruneau@polytechnique.org>
Fri, 14 Nov 2008 20:07:29 +0000 (21:07 +0100)
committerFlorent Bruneau <florent.bruneau@polytechnique.org>
Fri, 14 Nov 2008 20:07:29 +0000 (21:07 +0100)
Conflicts:

ChangeLog
htdocs/xorg.php
templates/profile/general.tpl

Signed-off-by: Florent Bruneau <florent.bruneau@polytechnique.org>
133 files changed:
ChangeLog
bin/cron/checkdb.php
bin/cron/clean.php
bin/cron/phones.check.php [new file with mode: 0755]
classes/user.php
configs/.gitignore
configs/platal.cron.in
core
htdocs/css/default.css
htdocs/css/keynote.css
htdocs/images/networking/aim.png [new file with mode: 0644]
htdocs/images/networking/bonjour.png [new file with mode: 0644]
htdocs/images/networking/copains.png [new file with mode: 0644]
htdocs/images/networking/facebook.png [new file with mode: 0644]
htdocs/images/networking/gadu-gadu.png [new file with mode: 0644]
htdocs/images/networking/gpg.png [new file with mode: 0644]
htdocs/images/networking/gtalk.png [new file with mode: 0644]
htdocs/images/networking/hi5.png [new file with mode: 0644]
htdocs/images/networking/icq.png [new file with mode: 0644]
htdocs/images/networking/irc.png [new file with mode: 0644]
htdocs/images/networking/jabber.png [new file with mode: 0644]
htdocs/images/networking/lastfm.png [new file with mode: 0644]
htdocs/images/networking/linkedin.png [new file with mode: 0644]
htdocs/images/networking/meanwhile.png [new file with mode: 0644]
htdocs/images/networking/msn.png [new file with mode: 0644]
htdocs/images/networking/myspace.png [new file with mode: 0644]
htdocs/images/networking/netvibes.png [new file with mode: 0644]
htdocs/images/networking/novell.png [new file with mode: 0644]
htdocs/images/networking/plaxo.png [new file with mode: 0644]
htdocs/images/networking/qq.png [new file with mode: 0644]
htdocs/images/networking/silc.png [new file with mode: 0644]
htdocs/images/networking/simple.png [new file with mode: 0644]
htdocs/images/networking/skype.png [new file with mode: 0644]
htdocs/images/networking/viadeo.png [new file with mode: 0644]
htdocs/images/networking/web.gif [new file with mode: 0644]
htdocs/images/networking/xing.png [new file with mode: 0644]
htdocs/images/networking/yahoo.png [new file with mode: 0644]
htdocs/images/networking/youtube.png [new file with mode: 0644]
htdocs/images/networking/zephyr.png [new file with mode: 0644]
htdocs/javascript/profile.js
htdocs/xorg.php
include/applis.func.inc.php [deleted file]
include/education.func.inc.php [new file with mode: 0644]
include/emails.combobox.inc.php [new file with mode: 0644]
include/notifs.inc.php
include/profil.func.inc.php
include/user.func.inc.php
include/userset.inc.php
include/validations.inc.php
include/validations/orange.inc.php
include/webservices/manageurs.server.inc.php
include/xorg/session.inc.php [new file with mode: 0644]
modules/admin.php
modules/email.php
modules/events.php
modules/fusionax.php [new file with mode: 0644]
modules/fusionax/Activites.sql [new file with mode: 0644]
modules/fusionax/Adresses.sql [new file with mode: 0644]
modules/fusionax/Anciens.sql [new file with mode: 0644]
modules/fusionax/Entreprises.sql [new file with mode: 0644]
modules/fusionax/Formations.sql [new file with mode: 0644]
modules/fusionax/formation.pl [new file with mode: 0755]
modules/fusionax/import-ax.sh [new file with mode: 0755]
modules/geoloc.php
modules/payment/money/paypal.inc.php
modules/profile.php
modules/profile/addresses.inc.php
modules/profile/general.inc.php
modules/profile/jobs.inc.php
modules/profile/page.inc.php
modules/search.php
modules/search/classes.inc.php
modules/search/search.inc.php
plugins/function.display_address.php
plugins/function.display_phones.php [new file with mode: 0644]
plugins/function.select_nat.php
templates/admin/index.tpl
templates/core/vcard.tpl [new file with mode: 0644]
templates/emails/redirect.tpl
templates/events/index.tpl
templates/fusionax/deceased.tpl [new file with mode: 0644]
templates/fusionax/ids.tpl [new file with mode: 0644]
templates/fusionax/idsMissingInAx.tpl [new file with mode: 0644]
templates/fusionax/idsMissingInXorg.tpl [new file with mode: 0644]
templates/fusionax/idswrongInXorg.tpl [new file with mode: 0644]
templates/fusionax/import.tpl [moved from templates/profile/adresses.tel.tpl with 67% similarity]
templates/fusionax/index.tpl [new file with mode: 0644]
templates/fusionax/listFusion.tpl [new file with mode: 0644]
templates/fusionax/promo.tpl [new file with mode: 0644]
templates/fusionax/view.tpl [new file with mode: 0644]
templates/gadgets/ig-minifiche.tpl
templates/include/emails.combobox.tpl [new file with mode: 0644]
templates/include/minifiche.tpl
templates/include/plview.referent.tpl
templates/include/plview.trombi.tpl
templates/include/trombi.tpl
templates/marketing/private.tpl
templates/profile/adresses.address.tpl
templates/profile/edu.tpl [new file with mode: 0644]
templates/profile/education.js.tpl [moved from templates/profile/applis.js.tpl with 90% similarity]
templates/profile/general.networking.tpl [new file with mode: 0644]
templates/profile/general.searchname.tpl [new file with mode: 0644]
templates/profile/general.tpl
templates/profile/jobs.job.tpl
templates/profile/jobs.tpl
templates/profile/orange.tpl
templates/profile/phone.tpl [new file with mode: 0644]
templates/profile/profile.tpl
templates/search/adv.form.tpl
templates/search/adv.grade.form.tpl
upgrade/merge-0.0.1/000_1920.sql [new file with mode: 0644]
upgrade/merge-0.0.1/00_names.sql [new file with mode: 0644]
upgrade/merge-0.0.1/01_emails.sql [new file with mode: 0644]
upgrade/merge-0.0.1/02_ax_data.sql [new file with mode: 0644]
upgrade/merge-0.0.1/03_corps.sql [new file with mode: 0644]
upgrade/merge-0.0.1/04_nationalities.sql [new file with mode: 0644]
upgrade/merge-0.0.1/05_check_nationalities.sql [new file with mode: 0644]
upgrade/merge-0.0.1/06_merge_nationalities.sql [new file with mode: 0644]
upgrade/merge-0.0.1/07_education.php [new file with mode: 0755]
upgrade/newdirectory-0.0.1/00_names.sql [new file with mode: 0644]
upgrade/newdirectory-0.0.1/01_addrcomment.sql [new file with mode: 0644]
upgrade/newdirectory-0.0.1/02_networking.sql [new file with mode: 0644]
upgrade/newdirectory-0.0.1/03_emails.sql [new file with mode: 0644]
upgrade/newdirectory-0.0.1/04_telephone.sql [new file with mode: 0644]
upgrade/newdirectory-0.0.1/05_nationalities.sql [new file with mode: 0644]
upgrade/newdirectory-0.0.1/06_education.sql [new file with mode: 0644]
upgrade/newdirectory-0.0.1/07_corps [new file with mode: 0644]
upgrade/newdirectory-0.0.1/08_nationalities.sql [new file with mode: 0644]
upgrade/newdirectory-0.0.1/09_education.sql [new file with mode: 0644]
upgrade/newdirectory-0.0.1/10_promotion.sql [new file with mode: 0644]
upgrade/newdirectory-0.0.1/connect.db.inc.php [new file with mode: 0644]
upgrade/newdirectory-0.0.1/phones.php [new file with mode: 0755]
upgrade/newdirectory-0.0.1/update.sh [new file with mode: 0755]

index c55d219..bbfbc4c 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,18 @@
 ================================================================================
+VERSION 0.f.0                                                         XX XX XXXX
+
+New:
+    * Core:
+        - Centralises email management through an email combobox           -JAC
+
+Bug/Wish:
+    * Profile:
+        - #188: Adds informations about the Corps d'État                   -JAC
+        - #209: Thoroughly changes education's implementation              -JAC
+        - #386: Adds the possibility to fill in multiple nationalities     -JAC
+        - #891: Improves education display                                 -JAC
+
+================================================================================
 VERSION 0.10.0                                                        XX XX XXXX
 
 New:
@@ -1282,7 +1296,9 @@ ACRONYMS:
     * CAT: Florian El Ahdab     (LeChat)    <florian.el-ahdab@m4x.org>
     * FAL: Raphaël Marichez     (Falco)     <raphael.marichez@m4x.org>
     * FRU: Florent Bruneau      (Fruneau)   <florent.bruneau@m4x.org>
+    * GUI: Guillaume Bandet     (GUI)       <guillaume.bandet@m4x.org>
     * JAC: Stéphane Jacob       (jacou)     <stephane.jacob@m4x.org>
+    * JM : Jean-Marc Bécu                   <jean-marc.becu@m4x.org>
     * JS : Jean Sébastien Bedo              <jean-sebastien.bedo@m4x.org>
     * MC : Pierre Habouzit      (MadCoder)  <pierre.habouzit@m4x.org>
     * mYk: Aymeric Augustin     (mYk)       <aymeric.augustin@m4x.org>
index f70e566..9d4794c 100755 (executable)
@@ -73,17 +73,16 @@ if ( PEAR::isError($opts) ) {
 
 /* Validite des flags de transmission */
 check("SELECT  u.user_id, nom, prenom, promo,
-               profile_mobile_pub, emails_alias_pub, profile_web_pub, profile_freetext_pub, profile_medals_pub
+               emails_alias_pub, profile_freetext_pub, profile_medals_pub
          FROM  auth_user_md5 AS u
    INNER JOIN  auth_user_quick AS q USING(user_id)
-        WHERE  (profile_mobile_pub != 'private' AND profile_mobile_pub != 'ax' AND profile_mobile_pub != 'public')
-           OR  (emails_alias_pub != 'private' AND emails_alias_pub != 'public')
-           OR  (profile_web_pub != 'private' AND profile_web_pub != 'public')
+        WHERE  (emails_alias_pub != 'private' AND emails_alias_pub != 'public')
            OR  (profile_freetext_pub != 'private' AND profile_freetext_pub != 'public')
            OR  (profile_medals_pub != 'private' AND profile_medals_pub != 'public')",
     "Utilisateur n'ayant pas de flag de publicite pour leurs donnees de profil");
 check("select uid from adresses where pub != 'private' and pub !='ax' and pub != 'public'", "Utiliseur n'ayant pas de flag de publicite pour une adresse");
-check("select uid from tels where tel_pub != 'private' and tel_pub !='ax' and tel_pub != 'public'", "Utiliseur n'ayant pas de flag de publicite pour un numero de telephone");
+check("select uid from profile_phones where pub != 'private' and pub != 'ax' and pub != 'public'", "Utiliseur n'ayant pas de flag de publicite pour un numero de téléphone");
+check("select uid from profile_networking where pub != 'private' and pub != 'public'", "Utiliseur n'ayant pas de flag de publicité pour une adresse de networking");
 
 /* validite des hruid */
 check("SELECT user_id, nom, prenom, promo FROM auth_user_md5 WHERE hruid IS NULL OR hruid = ''",
@@ -95,9 +94,9 @@ check("SELECT a.*
         LEFT JOIN auth_user_md5 AS u ON u.user_id=a.id
         WHERE (a.type='alias' OR a.type='a_vie') AND u.prenom is null");
 
-/* validite de applis_ins */
-check("select a.* from applis_ins as a left join auth_user_md5 as u on u.user_id=a.uid where u.prenom is null");
-check("select a.* from applis_ins as a left join applis_def as ad on ad.id=a.aid where ad.text is null");
+/* validite de profile_education */
+check("select a.* from profile_education as a left join auth_user_md5 as u on u.user_id=a.uid where u.prenom is null");
+check("select a.* from profile_education as a left join profile_education_enum as ad on ad.id=a.eduid where ad.name is null");
 
 /* validite de binet_users */
 check("select b.* from binets_ins as b left join auth_user_md5 as u on u.user_id=b.user_id where u.prenom is null");
@@ -123,6 +122,16 @@ check("select g.* from groupesx_ins as g left join groupesx_def as gd on g.gid=g
 /* validite de photo */
 check("select p.* from photo as p left join auth_user_md5 as u on u.user_id=p.uid where u.prenom is null");
 
+/* validite des formats téléphoniques */
+check("SELECT DISTINCT g.phoneprf from geoloc_pays AS g
+          WHERE EXISTS (SELECT h.phoneprf
+                          FROM geoloc_pays AS h
+                         WHERE h.phoneprf = g.phoneprf AND h.phoneformat != (SELECT i.phoneformat
+                                                                               FROM geoloc_pays AS i
+                                                                              WHERE i.phoneprf = g.phoneprf
+                                                                              LIMIT 1))",
+      "Préfixes téléphoniques qui ont des formats de numéros de téléphones différents selon les pays");
+
 /* validite des champ pays et region */
 check("SELECT a.uid, a.country FROM adresses AS a LEFT JOIN geoloc_pays AS gp ON a.country = gp.a2 WHERE gp.pays IS NULL","donne la liste des pays dans les profils qui n'ont pas d'entree correspondante dans geoloc_pays");
 /* les régions ne sont valides que dans les adresses pros */
@@ -179,7 +188,25 @@ check("SELECT  matricule,nom,prenom,matricule_ax,COUNT(matricule_ax) AS c
         WHERE  matricule_ax != '0'
         GROUP BY  matricule_ax
         having  c > 1", "à chaque personne de l'annuaire de l'AX (identification_ax) doit correspondre AU PLUS UNE personne de notre annuaire (auth_user_md5) -> si ce n'est pas le cas il faut regarder en manuel ce qui ne va pas !");
-
+        
+/* each alumni has one and only one display name by default and one and only one name when we talk to him directly */
+check("SELECT u.`user_id`, u.`nom`, u.`prenom`, COUNT(n.`display`) AS c
+        FROM `auth_user_md5` AS u
+        LEFT JOIN `profile_names_display` AS n ON(u.`user_id` = n.`user_id` AND FIND_IN_SET(n.`reason`, 'default'))
+        GROUP BY u.`user_id`
+        HAVING c != 1", "chaque personne doit avoir un et un seul nom par défaut");
+check("SELECT u.`user_id`, u.`nom`, u.`prenom`, COUNT(n.`display`) AS c
+        FROM `auth_user_md5` AS u
+        LEFT JOIN `profile_names_display` AS n ON(u.`user_id` = n.`user_id` AND FIND_IN_SET(n.`reason`, 'yourself'))
+        GROUP BY u.`user_id`
+        HAVING c != 1", "chaque personne doit avoir un et un seul nom quand on lui parle");
+
+/* no alumni is allowed to have empty names */
+check("SELECT u.`user_id`, u.`nom`, u.`prenom`
+        FROM `auth_user_md5` AS u
+        INNER JOIN `profile_names_search` AS n USING(`user_id`)
+        WHERE n.`search_name` = ''", "liste des personnes qui ont un de leur nom de recherche vide");
+        
 /* verifie qu'il n'y a pas d'utilisateurs ayant un compte Google Apps désactivé et une redirection encore active vers Google Apps */
 check("SELECT  a.alias, g.g_status, u.mail_storage
          FROM  auth_user_md5 AS u
index 9744d97..243ebdd 100755 (executable)
@@ -37,7 +37,7 @@ query("DELETE FROM register_pending WHERE TO_DAYS(NOW()) - TO_DAYS(date) >= 365"
 query("DELETE FROM register_pending WHERE hash = 'INSCRIT'");
 
 // quelques tables sont triées pour que la lecture triée soit plus facile
-query("ALTER TABLE applis_def ORDER BY text");
+query("ALTER TABLE profile_education_enum ORDER BY name");
 query("ALTER TABLE binets_def ORDER BY text");
 query("ALTER TABLE groupesx_def ORDER BY text");
 query("ALTER TABLE secteur ORDER BY text");
diff --git a/bin/cron/phones.check.php b/bin/cron/phones.check.php
new file mode 100755 (executable)
index 0000000..077e2fe
--- /dev/null
@@ -0,0 +1,100 @@
+#!/usr/bin/php5
+<?php
+
+require('./connect.db.inc.php');
+require_once('profil.func.inc.php');
+
+$globals->debug = 0; //do not store backtraces
+
+
+function do_update_by_block($values)
+{
+    // Update display_tel by block
+    // Because there is no mysql update syntax for multiple updates in one query
+    // we use a multiple insert syntax which will fail because the key already exist
+    // and then update the display_tel
+    XDB::execute("INSERT INTO  profile_phones (uid, link_type, link_id, tel_id ,tel_type,
+                                          search_tel, display_tel, pub, comment)
+                       VALUES  " . $values . "
+      ON DUPLICATE KEY UPDATE  display_tel = VALUES(display_tel)");
+}
+
+$res = XDB::query("SELECT DISTINCT g.phoneprf FROM geoloc_pays AS g WHERE g.phoneprf IS NOT NULL");
+$prefixes = $res->fetchColumn();
+foreach ($prefixes as $i => $prefix) {
+    $res = XDB::query("SELECT g.phoneformat FROM geoloc_pays AS g
+                        WHERE g.phoneprf = {?} AND g.phoneformat != '' LIMIT 1",
+                      $prefix);
+    if ($res->numRows() > 0) {
+        $format = $res->fetchOneCell();
+        //Build regexp for mysql query
+        $len = strlen($format);
+        $regexp = "^";
+        $nbPar = 0;
+        for ($i = 0; $i < $len; $i++) {
+            $char = $format[$i];
+            switch ($char) {
+            case 'p':
+                $regexp .= $prefix;
+                break;
+            case '#':
+                if ($nbPar == 0) {
+                    $regexp .= '(';
+                    $nbPar++;
+                }
+                $regexp .= '[0-9](';
+                $nbPar++;
+                break;
+            default:
+                //Appends the char after escaping it if necessary
+                $escape = array('[', ']', '{', '}', '(', ')', '*', '+', '?', '.', '^', '$', '|', '\\');
+                if (in_array($char, $escape)) {
+                    $regexp .= '[' . $char . ']';
+                } else {
+                    $regexp .= $char;
+                }
+            }
+        }
+        //allows additionnal spaces and numbers
+        $regexp .= '[0-9 ]*';
+        //closes parenthesis
+        for ($i = 0; $i < $nbPar; $i++) {
+            $regexp .= ')?';
+        }
+        $regexp .= '$';
+        $res = XDB::iterator("SELECT uid, link_type, link_id, tel_id, tel_type, search_tel,
+                                     display_tel, pub, comment
+                                FROM profile_phones
+                               WHERE search_tel LIKE {?} AND display_tel NOT REGEXP {?}",
+                             $prefix . '%', $regexp);
+        if ($res->numRows() > 0)
+        {
+            //To speed up the update of phone numbers, theses updates are grouped by block of 1000
+            $values = '';
+            $i = 0;
+            while ($phone = $res->next()) {
+                $disp = format_display_number($phone['search_tel'], $error, array('format' => $format, 'phoneprf' => $prefix));
+                if ($values != '') {
+                    $values .= ",\n";
+                }
+                $values .= "('"   . addslashes($phone['uid']) . "', '" . addslashes($phone['link_type'])
+                    . "', '" . addslashes($phone['link_id'])
+                    . "', '" . addslashes($phone['tel_id']) . "', '" . addslashes($phone['tel_type'])
+                    . "', '" . addslashes($phone['search_tel']) . "', '" . addslashes($disp)
+                    . "', '" . addslashes($phone['pub']) . "', '" . addslashes($phone['comment']) . "')";
+                $i++;
+                if ($i == 1000) {
+                    do_update_by_block($values);
+                    $values = '';
+                    $i = 0;
+                }
+            }
+            if ($values != '') {
+                do_update_by_block($values);
+            }
+        }
+    }
+}
+
+// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
+?>
index eb112ca..e7c7472 100644 (file)
@@ -117,7 +117,7 @@ class User extends PlUser
         }
 
         global $globals;
-        $res = XDB::query("SELECT  u.hruid, u.promo,
+        $res = XDB::query("SELECT  u.hruid, d.promo_display AS promo,
                                    CONCAT(af.alias, '@{$globals->mail->domain}') AS forlife,
                                    CONCAT(ab.alias, '@{$globals->mail->domain}') AS bestalias,
                                    CONCAT(u.prenom, ' ', IF(u.nom_usage <> '', u.nom_usage, u.nom)) AS full_name,
@@ -126,6 +126,7 @@ class User extends PlUser
                                    q.core_mail_fmt AS email_format,
                                    u.perms
                              FROM  auth_user_md5 AS u
+                       INNER JOIN  profile_display AS d ON (d.uid = u.user_id)
                         LEFT JOIN  auth_user_quick AS q ON (q.user_id = u.user_id)
                         LEFT JOIN  aliases AS af ON (af.id = u.user_id AND af.type = 'a_vie')
                         LEFT JOIN  aliases AS ab ON (ab.id = u.user_id AND FIND_IN_SET('bestalias', ab.flags))
index 08b9b45..8767aa4 100644 (file)
@@ -1,3 +1,4 @@
 platal.conf
 platal.cron
+ax_xorg_rsa.pem
 *.pem
index fafa58b..0994ace 100644 (file)
@@ -7,6 +7,7 @@ WD=/home/web/prod/platal/bin/cron
 0 21 * * 1-6   web     cd $WD; ./checkdb.php    | mail -e -s "verifications sur la BDD de plat/al @VERSION@"         br@staff.m4x.org
 0 21 * * 0     web     cd $WD; ./checkdb.php -v | mail -e -s "verifications verbose sur la BDD de plat/al @VERSION@" br@staff.m4x.org
 0 20 * * *      web     cd $WD; ./emails.check.php | mail -e -s "qualite de l'annuaire"                   br@staff.m4x.org
+0 22 * * *      web     cd $WD; ./phones.check.php > /dev/null
 
 # inscription report
 0  6 * * 1     web     cd $WD; ./rapports_inscription.php
diff --git a/core b/core
index 7b64cc7..30b4d21 160000 (submodule)
--- a/core
+++ b/core
@@ -1 +1 @@
-Subproject commit 7b64cc7438eba834c765eef056628e2f1e6ea823
+Subproject commit 30b4d2149c5fa19fccb09a4f6b286b3a52344245
index 9a526ff..70e0fed 100644 (file)
@@ -107,6 +107,10 @@ p {
     background: inherit;
 }
 
+.hinted {
+    border-bottom: 1px dashed black;
+}
+
 input.error, textarea.error {
     background-color: #faa;
 }
index 9ab2eed..7092ea0 100644 (file)
@@ -322,7 +322,7 @@ div.contact div.nom a {
     font-size: 100%;
 }
 
-div.contact div.appli {
+div.contact div.edu {
 }
 
 div.contact div.bits {
diff --git a/htdocs/images/networking/aim.png b/htdocs/images/networking/aim.png
new file mode 100644 (file)
index 0000000..c47703b
Binary files /dev/null and b/htdocs/images/networking/aim.png differ
diff --git a/htdocs/images/networking/bonjour.png b/htdocs/images/networking/bonjour.png
new file mode 100644 (file)
index 0000000..8ff4740
Binary files /dev/null and b/htdocs/images/networking/bonjour.png differ
diff --git a/htdocs/images/networking/copains.png b/htdocs/images/networking/copains.png
new file mode 100644 (file)
index 0000000..52cae73
Binary files /dev/null and b/htdocs/images/networking/copains.png differ
diff --git a/htdocs/images/networking/facebook.png b/htdocs/images/networking/facebook.png
new file mode 100644 (file)
index 0000000..2731863
Binary files /dev/null and b/htdocs/images/networking/facebook.png differ
diff --git a/htdocs/images/networking/gadu-gadu.png b/htdocs/images/networking/gadu-gadu.png
new file mode 100644 (file)
index 0000000..2d060a1
Binary files /dev/null and b/htdocs/images/networking/gadu-gadu.png differ
diff --git a/htdocs/images/networking/gpg.png b/htdocs/images/networking/gpg.png
new file mode 100644 (file)
index 0000000..97a6498
Binary files /dev/null and b/htdocs/images/networking/gpg.png differ
diff --git a/htdocs/images/networking/gtalk.png b/htdocs/images/networking/gtalk.png
new file mode 100644 (file)
index 0000000..e80b03b
Binary files /dev/null and b/htdocs/images/networking/gtalk.png differ
diff --git a/htdocs/images/networking/hi5.png b/htdocs/images/networking/hi5.png
new file mode 100644 (file)
index 0000000..6648a29
Binary files /dev/null and b/htdocs/images/networking/hi5.png differ
diff --git a/htdocs/images/networking/icq.png b/htdocs/images/networking/icq.png
new file mode 100644 (file)
index 0000000..d08637c
Binary files /dev/null and b/htdocs/images/networking/icq.png differ
diff --git a/htdocs/images/networking/irc.png b/htdocs/images/networking/irc.png
new file mode 100644 (file)
index 0000000..19d578d
Binary files /dev/null and b/htdocs/images/networking/irc.png differ
diff --git a/htdocs/images/networking/jabber.png b/htdocs/images/networking/jabber.png
new file mode 100644 (file)
index 0000000..77a3f64
Binary files /dev/null and b/htdocs/images/networking/jabber.png differ
diff --git a/htdocs/images/networking/lastfm.png b/htdocs/images/networking/lastfm.png
new file mode 100644 (file)
index 0000000..d2e1075
Binary files /dev/null and b/htdocs/images/networking/lastfm.png differ
diff --git a/htdocs/images/networking/linkedin.png b/htdocs/images/networking/linkedin.png
new file mode 100644 (file)
index 0000000..3c796dc
Binary files /dev/null and b/htdocs/images/networking/linkedin.png differ
diff --git a/htdocs/images/networking/meanwhile.png b/htdocs/images/networking/meanwhile.png
new file mode 100644 (file)
index 0000000..59b819c
Binary files /dev/null and b/htdocs/images/networking/meanwhile.png differ
diff --git a/htdocs/images/networking/msn.png b/htdocs/images/networking/msn.png
new file mode 100644 (file)
index 0000000..896d90c
Binary files /dev/null and b/htdocs/images/networking/msn.png differ
diff --git a/htdocs/images/networking/myspace.png b/htdocs/images/networking/myspace.png
new file mode 100644 (file)
index 0000000..040f3d1
Binary files /dev/null and b/htdocs/images/networking/myspace.png differ
diff --git a/htdocs/images/networking/netvibes.png b/htdocs/images/networking/netvibes.png
new file mode 100644 (file)
index 0000000..b464fff
Binary files /dev/null and b/htdocs/images/networking/netvibes.png differ
diff --git a/htdocs/images/networking/novell.png b/htdocs/images/networking/novell.png
new file mode 100644 (file)
index 0000000..76ca119
Binary files /dev/null and b/htdocs/images/networking/novell.png differ
diff --git a/htdocs/images/networking/plaxo.png b/htdocs/images/networking/plaxo.png
new file mode 100644 (file)
index 0000000..c0973e6
Binary files /dev/null and b/htdocs/images/networking/plaxo.png differ
diff --git a/htdocs/images/networking/qq.png b/htdocs/images/networking/qq.png
new file mode 100644 (file)
index 0000000..d5f51ac
Binary files /dev/null and b/htdocs/images/networking/qq.png differ
diff --git a/htdocs/images/networking/silc.png b/htdocs/images/networking/silc.png
new file mode 100644 (file)
index 0000000..2fb91eb
Binary files /dev/null and b/htdocs/images/networking/silc.png differ
diff --git a/htdocs/images/networking/simple.png b/htdocs/images/networking/simple.png
new file mode 100644 (file)
index 0000000..14db36c
Binary files /dev/null and b/htdocs/images/networking/simple.png differ
diff --git a/htdocs/images/networking/skype.png b/htdocs/images/networking/skype.png
new file mode 100644 (file)
index 0000000..2b8a088
Binary files /dev/null and b/htdocs/images/networking/skype.png differ
diff --git a/htdocs/images/networking/viadeo.png b/htdocs/images/networking/viadeo.png
new file mode 100644 (file)
index 0000000..ddf5aca
Binary files /dev/null and b/htdocs/images/networking/viadeo.png differ
diff --git a/htdocs/images/networking/web.gif b/htdocs/images/networking/web.gif
new file mode 100644 (file)
index 0000000..9fad760
Binary files /dev/null and b/htdocs/images/networking/web.gif differ
diff --git a/htdocs/images/networking/xing.png b/htdocs/images/networking/xing.png
new file mode 100644 (file)
index 0000000..05c925a
Binary files /dev/null and b/htdocs/images/networking/xing.png differ
diff --git a/htdocs/images/networking/yahoo.png b/htdocs/images/networking/yahoo.png
new file mode 100644 (file)
index 0000000..4cff5da
Binary files /dev/null and b/htdocs/images/networking/yahoo.png differ
diff --git a/htdocs/images/networking/youtube.png b/htdocs/images/networking/youtube.png
new file mode 100644 (file)
index 0000000..5024200
Binary files /dev/null and b/htdocs/images/networking/youtube.png differ
diff --git a/htdocs/images/networking/zephyr.png b/htdocs/images/networking/zephyr.png
new file mode 100644 (file)
index 0000000..fcc40a8
Binary files /dev/null and b/htdocs/images/networking/zephyr.png differ
index 108ce44..315fc38 100644 (file)
@@ -24,10 +24,14 @@ function wizPage_onLoad(id)
 {
     switch (id) {
       case 'general':
-        fillType(document.forms.prof_annu['appli1[type]'], document.forms.prof_annu['appli1[id]'].selectedIndex-1);
-        selectType(document.forms.prof_annu['appli1[type]'], document.forms.prof_annu['appli1_tmp'].value);
-        fillType(document.forms.prof_annu['appli2[type]'], document.forms.prof_annu['appli2[id]'].selectedIndex-1);
-        selectType(document.forms.prof_annu['appli2[type]'], document.forms.prof_annu['appli2_tmp'].value);
+        var i = 0;
+        var prefix  = 'edu_';
+        while ($('.' + prefix + i).length != 0) {
+            i++;
+        }
+        for (var j = 0; j < i; j++) {
+            prepareType(j);
+        }
         break;
       case 'poly':
         updateGroupSubLink(document.forms.prof_annu.groupesx_sub);
@@ -52,44 +56,144 @@ function wizPage_onLoad(id)
     }
 }
 
-var applisType;
-var applisTypeAll;
+var educationDegree;
+var educationDegreeAll;
+var educationDegreeName;
 
 // General
 
 var subgrades;
 var names;
-function fillType(selectCtrl, appli, fill)
+function fillType(selectCtrl, edu, fill)
 {
     var i;
-    var i0=0;
+    var i0 = 0;
 
-    for (i = selectCtrl.options.length; i >=0; i--) {
+    for (i = selectCtrl.options.length; i >= 0; i--) {
         selectCtrl.options[i] = null;
     }
 
-    if (fill || appli <0) {
+    if (fill || edu < 0) {
         selectCtrl.options[0] = new Option(' ');
-        i0=1;
+        i0 = 1;
+    }
+    if (edu >= 0) {
+        for (i = 0; i < educationDegree[edu].length; i++) {
+            selectCtrl.options[i0 + i] = new Option(educationDegreeName[educationDegree[edu][i] - 1], educationDegree[edu][i]);
+        }
+    } else if (fill) {
+        for (i = 0; i < educationDegreeAll.length; i++) {
+            selectCtrl.options[i0 + i] = new Option(educationDegreeName[educationDegreeAll[i] - 1], educationDegreeAll[i]);
+        }
     }
-    if (appli>=0)
-        for (i=0; i < applisType[appli].length; i++)
-            selectCtrl.options[i0+i] = new Option(applisType[appli][i]);
-    else if (fill)
-        for (i=0; i < applisTypeAll.length; i++)
-            selectCtrl.options[i0+i] = new Option(applisTypeAll[i]);
 }
 
 
 function selectType(selectCtrl, type)
 {
     for (i = 0; i < selectCtrl.options.length; i++) {
-        if (selectCtrl.options[i].text == type)
-            selectCtrl.selectedIndex=i;
+        if (selectCtrl.options[i].value == type) {
+            selectCtrl.selectedIndex = i;
+        }
     }
 }
 
+function prepareType(i)
+{
+    fillType(document.forms.prof_annu["edus[" + i + "][degreeid]"], document.forms.prof_annu["edus[" + i + "][eduid]"].selectedIndex - 1);
+    selectType(document.forms.prof_annu["edus[" + i + "][degreeid]"], document.forms.prof_annu["edu_" + i + "_tmp"].value);
+}
+
+function addSearchName()
+{
+  var i = 0;
+  while (document.getElementById('search_name_' + i) != null) {
+      i++;
+  }
+  $('#add_search_name').before('<div id="search_name_' + i + '" style="padding:2px" class="center"></div>');
+  Ajax.update_html('search_name_' + i, 'profile/ajax/searchname/' + i,function(){
+    $('#search_name_'+i+' input')[1].focus();
+  });
+}
 
+function removeSearchName(i)
+{
+  if (document.getElementById('search_name_'+i+'_new') != null) {
+    $('#search_name_'+i).remove();
+  } else {
+    removeObject('search_name_'+i, 'search_name['+i+']');
+  }
+}
+
+function delNationality(i)
+{
+    $('#nationalite' + i).hide().find('select').val('');
+}
+
+function addNationality()
+{
+    var i = 0;
+    if ($('#nationalite2').find('select').val() == "") {
+        i = 2;
+    } else if ($('#nationalite3').find('select').val() == "") {
+        i = 3;
+    }
+    if ((i == 2) || (i == 3)) {
+        $('#nationalite' + i).show();
+    }
+}
+
+function addNetworking()
+{
+    var i = 0;
+    var nws = 'networking_';
+    while (document.getElementById(nws + i) != null) {
+        i++;
+    }
+    var namefirst = '';
+    var html = '<tr id="networking_' + i + '">'
+        + '  <td colspan="2">'
+        + '    <div style="float: left; width: 200px;">'
+        + '      <span class="flags">'
+        + '        <input type="checkbox" name="networking[' + i + '][pub]"/>'
+        + '        <img src="images/icons/flag_green.gif" alt="site public" title="site public">'
+        + '      </span>&nbsp;'
+        + '      <select id="networking_type_' + i + '" name="networking[' + i + '][type]" onchange="javascript:updateNetworking(' + i + ');">';
+    for (nw in nw_list) {
+        if (namefirst == '') {
+            namefirst = nw;
+        }
+        html += '  <option value="' + nw_list[nw] + '">' + nw + '</option>';
+    }
+    html += '</select>'
+        + '      <input type="hidden" id="networking_name_' + i + '" name="networking[' + i + '][name]" value="' + namefirst + '"/>'
+        + '    </div>'
+        + '    <div style="float: left">'
+        + '      <input type="text" name="networking[' + i + '][address]" value="" size="30"/>'
+        + '      <a href="javascript:removeNetworking(' + i + ')">'
+        + '        <img src="images/icons/cross.gif" alt="cross" title="Supprimer cet élément"/>'
+        + '      </a>'
+        + '    </div>'
+        + '  </td>'
+        + '</tr>';
+
+    $('#networking').before(html);
+}
+
+function removeNetworking(id)
+{
+    $('#networking_' + id).remove();
+}
+
+function updateNetworking(i)
+{
+    var name = document.getElementById('networking_name_' + i);
+    var type = document.getElementById('networking_type_' + i);
+    if (type != null && name != null) {
+        name.value = type.options[type.selectedIndex].text;
+    }
+
+}
 
 // Addresses
 
@@ -166,18 +270,74 @@ function addAddress()
     Ajax.update_html('addresses_' + i + '_cont', 'profile/ajax/address/' + i, checkCurrentAddress);
 }
 
-function addTel(id)
+function addEdu()
+{
+    var i = 0;
+    var j = 0;
+    var prefix  = 'edu_';
+    var class_parity;
+
+    while (!$('#edu_add').hasClass(prefix + i)) {
+        if ($('.' + prefix + i).length != 0) {
+            j++;
+        }
+        i++;
+    }
+    if (j % 2) {
+        class_parity = 'pair';
+    } else {
+        class_parity = 'impair';
+    }
+    $('#edu_add').removeClass(prefix + i);
+    i++;
+    $('#edu_add').addClass(prefix + i);
+    i--;
+    $.get(platal_baseurl + 'profile/ajax/edu/' + i + '/' + class_parity,
+          function(data) {
+              $('#edu_add').before(data);
+              prepareType(i);
+          });
+}
+
+function removeEdu(i)
+{
+    var prefix  = 'edu_';
+    $('.' + prefix + i).remove();
+    while (!$('#edu_add').hasClass(prefix + i)) {
+        $('.' + prefix + i).toggleClass('pair');
+        $('.' + prefix + i).toggleClass('impair');
+        i++;
+    }
+}
+
+function addTel(prefid, prefname)
 {
     var i = 0;
-    var adid = 'addresses_' + id;
-    var tel  = adid + '_tel_';
-    while (document.getElementById(tel + i) != null) {
+    var prefix  = prefid + '_';
+    while (document.getElementById(prefix + i) != null) {
         i++;
     }
-    $('#' + adid + '_add_tel').before('<div id="' + tel + i + '" style="clear: both"></div>');
-    Ajax.update_html(tel + i, 'profile/ajax/tel/' + id + '/' + i);
+    $('#' + prefix + 'add').before('<div id="' + prefix + i + '" style="clear: both; padding-top: 4px; padding-bottom: 4px"></div>');
+    Ajax.update_html(prefix + i, 'profile/ajax/tel/' + prefid + '/' + prefname + '/' + i);
 }
 
+function removeTel(id)
+{
+    $('#' + id).remove();
+}
+
+function addPhoneComment(id, pref)
+{
+    document.getElementById(id+'_comment').style.display = '';
+    document.getElementById(id+'_addComment').style.display = 'none';
+}
+
+function removePhoneComment(id, pref)
+{
+    document.getElementById(id+'_comment').style.display = 'none';
+    document.forms.prof_annu[pref+ '[comment]'].value = '';
+    document.getElementById(id+'_addComment').style.display = '';
+}
 
 // Geoloc
 
index 6098a04..e3516a5 100644 (file)
@@ -25,7 +25,7 @@ $platal = new Xorg('auth', 'carnet', 'email', 'events', 'forums',
                    'geoloc', 'lists', 'marketing', 'payment', 'platal',
                    'profile', 'register', 'search', 'stats', 'admin',
                    'newsletter', 'axletter', 'bandeau', 'survey',
-                   'gadgets', 'googleapps', 'poison', 'openid');
+                   'fusionax', 'gadgets', 'googleapps', 'poison', 'openid');
 
 if (!($path = Env::v('n')) || ($path{0} < 'A' || $path{0} > 'Z')) {
     $platal->run();
diff --git a/include/applis.func.inc.php b/include/applis.func.inc.php
deleted file mode 100644 (file)
index 82235db..0000000
+++ /dev/null
@@ -1,91 +0,0 @@
-<?php
-/***************************************************************************
- *  Copyright (C) 2003-2008 Polytechnique.org                              *
- *  http://opensource.polytechnique.org/                                   *
- *                                                                         *
- *  This program is free software; you can redistribute it and/or modify   *
- *  it under the terms of the GNU General Public License as published by   *
- *  the Free Software Foundation; either version 2 of the License, or      *
- *  (at your option) any later version.                                    *
- *                                                                         *
- *  This program is distributed in the hope that it will be useful,        *
- *  but WITHOUT ANY WARRANTY; without even the implied warranty of         *
- *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
- *  GNU General Public License for more details.                           *
- *                                                                         *
- *  You should have received a copy of the GNU General Public License      *
- *  along with this program; if not, write to the Free Software            *
- *  Foundation, Inc.,                                                      *
- *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                *
- ***************************************************************************/
-
-function applis_options($current=0) {
-    $html = '<option value="-1"></option>';
-    $res  = XDB::iterator("select * from applis_def order by text");
-    while ($arr_appli = $res->next()) {
-        $html .= '<option value="'.$arr_appli["id"].'"';
-        if ($arr_appli["id"]==$current) $html .= " selected='selected'";
-        $html .= '>'.htmlspecialchars($arr_appli["text"])."</option>\n";
-    }
-    return $html;
-}
-/** pour appeller applis_options depuis smarty
- */
-function _applis_options_smarty($params){
-    if(!isset($params['selected']))
-        $params['selected'] = 0;
-    return applis_options($params['selected']);
-}
-Platal::page()->register_function('applis_options','_applis_options_smarty');
-
-
-/** affiche un Array javascript contenant les types de chaque appli
- */
-function applis_type(){
-    $html = "";
-    $res=XDB::iterRow("select type from applis_def order by text");
-    if (list($appli_type) = $res->next()) {
-        $html .= "new Array('".str_replace(",","','",$appli_type)."')";
-    }
-    while (list($appli_type) = $res->next()) {
-        $html .= ",\nnew Array('".str_replace(",","','",$appli_type)."')";
-    }
-    return $html;
-}
-Platal::page()->register_function('applis_type','applis_type');
-
-/** affiche tous les types possibles d'applis
- */
-function applis_type_all(){
-    $res = XDB::query("show columns from applis_def like 'type'");
-    $arr_appli = $res->fetchOneAssoc();
-    return str_replace(")","",str_replace("set(","",$arr_appli["Type"]));
-}
-Platal::page()->register_function('applis_type_all','applis_type_all');
-
-/** formatte une ecole d'appli pour l'affichage
- */
-function applis_fmt($type, $text, $url) {
-    $txt="";
-    if (($type != "Ingénieur") && ($type != "Diplôme"))
-        $txt .= $type;
-    if ($text != "Université") {
-        if ($txt) $txt .= ' ';
-        if ($url)
-            $txt .= "<a href=\"$url\" onclick=\"return popup(this)\">$text</a>";
-        else
-            $txt .= $text;
-    }
-    if (!$txt) {
-        $txt .= $text;
-    }
-    return $txt;
-}
-function _applis_fmt($params, &$smarty) {
-    extract($params);
-    return applis_fmt($type, $text, $url);
-}
-Platal::page()->register_function('applis_fmt','_applis_fmt');
-
-// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
-?>
diff --git a/include/education.func.inc.php b/include/education.func.inc.php
new file mode 100644 (file)
index 0000000..857774e
--- /dev/null
@@ -0,0 +1,172 @@
+<?php
+/***************************************************************************
+ *  Copyright (C) 2003-2008 Polytechnique.org                              *
+ *  http://opensource.polytechnique.org/                                   *
+ *                                                                         *
+ *  This program is free software; you can redistribute it and/or modify   *
+ *  it under the terms of the GNU General Public License as published by   *
+ *  the Free Software Foundation; either version 2 of the License, or      *
+ *  (at your option) any later version.                                    *
+ *                                                                         *
+ *  This program is distributed in the hope that it will be useful,        *
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of         *
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
+ *  GNU General Public License for more details.                           *
+ *                                                                         *
+ *  You should have received a copy of the GNU General Public License      *
+ *  along with this program; if not, write to the Free Software            *
+ *  Foundation, Inc.,                                                      *
+ *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                *
+ ***************************************************************************/
+
+function education_options($current = 0)
+{
+    $html = '<option value="-1"></option>';
+    $res  = XDB::iterator("SELECT  e.id AS id, e.name AS name, g.pays AS country
+                             FROM  profile_education_enum AS e
+                        LEFT JOIN  geoloc_pays            AS g ON (e.country = g.a2)
+                     WHERE EXISTS  (SELECT  *
+                                      FROM  profile_education_degree AS d
+                                     WHERE  e.id = d.eduid)
+                         ORDER BY  g.pays, e.name");
+    $country = "";
+    while ($arr_edu = $res->next()) {
+        if ($arr_edu["country"] != $country) {
+            $country = $arr_edu["country"];
+            $html .= "<optgroup label=" . $country . ">";
+        }
+        $html .= '<option value="' . $arr_edu["id"] . '"';
+        if ($arr_edu["id"] == $current) {
+            $html .= " selected='selected'";
+        }
+        $html .= '>' . htmlspecialchars($arr_edu["name"]) . "</option>\n";
+    }
+    return $html;
+}
+
+/** pour appeller education_options depuis smarty
+ */
+function _education_options_smarty($params)
+{
+    if(!isset($params['selected'])) {
+        $params['selected'] = 0;
+    }
+    return education_options($params['selected']);
+}
+Platal::page()->register_function('education_options', '_education_options_smarty');
+
+/** affiche un Array javascript contenant les diplômes de chaque formation
+ */
+function education_degree()
+{
+    $html = "";
+    $res = XDB::iterRow("SELECT  d.eduid, d.degreeid
+                           FROM  profile_education_enum   AS e
+                     INNER JOIN  profile_education_degree AS d ON (e.id = d.eduid)
+                      LEFT JOIN  geoloc_pays              AS g ON (e.country = g.a2)
+                       ORDER BY  g.pays, e.name");
+    if ($edu_degree = $res->next()) {
+        $eduid = $edu_degree['0'];
+        $html .= "[";
+        $html .= $edu_degree['1'];
+        $edu_degree = $res->next();
+        while ($edu_degree['0'] == $eduid) {
+            $html .= "," . $edu_degree['1'];
+            $edu_degree = $res->next();
+        }
+        $html .= "]";
+    }
+    while ($edu_degree) {
+        $eduid = $edu_degree['0'];
+        $html .= ",\n[";
+        $html .= $edu_degree['1'];
+        $edu_degree = $res->next();
+        while ($edu_degree['0'] == $eduid) {
+            $html .= "," . $edu_degree['1'];
+            $edu_degree = $res->next();
+        }
+        $html .= "]";
+    }
+    return $html;
+}
+Platal::page()->register_function('education_degree', 'education_degree');
+
+/** affiche tous les types possibles de diplômes
+ */
+function education_degree_all()
+{
+    $res = XDB::query("SELECT  id
+                         FROM  profile_education_degree_enum
+                     ORDER BY  id");
+    return implode(',', $res->fetchColumn());
+}
+Platal::page()->register_function('education_degree_all', 'education_degree_all');
+
+/** affiche les noms de tous les diplômes possibles
+ */
+function education_degree_name()
+{
+    $res = XDB::query("SELECT  degree
+                         FROM  profile_education_degree_enum
+                     ORDER BY  id");
+    return '"' . implode('","', $res->fetchColumn()) . '"';
+}
+Platal::page()->register_function('education_degree_name', 'education_degree_name');
+
+/** formatte une formation pour l'affichage
+ */
+function education_fmt($name, $url, $degree, $grad_year, $field, $program, $sexe, $long)
+{
+    $field = strtolower($field);
+    $txt = "";
+
+    if ($grad_year || $field || $program) {
+        $txt .= "<span title=\"(";
+        if ($program) {
+            $txt .= $program;
+            if ($grad_year || $field) {
+                $txt .= ", ";
+            }
+        }
+        if ($grad_year) {
+            if ($sexe) {
+                $txt .= "diplômée en $grad_year";
+            } else {
+                $txt .= "diplômé en $grad_year";
+            }
+            if ($field) {
+                $txt .= ", ";
+            }
+        }
+        if ($field) {
+            $txt .= "domaine : $field)\">";
+        }
+    }
+
+    if (($degree != "Lic.") || ($long)) {
+        if (($degree != "Ing.") && ($degree != "Dipl.")) {
+            $txt .= $degree;
+        }
+        if ($name) {
+            $txt .= ' ';
+        }
+        if ($url != ' ') {
+            $txt .= "<a href=\"$url\" onclick=\"return popup(this)\">$name</a>";
+        } else {
+            $txt .= $name;
+        }
+    }
+    $txt .= "</span>";
+
+    return $txt;
+}
+
+function _education_fmt($params, &$smarty)
+{
+    extract($params);
+    return education_fmt($name, $url, $degree, $grad_year, $field, $program, $sexe, $long);
+}
+Platal::page()->register_function('education_fmt', '_education_fmt');
+
+// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
+?>
diff --git a/include/emails.combobox.inc.php b/include/emails.combobox.inc.php
new file mode 100644 (file)
index 0000000..d91cf9b
--- /dev/null
@@ -0,0 +1,109 @@
+<?php
+/***************************************************************************
+ *  Copyright (C) 2003-2008 Polytechnique.org                              *
+ *  http://opensource.polytechnique.org/                                   *
+ *                                                                         *
+ *  This program is free software; you can redistribute it and/or modify   *
+ *  it under the terms of the GNU General Public License as published by   *
+ *  the Free Software Foundation; either version 2 of the License, or      *
+ *  (at your option) any later version.                                    *
+ *                                                                         *
+ *  This program is distributed in the hope that it will be useful,        *
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of         *
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
+ *  GNU General Public License for more details.                           *
+ *                                                                         *
+ *  You should have received a copy of the GNU General Public License      *
+ *  along with this program; if not, write to the Free Software            *
+ *  Foundation, Inc.,                                                      *
+ *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                *
+ ***************************************************************************/
+
+function fill_email_combobox(PlPage& $page)
+{
+    global $globals;
+
+    $user = S::user();
+    $email_type = "directory";
+
+    $res = XDB::query(
+            "SELECT  email_directory
+               FROM  profile_directory
+              WHERE  uid = {?}", $user->id());
+    $email_directory = $res->fetchOneCell();
+    if ($email_directory) {
+        $page->assign('email_directory', $email_directory);
+        list($alias, $domain) = explode('@', $email_directory);
+    } else {
+        $page->assign('email_directory', '');
+        $email_type = NULL;
+        $alias = $domain = '';
+    }
+
+    $res = XDB::query(
+            "SELECT  alias
+               FROM  virtual
+         INNER JOIN  virtual_redirect USING(vid)
+              WHERE  (redirect = {?} OR redirect = {?})
+                     AND alias LIKE '%@{$globals->mail->alias_dom}'",
+            $user->forlifeEmail(),
+            // TODO: remove this über-ugly hack. The issue is that you need
+            // to remove all @m4x.org addresses in virtual_redirect first.
+            $user->login() . '@' . $globals->mail->domain2);
+    $melix = $res->fetchOneCell();
+    if ($melix) {
+        list($melix) = explode('@', $melix);
+        $page->assign('melix', $melix);
+        if (($domain == $globals->mail->alias_dom) || ($domain == $globals->mail->alias_dom2)) {
+            $email_type = "melix";
+        }
+    }
+
+    $res = XDB::query(
+            "SELECT  alias
+               FROM  aliases
+              WHERE  id={?} AND (type='a_vie' OR type='alias')", $user->id());
+    $res = $res->fetchAllAssoc();
+    $page->assign('list_email_X', $res);
+    if (($domain == $globals->mail->domain) || ($domain == $globals->mail->domain2)) {
+        foreach ($res as $res_it) {
+            if ($alias == $res_it['alias']) {
+                $email_type = "X";
+            }
+        }
+    }
+
+    require_once 'emails.inc.php';
+    $redirect = new Redirect($user);
+    $redir    = array();
+    foreach ($redirect->emails as $redirect_it) {
+        if ($redirect_it instanceof EmailRedirection) {
+            $redir[] = $redirect_it->email;
+            if ($email_directory == $redirect_it->email) {
+                $email_type = "redir";
+            }
+        }
+    }
+    $page->assign('list_email_redir', $redir);
+
+    $res = XDB::query(
+            "SELECT  email
+               FROM  entreprises
+              WHERE  uid = {?}", $user->id());
+    $res = $res->fetchAllAssoc();
+    $pro = array();
+    foreach ($res as $res_it) {
+        if ($res_it['email'] != '') {
+            $pro[] = $res_it['email'];
+            if ($email_directory == $res_it['email']) {
+                $email_type = "pro";
+            }
+        }
+    }
+    $page->assign('list_email_pro', $pro);
+
+    $page->assign('email_type', $email_type);
+}
+
+// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
+?>
index d48f010..26eea44 100644 (file)
@@ -142,15 +142,17 @@ $prf_desc = array('nom' => 'Son patronyme',
                   'freetext' => 'Le texte libre',
                   'mobile' => 'Son numéro de téléphone portable',
                   'nationalite' => 'Sa nationalité',
+                  'nationalite2' => 'Sa seconde nationalité',
+                  'nationalite3' => 'Sa troisième nationalité',
                   'nick' => 'Son surnom',
-                  'web' => 'L\'adresse de son site web',
-                  'appli1' => 'Son école d\'application',
-                  'appli2' => 'Son école de post-application',
+                  'networking' => 'La liste de ses adresses de networking',
+                  'edus' => 'Ses formations',
                   'addresses' => 'Ses adresses',
                   'section' => 'Sa section sportive',
                   'binets' => 'La liste de ses binets',
                   'medals' => 'Ses décorations',
                   'cv' => 'Son Curriculum Vitae',
+                  'corps' => 'Son Corps d\'État',
                   'jobs' => 'Ses informations professionnelles',
                   'photo' => 'Sa photographie');
 
index 8a5edbf..0bd75d0 100644 (file)
@@ -20,7 +20,6 @@
  ***************************************************************************/
 
 
-require_once('applis.func.inc.php');
 
 function replace_ifset(&$var,$req) {
     if (Env::has($req)){
@@ -62,16 +61,12 @@ function diff_user_details(&$a, &$b, $view = 'private') { // compute $c = $a - $
                 switch ($val) {
                     case 'adr' : if (!($c['adr'] = diff_user_addresses($a[$val], $bvar, $view))) unset($c['adr']); break;
                     case 'adr_pro' : if (!($c['adr_pro'] = diff_user_pros($a[$val], $bvar, $view))) unset($c['adr_pro']); break;
-                    case 'mobile' : if (same_tel($a[$val], $bvar)) unset($c['mobile']); break;
+                    case 'tels' : if (!($c['tels'] = diff_user_tels($a[$val], $bvar, $view))) unset($c['tels']); break;
                 }
             }
         }
     }
-    // don't modify mobile if you don't have the right
-    if (isset($b['mobile_pub']) && !has_user_right($b['mobile_pub'], $view) && isset($c['mobile']))
-        unset($c['mobile']);
-    if (isset($b['web_pub']) && !has_user_right($b['web_pub'], $view) && isset($c['web']))
-        unset($c['web']);
+    // don't modify freetext if you don't have the right
     if (isset($b['freetext_pub']) && !has_user_right($b['freetext_pub'], $view) && isset($c['freetext']))
         unset($c['freetext']);
     if (!count($c))
@@ -80,15 +75,15 @@ function diff_user_details(&$a, &$b, $view = 'private') { // compute $c = $a - $
 }
 
 function same_tel(&$a, &$b) {
-    $numbera = preg_replace('/[^0-9]/', '', (string) $a);
-    $numberb = preg_replace('/[^0-9]/', '', (string) $b);
+    $numbera = format_phone_number((string) $a);
+    $numberb = format_phone_number((string) $b);
     return $numbera === $numberb;
 }
 function same_address(&$a, &$b) {
     return
         (same_field($a['adr1'],$b['adr1'])) &&
-        (same_field($a['adr1'],$b['adr1'])) &&
-        (same_field($a['adr1'],$b['adr1'])) &&
+        (same_field($a['adr2'],$b['adr2'])) &&
+        (same_field($a['adr3'],$b['adr3'])) &&
         (same_field($a['postcode'],$b['postcode'])) &&
         (same_field($a['city'],$b['city'])) &&
         (same_field($a['countrytxt'],$b['countrytxt'])) &&
@@ -126,49 +121,57 @@ function diff_user_tel(&$a, &$b) {
     return $c;
 }
 
-function diff_user_address($a, $b) {
-    if (isset($b['pub']) && isset($a['pub']) && has_user_right($b['pub'], $a['pub']))
-        $a['pub'] = $b['pub'];
-    if (isset($b['tels'])) {
-        $bvar = $b['tels'];
-
-        $telids_b = array();
-        foreach ($bvar as $i => $telb) $telids_b[$telb['telid']] = $i;
+function diff_user_tels(&$a, &$b)
+{
+    $c = $a;
+    $telids_b = array();
+    foreach ($b as $i => $telb) $telids_b[$telb['telid']] = $i;
 
-        if (isset($a['tels']))
-            $avar = $a['tels'];
-        else
-            $avar = array();
-        $ctels = $avar;
-        foreach ($avar as $j => $tela) {
-            if (isset($tela['telid'])) {
-                // if b has a tel with the same telid, compute diff
-                if (isset($telids_b[$tela['telid']])) {
-                    if (!($ctels[$j] = diff_user_tel($tela, $varb[$telids_b[$tela['adrid']]])))
-                        unset($ctels[$j]);
-                    unset($telids_b[$tela['telid']]);
+    foreach ($a as $j => $tela) {
+        if (isset($tela['telid'])) {
+            // if b has a tel with the same telid, compute diff
+            if (isset($telids_b[$tela['telid']])) {
+                if (!($c[$j] = diff_user_tel($tela, $b[$telids_b[$tela['adrid']]]))) {
+                    unset($c[$j]);
                 }
-            } else {
-                // try to find a match in b
-                foreach ($bvar as $i => $telb) {
-                    if (same_tel($tela['tel'], $telb['tel'])) {
-                        $tela['telid'] = $telb['telid'];
-                        if (!($ctels[$j] = diff_user_tel($tela, $telb)))
-                            unset($ctels[$j]);
-                        unset($telids_b[$tela['telid']]);
-                        break;
+                unset($telids_b[$tela['telid']]);
+            }
+        } else {
+            // try to find a match in b
+            foreach ($b as $i => $telb) {
+                if (same_tel($tela['tel'], $telb['tel'])) {
+                    $tela['telid'] = $telb['telid'];
+                    if (!($c[$j] = diff_user_tel($tela, $telb))) {
+                        unset($c[$j]);
                     }
+                    unset($telids_b[$tela['telid']]);
+                    break;
                 }
             }
         }
+    }
 
-        foreach ($telids_b as $telidb => $i)
-            $ctels[] = array('telid' => $telidb, 'remove' => 1);
+    foreach ($telids_b as $telidb => $i)
+        $c[] = array('telid' => $telidb, 'remove' => 1);
+    return $c;
+}
+
+function diff_user_address($a, $b) {
+    if (isset($b['pub']) && isset($a['pub']) && has_user_right($b['pub'], $a['pub']))
+        $a['pub'] = $b['pub'];
+    if (isset($b['tels'])) {
+        if (isset($a['tels'])) {
+            $avar = $a['tels'];
+        } else {
+            $avar = array();
+        }
+        $ctels = diff_user_tels($avar, $b['tels']);
 
         if (!count($ctels)) {
             $b['tels'] = $avar;
-        } else
+        } else {
             $a['tels'] = $ctels;
+        }
     }
 
     foreach ($a as $val => $avar) {
@@ -229,13 +232,18 @@ function diff_user_pro($a, &$b, $view = 'private') {
     }
     if (isset($b['adr_pub']) && isset($a['adr_pub']) && has_user_right($b['adr_pub'], $a['adr_pub']))
         $a['adr_pub'] = $b['adr_pub'];
-    if (isset($b['tel_pub']) && !has_user_right($b['tel_pub'], $view)) {
-        unset($a['tel']);
-        unset($a['fax']);
-        unset($a['mobile']);
+    if (isset($b['tels'])) {
+        if (isset($a['tels']))
+            $avar = $a['tels'];
+        else
+            $avar = array();
+        $ctels = diff_user_tels($avar, $b['tels']);
+
+        if (!count($ctels)) {
+            $b['tels'] = $avar;
+        } else
+            $a['tels'] = $ctels;
     }
-    if (isset($b['tel_pub']) && isset($a['tel_pub']) && has_user_right($b['tel_pub'], $a['tel_pub']))
-        $a['tel_pub'] = $b['tel_pub'];
     if (isset($b['email_pub']) && !has_user_right($b['email_pub'], $view))
         unset($a['email']);
     if (isset($b['email_pub']) && isset($a['email_pub']) && has_user_right($b['email_pub'], $a['email_pub']))
@@ -284,5 +292,65 @@ function diff_user_pros(&$a, &$b, $view = 'private') {
     return $c;
 }
 
+function format_phone_number($tel)
+{
+    $tel = trim($tel);
+    if (substr($tel, 0, 3) === '(0)') {
+        $tel = '33' . $tel;
+    }
+    $tel = preg_replace('/\(0\)/',  '', $tel);
+    $tel = preg_replace('/[^0-9]/', '', $tel);
+    if (substr($tel, 0, 2) === '00') {
+        $tel = substr($tel, 2);
+    } else if(substr($tel, 0, 1) === '0') {
+        $tel = '33' . substr($tel, 1);
+    }
+    return $tel;
+}
+
+function format_display_number($tel, &$error, $format = array('format'=>'','phoneprf'=>''))
+{
+    $error = false;
+    $ret = '';
+    $tel_length = strlen($tel);
+    if((!isset($format['phoneprf'])) || ($format['phoneprf'] == '')) {
+        $res = XDB::query("SELECT phoneprf, phoneformat AS format
+                             FROM geoloc_pays
+                            WHERE phoneprf = {?} OR phoneprf = {?} OR phoneprf = {?}
+                            LIMIT 1",
+                          substr($tel, 0, 1), substr($tel, 0, 2), substr($tel, 0, 3));
+        if ($res->numRows() == 0) {
+            $error = true;
+            return '+' . $tel;
+        }
+        $format = $res->fetchOneAssoc();
+    }
+    if ($format['format'] == '') {
+        $format['format'] = '+p';
+    }
+    $j = 0;
+    $i = strlen($format['phoneprf']);
+    $length_format = strlen($format['format']);
+    while (($i < $tel_length) && ($j < $length_format)){
+        if ($format['format'][$j] == '#'){
+            $ret .= $tel[$i];
+            $i++;
+        } else if ($format['format'][$j] == 'p') {
+            $ret .= $format['phoneprf'];
+        } else {
+            $ret .= $format['format'][$j];
+        }
+        $j++;
+    }
+    for (; $i < $tel_length - 1; $i += 2) {
+        $ret .= ' ' . substr($tel, $i, 2);
+    }
+    //appends last alone number to the last block
+    if ($i < $tel_length) {
+        $ret .= substr($tel, $i);
+    }
+    return $ret;
+}
+
 // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
 ?>
index 7da7ada..549d811 100644 (file)
@@ -26,7 +26,7 @@
  */
 function user_clear_all_subs($user_id, $really_del=true)
 {
-    // keep datas in : aliases, adresses, tels, applis_ins, binets_ins, contacts, groupesx_ins, homonymes, identification_ax, photo
+    // keep datas in : aliases, adresses, tels, profile_education, binets_ins, contacts, groupesx_ins, homonymes, identification_ax, photo
     // delete in     : auth_user_md5, auth_user_quick, competences_ins, emails, entreprises, langues_ins, mentor,
     //                 mentor_pays, mentor_secteurs, newsletter_ins, perte_pass, requests, user_changes, virtual_redirect, watch_sub
     // + delete maillists
@@ -41,14 +41,15 @@ function user_clear_all_subs($user_id, $really_del=true)
                              'user_id' => array('requests', 'user_changes'));
 
     if ($really_del) {
-        array_push($tables_to_clear['uid'], 'emails', 'groupex.membres', 'contacts', 'adresses', 'tels',
+        array_push($tables_to_clear['uid'], 'emails', 'groupex.membres', 'contacts', 'adresses', 'profile_phones',
                                             'photo', 'perte_pass', 'langues_ins', 'forums.abos', 'forums.profils');
         array_push($tables_to_clear['user_id'], 'newsletter_ins', 'auth_user_quick', 'binets_ins');
         $tables_to_clear['id'] = array('aliases');
         $tables_to_clear['contact'] = array('contacts');
         XDB::execute("UPDATE auth_user_md5
                          SET date_ins = 0, promo_sortie = 0, nom_usage = '',  password = '', perms = 'pending',
-                             nationalite = '', cv = '', section = 0, date = 0, smtppass = '', mail_storage = ''
+                             nationalite = '', nationalite2 = '', nationalite3 = '', cv = '', section = 0,
+                             date = 0, smtppass = '', mail_storage = ''
                        WHERE user_id = {?}", $uid);
         XDB::execute("DELETE virtual.* FROM virtual INNER JOIN virtual_redirect AS r USING(vid) WHERE redirect = {?}",
                      $alias.'@'.$globals->mail->domain);
@@ -131,8 +132,8 @@ function get_user_details_pro($uid, $view = 'private')
 {
     $sql  = "SELECT  e.entreprise, s.label as secteur , ss.label as sous_secteur , f.fonction_fr as fonction,
                      e.poste, e.adr1, e.adr2, e.adr3, e.postcode, e.city, e.entrid,
-                     gp.pays AS countrytxt, gr.name AS region, e.tel, e.fax, e.mobile, e.entrid,
-                     e.pub, e.adr_pub, e.tel_pub, e.email, e.email_pub, e.web
+                     gp.pays AS countrytxt, gr.name AS region, e.entrid,
+                     e.pub, e.adr_pub, e.email, e.email_pub, e.web
                FROM  entreprises AS e
           LEFT JOIN  emploi_secteur AS s ON(e.secteur = s.id)
           LEFT JOIN  emploi_ss_secteur AS ss ON(e.ss_secteur = ss.id AND e.secteur = ss.secteur)
@@ -166,16 +167,18 @@ function get_user_details_pro($uid, $view = 'private')
                     $all_pro[$i]['region'] = '';
                 }
             }
-            if (!has_user_right($pro['tel_pub'], $view)) {
-                // if no tel was defined, then the viewer will be able to write it
-                if ($pro['tel'] == '' &&
-                    $pro['fax'] == '' &&
-                    $pro['mobile'] == '') {
-                    $all_pro[$i]['tel_pub'] = $view;
-                } else {
-                    $all_pro[$i]['tel'] = '';
-                    $all_pro[$i]['fax'] = '';
-                    $all_pro[$i]['mobile'] = '';
+            $sql = "SELECT  pub AS tel_pub, tel_type, display_tel AS tel, comment
+                      FROM  profile_phones AS t
+                     WHERE  uid = {?} AND link_type = 'pro' AND link_id = {?}
+                  ORDER BY  link_id, tel_type DESC, tel_id";
+            $restel = XDB::iterator($sql, $uid, $pro['entrid']);
+            while ($nexttel = $restel->next()) {
+                if (has_user_right($nexttel['tel_pub'], $view)) {
+                    if (!isset($all_pro[$i]['tels'])) {
+                        $all_pro[$i]['tels'] = array($nexttel);
+                    } else {
+                        $all_pro[$i]['tels'][] = $nexttel;
+                    }
                 }
             }
             if (!has_user_right($pro['email_pub'], $view)) {
@@ -195,9 +198,7 @@ function get_user_details_pro($uid, $view = 'private')
                 $all_pro[$i]['fonction'] == '' &&
                 $all_pro[$i]['secteur'] == '' &&
                 $all_pro[$i]['poste'] == '' &&
-                $all_pro[$i]['tel'] == '' &&
-                $all_pro[$i]['fax'] == '' &&
-                $all_pro[$i]['mobile'] == '' &&
+                (!isset($all_pro[$i]['tels'])) &&
                 $all_pro[$i]['email'] == '')
                 unset($all_pro[$i]);
         }
@@ -215,7 +216,7 @@ function get_user_details_adr($uid, $view = 'private') {
                      FIND_IN_SET('active', a.statut) AS active, a.adrid,
                      FIND_IN_SET('res-secondaire', a.statut) AS secondaire,
                      FIND_IN_SET('courrier', a.statut) AS courier,
-                     a.pub, gp.display
+                     a.pub, gp.display, a.comment
                FROM  adresses AS a
           LEFT JOIN  geoloc_pays AS gp ON (gp.a2=a.country)
               WHERE  uid= {?} AND NOT FIND_IN_SET('pro',a.statut)
@@ -230,11 +231,10 @@ function get_user_details_adr($uid, $view = 'private') {
             $adrid_index[$adr['adrid']] = $i;
     }
 
-    $sql = "SELECT  t.adrid, t.tel_pub, t.tel_type, t.tel, t.telid
-              FROM  tels AS t
-        INNER JOIN  adresses AS a ON (a.uid = t.uid) AND (a.adrid = t.adrid)
-             WHERE  t.uid = {?} AND NOT FIND_IN_SET('pro',a.statut)
-          ORDER BY  t.adrid, t.tel_type DESC, t.telid";
+    $sql = "SELECT  link_id AS adrid, pub AS tel_pub, tel_type, display_tel AS tel, tel_id AS telid, comment
+              FROM  profile_phones AS t
+             WHERE  uid = {?} AND link_type = 'address'
+          ORDER BY  link_id, tel_type DESC, tel_id";
     $restel = XDB::iterator($sql, $uid);
     while ($nexttel = $restel->next()) {
         if (has_user_right($nexttel['tel_pub'], $view)) {
@@ -256,28 +256,36 @@ function get_user_details_adr($uid, $view = 'private') {
 
 function &get_user_details($login, $from_uid = '', $view = 'private')
 {
-    $reqsql = "SELECT  u.user_id, u.promo, u.promo_sortie, u.prenom, u.nom, u.nom_usage, u.date, u.cv,
+    $reqsql = "SELECT  u.user_id, d.promo_display, u.prenom, u.nom, u.nom_usage, u.date, u.cv,
                        u.perms IN ('admin','user','disabled') AS inscrit,  FIND_IN_SET('femme', u.flags) AS sexe, u.deces != 0 AS dcd, u.deces,
-                       q.profile_nick AS nickname, q.profile_from_ax, q.profile_mobile AS mobile, q.profile_web AS web, q.profile_freetext AS freetext,
-                       q.profile_mobile_pub AS mobile_pub, q.profile_web_pub AS web_pub, q.profile_freetext_pub AS freetext_pub,
-                       q.profile_medals_pub AS medals_pub,
-                       IF(gp.nat='',gp.pays,gp.nat) AS nationalite, gp.a2 AS iso3166,
+                       q.profile_nick AS nickname, q.profile_from_ax, q.profile_freetext AS freetext,
+                       q.profile_freetext_pub AS freetext_pub,
+                       q.profile_medals_pub AS medals_pub, co.corps_pub AS corps_pub,
+                       IF(gp1.nat='',gp1.pays,gp1.nat) AS nationalite, gp1.a2 AS iso3166_1,
+                       IF(gp2.nat='',gp2.pays,gp2.nat) AS nationalite2, gp2.a2 AS iso3166_2,
+                       IF(gp3.nat='',gp3.pays,gp3.nat) AS nationalite3, gp3.a2 AS iso3166_3,
                        a.alias AS forlife, a2.alias AS bestalias,
                        c.uid IS NOT NULL AS is_contact,
                        s.text AS section, p.x, p.y, p.pub AS photo_pub,
                        u.matricule_ax,
                        m.expertise != '' AS is_referent,
-                       (COUNT(e.email) > 0 OR FIND_IN_SET('googleapps', u.mail_storage) > 0) AS actif
-                 FROM  auth_user_md5   AS u
-           INNER JOIN  auth_user_quick AS q  USING(user_id)
-           INNER JOIN  aliases         AS a  ON (u.user_id=a.id AND a.type='a_vie')
-           INNER JOIN  aliases         AS a2 ON (u.user_id=a2.id AND FIND_IN_SET('bestalias',a2.flags))
-            LEFT JOIN  contacts        AS c  ON (c.uid = {?} and c.contact = u.user_id)
-            LEFT JOIN  geoloc_pays     AS gp ON (gp.a2 = u.nationalite)
-           INNER JOIN  sections        AS s  ON (s.id  = u.section)
-            LEFT JOIN  photo           AS p  ON (p.uid = u.user_id)
-            LEFT JOIN  mentor          AS m  ON (m.uid = u.user_id)
-            LEFT JOIN  emails          AS e  ON (e.uid = u.user_id AND e.flags='active')
+                       (COUNT(e.email) > 0 OR FIND_IN_SET('googleapps', u.mail_storage) > 0) AS actif,
+                       nd.display AS name_display, nd.tooltip AS name_tooltip
+                 FROM  auth_user_md5         AS u
+           INNER JOIN  auth_user_quick       AS q   USING(user_id)
+           INNER JOIN  aliases               AS a   ON (u.user_id = a.id AND a.type = 'a_vie')
+           INNER JOIN  aliases               AS a2  ON (u.user_id = a2.id AND FIND_IN_SET('bestalias', a2.flags))
+            LEFT JOIN  contacts              AS c   ON (c.uid = {?} and c.contact = u.user_id)
+            LEFT JOIN  profile_corps         AS co  ON (co.uid = u.user_id)
+            LEFT JOIN  geoloc_pays           AS gp1 ON (gp1.a2 = u.nationalite)
+            LEFT JOIN  geoloc_pays           AS gp2 ON (gp2.a2 = u.nationalite2)
+            LEFT JOIN  geoloc_pays           AS gp3 ON (gp3.a2 = u.nationalite3)
+           INNER JOIN  sections              AS s   ON (s.id  = u.section)
+            LEFT JOIN  photo                 AS p   ON (p.uid = u.user_id)
+            LEFT JOIN  mentor                AS m   ON (m.uid = u.user_id)
+            LEFT JOIN  emails                AS e   ON (e.uid = u.user_id AND e.flags='active')
+           INNER JOIN  profile_names_display AS nd  ON (nd.user_id = u.user_id)
+           INNER JOIN  profile_display       AS d   ON (d.uid = u.user_id)
                 WHERE  a.alias = {?}
              GROUP BY  u.user_id";
     $res  = XDB::query($reqsql, $from_uid, $login);
@@ -285,25 +293,11 @@ function &get_user_details($login, $from_uid = '', $view = 'private')
     $uid  = $user['user_id'];
     // hide orange status, cv, nickname, section
     if (!has_user_right('private', $view)) {
-        $user['promo_sortie'] = $user['promo'] + 3;
         $user['cv'] = '';
         $user['nickname'] = '';
         $user['section'] = '';
     }
-    // hide mobile
-    if (!has_user_right($user['mobile_pub'], $view)) {
-        if ($user['mobile'] == '')
-            $user['mobile_pub'] = $view;
-        else
-            $user['mobile'] = '';
-    }
-    // hide web
-    if (!has_user_right($user['web_pub'], $view)) {
-        if ($user['web'] == '')
-            $user['web_pub'] = $view;
-        else
-            $user['web'] = '';
-    }
+
     // hide freetext
     if (!has_user_right($user['freetext_pub'], $view)) {
         if ($user['freetext'] == '')
@@ -312,6 +306,21 @@ function &get_user_details($login, $from_uid = '', $view = 'private')
             $user['freetext'] = '';
     }
 
+    $sql = "SELECT  pub AS tel_pub, tel_type, display_tel AS tel, comment
+              FROM  profile_phones AS t
+             WHERE  uid = {?} AND link_type = 'user'
+          ORDER BY  tel_type DESC, tel_id";
+    $restel = XDB::iterator($sql, $uid);
+    while ($nexttel = $restel->next()) {
+        if (has_user_right($nexttel['tel_pub'], $view)) {
+            if (!isset($user['tels'])) {
+                $user['tels'] = array($nexttel);
+            } else {
+                $user['tels'][] = $nexttel;
+            }
+        }
+    }
+
     $user['adr_pro'] = get_user_details_pro($uid, $view);
     $user['adr']     = get_user_details_adr($uid, $view);
 
@@ -341,20 +350,35 @@ function &get_user_details($login, $from_uid = '', $view = 'private')
         $user['gpxs_join'] = join(', ', $user['gpxs']);
     }
 
-    $res = XDB::iterRow("SELECT  applis_def.text, applis_def.url, applis_ins.type
-                           FROM  applis_ins
-                     INNER JOIN  applis_def ON applis_def.id = applis_ins.aid
+    $res = XDB::iterRow("SELECT  en.name AS name, en.url AS url, d.degree AS degree,
+                                 ed.grad_year AS grad_year, f.field AS field, ed.program AS program
+                           FROM  profile_education AS ed
+                      LEFT JOIN  profile_education_enum        AS en ON (en.id = ed.eduid)
+                      LEFT JOIN  profile_education_degree_enum AS d  ON (d.id  = ed.degreeid)
+                      LEFT JOIN  profile_education_field_enum  AS f  ON (f.id  = ed.fieldid)
                           WHERE  uid={?}
-                       ORDER BY  ordre", $uid);
-
-    $user['applis_fmt'] = Array();
-    $user['formation'] = Array();
-    while (list($txt, $url, $type) = $res->next()) {
-        $user['formation'][] = $txt." ".$type;
-        require_once('applis.func.inc.php');
-        $user['applis_fmt'][] = applis_fmt($type, $txt, $url);
+                       ORDER BY  ed.grad_year", $uid);
+
+    if (list($name, $url, $degree, $grad_year, $field, $program) = $res->next()) {
+        require_once('education.func.inc.php');
+        $user['education'][] = education_fmt($name, $url, $degree, $grad_year, $field, $program, $user['sexe'], true);
+    }
+    while (list($name, $url, $degree, $grad_year, $field, $program) = $res->next()) {
+        $user['education'][] = education_fmt($name, $url, $degree, $grad_year, $field, $program, $user['sexe'], true);
+    }
+
+    if (has_user_right($user['corps_pub'], $view)) {
+        $res = XDB::query("SELECT  e1.name AS original, e2.name AS current, r.name AS rank
+                             FROM  profile_corps           AS c
+                        LEFT JOIN  profile_corps_enum      AS e1 ON (c.original_corpsid = e1.id)
+                        LEFT JOIN  profile_corps_enum      AS e2 ON (c.current_corpsid = e2.id)
+                        LEFT JOIN  profile_corps_rank_enum AS r  ON (c.rankid = r.id)
+                            WHERE  c.uid = {?} AND c.original_corpsid != 1", $uid);
+        if ($res = $res->fetchOneRow()) {
+            list($original, $current, $rank) = $res;
+            $user['corps'] = "Corps d'origine : " . $original . ", corps actuel : " . $current . ", grade : " . $rank;
+        }
     }
-    $user['applis_join'] = join(', ', $user['applis_fmt']);
 
     if (has_user_right($user['medals_pub'], $view)) {
         $res = XDB::iterator("SELECT  m.id, m.text AS medal, m.type, s.gid, g.text AS grade
@@ -368,6 +392,19 @@ function &get_user_details($login, $from_uid = '', $view = 'private')
         }
     }
 
+    $user['networking'] = Array();
+    $res = XDB::iterator("SELECT  n.address, n.pub, m.network_type AS type, m.name, m.filter, m.link
+                            FROM  profile_networking AS n
+                      INNER JOIN  profile_networking_enum AS m ON (n.network_type = m.network_type)
+                           WHERE  n.uid = {?}", $uid);
+    while($network = $res->next())
+    {
+        if (has_user_right($network['pub'], $view)) {
+            $network['link'] = str_replace('%s', $network['address'], $network['link']);
+            $user['networking'][] = $network;
+        }
+    }
+
     return $user;
 }
 // }}}
@@ -384,7 +421,7 @@ function add_user_address($uid, $adrid, $adr) {
     if (isset($adr['tels']) && is_array($adr['tels'])) {
         $telid = 0;
         foreach ($adr['tels'] as $tel) if ($tel['tel']) {
-            add_user_tel($uid, $adrid, $telid, $tel);
+            add_user_tel($uid, 'address', $adrid, $telid, $tel);
             $telid ++;
         }
     }
@@ -402,17 +439,17 @@ function update_user_address($uid, $adrid, $adr) {
         $adr['adr1'], $adr['adr2'], $adr['adr3'],
         $adr['postcode'], $adr['city'], $adr['pub'], $adrid, $uid);
     if (isset($adr['tels']) && is_array($adr['tels'])) {
-        $res = XDB::query("SELECT telid FROM tels WHERE uid = {?} AND adrid = {?} ORDER BY telid", $uid, $adrid);
+        $res = XDB::query("SELECT tel_id FROM profile_phones WHERE uid = {?} AND link_type = 'address' AND link_id = {?} ORDER BY tel_id", $uid, $adrid);
         $telids = $res->fetchColumn();
         foreach ($adr['tels'] as $tel) {
             if (isset($tel['telid']) && isset($tel['remove']) && $tel['remove']) {
-                remove_user_tel($uid, $adrid, $tel['telid']);
+                remove_user_tel($uid, 'address', $adrid, $tel['telid']);
                 if (isset($telids[$tel['telid']])) unset($telids[$tel['telid']]);
             } else if (isset($tel['telid'])) {
-                update_user_tel($uid, $adrid, $tel['telid'], $tel);
+                update_user_tel($uid, 'address', $adrid, $tel['telid'], $tel);
             } else {
                 for ($telid = 0; isset($telids[$telid]) && ($telids[$telid] == $telid); $telid++);
-                add_user_tel($uid, $adrid, $telid, $tel);
+                add_user_tel($uid, 'address', $adrid, $telid, $tel);
             }
         }
     }
@@ -421,36 +458,41 @@ function update_user_address($uid, $adrid, $adr) {
 // {{{ function remove_user_address()
 function remove_user_address($uid, $adrid) {
     XDB::execute("DELETE FROM adresses WHERE adrid = {?} AND uid = {?}", $adrid, $uid);
-    XDB::execute("DELETE FROM tels WHERE adrid = {?} AND uid = {?}", $adrid, $uid);
+    XDB::execute("DELETE FROM profile_phones WHERE link_id = {?} AND uid = {?} AND link_type = 'address'", $adrid, $uid);
 }
 // }}}
 // {{{ function add_user_tel()
-function add_user_tel($uid, $adrid, $telid, $tel) {
-    XDB::execute(
-        "INSERT INTO tels SET uid = {?}, adrid = {?}, telid = {?}, tel = {?}, tel_type = {?}, tel_pub = {?}",
-        $uid, $adrid, $telid, $tel['tel'], $tel['tel_type'], $tel['tel_pub']);
+function add_user_tel($uid, $link_type, $link_id, $telid, $tel) {
+    require('profil.func.inc.php');
+    $fmt_phone  = format_phone_number($tel['tel']);
+    $disp_phone = format_display_number($fmt_phone, $error);
+    XDB::execute("INSERT INTO profile_phones (uid, link_type, link_id, tel_id, tel_type, search_tel, display_tel, pub)
+                       VALUES ({?}, {?}, {?}, {?}, {?}, {?}, {?}, {?})",
+                 $uid, $link_type, $link_id, $telid, $tel['tel_type'], $fmt_phone, $disp_phone, $tel['tel_pub']);
 }
 // }}}
 // {{{ function update_user_tel()
-function update_user_tel($uid, $adrid, $telid, $tel) {
-    XDB::execute(
-        "UPDATE tels SET tel = {?}, tel_type = {?}, tel_pub = {?}
-        WHERE telid = {?} AND adrid = {?} AND uid = {?}",
-        $tel['tel'], $tel['tel_type'], $tel['tel_pub'],
-        $telid, $adrid, $uid);
+function update_user_tel($uid, $link_type, $link_id, $telid, $tel) {
+    require('profil.func.inc.php');
+    $fmt_phone  = format_phone_number($tel['tel']);
+    $disp_phone = format_display_number($fmt_phone, $error);
+    XDB::execute("UPDATE profile_phones SET search_tel = {?}, display_tel = {?}, tel_type = {?}, pub = {?}
+                   WHERE link_type = {?} AND tel_id = {?} AND link_id = {?} AND uid = {?}",
+                 $fmt_phone, $disp_phone, $tel['tel_type'], $tel['tel_pub'],
+                 $link_type, $telid, $link_id, $uid);
 }
 // }}}
 // {{{ function remove_user_tel()
-function remove_user_tel($uid, $adrid, $telid) {
-    XDB::execute("DELETE FROM tels WHERE telid = {?} AND adrid = {?} AND uid = {?}",
-                 $telid, $adrid, $uid);
+function remove_user_tel($uid, $link_type, $link_id, $telid) {
+    XDB::execute("DELETE FROM profile_phones WHERE tel_id = {?} AND link_id = {?} AND uid = {?} AND link_type = {?}",
+                 $telid, $link_id, $uid, $link_type);
 }
 // }}}
 // {{{ function add_user_pro()
 function add_user_pro($uid, $entrid, $pro) {
     XDB::execute(
         "INSERT INTO entreprises (`uid`, `entrid`, `entreprise`, `poste`, `secteur`, `ss_secteur`, `fonction`,
-            `adr1`, `adr2`, `adr3`, `postcode`, `city`, `country`, `region`, `tel`, `fax`, `mobile`, `email`, `web`, `pub`, `adr_pub`, `tel_pub`, `email_pub`)
+            `adr1`, `adr2`, `adr3`, `postcode`, `city`, `country`, `region`, `email`, `web`, `pub`, `adr_pub`, `email_pub`)
         SELECT u.user_id, {?}, {?}, {?}, s.id, ss.id, f.id,
         {?}, {?}, {?}, {?}, {?}, gp.a2, gr.region, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}
         FROM auth_user_md5 AS u
@@ -462,10 +504,19 @@ function add_user_pro($uid, $entrid, $pro) {
         WHERE u.user_id = {?}
         LIMIT 1",
         $entrid, $pro['entreprise'], $pro['poste'],
-        $pro['adr1'], $pro['adr2'], $pro['adr3'], $pro['postcode'], $pro['city'], $pro['tel'], $pro['fax'], $pro['mobile'], $pro['email'], $pro['web'], $pro['pub'], $pro['adr_pub'], $pro['tel_pub'], $pro['email_pub'],
+        $pro['adr1'], $pro['adr2'], $pro['adr3'], $pro['postcode'], $pro['city'], $pro['email'], $pro['web'], $pro['pub'], $pro['adr_pub'], $pro['email_pub'],
         $pro['secteur'], $pro['sous_secteur'], $pro['fonction'], $pro['fonction'],
         $pro['countrytxt'], $pro['countrytxt'], $pro['region'],
         $uid);
+    if (isset($pro['tels']) && is_array($pro['tels'])) {
+        $telid = 0;
+        foreach ($pro['tels'] as $tel) {
+            if ($pro['tel']) {
+                add_user_tel($uid, 'pro', $entrid, $telid, $tel);
+                $telid ++;
+            }
+        }
+    }
 }
 // }}}
 // {{{ function update_user_pro()
@@ -503,13 +554,6 @@ function update_user_pro($uid, $entrid, $pro) {
         $args_set[] = $pro['adr_pub'];
     }
 
-    if (isset($pro['tel'])) {
-        $set .= ", e.`tel` = {?}, e.`fax` = {?}, e.`mobile` = {?}, e.tel_pub = {?}";
-        $args_set[] = $pro['tel'];
-        $args_set[] = $pro['fax'];
-        $args_set[] = $pro['mobile'];
-        $args_set[] = $pro['tel_pub'];
-    }
     if (isset($pro['email'])) {
         $set .= ", e.`email` = {?}, e.`email_pub` = {?}";
         $args_set[] = $pro['email'];
@@ -519,14 +563,32 @@ function update_user_pro($uid, $entrid, $pro) {
     $args_where = array($uid, $entrid);
     $args = array_merge(array($query), $args_join, $args_set, $args_where);
     call_user_func_array(array('XDB', 'execute'), $args);
+
+
+    if (isset($pro['tels']) && is_array($pro['tels'])) {
+        $res = XDB::query("SELECT tel_id FROM profile_phones WHERE uid = {?} AND link_type = 'pro' AND link_id = {?} ORDER BY tel_id", $uid, $entrid);
+        $telids = $res->fetchColumn();
+        foreach ($pro['tels'] as $tel) {
+            if (isset($tel['telid']) && isset($tel['remove']) && $tel['remove']) {
+                remove_user_tel($uid, 'pro', $entrid, $tel['telid']);
+                if (isset($telids[$tel['telid']])) unset($telids[$tel['telid']]);
+            } else if (isset($tel['telid'])) {
+                update_user_tel($uid, 'pro', $entrid, $tel['telid'], $tel);
+            } else {
+                for ($telid = 0; isset($telids[$telid]) && ($telids[$telid] == $telid); $telid++);
+                add_user_tel($uid, 'pro', $entrid, $telid, $tel);
+            }
+        }
+    }
 }
 // }}}
 // {{{ function remove_user_pro()
 function remove_user_pro($uid, $entrid) {
     XDB::execute("DELETE FROM entreprises WHERE entrid = {?} AND uid = {?}", $entrid, $uid);
+    XDB::execute("DELETE FROM profile_phones WHERE link_id = {?} AND uid = {?} AND link_type = 'pro'", $entrid, $uid);
 }
 // }}}
-// {{{ function set_user_details()
+// {{{ function set_user_details_addresses()
 function set_user_details_addresses($uid, $adrs) {
     $res = XDB::query("SELECT adrid FROM adresses WHERE uid = {?} AND adrid >= 1 ORDER BY adrid", $uid);
     $adrids = $res->fetchColumn();
@@ -571,9 +633,6 @@ function set_user_details($uid, $details) {
     if (isset($details['nom_usage'])) {
         XDB::execute("UPDATE auth_user_md5 SET nom_usage = {?} WHERE user_id = {?}", strtoupper($details['nom_usage']), $uid);
     }
-    if (isset($details['mobile'])) {
-        XDB::execute("UPDATE auth_user_quick SET profile_mobile = {?} WHERE user_id = {?}", $details['mobile'], $uid);
-    }
     if (isset($details['nationalite'])) {
         XDB::execute(
             "UPDATE auth_user_md5 AS u
@@ -604,7 +663,23 @@ function set_user_details($uid, $details) {
                 $uid, $groupex);
         }
     }
-    // applis
+    if (isset($details['tels']) && is_array($details['tels'])) {
+        $res = XDB::query("SELECT tel_id FROM profile_phones WHERE uid = {?} AND link_type = 'user' ORDER BY tel_id", $uid);
+        $telids = $res->fetchColumn();
+        foreach ($details['tels'] as $tel) {
+            if (isset($tel['telid']) && isset($tel['remove']) && $tel['remove']) {
+                remove_user_tel($uid, 'user', 0, $tel['telid']);
+                if (isset($telids[$tel['telid']])) unset($telids[$tel['telid']]);
+            } else if (isset($tel['telid'])) {
+                update_user_tel($uid, 'user', 0, $tel['telid'], $tel);
+            } else {
+                for ($telid = 0; isset($telids[$telid]) && ($telids[$telid] == $telid); $telid++);
+                add_user_tel($uid, 'user', 0, $telid, $tel);
+            }
+        }
+    }
+
+    // education
     // medals
 }
 // }}}
index 1fddfc3..c7d09f4 100644 (file)
@@ -24,18 +24,18 @@ require_once('user.func.inc.php');
 global $globals;
 
 @$globals->search->result_where_statement = '
-    LEFT JOIN  applis_ins     AS ai0 ON (u.user_id = ai0.uid AND ai0.ordre = 0)
-    LEFT JOIN  applis_def     AS ad0 ON (ad0.id = ai0.aid)
-    LEFT JOIN  applis_ins     AS ai1 ON (u.user_id = ai1.uid AND ai1.ordre = 1)
-    LEFT JOIN  applis_def     AS ad1 ON (ad1.id = ai1.aid)
-    LEFT JOIN  entreprises    AS e   ON (e.entrid = 0 AND e.uid = u.user_id)
-    LEFT JOIN  emploi_secteur AS es  ON (e.secteur = es.id)
-    LEFT JOIN  fonctions_def  AS ef  ON (e.fonction = ef.id)
-    LEFT JOIN  geoloc_pays    AS n   ON (u.nationalite = n.a2)
-    LEFT JOIN  adresses       AS adr ON (u.user_id = adr.uid AND FIND_IN_SET(\'active\',adr.statut))
-    LEFT JOIN  geoloc_pays    AS gp  ON (adr.country = gp.a2)
-    LEFT JOIN  geoloc_region  AS gr  ON (adr.country = gr.a2 AND adr.region = gr.region)
-    LEFT JOIN  emails         AS em  ON (em.uid = u.user_id AND em.flags = \'active\')';
+    LEFT JOIN  profile_education       AS edu ON (u.user_id = edu.uid)
+    LEFT JOIN  profile_education_enum  AS ede ON (ede.id = edu.eduid)
+    LEFT JOIN  entreprises             AS e   ON (e.entrid = 0 AND e.uid = u.user_id)
+    LEFT JOIN  emploi_secteur          AS es  ON (e.secteur = es.id)
+    LEFT JOIN  fonctions_def           AS ef  ON (e.fonction = ef.id)
+    LEFT JOIN  geoloc_pays             AS n1  ON (u.nationalite = n1.a2)
+    LEFT JOIN  geoloc_pays             AS n2  ON (u.nationalite2 = n2.a2)
+    LEFT JOIN  geoloc_pays             AS n3  ON (u.nationalite2 = n3.a2)
+    LEFT JOIN  adresses                AS adr ON (u.user_id = adr.uid AND FIND_IN_SET(\'active\',adr.statut))
+    LEFT JOIN  geoloc_pays             AS gp  ON (adr.country = gp.a2)
+    LEFT JOIN  geoloc_region           AS gr  ON (adr.country = gr.a2 AND adr.region = gr.region)
+    LEFT JOIN  emails                  AS em  ON (em.uid = u.user_id AND em.flags = \'active\')';
 
 class UserSet extends PlSet
 {
@@ -156,55 +156,81 @@ class MinificheView extends MultipageView
 {
     public function __construct(PlSet &$set, $data, array $params)
     {
-        require_once 'applis.func.inc.php';
+        require_once 'education.func.inc.php';
         global $globals;
         $this->entriesPerPage = $globals->search->per_page;
         if (@$params['with_score']) {
-            $this->addSortKey('score', array('-score', '-date', '-promo', 'nom', 'prenom'), 'pertinence');
+            $this->addSortKey('score', array('-score', '-date', '-promo', 'name_sort'), 'pertinence');
         }
-        $this->addSortKey('name', array('nom', 'prenom'), 'nom');
-        $this->addSortKey('promo', array('-promo', 'nom', 'prenom'), 'promotion');
-        $this->addSortKey('date_mod', array('-date', '-promo', 'nom', 'prenom'), 'dernière modification');
+        $this->addSortKey('name', array('name_sort'), 'nom');
+        $this->addSortKey('promo', array('-promo', 'name_sort'), 'promotion');
+        $this->addSortKey('date_mod', array('-date', '-promo', 'name_sort'), 'dernière modification');
         parent::__construct($set, $data, $params);
     }
 
     public function fields()
     {
         global $globals;
-        return "u.user_id AS id, u.*,
-                CONCAT(a.alias, '@{$globals->mail->domain}') AS bestemail,
+        return "u.user_id AS id, u.*, d.promo_display,
                 u.perms != 'pending' AS inscrit,
                 u.perms != 'pending' AS wasinscrit,
                 u.deces != 0 AS dcd, u.deces, u.matricule_ax,
                 FIND_IN_SET('femme', u.flags) AS sexe,
                 e.entreprise, e.web AS job_web, es.label AS secteur, ef.fonction_fr AS fonction,
-                IF(n.nat='',n.pays,n.nat) AS nat, n.a2 AS iso3166,
-                ad0.text AS app0text, ad0.url AS app0url, ai0.type AS app0type,
-                ad1.text AS app1text, ad1.url AS app1url, ai1.type AS app1type,
+                IF(n1.nat = '', n1.pays, n1.nat) AS nat1, n1.a2 AS iso3166_1,
+                IF(n2.nat = '', n2.pays, n2.nat) AS nat2, n2.a2 AS iso3166_2,
+                IF(n3.nat = '', n3.pays, n3.nat) AS nat3, n3.a2 AS iso3166_3,
+                IF(ede0.abbreviation = '', ede0.name, ede0.abbreviation) AS eduname0, ede0.url AS eduurl0,
+                IF(edd0.abbreviation = '', edd0.degree, edd0.abbreviation) AS edudegree0,
+                edu0.grad_year AS edugrad_year0, f0.field AS edufield0, edu0.program AS eduprogram0,
+                IF(ede1.abbreviation = '', ede1.name, ede1.abbreviation) AS eduname1, ede1.url AS eduurl1,
+                IF(edd1.abbreviation = '', edd1.degree, edd1.abbreviation) AS edudegree1,
+                edu1.grad_year AS edugrad_year1, f1.field AS edufield1, edu1.program AS eduprogram1,
+                IF(ede2.abbreviation = '', ede2.name, ede2.abbreviation) AS eduname2, ede2.url AS eduurl2,
+                IF(edd2.abbreviation = '', edd2.degree, edd2.abbreviation) AS edudegree2,
+                edu2.grad_year AS edugrad_year2, f2.field AS edufield2, edu2.program AS eduprogram2,
+                IF(ede3.abbreviation = '', ede3.name, ede3.abbreviation) AS eduname3, ede3.url AS eduurl3,
+                IF(edd3.abbreviation = '', edd3.degree, edd3.abbreviation) AS edudegree3,
+                edu3.grad_year AS edugrad_year3, f3.field AS edufield3, edu3.program AS eduprogram3,
                 adr.city, gp.a2, gp.pays AS countrytxt, gr.name AS region,
-                IF(u.nom_usage<>'',u.nom_usage,u.nom) AS sortkey,
-                (COUNT(em.email) > 0 OR FIND_IN_SET('googleapps', u.mail_storage) > 0) AS actif" .
+                (COUNT(em.email) > 0 OR FIND_IN_SET('googleapps', u.mail_storage) > 0) AS actif,
+                nd.display AS name_display, nd.tooltip AS name_tooltip, nd.sort AS name_sort" .
                 (S::logged() ? ", c.contact AS contact" : '');
     }
 
     public function joins()
     {
-        return  "LEFT JOIN  entreprises    AS e   ON (e.entrid = 0 AND e.uid = u.user_id".(S::logged() ? "" : " AND e.pub = 'public'").")
-                 LEFT JOIN  emploi_secteur AS es  ON (e.secteur = es.id)
-                 LEFT JOIN  fonctions_def  AS ef  ON (e.fonction = ef.id)
-                 LEFT JOIN  geoloc_pays    AS n   ON (u.nationalite = n.a2)
-                 LEFT JOIN  applis_ins     AS ai0 ON (u.user_id = ai0.uid AND ai0.ordre = 0)
-                 LEFT JOIN  applis_def     AS ad0 ON (ad0.id = ai0.aid)
-                 LEFT JOIN  applis_ins     AS ai1 ON (u.user_id = ai1.uid AND ai1.ordre = 1)
-                 LEFT JOIN  applis_def     AS ad1 ON (ad1.id = ai1.aid)
-                 LEFT JOIN  adresses       AS adr ON (u.user_id = adr.uid
-                                                      AND FIND_IN_SET('active', adr.statut)".(S::logged() ? "" : " AND adr.pub = 'public'").")
-                 LEFT JOIN  geoloc_pays    AS gp  ON (adr.country = gp.a2)
-                 LEFT JOIN  geoloc_region  AS gr  ON (adr.country = gr.a2 AND adr.region = gr.region)
-                 LEFT JOIN  aliases        AS a   ON (a.id = u.user_id AND FIND_IN_SET('bestalias', a.flags))
-                 LEFT JOIN  emails         AS em  ON (em.uid = u.user_id AND em.flags = 'active')" .
-                (S::logged() ?
-                 "LEFT JOIN  contacts       AS c   On (c.contact = u.user_id AND c.uid = " . S::v('uid') . ")"
+        return  "LEFT JOIN  entreprises                   AS e    ON (e.entrid = 0 AND e.uid = u.user_id".(S::logged() ? "" : " AND e.pub = 'public'").")
+                 LEFT JOIN  emploi_secteur                AS es   ON (e.secteur = es.id)
+                 LEFT JOIN  fonctions_def                 AS ef   ON (e.fonction = ef.id)
+                 LEFT JOIN  geoloc_pays                   AS n1   ON (u.nationalite = n1.a2)
+                 LEFT JOIN  geoloc_pays                   AS n2   ON (u.nationalite2 = n2.a2)
+                 LEFT JOIN  geoloc_pays                   AS n3   ON (u.nationalite3 = n3.a2)
+                 LEFT JOIN  profile_education             AS edu0 ON (u.user_id = edu0.uid AND edu0.id = 0)
+                 LEFT JOIN  profile_education_enum        AS ede0 ON (ede0.id = edu0.eduid)
+                 LEFT JOIN  profile_education_degree_enum AS edd0 ON (edd0.id = edu0.degreeid)
+                 LEFT JOIN  profile_education_field_enum  AS f0   ON (f0.id = edu0.fieldid)
+                 LEFT JOIN  profile_education             AS edu1 ON (u.user_id = edu1.uid AND edu1.id = 1)
+                 LEFT JOIN  profile_education_enum        AS ede1 ON (ede1.id = edu1.eduid)
+                 LEFT JOIN  profile_education_degree_enum AS edd1 ON (edd1.id = edu1.degreeid)
+                 LEFT JOIN  profile_education_field_enum  AS f1   ON (f1.id = edu1.fieldid)
+                 LEFT JOIN  profile_education             AS edu2 ON (u.user_id = edu2.uid AND edu2.id = 2)
+                 LEFT JOIN  profile_education_enum        AS ede2 ON (ede2.id = edu2.eduid)
+                 LEFT JOIN  profile_education_degree_enum AS edd2 ON (edd2.id = edu2.degreeid)
+                 LEFT JOIN  profile_education_field_enum  AS f2   ON (f2.id = edu2.fieldid)
+                 LEFT JOIN  profile_education             AS edu3 ON (u.user_id = edu3.uid AND edu3.id = 3)
+                 LEFT JOIN  profile_education_enum        AS ede3 ON (ede3.id = edu3.eduid)
+                 LEFT JOIN  profile_education_degree_enum AS edd3 ON (edd3.id = edu3.degreeid)
+                 LEFT JOIN  profile_education_field_enum  AS f3   ON (f3.id = edu3.fieldid)
+                 LEFT JOIN  adresses                      AS adr  ON (u.user_id = adr.uid
+                                                                      AND FIND_IN_SET('active', adr.statut)".(S::logged() ? "" : "
+                                                                      AND adr.pub = 'public'").")
+                 LEFT JOIN  geoloc_pays                   AS gp   ON (adr.country = gp.a2)
+                 LEFT JOIN  geoloc_region                 AS gr   ON (adr.country = gr.a2 AND adr.region = gr.region)
+                 LEFT JOIN  emails                        AS em   ON (em.uid = u.user_id AND em.flags = 'active')
+                INNER JOIN  profile_names_display         AS nd   ON (nd.user_id = u.user_id)
+                INNER JOIN  profile_display               AS d    ON (d.uid = u.user_id)" . (S::logged() ?
+                "LEFT JOIN  contacts                      AS c    ON (c.contact = u.user_id AND c.uid = " . S::v('uid') . ")"
                  : "");
     }
 
@@ -237,16 +263,23 @@ class MentorView extends MultipageView
     {
         $this->entriesPerPage = 10;
         $this->addSortKey('rand', array('RAND(' . S::i('uid') . ')'), 'aléatoirement');
-        $this->addSortKey('name', array('nom', 'prenom'), 'nom');
-        $this->addSortKey('promo', array('-promo', 'nom', 'prenom'), 'promotion');
-        $this->addSortKey('date_mod', array('-date', '-promo', 'nom', 'prenom'), 'dernière modification');
+        $this->addSortKey('name', array('name_sort'), 'nom');
+        $this->addSortKey('promo', array('-promo', 'name_sort'), 'promotion');
+        $this->addSortKey('date_mod', array('-date', '-promo', 'name_sort'), 'dernière modification');
         parent::__construct($set, $data, $params);
     }
 
     public function fields()
     {
-        return "m.uid, u.prenom, u.nom, u.promo, u.hruid,
-                m.expertise, mp.pid, ms.secteur, ms.ss_secteur";
+        return "m.uid, d.promo_display, u.hruid,
+                m.expertise, mp.pid, ms.secteur, ms.ss_secteur,
+                nd.display AS name_display, nd.tooltip AS name_tooltip, nd.sort AS name_sort";
+    }
+
+    public function joins()
+    {
+        return "INNER JOIN  profile_names_display AS nd ON (nd.user_id = u.user_id)
+                INNER JOIN  profile_display       AS d  ON (d.uid = u.user_id)";
     }
 
     public function bounds()
@@ -277,23 +310,25 @@ class TrombiView extends MultipageView
     public function __construct(PlSet &$set, $data, array $params)
     {
         $this->entriesPerPage = 24;
-        $this->order = explode(',', Env::v('order', 'nom,prenom,promo'));
+        $this->order = explode(',', Env::v('order', 'name_sort'));
         if (@$params['with_score']) {
-            $this->addSortKey('score', array('-score', '-watch_last', '-promo', 'nom', 'prenom'), 'pertinence');
+            $this->addSortKey('score', array('-score', '-watch_last', '-promo', 'name_sort'), 'pertinence');
         }
-        $this->addSortKey('name', array('nom', 'prenom'), 'nom');
-        $this->addSortKey('promo', array('-promo', 'nom', 'prenom'), 'promotion');
+        $this->addSortKey('name', array('name_sort'), 'nom');
+        $this->addSortKey('promo', array('-promo', 'name_sort'), 'promotion');
         parent::__construct($set, $data, $params);
     }
 
     public function fields()
     {
-        return "u.user_id, IF(u.nom_usage != '', u.nom_usage, u.nom) AS nom, u.prenom, u.promo, u.hruid ";
+        return "u.user_id, nd.display AS name_display, nd.tooltip AS name_tooltip, nd.sort AS name_sort, u.promo, d.promo_display, u.hruid ";
     }
 
     public function joins()
     {
-        return "INNER JOIN  photo AS p ON (p.uid = u.user_id) ";
+        return "INNER JOIN  photo                 AS p  ON (p.uid = u.user_id)
+                INNER JOIN  profile_display       AS d  ON (d.uid = u.user_id)
+                INNER JOIN  profile_names_display AS nd ON (nd.user_id = u.user_id)";
     }
 
     public function bounds()
@@ -387,11 +422,12 @@ class GeolocView implements PlView
             header('Content-Type: text/xml');
             header('Pragma:');
             $only_current = Env::v('only_current', false)? ' AND FIND_IN_SET(\'active\', adrf.statut)' : '';
-            $it =& $this->set->get('u.user_id AS id, u.prenom, u.nom, u.promo, al.alias',
-                                   "INNER JOIN  adresses AS adrf  ON (adrf.uid = u.user_id $only_current)
-                                     LEFT JOIN  aliases  AS al   ON (u.user_id = al.id
-                                                                   AND FIND_IN_SET('bestalias', al.flags))
-                                    INNER JOIN  adresses AS avg ON (" . getadr_join('avg') . ")",
+            $it =& $this->set->get('u.user_id AS id, u.prenom, u.nom, d.promo_display, al.alias',
+                                   "INNER JOIN  adresses        AS adrf ON (adrf.uid = u.user_id $only_current)
+                                    INNER JOIN  profile_display AS d    ON (d.uid = u.user_id)
+                                     LEFT JOIN  aliases         AS al   ON (u.user_id = al.id
+                                                                            AND FIND_IN_SET('bestalias', al.flags))
+                                    INNER JOIN  adresses        AS avg  ON (" . getadr_join('avg') . ")",
                                    'adrf.cityid = ' . Env::i('cityid'), null, null, 11);
             $page->assign('users', $it);
             break;
@@ -433,7 +469,6 @@ class GadgetView implements PlView
     public function fields()
     {
         return "u.user_id AS id, u.*," .
-                (S::logged() ? "q.profile_mobile AS mobile, " : "IF(q.profile_mobile_pub = 'public', q.profile_mobile, NULL) as mobile, ") .
                "u.perms != 'pending' AS inscrit,
                 u.perms != 'pending' AS wasinscrit,
                 u.deces != 0 AS dcd, u.deces,
@@ -444,11 +479,12 @@ class GadgetView implements PlView
 
     public function joins()
     {
-        return  "LEFT JOIN  adresses       AS adr ON (u.user_id = adr.uid AND FIND_IN_SET('active', adr.statut)".(S::logged() ? "" : " AND adr.pub = 'public'").")
-                 LEFT JOIN  geoloc_pays    AS gp  ON (adr.country = gp.a2)
-                 LEFT JOIN  geoloc_region  AS gr  ON (adr.country = gr.a2 AND adr.region = gr.region)" .
+        return  "LEFT JOIN  adresses      AS adr ON (u.user_id = adr.uid AND FIND_IN_SET('active', adr.statut)".(S::logged() ? "" : "
+                                                                         AND adr.pub = 'public'").")
+                 LEFT JOIN  geoloc_pays   AS gp  ON (adr.country = gp.a2)
+                 LEFT JOIN  geoloc_region AS gr  ON (adr.country = gr.a2 AND adr.region = gr.region)" .
                 (S::logged() ?
-                 "LEFT JOIN  contacts       AS c   On (c.contact = u.user_id AND c.uid = " . S::v('uid') . ")"
+                "LEFT JOIN  contacts      AS c   ON (c.contact = u.user_id AND c.uid = " . S::v('uid') . ")"
                  : "");
     }
 
index a8f45f7..97e1b15 100644 (file)
@@ -85,6 +85,10 @@ abstract class Validate
         $this->stamp  = date('YmdHis');
         $this->unique = $_unique;
         $this->type   = $_type;
+        $res = XDB::query("SELECT  promo_display AS promo
+                             FROM  profile_display
+                            WHERE  uid={?}", $_uid);
+        $this->promo = $res->fetchOneCell();
     }
 
     // }}}
index 2cd3918..3b960d0 100644 (file)
@@ -29,8 +29,8 @@ class OrangeReq extends Validate
 
     public $promo_sortie;
 
-    public $rules = "A priori accepter (la validation sert à repousser les
-    petits malins). Refuse si tu connais la personne et que tu es sure
+    public $rules = "À priori accepter (la validation sert à repousser les
+    petits malins). Refuse si tu connais la personne et que tu es sûr
     qu'elle n'est pas orange.";
 
     // }}}
@@ -40,7 +40,10 @@ class OrangeReq extends Validate
     {
         parent::__construct($_user, true, 'orange');
         $this->promo_sortie  = $_sortie;
-        $res = XDB::query("SELECT promo FROM auth_user_md5 WHERE user_id = {?}", $_user->id());
+        $res = XDB::query("SELECT  entry_year
+                             FROM  profile_education
+                            WHERE  uid = {?} AND FIND_IN_SET('primary', flags)", $_uid);
+        $this->promo = $res->fetchOneCell();
     }
 
     // }}}
@@ -65,10 +68,11 @@ class OrangeReq extends Validate
     protected function _mail_body($isok)
     {
         if ($isok) {
-            $res = "  La demande de changement de promo de sortie que tu as demandée vient d'être effectuée.";
-            return $res;
+            return "  La demande de changement de promotion de sortie que tu as demandée vient d'être effectuée. "
+                   . "Si tu le souhaites, tu peux maintenant modifier l'affichage de ta promotion sur le site sur la page suivante : "
+                   . "https://www.polytechnique.org/profile/edit";
         } else {
-            return "  La demande de changement de promo de sortie tu avais faite a été refusée.";
+            return "  La demande de changement de promotion de sortie tu avais faite a été refusée.";
         }
     }
 
@@ -77,7 +81,9 @@ class OrangeReq extends Validate
 
     public function commit()
     {
-        XDB::execute("UPDATE auth_user_md5 set promo_sortie = {?} WHERE user_id = {?}",$this->promo_sortie, $this->user->id());
+        XDB::execute("UPDATE  profile_education
+                         SET  grad_year = {?}
+                       WHERE  uid = {?} AND FIND_IN_SET('primary', flags)", $this->promo_sortie, $this->uid);
         return true;
     }
 
index 50a5854..89b1b59 100644 (file)
@@ -27,15 +27,16 @@ function get_annuaire_infos($method, $params) {
         //on ne recupere pas les adresses inutilement
         if(!isset($params[2])){
             $res = XDB::iterRow(
-                    "SELECT  q.profile_mobile AS cell, a.naissance AS age
-                    FROM  auth_user_md5 AS a
-                    INNER JOIN auth_user_quick AS q USING (user_id)
-                    WHERE  a.matricule = {?}", $params[1]);
+                    "SELECT  ph.display_tel  AS cell, a.naissance AS age
+                       FROM  auth_user_md5   AS a
+                 INNER JOIN  auth_user_quick AS q USING (user_id)
+                  LEFT JOIN  profile_phones  AS ph ON (ph.uid = a.user_id AND link_type='user' AND tel_type = 'mobile')
+                      WHERE  a.matricule = {?} LIMIT 1", $params[1]);
             $array = $res->next();
         }
         else{
             $res = XDB::iterRow(
-                 "SELECT     q.profile_mobile AS cell, a.naissance AS age,
+                 "SELECT     a.naissance AS age,
                              adr.adr1, adr.adr2, adr.adr3,
                              adr.postcode, adr.city, adr.country,
                              adr.uid, adr.adrid
@@ -48,10 +49,18 @@ function get_annuaire_infos($method, $params) {
                              FIND_IN_SET('res-secondaire', adr.statut),
                              NOT FIND_IN_SET('courrier', adr.statut)", $params[1]);
             //traitement des adresses si necessaire
-            if(list($cell, $age, $adr['adr1'], $adr['adr2'], $adr['adr3'], $adr['cp'], $adr['ville'],
+            if(list($age, $adr['adr1'], $adr['adr2'], $adr['adr3'], $adr['cp'], $adr['ville'],
                         $adr['pays'], $uid, $adr['adrid']) = $res->next())
             {
-                $array['cell']      = $cell;
+                $sql = XDB::query("SELECT display_tel
+                                     FROM profile_phones
+                                    WHERE uid ={?} AND link_type = 'user' AND tel_type = 'mobile'
+                                    LIMIT 1", $uid);
+                if ($sql->numRows()>0) {
+                    $array['cell'] = $sql->fetchOneCell();
+                } else {
+                    $array['cell'] ='';
+                }
                 $array['age']       = $age;
                 $array['adresse'][] = $adr;
 
@@ -61,7 +70,7 @@ function get_annuaire_infos($method, $params) {
 
                 if ($adresse != 1) { //on ne veut pas la premiere adresse
                     $i = 2;
-                    while(list($cell, $age, $adr['adr1'], $adr['adr2'], $adr['adr3'], $adr['cp'], $adr['ville'],
+                    while(list($age, $adr['adr1'], $adr['adr2'], $adr['adr3'], $adr['cp'], $adr['ville'],
                                 $adr['pays'], , $adr['adrid']) = $res->next())
                     {
                         if($adresse == $i){//si on veut cette adresse en particulier
@@ -81,10 +90,10 @@ function get_annuaire_infos($method, $params) {
                 foreach ($array['adresse'] as $i => $a) $adrid_index[$a['adrid']] = $i;
                 // on rajoute les numéros de tels
                 $restel = XDB::iterator(
-                    "SELECT t.tel, t.tel_type, t.adrid
-                       FROM tels AS t
-                 INNER JOIN adresses AS a ON (t.adrid = a.adrid AND t.uid = a.uid)
-                      WHERE t.uid = {?} AND NOT FIND_IN_SET('pro', a.statut)", $uid);
+                    "SELECT t.display_tel AS tel, t.tel_type, t.link_id as adrid
+                       FROM profile_phones AS t
+                 INNER JOIN adresses AS a ON (t.link_id = a.adrid AND t.uid = a.uid)
+                      WHERE t.uid = {?} AND t.link_type = 'address' AND NOT FIND_IN_SET('pro', a.statut)", $uid);
                 while ($tel = $restel->next()) $array['adresse'][$adrid_index[$tel['adrid']]]['tels'][] = $tel;
                 foreach ($array['adresse'] as $i => $adr) {
                     unset($lasttel);
diff --git a/include/xorg/session.inc.php b/include/xorg/session.inc.php
new file mode 100644 (file)
index 0000000..3437515
--- /dev/null
@@ -0,0 +1,335 @@
+<?php
+/***************************************************************************
+ *  Copyright (C) 2003-2008 Polytechnique.org                              *
+ *  http://opensource.polytechnique.org/                                   *
+ *                                                                         *
+ *  This program is free software; you can redistribute it and/or modify   *
+ *  it under the terms of the GNU General Public License as published by   *
+ *  the Free Software Foundation; either version 2 of the License, or      *
+ *  (at your option) any later version.                                    *
+ *                                                                         *
+ *  This program is distributed in the hope that it will be useful,        *
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of         *
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
+ *  GNU General Public License for more details.                           *
+ *                                                                         *
+ *  You should have received a copy of the GNU General Public License      *
+ *  along with this program; if not, write to the Free Software            *
+ *  Foundation, Inc.,                                                      *
+ *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                *
+ ***************************************************************************/
+
+require_once 'xorg.misc.inc.php';
+
+class XorgSession
+{
+    // {{{ public static function init
+
+    public static function init()
+    {
+        S::init();
+        if (!S::has('uid')) {
+            try_cookie();
+        }
+        if ((check_ip('dangerous') && S::has('uid')) || check_account()) {
+            $_SESSION['log']->log("view_page", $_SERVER['REQUEST_URI']);
+        }
+    }
+
+    // }}}
+    // {{{ public static function destroy()
+
+    public static function destroy()
+    {
+        S::destroy();
+        XorgSession::init();
+    }
+
+    // }}}
+    // {{{ public static function doAuth()
+
+    public static function doAuth($new_name = false)
+    {
+        global $globals;
+        if (S::identified()) { // ok, c'est bon, on n'a rien à faire
+            return true;
+        }
+
+        if (!Env::has('username') || !Env::has('response')
+        ||  !S::has('challenge'))
+        {
+            return false;
+        }
+
+        // si on vient de recevoir une identification par passwordpromptscreen.tpl
+        // ou passwordpromptscreenlogged.tpl
+        if (S::has('suid')) {
+            $suid = S::v('suid');
+            $login = $uname = $suid['forlife'];
+            $redirect = false;
+        } else {
+            $uname = Env::v('username');
+
+            if (Env::v('domain') == "alias") {
+                $res = XDB::query(
+                    "SELECT redirect
+                       FROM virtual
+                 INNER JOIN virtual_redirect USING(vid)
+                      WHERE alias LIKE {?}", $uname."@".$globals->mail->alias_dom);
+                $redirect = $res->fetchOneCell();
+                if ($redirect) {
+                    $login = substr($redirect, 0, strpos($redirect, '@'));
+                } else {
+                    $login = "";
+                }
+            } else {
+                $login = $uname;
+                $redirect = false;
+            }
+        }
+
+        $field = (!$redirect && preg_match('/^\d*$/', $uname)) ? 'id' : 'alias';
+        $res   = XDB::query(
+                    "SELECT  u.user_id, u.password
+                       FROM  auth_user_md5 AS u
+                 INNER JOIN  aliases       AS a ON ( a.id=u.user_id AND type!='homonyme' )
+                      WHERE  a.$field = {?} AND u.perms IN('admin','user')", $login);
+
+        $logger = S::v('log');
+        if (list($uid, $password) = $res->fetchOneRow()) {
+            require_once('secure_hash.inc.php');
+            $expected_response = hash_encrypt("$uname:$password:".S::v('challenge'));
+            // le password de la base est peut-être encore encodé en md5
+            if (Env::v('response') != $expected_response) {
+                $new_password = hash_xor(Env::v('xorpass'), $password);
+                $expected_response = hash_encrypt("$uname:$new_password:".S::v('challenge'));
+                if (Env::v('response') == $expected_response) {
+                      XDB::execute("UPDATE auth_user_md5 SET password = {?} WHERE user_id = {?}",
+                                   $new_password, $uid);
+                }
+            }
+            if (Env::v('response') == $expected_response) {
+                if (Env::has('domain')) {
+                    if (($domain = Env::v('domain', 'login')) == 'alias') {
+                        setcookie('ORGdomain', "alias", (time()+25920000), '/', '', 0);
+                    } else {
+                        setcookie('ORGdomain', '', (time()-3600), '/', '', 0);
+                    }
+                    // pour que la modification soit effective dans le reste de la page
+                    $_COOKIE['ORGdomain'] = $domain;
+                }
+
+                S::kill('challenge');
+                if ($logger) {
+                    $logger->log('auth_ok');
+                }
+                if (!start_connexion($uid, true)) {
+                    return false;
+                }
+                if (Env::v('remember', 'false') == 'true') {
+                    $cookie = hash_encrypt(S::v('password'));
+                    setcookie('ORGaccess',$cookie,(time()+25920000),'/','',0);
+                    if ($logger) {
+                        $logger->log("cookie_on");
+                    }
+                } else {
+                    setcookie('ORGaccess', '', time() - 3600, '/', '', 0);
+
+                    if ($logger) {
+                        $logger->log("cookie_off");
+                    }
+                }
+                return true;
+            } elseif ($logger) {
+                $logger->log('auth_fail','bad password');
+            }
+        } elseif ($logger) {
+            $logger->log('auth_fail','bad login');
+        }
+
+        return false;
+    }
+
+    // }}}
+    // {{{ public static function doAuthCookie()
+
+    /** Try to do a cookie-based authentication.
+     *
+     * @param page the calling page (by reference)
+     */
+    public static function doAuthCookie()
+
+    {
+        if (S::logged()) {
+            return true;
+        }
+
+        if (Env::has('username') and Env::has('response')) {
+            return XorgSession::doAuth();
+        }
+
+        if ($r = try_cookie()) {
+            return XorgSession::doAuth(($r > 0));
+        }
+
+        return false;
+    }
+
+    // }}}
+    // {{{ public static function make_perms()
+
+    public static function &make_perms($perm)
+    {
+        $flags = new FlagSet();
+        if ($perm == 'disabled' || $perm == 'ext') {
+            return $flags;
+        }
+        $flags->addFlag(PERMS_USER);
+        if ($perm == 'admin') {
+            $flags->addFlag(PERMS_ADMIN);
+        }
+        return $flags;
+    }
+
+    // }}}
+}
+
+// {{{ function try_cookie()
+
+/** réalise la récupération de $_SESSION pour qqn avec cookie
+ * @return  int     0 if all OK, -1 if no cookie, 1 if cookie with bad hash,
+ *                  -2 should not happen
+ */
+function try_cookie()
+{
+    if (Cookie::v('ORGaccess') == '' or !Cookie::has('ORGuid')) {
+        return -1;
+    }
+
+    $res = @XDB::query(
+            "SELECT user_id,password FROM auth_user_md5
+              WHERE user_id = {?} AND perms IN('admin','user')",
+            Cookie::i('ORGuid'));
+
+    if ($res->numRows() != 0) {
+        list($uid, $password) = $res->fetchOneRow();
+        require_once('secure_hash.inc.php');
+        $expected_value       = hash_encrypt($password);
+        if ($expected_value == Cookie::v('ORGaccess')) {
+            if (!start_connexion($uid, false)) {
+                return -3;
+            }
+            return 0;
+        } else {
+            return 1;
+        }
+    }
+
+    return -2;
+}
+
+// }}}
+// {{{ function start_connexion()
+
+/** place les variables de session dépendants de auth_user_md5
+ * et met à jour les dates de dernière connexion si nécessaire
+ * @return void
+ * @see controlpermanent.inc.php controlauthentication.inc.php
+ */
+function start_connexion ($uid, $identified)
+{
+    $res  = XDB::query("
+        SELECT  u.user_id AS uid, nom_usage, perms, promo, promo_sortie,
+                matricule, password, FIND_IN_SET('femme', u.flags) AS femme,
+                a.alias AS forlife, a2.alias AS bestalias,
+                q.core_mail_fmt AS mail_fmt, UNIX_TIMESTAMP(q.banana_last) AS banana_last, q.watch_last, q.core_rss_hash,
+                FIND_IN_SET('watch', u.flags) AS watch_account, q.last_version,
+                nd.display AS display_name, nd.yourself AS yourself_name,
+                nd.firstname AS prenom, nd.lastname AS nom
+          FROM  auth_user_md5   AS u
+    INNER JOIN  auth_user_quick AS q  USING(user_id)
+    INNER JOIN  aliases         AS a  ON (u.user_id = a.id AND a.type='a_vie')
+    INNER JOIN  aliases         AS a2 ON (u.user_id = a2.id AND FIND_IN_SET('bestalias',a2.flags))
+    INNER JOIN  profile_names_display AS nd ON (u.user_id = nd.user_id)
+         WHERE  u.user_id = {?} AND u.perms IN('admin','user')", $uid);
+    $sess = $res->fetchOneAssoc();
+    $res = XDB::query("SELECT  UNIX_TIMESTAMP(s.start) AS lastlogin, s.host
+                         FROM  logger.sessions AS s
+                        WHERE  s.uid = {?} AND s.suid = 0
+                     ORDER BY  s.start DESC
+                        LIMIT  1", $uid);
+    if ($res->numRows()) {
+        $sess = array_merge($sess, $res->fetchOneAssoc());
+    }
+    $suid = S::v('suid');
+
+    if ($suid) {
+        $logger = new CoreLogger($uid, $suid['uid']);
+        $logger->log("suid_start", S::v('forlife')." by {$suid['uid']}");
+        $sess['suid'] = $suid;
+    } else {
+        $logger = S::v('log', new CoreLogger($uid));
+        $logger->log("connexion", Env::v('n'));
+        setcookie('ORGuid', $uid, (time()+25920000), '/', '', 0);
+    }
+
+    $_SESSION         = array_merge($_SESSION, $sess);
+    $_SESSION['log']  = $logger;
+    $_SESSION['auth'] = ($identified ? AUTH_MDP : AUTH_COOKIE);
+    $_SESSION['perms'] =& XorgSession::make_perms($_SESSION['perms']);
+    $mail_subject = null;
+    if (check_account()) {
+        $mail_subject = "Connexion d'un utilisateur surveillé";
+    }
+    if (check_ip('unsafe')) {
+        if ($mail_subject) {
+            $mail_subject .= ' - ';
+        }
+        $mail_subject .= "Une IP surveillee a tente de se connecter";
+        if (check_ip('ban')) {
+            send_warning_mail($mail_subject);
+            $_SESSION = array();
+            $_SESSION['perms'] = new FlagSet();
+            $newpage = false;
+            if (!Platal::page()) {
+                require_once 'xorg.inc.php';
+                new_skinned_page('platal/index.tpl');
+                $newpage = true;
+            }
+            Platal::page()->trigError("Une erreur est survenue lors de la procédure d'authentification. "
+                       ."Merci de contacter au plus vite "
+                       ."<a href='mailto:support@polytechnique.org'>support@polytechnique.org</a>");
+            if ($newpage) {
+                Platal::page()->run();
+            }
+            return false;
+        }
+    }
+    if ($mail_subject) {
+        send_warning_mail($mail_subject);
+    }
+    set_skin();
+    update_NbNotifs();
+    check_redirect();
+    return true;
+}
+
+// }}}
+
+function set_skin()
+{
+    global $globals;
+    if (S::logged() && (!S::has('skin') || S::has('suid'))) {
+        $uid = S::v('uid');
+        $res = XDB::query("SELECT  skin_tpl
+                          FROM  auth_user_quick AS a
+                          INNER JOIN  skins           AS s ON a.skin = s.id
+                          WHERE  user_id = {?} AND skin_tpl != ''", $uid);
+        if ($_SESSION['skin'] = $res->fetchOneCell()) {
+            return;
+        }
+    }
+}
+
+// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
+?>
index a9eddc6..6d42c02 100644 (file)
@@ -714,7 +714,7 @@ class AdminModule extends PLModule
                 $action = Env::v('valid_promo') == 'Ajouter des membres' ? 'add' : 'ax';
                 pl_redirect('admin/promo/' . $action . '/' . Env::i('promo'));
             } else {
-                $page->trigError('Promo non valide');
+                $page->trigError('Promotion non valide.');
             }
         }
 
index 6f1e98d..3a0721e 100644 (file)
@@ -258,7 +258,15 @@ class EmailModule extends PLModule
             $actifs = Env::v('emails_actifs', Array());
             print_r(Env::v('emails_rewrite'));
             if (Env::v('emailop') == "ajouter" && Env::has('email')) {
-                $retour = $redirect->add_email(Env::v('email'));
+                $new_email = Env::v('email');
+                if ($new_email == "new@example.org") {
+                    $new_email = Env::v('email_new');
+                }
+                $retour = $redirect->add_email($new_email);
+                if ($retour == ERROR_INVALID_EMAIL) {
+                    $page->assign('email', $new_email);
+                }
+                $page->assign('retour', $retour);
             } elseif (empty($actifs)) {
                 $retour = ERROR_INACTIVE_REDIRECTION;
             } elseif (is_array($actifs)) {
@@ -310,6 +318,9 @@ class EmailModule extends PLModule
         // Display GoogleApps acount information.
         require_once 'googleapps.inc.php';
         $page->assign('googleapps', GoogleAppsAccount::account_status($user->id()));
+
+        require_once 'emails.combobox.inc.php';
+        fill_email_combobox($page);
     }
 
     function handler_antispam(&$page, $statut_filtre = null)
index 33f1c6d..4a106e1 100644 (file)
@@ -159,16 +159,17 @@ class EventsModule extends PLModule
 
         // Fetch the events to display, along with their metadata.
         $array = array();
-        $it = XDB::iterator("SELECT  e.id,e.titre,e.texte,e.post_id,a.user_id,a.nom,a.prenom,a.promo,a.hruid,
+        $it = XDB::iterator("SELECT  e.id, e.titre, e.texte, e.post_id, a.user_id, a.nom, a.prenom, d.promo_display ,a.hruid,
                                      p.x, p.y, p.attach IS NOT NULL AS img, FIND_IN_SET('wiki', e.flags) AS wiki,
                                      FIND_IN_SET('important', e.flags) AS important,
                                      e.creation_date > DATE_SUB(CURDATE(), INTERVAL 2 DAY) AS news,
                                      e.peremption < DATE_ADD(CURDATE(), INTERVAL 2 DAY) AS end,
                                      ev.user_id IS NULL AS nonlu
                                FROM  evenements       AS e
-                          LEFT JOIN  evenements_photo AS p ON (e.id = p.eid)
-                         INNER JOIN  auth_user_md5    AS a ON e.user_id=a.user_id
-                          LEFT JOIN  evenements_vus AS ev ON (e.id = ev.evt_id AND ev.user_id = {?})
+                          LEFT JOIN  evenements_photo AS p  ON (e.id = p.eid)
+                         INNER JOIN  auth_user_md5    AS a  ON (e.user_id = a.user_id)
+                         INNER JOIN  profile_display  AS d  ON (d.uid = a.user_id)
+                          LEFT JOIN  evenements_vus   AS ev ON (e.id = ev.evt_id AND ev.user_id = {?})
                               WHERE  FIND_IN_SET('valide', e.flags) AND peremption >= NOW()
                                      AND (e.promo_min = 0 || e.promo_min <= {?})
                                      AND (e.promo_max = 0 || e.promo_max >= {?})
diff --git a/modules/fusionax.php b/modules/fusionax.php
new file mode 100644 (file)
index 0000000..aa07f4b
--- /dev/null
@@ -0,0 +1,432 @@
+<?php
+/***************************************************************************
+ *  Copyright (C) 2003-2007 Polytechnique.org                              *
+ *  http://opensource.polytechnique.org/                                   *
+ *                                                                         *
+ *  This program is free software; you can redistribute it and/or modify   *
+ *  it under the terms of the GNU General Public License as published by   *
+ *  the Free Software Foundation; either version 2 of the License, or      *
+ *  (at your option) any later version.                                    *
+ *                                                                         *
+ *  This program is distributed in the hope that it will be useful,        *
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of         *
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
+ *  GNU General Public License for more details.                           *
+ *                                                                         *
+ *  You should have received a copy of the GNU General Public License      *
+ *  along with this program; if not, write to the Free Software            *
+ *  Foundation, Inc.,                                                      *
+ *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                *
+ ***************************************************************************/
+
+/**
+ * @brief Module to merge data from AX database
+ *
+ * Module to import data from another database of alumni that had
+ * different schemas. The organization that used this db is called AX
+ * hence the name of this module.
+ *
+ * Datas are stored in an external server and you need a private key
+ * to connect to their server.
+ */
+class FusionAxModule extends PLModule
+{
+    function __construct()
+    {
+    }
+
+    function handlers()
+    {
+        return array(
+            'fusionax'          => $this->make_hook('index',    AUTH_MDP, 'admin'),
+            'fusionax/import'   => $this->make_hook('import',   AUTH_MDP, 'admin'),
+            'fusionax/view'     => $this->make_hook('view',     AUTH_MDP, 'admin'),
+            'fusionax/ids'      => $this->make_hook('ids',      AUTH_MDP, 'admin'),
+            'fusionax/deceased' => $this->make_hook('deceased', AUTH_MDP, 'admin'),
+            'fusionax/promo'    => $this->make_hook('promo',    AUTH_MDP, 'admin'),
+        );
+    }
+
+
+    function handler_index(&$page)
+    {
+        $globals = Platal::globals();
+
+        $page->changeTpl('fusionax/index.tpl');
+        $page->assign('xorg_title', 'Polytechnique.org - Fusion des annuaires');
+        if (isset($globals->fusionax) && isset($globals->fusionax->LastUpdate)) {
+            $page->assign('lastimport', date("d-m-Y", $globals->fusionax->LastUpdate));
+        }
+    }
+
+    /** Import de l'annuaire de l'AX depuis l'export situé dans le home de jacou */
+    function handler_import(&$page, $action = 'index', $fileSQL = '')
+    {
+        $globals = Platal::globals();
+
+        if ($action == 'index') {
+            $page->changeTpl('fusionax/import.tpl');
+            $page->addJsLink('jquery.js');
+            if (isset($globals->fusionax) && isset($globals->fusionax->LastUpdate)) {
+                $page->assign(
+                    'lastimport',
+                    "le " . date("d/m/Y à H:i", $globals->fusionax->LastUpdate));
+            }
+            return;
+        }
+
+        // toutes les actions sont faites en ajax en utilisant jquery
+        header("Content-type: text/javascript; charset=utf-8");
+
+        // log des actions
+        $report = array();
+
+        // création d'un fichier temporaire si nécessaire
+        if (Env::has('tmpdir')) {
+            $tmpdir = Env::v('tmpdir');
+        } else {
+            $tmpdir = tempnam('/tmp', 'fusionax');
+            unlink($tmpdir);
+            mkdir($tmpdir);
+            chmod($tmpdir, 0700);
+        }
+
+        $modulepath = realpath(dirname(__FILE__) . '/fusionax/') . '/';
+        $olddir = getcwd();
+        chdir($tmpdir);
+
+        if ($action == 'launch') {
+            // séparation de l'archive en fichiers par tables
+            exec($modulepath . 'import-ax.sh', $report);
+            $report[] = 'Fichier parsé.';
+            $report[] = 'Import dans la base en cours...';
+            $next = 'integrateSQL';
+        } elseif ($action == 'integrateSQL') {
+            // intégration des données dans la base MySQL
+            // liste des fichiers sql à exécuter
+            $filesSQL = array(
+                'Activites.sql',
+                'Adresses.sql',
+                'Anciens.sql',
+                'Formations.sql',
+                'Entreprises.sql');
+            if ($fileSQL != '') {
+                // récupère le contenu du fichier sql
+                $queries = explode(';', file_get_contents($modulepath . $fileSQL));
+                foreach ($queries as $q) {
+                    if (trim($q)) {
+                        // coupe le fichier en requêtes individuelles
+                        if (substr($q, 0, 2) == '--') {
+                            // affiche les commentaires dans le report
+                            $lines = explode("\n", $q);
+                            $l = $lines[0];
+                            $report[] = addslashes($l);
+                        }
+                        // exécute la requête
+                        XDB::execute($q);
+                    }
+                }
+                // trouve le prochain fichier à exécuter
+                $trans = array_flip($filesSQL);
+                $nextfile = $trans[$fileSQL] + 1;
+            } else {
+                $nextfile = 0;
+            }
+            if (!isset($filesSQL[$nextfile])) {
+                // tous les fichiers ont été exécutés, on passe à l'étape
+                // suivante
+                $next = 'clean';
+            } else {
+                // on passe au fichier suivant
+                $next = 'integrateSQL/' . $filesSQL[$nextfile];
+            }
+        } elseif ($action == 'clean') {
+            // nettoyage du fichier temporaire
+            chdir($olddir);
+            exec("rm -Rf $tmpdir", $report);
+            $report[] = "Fin de l\'import";
+            // met à jour la date de dernier import
+            //$globals->change_dynamic_config(array('LastUpdate' => time()), 'FusionAx');
+        }
+        foreach($report as $t) {
+            // affiche les lignes de report
+            echo "$('#fusionax_import').append('" . $t . "<br/>');\n";
+        }
+        if (isset($next)) {
+            $tmpdir = getcwd();
+            chdir($olddir);
+            // lance le prochain script s'il y en a un
+            echo "$.getScript('fusionax/import/" . $next . "?tmpdir=" . urlencode($tmpdir) . "');";
+        }
+        // exit pour ne pas afficher la page template par défaut
+        exit;
+    }
+
+    /** Import de l'annuaire de l'AX depuis l'export situé dans le home de jacou */
+    function handler_view(&$page, $action = '')
+    {
+        $globals = Platal::globals();
+
+        $page->changeTpl('fusionax/view.tpl');
+        if ($action == 'create') {
+            XDB::execute('DROP VIEW IF EXISTS fusionax_deceased');
+            XDB::execute('CREATE VIEW  fusionax_deceased AS
+                               SELECT  u.user_id, a.id_ancien, u.nom, u.prenom, u.promo, u.deces AS deces_xorg, a.Date_deces AS deces_ax
+                                 FROM  auth_user_md5    AS u
+                           INNER JOIN  fusionax_anciens AS a ON (a.id_ancien = u.matricule_ax)
+                                WHERE  u.deces != a.Date_deces');
+            XDB::execute('DROP VIEW IF EXISTS fusionax_promo');
+            XDB::execute('CREATE VIEW  fusionax_promo AS
+                               SELECT  u.user_id, u.matricule_ax, CONCAT(u.nom, " ", u.prenom) AS display_name, u.promo AS promo_etude_xorg,
+                                       f.promotion_etude AS promo_etude_ax, u.promo_sortie AS promo_sortie_xorg
+                                 FROM  auth_user_md5    AS u
+                           INNER JOIN  fusionax_anciens AS f ON (u.matricule_ax = f.id_ancien)
+                                WHERE  u.promo != f.promotion_etude AND !(f.promotion_etude = u.promo + 1 AND u.promo_sortie = u.promo + 4)');
+        }
+    }
+
+    /* Mets à NULL le matricule_ax de ces camarades pour marquer le fait qu'ils ne figurent pas dans l'annuaire de l'AX */
+    private static function clear_wrong_in_xorg($user_id)
+    {
+        $res = XDB::execute("UPDATE  fusionax_xorg_anciens
+                                SET  matricule_ax = NULL
+                              WHERE  user_id = {?}", $user_id);
+        if (!$res) {
+            return 0;
+        }
+        return XDB::affectedRows() / 2;
+    }
+
+    /* Cherche les les anciens présents dans Xorg avec un matricule_ax ne correspondant à rien dans la base de l'AX 
+     * (mises à part les promo 1921 et 1923 qui ne figurent pas dans les données de l'AX)*/
+    private static function find_wrong_in_xorg($limit = 10)
+    {
+        return XDB::iterator("SELECT  u.promo, u.user_id, u.display_name
+                                FROM  fusionax_xorg_anciens AS u
+                               WHERE  NOT EXISTS (SELECT  *
+                                                    FROM  fusionax_anciens AS f
+                                                   WHERE  f.id_ancien = u.matricule_ax)
+                                      AND u.matricule_ax IS NOT NULL AND promo != 1921 AND promo != 1923");
+    }
+
+    /** Lier les identifiants d'un ancien dans les deux annuaires
+     * @param user_id identifiant dans l'annuaire X.org
+     * @param matricule_ax identifiant dans l'annuaire de l'AX
+     * @return 0 si la liaison a échoué, 1 sinon
+     */
+    private static function link_by_ids($user_id, $matricule_ax)
+    {
+        $res = XDB::execute("UPDATE  fusionax_import       AS i
+                         INNER JOIN  fusionax_xorg_anciens AS u
+                                SET  u.matricule_ax = i.id_ancien,
+                                     i.user_id = u.user_id,
+                                     i.date_match_id = NOW()
+                              WHERE  i.id_ancien = {?} AND u.user_id = {?}
+                                     AND (u.matricule_ax != {?} OR u.matricule_ax IS NULL
+                                          OR i.user_id != {?} OR i.user_id IS NULL)",
+                            $matricule_ax, $user_id, $matricule_ax, $user_id);
+        if (!$res) {
+            return 0;
+        }
+        return XDB::affectedRows() / 2;
+    }
+
+    /** Recherche automatique d'anciens à lier entre les deux annuaires
+     * @param limit nombre d'anciens à trouver au max
+     * @param sure si true, ne trouve que des anciens qui sont quasi sûrs
+     * @return un XOrgDBIterator sur les entrées avec display_name, promo,
+     * user_id, id_ancien et display_name_ax
+     */
+    private static function find_easy_to_link($limit = 10, $sure = false)
+    {
+        $easy_to_link = XDB::iterator("
+        SELECT  u.display_name, u.promo, u.user_id, ax.id_ancien,
+                CONCAT(ax.prenom, ' ', ax.nom_complet, ' (X ', ax.promotion_etude, ')') AS display_name_ax,
+                COUNT(*) AS nbMatches
+          FROM  fusionax_anciens      AS ax
+    INNER JOIN  fusionax_import       AS i ON (i.id_ancien = ax.id_ancien AND i.user_id IS NULL)
+     LEFT JOIN  fusionax_xorg_anciens AS u ON (u.matricule_ax IS NULL
+                                               AND ax.Nom_patronymique = u.nom
+                                               AND ax.prenom = u.prenom
+                                               AND u.promo = ax.promotion_etude)
+      GROUP BY  u.user_id
+        HAVING  u.user_id IS NOT NULL AND nbMatches = 1 " . ($limit ? ('LIMIT ' . $limit) : ''));
+        if ($easy_to_link->total() > 0 || $sure) {
+            return $easy_to_link;
+        }
+        return XDB::iterator("
+        SELECT  u.display_name, u.promo, u.user_id, ax.id_ancien,
+                CONCAT(ax.prenom, ' ', ax.nom_complet, ' (X ', ax.promotion_etude, ')') AS display_name_ax,
+                COUNT(*) AS nbMatches
+          FROM  fusionax_anciens      AS ax
+    INNER JOIN  fusionax_import       AS i ON (i.id_ancien = ax.id_ancien AND i.user_id IS NULL)
+     LEFT JOIN  fusionax_xorg_anciens AS u ON (u.matricule_ax IS NULL
+                                               AND (ax.Nom_patronymique = u.nom
+                                                    OR ax.Nom_patronymique LIKE CONCAT(u.nom, ' %')
+                                                    OR ax.Nom_patronymique LIKE CONCAT(u.nom, '-%')
+                                                    OR ax.Nom_usuel = u.nom
+                                                    OR u.nom LIKE CONCAT('% ', ax.Nom_patronymique))
+                                               AND u.promo < ax.promotion_etude + 2
+                                               AND u.promo > ax.promotion_etude - 2)
+      GROUP BY  u.user_id
+        HAVING  u.user_id IS NOT NULL AND nbMatches = 1 " . ($limit ? ('LIMIT ' . $limit) : ''));
+    }
+
+    /** Module de mise en correspondance les ids */
+    function handler_ids(&$page, $part = 'main', $user_id = null, $matricule_ax = null)
+    {
+        $globals = Platal::globals();
+        $nbToLink = 100;
+
+        $page->addJsLink('jquery.js');
+        $page->assign('xorg_title', 'Polytechnique.org - Fusion - Mise en correspondance simple');
+        if ($part == 'missingInAX') {
+            // locate all persons from this database that are not in AX's
+            $page->changeTpl('fusionax/idsMissingInAx.tpl');
+            $missingInAX = XDB::iterator("SELECT  promo, user_id, display_name
+                                            FROM  fusionax_xorg_anciens
+                                           WHERE  matricule_ax IS NULL");
+            $page->assign('missingInAX', $missingInAX);
+            return;
+        }
+        if ($part == 'missingInXorg') {
+            // locate all persons from AX's database that are not here
+            $page->changeTpl('fusionax/idsMissingInXorg.tpl');
+            $missingInXorg = XDB::iterator("SELECT  a.promotion_etude AS promo,
+                                                    CONCAT(a.prenom, ' ', a.Nom_usuel) AS display_name,
+                                                    a.id_ancien
+                                              FROM  fusionax_import
+                                        INNER JOIN  fusionax_anciens AS a USING (id_ancien)
+                                             WHERE  fusionax_import.user_id IS NULL");
+            $page->assign('missingInXorg', $missingInXorg);
+            return;
+        }
+        if ($part == 'wrongInXorg') {
+            // locate all persons from Xorg database that have a bad AX id
+            $page->changeTpl('fusionax/idswrongInXorg.tpl');
+            $wrongInXorg = FusionAxModule::find_wrong_in_xorg($nbToLink);
+            $page->assign('wrongInXorg', $wrongInXorg);
+            return;
+        }
+        if ($part == 'cleanwronginxorg') {
+            $linksToDo = FusionAxModule::find_wrong_in_xorg($nbToLink);
+            while ($l = $linksToDo->next()) {
+                FusionAxModule::clear_wrong_in_xorg($l['user_id']);
+            }
+            pl_redirect('fusionax/ids/wrongInXorg');
+        }
+        if ($part == 'lier') {
+            if (Post::has('user_id') && Post::has('matricule_ax')) {
+                FusionAxModule::link_by_ids(Post::i('user_id'), Post::v('matricule_ax'));
+            }
+        }
+        if ($part == 'link') {
+            FusionAxModule::link_by_ids($user_id, $matricule_ax);
+            exit;
+        }
+        if ($part == 'linknext') {
+            $linksToDo = FusionAxModule::find_easy_to_link($nbToLink);
+            while ($l = $linksToDo->next()) {
+                FusionAxModule::link_by_ids($l['user_id'], $l['id_ancien']);
+            }
+            pl_redirect('fusionax/ids#autolink');
+        }
+        if ($part == 'linkall') {
+            $linksToDo = FusionAxModule::find_easy_to_link(0);
+            while ($l = $linksToDo->next()) {
+                FusionAxModule::link_by_ids($l['user_id'], $l['id_ancien']);
+            }
+        }
+        {
+            $page->changeTpl('fusionax/ids.tpl');
+            $missingInAX = XDB::query('SELECT  COUNT(*)
+                                         FROM  fusionax_xorg_anciens AS u
+                                        WHERE  u.matricule_ax IS NULL');
+            if ($missingInAX) {
+                $page->assign('nbMissingInAX', $missingInAX->fetchOneCell());
+            }
+            $missingInXorg = XDB::query('SELECT  COUNT(*)
+                                           FROM  fusionax_import AS i
+                                          WHERE  i.user_id IS NULL');
+            if ($missingInXorg) {
+                $page->assign('nbMissingInXorg', $missingInXorg->fetchOneCell());
+            }
+            $wrongInXorg = FusionAxModule::find_wrong_in_xorg($nbToLink);
+            if ($wrongInXorg->total() > 0) {
+                $page->assign('wrongInXorg', $wrongInXorg->total());
+            }
+            $easyToLink = FusionAxModule::find_easy_to_link($nbToLink);
+            if ($easyToLink->total() > 0) {
+                $page->assign('nbMatch', $easyToLink->total());
+                $page->assign('easyToLink', $easyToLink);
+            }
+        }
+    }
+
+    function handler_deceased(&$page, $action = '')
+    {
+        if ($action == 'updateXorg') {
+            XDB::execute('UPDATE  fusionax_deceased
+                             SET  deces_xorg = deces_ax
+                           WHERE  deces_xorg = "0000-00-00"');
+        }
+        if ($action == 'updateAX') {
+            XDB::execute('UPDATE  fusionax_deceased
+                             SET  deces_ax = deces_xorg
+                           WHERE  deces_ax = "0000-00-00"');
+        }
+        if ($action == 'update') {
+            if (Post::has('user_id') && Post::has('date')) {
+                XDB::execute('UPDATE  fusionax_deceased
+                                 SET  deces_ax = {?}, deces_xorg = {?}
+                               WHERE  user_id = {?}',
+                             Post::v('date'), Post::v('date'), Post::i('user_id'));
+            }
+        }
+        $page->changeTpl('fusionax/deceased.tpl');
+        // deceased
+        $deceasedErrorsSql = XDB::query('SELECT COUNT(*) FROM fusionax_deceased');
+        $page->assign('deceasedErrors', $deceasedErrorsSql->fetchOneCell());
+        $res = XDB::iterator('SELECT  d.user_id, d.id_ancien, d.nom, d.prenom, d.promo, d.deces_ax,
+                                      CONCAT(d.prenom, " ", d.nom) AS display_name
+                                FROM  fusionax_deceased AS d
+                               WHERE  d.deces_xorg = "0000-00-00"
+                               LIMIT  10');
+        $page->assign('nbDeceasedMissingInXorg', $res->total());
+        $page->assign('deceasedMissingInXorg', $res);
+        $res = XDB::iterator('SELECT  d.user_id, d.id_ancien, d.nom, d.prenom, d.promo, d.deces_xorg,
+                                      CONCAT(d.prenom, " ", d.nom) AS display_name
+                                FROM  fusionax_deceased AS d
+                               WHERE  d.deces_ax = "0000-00-00"
+                               LIMIT  10');
+        $page->assign('nbDeceasedMissingInAX', $res->total());
+        $page->assign('deceasedMissingInAX', $res);
+        $res = XDB::iterator('SELECT  d.user_id, d.id_ancien, d.nom, d.prenom, d.promo,
+                                      d.deces_ax, d.deces_xorg,
+                                      CONCAT(d.prenom, " ", d.nom, " ", d.user_id) AS display_name
+                                FROM  fusionax_deceased AS d
+                               WHERE  d.deces_xorg != "0000-00-00" AND d.deces_ax != "0000-00-00"');
+        $page->assign('nbDeceasedDifferent', $res->total());
+        $page->assign('deceasedDifferent', $res);
+    }
+
+    function handler_promo(&$page, $action = '')
+    {
+        $page->changeTpl('fusionax/promo.tpl');
+        $res = XDB::iterator('SELECT  user_id, display_name, promo_etude_xorg, promo_sortie_xorg, promo_etude_ax
+                                FROM  fusionax_promo
+                               WHERE  !(promo_etude_ax + 1 = promo_etude_xorg AND promo_etude_xorg + 3 = promo_sortie_xorg)');
+        $nbMissmatchingPromos = $res->total();
+        $page->assign('nbMissmatchingPromos1', $res->total());
+        $page->assign('missmatchingPromos1', $res);
+        $res = XDB::iterator('SELECT  user_id, display_name, promo_etude_xorg, promo_sortie_xorg, promo_etude_ax
+                                FROM  fusionax_promo
+                               WHERE  promo_etude_ax + 1 = promo_etude_xorg AND promo_etude_xorg + 3 = promo_sortie_xorg');
+        $nbMissmatchingPromos += $res->total();
+        $page->assign('nbMissmatchingPromos2', $res->total());
+        $page->assign('missmatchingPromos2', $res);
+        $page->assign('nbMissmatchingPromos', $nbMissmatchingPromos);
+    }
+}
+
+// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:?>
diff --git a/modules/fusionax/Activites.sql b/modules/fusionax/Activites.sql
new file mode 100644 (file)
index 0000000..33ddbdc
--- /dev/null
@@ -0,0 +1,22 @@
+-- Import complet des activités professionnelles
+
+DROP TABLE IF EXISTS `fusionax_activites`;
+
+CREATE TABLE IF NOT EXISTS `fusionax_activites` (
+  `AC` CHAR(2) NOT NULL COMMENT 'Vaut toujours AC pour cette table',
+  `id_ancien` VARCHAR(8) NOT NULL COMMENT 'Id unique de l''ancien',
+  `hash_activite` BINARY(5) NOT NULL COMMENT 'Hash de cette ligne pour la lier à l''adresse',
+  `Code_etab` BIGINT(10) NOT NULL COMMENT 'Code de l''établissement',
+  `Raison_sociale` VARCHAR(255) collate utf8_general_ci NOT NULL COMMENT 'Raison sociale de l''établissement',
+  `Libelle_fonctio` VARCHAR(255) collate utf8_general_ci NOT NULL COMMENT 'Libéllé de la fonction',
+  `Annuaire` BOOLEAN NOT NULL COMMENT 'publiable dans l''annuaire papier',
+  `Date_maj` DATE NOT NULL COMMENT 'Date de mise à jour de ces informations',
+  PRIMARY KEY( `id_ancien` , `hash_activite` )
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
+
+LOAD DATA LOCAL INFILE 'Activites.txt' INTO TABLE `fusionax_activites` FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\r\n'
+(AC, id_ancien, Code_etab, Raison_sociale, Libelle_fonctio, Annuaire,
+@Ligne1, @Ligne2, @Ligne3, @code_postal, @ville, @zip_cedex, @etat_distr, @pays, @tel, @fax, @StringDate_maj)
+SET
+`hash_activite` = SUBSTRING( MD5( CONCAT(Code_etab, Libelle_fonctio) ), 1, 5),
+`Date_maj` = CONCAT(SUBSTRING(@StringDate_maj,7),'-',SUBSTRING(@StringDate_maj,4,2),'-',SUBSTRING(@StringDate_maj,1,2));
diff --git a/modules/fusionax/Adresses.sql b/modules/fusionax/Adresses.sql
new file mode 100644 (file)
index 0000000..23af228
--- /dev/null
@@ -0,0 +1,47 @@
+-- Import complet des adresses
+
+DROP TABLE IF EXISTS fusionax_adresses;
+
+CREATE TABLE IF NOT EXISTS fusionax_adresses (
+  provenance CHAR(2) NOT NULL COMMENT 'Vaut AC, AD ou AN selon la provenance de l''info',
+  id_ancien VARCHAR(8) NOT NULL COMMENT 'Id unique de l''ancien',
+  Type_adr ENUM('E', 'P') character set binary NOT NULL DEFAULT 'P' COMMENT 'Type d''adresse : E pour Entreprise, P pour Personnelle',
+  hash_adresse BINARY(5) NOT NULL COMMENT 'Hash pour différencier les diverses adresses',
+  Ligne1 VARCHAR(90) character set utf8 NOT NULL,
+  Ligne2 VARCHAR(90) character set utf8 NOT NULL,
+  Ligne3 VARCHAR(90) character set utf8 NOT NULL,
+  code_postal VARCHAR(20) character set utf8 NOT NULL,
+  ville VARCHAR(80) character set utf8 NOT NULL,
+  zip_cedex VARCHAR(20) character set utf8 NOT NULL,
+  etat_distr VARCHAR(20) character set utf8 NOT NULL,
+  pays VARCHAR(50) character set utf8 NOT NULL,
+  tel VARCHAR(30) NOT NULL,
+  fax VARCHAR(30) NOT NULL,
+  Date_maj DATE NOT NULL,
+  PRIMARY KEY  (id_ancien, hash_adresse)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
+
+LOAD DATA LOCAL INFILE 'Adresses.txt' INTO TABLE `fusionax_adresses` FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\r\n'
+(provenance, id_ancien, @Type_adr, Ligne1, Ligne2, Ligne3, code_postal, ville, zip_cedex, etat_distr, pays, tel, fax, @StringDate_maj)
+SET
+`Type_adr` = IF(@Type_adr = 'E', 'E', IF(@Type_adr = '', '', 'P')),
+`hash_adresse` = SUBSTRING( MD5( @Type_adr ), 1, 5),
+`Date_maj` = CONCAT(SUBSTRING(@StringDate_maj,7),'-',SUBSTRING(@StringDate_maj,4,2),'-',SUBSTRING(@StringDate_maj,1,2));
+
+LOAD DATA LOCAL INFILE 'Anciens.txt' INTO TABLE `fusionax_adresses` FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\r\n'
+(provenance, id_ancien, @Login, @Password, @promotion_etude, @Groupe_promo, @Nom_patronymique, @partic_patro, @prenom, @Nom_usuel, @partic_nom,
+    @Nom_complet, @Civilite, @Code_nationalite, @Type_membre, @corps_sortie, @StringDate_deces, @grade, @Mel_usage, @Mel_publiable,
+    @tel_mobile, @annee_dernCot, @Representant, @Type_adr, Ligne1, Ligne2, Ligne3, code_postal, ville,
+    zip_cedex, etat_distr, pays, tel, fax, @StringDate_maj)
+SET
+`Type_adr` = IF(@Type_adr = 'E', 'E', IF(@Type_adr = '', '', 'P')),
+`hash_adresse` = SUBSTRING( MD5( @Type_adr ), 1, 5),
+`Date_maj` = CONCAT(SUBSTRING(@StringDate_maj,7),'-',SUBSTRING(@StringDate_maj,4,2),'-',SUBSTRING(@StringDate_maj,1,2));
+
+LOAD DATA LOCAL INFILE 'Activites.txt' INTO TABLE `fusionax_adresses` FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\r\n'
+(provenance, id_ancien, @Code_etab, @Raison_sociale, @Libelle_fonctio, @Annuaire, 
+Ligne1, Ligne2, Ligne3, code_postal, ville, zip_cedex, etat_distr, pays, tel, fax, @StringDate_maj)
+SET
+`Type_adr` = 'E',
+`hash_adresse` = SUBSTRING( MD5( CONCAT(@Code_etab, @Libelle_fonctio) ), 1, 5),
+`Date_maj` = CONCAT(SUBSTRING(@StringDate_maj,7),'-',SUBSTRING(@StringDate_maj,4,2),'-',SUBSTRING(@StringDate_maj,1,2));
diff --git a/modules/fusionax/Anciens.sql b/modules/fusionax/Anciens.sql
new file mode 100644 (file)
index 0000000..7964f43
--- /dev/null
@@ -0,0 +1,58 @@
+-- Import complet des anciens
+
+DROP TABLE IF EXISTS fusionax_anciens;
+
+CREATE TABLE IF NOT EXISTS fusionax_anciens (
+  AN CHAR(2) NOT NULL COMMENT 'Vaut toujours AN pour cette table',
+  id_ancien VARCHAR(8) NOT NULL COMMENT 'Id unique de l''ancien',
+  Login VARCHAR(15) NOT NULL COMMENT 'Login sur le site de l''AX',
+  Password INT(11) NOT NULL COMMENT 'Mot de passe sur le site AX',
+  promotion_etude SMALLINT(4) NOT NULL COMMENT 'Promotion avec laquelle il/elle a fait ses études',
+  Groupe_promo ENUM('', 'A', 'B', 'C', 'N', 'S') character set binary NOT NULL COMMENT 'Groupe de promotion (code compris seulement par AX)',
+  Nom_patronymique VARCHAR(255) character set utf8 NOT NULL COMMENT 'Nom patronymique (nom de jeune fille) sans la particule',
+  partic_patro VARCHAR(5) character set utf8 NOT NULL COMMENT 'Particule du nom patronymique',
+  prenom VARCHAR(30) character set utf8 NOT NULL COMMENT 'Prénom',
+  Nom_usuel VARCHAR(255) character set utf8 NOT NULL COMMENT 'Nom usuel (nom marital par exemple) sans la particule',
+  partic_nom VARCHAR(5) character set utf8 NOT NULL COMMENT 'Particule du nom usuel',
+  Nom_complet VARCHAR(255) character set utf8 NOT NULL COMMENT 'Nom patronymique complet (avec la particule)',
+  Civilite ENUM('', '.', 'M', 'MME', 'MLLE') character set utf8 NOT NULL COMMENT 'Civilité',
+  Code_nationalite CHAR(4) NOT NULL COMMENT 'Nationalité (code)',
+  Type_membre ENUM('', '*', 'F', 'FB', 'P', 'PB', 'T', 'TB', 'TA') character set binary NOT NULL COMMENT 'Type de membre (code compris seulement par AX)',
+  corps_sortie VARCHAR(50) character set utf8 NOT NULL COMMENT 'Corps de sortie (ou D si aucun)',
+  Date_deces DATE COMMENT 'Date de décès',
+  grade VARCHAR(50) NOT NULL COMMENT 'Grade actuel dans son corps',
+  Mel_usage VARCHAR(255) NOT NULL COMMENT 'Adresse e-mail d''usage',
+  Mel_publiable TINYINT(4) NOT NULL COMMENT 'Autorisation d''utiliser le mail',
+  tel_mobile VARCHAR(30) NOT NULL COMMENT 'Numéro de téléphone mobile',
+  annee_dernCot INT(11) NOT NULL COMMENT 'Année de dernière cotisation AX',
+  Representant ENUM('', 'K', 'DE') character set binary NOT NULL COMMENT 'Représentant de promotion',
+  hash_adr_defaut BINARY(5) NOT NULL COMMENT 'Hash de l''adresse par défaut',
+  Date_maj DATE NOT NULL,
+  PRIMARY KEY  (id_ancien)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
+
+LOAD DATA LOCAL INFILE 'Anciens.txt' INTO TABLE `fusionax_anciens` FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\r\n'
+(`AN`, `id_ancien`, `Login`, `Password`, `promotion_etude`, `Groupe_promo`, `Nom_patronymique`, `partic_patro`, `prenom`, Nom_usuel, partic_nom,
+    Nom_complet, Civilite, Code_nationalite, Type_membre, corps_sortie, @StringDate_deces, grade, Mel_usage, Mel_publiable,
+    tel_mobile, annee_dernCot, Representant, @Type_adr_defaut, @AdrC_Ligne1, @AdrC_Ligne2, @AdrC_Ligne3, @AdrC_code_postal, @AdrC_ville,
+    @AdrC_zip_cedex, @AdrC_etat_distr, @AdrC_pays, @tel, @fax, @StringDate_maj)
+SET
+    `hash_adr_defaut` = SUBSTRING( MD5( @Type_adr_defaut ), 1, 5),
+    `Date_maj` = CONCAT(SUBSTRING(@StringDate_maj,7),'-',SUBSTRING(@StringDate_maj,4,2),'-',SUBSTRING(@StringDate_maj,1,2)),
+    `Date_deces` = CONCAT(SUBSTRING(@StringDate_deces,7),'-',SUBSTRING(@StringDate_deces,4,2),'-',SUBSTRING(@StringDate_deces,1,2));
+
+ALTER TABLE fusionax_anciens ADD INDEX (id_ancien);
+
+-- Correspondances entre fiches X.org et fiches AX
+DROP TABLE IF EXISTS `fusionax_import`;
+
+CREATE TABLE IF NOT EXISTS `fusionax_import` (
+  `id_ancien` VARCHAR(8) NOT NULL COMMENT 'identifiant AX de l''ancien',
+  `user_id` INT(11) DEFAULT NULL COMMENT 'identifiant x.org de l''ancien si on l''a trouvé',
+  `date_match_id` TIMESTAMP NULL DEFAULT NULL COMMENT 'date de mise en correspondance des identifiants',
+  PRIMARY KEY  (`id_ancien`),
+  KEY `user_id` (`user_id`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
+
+INSERT INTO `fusionax_import` ( SELECT `id_ancien`, NULL, NULL FROM `fusionax_anciens` );
+REPLACE INTO `fusionax_import` ( SELECT `matricule_ax`, `user_id`, NOW() FROM `auth_user_md5` );
diff --git a/modules/fusionax/Entreprises.sql b/modules/fusionax/Entreprises.sql
new file mode 100644 (file)
index 0000000..a14ccd1
--- /dev/null
@@ -0,0 +1,17 @@
+-- Import complet des entreprises
+
+DROP TABLE IF EXISTS `fusionax_entreprises`;
+
+CREATE TABLE IF NOT EXISTS `fusionax_entreprises` (
+  `EN` CHAR(2) NOT NULL COMMENT 'Vaut toujours EN pour cette table',
+  `Code_etab` BIGINT(10) NOT NULL COMMENT 'Code de l''établissement',
+  `Raison_sociale` VARCHAR(255) collate utf8_general_ci NOT NULL COMMENT 'Raison sociale de l''établissement',
+  `Sigle` VARCHAR(50) collate utf8_general_ci NOT NULL COMMENT 'Sigle de l''établissement',
+  `Date_maj` DATE NOT NULL COMMENT 'Date de mise à jour de ces informations',
+  PRIMARY KEY(`Code_etab`)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
+
+LOAD DATA LOCAL INFILE 'Entreprises.txt' INTO TABLE `fusionax_entreprises` FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\r\n'
+(EN, Code_etab, Raison_sociale, Sigle, @Inconnu, @StringDate_maj)
+SET
+`Date_maj` = CONCAT(SUBSTRING(@StringDate_maj,7),'-',SUBSTRING(@StringDate_maj,4,2),'-',SUBSTRING(@StringDate_maj,1,2));
diff --git a/modules/fusionax/Formations.sql b/modules/fusionax/Formations.sql
new file mode 100644 (file)
index 0000000..c2b09f6
--- /dev/null
@@ -0,0 +1,20 @@
+-- Import complet des formations
+
+DROP TABLE IF EXISTS `fusionax_formations`;
+
+CREATE TABLE IF NOT EXISTS `fusionax_formations` (
+  FO CHAR(2) NOT NULL COMMENT 'Vaut toujours FO pour cette table',
+  id_ancien VARCHAR(8) NOT NULL COMMENT 'Id unique de l''ancien',
+  Intitule_diplome VARCHAR(60) collate utf8_general_ci NOT NULL COMMENT 'Intitulé du diplôme',
+  Intitule_formation VARCHAR(60) collate utf8_general_ci NOT NULL COMMENT 'Intitulé de la formation',
+  Descr_formation VARCHAR(60) collate utf8_general_ci NOT NULL COMMENT 'Description de la formation',
+  tmp_1 VARCHAR(60) collate utf8_general_ci NOT NULL,
+  tmp_2 VARCHAR(60) collate utf8_general_ci NOT NULL,
+  tmp_3 VARCHAR(60) collate utf8_general_ci NOT NULL,
+  tmp_4 VARCHAR(60) collate utf8_general_ci NOT NULL,
+  PRIMARY KEY (id_ancien, Intitule_diplome, Intitule_formation)
+) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
+
+                              LOAD DATA LOCAL INFILE  'Formations.txt'
+                                          INTO TABLE  fusionax_formations
+FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\r\n'  (FO, id_ancien, Intitule_diplome, Intitule_formation, Descr_formation, tmp_1, tmp_2, tmp_3, tmp_4);
diff --git a/modules/fusionax/formation.pl b/modules/fusionax/formation.pl
new file mode 100755 (executable)
index 0000000..3ee392a
--- /dev/null
@@ -0,0 +1,1289 @@
+#!/usr/bin/perl
+use utf8;
+open(FILE, "<:encoding(UTF-8)", "Formations.txt") || die ("Erreur d'ouverture");
+open(OUT, ">:encoding(UTF-8)", "Formations_out.txt") || die ("Erreur d'ouverture");
+
+while (<FILE>)
+{
+  # On enlève les dates de mises à jour
+  s/..\/..\/..../\t/;
+  s/..\/..\/../\t/;
+
+  s/\(//;
+  s/\)//;
+  s/3È Cycle//g;
+  s/3e cycle//g;
+  s/3e Cycle//g;
+  s/3È Cycle//g;
+  s/3ÈCycle//g;
+  s/3ÈCycle//g;
+  s/3ème cycle//g;
+  s/Master Chem\.Eng\.//g;
+  s/civ\.//g;
+  s/Civ\.//g;
+  s/ en / /g;
+  s/ ès / /g;
+  s/d'Etat//g;
+  s/ d'/ /g;
+  s/ de l'/ /g;
+  s/ de / /g;
+  s/Univ //g;
+  s/Univ\.//g;
+
+  # On enlève les fiches tordues de l'AX qui sont plus complètes chez nous et on modifie les lignes chiantes
+  s/FO\t19850253\tDEA Sciences et Techniques Environnement Créteil//;
+  s/FO\t19770064\tBiologie Moléculaire//;
+  s/FO\t19520093\tBT//;
+  s/FO\t19960133\tEngineering  Management Certificate//;
+  s/FO\t19560013\tIng I\.E\.G\.//;
+  s/FO\t19780033\tMécanique des Transfert//;
+  s/FO\t19920017\tDEA\+ Thèse Doctorat Pharmacochimie moléculaire//;
+  s/FO\t20010319\tM\.Sc\.in applied Mathematics//;
+  s/FO\t19660131\tMS Schenectady NY/FO\t19660131\tMSc\tNYU/;
+  s/FO\t19870204\tENS/FO\t19870204\tDEA\tENS Ulm/;
+  s/FO\t19910162\tDESS CAAE IAE/FO\t19910162\tDESS\tIAE de Paris/;
+  s/FO\t19950283\tDESS CAAE MBA/FO\t19950283\tMBA\tIAE de Paris/;
+  s/FO\t20020411\tME : Madrid/FO\t20020411\tME\tUPM/;
+  s/FO\t19910255\tDoct Physique Solide Paris XI/FO\t19910255\tPhD\tParis-Sud\tPhysique des solides/;
+  s/FO\t19890053\tDoct. de Physique Univ.Paris XI/FO\t19890053\tPhD\tParis-Sud\tPhysique/;
+  s/FO\t19890248\tPh.D Physique Paris XI/FO\t19890248\tPhD\tParis-Sud\tPhysique/;
+  s/FO\t19580112\tDESGE Lyon III/FO\t19580112\tDipl.\tUniversité Jean-Moulin/;
+
+  # Modifications sur une ligne complète
+  s/IHEDN-CHEAR\t/IHEDN/;
+  s/CHEBAP/Ing.\tCHEC\tCHEBAP (Centre des Hautes Etudes du Béton Armé et Précontraint)/;
+  s/Escuela Sup\. Ing\. Caminos Canales y Puertos/Dipl.\tUPM/;
+  s/MS "Technology & Policy" MIT/MSc\tMIT/;
+  s/MS&E Stanford/MSc\tStanford/;
+  s/Engineering  Management Cert.\t//;
+  s/Etudes sup\. Comptables & Financières\t//;
+
+  # On enlève les professions
+  s/Adm\. HC\t//;
+  s/Prof\. ENSMP\t//;
+  s/Prés\.hon.Colonie Fr\.du Caire\t//;
+  s/Anc\. Avocat au Bareau Toulon\t//;
+  s/Insp\.gén\.hon\.CEA\t//;
+  s/Insp\.Gén\.CRdes Aff\.d'O\.M\.\t//;
+  s/Prof Emérite Gén\. Méca\.\t//;
+  s/Prof\.Hon\.Sup\.Aéro\t//;
+  s/Anc\.DG Dassault Aviation\t//;
+  s/Prof\.des Universités\t//;
+  s/Direct\.Hon.BNP\t//;
+  s/Prof\. hon\.  Bordeaux I\t//;
+  s/Architecte DPLG\t//;
+  s/Conseiller Commercial hors classe\t//;
+  s/Professeur des Universités\t//;
+  s/Gestalt praticien\t//;
+  s/Adm\.\t//;
+  s/Psychologue Clinicien\t//;
+  s/Inspecteur des Finances\t//;
+  s/Don religion\t//;
+  s/Prof\. ENSMP\t//;
+  s/Pilote militaire Hélicoptère\t//;
+  s/Ing\. Navigant Essais Hélicoptère\t//;
+  s/Analyste SFAF\t//;
+  s/European Patent Attorney\t//;
+  s/Pilotage militaire\t//;
+  s/Mandataire agrée OEB\t//;
+  s/Chartered Financial Analyst\t//;
+  s/Pilote chasse\t//;
+  s/Avocat au Barreau Paris\t//;
+  s/Prof\.\t//;
+  s/EURATOM\t//;
+
+  # On enlève les sigles inconnus
+  s/Baccalauréat canonique\t//;
+  s/BEL\t//;
+  s/BEMS\t//;
+  s/BESG\t//;
+  s/Brth\t//;
+  s/BT\t//;
+  s/CES Informatique\t//;
+  s/CESDR\t//;
+  s/CFAF\t//;
+  s/CHEA\t//;
+  s/CHEAR\t//;
+  s/CHEE&DD Session 9\t//;
+  s/CESB\t//;
+  s/CESSID\t//;
+  s/CNAM\t//;
+  s/Collège des Sciences Soc\. et Eco\.\t//;
+  s/CRC\t//;
+  s/CSCP\t//;
+  s/CSME Session 29\t//;
+  s/D\.E\.M\.\t//;
+  s/DECF\t//;
+  s/DECS\t//;
+  s/DESA//;
+  s/DIUUP\t//;
+  s/DRES Sciences\t//;
+  s/DSN\t//;
+  s/DT\t//;
+  s/EATG\t//;
+  s/EERN//;
+  s/Ecole Chasse\t//;
+  s/ENS Armement\t//;
+  s/ENSGM\t//;
+  s/ENSME\t//;
+  s/ESMIM Nancy\t//;
+  s/ESO\t//;
+  s/ETS II\t//;
+  s/Fla USA\t//;
+  s/IAC\t//;
+  s/IAF\t//;
+  s/ICAF Washington\t//;
+  s/ICG\t//;
+  s/IESTO\t//;
+  s/IGP Bordeaux\t//;
+  s/Inst\. Auguste Comte\t//;
+  s/Institut Auguste Comte\t//;
+  s/Institut Auguste Comte IAC\t//;
+  s/Institut Contrôle Gestion//;
+  s/ISNSE Argunne National Laboratory USA\t//;
+  s/FRM\t//;
+  s/MITI Japon\t//;
+  s/MRM\t//;
+  s/Pasadena//;
+  s/React\. School Harwell\t//;
+  s/SFAF\t//;
+  s/SFAF CIIA\t//;
+  s/SM Management\t//;
+  s/Univer\. Ecolo\. Tropic\.//;
+
+  # On adapte les diplômes bien placés
+  s/Ing\./Ing.\t/;
+  s/Licenci./Lic.\t/;
+  s/Licence/Lic.\t/;
+  s/Lic\./Lic.\t/;
+  s/Deug/DEUG\t/;
+  s/DEUG/DEUG\t/;
+  s/Dipl.me/Dipl.\t/;
+  s/Dipl\./Dipl.\t/;
+  s/Anc\.El\./Dipl.\t/;
+  s/DU/Dipl.\t/;
+  s/Agr\./Agr.\t/;
+  s/Agr.g. d.Univers\./Agr.\t/;
+  s/Agrégée/Agr.\t/;
+  s/Agr.g./Agr.\t/;
+  s/Certifi./CAPES\t/;
+  s/Cert\./CAPES\t/;
+  s/CAPES/CAPES\t/;
+  s/DESCF/DESCF\t/;
+  s/DES\./DESS\t/;
+  s/DES\t/DESS\t/;
+  s/DES /DESS\t/;
+  s/DESS/DESS\t/;
+  s/DEA/DEA\t/;
+  s/Doctorat/PhD\t/;
+  s/Docteur/PhD\t/;
+  s/Doct\./PhD\t/;
+  s/Doct/PhD\t/;
+  s/Ph\.D/PhD\t/;
+  s/PhD/PhD\t/;
+  s/Ph D/PhD\t/;
+  s/Dr\./PhD\t/;
+  s/Doc\./PhD\t/;
+  s/Th.se/PhD\t/;
+  s/doctorat oncogénèse/PhD\t/;
+  s/HDR/HDR\t/;
+  s/HdR/HDR\t/;
+  s/Habil\. Dir\.Recherche/HDR\t/;
+  s/Habilitation à diriger les recherches/HDR\t/;
+  s/Habilitation à Diriger des Recherche/HDR\t/;
+  s/Habilitation à diriger des Recherches/HDR\t/;
+  s/Habilitation à diriger des Rech\./HDR\t/;
+  s/Habilitation à diriger des recherches/HDR\t/;
+  s/Habilitation U\./HDR\t/;
+  s/Habilitation/HDR\t/;
+  s/Habil\./HDR\t/;
+  s/Habilité à la dir\. rech\./HDR\t/;
+  s/MSUCLA/MSc\tUCLA/;
+  s/MSc /MSc\t/;
+  s/MS /MSc\t/;
+  s/MS\t/MSc\t/;
+  s/MS\./MSc\t/;
+  s/M\.Sc\./MSc\t/;
+  s/M\.Sc/MSc\t/;
+  s/M\. Sc\./MSc\t/;
+  s/Master of Sciences/MSc\t/;
+  s/Master of Science/MSc\t/;
+  s/Masters of Sciences/MSc\t/;
+  s/Master Urbanisme/MUP\t/;
+  s/MCityPlann/MUP\t/;
+  s/MCP/MUP\t/;
+  s/MUP/MUP\t/;
+  s/Executive MBA/MBA/;
+  s/EMBA/MBA/;
+  s/MBA/MBA\t/;
+  s/BTS/BTS\t/;
+  s/M\. A\./MA\t/;
+  s/M\.A\./MA\t/;
+  s/\tMA/\tMA\t/;
+  s/Executive MA/MA\t/;
+  s/ME/ME\t/;
+  s/M\.Eco\.Agric\./MEE\t/;
+  s/M\.Eco\./ME\t/;
+  s/M\. Eng\./MEng\t/;
+  s/Master Ing\./MEng\t/;
+  s/Masters of Electrical Engineering/MEE\t/;
+  s/MEE/MEE\t/;
+  s/MSEE/MEE\t/;
+  s/Ma.trise/Maîtr.\t/;
+  s/Ma.tre/Maîtr.\t/;
+  s/Mphil/MPhil\t/;
+  s/M\.Phil\./MPhil\t/;
+  s/MPhil/MPhil\t/;
+  s/MPA/MPA\t/;
+  s/MCP/MCP\t/;
+  s/Master Electronique/MEl\t/;
+  s/MEl/MEl\t/;
+  s/Master Management par les comp.tences et organisations/MM\t/;
+  s/Master of Management/MM\t/;
+  s/Management Paris/\tManagement/;
+  s/DDI/Dipl.\t/;
+  s/3.me Cycle Fac\./Dipl.\t/;
+  s/MIB/MIB\t/;
+  s/Master of Eng in Manufacturing/MEM\t/;
+  s/Master Engin.Science/MEng\t/;
+  s/BA /BA\t/;
+  s/Post Doc//;
+  s/Post PhD//;
+  s/Auditeur/Dipl.\t/;
+  s/Dr Phys\.chim\.biotransformation/PhD\t\tPhysique, chimie, biotransformation/;
+
+  # On nettoye les tab en trop et les ponctutions inutiles
+  s/\t\t\t/\t/g;
+  s/\t\t/\t/g;
+  s/\t,/\t/g;
+  s/\t-/\t/g;
+  s/\t:/\t/g;
+  s/\t\./\t/g;
+  s/(\t)( )+/\t/g;
+  s/\ten /\t/g;
+  s/\tin /\t/g;
+  s/\tès /\t/g;
+  s/\tof /\t/g;
+  s/( )+(\t)/\t/g;
+  
+
+  # On remet dans l'ordre lorsque le diplôme se situe après l'université
+  s/Manag\.Vanderblit/Vanderbilt University\tManagement/;
+  s/AMHERST MA/MA\tAmherst College/;
+  s/Executive Education, Harvard \tBusiness School/MBA\tHarvard/;
+  s/Harvard MPA/MPA\tHarvard/;
+  s/Harvard MA/MA\tHarvard/;
+  s/Advanced Manag\. Program Harvard/Harvard/;
+  s/DEA : ENS/DEA\tENS Ulm/;
+  s/ENS Ulm DEA/DEA\tENS Ulm/;
+  s/ENS Ulm :DEA/DEA\tENS Ulm/;
+  s/ENS Ulm : DEA/DEA\tENS Ulm/;
+  s/ENS Ulm : PhD/PhD\tENS Ulm/;
+  s/ENS Ulm/MSc\tENS Ulm/;
+  s/Ecole Normale Sup.Ulm/MSc\tENS Ulm/;
+  s/\tENS\t/\tENS Ulm/;
+  s/Moscow : ME/ME\tBauman MSTU/;
+  s/Supoptique : Ing\./Ing.\tSupOptique/;
+  s/EP Montr.al Ing\./Ing.\tEPM/;
+  s/EP Montr.al Ing/Ing.\tEPM/;
+  s/EP Montr.al MSc/MSc\tEPM/;
+  s/EP Montr.al MS/MSc\tEPM/;
+  s/MsChicago/MSc\tUniversity of Chicago/;
+  s/Sciences Po/Sciences Po\t/;
+  s/IEP DEA/DEA\tSciences Po/;
+  s/Master AMUR/MUP\tPonts\tMastère AMUR/;
+  s/Master CAR/MSc\tTélécom\tMastère CAR/;
+  s/Mastère SSIR ENST/MSc\tTélécom\tMastère SSIR/;
+  s/KTH Stockholm Master Mech. Eng./MME\tKTH/;
+  s/ESCP-EAP Executive MSc/MSc\tESCP-EAP/;
+  s/Biologie Paris VI/Paris VI\tBiologie/;
+  s/HEC : MS/MSc\tHEC/;
+  s/HEC : MA/MA\tHEC/;
+  s/HEC : MBA/MBA\tHEC/;
+  s/Master HEC Entrepreneurs/ME\tHEC\tHEC-Entrepreneurs /;
+  s/HEC-Entrepreneurs/ME\tHEC\tHEC-Entrepreneurs /;
+  s/Master HEC Finance/ME\tHEC/;
+  s/Strategic Management HEC/HEC\tStrategic Management/;
+  s/Marketing HEC/HEC\tMarketing/;
+  s/Economie EHESS-ENSAE/EHESS\tÉconomie/;
+  s/EHESS : PhD/PhD\tEHESS/;
+  s/EHESS DEA/DEA\tEHESS/;
+  s/EHESS Phd/PhD\tEHESS/;
+  s/ESSEC Mast.re Tehniques Financi.res/ME\tESSEC\tMastère Techniques Financières/;
+  s/ESSEC : MA/MA\tESSEC/;
+  s/ESSEC-MANNHEIM/ESSEC/;
+  s/ESSEC : MBA/MBA\tESSEC/;
+  s/M.decine : Dipl\./Dipl.\tMédecine/;
+  s/Sup.A.ro\. : PhD/PhD\tSUPAERO/;
+  s/INSEAD : MA/MA\tINSEAD/;
+  s/INSEAD : MBA/MBA\tINSEAD/;
+  s/TU Berlin :ME/ME\tTU Berlin/;
+  s/Mast.re Am.nagement et Ma.tr./MUP\t\tMastère Aménagement et Maîtr./;
+  s/Master Droit des affaires Int. & Eur./MIB\t\tMaster Droit des affaires Int. & Eur./;
+  s/Finance LSE/LSE\tFinance/;
+  s/Finance London Business School/London Business School\tFinance/;
+  s/Chimie Organique ENSTA/ENSTA\tChimie organique/;
+  s/Informatique Stanford/Stanford\tInformatique/;
+
+  # On normalise les universités
+  s/Dipl ISUP\t/Dipl.\tUMPC\t/;
+  s/ISUP\t/Dipl.\tUMPC\t/;
+  s/DESIA\t/Dipl.\tSUPAERO\t/;
+  s/IHESI\t/Dipl.\tINHES\t/;
+  s/Ctre Form\.Journaliste\t/Dipl.\tCFJ\t/;
+  s/Collège InterArmées Défense\t/Dipl.\tCollège Interarmées de Défense\t/;
+  s/AFITEP\t/Dipl.\tAFITEP\t/;
+  s/CEDEP cycle 43\t/CEDEP\t/;
+  s/CEDEP\t/Dipl.\tCEDEP\t/;
+  s/Bocconi University Milan/Dipl.\tUniversità Bocconi/;
+  s/Columbia\t/Columbia University\t/;
+  s/EMP Columbia Bus\.School\./Dipl.\tColumbia University/;
+  s/Columbia & sciences Po/Columbia University/;
+  s/Columbia \+ LBS/Columbia University/;
+  s/Columbia University & sciences Po/Columbia University/;
+  s/Columbia University + LBS/Columbia University/;
+  s/CESS ENSAÉ/Dipl.\tENSAE/;
+  s/EAPB Ecole Architecture Paris Belleville/Dipl.\tENSAPB/;
+  s/EDP\/INSEAD/Dipl.\tINSEAD/;
+  s/PSD INSEAD/Dipl.\tINSEAD/;
+  s/INSEAD/Dipl.\tINSEAD/;
+  s/EDP\/INSEAD/Dipl.\tINSEAD/;
+  s/INSEAD/Dipl.\tINSEAD/;
+  s/PSD INSEAD/Dipl.\tINSEAD\tProgramme Supérieur pour Dirigeants/;
+  s/INSEAD - AMP/Dipl.\tINSEAD/;
+  s/INSEAD Executive Program/Dipl.\tINSEAD/;
+  s/IMI Harvard/Dipl.\tHarvard/;
+  s/Advanced Manag\. Program Harvard/MBA\tHarvard/;
+  s/Harvard Business Sch\. Alumnus/Dipl.\tHarvard/;
+  s/Executive Education, Harvard Business School/Dipl.\tHarvard/;
+  s/Harvard/Dipl.\tHarvard/;
+  s/Havard/Harvard/;
+  s/M\. Eng Cornell University/MEng\tCornell/;
+  s/Cornell Ithaca/Cornell/;
+  s/Cornell NY/Cornell/;
+  s/NY\t/NYU\t/;
+  s/New-York/NYU/;
+  s/New York University/NYU/;
+  s/New York/NYU/;
+  s/MS Politecnico di Milano/MSc\tPolitecnico di Milano/;
+  s/\tMilano/\tPolitecnico di Milano/;
+  s/Computer Sc\.MIT/MIT\tComputer science/;
+  s/Techno\.Policy MIT/MIT\tTechno. Policy/;
+  s/NA MIT/MA\tMIT/;
+  s/MIT/Dipl.\tMIT\t/;
+  s/MIT Chemical Engineering/MCE\tMIT/;
+  s/Massuchusetts Institute of Technology/MIT/;
+  s/Massachusetts Institute of Technologie/MIT/;
+  s/Massachusetts Institute of Techn\./MIT/;
+  s/Massachusetts Inst\. of Technology/MIT/;
+  s/Massachusetts Inst of Tech/MIT/;
+  s/Massachusetts/MIT/;
+  s/Msc\.Massachus\./MIT/;
+  s/Sup.A.ro./Ing.\tSUPAERO/;
+  s/Sup.A.ro.\/KTH/Ing.\tSUPAERO/;
+  s/Aéro\./SUPAERO/;
+  s/SUPAEROAstro &EECS/SUPAERO/;
+  s/SUPAERO\/KTH/SUPAERO/;
+  s/Syracuse USA/Dipl.\tSU/;
+  s/EHESS/Dipl.\tEHESS/;
+  s/IHEDN/Dipl.\tIHEDN/;
+  s/IHEDN 26° session/Dipl.\tIHEDN/;
+  s/Business School Dartmouth/Dipl.\tDartmouth College /;
+  s/ENSAE/Dipl.\tENSAE/;
+  s/ENSAE Statisticien économiste/Dipl.\tENSAE/;
+  s/ENSAE Malakoff/Dipl.\tENSAE/;
+  s/\tIllinois\t/\tUniversity of Illinois\t/;
+  s/University of Illinois/Dipl.\tUniversity of Illinois/;
+  s/CEPE/Dipl.\tCEPE/;
+  s/CEPE Ecole Pratique des Hautes Etudes/Dipl.\tCEPE/;
+  s/ECE/Ing.\tECE/;
+  s/Ecole Centrale d’Electronique ECE/Ing.\tECE/;
+  s/Science Stanford/Stanford\tSience/;
+  s/Econom\.Stanford/Stanford\tÉconomie/;
+  s/Electrical Eng Stanford/Stanford\tElectrical engineering/;
+  s/Management a Stanford/Stanford\tManagement/;
+  s/SEP Stanford/Dipl.\Stanford/;
+  s/Stanford SEP/Dipl.\tStanford/;
+  s/Stanford/Dipl.\tStanford/;
+  s/Stanford Executive Program/Dipl.\tStanford/;
+  s/Stanford University/Dipl.\tStanford/;
+  s/Stanford /Stanford\t/;
+  s/Sc\.Po\. Paris/Dipl.\tSciences Po\t/;
+  s/Sc\.Po\. Economie/Dipl.\tSciences Po\t/;
+  s/Sc\.Po\. Gestion et Strat.gie des Entreprises/Dipl.\tSciences Po\tGestion et Stratégie des Entreprises/;
+  s/Sc\.Po\./Dipl.\tSciences Po/;
+  s/Lauréat IEP/Dipl.\tSciences Po/;
+  s/IEP Paris Lic\./Dipl.\tSciences Po/;
+  s/IEP Paris/Dipl.\tSciences Po/;
+  s/IEP/Dipl.\tSciences Po/;
+  s/Auditeur Sc\.Politique/Dipl.\tSciences Po\t/;
+  s/Sciences politiques/Sciences Po/;
+  s/Sc\.Politique/Sciences Po/;
+  s/IAE Paris/MBA\tIAE de Paris/;
+  s/\tIAE\t/\tMBA\tIAE de Paris\t/;
+  s/EPNER/Dipl.\tEPNER/;
+  s/ENSAR/Ing.\tENSAR/;
+  s/Uc.Berkeley/Berkeley/;
+  s/UC Berkeley/Dipl.\tBerkeley/;
+  s/CEIPI/Dipl.\tCEIPI/;
+  s/Institute for Management Development/IMD/;
+  s/\tLausanne/\tUNIL/;
+  s/IMD Lausanne/Dipl.\tUNIL/;
+  s/EP F.d.ration Lausanne/Dipl.\tEPFL/;
+  s/EP F.d.rale Lausanne/Dipl.\tEPFL/;
+  s/cycle postgrade EPFL option Finance/Dipl.\tEPFL\toption Finance/;
+  s/Ecol\. Poly\. F.d.rale Lausanne/Dipl.\tEPFL/;
+  s/EP F.d.rale Lausanne/Dipl.\tEPFL/;
+  s/EPFL G.nie Mécanique/Dipl.\tEPFL\tGénie Mécanique/;
+  s/EP F.d.rale Lausane/Dipl.\tEPFL/;
+  s/Ecole Polytechnique Lausanne/EPFL/;
+  s/ISMCM Saint-Ouen/Dipl.\tISMCM Saint-Ouen/;
+  s/ISCM/ISMCM Saint-Ouen/;
+  s/ENAC/Dipl.\tENAC/;
+  s/HEC\/Ucla/HEC/;
+  s/Mast.re Gestion Financi.re HEC/ME\tHEC\tMastère Gestion Financière/;
+  s/\tHEC/\tDipl.\tHEC/;
+  s/CPA-HEC/HEC/;
+  s/HEC Master Gestion du Changement/ME\tHEC\tMaster Gestion du Changement/;
+  s/HEC Execut\. Management \/ CPA/Dipl.\tHEC/;
+  s/HEC Majeure Finance/Dipl.\tHEC\tMajeure Finance/;
+  s/CESA  Achats HEC Management/Dipl.\tHEC/;
+  s/HEC Entrepreneurs/Dipl.\tHEC/;
+  s/HECc/HEC/;
+  s/HEC\/CPA/HEC/;
+  s/HEC Start\. Management/HEC\tStart. Management/;
+  s/HEC Finance/HEC\tFinance/;
+  s/Centre des Hautes Etudes la Construction/Ing.\tCHEC/;
+  s/CHEC/Ing.\tCHEC/;
+  s/Ecole Air/Dipl.\tÉcole de l\'Air/;
+  s/EAVT/Dipl.\tEAVT/;
+  s/EAVT Ecole architecture Marne La Vall.e/Dipl.\tEAVT/;
+  s/Master ENPC Action publique/M\tPonts\tMaster Action publique/;
+  s/ENPC/Ing.\tPonts/;
+  s/Master P\.C\./MSc\tPonts/;
+  s/P\.C\./Ponts\t/;
+  s/EAPLV Ecole Architecture Paris La Villette/Dipl.\tENSAPLV/;
+  s/EAPLV/Dipl.\tENSAPLV/;
+  s/Cambridge Profic\./Dipl.\tCambridge/;
+  s/London Business School/Dipl.\tLondon Business School/;
+  s/ENSIC/Dipl.\tENSIC/;
+  s/ENSIC Nancy/Ing.\tENSIC/;
+  s/Internat\. Teachers Progr./Dipl.\tITP/;
+  s/Institut Sup.rieur des Affaires/Dipl.\tISA/;
+  s/ISA/Dipl.\tISA/;
+  s/ISAA/Dipl.\tISAA/;
+  s/ENSCP/Ing.\tChimie Paris/;
+  s/Engineer Kentucky/Ing.\tUK/;
+  s/EP Gda.sk Pologne/Dipl.\tUniwersytet Gdański/;
+  s/ESPCI/Ing.\tESPCI/;
+  s/ESPCI Ecole Sup\. Phys\. et Chimie Industrielles/Ing.\tESPCI/;
+  s/ESG/Dipl.\tESG Paris/;
+  s/ESSEC Management g.n.ral/Dipl.\tESSEC/;
+  s/ESSEC/Dipl.\tESSEC/;
+  s/Ecole Nat. Eaux et For.t Nancy/Ing.\tENGREF/;
+  s/Sc\. environnement ENGREF/ENGREF\tSciences environnementales/;
+  s/\tGREF/\tENGREF/;
+  s/du Québec à Montréal/UQÀM/;
+  s/EP Montréal/Dipl.\tEPM/;
+  s/Mast\.Biotechnology Montréal/MB\tEPM/;
+  s/Montréal/EPM/;
+  s/Québec/UQÀM/;
+  s/Ec\.Polyt\.Montreal/EPM/;
+  s/Actuaire/Dipl.\tInstitut des Actuaires/;
+  s/Actuaire IAF-CEA/Dipl.\tInstitut des Actuaires/;
+  s/Actuaire IAF/Dipl.\tInstitut des Actuaires/;
+  s/Actuaire CEA/Dipl.\tInstitut des Actuaires/;
+  s/Actuariat-Iaf/Dipl.\tInstitut des Actuaires/;
+  s/Actuaire qualifi./Dipl.\tInstitut des Actuaires/;
+  s/Institut des Actuaires qualifié/Institut des Actuaires/;
+  s/Institut des Actuaires IAF-/Institut des Actuaires/;
+  s/STEGE MGT GENERAL ESCP-EAP/Dipl.\tESCP-EAP/;
+  s/ESCP-EAP/Dipl.\tESCP-EAP/;
+  s/\tESCP\t/\tESCP-EAP\t/;
+  s/IHEE/Dipl.\tIHEE/;
+  s/ENS G.ographiques/Corps\tGéographes/;
+  s/Ecole Nat. des Sc. G.ographiques/Corps\tGéographes/;
+  s/ENST Bretagne/Ing.\tTélécom Bretagne/;
+  s/Collède des Ing\./CDI/;
+  s/Collège des Ing\./CDI/;
+  s/Collège Ing\./CDI/;
+  s/Collèges des Ing\./CDI/;
+  s/Collège des Ingénieurs/CDI/;
+  s/CDI/Dipl.\tCDI/;
+  s/Ecole Nationale la Magistrature/Dipl.\tENM/;
+  s/ENSTA/Ing.\tENSTA/;
+  s/\tGM\t/\tENSTA\t/;
+  s/ENSP Versailles/Dipl.\tENSP/;
+  s/ENSP/Dipl.\tENSP/;
+  s/Investment Banking Program-Kellog School of Management/Dipl.\tKellogg/;
+  s/IFSBM/Dipl.\tIFSBM/;
+  s/Inst\.Form\. Sup\.Biom.dicale/Dipl.\tIFSBM/;
+  s/EMA/Ing.\tEMA/;
+  s/Ecole Supérieure Electricité/Ing.\tSupélec/;
+  s/ESE/Ing.\tSupélec/;
+  s/Supelec 86 - MBA/Supélec/;
+  s/UCSD/Dipl.\tUCSD\t/;
+  s/UC San Diego/UCSD/;
+  s/San Diego/UCSD/;
+  s/California UCSD/UCSD/;
+  s/ENSAM/Ing.\tENSAM/;
+  s/Arts et Métiers/ENSAM/;
+  s/IFFI/ENSAM\tIFFI/;
+  s/USMC Command & Staff College/MSc\tMCU/;
+  s/University Coll.Londres/Dipl.\tUCL/;
+  s/TU Munich/TU München/;
+  s/TU M.nchen/Dipl.\tTU München/;
+  s/\tMünchen/\tTU München/;
+  s/\tM\.\t/\tMines\t/;
+  s/Mines Paris/Mines/;
+  s/ENSMP/Ing.\tMines/;
+  s/ISIGE/Mines\tISIGE/;
+  s/LSE/Dipl.\tLSE/;
+  s/London School Econ\.& Polit\. Sc\./LSE/;
+  s/London School Economics/LSE/;
+  s/London School of Eco\./LSE/;
+  s/London School of Econ\./LSE/;
+  s/London School of Economics/LSE/;
+  s/Lonson School of Economics/LSE/;
+  s/Chartered Institute of Management  Accountant/M\tCIMA/;
+  s/CFA/Dipl.\tCFA Institute/;
+  s/INAPG/Ing.\tINAPG/;
+  s/Agronome/Ing.\tINAPG/;
+  s/Agro/Ing.\tINAPG/;
+  s/INA PG/INAPG/;
+  s/Naval Postgraduate School/Dipl.\tNPS/;
+  s/ENSSEIHT Informatique/Ing.\tENSEEIHT/;
+  s/ENSEEIHT/Ing.\tENSEEIHT/;
+  s/ENSEEIHT Toulouse/ENSEEIHT/;
+  s/ENA/Dipl.\tENA/;
+  s/Colorado\t/Colorado School of Mines/;
+  s/Colorado Scholl of MInes/Dipl.\tColorado School of Mines/;
+  s/Colorado school of Mines/Dipl.\tColorado School of Mines/;
+  s/Ing RWTH-Aachen/Ing.\tRWTH/;
+  s/Ing  RWTH-Aachen/Ing.\tRWTH/;
+  s/RWTH Aachen/Dipl.\tRWTH/;
+  s/TH Aachen/RWTH/;
+  s/RWTH-Aachen/RWTH/;
+  s/Th Aachen/RWTH/;
+  s/UCLA\t/Dipl.\tUCLA\t/;
+  s/Computer Sc\.Ucla/UCLA/;
+  s/UCLA Anderson/UCLA/;
+  s/Los Angeles/UCLA/;
+  s/Royal College of Art Londres/Dipl.\tRCA/;
+  s/Royal College of Art Londres /Dipl.\tRCA/;
+  s/de Caminos Madrid/UPM/;
+  s/Ingeniero Industrial UPM Madrid/Ing.\tUPM/;
+  s/ETSII Madrid/Dipl.\tUPM/;
+  s/Madrid/Dipl.\tUPM/;
+  s/ENS Cachan/Dipl.\tENS Cachan/;
+  s/\tCachan/\tENS Cachan/;
+  s/ENS CACHAN/ENS Cachan/;
+  s/ENS Cachan Math Appliquée/ENS Cachan\tMathématiques appliquées/;
+  s/Collège Europe Natolin Varsovie/Dipl.\tCollege of Europe/;
+  s/Collège Europ\.Bruges/\tCollege of Europe/;
+  s/New South Wales Sydney Australia/UNSW/;
+  s/New South Wales Sydney Austr\./UNSW/;
+  s/New South Wales/UNSW/;
+  s/Master of Env. Engin. Science UNSW Sydney/MEE\tUNSW/;
+  s/S Sydney/UNSW/;
+  s/Design UNSW/UNSW\tDesign/;
+  s/Interne Chirurgie/Dipl.\tMédecine/;
+  s/X-HEC/X\t/;
+  s/X Chimie Orga/X\tChimie organique/;
+  s/X Physique/Physique/;
+  s/X Math app\./Mathématiques appliquées/;
+  s/Chimie Ec\. Polyt\./X\tChimie/;
+  s/Master X Projet-Innovation-Conception/MSc\tX\tMaster X Projet-Innovation-Conception/;
+  s/Master PIC/M\tX\tMaster PIC/;
+  s/Ec\. Polyt\./X\t/;
+  s/Supoptique/Ing.\tSupOptique/;
+  s/Universiteit/Universiteit Leiden/;
+  s/\tLeiden/\tDipl.\tUniversiteit Leiden/;
+  s/Phys.Théor. ENS Lyon/ENS Lyon\tPhysique théorique/;
+  s/ENS Lyon/Dipl.\tENS Lyon/;
+  s/- U of Michigan/Michigan/;
+  s/Eng Birmingham/University of Birmingham/;
+  s/Imperial Collège/Imperial College/;
+  s/Advanced Mechanical Engin\. , Imperial College Londres/Imperial College\tAdvanced mechanical engineering/;
+  s/Imperial College GB/Imperial College/;
+  s/Boulder/CU/;
+  s/Californie Institute of Technology/CalTech/;
+  s/CIT/CalTech/;
+  s/Carnegie Mellon/CMU/;
+  s/Comput\.Carnégie Mellon Univ/CMU/;
+  s/Caroline du Nord Chapel Hill/Carolina/;
+  s/Ctre Perf\. aux Affaires/CPA de Paris/;
+  s/Centre Perfect\. aux Affaires/CPA de Paris/;
+  s/Centre Perfection\. aux Affaires/CPA de Paris/;
+  s/CPA\t/MBA\tCPA de Paris/;
+  s/CPA 73\/2\t/MBA\tCPA de Paris/;
+  s/CPA Lyon\t/MBA\tCPA de Lyon/;
+  s/CPA Nord\t/MBA\tCPA du Nord/;
+  s/\tChicago/\tUniversity of Chicago/;
+  s/Econom\.Chicago/University of Chicago\tÉconomie/;
+  s/Cleveland/CSU/;
+  s/Architect\.Univers\.Rome/University of Rome\tArchitecture/;
+  s/d'University of Rome/University of Rome/;
+  s/\tUC Davis/\tUC Davis/;
+  s/\tDavis/\tUC Davis/;
+  s/University of California/UCSB/;
+  s/Université Tokyo/Todai/;
+  s/Tokyo/Todai/;
+  s/Université Stuttgart/Universität Stuttgart/;
+  s/\tStuttgart\t/\tUniversität Stuttgart\t/;
+  s/diplomé Fac\. Aéronautique Stuttgart/Universität Stuttgart\tAéronautique/;
+  s/Zürich/Universität Zürich/;
+  s/Zurich/Universität Zürich/;
+  s/Ec\.Polyt\.Universität Zürich/ETH Zürich/;
+  s/Yale/Yale\t/;
+  s/Wisconsin-Madison/UW-Madison/;
+  s/Wisconsin USA/UW-Madison/;
+  s/Wisconsin/UW-Madison/;
+  s/Wharton/The Wharton School/;
+  s/Pennsylvania The Wharton School/The Wharton School/;
+  s/Pennsylvania\t/University of Pennsylvania\t/;
+  s/Washington/University of Washington/;
+  s/Urbana/Urbana University/;
+  s/Stat\.Texas A&M/TAMU/;
+  s/Texas A&M/TAMU/;
+  s/TAMU University/TAMU/;
+  s/Austin/UT Austin/;
+  s/Texas/UT Austin/;
+  s/UBC Canada/UBC/;
+  s/Torino/UNITO/;
+  s/Téléc\./Télécom/;
+  s/ENST\t/Télécom\t/;
+  s/ENST licencié  sciences économiques/Télécom\tLicenci sciences économiques/;
+  s/Southampton/University of Southampton/;
+  s/Nat\. of Singapore/NUS/;
+  s/Singapour/NUS/;
+  s/Kyoto/Kyoto University/;
+  s/Karlsruhe/Universität Karlsruhe/;
+  s/Johns Hopkins/JHU/;
+  s/Sheffield/University of Sheffield/;
+  s/Santa Barbara/UCSB/;
+  s/Salt Lake City/University of Utah/;
+  s/Rotterdam School of Management/RSM/;
+  s/Queen's Canada/Queen's/;
+  s/Purdue/Purdue University/;
+  s/Pompeu Fabra/UPF/;
+  s/Polytech\. Bucarest/Universitatea Politehnica din Bucureşti/;
+  s/Petroleum Engineering - TU Delft/TU Delft\tPetroleum engineering/;
+  s/Paris Paris-Diderot/Paris-Diderot/;
+  s/Watson School of Biological/WSBS/;
+  s/Ottawa/OU/;
+  s/Northwestern University/NU/;
+  s/Northwestern/NU/;
+  s/N\.Dame Indiana/Notre Dame/;
+  s/Moscow/MGU/;
+  s/Mc Gill University/McGill/;
+  s/Maryland/UMCP/;
+  s/Iowa/University of Iowa /;
+  s/Institut Polytechnique Grenoble/Grenoble INP/;
+  s/INPG/Grenoble INP/;
+  s/INPL Institut National Polytechnique Lorraine/INPL/;
+  s/INP Toulouse/INP Toulouse\t/;
+  s/IHM INPT/INP Toulouse\tIHM/;
+  s/ENSPM/ENSPM\t/;
+  s/IFP/ENSPM/;
+  s/Houston/UH/;
+  s/Georgia\t/UGA\t/;
+  s/Finance Princeton/Princeton\tFinance/;
+  s/Elect\.Engineer\.Princeton/Princeton\tElectrical engineering/;
+  s/ENSHG/ENSHMG/;
+  s/Dallas/University of Dallas/;
+  s/British Columbia University/UBC/;
+
+  s/\tSorbonne\t/\tPanthéon-Sorbonne\t/;
+  s/\t1\t/\tPanthéon-Sorbonne\t/;
+  s/Finance Paris I/Panthéon-Sorbonne\tFinance/;
+  s/Sc.Eco.  Paris 1/Panthéon-Sorbonne\tSciences économiques/;
+  s/CAAE \. Paris I/Panthéon-Sorbonne/;
+  s/Paris 1er/Panthéon-Sorbonne/;
+  s/Paris 1 Modélisation Econ\.& Fin\./Panthéon-Sorbonne\tModélisation économie et finance/;
+  s/Paris 1\t/Panthéon-Sorbonne\t/;
+  s/Philo\.Paris I/Panthéon-Sorbonne\tPhilosophie/;
+  s/Paris I\t/Panthéon-Sorbonne\t/;
+  s/Droit Paris 2/Assas\tDroit/;
+  s/Paris 2/Assas/;
+  s/Paris II Panthéon - Assas/Assas/;
+  s/Paris II Panthéon/Assas/;
+  s/Paris-Sorbonne/Paris-Sorbonne\t/;
+  s/Philosophie Paris IV Sorbonne/Paris-Sorbonne\tPhilosophie/;
+  s/Paris 4/Paris-Sorbonne/;
+  s/Paris IV/Paris-Sorbonne\t/;
+  s/Paris 5/Paris-Descartes/;
+  s/Paris V\t/Paris-Descartes\t/;
+  s/Université Paris V/Paris-Descartes/;
+  s/UMPC/UMPC\t/;
+  s/et Habil\. à diriger les Rech\. Paris 6/UMPC/;
+  s/Stat. Paris 6/UMPC\tStatistiques/;
+  s/Sc\.des Matériaux Paris VI/UMPC\tScience des matériaux/;
+  s/Probabilités Paris VI/UMPC\tProbabilités/;
+  s/Probabilités et Finanace Paris VI/UMPC\tProbabilités et finance/;
+  s/Probab\. & Applications Paris 6/UMPC\tProbabilités et applications/;
+  s/Paris 6 Jussieu/UMPC/;
+  s/Paris 6/UMPC\t/;
+  s/Paris VI Pierre & Marie Curie/UMPC/;
+  s/paris VI\t/UMPC\t/;
+  s/Paris VI\t/UMPC\t/;
+  s/Paris VI Ecologie/UMPC\tÉcologie/;
+  s/ParisVI Proba\. & Finance/UMPC\tProbabilité et finance/;
+  s/Paris VI Finance/UMPC\tFinance/;
+  s/Paris VI Physique quantique/UMPC\tPhysique quantique/;
+  s/Paris VI Spéc\.Physique des Solides/UMPC\tPhysique des Solides/;
+  s/2 Proba\. & Finance Paris VI/UMPC\tProbabilité et finance/;
+  s/Biologie Paris VI/UMPC\tBiologie/;
+  s/CPM/UMPC/;
+  s/IARFAG Paris VI/UMPC\tInformatique/;
+  s/IARFAG/UMPC\tInformatique/;
+  s/Informatique - Paris 6/UMPC\tInformatique/;
+  s/Analyse numérique Paris VI/UMPC\tAnalyse numérique/;
+  s/\tParis\t/\tUMPC\t/;
+  s/TACS Dipl\./UMPC\tMaster Techniques Avancées en Calcul des Structures/;
+  s/Informatique - UMPC/UMPC\tInformatique/;
+  s/Analyse numérique UMPC/UMPC\tAnalyse numérique/;
+  s/à diriger les Rech\. UMPC/UMPC/;
+  s/2 Proba\. & Finance UMPC/UMPC\tProbabilité et finance/;
+  s/Japonais Paris VII/Paris-Diderot\tJaponais/;
+  s/Jussieu Paris 7/Paris-Diderot/;
+  s/Jussieu/Paris-Diderot/;
+  s/Math\. Appliquées Paris VII/Paris-Diderot\tMathématiques appliquées/;
+  s/Télédétection Paris VII/Paris-Diderot\tTélédétection/;
+  s/Physique des Solides  Paris VII/Paris-Diderot\tPhysique des solides/;
+  s/Paris 7/Paris-Diderot/;
+  s/Paris VII\t/Paris-Diderot\t/;
+  s/Univers\.Paris VII Math\./Paris-Diderot\tMathématiques/;
+  s/Télécom Paris-Diderot/Paris-Diderot/;
+  s/Paris Paris-Diderot/Paris-Diderot/;
+  s/Paris 8/Vincennes-Saint-Denis/;
+  s/ANLA Paris IX/Dauphine/;
+  s/Economie Paris Dauphine/Dauphine\tÉconomie/;
+  s/Economie Ind. Paris IX/Dauphine\tÉconomie/;
+  s/Economie Ind. Paris Dauphine/Dauphine\tÉconomie/;
+  s/Paris 9/Dauphine/;
+  s/Paris Dauphine/Dauphine/;
+  s/Paris IX/Dauphine/;
+  s/Sc\.Econ\. Dauphine/Dauphine\tÉconomie/;
+  s/Gestion Publique Dauphine/Dauphine\tGestion publique/;
+  s/Economie ind\. Dauphine/Dauphine\tÉconomie/;
+  s/Paris X Philo. Esthétique/Nanterre\tPhilosophie/;
+  s/Paris X\t/Nanterre/;
+  s/Paris 10/Nanterre/;
+  s/Physique Paris XI/Paris-Sud\tPhysique/;
+  s/écologie Paris XI/Paris-Sud\tÉcologie/;
+  s/Univers\. Paris Sud/Paris-Sud/;
+  s/Paris XI\t/M\tParis-Sud\t/;
+  s/Paris XI Electronique/Paris-Sud\tÉlectronique/;
+  s/Master Paris 11/M\tParis-Sud/;
+  s/Master  Paris 11/M\tParis-Sud/;
+  s/écologie Paris XI/Paris-Sud\tÉcologie/;
+  s/ATS Orsay/Paris-Sud/;
+  s/Paris 11 Orsay/Paris-Sud/;
+  s/Paris 11/Paris-Sud/;
+  s/paris 11/Paris-Sud/;
+  s/Orsay/Paris-Sud/;
+  s/Santé Publique  Paris Sud/Paris-Sud\tSanté publique/;
+  s/Physique XI/Paris-Sud\tPhysique/;
+  s/Paris Paris-Sud/Paris-Sud/;
+  s/Droit des Affaires  Paris 12/Paris-Val de Marne\tDroit des affaires/;
+  s/Paris 12/Paris-Val de Marne/;
+  s/Paris XII\t/Paris-Val de Marne\t/;
+  s/IUP Paris-Val de Marne/Paris-Val de Marne/;
+  s/Paris 13/Paris-Nord/;
+  s/Paris XIII/Paris-Nord/;
+  s/Aix Marseille II/Université de Provence/;
+  s/Université Lyon I/Université Claude Bernard/;
+  s/Lyon I/Université Claude Bernard/;
+  s/Paul-Sabatier/Université Paul-Sabatier/;
+  s/P\.Sabatier/Université Paul-Sabatier/;
+  s/ECP/Centrale Paris/;
+  s/Ecole Centrale/Centrale Paris/;
+  s/Catolica Chile/PUC/;
+  s/Catalunya/UOC/;
+  s/Californie Irvine/UCI/;
+  s/Californie/UCSD/;
+
+  s/Master Adm. des Entreprises/MBA\t\tMaster Administration des Entreprises/;
+  s/Master P.trole Engineering/MSc\t\tMaster en Pétrole/;
+  s/Master of Space System Engineering/MSc\t\tMaster of Space System Engineering/;
+  s/Master d\'Histoire/M\t\tMastère d\'Histoire/;
+  s/Master Hydraulique/M\t\tMastère Hydraulique/;
+  s/Master Aérospace/M\t\tMastère Aérospace/;
+  s/\tUrbanisme\t/\t\tUrbanisme\t/;
+  s/3e c\.Urbanisme/\tUrbanisme/;
+  s/Acoustique musicale/\tAcoustique musicale/;
+  s/Acoustique\t/\tAcoustique/;
+  s/Aéro\.Astro &EECS/\tAéronautique et Astronomie/;
+  s/Algorithmique/\tAlgorithmique/;
+  s/Anal\. Modél\.Syst\. Biologi\./\tAnalyse et modélisation sytématique en biologie/;
+  s/Anal\.& Polit\.Economique/\tAnalyse et politique économique/;
+  s/Analyse & Modélisation/\tAnalyse et modélisation/;
+  s/Analyse & Polit\. Econom\./\tAnalyse et politique économique/;
+  s/Analyse & Polit\.Eco\./\tAnalyse et politique économique/;
+  s/Analyse & Politique Eco\./\tAnalyse et politique économique/;
+  s/Analyse & Politique Econ\./\tAnalyse et politique économique/;
+  s/Analyse & Politique Economiques/\tAnalyse et politique économique/;
+  s/Analyse donnée/\tAnalyse de données/;
+  s/Analyse Economique/\tAnalyse économique/;
+  s/Analyse et Politique Economiques/\tAnalyse et politique économique/;
+  s/Analyse Industr\./\tAnalyse industrielle/;
+  s/Analyse Numérique/\tAnalyse numérique/;
+  s/Arabe Littéral/\tArabe littéral/;
+  s/Astrophys\./\tAstrophysique/;
+  s/Base Fond\. Oncogenèse/\tBase fondamentale de l'oncogenèse/;
+  s/Bases fondamentales Oncogénèse/\tBase fondamentale de l'oncogenèse/;
+  s/Biologie marine/\tBiologie marine/;
+  s/Biologie moléculaire et céllulaire végétale/\tBiologie moléculaire et céllulaire végétale/;
+  s/Bio. Moléculaire/\tBiologie moléculaire/;
+  s/biologie moléculaire/\tBiologie moléculaire/;
+  s/Biochimie/\tBiochimie/;
+  s/Biochimic/\tBiochimie/;
+  s/Microbiologie/\tMicrobiologie/;
+  s/Biologie/\tBiologie/;
+  s/biologie/\tBiologie/;
+  s/biomécanique/\tBiomécanique/;
+  s/Biophysique/\tBiophysique/;
+  s/Business/\tBusiness/;
+  s/Cancérologie/\tCancérologie/;
+  s/CEA/\tCEA/;
+  s/Champs Particules Matières/\tChamps particules matières/;
+  s/Champs Particules Matière/\tChamps particules matières/;
+  s/Chemical Engineering/\tChemical engineering/;
+  s/Chem.Eng./\tChemical engineering/;
+  s/\tChimie\t/\t\tChimie\t/;
+  s/Chimie appliquée/\tChimie appliquée/;
+  s/Chimie moléculaire/\tChimie moléculaire/;
+  s/\tChimie Moléculaire/\t\tChimie moléculaire/;
+  s/Multinational Chimie Moléculaire/\tChimie moléculaire/;
+  s/Chimie Organique/\t\tChimie organique/;
+  s/Chimie Organique Ing./\tChimie organique/;
+  s/Computer Sc\.Dipl\./\tComputer science/;
+  s/Computer Sciences/\tComputer science/;
+  s/Cryptographe\/Algorighmie/\tCryptographe et algorithmique/;
+  s/algorithmique/\tAlgorithmique/;
+  s/Astro\., Géophysique & Techn\. Spatiales/\tAstronomie, géophysique et technologies spatiales/;
+  s/Astrophysique/\tAstrophysique/;
+  s/Automatique/\tAutomatique/;
+  s/Ecologie/\tÉcologie/;
+  s/Master Histoire/M\t\tHistoire/;
+  s/Affaires Internationales/\tAffaires internationales/;
+  s/Aménagement & Urbanisme/\tAménagement et urbanisme/;
+  s/Chinois/\tChinois/;
+  s/cryptographie/\tCryptographie/;
+  s/d'Histoire/\tHistoire/;
+  s/Dépollution des Sols/\tDépollution des sols/;
+  s/dével. culturel et dir. projet/\tDéveloppement culturel et direction de projets/;
+  s/DIC/\tDIC/;
+  s/Virologie/\tVirologie/;
+  s/Virologie Moléculaire/\tVirologie moléculaire/;
+  s/Transportation/\tTransportation/;
+  s/Transports/\tTransports/;
+  s/Transport\t/\tTransport/;
+  s/Trait. Signal/\tTrait\. Signal/;
+  s/Toxicologie/\tToxicologie/;
+  s/Théorie Information/\tThéorie Information/;
+  s/Théologie Catholique/\tThéologie Catholique/;
+  s/Théologie cath./\tThéologie cath\./;
+  s/Théologie\t/\tThéologie\t/;
+  s/Théolog\./\tThéolog\./;
+  s/Télécom\. Numériques/\tTélécom\. Numériques/;
+  s/Technologie Management/\tTechnologie Management/;
+  s/Techno\.Policy Dipl\./\tTechno\.Policy Dipl\./;
+  s/Technique agricole/\tTechnique agricole/;
+  s/Syst\. énergétiques/\tSyst\. énergétiques/;
+  s/Strat\. des Org\./\tStrat\. des Org\./;
+  s/Strat\. & Marketing/\tStrat\. & Marketing/;
+  s/Statistiques/\tStatistiques/;
+  s/Statistique et modèles aléatoires écon\. et finance/\tStatistique et modèles aléatoires écon\. et finance/;
+  s/Statist\./\tStatist\./;
+  s/Stat\.& Santé/\tStat\.& Santé/;
+  s/\tSt\.//;
+  s/spécialisé sécurité des syst\. inform\./\tspécialisé sécurité des syst\. inform\./;
+  s/Solides Structures & Syst\. Mécaniques/\tSolides Structures & Syst\. Mécaniques/;
+  s/Sociologie/\tSociologie/;
+  s/Signal et Communications Londres/\tSignal et Communications Londres/;
+  s/Sciences théoriques/\tSciences théoriques/;
+  s/Sciences Physiques/\tSciences Physiques/;
+  s/Sciences des Sols/\tSciences des Sols/;
+  s/Sciences Cognitives/\tSciences Cognitives/;
+  s/Sciences & Techniques  environnement/\tSciences & Techniques  environnement/;
+  s/Science Dipl\./\tScience/;
+  s/Science\t/\tSciences/;
+  s/Sciences\t/\tSciences/;
+  s/Sc\.Phys\. Théorique/\tPhysique théorique/;
+  s/Sc\.Phys\.\t/\tPhysique/;
+  s/Sc\.Natur\./\tSciences naturelles/;
+  s/Sc\.Microbio\./\tMicrobiologie/;
+  s/Sc\.Math\. Appliquées/\tMathématiques appliquées/;
+  s/Sc\.Math\.\t/\tMathématiques\t/;
+  s/Sc\.Info\.Géographique/\tInformatique géographique/;
+  s/Sc\.Hum\./\tScience humaine/;
+  s/Sc\.Gestion/\tGestion/;
+  s/Macroéconomie/\tMacroéconomie/;
+  s/Math\. Appliquées aux Sc\. Eco\./\tÉconomie/;
+  s/Sc.Econom./\tÉconomie/;
+  s/Sc\.Econ\. Finance/\tÉconomie et finance/;
+  s/Sc\.Econ\.\t/\tÉconomie\t/;
+  s/Sc\.Eco\.Internat\./\tÉconomie/;
+  s/Sc\.Eco\./\tÉconomie/;
+  s/Sc\.Eco\t/\tÉconomie\t/;
+  s/Sc\.du Bois/\tScience du bois/;
+  s/Sc\.des Matériaux/\tSciences des matériaux/;
+  s/Sc\.de la Vie/\tSciences de la vie/;
+  s/Sc\.de l'Organisation/\tScience de l'organisation/;
+  s/Sc\.de l'Eau 1994/\tScience de l'eau/;
+  s/Sc\.de l'Eau\t/\tScience de l'eau\t/;
+  s/Sc.Cognitives/\tSciences cognitives/;
+  s/Sc\.Chim\./\tChimie/;
+  s/Sc\.Appl\./\tScience appliquées/;
+  s/Sc\. Physiques Option Chimie/\tPhysique, chimie/;
+  s/Sc\. Phy\./\tPhysique/;
+  s/Sc\. Micro/\t/;
+  s/Sc\. matériaux/\tSciences des matériaux/;
+  s/Sc\. la Vie/\tSciences de la vie/;
+  s/Sc\. Informatique\/Micro-électronique/\tInformatique, micro-électronique/;
+  s/Sc\. Immunologie/\tImmunologie/;
+  s/Sc\. Histor\. et Philolog\./\tHistoire et philologie/;
+  s/Sc\. forestières/\tSciences forestières/;
+  s/Sc\. et Tech\. Environ\./\tTechnique environnementale/;
+  s/Sc\. Eco/\tÉconomie/;
+  s/Sc\. Cognitives/\tSciences cognitives/;
+  s/Sc\. biomédicales/\tSciences biomédicales/;
+  s/Sc\. Bactériologie/\tBactériologie/;
+  s/Sc\. & Génie Matériaux/\tGénie des matériaux/;
+  s/Sc\. & Génie des Matériaux/\tGénie des matériaux/;
+  s/Management Sc\./\tManagement des sciences/;
+  s/Sc\.\t/\tSciences\t/;
+  s/Sc Géodésie/\tGéodésie/;
+  s/Robotique/\tRobotique/;
+  s/retr\.Aérospatiale/\tAérospatiale/;
+  s/Réseaux/\tRéseaux/;
+  s/Rech\.Opérationnelle/\tRecherche opérationnelle/;
+  s/Rech\.Opér\./\tRecherche opérationnelle/;
+  s/Public Policy/\tPublic Policy/;
+  s/Psychopathologie/\tPsychopathologie/;
+  s/psychologie/\tPsychologie/;
+  s/Programmation/\tProgrammation/;
+  s/Processus stochastiques/\tProcessus stochastiques/;
+  s/Processus Stochastiques/\tProcessus stochastiques/;
+  s/Génie Procédés/\tGénie des procédés/;
+  s/Génie des Procédés/\tGénie des procédés/;
+  s/\tProcédés/\t\tProcédés/;
+  s/Probalilité & Finance/\tProbalilité & Finance/;
+  s/Probabilités Finance/\tProbabilités Finance/;
+  s/Probabilités et Applications/\tProbabilités et Applications/;
+  s/Probabilités\t/\tProbabilités\t/;
+  s/Physique, chimie, biotransformation/\tPhysique, chimie, biotransformation/;
+  s/Physique Théorique/\tPhysique théorique/;
+  s/Physique Solides/\tPhysique des solides/;
+  s/Physique Quantique/\tPhysique quantique/;
+  s/Physique nucléaire/\tPhysique nucléaire/;
+  s/Physique Nucléaire/\tPhysique nucléaire/;
+  s/Phys\.Nucléaire/\tPhysique nucléaire/;
+  s/Physique expérimentale/\tPhysique expérimentale/;
+  s/Physique du solide/\tPhysique des solides/;
+  s/Physique des Solides/\tPhysique des solides/;
+  s/Physique des Lasers/\tPhysique des lasers/;
+  s/Physique Chimie des matériaux/\tPhysique et chimie des matériaux/;
+  s/Physique\t/\tPhysique\t/;
+  s/Phys\.Théor\. Dipl\./\tPhysique théorique/;
+  s/Phys\.Théor\./\tPhysique théorique/;
+  s/Phys\.Réact\./\tPhysique des réacteurs/;
+  s/Phys\.Quantique/\tPhysique quantique/;
+  s/Phys\.Plasmas Spatiaux/\tPhysique des plasmas spatiaux/;
+  s/Phys\.Mathématiques/\tPhysiques mathématiques/;
+  s/Phys\.des Solides/\tPhysique des solides/;
+  s/Phys\. Théor\./\tPhysique théorique/;
+  s/Phys\. Réacteurs/\tPhysique des réacteurs/;
+  s/Phys\. Quantique/\tPhysique quantique/;
+  s/Géodynamique & Phys\./\tGéodynamique & physique/;
+  s/Phys\.Solid/\t\tPhysique des solides/;
+  s/Phys\./\tPhysique/;
+  s/Phys des Solides/\tPhysique des solides/;
+  s/philosophie et théologie/\tPhilosophie et théologie/;
+  s/Philosophie/\tPhilosophie/;
+  s/Philo\.et Eco\. Londres/\tPhilosophie et économie/;
+  s/Pharmacochimie Mol\.expérim\.et Métabolisme/\tPharmacochimie moléculaire expérimentales et métabolisme/;
+  s/Pharmaco\.& Biol\.Cellulaire/\tPharmacologie et biologie cellulaire/;
+  s/Pharmacolog\./\tPharmacologie/;
+  s/Particules & Matière/\tParticules et matières/;
+  s/Organisation et Pilotage Syst\. Product\. Indust\./\tOrganisation et pilotage syst. Product. Indust./;
+  s/Organisation & Syst\.Prod\./\tOrganisation et système de production/;
+  s/Russe/\tRusse/;
+  s/Polit\.Eco\.& Soc\./\tPolitique économique et sociale/;
+  s/Physique des Particules CNRS-CERN/\tPhysique des Particules CNRS-CERN/;
+  s/Physique M/\tPhysique moléculaire/;
+  s/Org\. Production et Entreprise/\tOrganisation production et entreprise/;
+  s/Org\. et Pilotage des Syst\. product\./\tOrganisation et pilotage des systèmes production/;
+  s/\tOptique/\t\tOptique/;
+  s/Océanographie/\tOcéanographie/;
+  s/océanologie/\tOcéanographie/;
+  s/Océano\./\tOcéanographie/;
+  s/Nucl\. Eng/\tNuclear engineering/;
+  s/Neurosciences/\tNeurosciences/;
+  s/Neuro/\tNeurosciences/;
+  s/Multinational Chimie molécullaire/\tChimie molécullaire/;
+  s/Multinational\t//;
+  s/Morphol\.Math\./\tMorphologie mathématiques/;
+  s/Modélisation Stochastique et Statistique/\tModélisation stochastique et statistique/;
+  s/Modèl\.Stochastiq\./\tModélisation stochastique/;
+  s/Milieux Coralliens/\tMilieux coralliens/;
+  s/Microélect\./\tMicroélectronique/;
+  s/Microéconomie/\tMicroéconomie/;
+  s/méthodes physiques télédétection/\tMéthodes physiques télédétection/;
+  s/Météorologie/\tMétéorologie/;
+  s/Médiateur Judiciaire et conventionnelle/\tMédiateur judiciaire et conventionnelle/;
+  s/Mechanical Engineering/\tMechanical Engineering/;
+  s/Mécanique\/Sc\. Matériaux/\tMécanique science des matériaux/;
+  s/Mécanique Théorique/\tMécanique théorique/;
+  s/Mécanique Fluides/\tMécanique fluides/;
+  s/Mécanique\t/\tMécanique\t/;
+  s/Méca Fluid\.Théor\./\tMécanique des fluides théoriques/;
+  s/Méc\.des Fluides/\tMécanique des fluides/;
+  s/Maths Financières/\tMathématiques financières/;
+  s/Maths Appl\.à l'Economie/\tMathématiques appliquées à l'économie/;
+  s/Mathématiques/\tMathématiques/;
+  s/Mathématique/\tMathématiques/;
+  s/Mathematics/\tMathématiques/;
+  s/Maths\t/\tMathématiques\t/;
+  s/Math\.Appliquées/\tMathématiques appliquées/;
+  s/Math\.Appliq\./\tMathématiques appliquées/;
+  s/Math\.Appl\./\tMathématiques appliquées/;
+  s/Math\. Stat\./\tMathématiques statistiques/;
+  s/Math\. Pures/\tMathématiques pures/;
+  s/Math\. Appliqués/\tMathématiques appliquées/;
+  s/Math\. Appliquées et Calcul Scient\./\tMathématiques appliquées et calcul scientifique/;
+  s/Math\. Appliquées/\tMathématiques appliquées/;
+  s/Math\. appli\. Sci\. homme/\tMathématiques appliquées aux sciences humaines/;
+  s/Informatique Math\.& Appl\./\tInformatique et mathématiques appliquées/;
+  s/\tinformatique\t/\t\tInformatique\t/;
+  s/Informatique Math\. et Appli\./\tInformatique et mathématiques appliquées/;
+  s/Math\./\tMathématiques/;
+  s/Nepali-Tibétain/\tNepali-Tibétain/;
+  s/MVA/\tMathématiques vision apprentissage/;
+  s/MMME//;
+  s/OJME//;
+  s/\tMicro\t/\t\tMicro\t/;
+  s/Médec\.AIHP/\Médecine/;
+  s/\tMarketing\t/\t\tMarketing\t/;
+  s/Lt\. Et\. Sup\. Banq\./\tLt. Et. Sup. Banq./;
+  s/Management Aéroportuaire/\tManagement Aéroportuaire/;
+  s/Logistique/\tLogistique/;
+  s/Lettres modernes/\tLettres modernes/;
+  s/Lettres Hist\. Art/\tLettres histoire de l'art/;
+  s/lettres classiques/\tLettres classiques/;
+  s/Lettres Anglais/\tLettres Anglais/;
+  s/Lettres\t/\tLettres\t/;
+  s/LCO//;
+  s/Laser & Matière/\tLaser & Matière/;
+  s/Langues Orientales/\tLangues orientales/;
+  s/Langues Orient\./\tLangues orientales/;
+  s/Intelligence Artificielle/\tIntelligence artificielle/;
+  s/Ingenierie & Gestion/\tIngenierie & gestion/;
+  s/Informatique Fondamentale/\tInformatique fondamentale/;
+  s/Informatique Dipl\./\tInformatique/;
+  s/Informatique  Grenoble/\tInformatique/;
+  s/\tInformatique\t/\t\tInformatique\t/;
+  s/Information theory/\tInformation theory/;
+  s/Industrial Design Eng\./\tIndustrial Design Engineering/;
+  s/Immunologie/\tImmunologie/;
+  s/Immunology/\tImmunologie/;
+  s/Images Synthèse/\tImages synthèse/;
+  s/hydrologie-hydrogéologie/\thydrologie-hydrogéologie/;
+  s/Hydrologie/\tHydrologie/;
+  s/Hydrogéologie/\tHydrogéologie/;
+  s/Hydrodynamique/\tHydrodynamique/;
+  s/Histoire, Anglais, Lettres classiques & modernes/\tHistoire, Anglais, Lettres classiques & modernes/;
+  s/Histoire Droit/\tHistoire Droit/;
+  s/\tHistoire\t/\t\tHistoire\t/;
+  s/Hist\.de l'Art/\tHistoire l'art/;
+  s/HIST PHILOSOPHIE/\tHistoire et philosophie/;
+  s/HH GG/\tHistoire et géographie/;
+  s/Gestion scientifique/\tGestion scientifique/;
+  s/Gestion des Ress\. Naturelles Renouvelables/\tGestion des ressources naturelles renouvelables/;
+  s/\tGestion\t/\t\tGestion\t/;
+  s/Géophys\./\tGéophysique/;
+  s/Géographie/\tGéographie/;
+  s/Génie Electrique/\tGénie électrique/;
+  s/Génie Chimique/\tGénie chimique/;
+  s/Génie Atomique/\tGénie atomique/;
+  s/\tGénie\t/\t\tGénie\t/;
+  s/Génie civil/\tGénie civil/;
+  s/Génétique/\tGénétique/;
+  s/Finance Monnaie/\tFinance Monnaie/;
+  s/Finance Marché/\tFinance Marché/;
+  s/Finance et probabilité/\tFinance et probabilité/;
+  s/Finance et Monnaie/\tFinance et Monnaie/;
+  s/Finance Dipl\./\tFinance/;
+  s/Finance and Economics Londres/\tFinance and Economics/;
+  s/\tFinance\t/\t\tFinance\t/;
+  s/Expert Compt\./\tExpertise comptable/;
+  s/Etudes Latines/\tEtudes latines/;
+  s/études extrême orientales/\tÉtudes extrême orientales/;
+  s/et PhD\t//;
+  s/et HDR\t//;
+  s/Epidémiologie/\tÉpidémiologie/;
+  s/Environnement Marin/\tEnvironnement marin/;
+  s/\tEnvironnement\t/\t\tEnvironnement\t/;
+  s/Energétique/\tÉnergétique/;
+  s/Electronique/\tÉlectronique/;
+  s/Electron\./\tÉlectronique/;
+  s/Electrical Engineering/\tElectrical Engineering/;
+  s/Electrical Engin\. & Computer/\tElectrical engineering & Computer science/;
+  s/Electrical Eng Dipl\./\tElectrical engineering/;
+  s/Educateur spécialisé/\tÉducateur spécialisé/;
+  s/Économiee\t/\tÉconomie\t/;
+  s/Economie Monétaire & Bancaire/\tÉconomie monétaire & bancaire/;
+  s/Economie Internationale/\tÉconomie internationale/;
+  s/Economie innovation/\tÉconomie innovation/;
+  s/Economie Industrielle/\tÉconomie industrielle/;
+  s/Economie Ind\./\tÉconomie industrielle/;
+  s/Economie et Finance/\tÉconomie et fnance/;
+  s/Economie Environnement/\tÉconomie environnementale/;
+  s/Economie Envir\. et Ress\. Nat\./\tÉconomie environnementale et ressources naturelles/;
+  s/Economie du Dévelop\./\tÉconomie du développement/;
+  s/Economie Dipl\./\tÉconomie/;
+  s/Economie Développement/\tÉconomie développement/;
+  s/Economie des Institutions/\tÉconomie des institutions/;
+  s/Economie & Finance Internat./\tÉconomie & finance internationale/;
+  s/Economie\t/\tÉconomie\t/;
+  s/Econométrie/\tÉconométrie/;
+  s/Econom\.Dipl\./\tÉconométrie/;
+  s/Econ\.Po\./\tÉconomie politique/;
+  s/Econ\.Industrielle/\tÉconomie industrielle/;
+  s/Econ\.Appliquée/\tÉconomie appliquée/;
+  s/Econ\.& Finance Internat\./\tÉconomie & finance internationale/;
+  s/Econ\. & Finance/\tÉconomie & finance/;
+  s/Econ\.\t/\tÉconomie\t/;
+  s/écologie M/\tÉcologie/;
+  s/Eco\.Rech\.Dévelop\./\tÉconomie recherche et développement/;
+  s/Eco\.Appliquée/\tÉconomie appliquée/;
+  s/Eco\. Enviro\. & Ress\. Humaines/\tÉconomie environnementale & ressource humaines/;
+  s/Eco Finance Internationale/\tÉconomie finance internationale/;
+  s/Droit Public/\tDroit Public/;
+  s/Droit des affaires/\tDroit des affaires/;
+  s/Droit\t/\tDroit\t/;
+  s/INRIA/\tINRIA/;
+  s/\tInformatique\t/\t\tInformatique\t/;
+  s/Ecotoxicologie/\tEcotoxicologie/;
+  s/Droit public/\tDroit public/;
+  s/Droit des Affaires/\tDroit des Affaires/;
+  s/Anal\.Numér\./\tAnalyse numérique/;
+  s/& Gestion Energie/\tGestion de l'énergie/;
+  s/droit/\tdroit/;
+
+  # On nettoye à la fin
+  s/\tSE\t/\t/;
+  s/rer\.Nat\.//;
+  s/Un\. Dipl\.\t//;
+  s/Dipl\. Dipl\./Dipl./;
+  s/Dipl\.Dipl\./Dipl./;
+  s/Ing Dipl\./Ing./;
+  s/Ing Ing\./Ing./;
+  s/Sc\.Dipl\.//;
+  s/\t2005\t//;
+  s/(Dipl\.)(\tDipl\.)+/Dipl./;
+  s/(Ing\.)(\tDipl\.)+/Ing./;
+  s/(Corps)(\tDipl\.)+/Corps/;
+  s/(MSc)(\tDipl\.)+/MSc/;
+  s/(PhD)(\tDipl\.)+/PhD/;
+  s/(DEA)(\tDipl\.)+/DEA/;
+  s/(ME)(\tDipl\.)+/ME/;
+  s/(MBA)(\tDipl\.)+/MBA/;
+  s/(MPA)(\tDipl\.)+/MPA/;
+  s/(Lic\.)(\tDipl\.)+/Lic./;
+  s/(MIA)(\tDipl\.)+/MIA/;
+  s/(Agr\.)(\tDipl\.)+/Agr./;
+  s/(CAPES)(\tDipl\.)+/CAPES/;
+  s/(DESS)(\tDipl\.)+/DESS/;
+  s/(BTS)(\tDipl\.)+/BTS/;
+  s/(MA)(\tDipl\.)+/MA/;
+  s/(Maîtr\.)(\tDipl\.)+/Maîtr./;
+  s/(HDR)(\tDipl\.)+/HDR/;
+  s/(DEUG)(\tDipl\.)+/DEUG/;
+  s/(MEE)(\tDipl\.)+/MEE/;
+  s/(MPhil)(\tDipl\.)+/MPhil/;
+  s/(MUP)(\tDipl\.)+/MUP/;
+  s/(MME)(\tDipl\.)+/MME/;
+  s/(MCP)(\tDipl\.)+/MCP/;
+  s/(BA)(\tDipl\.)+/BA/;
+  s/(MEl)(\tDipl\.)+/MEl/;
+  s/(MM)(\tDipl\.)+/MM/;
+  s/(MIB)(\tDipl\.)+/MIB/;
+  s/(MC)(\tDipl\.)+/MC/;
+  s/(MEM)(\tDipl\.)+/MEM/;
+  s/(MEng)(\tDipl\.)+/MEng/;
+  s/(MCE)(\tDipl\.)+/MCE/;
+  s/(M)(\tDipl\.)+/M/;
+  s/(MMS)(\tDipl\.)+/MMS/;
+  s/(MB)(\tDipl\.)+/MB/;
+  s/(MiF)(\tDipl\.)+/MiF/;
+  s/Ing\.\tPhD/Ing.\t\t/;
+  s/PhD\tPhD/PhD\t\t/;
+  s/MSc\tMSc/MSc/;
+  s/DEA\tMSc/DEA/;
+  s/DEA\tMSc/DEA/;
+  s/DEA\tMSc/DEA/;
+  s/PhD\tMSc/PhD/;
+  s/Dipl\.\tME/ME/;
+  s/MBA\tMBA/MBA/;
+  s/DEA\tM\t/DEA\t/;
+  s/PhD\tM\t/PhD\t/;
+  s/MSc\tMBA/MBA/;
+  s/PhD\tHDR/PhD/;
+  s/(Ing\.\t)+(Ing\.)/Ing./;
+  s/PhD\tIng/PhD/;
+  s/PhD\tIng\./PhD/;
+  s/MBA\tIng\./MBA/;
+  s/MBA\tMA/MBA/;
+  s/PhD\./PhD/;
+  s/Dipl\.\tIng\./Ing./;
+  s/MSc\tIng\./MSc/;
+  s/MIB\tIng\./MIB/;
+
+  s/Université//g;
+  s/université//g;
+  s/Univers\.//g;
+  s/Sc\.\t//g;
+  s/Sc\. \t//g;
+  s/Paul-Sabatier/Université Paul-Sabatier/;
+  s/de Provence/Université de Provence/;
+  s/Jean-Moulin/Université Jean-Moulin/;
+  s/Claude Bernard/Université Claude Bernard/;
+  s/de Rennes/Université de Rennes 1/;
+  s/MIT Institute of Technology/MIT/;
+  s/London Royaume uni//;
+  s/\tLondon\t//;
+  s/\tGrenoble\t//;
+  s/ENS UlmAE/ENSAE/;
+
+  s/\t  /\t/g;
+  s/\t /\t/g;
+  s/\t,/\t/g;
+  s/\t-/\t/g;
+  s/\t:/\t/g;
+  s/\t\./\t/g;
+  s/\t  /\t/g;
+  s/\t /\t/g;
+  s/  \t/\t/g;
+  s/ \t/\t/g;
+  s/London\tBusiness School/London Business School/;
+  s/DEA\tMSc/DEA/;
+  s/ME\tDipl\./ME/;
+  s/\tENS\t/\tENS Ulm/;
+  s/Économiee environ\. et ressources naturelles UCL Londres/UCL\tÉconomie environnementale et ressources naturelles/;
+  s/Dipl\.\tHEC 04//;
+  s/Neurosciencessciences/Neurosciences/;
+  s/HEC\tHEC-Entrepreneurs//;
+  s/Master Techniques Avancées en Calcul des Structures\tENS Cachan/Master Techniques Avancées en Calcul des Structures/;
+  s/DEA\t\tPanthéon-Sorbonne/DEA\tPanthéon-Sorbonne/;
+  s/MBA\t\tCollege of Europe/MBA\tCollege of Europe/;
+  s/DEA\t\tUMPC/DEA\tUMPC/;
+  s/Informatique UMPC/Informatique/;
+
+  print OUT $_;
+}
+
+close(FILE);
+close(OUT);
diff --git a/modules/fusionax/import-ax.sh b/modules/fusionax/import-ax.sh
new file mode 100755 (executable)
index 0000000..fb3a6db
--- /dev/null
@@ -0,0 +1,32 @@
+#! /bin/bash
+
+# import des données
+#scp -i ax_xorg_rsa xorg@polytechniciens.com:/home/axasso/ax-import/export_4D.txt.rar .
+#unrar e -inul export_4D.txt.rar
+cp /home/x2004jacob/export*utf8.TXT .
+
+# séparation en fichiers de tables 
+cat export_total* | grep ^AD > Adresses.txt
+cat export_total* | grep ^AN > Anciens.txt
+cat export_total* | grep ^FO > Formations.txt
+cat export_total* | grep ^AC > Activites.txt
+cat export_total* | grep ^EN > Entreprises.txt
+
+exit 1
+
+# intégration dans notre bdd
+echo intégration dans notre bdd
+$MYSQL x4dat < Activites.sql
+$MYSQL x4dat < Adresses.sql
+$MYSQL x4dat < Anciens.sql
+$MYSQL x4dat < Entreprises.sql
+./formation.pl
+cat Formations_out.txt > Formations.txt
+rm -f Formations_out.txt
+$MYSQL x4dat < Formations.sql
+
+
+# nettoyage
+echo nettoyage
+#rm Adresses.txt Anciens.txt Formations.txt Activites.txt Entreprises.txt export_4D.txt.rar export-total*
+rm Adresses.txt Anciens.txt Formations.txt Activites.txt Entreprises.txt export-total*
index 0a83602..ae45b22 100644 (file)
@@ -27,6 +27,7 @@ class GeolocModule extends PLModule
             'geoloc'             => $this->make_hook('default', AUTH_COOKIE),
             'admin/geoloc'           => $this->make_hook('admin', AUTH_MDP, 'admin'),
             'admin/geoloc/dynamap'   => $this->make_hook('admin_dynamap', AUTH_MDP, 'admin'),
+            'admin/geoloc/country'   => $this->make_hook('admin_country',  AUTH_MDP, 'admin')
         );
     }
 
@@ -107,6 +108,51 @@ class GeolocModule extends PLModule
         $page->assign("no_coordinates", $noCoordinates);
     }
 
+    function handler_admin_country(&$page, $action = 'list', $id = null)
+    {
+        $page->assign('xorg_title', 'Polytechnique.org - Administration - Pays');
+        $page->assign('title', 'Gestion des pays');
+        $table_editor = new PLTableEditor('admin/geoloc/country', 'geoloc_pays', 'a2', true);
+        $table_editor->describe('a2', 'alpha-2', true);
+        $table_editor->describe('a3', 'alpha-3', false);
+        $table_editor->describe('n3', 'ISO numeric', false);
+        $table_editor->describe('num', 'num', false);
+        $table_editor->describe('worldrgn', 'Continent', false);
+        $table_editor->describe('subd', 'Subdivisions territoriales', false);
+        $table_editor->describe('post', 'post', false);
+        $table_editor->describe('pays', 'Nom (fr)', true);
+        $table_editor->describe('country', 'Nom (en)', true);
+        $table_editor->describe('phoneprf', 'Préfixe téléphonique', true);
+        $table_editor->describe('phoneformat', 'Format du téléphone (ex: (+p) ### ## ## ##)', false);
+        $table_editor->describe('capital', 'Capitale', true);
+        $table_editor->describe('nat', 'Nationalité', true);
+        $table_editor->describe('display', 'Format des adresses', false);
+
+        if ($action == 'update') {
+            if (Post::has('a2') && (Post::v('a2') == $id) && Post::has('phoneprf') && (Post::v('phoneprf') != '')) {
+                if (Post::has('phoneformat')) {
+                    $new_format = Post::v('phoneformat');
+                } else {
+                    $new_format = '';
+                }
+                $res = XDB::query("SELECT phoneformat
+                                     FROM geoloc_pays
+                                    WHERE phoneprf = {?}
+                                    LIMIT 1",
+                                  Post::v('phoneprf'));
+                $old_format = $res->fetchOneCell();
+                if ($new_format != $old_format) {
+                    require_once("profil.func.inc.php");
+                    XDB::execute("UPDATE  geoloc_pays
+                                     SET  phoneformat = {?}
+                                   WHERE  phoneprf = {?}",
+                                 $new_format, Post::v('phoneprf'));
+                }
+            }
+        }
+        $table_editor->apply($page, $action, $id);
+    }
+
 }
 
 // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
index dcd1606..a32d05c 100644 (file)
@@ -80,10 +80,11 @@ class PayPal
         $res = XDB::query(
             "SELECT a.adr1 AS address1, a.adr2 AS address2,
                     a.city, a.postcode AS zip, a.country,
-                    IF(t.tel, t.tel, q.profile_mobile) AS night_phone_b
+                    IF(t1.display_tel != '', t1.display_tel, t2.display_tel) AS night_phone_b
                FROM auth_user_quick AS q
           LEFT JOIN adresses  AS a ON (q.user_id = a.uid AND FIND_IN_SET('active', a.statut))
-          LEFT JOIN tels        AS t ON (t.uid = a.uid AND t.adrid = a.adrid)
+          LEFT JOIN profile_phones AS t1 ON (t1.uid = a.uid AND t1.link_type = 'address' AND t1.link_id = a.adrid)
+          LEFT JOIN profile_phones AS t2 ON (t2.uid = a.uid AND t2.link_type = 'user' AND t2.link_id = 0)
               WHERE q.user_id = {?}
               LIMIT 1", S::v('uid'));
         $this->infos['client'] = array_map('replace_accent', array_merge($info_client, $res->fetchOneAssoc()));
index 7a52138..ac42c04 100644 (file)
@@ -24,43 +24,52 @@ class ProfileModule extends PLModule
     function handlers()
     {
         return array(
-            'photo'        => $this->make_hook('photo',        AUTH_PUBLIC),
-            'photo/change' => $this->make_hook('photo_change', AUTH_MDP),
-
-            'fiche.php'        => $this->make_hook('fiche',      AUTH_PUBLIC),
-            'profile'          => $this->make_hook('profile',    AUTH_PUBLIC),
-            'profile/private'  => $this->make_hook('profile',    AUTH_COOKIE),
-            'profile/ax'       => $this->make_hook('ax',         AUTH_COOKIE, 'admin'),
-            'profile/edit'     => $this->make_hook('p_edit',     AUTH_MDP),
-            'profile/ajax/address' => $this->make_hook('ajax_address', AUTH_COOKIE, 'user', NO_AUTH),
-            'profile/ajax/tel'     => $this->make_hook('ajax_tel',     AUTH_COOKIE, 'user', NO_AUTH),
-            'profile/ajax/medal'   => $this->make_hook('ajax_medal',   AUTH_COOKIE, 'user', NO_AUTH),
-            'profile/ajax/job'     => $this->make_hook('ajax_job',     AUTH_COOKIE, 'user', NO_AUTH),
-            'profile/ajax/secteur' => $this->make_hook('ajax_secteur', AUTH_COOKIE, 'user', NO_AUTH),
-            'profile/ajax/skill'   => $this->make_hook('ajax_skill',   AUTH_COOKIE, 'user', NO_AUTH),
-            'javascript/applis.js' => $this->make_hook('applis_js', AUTH_COOKIE),
-            'javascript/grades.js' => $this->make_hook('grades_js', AUTH_COOKIE),
-            'profile/medal'    => $this->make_hook('medal', AUTH_PUBLIC),
-            'profile/orange'   => $this->make_hook('p_orange',   AUTH_MDP),
-            'profile/usage'    => $this->make_hook('p_usage',    AUTH_MDP),
-
-            'referent'         => $this->make_hook('referent',   AUTH_COOKIE),
-            'emploi'           => $this->make_hook('ref_search', AUTH_COOKIE),
-            'referent/search'  => $this->make_hook('ref_search', AUTH_COOKIE),
-            'referent/ssect'   => $this->make_hook('ref_sect',   AUTH_COOKIE, 'user', NO_AUTH),
-            'referent/country' => $this->make_hook('ref_country', AUTH_COOKIE, 'user', NO_AUTH),
-
-            'groupes-x'        => $this->make_hook('xnet',      AUTH_COOKIE),
-
-            'vcard'   => $this->make_hook('vcard',  AUTH_COOKIE, 'user', NO_HTTPS),
-            'admin/binets'     => $this->make_hook('admin_binets', AUTH_MDP, 'admin'),
-            'admin/medals'     => $this->make_hook('admin_medals', AUTH_MDP, 'admin'),
-            'admin/formations' => $this->make_hook('admin_formations', AUTH_MDP, 'admin'),
-            'admin/sections'  => $this->make_hook('admin_sections', AUTH_MDP, 'admin'),
-            'admin/secteurs'  => $this->make_hook('admin_secteurs', AUTH_MDP, 'admin'),
-            'admin/trombino'   => $this->make_hook('admin_trombino', AUTH_MDP, 'admin'),
-            'admin/ss_secteurs'  => $this->make_hook('admin_ss_secteurs', AUTH_MDP, 'admin'),
-            'admin/fonctions'  => $this->make_hook('admin_fonctions', AUTH_MDP, 'admin'),
+            'photo'                      => $this->make_hook('photo',                      AUTH_PUBLIC),
+            'photo/change'               => $this->make_hook('photo_change',               AUTH_MDP),
+
+            'fiche.php'                  => $this->make_hook('fiche',                      AUTH_PUBLIC),
+            'profile'                    => $this->make_hook('profile',                    AUTH_PUBLIC),
+            'profile/private'            => $this->make_hook('profile',                    AUTH_COOKIE),
+            'profile/ax'                 => $this->make_hook('ax',                         AUTH_COOKIE, 'admin'),
+            'profile/edit'               => $this->make_hook('p_edit',                     AUTH_MDP),
+            'profile/ajax/address'       => $this->make_hook('ajax_address',               AUTH_COOKIE, 'user', NO_AUTH),
+            'profile/ajax/tel'           => $this->make_hook('ajax_tel',                   AUTH_COOKIE, 'user', NO_AUTH),
+            'profile/ajax/edu'           => $this->make_hook('ajax_edu',                   AUTH_COOKIE, 'user', NO_AUTH),
+            'profile/ajax/medal'         => $this->make_hook('ajax_medal',                 AUTH_COOKIE, 'user', NO_AUTH),
+            'profile/networking'         => $this->make_hook('networking',                 AUTH_PUBLIC),
+            'profile/ajax/job'           => $this->make_hook('ajax_job',                   AUTH_COOKIE, 'user', NO_AUTH),
+            'profile/ajax/secteur'       => $this->make_hook('ajax_secteur',               AUTH_COOKIE, 'user', NO_AUTH),
+            'profile/ajax/skill'         => $this->make_hook('ajax_skill',                 AUTH_COOKIE, 'user', NO_AUTH),
+            'profile/ajax/searchname'    => $this->make_hook('ajax_searchname',            AUTH_COOKIE, 'user', NO_AUTH),
+            'javascript/education.js'    => $this->make_hook('education_js',               AUTH_COOKIE),
+            'javascript/grades.js'       => $this->make_hook('grades_js',                  AUTH_COOKIE),
+            'profile/medal'              => $this->make_hook('medal',                      AUTH_PUBLIC),
+            'profile/orange'             => $this->make_hook('p_orange',                   AUTH_MDP),
+            'profile/usage'              => $this->make_hook('p_usage',                    AUTH_MDP),
+
+            'referent'                   => $this->make_hook('referent',                   AUTH_COOKIE),
+            'emploi'                     => $this->make_hook('ref_search',                 AUTH_COOKIE),
+            'referent/search'            => $this->make_hook('ref_search',                 AUTH_COOKIE),
+            'referent/ssect'             => $this->make_hook('ref_sect',                   AUTH_COOKIE, 'user', NO_AUTH),
+            'referent/country'           => $this->make_hook('ref_country',                AUTH_COOKIE, 'user', NO_AUTH),
+
+            'groupes-x'                  => $this->make_hook('xnet',                       AUTH_COOKIE),
+
+            'vcard'                      => $this->make_hook('vcard',                      AUTH_COOKIE, 'user', NO_HTTPS),
+            'admin/binets'               => $this->make_hook('admin_binets',               AUTH_MDP, 'admin'),
+            'admin/medals'               => $this->make_hook('admin_medals',               AUTH_MDP, 'admin'),
+            'admin/education'            => $this->make_hook('admin_education',            AUTH_MDP, 'admin'),
+            'admin/education_field'      => $this->make_hook('admin_education_field',      AUTH_MDP, 'admin'),
+            'admin/education_degree'     => $this->make_hook('admin_education_degree',     AUTH_MDP, 'admin'),
+            'admin/education_degree_set' => $this->make_hook('admin_education_degree_set', AUTH_MDP, 'admin'),
+            'admin/sections'             => $this->make_hook('admin_sections',             AUTH_MDP, 'admin'),
+            'admin/secteurs'             => $this->make_hook('admin_secteurs',             AUTH_MDP, 'admin'),
+            'admin/networking'           => $this->make_hook('admin_networking',           AUTH_MDP, 'admin'),
+            'admin/trombino'             => $this->make_hook('admin_trombino',             AUTH_MDP, 'admin'),
+            'admin/ss_secteurs'          => $this->make_hook('admin_ss_secteurs',          AUTH_MDP, 'admin'),
+            'admin/fonctions'            => $this->make_hook('admin_fonctions',            AUTH_MDP, 'admin'),
+            'admin/corps_enum'           => $this->make_hook('admin_corps_enum',           AUTH_MDP, 'admin'),
+            'admin/corps_rank'           => $this->make_hook('admin_corps_rank',           AUTH_MDP, 'admin'),
 
         );
     }
@@ -128,6 +137,19 @@ class ProfileModule extends PLModule
         exit;
     }
 
+    function handler_networking(&$page, $mid)
+    {
+        $res = XDB::query("SELECT  icon
+                             FROM  profile_networking_enum
+                            WHERE  network_type = {?}",
+                          $mid);
+        $img  = dirname(__FILE__) . '/../htdocs/images/networking/' . $res->fetchOneCell();
+        $type = mime_content_type($img);
+        header("Content-Type: $type");
+        echo file_get_contents($img);
+        exit;
+    }
+
     function handler_photo_change(&$page)
     {
         global $globals;
@@ -330,7 +352,7 @@ class ProfileModule extends PLModule
 
         // Build the page
         $page->addJsLink('ajax.js');
-        $page->addJsLink('applis.js');
+        $page->addJsLink('education.js');
         $page->addJsLink('grades.js');
         $page->addJsLink('profile.js');
         $page->addJsLink('jquery.autocomplete.js');
@@ -357,15 +379,15 @@ class ProfileModule extends PLModule
        $page->setTitle('Mon Profil');
     }
 
-    function handler_applis_js(&$page)
+    function handler_education_js(&$page)
     {
         header('Content-Type: text/javascript; charset=utf-8');
         header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');
         header('Last-Modified:' . gmdate('D, d M Y H:i:s') . ' GMT');
         header('Cache-Control: no-cache, must-revalidate');
         header('Pragma: no-cache');
-        $page->changeTpl('profile/applis.js.tpl', NO_SKIN);
-        require_once "applis.func.inc.php";
+        $page->changeTpl('profile/education.js.tpl', NO_SKIN);
+        require_once "education.func.inc.php";
     }
 
     function handler_grades_js(&$page)
@@ -403,17 +425,29 @@ class ProfileModule extends PLModule
         $page->assign('adr', array());
     }
 
-    function handler_ajax_tel(&$page, $adid, $telid)
+    function handler_ajax_tel(&$page, $prefid, $prefname, $telid)
     {
         header('Content-Type: text/html; charset=utf-8');
-        $page->changeTpl('profile/adresses.tel.tpl', NO_SKIN);
-        $page->assign('i', $adid);
-        $page->assign('adid', "addresses_$adid");
-        $page->assign('adpref', "addresses[$adid]");
-        $page->assign('t', $telid);
+        $page->changeTpl('profile/phone.tpl', NO_SKIN);
+        $page->assign('prefid', $prefid);
+        $page->assign('prefname', $prefname);
+        $page->assign('telid', $telid);
         $page->assign('tel', array());
     }
 
+    function handler_ajax_edu(&$page, $eduid, $class)
+    {
+        header('Content-Type: text/html; charset=utf-8');
+        $page->changeTpl('profile/edu.tpl', NO_SKIN);
+        $res = XDB::iterator("SELECT  id, field
+                                FROM  profile_education_field_enum
+                            ORDER BY  field");
+        $page->assign('edu_fields', $res->fetchAllAssoc());
+        $page->assign('eduid', $eduid);
+        $page->assign('class', $class);
+        require_once "education.func.inc.php";
+    }
+
     function handler_ajax_medal(&$page, $id)
     {
         header('Content-Type: text/html; charset=utf-8');
@@ -468,20 +502,32 @@ class ProfileModule extends PLModule
         }
     }
 
+    function handler_ajax_searchname(&$page, $snid)
+    {
+        header('Content-Type: text/html; charset=utf-8');
+        $page->changeTpl('profile/general.searchname.tpl', NO_SKIN);
+        $page->assign('i', $snid);
+        $page->assign('sn', array());
+        $page->assign('newsn', true);
+    }
+    
     function handler_p_orange(&$page)
     {
         $page->changeTpl('profile/orange.tpl');
 
         require_once 'validations.inc.php';
 
-        $res = XDB::query(
-                "SELECT  u.promo, u.promo_sortie
-                   FROM  auth_user_md5  AS u
-                  WHERE  user_id={?}", S::v('uid'));
+        $res = XDB::query("SELECT  e.entry_year, e.grad_year, d.promo_display, FIND_IN_SET('femme', u.flags) AS sexe
+                             FROM  auth_user_md5     AS u
+                       INNER JOIN  profile_display   AS d ON (d.uid = u.user_id)
+                       INNER JOIN  profile_education AS e ON (e.uid = u.user_id AND FIND_IN_SET('primary', e.flags))
+                            WHERE  u.user_id = {?}", S::v('uid'));
 
-        list($promo, $promo_sortie_old) = $res->fetchOneRow();
+        list($promo, $promo_sortie_old, $promo_display, $sexe) = $res->fetchOneRow();
         $page->assign('promo_sortie_old', $promo_sortie_old);
-        $page->assign('promo',  $promo);
+        $page->assign('promo', $promo);
+        $page->assign('promo_display', $promo_display);
+        $page->assign('sexe', $sexe);
 
         if (!Env::has('promo_sortie')) {
             return;
@@ -492,18 +538,18 @@ class ProfileModule extends PLModule
         $promo_sortie = Env::i('promo_sortie');
 
         if ($promo_sortie < 1000 || $promo_sortie > 9999) {
-            $page->trigError('L\'année de sortie doit être un nombre de quatre chiffres');
+            $page->trigError('L\'année de sortie doit être un nombre de quatre chiffres.');
         }
         elseif ($promo_sortie < $promo + 3) {
-            $page->trigError('Trop tôt');
+            $page->trigError('Trop tôt !');
         }
         elseif ($promo_sortie == $promo_sortie_old) {
             $page->trigWarning('Tu appartiens déjà à la promotion correspondante à cette année de sortie.');
         }
         elseif ($promo_sortie == $promo + 3) {
-            XDB::execute(
-                "UPDATE  auth_user_md5 set promo_sortie={?}
-                  WHERE  user_id={?}", $promo_sortie, S::v('uid'));
+            XDB::execute("UPDATE  profile_education
+                             SET  grad_year = {?}
+                           WHERE  uid = {?} AND FIND_IN_SET('primary', flags)", $promo_sortie, S::v('uid'));
                 $page->trigSuccess('Ton statut "orange" a été supprimé.');
                 $page->assign('promo_sortie_old', $promo_sortie);
         }
@@ -770,13 +816,39 @@ class ProfileModule extends PLModule
         $table_editor->describe('text','intitulé',true);
         $table_editor->apply($page, $action, $id);
     }
-    function handler_admin_formations(&$page, $action = 'list', $id = null) {
+    function handler_admin_education(&$page, $action = 'list', $id = null) {
         $page->setTitle('Administration - Formations');
         $page->assign('title', 'Gestion des formations');
-        $table_editor = new PLTableEditor('admin/formations','applis_def','id');
-        $table_editor->add_join_table('applis_ins','aid',true);
-        $table_editor->describe('text','intitulé',true);
-        $table_editor->describe('url','site web',false);
+        $table_editor = new PLTableEditor('admin/education', 'profile_education_enum', 'id');
+        $table_editor->add_join_table('profile_education', 'eduid', true);
+        $table_editor->add_join_table('profile_education_degree', 'eduid', true);
+        $table_editor->describe('name', 'intitulé', true);
+        $table_editor->describe('url', 'site web', false);
+        $table_editor->apply($page, $action, $id);
+    }
+    function handler_admin_education_field(&$page, $action = 'list', $id = null) {
+        $page->setTitle('Administration - Domaines de formation');
+        $page->assign('title', 'Gestion des domaines de formation');
+        $table_editor = new PLTableEditor('admin/education_field', 'profile_education_field_enum', 'id', true);
+        $table_editor->add_join_table('profile_education', 'fieldid', true);
+        $table_editor->describe('field', 'domaine', true);
+        $table_editor->apply($page, $action, $id);
+    }
+    function handler_admin_education_degree(&$page, $action = 'list', $id = null) {
+        $page->setTitle('Administration - Niveau de formation');
+        $page->assign('title', 'Gestion des niveau de formation');
+        $table_editor = new PLTableEditor('admin/education_degree', 'profile_education_degree_enum', 'id', true);
+        $table_editor->add_join_table('profile_education_degree', 'degreeid', true);
+        $table_editor->add_join_table('profile_education', 'degreeid', true);
+        $table_editor->describe('degree', 'niveau', true);
+        $table_editor->apply($page, $action, $id);
+    }
+    function handler_admin_education_degree_set(&$page, $action = 'list', $id = null) {
+        $page->setTitle('Administration - Correspondances formations - niveau de formation');
+        $page->assign('title', 'Gestion des correspondances formations - niveau de formation');
+        $table_editor = new PLTableEditor('admin/education_degree_set', 'profile_education_degree', 'eduid', true);
+        $table_editor->describe('eduid', 'formation', true);
+        $table_editor->describe('degreeid', 'niveau', true);
         $table_editor->apply($page, $action, $id);
     }
     function handler_admin_sections(&$page, $action = 'list', $id = null) {
@@ -809,6 +881,33 @@ class ProfileModule extends PLModule
         $table_editor->describe('label', 'intitulé', true);
         $table_editor->apply($page, $action, $id);
     }
+    function handler_admin_networking(&$page, $action = 'list', $id = null) {
+        $page->assign('xorg_title', 'Polytechnique.org - Administration - Networking');
+        $page->assign('title', 'Gestion des types de networking');
+        $table_editor = new PLTableEditor('admin/networking', 'profile_networking_enum', 'network_type');
+        $table_editor->describe('name', 'intitulé', true);
+        $table_editor->describe('icon', 'nom de l\'icône', false);
+        $table_editor->describe('filter', 'filtre', true);
+        $table_editor->describe('link', 'lien web', true);
+        $table_editor->apply($page, $action, $id);
+    }
+    function handler_admin_corps_enum(&$page, $action = 'list', $id = null) {
+        $page->setTitle('Administration - Corps');
+        $page->assign('title', 'Gestion des Corps');
+        $table_editor = new PLTableEditor('admin/corps_enum', 'profile_corps_enum', 'id');
+        $table_editor->describe('name', 'intitulé', true);
+        $table_editor->describe('abbreviation', 'abbréviation', true);
+        $table_editor->describe('still_exists', 'existe encore ?', true);
+        $table_editor->apply($page, $action, $id);
+    }
+    function handler_admin_corps_rank(&$page, $action = 'list', $id = null) {
+        $page->setTitle('Administration - Grade dans les Corps');
+        $page->assign('title', 'Gestion des grade dans les Corps');
+        $table_editor = new PLTableEditor('admin/corps_rank', 'profile_corps_rank_enum', 'id');
+        $table_editor->describe('name', 'intitulé', true);
+        $table_editor->describe('abbreviation', 'abbréviation', true);
+        $table_editor->apply($page, $action, $id);
+    }
     function handler_admin_medals(&$page, $action = 'list', $id = null) {
         $page->setTitle('Administration - Distinctions');
         $page->assign('title', 'Gestion des Distinctions');
index 780ee03..7317c5d 100644 (file)
@@ -23,34 +23,24 @@ class ProfileAddress extends ProfileGeoloc
 {
     private $bool;
     private $pub;
-    private $tel;
 
     public function __construct()
     {
         $this->bool = new ProfileBool();
         $this->pub  = new ProfilePub();
-        $this->tel  = new ProfileTel();
     }
 
-    private function cleanAddress(ProfilePage &$page, array &$address, &$success)
+    private function cleanAddress(ProfilePage &$page, $adrid, array &$address, &$success)
     {
         if (@$address['changed']) {
             $address['datemaj'] = time();
         }
         $success = true;
-        foreach ($address['tel'] as $t=>&$tel) {
-            if (@$tel['removed'] || !trim($tel['tel'])) {
-                unset($address['tel'][$t]);
-            } else {
-                $tel['pub'] = $this->pub->value($page, 'pub', $tel['pub'], $s);
-                $tel['tel'] = $this->tel->value($page, 'tel', $tel['tel'], $s);
-                if (!$s) {
-                    $tel['error'] = true;
-                    $success = false;
-                }
-            }
-            unset($tel['removed']);
+        if (!isset($address['tel'])) {
+            $address['tel'] = array();
         }
+        $profiletel  = new ProfilePhones('address', $adrid);
+        $address['tel'] = $profiletel->value($page, 'tel', $address['tel'], $s);
         $address['checked'] = $this->bool->value($page, 'checked', $address['checked'], $s);
         $address['secondaire'] = $this->bool->value($page, 'secondaire', $address['secondaire'], $s);
         $address['mail'] = $this->bool->value($page, 'mail', $address['mail'], $s);
@@ -94,7 +84,7 @@ class ProfileAddress extends ProfileGeoloc
             $ls = true;
             $this->geolocAddress($adr, $s);
             $ls = ($ls && $s);
-            $this->cleanAddress($page, $adr, $s);
+            $this->cleanAddress($page, $key, $adr, $s);
             $ls = ($ls && $s);
             if (!trim($adr['text'])) {
                 unset($value[$key]);
@@ -107,12 +97,12 @@ class ProfileAddress extends ProfileGeoloc
 
     private function saveTel($adrid, $telid, array &$tel)
     {
-        XDB::execute("INSERT INTO  tels (uid, adrid, telid,
-                                         tel_type, tel_pub, tel)
-                           VALUES  ({?}, {?}, {?},
+        XDB::execute("INSERT INTO  profile_phones (uid, link_type, link_id, tel_id, tel_type,
+                                              search_tel, display_tel, pub)
+                           VALUES  ({?}, 'address', {?}, {?}, {?},
                                     {?}, {?}, {?})",
-                    S::i('uid'), $adrid, $telid,
-                    $tel['type'], $tel['pub'], $tel['tel']);
+                    S::i('uid'), $adrid, $telid, $tel['type'],
+                    format_phone_number($tel['tel']), $tel['tel'], $tel['pub']);
     }
 
     private function saveAddress($adrid, array &$address)
@@ -137,20 +127,17 @@ class ProfileAddress extends ProfileGeoloc
                                               postcode, city, cityid,
                                               country, region, regiontxt,
                                               pub, datemaj, statut,
-                                              uid, adrid, glat, glng)
+                                              uid, adrid, glat, glng, comment)
                            VALUES  ({?}, {?}, {?},
                                     {?}, {?}, {?},
                                     {?}, {?}, {?},
                                     {?}, FROM_UNIXTIME({?}), {?},
-                                    {?}, {?}, {?}, {?})",
+                                    {?}, {?}, {?}, {?}, {?})",
                      $address['adr1'], $address['adr2'], $address['adr3'],
                      $address['postcode'], $address['city'], $address['cityid'],
                      $address['country'], $address['region'], $address['regiontxt'],
                      $address['pub'], $address['datemaj'], $flags,
-                     S::i('uid'), $adrid, $address['precise_lat'], $address['precise_lon']);
-        foreach ($address['tel'] as $telid=>&$tel) {
-            $this->saveTel($adrid, $telid, $tel);
-        }
+                     S::i('uid'), $adrid, $address['precise_lat'], $address['precise_lon'], $address['comment']);
     }
 
     public function save(ProfilePage &$page, $field, $value)
@@ -158,11 +145,13 @@ class ProfileAddress extends ProfileGeoloc
         XDB::execute("DELETE FROM  adresses
                             WHERE  uid = {?}",
                      S::i('uid'));
-        XDB::execute("DELETE FROM  tels
-                            WHERE  uid = {?}",
+        XDB::execute("DELETE FROM  profile_phones
+                            WHERE  uid = {?} AND link_type = 'address'",
                      S::i('uid'));
         foreach ($value as $adrid=>&$address) {
             $this->saveAddress($adrid, $address);
+            $profiletel = new ProfilePhones('address', $adrid);
+            $profiletel->saveTels('tel', $address['tel']);
         }
     }
 }
@@ -190,7 +179,8 @@ class ProfileAddresses extends ProfilePage
                                    FIND_IN_SET('courrier', a.statut) AS mail,
                                    FIND_IN_SET('temporaire', a.statut) AS temporary,
                                    FIND_IN_SET('active', a.statut) AS current,
-                                   a.glat AS precise_lat, a.glng AS precise_lon
+                                   a.glat AS precise_lat, a.glng AS precise_lon,
+                                   a.comment
                              FROM  adresses AS a
                        INNER JOIN  geoloc_pays AS gp ON(gp.a2 = a.country)
                             WHERE  uid = {?} AND NOT FIND_IN_SET('pro', statut)
@@ -202,10 +192,10 @@ class ProfileAddresses extends ProfilePage
             $this->values['addresses'] = $res->fetchAllAssoc();
         }
 
-        $res = XDB::iterator("SELECT  adrid, tel_type AS type, tel_pub AS pub, tel
-                                FROM  tels
-                               WHERE  uid = {?}
-                            ORDER BY  adrid",
+        $res = XDB::iterator("SELECT  link_id AS adrid, tel_type AS type, pub, display_tel AS tel, comment
+                                FROM  profile_phones
+                               WHERE  uid = {?} AND link_type = 'address'
+                            ORDER BY  link_id",
                              S::i('uid'));
         $i = 0;
         $adrNb = count($this->values['addresses']);
index 8227f36..7620240 100644 (file)
@@ -64,28 +64,194 @@ class ProfileNom implements ProfileSetting
     }
 }
 
-class ProfileAppli implements ProfileSetting
+class ProfileSearchName implements ProfileSetting
 {
+
+    public function __construct()
+    {
+    }
+
+    public function value(ProfilePage &$page, $field, $value, &$success)
+    {
+    }
+
+    public function save(ProfilePage &$page, $field, $new_value)
+    {
+    }
+}
+
+class ProfileEdu implements ProfileSetting
+{
+    public function __construct()
+    {
+    }
+
+    static function sortByGradYear($line1, $line2) {
+        $a = (int) $line1['grad_year'];
+        $b = (int) $line2['grad_year'];
+        if ($a == $b) {
+            return 0;
+        }
+        return ($a < $b) ? -1 : 1;
+    }
+
     public function value(ProfilePage &$page, $field, $value, &$success)
     {
         $success = true;
+        if (is_null($value) || !is_array($value)) {
+            $value = array();
+            $res = XDB::iterator("SELECT  eduid, degreeid, fieldid, grad_year, program
+                                    FROM  profile_education
+                                   WHERE  uid = {?} AND !FIND_IN_SET('primary', flags)
+                                ORDER BY  id",
+                                 S::v('uid'));
+            while($edu = $res->next()) {
+                $value[] = $edu;
+            }
+        } else {
+            $i = 0;
+            foreach ($value as $key=>&$edu) {
+                if (($edu['grad_year'] < 1921) || ($edu['grad_year'] > (date('Y') + 4))) {
+                    Platal::page()->trigError('L\'année d\'obtention du diplôme est mal renseignée, elle doit être du type : 2004.');
+                    $edu['error'] = true;
+                    $success = false;
+                }
+                if ($key != $i) {
+                    $value[$i] = $edu;
+                    unset($value[$key]);
+                }
+                $i++;
+            }
+            usort($value, array("ProfileEdu", "sortByGradYear"));
+        }
+        return $value;
+    }
+
+    public function save(ProfilePage &$page, $field, $value)
+    {
+        XDB::execute("DELETE FROM  profile_education
+                            WHERE  uid = {?} AND !FIND_IN_SET('primary', flags)",
+                     S::i('uid'));
+        foreach ($value as $eduid=>&$edu) {
+            if ($edu['eduid'] != '') {
+                XDB::execute("INSERT INTO  profile_education
+                                      SET  id = {?}, uid = {?}, eduid = {?}, degreeid = {?},
+                                           fieldid = {?}, grad_year = {?}, program = {?}",
+                             $eduid, S::i('uid'), $edu['eduid'], $edu['degreeid'],
+                             $edu['fieldid'], $edu['grad_year'], $edu['program']);
+            }
+        }
+    }
+
+}
+
+class ProfileEmailDirectory implements ProfileSetting
+{
+    public function __construct()
+    {
+    }
+
+    public function value(ProfilePage &$page, $field, $value, &$success)
+    {
+        $p = Platal::page();
+
+        $success = true;
+        if (!is_null($value)) {
+            $email_stripped = strtolower(trim($value));
+            if ((!isvalid_email($email_stripped)) && ($email_stripped) && ($page->values['email_directory'] == "new@example.org")) {
+                $p->assign('email_error', '1');
+                $p->assign('email_directory_error', $email_stripped);
+                $p->trigError('Adresse Email invalide');
+                $success = false;
+            } else {
+                $p->assign('email_error', '0');
+            }
+        }
+        return $value;
+    }
+
+    public function save(ProfilePage &$page, $field, $value)
+    {
+    }
+}
+
+class ProfileNetworking implements ProfileSetting
+{
+    private $email;
+    private $pub;
+    private $web;
+    private $number;
+
+    public function __construct()
+    {
+        $this->email  = new ProfileEmail();
+        $this->pub    = new ProfilePub();
+        $this->web    = new ProfileWeb();
+        $this->number = new ProfileNumber();
+    }
+
+    public function value(ProfilePage &$page, $field, $value, &$success)
+    {
         if (is_null($value)) {
-            return $page->values[$field];
+            $value = array();
+            $res = XDB::iterator("SELECT  n.address, n.network_type AS type, n.pub, m.name
+                                    FROM  profile_networking AS n
+                              INNER JOIN  profile_networking_enum AS m ON (n.network_type = m.network_type)
+                                   WHERE  n.uid = {?}",
+                                 S::i('uid'));
+            while($network = $res->next()) {
+                $value[] = $network;
+            }
+        }
+        if (!is_array($value)) {
+            $value = array();
+        }
+        $res = XDB::iterator("SELECT  filter, network_type AS type
+                                FROM  profile_networking_enum;");
+        $filters = array();
+        while($filter = $res->next()) {
+            $filters[$filter['type']] = $filter['filter'];
+        }
+        $success = true;
+        foreach($value as $i=>&$network) {
+            if (!trim($network['address'])) {
+                unset($value[$i]);
+            } else {
+                if (!isset($network['pub'])) {
+                    $network['pub'] = 'private';
+                }
+                $network['error'] = false;
+                $network['pub'] = $this->pub->value($page, 'pub', $network['pub'], $s);
+                $s = true;
+                if ($filters[$network['type']] == 'web') {
+                    $network['address'] = $this->web->value($page, 'address', $network['address'], $s);
+                } elseif ($filters[$network['type']] == 'email') {
+                    $network['address'] = $this->email->value($page, 'address', $network['address'], $s);
+                } elseif ($filters[$network['type']] == 'number') {
+                    $network['address'] = $this->number->value($page, 'address', $network['address'], $s);
+                }
+                if (!$s) {
+                    $success = false;
+                    $network['error'] = true;
+                }
+            }
         }
         return $value;
     }
 
-    public function save(ProfilePage &$page, $field, $new_value)
+    public function save(ProfilePage &$page, $field, $value)
     {
-        $index = ($field == 'appli1' ? 0 : 1);
-        if ($new_value['id'] > 0) {
-            XDB::execute("REPLACE INTO  applis_ins
-                                   SET  uid = {?}, aid = {?}, type = {?}, ordre = {?}",
-                         S::i('uid'), $new_value['id'], $new_value['type'], $index);
-        } else {
-            XDB::execute("DELETE FROM  applis_ins
-                                WHERE  uid = {?} AND ordre = {?}",
-                         S::i('uid'), $index);
+        XDB::execute("DELETE FROM profile_networking
+                            WHERE uid = {?}",
+                     S::i('uid'));
+        if (!count($value)) {
+            return;
+        }
+        $insert = array();
+        foreach ($value as $id=>$network) {
+            XDB::execute("INSERT INTO  profile_networking (uid, nwid, network_type, address, pub)
+                               VALUES  ({?}, {?}, {?}, {?}, {?})",
+                         S::i('uid'), $id, $network['type'], $network['address'], $network['pub']);
         }
     }
 }
@@ -97,56 +263,59 @@ class ProfileGeneral extends ProfilePage
     public function __construct(PlWizard &$wiz)
     {
         parent::__construct($wiz);
-        $this->settings['nom'] = $this->settings['prenom']
-                               = new ProfileNom();
+        $this->settings['nom']    = $this->settings['prenom']
+                                  = new ProfileNom();
         $this->settings['naissance'] = new ProfileDate();
-        $this->settings['mobile_pub']
-                                  = $this->settings['web_pub']
-                                  = $this->settings['freetext_pub']
+        $this->settings['freetext_pub']
                                   = $this->settings['photo_pub']
                                   = new ProfilePub();
         $this->settings['freetext']
                                   = $this->settings['nationalite']
+                                  = $this->settings['nationalite2']
+                                  = $this->settings['nationalite3']
                                   = $this->settings['nick']
+                                  = $this->settings['yourself']
+                                  = $this->settings['display_name']
+                                  = $this->settings['sort_name']
+                                  = $this->settings['tooltip_name']
+                                  = $this->settings['promo_display']
                                   = null;
         $this->settings['synchro_ax']
                                   = new ProfileBool();
-        $this->settings['mobile'] = new ProfileTel();
-        $this->settings['web'] = new ProfileWeb();
-        $this->settings['appli1']
-                                  = $this->settings['appli2']
-                                  = new ProfileAppli();
-        $this->watched= array('nom' => true, 'freetext' => true, 'mobile' => true, 'web' => true,
-                       'appli1' => true, 'appli2' => true, 'nationalite' => true, 'nick' => true);
+        $this->settings['email_directory']
+                                  = new ProfileEmail();
+        $this->settings['email_directory_new']
+                                  = new ProfileEmailDirectory();
+        $this->settings['networking'] = new ProfileNetworking();
+        $this->settings['tels']   = new ProfilePhones('user', 0);
+        $this->settings['edus']   = new ProfileEdu();
+        $this->watched= array('nom' => true, 'freetext' => true, 'tels' => true,
+                              'networking' => true, 'edus' => true,
+                              'nationalite' => true, 'nationalite2' => true,
+                              'nationalite3' => true, 'nick' => true);
     }
 
     protected function _fetchData()
     {
         // Checkout all data...
-        $res = XDB::query("SELECT  u.promo, u.promo_sortie, u.nom_usage, u.nationalite, u.naissance,
-                                   q.profile_mobile as mobile, q.profile_mobile_pub as mobile_pub,
-                                   q.profile_web as web, q.profile_web_pub as web_pub,
+        $res = XDB::query("SELECT  p.promo_display, e.entry_year AS entry_year, e.grad_year AS grad_year,
+                                   u.nom_usage, u.nationalite, u.nationalite2, u.nationalite3, u.naissance,
+                                   t.display_tel as mobile, t.pub as mobile_pub,
+                                   d.email_directory as email_directory,
                                    q.profile_freetext as freetext, q.profile_freetext_pub as freetext_pub,
                                    q.profile_nick as nick, q.profile_from_ax as synchro_ax, u.matricule_ax,
-                                   IF(a1.aid IS NULL, -1, a1.aid) as appli_id1, a1.type as appli_type1,
-                                   IF(a2.aid IS NULL, -1, a2.aid) as appli_id2, a2.type as appli_type2
-                             FROM  auth_user_md5   AS u
-                       INNER JOIN  auth_user_quick AS q  USING(user_id)
-                        LEFT JOIN  applis_ins      AS a1 ON(a1.uid = u.user_id and a1.ordre = 0)
-                        LEFT JOIN  applis_ins      AS a2 ON(a2.uid = u.user_id and a2.ordre = 1)
+                                   n.yourself, n.display AS display_name, n.sort AS sort_name,
+                                   n.tooltip AS tooltip_name
+                             FROM  auth_user_md5         AS u
+                       INNER JOIN  auth_user_quick       AS q ON (u.user_id = q.user_id)
+                       INNER JOIN  profile_names_display AS n ON (n.user_id = u.user_id)
+                       INNER JOIN  profile_display       AS p ON (p.uid = u.user_id)
+                       INNER JOIN  profile_education     AS e ON (e.uid = u.user_id AND FIND_IN_SET('primary', e.flags))
+                        LEFT JOIN  profile_phones        AS t ON (u.user_id = t.uid AND link_type = 'user')
+                        LEFT JOIN  profile_directory     AS d ON (d.uid = u.user_id)
                             WHERE  u.user_id = {?}", S::v('uid', -1));
         $this->values = $res->fetchOneAssoc();
 
-        // Reformat formation data
-        $this->values['appli1'] = array('id'    => $this->values['appli_id1'],
-                                        'type'  => $this->values['appli_type1']);
-        unset($this->values['appli_id1']);
-        unset($this->values['appli_type1']);
-        $this->values['appli2'] = array('id'    => $this->values['appli_id2'],
-                                        'type'  => $this->values['appli_type2']);
-        unset($this->values['appli_id2']);
-        unset($this->values['appli_type2']);
-
         // Retreive photo informations
         $res = XDB::query("SELECT  pub
                              FROM  photo
@@ -158,32 +327,76 @@ class ProfileGeneral extends ProfilePage
                             WHERE  type='photo' AND user_id = {?}",
                           S::v('uid'));
         $this->values['nouvellephoto'] = $res->fetchOneCell();
+
+        // Retreive search names info
+        $this->values['search_names'] = XDB::iterator("
+                              SELECT  sn.search_name, sn.name_type, sn.pub, sn.sn_id
+                                FROM  profile_names_search AS sn
+                               WHERE  sn.user_id = {?}
+                            ORDER BY  sn.name_type, search_score, search_name",
+                          S::v('uid'));
+
+        // Retreive phones
+        $res = XDB::iterator("SELECT t.display_tel AS tel, t.tel_type AS type, t.pub, t.comment
+                                FROM profile_phones AS t
+                               WHERE t.uid = {?} AND t.link_type = 'user'
+                            ORDER BY t.tel_id",
+                             S::v('uid'));
+        $this->values['tels'] = $res->fetchAllAssoc();
+
+        // Proposes choice for promo_display
+        if ($this->values['entry_year'] != $this->values['grad_year'] - 3) {
+            for ($i = $this->values['entry_year']; $i < $this->values['grad_year'] - 2; $i++) {
+                $this->values['promo_choice'][] = "X" . $i;
+            }
+        }
     }
 
     protected function _saveData()
     {
-        if ($this->changed['nationalite'] || $this->changed['nom'] || $this->changed['prenom']
-            || $this->changed['naissance']) {
-           XDB::execute("UPDATE  auth_user_md5
-                            SET  nationalite = {?}, nom={?}, prenom={?}, naissance={?}
-                          WHERE  user_id = {?}",
-                         $this->values['nationalite'], $this->values['nom'], $this->values['prenom'],
-                         preg_replace('@(\d{2})/(\d{2})/(\d{4})@', '\3-\2-\1', $this->values['naissance']),
-                         S::v('uid'));
+        if ($this->changed['nationalite'] || $this->changed['nationalite2'] || $this->changed['nationalite3']
+            || $this->changed['nom'] || $this->changed['prenom'] || $this->changed['naissance']) {
+            if ($this->values['nationalite3'] == "") {
+                $this->values['nationalite3'] = NULL;
+            }
+            if ($this->values['nationalite2'] == "") {
+                $this->values['nationalite2'] = $this->values['nationalite3'];
+                $this->values['nationalite3'] = NULL;
+            }
+            if ($this->values['nationalite'] == "") {
+                $this->values['nationalite']  = $this->values['nationalite2'];
+                $this->values['nationalite2'] = $this->values['nationalite3'];
+                $this->values['nationalite3'] = NULL;
+            }
+
+            XDB::execute("UPDATE  auth_user_md5
+                             SET  nationalite = {?}, nationalite2 = {?}, nationalite3 = {?}, nom={?}, prenom={?}, naissance={?}
+                           WHERE  user_id = {?}",
+                          $this->values['nationalite'], $this->values['nationalite2'], $this->values['nationalite3'],
+                          $this->values['nom'], $this->values['prenom'],
+                          preg_replace('@(\d{2})/(\d{2})/(\d{4})@', '\3-\2-\1', $this->values['naissance']),
+                          S::v('uid'));
         }
-        if ($this->changed['nick'] || $this->changed['mobile'] || $this->changed['mobile_pub']
-            || $this->changed['web'] || $this->changed['web_pub'] || $this->changed['freetext']
-            || $this->changed['freetext_pub'] || $this->changed['synchro_ax']) {
+        if ($this->changed['nick'] || $this->changed['freetext'] || $this->changed['freetext_pub'] || $this->changed['synchro_ax']) {
             XDB::execute("UPDATE  auth_user_quick
-                             SET  profile_nick= {?}, profile_mobile={?}, profile_mobile_pub={?}, 
-                                  profile_web={?}, profile_web_pub={?}, profile_freetext={?}, 
+                             SET  profile_nick= {?},
+                                  profile_freetext={?},
                                   profile_freetext_pub={?}, profile_from_ax = {?} 
                            WHERE  user_id = {?}", 
-                         $this->values['nick'], $this->values['mobile'], $this->values['mobile_pub'],
-                         $this->values['web'], $this->values['web_pub'],
+                         $this->values['nick'],
                          $this->values['freetext'], $this->values['freetext_pub'],
                          $this->values['synchro_ax'], S::v('uid'));
         }
+        if ($this->changed['email_directory']) {
+            $new_email = ($this->values['email_directory'] == "new@example.org") ?
+                $this->values['email_directory_new'] : $this->values['email_directory'];
+            if ($new_email == "") {
+                $new_email = NULL;
+            }
+            XDB::execute("REPLACE INTO  profile_directory (uid, email_directory)
+                                VALUES  ({?}, {?})",
+                         S::v('uid'), $new_email);
+        }
         if ($this->changed['nick']) {
             require_once('user.func.inc.php');
             user_reindex(S::v('uid'));
@@ -194,11 +407,44 @@ class ProfileGeneral extends ProfilePage
                            WHERE  uid = {?}",
                          $this->values['photo_pub'], S::v('uid'));
         }
+        if ($this->changed['yourself'] || $this->changed['sort_name'] ||
+            $this-> changed['display_name'] || $this->changed['tooltip_name']) {
+            XDB::execute("UPDATE  profile_names_display AS n
+                             SET  n.yourself = {?},
+                                  n.sort = {?}, ". // SET
+                                 "n.display = {?}, ". // SET
+                                 "n.tooltip = {?} ". // SET
+                          "WHERE  n.user_id = {?}",
+                         $this->values['yourself'],
+                         $this->values['sort_name'],
+                         $this->values['display_name'],
+                         $this->values['tooltip_name'],
+                         S::v('uid'));
+        }
+        if ($this->changed['promo_display']) {
+            XDB::execute("UPDATE  profile_display
+                             SET  promo_display = {?}
+                           WHERE  uid = {?}",
+                         $this->values['promo_display'], S::v('uid'));
+        }
     }
 
     public function _prepare(PlPage &$page, $id)
     {
-        require_once "applis.func.inc.php";
+        require_once "education.func.inc.php";
+
+        $res = XDB::iterator("SELECT  id, field
+                                FROM  profile_education_field_enum
+                            ORDER BY  field");
+        $page->assign('edu_fields', $res->fetchAllAssoc());
+
+        require_once "emails.combobox.inc.php";
+        fill_email_combobox($page);
+
+        $res = XDB::iterator("SELECT  nw.network_type AS type, nw.name
+                                FROM  profile_networking_enum AS nw
+                            ORDER BY  name");
+        $page->assign('network_list', $res->fetchAllAssoc());
     }
 }
 
index ad1e921..fce8920 100644 (file)
 class ProfileJob extends ProfileGeoloc
 {
     private $pub;
+    private $mail_new;
     private $mail;
     private $web;
-    private $tel;
     private $bool;
     private $checks;
 
     public function __construct()
     {
         $this->pub  = new ProfilePub();
-        $this->mail = new ProfileEmail();
+        $this->mail
+                    = $this->mail_new
+                    = new ProfileEmail();
         $this->web  = new ProfileWeb();
-        $this->tel  = new ProfileTel();
         $this->bool = new ProfileBool();
         $this->checks = array('web' => array('web'),
+                              'mail_new' => array('email_new'),
                               'mail' => array('email'),
-                              'tel' => array('tel', 'fax', 'mobile'),
-                              'pub' => array('pub', 'tel_pub', 'email_pub'));
+                              'pub' => array('pub', 'email_pub'));
     }
 
-    private function cleanJob(ProfilePage &$page, array &$job, &$success)
+    private function cleanJob(ProfilePage &$page,$jobid, array &$job, &$success)
     {
         $success = true;
         foreach ($this->checks as $obj=>&$fields) {
             $chk =& $this->$obj;
             foreach ($fields as $field) {
+                if ($field == "email_new") {
+                    if ($job['email'] == "new@example.org") {
+                        $job['email'] = $job[$field];
+                    }
+                    continue;
+                }
                 $job[$field] = $chk->value($page, $field, $job[$field], $s);
                 if (!$s) {
                     $success = false;
@@ -56,6 +63,11 @@ class ProfileJob extends ProfileGeoloc
         }
         $job['adr']['pub'] = $this->pub->value($page, 'adr_pub', @$job['adr']['pub'], $s);
         $job['adr']['checked'] = $this->bool->value($page, 'adr_checked', @$job['adr']['checked'], $s);
+        if (!isset($job['tel'])) {
+            $job['tel'] = array();
+        }
+        $profiletel = new ProfilePhones('pro', $jobid);
+        $job['tel'] = $profiletel->value($page, 'tel', $job['tel'], $s);
         unset($job['removed']);
         unset($job['new']);
         unset($job['adr']['changed']);
@@ -80,7 +92,7 @@ class ProfileJob extends ProfileGeoloc
             $ls = true;
             $this->geolocAddress($job['adr'], $s);
             $ls = ($ls && $s);
-            $this->cleanJob($page, $job, $s);
+            $this->cleanJob($page, $key, $job, $s);
             $ls = ($ls && $s);
             if (!$init) {
                 $success = ($success && $ls);
@@ -91,32 +103,42 @@ class ProfileJob extends ProfileGeoloc
 
     public function save(ProfilePage &$page, $field, $value)
     {
+        require_once('profil.func.inc.php');
         XDB::execute("DELETE FROM  entreprises
                             WHERE  uid = {?}",
                      S::i('uid'));
+        XDB::execute("DELETE FROM  profile_phones
+                            WHERE  uid = {?} AND link_type = 'pro'",
+                     S::i('uid'));
         $i = 0;
-        foreach ($value as &$job) {
+        foreach ($value as $jobid=>&$job) {
+            if ($job['email'] == "new@example.org") {
+                $job['email'] = $job['email_new'];
+            }
             XDB::execute("INSERT INTO  entreprises (uid, entrid, entreprise, secteur, ss_secteur,
                                                     fonction, poste, adr1, adr2, adr3, postcode,
                                                     city, cityid, country, region, regiontxt,
-                                                    tel, fax, mobile, email, web,
-                                                    pub, adr_pub, tel_pub, email_pub, flags,
+                                                    email, web,
+                                                    pub, adr_pub, email_pub, flags,
                                                     glat, glng)
                                VALUES  ({?}, {?}, {?}, {?}, {?},
                                         {?}, {?}, {?}, {?}, {?}, {?},
                                         {?}, {?}, {?}, {?}, {?},
-                                        {?}, {?}, {?}, {?}, {?},
-                                        {?}, {?}, {?}, {?}, {?},
+                                        {?}, {?},
+                                        {?}, {?}, {?}, {?},
                                         {?}, {?})",
-                         S::i('uid'), $i++, $job['name'], $job['secteur'], $job['ss_secteur'],
+                         S::i('uid'), $i, $job['name'], $job['secteur'], $job['ss_secteur'],
                          $job['fonction'], $job['poste'], $job['adr']['adr1'], $job['adr']['adr2'], $job['adr']['adr3'],
                          $job['adr']['postcode'],
                          $job['adr']['city'], $job['adr']['cityid'], $job['adr']['country'], $job['adr']['region'], 
                          $job['adr']['regiontxt'],
-                         $job['tel'], $job['fax'], $job['mobile'], $job['email'], $job['web'],
-                         $job['pub'], $job['adr']['pub'], $job['tel_pub'], $job['email_pub'],
+                         $job['email'], $job['web'],
+                         $job['pub'], $job['adr']['pub'], $job['email_pub'],
                          $job['adr']['checked'] ? 'geoloc' : '', $job['adr']['precise_lat'],
                          $job['adr']['precise_lon']);
+            $profiletel = new ProfilePhones('pro', $jobid);
+            $profiletel->saveTels('tel', $job['tel']);
+            $i++;
         }
     }
 }
@@ -129,8 +151,9 @@ class ProfileJobs extends ProfilePage
     {
         parent::__construct($wiz);
         $this->settings['cv'] = null;
+        $this->settings['corps'] = null;
         $this->settings['jobs'] = new ProfileJob();
-        $this->watched['cv'] = $this->watched['jobs'] = true;
+        $this->watched = array('cv' => true, 'jobs' => true, 'corps' => true);
     }
 
     protected function _fetchData()
@@ -142,26 +165,36 @@ class ProfileJobs extends ProfilePage
                           S::i('uid'));
         $this->values['cv'] = $res->fetchOneCell();
 
+        // Checkout the corps
+        $res = XDB::query("SELECT  original_corpsid AS original, current_corpsid AS current,
+                                   rankid AS rank, corps_pub AS pub
+                             FROM  profile_corps
+                            WHERE  uid = {?}",
+                          S::i('uid'));
+        $this->values['corps'] = $res->fetchOneAssoc();
+
         // Build the jobs tree
-        $res = XDB::iterRow("SELECT  e.entreprise, e.secteur, e.ss_secteur,
+        $res = XDB::iterRow("SELECT  e.entrid, e.entreprise, e.secteur, e.ss_secteur,
                                      e.fonction, e.poste, e.adr1, e.adr2, e.adr3,
                                      e.postcode, e.city, e.cityid, e.region, e.regiontxt,
                                      e.country, gp.pays, gp.display,
                                      FIND_IN_SET('geoloc', flags),
-                                     e.tel, e.fax, e.mobile, e.email, e.web, e.pub,
-                                     e.adr_pub, e.tel_pub, e.email_pub,
+                                     e.email, e.web, e.pub,
+                                     e.adr_pub, e.email_pub,
                                      e.glat AS precise_lat, e.glng AS precise_lon
                                FROM  entreprises AS e
                           LEFT JOIN  geoloc_pays AS gp ON(gp.a2 = e.country)
-                              WHERE  uid = {?} AND entreprise != ''
+                              WHERE  e.uid = {?} AND entreprise != ''
                            ORDER BY  entrid", S::i('uid'));
         $this->values['jobs'] = array();
-        while (list($name, $secteur, $ss_secteur, $fonction, $poste,
+        while (list($id, $name, $secteur, $ss_secteur, $fonction, $poste,
                     $adr1, $adr2, $adr3, $postcode, $city, $cityid,
                     $region, $regiontxt, $country, $countrytxt, $display,
-                    $checked, $tel, $fax, $mobile, $email, $web,
-                    $pub, $adr_pub, $tel_pub, $email_pub, $glat, $glng) = $res->next()) {
-            $this->values['jobs'][] = array('name'       => $name,
+                    $checked, $email, $web,
+                    $pub, $adr_pub, $email_pub, $glat, $glng
+                   ) = $res->next()) {
+            $this->values['jobs'][] = array('id'         => $id,
+                                            'name'       => $name,
                                             'secteur'    => $secteur,
                                             'ss_secteur' => $ss_secteur,
                                             'fonction'   => $fonction,
@@ -181,15 +214,42 @@ class ProfileJobs extends ProfilePage
                                                                   'checked'    => $checked,
                                                                   'precise_lat'=> $glat,
                                                                   'precise_lon'=> $glng),
-                                            'tel'        => $tel,
-                                            'fax'        => $fax,
-                                            'mobile'     => $mobile,
                                             'email'      => $email,
                                             'web'        => $web,
                                             'pub'        => $pub,
-                                            'tel_pub'    => $tel_pub,
                                             'email_pub'  => $email_pub);
         }
+
+        $res = XDB::iterator("SELECT  link_id AS jobid, tel_type AS type, pub, display_tel AS tel, comment
+                                FROM  profile_phones
+                               WHERE  uid = {?} AND link_type = 'pro'
+                            ORDER BY  link_id",
+                             S::i('uid'));
+        $i = 0;
+        $jobNb = count($this->values['jobs']);
+        while ($tel = $res->next()) {
+            $jobid = $tel['jobid'];
+            unset($tel['jobid']);
+            while ($i < $jobNb && $this->values['jobs'][$i]['id'] < $jobid) {
+                $i++;
+            }
+            if ($i >= $jobNb) {
+                break;
+            }
+            $job =& $this->values['jobs'][$i];
+            if (!isset($job['tel'])) {
+                $job['tel'] = array();
+            }
+            if ($job['id'] == $jobid) {
+                $job['tel'][] = $tel;
+            }
+        }
+        foreach ($this->values['jobs'] as $id=>&$job) {
+            if (!isset($job['tel'])) {
+                $job['tel'] = array();
+            }
+            unset($job['id']);
+        }
     }
 
     protected function _saveData()
@@ -200,15 +260,42 @@ class ProfileJobs extends ProfilePage
                            WHERE  user_id = {?}",
                          $this->values['cv'], S::i('uid'));
         }
+
+        if ($this->changed['corps']) {
+            XDB::execute("UPDATE  profile_corps
+                             SET  original_corpsid = {?}, current_corpsid = {?},
+                                  rankid = {?}, corps_pub = {?}
+                           WHERE  uid = {?}",
+                          $this->values['corps']['original'], $this->values['corps']['current'],
+                          $this->values['corps']['rank'], $this->values['corps']['pub'], S::i('uid'));
+        }
     }
 
     public function _prepare(PlPage &$page, $id)
     {
+        require_once "emails.combobox.inc.php";
+        fill_email_combobox($page);
+
         $page->assign('secteurs', XDB::iterator("SELECT  id, label
                                                    FROM  emploi_secteur"));
         $page->assign('fonctions', XDB::iterator("SELECT  id, fonction_fr, FIND_IN_SET('titre', flags) AS title
                                                     FROM  fonctions_def
                                                 ORDER BY  id"));
+
+        $res = XDB::iterator("SELECT  id, name
+                                FROM  profile_corps_enum
+                            ORDER BY  id = 1 DESC, name");
+        $page->assign('original_corps', $res->fetchAllAssoc());
+
+        $res = XDB::iterator("SELECT  id, name
+                                FROM  profile_corps_enum
+                               WHERE  still_exists = 1
+                            ORDER BY  id = 1 DESC, name");
+        $page->assign('current_corps', $res->fetchAllAssoc());
+
+        $res = XDB::iterator("SELECT  id, name
+                                FROM  profile_corps_rank_enum");
+        $page->assign('corps_rank', $res->fetchAllAssoc());
     }
 }
 
index 433947e..7c60a6d 100644 (file)
@@ -76,6 +76,22 @@ class ProfileEmail extends ProfileNoSave
     }
 }
 
+class ProfileNumber extends ProfileNoSave
+{
+    public function value(ProfilePage &$page, $field, $value, &$success)
+    {
+        if (is_null($value)) {
+            return isset($page->values[$field]) ? $page->values[$field] : S::v($field);
+        }
+        $value = trim($value);
+        $success = empty($value) || is_numeric($value);
+        if (!$success) {
+            Platal::page()->trigError('Numéro invalide');
+        }
+        return $value;
+    }
+}
+
 
 class ProfileTel extends ProfileNoSave
 {
@@ -84,12 +100,95 @@ class ProfileTel extends ProfileNoSave
         if (is_null($value)) {
             return isset($page->values[$field]) ? $page->values[$field] : S::v($field);
         }
-        $success = !preg_match('/[<>{}@&#~\/:;?,!§*_`\[\]|%$^=]/', $value, $matches);
+        require_once('profil.func.inc.php');
+        $value = format_phone_number($value);
+        if($value == '') {
+            $success = true;
+            return $value;
+        }
+        $value = format_display_number($value,$error);
+        $success = !$error;
         if (!$success) {
-            Platal::page()->trigError('Le numéro de téléphone contient un caractère interdit : ' . pl_entities($matches[0][0]));
+            Platal::page()->trigError('Le préfixe international du numéro de téléphone est inconnu. ');
+        }
+        return $value;
+    }
+}
+
+class ProfilePhones implements ProfileSetting
+{
+    private $tel;
+    private $pub;
+    protected $link_type;
+    protected $link_id;
+
+    public function __construct($type, $id)
+    {
+        $this->tel = new ProfileTel();
+        $this->pub = new ProfilePub();
+        $this->link_type = $type;
+        $this->link_id = $id;
+    }
+
+    public function value(ProfilePage &$page, $field, $value, &$success)
+    {
+        $success = true;
+        if (is_null($value)) {
+            $value = isset($page->values[$field]) ? $page->values[$field] : array();
+        }
+        if (!is_array($value)) {
+            $value = array();
+        }
+        foreach ($value as $key=>&$phone) {
+            if (@$phone['removed']) {
+                unset($value[$key]);
+            } else {
+                unset($phone['removed']);
+                $phone['pub'] = $this->pub->value($page, 'pub', $phone['pub'], $s);
+                $phone['tel'] = $this->tel->value($page, 'tel', $phone['tel'], $s);
+                if(!isset($phone['type']) || ($phone['type'] != 'fixed' && $phone['type'] != 'mobile' && $phone['type'] != 'fax')) {
+                    $phone['type'] = 'fixed';
+                    $s = false;
+                }
+                if (!$s) {
+                    $phone['error'] = true;
+                    $success = false;
+                }
+                if (!isset($phone['comment'])) {
+                    $phone['comment'] = '';
+                }
+            }
         }
         return $value;
     }
+
+    private function saveTel($telid, array &$phone)
+    {
+        if ($phone['tel'] != '') {
+            XDB::execute("INSERT INTO  profile_phones (uid, link_type, link_id, tel_id, tel_type,
+                                       search_tel, display_tel, pub, comment)
+                               VALUES  ({?}, {?}, {?}, {?}, {?},
+                                       {?}, {?}, {?}, {?})",
+                         S::i('uid'), $this->link_type, $this->link_id, $telid, $phone['type'],
+                        format_phone_number($phone['tel']), $phone['tel'], $phone['pub'], $phone['comment']);
+        }
+    }
+
+    public function save(ProfilePage &$page, $field, $value)
+    {
+        XDB::execute("DELETE FROM  profile_phones
+                            WHERE  uid = {?} AND link_type = {?} AND link_id = {?}",
+                            S::i('uid'), $this->link_type, $this->link_id);
+        $this->saveTels($field, $value);
+    }
+
+    //Only saves phones without a delete operation
+    public function saveTels($field, $value)
+    {
+        foreach ($value as $telid=>&$phone) {
+            $this->saveTel($telid, $phone);
+        }
+    }
 }
 
 class ProfilePub extends ProfileNoSave
index 2428b34..582de73 100644 (file)
@@ -24,11 +24,11 @@ class SearchModule extends PLModule
     function handlers()
     {
         return array(
-            'search'     => $this->make_hook('quick', AUTH_PUBLIC),
-            'search/adv' => $this->make_hook('advanced', AUTH_COOKIE),
+            'search'              => $this->make_hook('quick',          AUTH_PUBLIC),
+            'search/adv'          => $this->make_hook('advanced',       AUTH_COOKIE),
             'advanced_search.php' => $this->make_hook('redir_advanced', AUTH_PUBLIC),
-            'search/autocomplete' => $this->make_hook('autocomplete', AUTH_COOKIE, 'user', NO_AUTH),
-            'search/list' => $this->make_hook('list', AUTH_COOKIE, 'user', NO_AUTH),
+            'search/autocomplete' => $this->make_hook('autocomplete',   AUTH_COOKIE, 'user', NO_AUTH),
+            'search/list'         => $this->make_hook('list',           AUTH_COOKIE, 'user', NO_AUTH),
         );
     }
 
@@ -49,21 +49,24 @@ class SearchModule extends PLModule
             $school = Env::i('school');
         }
 
-        if (!is_null($school)) {
-            $sql = 'SELECT type FROM applis_def WHERE id=' . $school;
+        if ((!is_null($school)) && ($school != '')) {
+            $sql = 'SELECT  degreeid
+                      FROM  profile_education_degree
+                     WHERE  eduid=' . $school;
         } else {
-            $sql = 'DESCRIBE applis_def type';
+            $sql = 'SELECT  id
+                      FROM  profile_education_degree_enum
+                  ORDER BY  id';
         }
 
         $res = XDB::query($sql);
-        $row = $res->fetchOneRow();
-        if (!is_null($school)) {
-            $types = $row[0];
-        } else {
-            $types = explode('(',$row[1]);
-            $types = str_replace("'","",substr($types[1],0,-1));
-        }
-        Platal::page()->assign('choix_diplomas', explode(',',$types));
+        Platal::page()->assign('choix_diplomas', $res->fetchColumn());
+
+        $sql = 'SELECT  degree
+                  FROM  profile_education_degree_enum
+              ORDER BY  id';
+        $res = XDB::query($sql);
+        Platal::page()->assign('name_diplomas', $res->fetchColumn());
     }
 
     function handler_quick(&$page, $action = null, $subaction = null)
@@ -161,17 +164,19 @@ class SearchModule extends PLModule
             $this->form_prepare();
         } else {
             $textFields = array(
-                'country' => array('field' => 'a2', 'table' => 'geoloc_pays', 'text' => 'pays', 'exact' => false),
-                'fonction' => array('field' => 'id', 'table' => 'fonctions_def', 'text' => 'fonction_fr', 'exact' => true),
-                'secteur' => array('field' => 'id', 'table' => 'emploi_secteur', 'text' => 'label', 'exact' => false),
-                'nationalite' => array('field' => 'a2', 'table' => 'geoloc_pays', 'text' => 'nat', 'exact' => 'false'),
-                'binet' => array('field' => 'id', 'table' => 'binets_def', 'text' => 'text', 'exact' => false),
-                'groupex' => array('field' => 'id', 'table' => 'groupex.asso',
-                                   'text' => "(a.cat = 'GroupesX' OR a.cat = 'Institutions') AND pub = 'public' AND nom",
-                                   'exact' => false),
-                'section' => array('field' => 'id', 'table' => 'sections', 'text' => 'text', 'exact' => false),
-                'school' => array('field' => 'id', 'table' => 'applis_def', 'text' => 'text', 'exact' => false),
-                'city' => array('table' => 'geoloc_city', 'text' => 'name', 'exact' => false)
+                'country'         => array('field' => 'a2', 'table' => 'geoloc_pays', 'text' => 'pays', 'exact' => false),
+                'fonction'        => array('field' => 'id', 'table' => 'fonctions_def', 'text' => 'fonction_fr', 'exact' => true),
+                'secteur'         => array('field' => 'id', 'table' => 'emploi_secteur', 'text' => 'label', 'exact' => false),
+                'nationalite'     => array('field' => 'a2', 'table' => 'geoloc_pays', 'text' => 'nat', 'exact' => 'false'),
+                'binet'           => array('field' => 'id', 'table' => 'binets_def', 'text' => 'text', 'exact' => false),
+                'networking_type' => array('field' => 'network_type', 'table' => 'profile_networking_enum',
+                                           'text' => 'name', 'exact' => false),
+                'groupex'         => array('field' => 'id', 'table' => 'groupex.asso',
+                                           'text' => "(a.cat = 'GroupesX' OR a.cat = 'Institutions') AND pub = 'public' AND nom",
+                                           'exact' => false),
+                'section'         => array('field' => 'id', 'table' => 'sections', 'text' => 'text', 'exact' => false),
+                'school'          => array('field' => 'id', 'table' => 'profile_education_enum', 'text' => 'name', 'exact' => false),
+                'city'            => array('table' => 'geoloc_city', 'text' => 'name', 'exact' => false)
             );
             if (!Env::has('page')) {
                 S::logger()->log('search', 'adv=' . var_export($_GET, true));
@@ -251,11 +256,18 @@ class SearchModule extends PLModule
           case 'binetTxt':
             $db = '`binets_def` INNER JOIN
                    `binets_ins` ON(`binets_def`.`id` = `binets_ins`.`binet_id`)';
-            $field='`binets_def`.`text`';
+            $field = '`binets_def`.`text`';
             if (strlen($q) > 2)
                 $beginwith = false;
             $realid = '`binets_def`.`id`';
             break;
+          case 'networking_typeTxt':
+            $db = '`profile_networking_enum` INNER JOIN
+                   `profile_networking` ON(`profile_networking`.`network_type` = `profile_networking_enum`.`network_type`)';
+            $field = '`profile_networking_enum`.`name`';
+            $unique = 'uid';
+            $realid = '`profile_networking_enum`.`network_type`';
+            break;
           case 'city':
             $db = '`geoloc_city` INNER JOIN
                    `adresses` ON(`geoloc_city`.`id` = `adresses`.`cityid`)';
@@ -265,15 +277,15 @@ class SearchModule extends PLModule
           case 'countryTxt':
             $db = '`geoloc_pays` INNER JOIN
                    `adresses` ON(`geoloc_pays`.`a2` = `adresses`.`country`)';
-            $unique='`uid`';
+            $unique = '`uid`';
             $field = '`geoloc_pays`.`pays`';
             $field2 = '`geoloc_pays`.`country`';
-            $realid='`geoloc_pays`.`a2`';
+            $realid = '`geoloc_pays`.`a2`';
             break;
           case 'entreprise':
             $db = '`entreprises`';
             $field = '`entreprise`';
-            $unique='`uid`';
+            $unique = '`uid`';
             break;
           case 'firstname':
             $field = '`prenom`';
@@ -306,7 +318,9 @@ class SearchModule extends PLModule
             break;
           case 'nationaliteTxt':
             $db = '`geoloc_pays` INNER JOIN
-                   `auth_user_md5` ON(`geoloc_pays`.`a2` = `auth_user_md5`.`nationalite`)';
+                   `auth_user_md5` ON (`geoloc_pays`.`a2` = `auth_user_md5`.`nationalite` OR
+                                       `geoloc_pays`.`a2` = `auth_user_md5`.`nationalite2` OR
+                                       `geoloc_pays`.`a2` = `auth_user_md5`.`nationalite3`)';
             $field = 'IF(`geoloc_pays`.`nat`=\'\',
                                        `geoloc_pays`.`pays`,
                                        `geoloc_pays`.`nat`)';
@@ -320,14 +334,14 @@ class SearchModule extends PLModule
           case 'poste':
             $db = '`entreprises`';
             $field = '`poste`';
-            $unique='`uid`';
+            $unique = '`uid`';
             break;
           case 'schoolTxt':
-            $db = '`applis_def` INNER JOIN
-                   `applis_ins` ON(`applis_def`.`id` = `applis_ins`.`aid`)';
-            $field='`applis_def`.`text`';
-            $unique = '`uid`';
-            $realid = '`applis_def`.`id`';
+            $db = 'profile_education_enum INNER JOIN
+                   profile_education ON (profile_education_enum.id = profile_education.eduid)';
+            $field = 'profile_education_enum.name';
+            $unique = 'uid';
+            $realid = 'profile_education_enum.id';
             if (strlen($q) > 2)
                 $beginwith = false;
             break;
@@ -375,6 +389,7 @@ class SearchModule extends PLModule
                                 LIMIT  11',
                                $qsearch, $qsearch, $qsearch, $qsearch, $qsearch, $qsearch, $qsearch, $qsearch,
                                $qsearch, $qsearch, $qsearch, $qsearch, $qsearch, $qsearch, $qsearch, $qsearch);
+
         $nbResults = 0;
         $res = "";
         while ($result = $list->next()) {
@@ -408,6 +423,11 @@ class SearchModule extends PLModule
           case 'binet':
             $db = '`binets_def`';
             break;
+          case 'networking_type':
+            $db = '`profile_networking_enum`';
+            $field = '`name`';
+            $id = '`network_type`';
+            break;
           case 'country':
             $db = '`geoloc_pays`';
             $field = '`pays`';
@@ -430,7 +450,9 @@ class SearchModule extends PLModule
             break;
           case 'nationalite':
             $db = '`geoloc_pays` INNER JOIN
-                   `auth_user_md5` ON (`geoloc_pays`.`a2` = `auth_user_md5`.`nationalite`)';
+                   `auth_user_md5` ON (`geoloc_pays`.`a2` = `auth_user_md5`.`nationalite` OR
+                                       `geoloc_pays`.`a2` = `auth_user_md5`.`nationalite2` OR
+                                       `geoloc_pays`.`a2` = `auth_user_md5`.`nationalite3`)';
             $field = 'IF(`nat`=\'\', `pays`, `nat`)';
             $id = '`a2`';
             break;
@@ -443,7 +465,9 @@ class SearchModule extends PLModule
             }
             break;
           case 'school':
-            $db = '`applis_def`';
+            $db = 'profile_education_enum';
+            $field = 'name';
+            $id = 'id';
             $page->assign('onchange', 'changeSchool(this.value)');
             break;
           case 'section':
index 5f01c97..0fefe5d 100644 (file)
     u.perms IN (\'admin\',\'user\', \'disabled\') AS inscrit,
     u.perms != \'pending\' AS wasinscrit,
     FIND_IN_SET(\'femme\', u.flags) AS sexe,
-    a.alias AS forlife,
-    ad0.text AS app0text, ad0.url AS app0url, ai0.type AS app0type,
-    ad1.text AS app1text, ad1.url AS app1url, ai1.type AS app1type,
+    ede0.name AS eduname0, ede0.url AS eduurl0, edd0.degree AS edudegree0,
+    edu0.grad_year AS edugrad_year0, f0.field AS edufield0, edu0.program AS eduprogram0,
+    ede1.name AS eduname1, ede1.url AS eduurl1, edd1.degree AS edudegree1,
+    edu1.grad_year AS edugrad_year1, f1.field AS edufield1, edu1.program AS eduprogram1,
+    ede2.name AS eduname2, ede2.url AS eduurl2, edd2.degree AS edudegree2,
+    edu2.grad_year AS edugrad_year2, f2.field AS edufield2, edu2.program AS eduprogram2,
+    ede3.name AS eduname3, ede3.url AS eduurl3, edd3.degree AS edudegree3,
+    edu3.grad_year AS edugrad_year3, f3.field AS edufield3, edu3.program AS eduprogram3,
     es.label AS secteur, ef.fonction_fr AS fonction,
-    IF(n.nat=\'\',n.pays,n.nat) AS nat, n.a2 AS iso3166,
+    IF(n1.nat=\'\',n1.pays,n1.nat) AS nat1, n1.a2 AS iso3166_1,
+    IF(n2.nat=\'\',n2.pays,n2.nat) AS nat2, n2.a2 AS iso3166_2,
+    IF(n3.nat=\'\',n3.pays,n3.nat) AS nat3, n3.a2 AS iso3166_3,
     (COUNT(em.email) > 0 OR FIND_IN_SET("googleapps", u.mail_storage) > 0) AS actif,';
 // hide private information if not logged
 if (S::logged())
     $globals->search->result_fields .='
-        q.profile_web AS web,
-        q.profile_mobile AS mobile,
         q.profile_freetext AS freetext,
         adr.city, gp.pays AS countrytxt, gr.name AS region,
-        e.entreprise,';
+        e.entreprise,
+        nw.address AS networking_address,
+        nwe.name AS networking_name,';
 else
     $globals->search->result_fields .="
-    IF(q.profile_web_pub='public', q.profile_web, '') AS web,
-        IF(q.profile_mobile_pub='public', q.profile_mobile, '') AS mobile,
         IF(q.profile_freetext_pub='public', q.profile_freetext, '') AS freetext,
-        IF(adr.pub='public', adr.city, '') AS city,
-        IF(adr.pub='public', gp.pays, '') AS countrytxt,
-        IF(adr.pub='public', gr.name, '') AS region,
-        IF(e.pub='public', e.entreprise, '') AS entreprise,";
+        IF(adr.pub='public', adr.city, '')   AS city,
+        IF(adr.pub='public', gp.pays, '')    AS countrytxt,
+        IF(adr.pub='public', gr.name, '')    AS region,
+        IF(e.pub='public', e.entreprise, '') AS entreprise,
+        IF(nw.pub='public', nw.address, '')  AS networking_address,
+        IF(nw.pub='public', nwe.name, '')    AS networking_name,";
 @$globals->search->result_where_statement = '
-    LEFT JOIN  applis_ins     AS ai0 ON (u.user_id = ai0.uid AND ai0.ordre = 0)
-    LEFT JOIN  applis_def     AS ad0 ON (ad0.id = ai0.aid)
-    LEFT JOIN  applis_ins     AS ai1 ON (u.user_id = ai1.uid AND ai1.ordre = 1)
-    LEFT JOIN  applis_def     AS ad1 ON (ad1.id = ai1.aid)
-    LEFT JOIN  entreprises    AS e   ON (e.entrid = 0 AND e.uid = u.user_id)
-    LEFT JOIN  emploi_secteur AS es  ON (e.secteur = es.id)
-    LEFT JOIN  fonctions_def  AS ef  ON (e.fonction = ef.id)
-    LEFT JOIN  geoloc_pays    AS n   ON (u.nationalite = n.a2)
-    LEFT JOIN  adresses       AS adr ON (u.user_id = adr.uid AND FIND_IN_SET(\'active\',adr.statut))
-    LEFT JOIN  geoloc_pays    AS gp  ON (adr.country = gp.a2)
-    LEFT JOIN  geoloc_region  AS gr  ON (adr.country = gr.a2 AND adr.region = gr.region)
-    LEFT JOIN  emails         AS em  ON (em.uid = u.user_id AND em.flags = \'active\')';
+    LEFT JOIN  profile_education             AS edu0 ON (u.user_id = edu0.uid AND edu0.id = 0)
+    LEFT JOIN  profile_education_enum        AS ede0 ON (ede0.id = edu0.eduid)
+    LEFT JOIN  profile_education_degree_enum AS edd0 ON (edd0.id = edu0.degreeid)
+    LEFT JOIN  profile_education_field_enum  AS f0   ON (f0.id = edu0.fieldid)
+    LEFT JOIN  profile_education             AS edu1 ON (u.user_id = edu1.uid AND edu1.id = 1)
+    LEFT JOIN  profile_education_enum        AS ede1 ON (ede1.id = edu1.eduid)
+    LEFT JOIN  profile_education_degree_enum AS edd1 ON (edd1.id = edu1.degreeid)
+    LEFT JOIN  profile_education_field_enum  AS f1   ON (f1.id = edu1.fieldid)
+    LEFT JOIN  profile_education             AS edu2 ON (u.user_id = edu2.uid AND edu2.id = 2)
+    LEFT JOIN  profile_education_enum        AS ede2 ON (ede2.id = edu2.eduid)
+    LEFT JOIN  profile_education_degree_enum AS edd2 ON (edd2.id = edu2.degreeid)
+    LEFT JOIN  profile_education_field_enum  AS f2   ON (f2.id = edu2.fieldid)
+    LEFT JOIN  profile_education             AS edu3 ON (u.user_id = edu3.uid AND edu3.id = 3)
+    LEFT JOIN  profile_education_enum        AS ede3 ON (ede3.id = edu3.eduid)
+    LEFT JOIN  profile_education_degree_enum AS edd3 ON (edd3.id = edu3.degreeid)
+    LEFT JOIN  profile_education_field_enum  AS f3   ON (f3.id = edu3.fieldid)
+    LEFT JOIN  entreprises                   AS e    ON (e.entrid = 0 AND e.uid = u.user_id)
+    LEFT JOIN  emploi_secteur                AS es   ON (e.secteur = es.id)
+    LEFT JOIN  fonctions_def                 AS ef   ON (e.fonction = ef.id)
+    LEFT JOIN  geoloc_pays                   AS n1   ON (u.nationalite = n1.a2)
+    LEFT JOIN  geoloc_pays                   AS n2   ON (u.nationalite2 = n2.a2)
+    LEFT JOIN  geoloc_pays                   AS n3   ON (u.nationalite3 = n3.a2)
+    LEFT JOIN  adresses                      AS adr  ON (u.user_id = adr.uid AND FIND_IN_SET(\'active\',adr.statut))
+    LEFT JOIN  geoloc_pays                   AS gp   ON (adr.country = gp.a2)
+    LEFT JOIN  geoloc_region                 AS gr   ON (adr.country = gr.a2 AND adr.region = gr.region)
+    LEFT JOIN  emails                        AS em   ON (em.uid = u.user_id AND em.flags = \'active\')
+    LEFT JOIN  profile_networking            AS nw   ON (nw.uid = u.user_id)
+    LEFT JOIN  profile_networking_enum       AS nwe  ON (nwe.network_type = nw.network_type)';
 
 // }}}
 // {{{ class ThrowError
@@ -209,6 +232,8 @@ class QuickSearch extends SField
     /** stores admin searches */
     var $email;
     var $ip;
+    /** stores phone number */
+    var $phone;
 
     // }}}
     // {{{ constructor
@@ -227,7 +252,7 @@ class QuickSearch extends SField
 
     function isempty()
     {
-        return empty($this->strings) && empty($this->ranges) && empty($this->email) && empty($this->ip);
+        return empty($this->strings) && empty($this->ranges) && empty($this->email) && empty($this->ip) && empty($this->phone);
     }
 
     // }}}
@@ -265,6 +290,12 @@ class QuickSearch extends SField
         foreach ($ranges as $r) {
             if (preg_match('!^([<>]\d{4}|\d{4}(-\d{4})?)$!', $r)) $this->ranges[] = $r;
         }
+
+        $t = preg_replace('!(\d{4}-\d{4}|>\d{4}|<\d{4})!', '', $s);
+        $t = preg_replace('![<>\- ]!', '', $t);
+        if (strlen($t) > 4) {
+            $this->phone = $t;
+        }
     }
 
     // }}}
@@ -310,6 +341,11 @@ class QuickSearch extends SField
             $ip = ip_to_uint($this->ip);
             $where[] = "( ls.ip = $ip OR ls.forward_ip = $ip ) AND ls.suid = 0";
         }
+        if (!empty($this->phone)){
+            require_once("profil.func.inc.php");
+            $phone = format_phone_number($this->phone) . "%";
+            $where[] = 't.search_tel LIKE ' . XDB::escape($phone);
+        }
 
         return join(" AND ", $where);
     }
@@ -335,6 +371,13 @@ class QuickSearch extends SField
         if (!empty($this->ip)) {
             $join .= "INNER JOIN logger.sessions AS ls ON (ls.uid = u.user_id)\n";
         }
+        if (!empty($this->phone)) {
+            if (!S::logged()) {
+                $join .= "INNER JOIN profile_phones AS t ON (t.uid = u.user_id AND t.pub = 'public')";
+            } else {
+                $join .= "INNER JOIN profile_phones AS t ON (t.uid = u.user_id)";
+            }
+        }
         return $join;
     }
     // }}}
@@ -492,6 +535,39 @@ class RefSField extends SField
 // }}}
 
 // {{{ class RefSFieldMultipleTable
+class PhoneSField extends RefSField
+{
+    function PhoneSField($_fieldFormName, $_fieldDbName='', $_refTable, $_refAlias, $_refCondition)
+    {
+        $this->RefSField($_fieldFormName, $_fieldDbName, $_refTable, $_refAlias, $_refCondition, true);
+    }
+
+    function get_request()
+    {
+        require_once("profil.func.inc.php");
+        $this->value = trim(Env::v($this->fieldFormName));
+        $this->value = format_phone_number($this->value);
+    }
+
+    function compare()
+    {
+        return " LIKE '" . addslashes($this->value) . "%'";
+    }
+}
+
+class IndexSField extends RefSField
+{
+    function IndexSField($_fieldFormName, $_fieldDbName='', $_refTable, $_refAlias, $_refCondition)
+    {
+        $this->RefSField($_fieldFormName, $_fieldDbName, $_refTable, $_refAlias, $_refCondition, true);
+    }
+
+    function get_request()
+    {
+        $this->value = trim(Env::v($this->fieldFormName));
+    }
+}
+
 class MapSField extends RefSField
 {
     var $mapId;
index 985a398..e988faf 100644 (file)
@@ -23,7 +23,7 @@ require_once dirname(__FILE__).'/classes.inc.php';
 
 // {{{ function advancedSearchFromInput
 function getadr_join($table) {
-    return 'u.user_id='.$table.'.uid'.(Env::v('only_current',false)?' AND FIND_IN_SET(\'active\','.$table.'.statut)':'');
+    return 'u.user_id = ' . $table . '.uid' . (Env::v('only_current', false) ? ' AND FIND_IN_SET(\'active\', ' . $table . '.statut)' : '');
 }
 function advancedSearchFromInput()
 {
@@ -31,55 +31,66 @@ function advancedSearchFromInput()
         $nameField      = new RefWithSoundexSField('name',array('rn.nom1_soundex','rn.nom2_soundex','rn.nom3_soundex'),'recherche_soundex','rn','u.matricule = rn.matricule');
         $firstnameField = new RefWithSoundexSField('firstname',array('rp.prenom1_soundex','rp.prenom2_soundex'),'recherche_soundex','rp','u.matricule = rp.matricule');
     } else {
-        $nameField      = new NameSField('name',array('u.nom','u.nom_usage'),'');
-        $firstnameField = new StringSField('firstname',array('u.prenom'),'');
+        $nameField      = new NameSField('name', array('u.nom','u.nom_usage'), '');
+        $firstnameField = new StringSField('firstname', array('u.prenom'), '');
     }
-    $nicknameField   = new StringSField('nickname',array('q.profile_nick'),'');
+    $nicknameField      = new StringSField('nickname', array('q.profile_nick'), '');
 
-    $promo1Field     = new PromoSField('promo1','egal1',array('u.promo'),'');
-    $promo2Field     = new PromoSField('promo2','egal2',array('u.promo'),'');
-    $womanField      = new RefSField('woman',array('FIND_IN_SET(\'femme\',u.flags)+1'),'','','');
-    $subscriberField = new RefSField('subscriber',array('!(u.perms IN (\'admin\',\'user\'))+1'),'','','');
-    $aliveField      = new RefSField('alive',array('(u.deces!=0)+1'),'','','');
+    $promo1Field        = new PromoSField('promo1', 'egal1', array('u.promo'), '');
+    $promo2Field        = new PromoSField('promo2', 'egal2', array('u.promo'), '');
+    $womanField         = new RefSField('woman', array('FIND_IN_SET(\'femme\', u.flags) + 1'), '', '', '');
+    $subscriberField    = new RefSField('subscriber', array('!(u.perms IN (\'admin\', \'user\')) + 1'), '', '', '');
+    $aliveField         = new RefSField('alive', array('(u.deces != 0) + 1'), '', '', '');
     if (Env::v('only_referent') == 'on') {
-        $referentField = new RefSField('only_referent', array('"on"'), 'mentor', 'mt', 'mt.expertise != "" AND mt.uid=u.user_id');
+        $referentField  = new RefSField('only_referent', array('"on"'), 'mentor', 'mt', 'mt.expertise != "" AND mt.uid = u.user_id');
     } else {
-        $referentField = null;
+        $referentField  = null;
     }
 
     if (!Env::i('cityid')) {
-        $townField  = new RefSField('city',array('ac.city', 'ac.postcode'),'adresses','ac',getadr_join('ac'),false);
+        $townField      = new RefSField('city', array('ac.city', 'ac.postcode'), 'adresses', 'ac', getadr_join('ac'), false);
     } else {
-        $townField  = new RefSField('cityid',array('av.cityid', 'av.postcode'),'adresses','av',getadr_join('av'));
+        $townField      = new RefSField('cityid', array('av.cityid', 'av.postcode'), 'adresses', 'av', getadr_join('av'));
     }
-    $countryField   = new RefSField('country',array('ap.country'),'adresses','ap',getadr_join('ap'));
-    $regionField    = new RefSField('region',array('ar.region'),'adresses','ar',getadr_join('ar'));
-    $mapField       = new MapSField('mapid', array('sgcim.map_id'), array('adresses','geoloc_city_in_maps'), array('amp','sgcim'), array(getadr_join('amp'), 'amp.cityid = sgcim.city_id'));
+    $countryField       = new RefSField('country', array('ap.country'), 'adresses', 'ap', getadr_join('ap'));
+    $regionField        = new RefSField('region',array('ar.region'), 'adresses', 'ar', getadr_join('ar'));
+    $mapField           = new MapSField('mapid',  array('sgcim.map_id'), array('adresses', 'geoloc_city_in_maps'),
+                                        array('amp', 'sgcim'), array(getadr_join('amp'), 'amp.cityid = sgcim.city_id'));
 
-    $entrepriseField = new RefSField('entreprise',array('ee.entreprise'),'entreprises','ee','u.user_id=ee.uid',false);
-    $posteField      = new RefSField('poste',array('ep.poste'),'entreprises','ep','u.user_id=ep.uid', false);
-    $fonctionField = new RefSField('fonction',array('en.fonction'),'entreprises','en','u.user_id=en.uid');
-    $secteurField    = new RefSField('secteur',array('fm.secteur'),'entreprises','fm','u.user_id=fm.uid');
-    $cvField         = new RefSField('cv',array('u.cv'),'','','',false);
+    $entrepriseField    = new RefSField('entreprise', array('ee.entreprise'), 'entreprises', 'ee', 'u.user_id = ee.uid', false);
+    $posteField         = new RefSField('poste', array('ep.poste'), 'entreprises', 'ep', 'u.user_id = ep.uid', false);
+    $fonctionField      = new RefSField('fonction', array('en.fonction'), 'entreprises', 'en', 'u.user_id = en.uid');
+    $secteurField       = new RefSField('secteur', array('fm.secteur'), 'entreprises', 'fm', 'u.user_id = fm.uid');
+    $cvField            = new RefSField('cv', array('u.cv'), '', '', '', false);
 
-    $natField        = new RefSField('nationalite',array('u.nationalite'),'','','');
-    $binetField      = new RefSField('binet',array('b.binet_id'),'binets_ins','b','u.user_id=b.user_id');
-    $groupexField    = new RefSField('groupex',array('g.id'),array('groupex.asso', 'groupex.membres'),array('g', 'gm'),
-                                     array("(g.cat = 'GroupesX' OR g.cat = 'Institutions') AND g.pub = 'public'",
-                                           'gm.asso_id = g.id AND u.user_id=gm.uid'));
-    $sectionField    = new RefSField('section',array('u.section'),'','','');
-    $schoolField     = new RefSField('school',array('as.aid'),'applis_ins','`as`','u.user_id=as.uid');
-    $diplomaField    = new RefSField('diploma',array('ad.type'),'applis_ins','ad','u.user_id=ad.uid');
+    $natField           = new RefSField('nationalite', array('u.nationalite', 'u.nationalite2', 'u.nationalite3'), '', '', '');
+    $binetField         = new RefSField('binet', array('b.binet_id'), 'binets_ins', 'b', 'u.user_id=b.user_id');
+    $groupexField       = new RefSField('groupex', array('g.id'), array('groupex.asso', 'groupex.membres'), array('g', 'gm'),
+                                        array("(g.cat = 'GroupesX' OR g.cat = 'Institutions') AND g.pub = 'public'",
+                                              'gm.asso_id = g.id AND u.user_id = gm.uid'));
+    $sectionField       = new RefSField('section', array('u.section'), '', '', '');
+    $schoolField        = new RefSField('school', array('edu.eduid'), 'profile_education', 'edu', 'u.user_id = edu.uid');
+    $diplomaField       = new RefSField('diploma', array('edd.degreeid'), 'profile_education', 'edd', 'u.user_id = edd.uid');
 
-    $freeField       = new RefSField('free',array('q.profile_freetext'),'','','',false);
+    $freeField          = new RefSField('free', array('q.profile_freetext'), '', '', '', false);
 
+    $nwAddressField     = new RefSField('networking_address', array('nw.address'), 'profile_networking', 'nw', 'nw.uid=u.user_id', false);
+    if (Env::v('networking_address') == '') {
+        $nwTypeField    = new IndexSField('networking_type', array('nwe.network_type'), array('profile_networking', 'profile_networking_enum'),
+                                          array('nw', 'nwe'), array('nw.uid = u.user_id', 'nwe.network_type = nw.network_type'));
+    } else {
+        $nwTypeField    = new IndexSField('networking_type',
+                                          array('nwe.network_type'), 'profile_networking_enum', 'nwe', 'nwe.network_type = nw.network_type');
+    }
+    $nwPhoneField       = new PhoneSField('phone_number', array('t.search_tel'), 'profile_phones', 't', 't.uid = u.user_id');
     return array(
                 $nameField, $firstnameField, $nicknameField, $promo1Field,
-                $promo2Field, $womanField, $subscriberField, $aliveField, $referentField,
+                $promo2Field, $womanField, $subscriberField, $aliveField,
                 $townField, $countryField, $regionField, $mapField, $entrepriseField,
                 $posteField, $secteurField, $cvField, $natField, $binetField,
                 $groupexField, $sectionField, $schoolField, $diplomaField,
-                $freeField, $fonctionField);
+                $freeField, $fonctionField, $nwAddressField, $nwTypeField,
+                $nwPhoneField, $referentField);
 }
 
 // }}}
index 07ce7c3..c699589 100644 (file)
@@ -40,12 +40,9 @@ function smarty_function_display_address($param, &$smarty)
 {
     require_once('geoloc.inc.php');
     $txtad = get_address_text($param['adr']);
-    if (!$txtad &&
-        !$param['adr']['tels'] && !count($param['adr']['tels']) &&
-        !$param['adr']['tel'] &&
-        !$param['adr']['fax'] &&
-        !$param['adr']['mobile']) return "";
-
+    if (!$txtad && !$param['adr']['tels'] && !count($param['adr']['tels'])) {
+        return "";
+    }
 
     $lines = explode("\n", $txtad);
     $idt   = array_shift($lines);
@@ -61,29 +58,37 @@ function smarty_function_display_address($param, &$smarty)
     $map = "<a href=\"http://maps.google.fr/?q="
         .   urlencode(implode(", ", $lines) . " ($idt)")
         . "\"><img src=\"images/icons/map.gif\" alt=\"Google Maps\" title=\"Carte\"/></a>";
+    $comment = "";
+    if ($param['adr']['comment'] != "")
+    {
+        $commentHtml = str_replace(array('&', '"'), array('&amp;', '&quot;'), $param['adr']['comment']);
+        $commentJs = str_replace(array('\\', '\''), array('\\\\', '\\\''), $commentHtml);
+        $comment = "<img style=\"margin-left: 5px;\" src=\"images/icons/comments.gif\""
+            . " onmouseover=\"return overlib('"
+            . $commentJs
+            . "',WIDTH,250);\""
+            . " onmouseout=\"nd();\""
+            . " alt=\"Commentaire\" title=\""
+            . $commentHtml
+            . "\"/>";
+    }
     if ($restore) {
         array_unshift($lines, $idt);
     }
     if ($param['titre'])
     {
         if ($param['titre_div'])
-            $txthtml .= "<div class='titre'>".pl_entity_decode($param['titre'])."&nbsp;".$map."</div>\n";
+            $txthtml .= "<div class='titre'>".pl_entity_decode($param['titre'])."&nbsp;".$map.$comment."</div>\n";
         else
-            $txthtml .= "<em>".pl_entity_decode($param['titre'])."&nbsp;</em>".$map."<br />\n";
+            $txthtml .= "<em>".pl_entity_decode($param['titre'])."&nbsp;</em>".$map.$comment."<br />\n";
     }
     foreach ($lines as $line)
     {
         $txthtml .= "<strong>".$line."</strong><br/>\n";
     }
-    if ($param['adr']['tel'])
-        $txthtml .= "<div>\n<em>Tél : </em>\n<strong>".$param['adr']['tel']."</strong>\n</div>\n";
-    if ($param['adr']['fax'])
-        $txthtml .= "<div>\n<em>Fax : </em>\n<strong>".$param['adr']['fax']."</strong>\n</div>\n";
-    if ($param['adr']['mobile'])
-        $txthtml .= "<div>\n<em>Tél : </em>\n<strong>".$param['adr']['mobile']."</strong>\n</div>\n";
-    if ($param['adr']['tels'] && count($param['adr']['tels'])) {
-        foreach ($param['adr']['tels'] as $tel)
-            $txthtml .= "<div>\n<em>".$tel['tel_type']."&nbsp;: </em>\n<strong>".$tel['tel']."</strong>\n</div>\n";
+    if(isset($param['adr']['tels'])) {
+        require_once('function.display_phones.php');
+        $txthtml .= smarty_function_display_phones($param['adr'],$smarty);
     }
     if (!$param['nodiv']) {
         $pos = $param['pos'] ? " style='float: " . $param['pos'] . "'" : '';
diff --git a/plugins/function.display_phones.php b/plugins/function.display_phones.php
new file mode 100644 (file)
index 0000000..db21384
--- /dev/null
@@ -0,0 +1,61 @@
+<?php
+/***************************************************************************
+ *  Copyright (C) 2003-2008 Polytechnique.org                              *
+ *  http://opensource.polytechnique.org/                                   *
+ *                                                                         *
+ *  This program is free software; you can redistribute it and/or modify   *
+ *  it under the terms of the GNU General Public License as published by   *
+ *  the Free Software Foundation; either version 2 of the License, or      *
+ *  (at your option) any later version.                                    *
+ *                                                                         *
+ *  This program is distributed in the hope that it will be useful,        *
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of         *
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
+ *  GNU General Public License for more details.                           *
+ *                                                                         *
+ *  You should have received a copy of the GNU General Public License      *
+ *  along with this program; if not, write to the Free Software            *
+ *  Foundation, Inc.,                                                      *
+ *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                *
+ ***************************************************************************/
+
+function smarty_function_display_phones($param, &$smarty)
+{
+    $txthtml = "";
+    if (count($param['tels'])) {
+        foreach ($param['tels'] as $tel) {
+            switch ($tel['tel_type']) {
+            case 'fixed':
+                $tel_type = 'Tél';
+                break;
+            case 'fax':
+                $tel_type = 'Fax';
+                break;
+            case 'mobile':
+                $tel_type = 'Mob';
+                break;
+            default:
+                $tel_type = $tel['tel_type'];
+            }
+            $txthtml .= "<div>\n<em>" . $tel_type . "&nbsp;: </em>\n<strong>" . $tel['tel'] . "</strong>\n";
+            $comment = "";
+            if ($tel['comment'] != "") {
+                $commentHtml = str_replace(array('&', '"'), array('&amp;', '&quot;'), $tel['comment']);
+                $commentJs = str_replace(array('\\', '\''), array('\\\\', '\\\''), $commentHtml);
+                $txthtml .= "<img style=\"margin-left: 5px;\" src=\"images/icons/comments.gif\""
+                            . " onmouseover=\"return overlib('"
+                            . $commentJs
+                            . "',WIDTH,250);\""
+                            . " onmouseout=\"nd();\""
+                            . " alt=\"Commentaire\" title=\""
+                            . $commentHtml
+                            . "\"/>\n";
+            }
+            $txthtml .= "</div>\n";
+        }
+    }
+    return $txthtml;
+}
+
+// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
+?>
index e17b738..9e7edd5 100644 (file)
  ***************************************************************************/
 
 
-function select_nat($valeur,$pad=false) {
-    $sql = "SELECT a2 AS id,IF(nat='',pays,nat) AS text FROM geoloc_pays WHERE nat IS NOT NULL ORDER BY text";
+function select_nat($valeur, $pad=false) {
+    $sql = "SELECT a2 AS id, IF(nat='', pays, nat) AS text FROM geoloc_pays WHERE nat IS NOT NULL ORDER BY text";
     $res = XDB::iterRow($sql);
     $sel = ' selected="selected"';
 
     // on ajoute une entree vide si $pad est vrai
     $html = "";
     if ($pad) {
-       $html.= '<option value="0"'.($valeur==0?$sel:"")."></option>\n";
+             $html .= sprintf("<option value=\"\"%s></option>\n", ($valeur ? $sel : ""));
     }
-    while (list($my_id,$my_text) = $res->next()) {
-       $html .= sprintf("<option value=\"%s\" %s>%s</option>\n",$my_id,($valeur==$my_id?$sel:""),$my_text);
+    while (list($my_id, $my_text) = $res->next()) {
+        $html .= sprintf("<option value=\"%s\"%s>%s</option>\n", $my_id, ($valeur==$my_id ? $sel : ""), $my_text);
     }
+
     return $html;
 }
 
 function smarty_function_select_nat($params, &$smarty) {
-    if(empty($params['pad']) || !($params['pad']))
-       $pad = false;
-    else
-       $pad = true;
+    if (empty($params['pad']) || !($params['pad'])) {
+             $pad = false;
+    } else {
+             $pad = true;
+    }
+
     return select_nat($params['valeur'], $pad);
 }
 
index f6b59cc..7a793c7 100644 (file)
   <tr class="impair">
     <td>
       <strong>Champs profil&nbsp;:</strong>&nbsp;&nbsp;
-      <a href="admin/formations">Formations</a>
+      <a href="admin/education">Formations</a>
+      &nbsp;&nbsp;|&nbsp;&nbsp;
+      <a href="admin/education_field">Domaines de formation</a>
+      &nbsp;&nbsp;|&nbsp;&nbsp;
+      <a href="admin/education_degree">Niveau de formation</a>
+      &nbsp;&nbsp;|&nbsp;&nbsp;
+      <a href="admin/education_degree_set">Niveau par formation</a>
       &nbsp;&nbsp;|&nbsp;&nbsp;
       <a href="admin/binets">Binets</a>
       &nbsp;&nbsp;|&nbsp;&nbsp;
       <a href="admin/ss_secteurs">Sous-secteurs</a>
       &nbsp;&nbsp;|&nbsp;&nbsp;
       <a href="admin/fonctions">Fonctions</a>
+      &nbsp;&nbsp;|&nbsp;&nbsp;
+      <a href="admin/networking">Networking</a>
+      &nbsp;&nbsp;|&nbsp;&nbsp;
+      <a href="admin/corps_enum">Corps</a>
+      &nbsp;&nbsp;|&nbsp;&nbsp;
+      <a href="admin/corps_rank">Grade</a>
     </td>
   </tr>
   <tr class="pair">
       <a href="admin/geoloc">Synchro</a>
       &nbsp;&nbsp;|&nbsp;&nbsp;
       <a href="admin/geoloc/dynamap">Dynamap</a>
+      &nbsp;&nbsp;|&nbsp;&nbsp;
+      <a href="admin/geoloc/country">Pays</a>
     </td>
   </tr>
   <tr class="impair">
diff --git a/templates/core/vcard.tpl b/templates/core/vcard.tpl
new file mode 100644 (file)
index 0000000..0d9cab5
--- /dev/null
@@ -0,0 +1,99 @@
+{**************************************************************************}
+{*                                                                        *}
+{*  Copyright (C) 2003-2008 Polytechnique.org                             *}
+{*  http://opensource.polytechnique.org/                                  *}
+{*                                                                        *}
+{*  This program is free software; you can redistribute it and/or modify  *}
+{*  it under the terms of the GNU General Public License as published by  *}
+{*  the Free Software Foundation; either version 2 of the License, or     *}
+{*  (at your option) any later version.                                   *}
+{*                                                                        *}
+{*  This program is distributed in the hope that it will be useful,       *}
+{*  but WITHOUT ANY WARRANTY; without even the implied warranty of        *}
+{*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *}
+{*  GNU General Public License for more details.                          *}
+{*                                                                        *}
+{*  You should have received a copy of the GNU General Public License     *}
+{*  along with this program; if not, write to the Free Software           *}
+{*  Foundation, Inc.,                                                     *}
+{*  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA               *}
+{*                                                                        *}
+{**************************************************************************}
+{iterate from=$users item=vcard}
+BEGIN:VCARD
+VERSION:3.0
+{if $vcard.nom_usage}
+FN:{$vcard.prenom|vcard_enc} {$vcard.nom_usage|vcard_enc} ({$vcard.nom|vcard_enc})
+{else}
+FN:{$vcard.prenom|vcard_enc} {$vcard.nom|vcard_enc}
+{/if}
+N:{$vcard.nom|vcard_enc};{$vcard.prenom|vcard_enc};{$vcard.nom_usage|vcard_enc};;
+{if $vcard.nickname}
+NICKNAME:{$vcard.nickname|vcard_enc}
+{/if}
+EMAIL;TYPE=internet,pref:{$vcard.bestalias}@{#globals.mail.domain#}
+EMAIL;TYPE=internet:{$vcard.bestalias}@{#globals.mail.domain2#}
+{if $vcard.bestalias neq $vcard.forlife}
+EMAIL;TYPE=internet:{$vcard.forlife}@{#globals.mail.domain#}
+EMAIL;TYPE=internet:{$vcard.forlife}@{#globals.mail.domain2#}
+{/if}
+{if $vcard.virtualalias}
+EMAIL;TYPE=internet:{$vcard.virtualalias}
+{/if}
+{if $vcard.tels}
+{foreach item=tel from=$vcard.tels}
+{if $tel.tel_type eq 'mobile'}TEL;TYPE=cell{else}{if $tel.tel_type eq 'fax'}FAX{else}TEL{/if};TYPE=home{/if}:{$tel.tel|vcard_enc}
+{/foreach}
+{/if}
+{if $vcard.adr_pro}
+{if $vcard.adr_pro[0].entreprise}
+ORG:{$vcard.adr_pro[0].entreprise|vcard_enc}
+{/if}
+{if $vcard.adr_pro[0].poste}
+TITLE:{$vcard.adr_pro[0].poste|vcard_enc}
+{/if}
+{if $vcard.adr_pro[0].fonction}
+ROLE:{$vcard.adr_pro[0].fonction|vcard_enc}
+{/if}
+{if $vcard.adr_pro[0].tels}
+{foreach item=tel from=$vcard.adr_pro[0].tels}
+{if $tel.tel_type eq 'mobile'}TEL;TYPE=cell,work{else}{if $tel.tel_type eq 'fax'}FAX{else}TEL{/if};TYPE=work{/if}:{$tel.tel|vcard_enc}
+{/foreach}
+{/if}
+ADR;TYPE=work:{format_adr adr=$vcard.adr_pro[0]}
+{/if}
+{foreach item=adr from=$vcard.adr}
+ADR;TYPE=home{if $adr.courier},postal{/if}:{format_adr adr=$adr}
+{if $adr.tels}
+{foreach item=tel from=$adr.tels}
+{if $tel.tel_type eq 'mobile'}TEL;TYPE=cell,home{else}{if $tel.tel_type eq 'fax'}FAX{else}TEL{/if};TYPE=home{/if}:{$tel.tel|vcard_enc}
+{/foreach}
+{/if}
+{/foreach}
+{foreach from=$vcard.networking item=nw}
+{if $nw.filter eq 'web'}
+URL:{$nw.address}
+{/if}
+{/foreach}
+{if strlen(trim($vcard.freetext)) == 0}
+NOTE:(X{$vcard.promo})
+{else}
+NOTE:(X{$vcard.promo})\n{$vcard.freetext|miniwiki:'no_title':'text'|vcard_enc}
+{/if}
+{if $vcard.section}
+X-SECTION:{$vcard.section}
+{/if}
+{if $vcard.binets_vcardjoin}
+X-BINETS:{$vcard.binets_vcardjoin}
+{/if}
+{if $vcard.gpxs_vcardjoin}
+X-GROUPS:{$vcard.gpxs_vcardjoin}
+{/if}
+{if $vcard.photo}
+PHOTO;ENCODING=b;TYPE={$vcard.photo.attachmime}:{$vcard.photo.attach|base64_encode|vcard_enc}
+{/if}
+SORT-STRING:{$vcard.nom|vcard_enc}
+REV:{$vcard.date|date_format:"%Y%m%dT000000Z"}
+END:VCARD{"\n"}
+{/iterate}
+{* vim:set et sw=2 sts=2 sws=2 enc=utf-8: *}
index bf31725..6685196 100644 (file)
         </td>
       </tr>
       {/foreach}
-      <tr class="{cycle values="pair,impair"}"><td colspan="4">
-        <form action="emails/redirect" method="post">
-        <div>
-          &nbsp;<br />
-          Ajouter une adresse email&nbsp;:
-          <input type="text" size="35" maxlength="60" name="email" value="" />
-          &nbsp;&nbsp;<input type="submit" value="ajouter" name="emailop" />
+      <form action="emails/redirect" method="post">
+        {cycle values="pair,impair" assign=class_combobox}
+        {include file="include/emails.combobox.tpl" name="email" val=$email class=$class_combobox error=$error_email}
+        <tr class=$class_combobox><td colspan="4"><div>
+          <input type="submit" value="ajouter" name="emailop" />
           {xsrf_token_field}
-        </div>
-        </form>
-      </td></tr>
+        </div></td></tr>
+      </form>
     </table>
     <script type="text/javascript">showRemove(); activeEnable();</script>
   </div>
index b0f903f..2185957 100644 (file)
@@ -27,7 +27,7 @@
 {else}
 
 <h1 id='pagetop'>
-Bienvenue {$smarty.session.prenom}{if $birthday}
+Bienvenue {$smarty.session.yourself_name}{if $birthday}
   &nbsp;et joyeux anniversaire de la part de toute l'équipe !
 {else},
 {/if}
@@ -244,7 +244,7 @@ Bienvenue {$smarty.session.prenom}{if $birthday}
         </div>
         Annonce proposée par
         <a href="profile/{$ev.hruid}" class="popup2">
-          {$ev.prenom} {$ev.nom} X{$ev.promo}
+          {$ev.prenom} {$ev.nom} {$ev.promo_display}
         </a>
       </td>
     </tr>
diff --git a/templates/fusionax/deceased.tpl b/templates/fusionax/deceased.tpl
new file mode 100644 (file)
index 0000000..888c17e
--- /dev/null
@@ -0,0 +1,59 @@
+{**************************************************************************}
+{*                                                                        *}
+{*  Copyright (C) 2003-2007 Polytechnique.org                             *}
+{*  http://opensource.polytechnique.org/                                  *}
+{*                                                                        *}
+{*  This program is free software; you can redistribute it and/or modify  *}
+{*  it under the terms of the GNU General Public License as published by  *}
+{*  the Free Software Foundation; either version 2 of the License, or     *}
+{*  (at your option) any later version.                                   *}
+{*                                                                        *}
+{*  This program is distributed in the hope that it will be useful,       *}
+{*  but WITHOUT ANY WARRANTY; without even the implied warranty of        *}
+{*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *}
+{*  GNU General Public License for more details.                          *}
+{*                                                                        *}
+{*  You should have received a copy of the GNU General Public License     *}
+{*  along with this program; if not, write to the Free Software           *}
+{*  Foundation, Inc.,                                                     *}
+{*  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA               *}
+{*                                                                        *}
+{**************************************************************************}
+
+<h2><a href="fusionax">Fusion des annuaires X.org - AX<a> / Décès</h2>
+
+{if $deceasedErrors}
+<p>Voici les {$deceasedErrors} différences entre les deux annuaires pour les renseignements de
+décès.</p>
+
+{if $nbDeceasedMissingInXorg > 0}
+<p>Anciens déclarés décédés dans l'annuaire AX mais pas sur Xorg</p>
+{include file='fusionax/listFusion.tpl' fusionList=$deceasedMissingInXorg field1='deces_ax' namefield1='Décès AX'}
+
+<a href="fusionax/deceased/updateXorg">Inclure toutes les dates de décès connues par l'AX sur Xorg.</a>
+{/if}
+
+{if $nbDeceasedMissingInAX > 0}
+<p>Anciens déclarés décédés dans l'annuaire Xorg mais pas chez l'AX</p>
+{include file='fusionax/listFusion.tpl' fusionList=$deceasedMissingInAX field1='deces_xorg' namefield1='Décès X.org'}
+
+<a href="fusionax/deceased/updateAX">Considérer ces cas comme traités (il n'y a rien à importer).</a>
+{/if}
+
+{if $nbDeceasedDifferent > 0}
+<p>Anciens déclarés décédés dans les deux annuaires mais pas avec la même date</p>
+{include file='fusionax/listFusion.tpl' fusionList=$deceasedDifferent field1='deces_xorg' field2='deces_ax' namefield1='Décès X.org' namefield2='Décès AX'}
+
+<h3>Mettre en correspondance</h3>
+<form action="fusionax/deceased/update" method="post">
+  User ID X.org : <input type="text" name="user_id" value=""/><br/>
+  Date de décès : <input type="text" name="date" value""/><br/>
+  <input type="submit" value="Mettre à jour"/>
+</form>
+{/if}
+
+{else}
+<p>Aucune différence pour les renseignements de décès entre les deux annuaires.</p>
+{/if}
+
+{* vim:set et sw=2 sts=2 sws=2 enc=utf-8: *}
diff --git a/templates/fusionax/ids.tpl b/templates/fusionax/ids.tpl
new file mode 100644 (file)
index 0000000..3f48241
--- /dev/null
@@ -0,0 +1,87 @@
+{**************************************************************************}
+{*                                                                        *}
+{*  Copyright (C) 2003-2007 Polytechnique.org                             *}
+{*  http://opensource.polytechnique.org/                                  *}
+{*                                                                        *}
+{*  This program is free software; you can redistribute it and/or modify  *}
+{*  it under the terms of the GNU General Public License as published by  *}
+{*  the Free Software Foundation; either version 2 of the License, or     *}
+{*  (at your option) any later version.                                   *}
+{*                                                                        *}
+{*  This program is distributed in the hope that it will be useful,       *}
+{*  but WITHOUT ANY WARRANTY; without even the implied warranty of        *}
+{*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *}
+{*  GNU General Public License for more details.                          *}
+{*                                                                        *}
+{*  You should have received a copy of the GNU General Public License     *}
+{*  along with this program; if not, write to the Free Software           *}
+{*  Foundation, Inc.,                                                     *}
+{*  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA               *}
+{*                                                                        *}
+{**************************************************************************}
+
+<h2><a href="fusionax">Fusion des annuaires X.org - AX</a> / Identifiants</h2>
+
+<p>Le préalable à toute fusion de renseignements pour une personne entre ce
+que contient la base AX et ce que contient ce site est bien évidemment de
+trouver une correspondance entre les personnes renseignés dans ces annuaires.</p>
+
+{if $nbMissingInAX}
+<h3>Anciens manquants à l'AX</h3>
+
+<p><a href="fusionax/ids/missingInAX">{$nbMissingInAX} ancien{if $nbMissingInAX > 1}s{/if}</a>.</p>
+{/if}
+
+{if $nbMissingInXorg > 0}
+<h3>Anciens manquants à x.org</h3>
+
+<p><a href="fusionax/ids/missingInXorg">{$nbMissingInXorg} ancien{if $nbMissingInXorg > 1}s{/if}</a>.</p>
+{/if}
+
+{if $wrongInXorg > 0}
+<h3>Anciens ayant un matricule_ax sur Xorg ne correspondant à rien dans la base de l'AX</h3>
+
+<p><a href="fusionax/ids/wrongInXorg">{$wrongInXorg} ancien{if $wrongInXorg > 1}s{/if}</a>.</p>
+{/if}
+
+<h3>Mettre en correspondance</h3>
+<form action="fusionax/ids/lier" method="post">
+       Matricule AX : <input type="text" name="matricule_ax" value""/><br/>
+       User ID X.org : <input type="text" name="user_id" value=""/><br/>
+       <input type="submit" value="Lier"/>
+</form>
+
+<p></p>
+<div id="autolink" name="autolink">
+<h3>Mise en correspondance automatique</h3>
+{if $easyToLink}
+<p>
+  Ces anciens sont probablement les mêmes (à peu près mêmes nom, prénom, promo)<br />
+  {$nbMatch} correspondances trouvées.
+</p>
+
+{include file="fusionax/listFusion.tpl" fusionList=$easyToLink fusionAction="fusionax/ids/link" name="lier" field1="display_name_ax" namefield1="Ancien AX"}
+<p><a href="fusionax/ids/linknext">Lier toutes les fiches affichées</a> <span id="fusion-reload" style="display:none"> - <a href="fusionax/ids#autolink">Trouver d'autres correspondances</a></span></p>
+<script type="text/javascript">
+{literal}
+//<!--
+$(document).ready(function() {
+    $('#autolink a.fusion-action').click(function(a){
+        $.get(a.currentTarget.href,{},function(){
+            $(a.currentTarget).hide();
+            $('#fusion-reload').show();
+            $('#fusion-reload a').click(function(a) {
+                document.location = a.currentTarget.href;
+                document.location.reload();
+            }); 
+        });
+        return false;
+    });
+});
+//-->
+{/literal}
+</script>
+{else}
+<p>Aucune correspondance automatique n'a été trouvée (mêmes nom, prénom, promo d'étude).</p>
+{/if}
+</div>
diff --git a/templates/fusionax/idsMissingInAx.tpl b/templates/fusionax/idsMissingInAx.tpl
new file mode 100644 (file)
index 0000000..8d5ba8c
--- /dev/null
@@ -0,0 +1,29 @@
+{**************************************************************************}
+{*                                                                        *}
+{*  Copyright (C) 2003-2007 Polytechnique.org                             *}
+{*  http://opensource.polytechnique.org/                                  *}
+{*                                                                        *}
+{*  This program is free software; you can redistribute it and/or modify  *}
+{*  it under the terms of the GNU General Public License as published by  *}
+{*  the Free Software Foundation; either version 2 of the License, or     *}
+{*  (at your option) any later version.                                   *}
+{*                                                                        *}
+{*  This program is distributed in the hope that it will be useful,       *}
+{*  but WITHOUT ANY WARRANTY; without even the implied warranty of        *}
+{*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *}
+{*  GNU General Public License for more details.                          *}
+{*                                                                        *}
+{*  You should have received a copy of the GNU General Public License     *}
+{*  along with this program; if not, write to the Free Software           *}
+{*  Foundation, Inc.,                                                     *}
+{*  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA               *}
+{*                                                                        *}
+{**************************************************************************}
+
+<h2><a href="fusionax">Fusion des annuaires X.org - AX<a> / <a href="fusionax/ids">Identifiants<a> /  Manquants dans l'annuaire de l'AX</h2>
+
+<p></p>
+
+{if $missingInAX}
+{include file='fusionax/listFusion.tpl' fusionList=$missingInAX field1='user_id' namefield1='ID X.org'}
+{/if}
diff --git a/templates/fusionax/idsMissingInXorg.tpl b/templates/fusionax/idsMissingInXorg.tpl
new file mode 100644 (file)
index 0000000..036d6d4
--- /dev/null
@@ -0,0 +1,29 @@
+{**************************************************************************}
+{*                                                                        *}
+{*  Copyright (C) 2003-2007 Polytechnique.org                             *}
+{*  http://opensource.polytechnique.org/                                  *}
+{*                                                                        *}
+{*  This program is free software; you can redistribute it and/or modify  *}
+{*  it under the terms of the GNU General Public License as published by  *}
+{*  the Free Software Foundation; either version 2 of the License, or     *}
+{*  (at your option) any later version.                                   *}
+{*                                                                        *}
+{*  This program is distributed in the hope that it will be useful,       *}
+{*  but WITHOUT ANY WARRANTY; without even the implied warranty of        *}
+{*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *}
+{*  GNU General Public License for more details.                          *}
+{*                                                                        *}
+{*  You should have received a copy of the GNU General Public License     *}
+{*  along with this program; if not, write to the Free Software           *}
+{*  Foundation, Inc.,                                                     *}
+{*  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA               *}
+{*                                                                        *}
+{**************************************************************************}
+
+<h2><a href="fusionax">Fusion des annuaires X.org - AX<a> / <a href="fusionax/ids">Identifiants<a> /  Manquants dans l'annuaire d'X.org</h2>
+
+<p></p>
+
+{if $missingInXorg}
+{include file='fusionax/listFusion.tpl' fusionList=$missingInXorg field1='id_ancien' namefield1='matricule AX'}
+{/if}
diff --git a/templates/fusionax/idswrongInXorg.tpl b/templates/fusionax/idswrongInXorg.tpl
new file mode 100644 (file)
index 0000000..4701aa4
--- /dev/null
@@ -0,0 +1,32 @@
+{**************************************************************************}
+{*                                                                        *}
+{*  Copyright (C) 2003-2007 Polytechnique.org                             *}
+{*  http://opensource.polytechnique.org/                                  *}
+{*                                                                        *}
+{*  This program is free software; you can redistribute it and/or modify  *}
+{*  it under the terms of the GNU General Public License as published by  *}
+{*  the Free Software Foundation; either version 2 of the License, or     *}
+{*  (at your option) any later version.                                   *}
+{*                                                                        *}
+{*  This program is distributed in the hope that it will be useful,       *}
+{*  but WITHOUT ANY WARRANTY; without even the implied warranty of        *}
+{*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *}
+{*  GNU General Public License for more details.                          *}
+{*                                                                        *}
+{*  You should have received a copy of the GNU General Public License     *}
+{*  along with this program; if not, write to the Free Software           *}
+{*  Foundation, Inc.,                                                     *}
+{*  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA               *}
+{*                                                                        *}
+{**************************************************************************}
+
+<h2><a href="fusionax">Fusion des annuaires X.org - AX<a> / <a href="fusionax/ids">Identifiants<a> /  Présents dans Xorg avec un matricule_ax ne correspondant à rien
+dans la base de l'AX (mises à part les promo 1921 et 1923 qui ne figurent pas dans les données de l'AX)</h2>
+
+<p></p>
+
+{if $wrongInXorg}
+{include file='fusionax/listFusion.tpl' fusionList=$wrongInXorg field1='user_id' namefield1='ID X.org'}
+
+<p><a href="fusionax/ids/cleanwronginxorg">Mettre à NULL le matricule_ax de ces camarades pour marquer le fait qu'ils ne figurent pas dans l'annuaire de l'AX</a></p>
+{/if}
similarity index 67%
rename from templates/profile/adresses.tel.tpl
rename to templates/fusionax/import.tpl
index 60c0391..f798c96 100644 (file)
@@ -1,6 +1,6 @@
 {**************************************************************************}
 {*                                                                        *}
-{*  Copyright (C) 2003-2008 Polytechnique.org                             *}
+{*  Copyright (C) 2003-2007 Polytechnique.org                             *}
 {*  http://opensource.polytechnique.org/                                  *}
 {*                                                                        *}
 {*  This program is free software; you can redistribute it and/or modify  *}
 {*                                                                        *}
 {**************************************************************************}
 
-{assign var=telpref value="`$adpref`[tel][`$t`]"}
-{assign var=telid value="`$adid`_tel_`$t`"}
-<div style="float: right" class="flags">
-  {include file="include/flags.radio.tpl" name="`$telpref`[pub]" val=$tel.pub}
+<script type="text/javascript">
+{literal}
+//<!--
+    $(document).ready(function() {
+        $('#fusionax_import input').click(function() {
+            $('#fusionax_import input').hide();
+            $('#fusionax_import').append('Lancement de l\'import.<br/>');
+            $.getScript('fusionax/import/launch');
+        });
+    });
+//-->
+{/literal}
+</script> 
+<h2><a href="fusionax">Fusion des annuaires X.org - AX</a></h2>
+
+<h2>Import de l'annuaire AX</h2>
+{if $lastimport}
+<p>Dernier import {$lastimport}</p>
+{/if}
+
+{if $keymissing}
+<p>Impossible de faire l'import, il manque la clef d'authentification :</p>
+<pre>{$keymissing}</pre>
+{else}
+<div id="fusionax_import">
+<input type="button" value="Lancer l'import"/>
 </div>
-<span class="titre">N°{$t+1}</span>
-<input type="hidden" name="{$telpref}[removed]" value="0" />
-<input type="text" size="10" maxlength="30" name="{$telpref}[type]" value="{$tel.type|default:"Tél."}" />
-<input type="text" size="19" maxlength="28" name="{$telpref}[tel]" {if $tel.error}class="error"{/if} value="{$tel.tel}" />
-<a href="javascript:removeObject('{$telid}', '{$telpref}')">
-  {icon name=cross title="Supprimer ce numéro de téléphone"}
-</a>
+{/if}
 
 {* vim:set et sw=2 sts=2 sws=2 enc=utf-8: *}
diff --git a/templates/fusionax/index.tpl b/templates/fusionax/index.tpl
new file mode 100644 (file)
index 0000000..67e9cf5
--- /dev/null
@@ -0,0 +1,37 @@
+{**************************************************************************}
+{*                                                                        *}
+{*  Copyright (C) 2003-2007 Polytechnique.org                             *}
+{*  http://opensource.polytechnique.org/                                  *}
+{*                                                                        *}
+{*  This program is free software; you can redistribute it and/or modify  *}
+{*  it under the terms of the GNU General Public License as published by  *}
+{*  the Free Software Foundation; either version 2 of the License, or     *}
+{*  (at your option) any later version.                                   *}
+{*                                                                        *}
+{*  This program is distributed in the hope that it will be useful,       *}
+{*  but WITHOUT ANY WARRANTY; without even the implied warranty of        *}
+{*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *}
+{*  GNU General Public License for more details.                          *}
+{*                                                                        *}
+{*  You should have received a copy of the GNU General Public License     *}
+{*  along with this program; if not, write to the Free Software           *}
+{*  Foundation, Inc.,                                                     *}
+{*  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA               *}
+{*                                                                        *}
+{**************************************************************************}
+
+<h2>Fusion des annuaires X.org - AX</h2>
+<ul>
+<li>Voir la <a href="Fusion">documentation</a></li>
+<li><a href="fusionax/import">Import de la base AX</a> {if $lastimport} - (dernier import le {$lastimport}){/if}</li> 
+<li>Mise en <a href="fusionax/ids">correspondance simple</a></li>
+<li>Création des <a href="fusionax/view">VIEW annexes nécessaires aux corrélations</a></li>
+<li>Corrélation des <a href="fusionax/deceased">dates de décès</a></li>
+<li>Corrélation des <a href="fusionax/promo">promotions</a></li>
+<li>Corrélation des <a href="fusionax/names">données d'identification</a></li>
+<li>Corrélation des <a href="fusionax/coords">coordonnées</a></li>
+<li>Corrélation des <a href="fusionax/pros">informations professionnelles</a></li>
+<li>Corrélation des <a href="fusionax/studies">informations de formations</a></li>
+</ul>
+
+{* vim:set et sw=2 sts=2 sws=2 enc=utf-8: *}
diff --git a/templates/fusionax/listFusion.tpl b/templates/fusionax/listFusion.tpl
new file mode 100644 (file)
index 0000000..206c381
--- /dev/null
@@ -0,0 +1,69 @@
+{**************************************************************************}
+{*                                                                        *}
+{*  Copyright (C) 2003-2007 Polytechnique.org                             *}
+{*  http://opensource.polytechnique.org/                                  *}
+{*                                                                        *}
+{*  This program is free software; you can redistribute it and/or modify  *}
+{*  it under the terms of the GNU General Public License as published by  *}
+{*  the Free Software Foundation; either version 2 of the License, or     *}
+{*  (at your option) any later version.                                   *}
+{*                                                                        *}
+{*  This program is distributed in the hope that it will be useful,       *}
+{*  but WITHOUT ANY WARRANTY; without even the implied warranty of        *}
+{*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *}
+{*  GNU General Public License for more details.                          *}
+{*                                                                        *}
+{*  You should have received a copy of the GNU General Public License     *}
+{*  along with this program; if not, write to the Free Software           *}
+{*  Foundation, Inc.,                                                     *}
+{*  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA               *}
+{*                                                                        *}
+{**************************************************************************}
+
+<table class="bicol">
+    <tr>
+        <th>Ancien</th>
+        <th>Fiches</th>
+        {if $field1}
+        <th>{$namefield1}</th>
+        {/if}
+        {if $field2}
+        <th>{$namefield2}</th>
+        {/if}
+        {if $field3}
+        <th>{$namefield3}</th>
+        {/if}
+        {if $field4}
+        <th>{$namefield4}</th>
+        {/if}
+        {if $fusionAction}
+        <th>Action</th>
+        {/if}
+    </tr>
+{if $fusionList}
+{iterate from=$fusionList item=c}
+    <tr class="{cycle values="pair,impair"}">
+        <td>{$c.display_name} (X {$c.promo})</td>
+        <td style="text-align:center">
+            {if $c.user_id}<a href="admin/user/{$c.user_id}" class="popup2">{icon name="user_suit" title="Administrer utilisateur"}</a>{/if}
+            {if $c.id_ancien}<a href="http://www.polytechniciens.com/?page=AX_FICHE_ANCIEN&amp;anc_id={$c.id_ancien}" class="popup2">{icon name="user_gray" title="fiche AX"}</a>{/if}
+        </td>
+        {if $field1}
+        <td>{$c.$field1}</td>
+        {/if}
+        {if $field2}
+        <td>{$c.$field2}</td>
+        {/if}
+        {if $field3}
+        <td>{$c.$field3}</td>
+        {/if}
+        {if $field4}
+        <td>{$c.$field4}</td>
+        {/if}
+        {if $fusionAction}
+        <td><a class="fusion-action" href="{$fusionAction}/{$c.user_id}/{$c.id_ancien}">{$name}</a></td>
+        {/if}
+    </tr>
+{/iterate}
+{/if}
+</table>
diff --git a/templates/fusionax/promo.tpl b/templates/fusionax/promo.tpl
new file mode 100644 (file)
index 0000000..d237fae
--- /dev/null
@@ -0,0 +1,37 @@
+{**************************************************************************}
+{*                                                                        *}
+{*  Copyright (C) 2003-2007 Polytechnique.org                             *}
+{*  http://opensource.polytechnique.org/                                  *}
+{*                                                                        *}
+{*  This program is free software; you can redistribute it and/or modify  *}
+{*  it under the terms of the GNU General Public License as published by  *}
+{*  the Free Software Foundation; either version 2 of the License, or     *}
+{*  (at your option) any later version.                                   *}
+{*                                                                        *}
+{*  This program is distributed in the hope that it will be useful,       *}
+{*  but WITHOUT ANY WARRANTY; without even the implied warranty of        *}
+{*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *}
+{*  GNU General Public License for more details.                          *}
+{*                                                                        *}
+{*  You should have received a copy of the GNU General Public License     *}
+{*  along with this program; if not, write to the Free Software           *}
+{*  Foundation, Inc.,                                                     *}
+{*  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA               *}
+{*                                                                        *}
+{**************************************************************************}
+
+<h2><a href="fusionax">Fusion des annuaires X.org - AX</a> / Promotions</h2>
+
+<p></p>
+
+{if $nbMissmatchingPromos > 0}
+<p>Il y a {$nbMissmatchingPromos} différences entre les deux bases dans pour les promotions.</p>
+<p>Grosses différences (oranjisation ?) :</p>
+{include file='fusionax/listFusion.tpl' fusionList=$missmatchingPromos1 field1='user_id' namefield1='ID X.org' field3='promo_etude_xorg'
+namefield3='etude_xorg' field4='promo_sortie_xorg' namefield4='sortie_xorg' field2='promo_etude_ax' namefield2='etude_ax'}
+
+<p>Petites différences : promo_etude_xorg == promo_etude_ax + 1 et promo_etude_xorg + 3 == promo_sortie_xorg, a priori ce sont les étrangers que nous avons mal
+inclus</p>
+{include file='fusionax/listFusion.tpl' fusionList=$missmatchingPromos2 field1='user_id' namefield1='ID X.org' field3='promo_etude_xorg'
+namefield3='etude_xorg' field4='promo_sortie_xorg' namefield4='sortie_xorg' field2='promo_etude_ax' namefield2='etude_ax'}
+{/if}
diff --git a/templates/fusionax/view.tpl b/templates/fusionax/view.tpl
new file mode 100644 (file)
index 0000000..c0796cc
--- /dev/null
@@ -0,0 +1,25 @@
+{**************************************************************************}
+{*                                                                        *}
+{*  Copyright (C) 2003-2007 Polytechnique.org                             *}
+{*  http://opensource.polytechnique.org/                                  *}
+{*                                                                        *}
+{*  This program is free software; you can redistribute it and/or modify  *}
+{*  it under the terms of the GNU General Public License as published by  *}
+{*  the Free Software Foundation; either version 2 of the License, or     *}
+{*  (at your option) any later version.                                   *}
+{*                                                                        *}
+{*  This program is distributed in the hope that it will be useful,       *}
+{*  but WITHOUT ANY WARRANTY; without even the implied warranty of        *}
+{*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *}
+{*  GNU General Public License for more details.                          *}
+{*                                                                        *}
+{*  You should have received a copy of the GNU General Public License     *}
+{*  along with this program; if not, write to the Free Software           *}
+{*  Foundation, Inc.,                                                     *}
+{*  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA               *}
+{*                                                                        *}
+{**************************************************************************}
+
+<h2><a href="fusionax">Fusion des annuaires X.org - AX<a> / Création des VIEW annexes nécessaires aux corrélations </h2>
+
+<p><a href="fusionax/view/create">Création des VIEW annexes nécessaires aux corrélations</a></p>
index 2a403ee..f99e56b 100644 (file)
     {if !$c.dcd && ($c.inscrit || $smarty.session.auth eq AUTH_PUBLIC)}</a>{/if}
   </div>
   <div class="autre">
-    {if $c.iso3166}
-    <img src='images/flags/{$c.iso3166}.gif' alt='{$c.nat}' height='11' title='{$c.nat}' />&nbsp;
+    {if $c.iso3166_1}
+    <img src='images/flags/{$c.iso3166_1}.gif' alt='{$c.nat1}' height='11' title='{$c.nat1}' />&nbsp;
+    {/if}
+    {if $c.iso3166_2}
+    <img src='images/flags/{$c.iso3166_2}.gif' alt='{$c.nat2}' height='11' title='{$c.nat2}' />&nbsp;
+    {/if}
+    {if $c.iso3166_3}
+    <img src='images/flags/{$c.iso3166_3}.gif' alt='{$c.nat3}' height='11' title='{$c.nat3}' />&nbsp;
     {/if}
     (X {$c.promo})
     {if $c.dcd}décédé{if $c.sexe}e{/if} le {$c.deces|date_format}{/if}
diff --git a/templates/include/emails.combobox.tpl b/templates/include/emails.combobox.tpl
new file mode 100644 (file)
index 0000000..c5cce09
--- /dev/null
@@ -0,0 +1,119 @@
+{**************************************************************************}
+{*                                                                        *}
+{*  Copyright (C) 2003-2008 Polytechnique.org                             *}
+{*  http://opensource.polytechnique.org/                                  *}
+{*                                                                        *}
+{*  This program is free software; you can redistribute it and/or modify  *}
+{*  it under the terms of the GNU General Public License as published by  *}
+{*  the Free Software Foundation; either version 2 of the License, or     *}
+{*  (at your option) any later version.                                   *}
+{*                                                                        *}
+{*  This program is distributed in the hope that it will be useful,       *}
+{*  but WITHOUT ANY WARRANTY; without even the implied warranty of        *}
+{*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *}
+{*  GNU General Public License for more details.                          *}
+{*                                                                        *}
+{*  You should have received a copy of the GNU General Public License     *}
+{*  along with this program; if not, write to the Free Software           *}
+{*  Foundation, Inc.,                                                     *}
+{*  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA               *}
+{*                                                                        *}
+{**************************************************************************}
+
+<tr {if $class}class="{$class}"{/if}>
+  <td>
+    <span class="titre">{if $name eq "email_directory"}Email annuaire AX
+    {elseif $name eq "email"}Ajouter une adresse email{else}
+    Email professionnel{/if}</span>
+  </td>
+  {if $name eq "email"}<td></td>{/if}
+  <td>
+    <select name="{$name}" id="combobox">
+      {if $email_type eq "directory"}
+        <optgroup label="Email annuaire AX">
+          <option value="{$email_directory}" {if
+          $val eq $email_directory}selected="selected"{/if}>{$email_directory}</option>
+        </optgroup>
+      {/if}
+      {if $name eq "email_directory"}
+        <optgroup label="Emails polytechniciens">
+          {if $melix}
+            <option value="{$melix}@{#globals.mail.alias_dom#}" {if
+            $val eq $melix|cat:'@'|cat:#globals.mail.alias_dom#}selected="selected"{/if}>
+            {$melix}@{#globals.mail.alias_dom#}</option>
+            <option value="{$melix}@{#globals.mail.alias_dom2#}" {if
+            $val eq $melix|cat:'@'|cat:#globals.mail.alias_dom2#}selected="selected"{/if}>
+            {$melix}@{#globals.mail.alias_dom2#}</option>
+          {/if}
+          {foreach from=$list_email_X item=email}
+            <option value="{$email.alias}@{#globals.mail.domain#}" {if
+            $val eq $email.alias|cat:'@'|cat:#globals.mail.domain#}selected="selected"{/if}>
+            {$email.alias}@{#globals.mail.domain#}</option>
+            <option value="{$email.alias}@{#globals.mail.domain2#}" {if
+            $val eq $email.alias|cat:'@'|cat:#globals.mail.domain2#}selected="selected"{/if}>
+            {$email.alias}@{#globals.mail.domain2#}</option>
+          {/foreach}
+        </optgroup>
+      {/if}
+      {if (($name neq "email") && ($list_email_redir|@count neq 0))}
+        <optgroup label="Redirections">
+          {foreach from=$list_email_redir item=email}
+            <option value="{$email}" {if $val eq $email}selected="selected"{/if}>{$email}</option>
+          {/foreach}
+        </optgroup>
+      {/if}
+      {if $list_email_pro|@count neq 0}
+        <optgroup label="Emails professionels">
+          {foreach from=$list_email_pro item=email}
+            <option value="{$email}" {if
+            $val eq $email}selected="selected"{/if}>{$email}</option>
+          {/foreach}
+        </optgroup>
+      {/if}
+      <optgroup label="Autres choix">
+        <option value="new@example.org" {if $error}selected="selected"{/if}>Utiliser une autre adresse email</option>
+        <option value="" {if (($val eq '') && (!$error))}selected="selected"{/if}>{if
+        $name neq "email"}Ne pas mettre d'adresse email{else}&nbsp;{/if}</option>
+      </optgroup>
+    </select>
+    {if $name eq "email_directory"}
+      <input type="checkbox" disabled="disabled" checked="checked"/>
+      {icon name="flag_orange" title="Visible sur l'annuaire"}
+    {elseif $name neq "email"}
+      <span class="flags">
+        {include file="include/flags.radio.tpl" name="`$jobpref`[email_pub]" val=$job.mail_pub}
+      </span>
+    {/if}
+    <br />
+    <span class="new" style="display: none">
+      <input type="text" maxlength="60" {if $error}class="error" value="{$val}"{/if} name="{if (($name neq "email_directory")
+      && ($name neq "email"))}jobs[{$i}][email_new]{else}{$name}_new{/if}"/>
+    </span>
+    <script type="text/javascript">//<![CDATA[
+      {literal}
+      $(function() {
+        $("select#combobox").change(function() {
+          $(".new").hide();
+          if ($("select#combobox").val() == "new@example.org") {
+            $(".new").show();
+          }
+        }).change();
+      });
+      {/literal}
+    // ]]></script>
+  </td>
+  {if $name eq "email"}<td></td>{/if}
+</tr>
+{if $name neq "email"}
+  <tr {if $class}class="{$class}"{/if} class="new" style="display: none">
+    <td colspan="2">
+      <p><small><strong><em>Attention :</em></strong> cette adresse email figurera dans
+      {if $name eq "email_directory"}l'annuaire papier{else}tes informations professionnelles
+      {/if} mais n'est pas ajoutée à la liste de tes redirections. Nous te conseillons fortement de
+      <strong><a href="emails/redirect">l'ajouter là</a></strong>, surtout
+      si tu n'en as plus de valide.</small></p>
+    </td>
+  </tr>
+{/if}
+
+{* vim:set et sw=2 sts=2 sws=2 enc=utf-8: *}
index 9efa2fc..5fc6f95 100644 (file)
     {if $smarty.session.auth ge AUTH_COOKIE}
     <div class="photo">
       <img src="photo/{$c.hruid}"
-           alt="{$c.prenom} {$c.nom}" />
+           alt="{$c.name_display}" />
     </div>
     {/if}
 
     <div class="nom">
       {if $c.sexe}&bull;{/if}
       {if !$c.dcd && ($c.inscrit || $smarty.session.auth eq AUTH_PUBLIC)}<a href="profile/{$c.hruid}" class="popup2">{/if}
-      {if $c.nom_usage}{$c.nom_usage} {$c.prenom}<br />({$c.nom}){else}{$c.nom} {$c.prenom}{/if}
+      <span {if $c.name_tooltip}class="hinted" title="{$c.name_tooltip}"{/if}>{$c.name_display}</span>
       {if !$c.dcd && ($c.inscrit || $smarty.session.auth eq AUTH_PUBLIC)}</a>{/if}
     </div>
 
-    <div class="appli">
-      {if $c.iso3166}
-      <img src='images/flags/{$c.iso3166}.gif' alt='{$c.nat}' height='11' title='{$c.nat}' />&nbsp;
+    <div class="edu">
+      {if $c.iso3166_1}
+      <img src='images/flags/{$c.iso3166_1}.gif' alt='{$c.nat1}' height='11' title='{$c.nat1}' />&nbsp;
       {/if}
-      X {$c.promo}{if $c.app0text}, {applis_fmt type=$c.app0type text=$c.app0text url=$c.app0url}{*
-      *}{/if}{if $c.app1text}, {applis_fmt type=$c.app1type text=$c.app1text url=$c.app1url}{/if}{*
-      *}{if $c.dcd}, décédé{if $c.sexe}e{/if} le {$c.deces|date_format}{/if}
+      {if $c.iso3166_2}
+      <img src='images/flags/{$c.iso3166_2}.gif' alt='{$c.nat2}' height='11' title='{$c.nat2}' />&nbsp;
+      {/if}
+      {if $c.iso3166_3}
+      <img src='images/flags/{$c.iso3166_3}.gif' alt='{$c.nat3}' height='11' title='{$c.nat3}' />&nbsp;
+      {/if}
+      {$c.promo_display}{if $c.eduname0}, {education_fmt name=$c.eduname0 url=$c.eduurl0 degree=$c.edudegree0
+                                     grad_year=$c.edugrad_year0 field=$c.edufield0 program=$c.eduprogram0 sexe=$c.sexe}{*
+      *}{/if}{if $c.eduname1}, {education_fmt name=$c.eduname1 url=$c.eduurl1 degree=$c.edudegree1
+                                     grad_year=$c.edugrad_year1 field=$c.edufield1 program=$c.eduprogram1 sexe=$c.sexe}{*
+      *}{/if}{if $c.eduname2}, {education_fmt name=$c.eduname2 url=$c.eduurl2 degree=$c.edudegree2
+                                     grad_year=$c.edugrad_year2 field=$c.edufield2 program=$c.eduprogram2 sexe=$c.sexe}{*
+      *}{/if}{if $c.eduname3}, {education_fmt name=$c.eduname3 url=$c.eduurl3 degree=$c.edudegree3
+                                     grad_year=$c.edugrad_year3 field=$c.edufield3 program=$c.eduprogram3 sexe=$c.sexe}{*
+      *}{/if}{if $c.dcd}, décédé{if $c.sexe}e{/if} le {$c.deces|date_format}{/if}
     </div>
   </div>
 
index ebe8c1f..d1253a6 100644 (file)
 {foreach from=$set item=p} 
   <div class="contact"> 
     <div class="nom"> 
-      {$p.nom} {$p.prenom} 
+      <span {if $p.name_tooltip}class="hinted" title="{$p.name_tooltip}"{/if}>{$p.name_display}</span>
     </div> 
-    <div class="appli"> 
-      X{$p.promo
+    <div class="edu"> 
+      {$p.promo_display
     </div> 
     <div class="bits" style="width: 40%;"> 
       <span class='smaller'> 
index bdedf25..730e499 100644 (file)
   <tr>
     <td class="center" style="vertical-align: bottom; padding-bottom: 15px">
       <a href="{$mainsiteurl}profile/{$set[trombi.index_prev].hruid}" class="popup2">
-        {$set[trombi.index_prev].prenom} {$set[trombi.index_prev].nom}{if $trombi_with_promo} ({$set[trombi.index_prev].promo}){/if}
+        <span {if $set[trombi.index_prev].name_tooltip}class="hinted"
+        title="{$set[trombi.index_prev].name_tooltip}"{/if}>{$set[trombi.index_prev].name_display}</span>{if $trombi_with_promo} ({$set[trombi.index_prev].promo_display}){/if}
       </a>
     </td>
     <td class="center" style="vertical-align: bottom; padding-bottom: 15px">
       <a href="{$mainsiteurl}profile/{$set[trombi].hruid}" class="popup2">
-        {$set[trombi].prenom} {$set[trombi].nom}{if $trombi_with_promo} ({$set[trombi].promo}){/if}
+        <span {if $set[trombi].name_tooltip}class="hinted" title="{$set[trombi].name_tooltip}"{/if}>{$set[trombi].name_display}</span>{if $trombi_with_promo} ({$set[trombi].promo_display}){/if}
       </a>
     </td>
     <td class="center" style="vertical-align: bottom; padding-bottom: 15px">
     {if $set[trombi.index_next]}
       <a href="{$mainsiteurl}profile/{$set[trombi.index_next].hruid}" class="popup2">
-        {$set[trombi.index_next].prenom} {$set[trombi.index_next].nom}{if $trombi_with_promo} ({$set[trombi.index_next].promo}){/if}
+        <span {if $set[trombi.index_next].name_tooltip}class="hinted" title="{$set[trombi.index_next].name_tooltip}"{/if}>{$set[trombi.index_next].name_display}</span>{if $trombi_with_promo} ({$set[trombi.index_next].promo_display}){/if}
       </a>
     {/if}
     </td>
@@ -90,7 +91,8 @@
   <tr style="margin-top: 0; padding-top: 0">
     <td class="center" style="vertical-align: bottom">
       <a href="{$mainsiteurl}profile/{$set[trombi].hruid}" class="popup2">
-        {$set[trombi].prenom} {$set[trombi].nom}{if $trombi_with_promo} ({$set[trombi].promo}){/if}
+      <a href="{$mainsiteurl}profile/{$set[trombi].forlife}" class="popup2">
+        <span {if $set[trombi].name_tooltip}class="hinted" title="{$set[trombi].name_tooltip}"{/if}>{$set[trombi].name_display}</span>{if $trombi_with_promo} ({$set[trombi].promo_display}){/if}
       </a>
     </td>
     <td></td><td></td>
index e49bf6f..f5ababa 100644 (file)
@@ -37,7 +37,7 @@
       {/if}
       <br />
       <a href="{if $urlmainsite}{$urlmainsite}{/if}profile/{$p.forlife}" class="popup2">
-        {$p.prenom} {$p.nom}{if $trombi_show_promo} ({$p.promo}){/if}
+        <span {if $p.name_tooltip}class="hinted" title="{$p.name_tooltip}"{/if}>{$p.name_display}</span>{if $trombi_show_promo} ({$p.promo_display}){/if}
       </a>
     </td>
   {if $loop eq "3"}
index d32c459..87812a2 100644 (file)
@@ -64,7 +64,10 @@ sa dernière relance date du {$relance|date_format}
     {iterate from=$addr item=a}
     <tr class="{cycle values='impair,pair'}">
       <td>{$a.email}</td>
-      <td>{if $a.alias}<a href="profile/{$a.alias}" class="popup2">{$a.alias}</a> {if $a.type eq user}(*){/if}{/if}</td>
+      <td>
+        {if $a.alias neq ''}<a href="profile/{$a.alias}" class="popup2">{$a.alias}</a>
+        {if $a.type eq user}(*){/if}{else}Email connu de l'AX{/if}
+      </td>
       <td>{$a.date|date_format|default:'-'}</td>
       <td>{$a.last|date_format|default:'-'}</td>
       <td class='center'>{$a.nb|default:"-"}</td>
index c0b7287..a778d8d 100644 (file)
                  {if $adr.mail}checked="checked"{/if} />
           <label for="{$adid}_mail">on peut m'y envoyer du courrier par la poste</label>
         </div>
+        <div>
+          <label for="{$adpref}[comment]">Commentaire : </label>
+          <input type="text" size="35" maxlength="100" name="{$adpref}[comment]" id="{$adpref}_comment" value="{$adr.comment}" />
+        </div>
       </div>
     </td>
   </tr>
   <tr class="pair">
     <td>
       {foreach from=$adr.tel key=t item=tel}
-      <div id="{"`$adid`_tel_`$t`"}" style="clear: both">
-      {include file="profile/adresses.tel.tpl" t=$t tel=$tel}
-      </div>
+        <div id="{"`$adid`_tel_`$t`"}" style="clear: both">
+          {include file="profile/phone.tpl" prefname="`$adpref`[tel]" prefid="`$adid`_tel" telid=$t tel=$tel}
+        </div>
       {/foreach}
       {if $adr.tel|@count eq 0}
-      <div id="{"`$adid`_tel_0"}" style="clear: both">
-      {include file="profile/adresses.tel.tpl" t=0 tel=0}
-      </div>
+        <div id="{"`$adid`_tel_0"}" style="clear: both">
+          {include file="profile/phone.tpl" prefname="`$adpref`[tel]" prefid="`$adid`_tel" telid=0 tel=0}
+        </div>
       {/if}
-      <div id="{$adid}_add_tel" class="center" style="clear: both">
-        <a href="javascript:addTel({$i})">
+      <div id="{$adid}_tel_add" class="center" style="clear: both; padding-top: 4px">
+        <a href="javascript:addTel('{$adid}_tel', '{$adpref}[tel]')">
           {icon name=add title="Ajouter un numéro de téléphone"} Ajouter un numéro de téléphone
         </a>
       </div>
diff --git a/templates/profile/edu.tpl b/templates/profile/edu.tpl
new file mode 100644 (file)
index 0000000..05883d3
--- /dev/null
@@ -0,0 +1,69 @@
+{**************************************************************************}
+{*                                                                        *}
+{*  Copyright (C) 2003-2008 Polytechnique.org                             *}
+{*  http://opensource.polytechnique.org/                                  *}
+{*                                                                        *}
+{*  This program is free software; you can redistribute it and/or modify  *}
+{*  it under the terms of the GNU General Public License as published by  *}
+{*  the Free Software Foundation; either version 2 of the License, or     *}
+{*  (at your option) any later version.                                   *}
+{*                                                                        *}
+{*  This program is distributed in the hope that it will be useful,       *}
+{*  but WITHOUT ANY WARRANTY; without even the implied warranty of        *}
+{*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *}
+{*  GNU General Public License for more details.                          *}
+{*                                                                        *}
+{*  You should have received a copy of the GNU General Public License     *}
+{*  along with this program; if not, write to the Free Software           *}
+{*  Foundation, Inc.,                                                     *}
+{*  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA               *}
+{*                                                                        *}
+{**************************************************************************}
+
+{assign var=eduname value="edus[`$eduid`]"}
+<tr class="edu_{$eduid} {$class}">
+  <td colspan="2">
+    <a href="javascript:removeEdu('{$eduid}')">
+      {icon name=cross title="Supprimer cette formation"}
+    </a>
+    <select name="{$eduname}[eduid]" onchange="fillType(this.form['{$eduname}[degreeid]'], this.selectedIndex - 1);">
+      {education_options selected=$edu.eduid}
+    </select>
+    <input type="hidden" name="edu_{$eduid}_tmp" value="{$edu.degreeid}" />
+    <select name="{$eduname}[degreeid]">
+      <option value=""></option>
+    </select>
+  </td>
+</tr>
+<tr class="edu_{$eduid} {$class}">
+  <td>
+    <span class="titre">Domaine de formation&nbsp;:</span>
+  </td>
+  <td>
+    <select name="{$eduname}[fieldid]">
+      {foreach from=$edu_fields item=field}
+      <option value="{$field.id}" {if $field.id eq $edu.fieldid}selected="selected"{/if}>{$field.field}</option>
+      {/foreach}
+    </select>
+  </td>
+</tr>
+<tr class="edu_{$eduid} {$class}">
+  <td>
+    <span class="titre">Année d'obtention du diplôme&nbsp;:</span>
+  </td>
+  <td>
+    <input type="text" {if $edu.error}class="error"{/if} name="{$eduname}[grad_year]"
+    value="{$edu.grad_year}" size="4" maxlength="4" />
+    <small>(par exemple&nbsp;: 2008)</small>
+  </td>
+</tr>
+<tr class="edu_{$eduid} {$class}">
+  <td>
+    <span class="titre">Intitulé de la formation&nbsp;:</span>
+  </td>
+  <td>
+    <input type="text" name="{$eduname}[program]" value="{$edu.program}" size="30" maxlength="255" />
+  </td>
+</tr>
+
+{* vim:set et sw=2 sts=2 sws=2 enc=utf-8: *}
similarity index 90%
rename from templates/profile/applis.js.tpl
rename to templates/profile/education.js.tpl
index 83cbfba..e5b10d5 100644 (file)
@@ -20,7 +20,8 @@
 {*                                                                        *}
 {**************************************************************************}
 
-applisType = new Array({applis_type});
-applisTypeAll = new Array({applis_type_all});
+educationDegree     = new Array({education_degree});
+educationDegreeAll  = new Array({education_degree_all});
+educationDegreeName = new Array({education_degree_name}); 
 
 {* vim:set et sw=2 sts=2 sws=2 enc=utf-8: *}
diff --git a/templates/profile/general.networking.tpl b/templates/profile/general.networking.tpl
new file mode 100644 (file)
index 0000000..d4d17f8
--- /dev/null
@@ -0,0 +1,48 @@
+{**************************************************************************}
+{*                                                                        *}
+{*  Copyright (C) 2003-2008 Polytechnique.org                             *}
+{*  http://opensource.polytechnique.org/                                  *}
+{*                                                                        *}
+{*  This program is free software; you can redistribute it and/or modify  *}
+{*  it under the terms of the GNU General Public License as published by  *}
+{*  the Free Software Foundation; either version 2 of the License, or     *}
+{*  (at your option) any later version.                                   *}
+{*                                                                        *}
+{*  This program is distributed in the hope that it will be useful,       *}
+{*  but WITHOUT ANY WARRANTY; without even the implied warranty of        *}
+{*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *}
+{*  GNU General Public License for more details.                          *}
+{*                                                                        *}
+{*  You should have received a copy of the GNU General Public License     *}
+{*  along with this program; if not, write to the Free Software           *}
+{*  Foundation, Inc.,                                                     *}
+{*  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA               *}
+{*                                                                        *}
+{**************************************************************************}
+
+<tr id="networking_{$i}">
+  <td colspan="2">
+    <div style="float: left; width: 200px;">
+      <span class="flags">
+        <label><input type="checkbox"
+          {if $nw.pub neq 'private'} checked="checked"{/if}
+          name="networking[{$i}][pub]"/>
+        {icon name="flag_green" title="site public"}</label>
+      </span>&nbsp;
+      <input type="hidden" name="networking[{$i}][type]" value="{$nw.type}"/>
+      <input type="hidden" name="networking[{$i}][name]" value="{$nw.name}"/>
+      <img src="profile/networking/{$nw.type}" alt="{$nw.name}" title="{$nw.name}" />
+      <span style="">{$nw.name}</span>
+    </div>
+    <div style="float: left">
+      <input type="text" name="networking[{$i}][address]" value="{$nw.address}"
+        {if $nw.error} class="error" {/if}
+        size="30"/>
+      <a href="javascript:removeNetworking({$i})">
+        {icon name=cross title="Supprimer cet élément"}
+      </a>
+    </div>
+  </td>
+</tr>
+
+{* vim:set et sw=2 sts=2 sws=2 enc=utf-8: *}
diff --git a/templates/profile/general.searchname.tpl b/templates/profile/general.searchname.tpl
new file mode 100644 (file)
index 0000000..085915d
--- /dev/null
@@ -0,0 +1,46 @@
+{**************************************************************************}
+{*                                                                        *}
+{*  Copyright (C) 2003-2008 Polytechnique.org                             *}
+{*  http://opensource.polytechnique.org/                                  *}
+{*                                                                        *}
+{*  This program is free software; you can redistribute it and/or modify  *}
+{*  it under the terms of the GNU General Public License as published by  *}
+{*  the Free Software Foundation; either version 2 of the License, or     *}
+{*  (at your option) any later version.                                   *}
+{*                                                                        *}
+{*  This program is distributed in the hope that it will be useful,       *}
+{*  but WITHOUT ANY WARRANTY; without even the implied warranty of        *}
+{*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *}
+{*  GNU General Public License for more details.                          *}
+{*                                                                        *}
+{*  You should have received a copy of the GNU General Public License     *}
+{*  along with this program; if not, write to the Free Software           *}
+{*  Foundation, Inc.,                                                     *}
+{*  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA               *}
+{*                                                                        *}
+{**************************************************************************}
+
+<span class="flags">
+    <input type="checkbox"
+        {if $sn.pub neq 'private'} checked="checked"{/if}
+        {if $sn.pub eq 'always public'} disabled="disabled"{else} name="search_name[{$i}][pub]"{/if}/>
+    {icon name="flag_green" title="site public"}
+</span>&nbsp;
+<input type="text" name="search_name[{$i}][name]" value="{$sn.search_name}" size="30"/>
+<select name="search_name[{$i}][type]">
+  <option value="firstname"{if $sn.name_type eq 'firstname'} selected="selected"{/if}>Prénom</option>
+  <option value="lastname"{if $sn.name_type eq 'lastname'} selected="selected"{/if}>Nom de famille</option>
+  <option value="surname"{if $sn.name_type eq 'surname'} selected="selected"{/if}>Surnom</option>
+</select>
+{if $sn.pub neq 'always public'}
+  <a href="javascript:removeSearchName({$i})">
+    {icon name=cross title="Supprimer ce nom de recherche"}
+  </a>
+  {if $newsn}
+    <span style="display:none" id="search_name_{$i}_new">Nouveau</span>
+  {else}
+    <input type="hidden" name="search_name[{$i}][removed]" value=""/>
+  {/if}
+{else}
+    {icon name="null"}
+{/if}
index e5c869b..ca61ca1 100644 (file)
   </tr>
   <tr>
     <td>
-      <span class="titre">Nom</span>
-      <span class="comm"></span>
+      <span class="titre">Nom</span><br/>
     </td>
     <td>
-      <input type='text' name='nom' {if $errors.nom}class="error"{/if} value="{$nom}" />
+      {$nom}
+      <input type='hidden' name='nom' {if $errors.nom}class="error"{/if} value="{$nom}" />
     </td>
   </tr>
   <tr>
     <td>
-      <span class="titre">Prénom</span>
-      <span class="comm"></span>
+      <span class="titre">Prénom</span><br/>
     </td>
     <td>
-      <input type='text' name='prenom' {if $errors.prenom}class="error"{/if} value="{$prenom}" />
+      {$prenom}
+      <input type='hidden' name='prenom' {if $errors.prenom}class="error"{/if} value="{$prenom}" />
     </td>
   </tr>
   <tr>
     <td>
-      <span class="titre">Promotion</span>
+      <span class="titre">Affichage de ton nom</span>
     </td>
     <td>
-      <span class="nom">X{$promo}{if ($promo != $promo_sortie - 3)} - X{math equation="a - b" a=$promo_sortie b=3}{/if}</span>
-      <span class="lien"><a href="profile/orange">modifier</a>{if ($promo_sortie -3 == $promo)} pour les oranges{/if}</span>
+      {if $tooltip_name}<span title="{$tooltip_name}" class="hint">{$display_name}</span>{else}{$display_name}{/if}
+      <a href="profile/edit#names_advanced" onclick="$('#names_advanced').show();$(this).hide();document.location = document.location + '#names_advanced';return false">
+        {icon name="page_edit" title="Plus de détail"}
+      </a>
     </td>
   </tr>
   <tr>
     <td>
-      <span class="titre">Nom d'usage</span><br />
-      {if $smarty.session.sexe}
-      <span class="comm">(Notamment nom d'épouse)</span>
-      {else}
-      <span class="comm">(si différent de {$nom} seulement)</span>
-      {/if}
+      <span class="titre">Promotion</span>
     </td>
     <td>
-      <span class="nom">{$nom_usage|default:"Aucun"}</span>
-      <span class="lien"><a href="profile/usage">{if $nom_usage}modifier{else}Faire une demande{/if}</a></span>
+      {if !$promo_choice}
+        <span class="nom">{$promo_display}</span>
+      {else}
+        <select name="promo_display">
+        {foreach from=$promo_choice item="promo_to_display"}
+          <option value="{$promo_to_display}" {if $promo_to_display eq $promo_display}selected="selected"{/if}>{$promo_to_display}</option>
+        {/foreach}
+        </select>
+      {/if}
+      <span class="lien"><a href="profile/orange" {if ($grad_year -3 == $entry_year)} {popup text="pour les oranges"}{/if}>{icon name="page_edit" title="modifier"}</a></span>
     </td>
   </tr>
   <tr>
-    <td class="titre">Date de naissance</td>
+    <td>
+      <span class="titre">Date de naissance</span>
+    </td>
     <td><input type="text" {if $errors.naissance}class="error"{/if} name="naissance" value="{$naissance}" /></td>
   </tr>
   <tr>
     </td>
     <td>
       <select name="nationalite">
-        {select_nat valeur=$nationalite}
+        {select_nat valeur=$nationalite pad=1}
       </select>
+      <a href="javascript:addNationality();">{icon name=add title="Ajouter une nationalité"}</a>
     </td>
   </tr>
-  <tr class="pair">
-    <td>
-      <span class="titre">Application</span><br />
-      <span class="comm">(4e année de l'X)</span>
-    </td>
+  <tr id="nationalite2" {if !$nationalite2}style="display: none"{/if}>
+    <td></td>
     <td>
-      <select name="appli1[id]" onchange="fillType(this.form['appli1[type]'], this.selectedIndex-1);">
-        {applis_options selected=$appli1.id}
-      </select>
-      <br />
-      <input type="hidden" name="appli1_tmp" value="{$appli1.type}" />
-      <select name="appli1[type]">
-        <option value=""></option>
+      <select name="nationalite2">
+        {select_nat valeur=$nationalite2 pad=1}
       </select>
+      <a href="javascript:delNationality('2');">{icon name=cross title="Supprimer cette nationalité"}</a>
     </td>
   </tr>
-  <tr class="pair">
+  <tr id="nationalite3" {if !$nationalite3}style="display: none"{/if}>
+    <td></td>
     <td>
-      <span class="titre">Post-application</span>
-    </td>
-    <td>
-      <select name="appli2[id]" onchange="fillType(this.form['appli2[type]'], this.selectedIndex-1);">
-        {applis_options selected=$appli2.id}
-      </select>
-      <br />
-      <input type="hidden" name="appli2_tmp" value="{$appli2.type}" />
-      <select name="appli2[type]">
-        <option value=""></option>
+      <select name="nationalite3">
+        {select_nat valeur=$nationalite3 pad=1}
       </select>
+      <a href="javascript:delNationality('3');">{icon name=cross title="Supprimer cette nationalité"}</a>
     </td>
   </tr>
-  <tr class="pair">
+</table>
+
+<table class="bicol" style="margin-bottom: 1em" summary="Profil&nbsp;: Formations">
+  <tr>
+    <th colspan="2">
+      <div class="flags" style="float: left">
+        <input type="checkbox" disabled="disabled" checked="checked" />
+        {icon name="flag_green" title="site public"}
+      </div>
+      Formations
+    </th>
+  </tr>
+  {foreach from=$edus key=eduid item=edu}
+    {cycle values="impair, pair" assign=class}
+    {include file="profile/edu.tpl" eduid=$eduid edu=$edu edu_fields=$edu_fields class=$class}
+  {/foreach}
+  {if $edus|@count eq 0}
+    {cycle values="impair, pair" assign=class}
+    {include file="profile/edu.tpl" eduid=0 edu=0 class=$class}
+  {/if}
+  {cycle values="impair, pair" assign=class}
+  {assign var=eduaddid value=$edus|@count}
+  <tr id="edu_add" class="edu_{$eduaddid} {$class}">
+    <td colspan="2">
+      <div class="center" style="clear: both; padding-top: 4px;">
+        <a href="javascript:addEdu();">
+          {icon name=add title="Ajouter une formation"} Ajouter une formation
+        </a>
+      </div>
+    </td>
+  </tr>
+  <tr class="{$class}">
     <td class="center" colspan="2">
       <small>Si ta formation ne figure pas dans la liste,
       <a href="mailto:support@{#globals.mail.domain#}">contacte-nous</a>.</small>
   </tr>
  </table>
 
+<table class="bicol" style="margin-bottom: 1em;display:none"
+  summary="Profil : Noms" id="names_advanced">
+  <tr>
+    <th colspan="2">
+      Noms
+    </th>
+  </tr>
+  <tr class="impair">
+    <td>
+      <span class="flags">
+        <input type="checkbox" checked="checked" disabled="disabled" />
+        {icon name="flag_green" title="site public"}
+      </span>&nbsp;
+      <span class="titre">Affichage courant de ton nom</span>
+      <a class="popup3" href="Xorg/Profil#name_displayed">{icon name="information" title="aide"}</a>
+    </td>
+    <td>
+      <input type="text" name="display_name" value="{$display_name}" size="40"/>
+    </td>
+  </tr>
+  <tr class="impair">
+    <td>
+      <span class="titre">explication</span>
+      <a class="popup3" href="Xorg/Profil#name_tooltip">{icon name="information" title="aide"}</a>
+    </td>
+    <td>
+      <input type="text" name="tooltip_name" value="{$tooltip_name}" size="40"/>
+    </td>
+  </tr>
+  <tr class="impair">
+    <td>
+      <span class="titre">ranger ce nom à</span>
+      <a class="popup3" href="Xorg/Profil#name_order">{icon name="information" title="aide"}</a>
+    </td>
+    <td>
+      <input type="text" name="sort_name" value="{$sort_name}" size="40"/>
+    </td>
+  </tr>
+  <tr class="impair">
+    <td>
+      <span class="flags">
+        <input type="checkbox" checked="checked" disabled="disabled" />
+        {icon name="flag_red" title="privé"}
+      </span>&nbsp;
+      <span class="titre">Comment on doit t'appeller</span>
+      <a class="popup3" href="Xorg/Profil#name_yourself">{icon name="information" title="aide"}</a>
+    </td>
+    <td>
+      <input type="text" name="yourself" value="{$yourself}" size="40"/>
+    </td>
+  </tr>
+  <tr class="impair">
+    <td colspan="2">
+      <span class="titre">Recherche</span><span class="smaller">, ta fiche apparaît quand on cherche un de ces noms</span>
+      <a class="popup3" href="Xorg/Profil#name_search">{icon name="information" title="aide"}</a>
+      {iterate from=$search_names item="sn"}
+      <div id="search_name_{$sn.sn_id}" style="padding:2px" class="center">
+        {include file="profile/general.searchname.tpl" i=$sn.sn_id sn=$sn}
+      </div>
+      {/iterate}
+      <div id="add_search_name" class="center" style="clear: both">
+        <a href="javascript:addSearchName()">
+          {icon name=add title="Ajouter un nom de recherche"} Ajouter un nom
+        </a>
+      </div>
+    </td>
+</table>
+
 {if !$no_private_key}
 <table class="bicol"  style="margin-bottom: 1em"
   summary="Profil&nbsp;: Informations générales">
     </th>
   </tr>
   <tr>
-    <td>
-      <span class="flags">
-        <input type="checkbox" checked="checked" disabled="disabled" />
-        {icon name="flag_red" title="privé"}
-      </span>&nbsp;
-      <span class="titre">Surnom</span>
-    </td>
-    <td>
-      <input type="text" size="35" maxlength="64"
-             {if $errors.nick}class="error"{/if} name="nick" value="{$nick}" />
+    <td colspan="2">
+      <span class="titre">Téléphones personnels</span>
     </td>
   </tr>
   <tr>
-    <td>
-      <span class="titre">Téléphone mobile</span>
-    </td>
-    <td>
-      <input type="text" size="18" maxlength="18" name="mobile"
-             {if $errors.mobile}class="error"{/if} value="{$mobile}" />
-      <span class="flags">
-        {include file="include/flags.radio.tpl" name="mobile_pub" val=$mobile_pub}
-      </span>
+    <td colspan="2">
+      {foreach from=$tels key=telid item=tel}
+        <div id="tels_{$telid}" style="clear: both; padding-top: 4px; padding-bottom: 4px">
+          {include file="profile/phone.tpl" prefname='tels' prefid='tels' telid=$telid tel=$tel}
+        </div>
+      {/foreach}
+      {if $tels|@count eq 0}
+        <div id="tels_0" style="clear: both; padding-top: 4px; padding-bottom: 4px">
+          {include file="profile/phone.tpl" prefname='tels' preid='tels' telid=0 tel=0}
+        </div>
+      {/if}
+      <div id="tels_add" class="center" style="clear: both; padding-top: 4px;">
+        <a href="javascript:addTel('tels', 'tels');">
+          {icon name=add title="Ajouter un téléphone"} Ajouter un téléphone
+        </a>
+      </div>
     </td>
   </tr>
+  {if $email_error}
+    {include file="include/emails.combobox.tpl" name="email_directory" val=$email_directory_error error=$email_error}
+  {else}{include file="include/emails.combobox.tpl" name="email_directory" val=$email_directory error=$email_error}{/if}
   <tr>
-    <td>
-      <span class="flags">
-        <label><input type="checkbox" name="web_pub" {if $web_pub eq 'public'}checked="checked"{/if} />
-        {icon name="flag_green" title="site public"}</label>
-      </span>&nbsp;
-      <span class="titre">Page web Perso</span>
+    <td colspan="2">
+      <span class="titre">Messageries, networking et sites web</span>
     </td>
-    <td>
-      <input type="text" size="35" maxlength="95" name="web"
-             {if $errors.web}class="error"{/if} value="{$web}" />
+  </tr>
+  {foreach from=$networking item=network key=id}
+    {include file="profile/general.networking.tpl" nw=$network i=$id}
+  {/foreach}
+  <tr id="networking">
+    <script type="text/javascript">//<![CDATA[
+      var nw_list = new Array();
+      {foreach from=$network_list item=network}
+        nw_list['{$network.name}'] = {$network.type};
+      {/foreach}
+    //]]></script>
+    <td colspan="2">
+      <div id="nw_add" class="center">
+        <a href="javascript:addNetworking();">
+          {icon name=add title="Ajouter une adresse"} Ajouter une adresse
+        </a>
+      </div>
     </td>
   </tr>
+<!--  <tr id="networking">
+    <td colspan="2">
+      <div style="float: left; width: 200px;">
+        <span class="titre" style="margin-left:1em;">Type à ajouter</span>
+      </div>
+      <div style="float: left;">
+        <div id="nw_type_ac" style="background-color: white; border: solid 1px black; position: absolute; width: 208px; display: none">TEST</div>
+        <input type="text" size="30" id="nw_type" name="nw_type" onkeyup="updateNetworking()">
+        <span id="nw_add" style="display: none">
+          <a href="javascript:addNetworking();">{icon name=add title="Ajouter cette adresse"}</a>
+        </span>
+      </div>
+    </td>
+  </tr>-->
   <tr class="pair">
     <td>
       <div>
           <label><input type="checkbox" name="freetext_pub" {if $freetext_pub eq 'public'}checked="checked"{/if} />
           {icon name="flag_green" title="site public"}</label>
         </span>&nbsp;
-        <span class="titre">Complément libre</span><br />
-        <span class="comm">Commentaire ? ICQ ? etc...</span>
+        <span class="titre">Commentaire</span>
       </div>
       <div class="smaller" style="margin-top: 30px">
         <a href="wiki_help/notitle" class="popup3">
index 366e804..9d5e890 100644 (file)
         <a href="mailto:support@{#globals.mail.domain#}">contacte-nous</a>.</small>
       </td>
     </tr>
-    <tr class="pair">
-      <td colspan="2">
-        <span class="titre">Email professionnel&nbsp;:</span>
-        <input type="text" size="30" maxlength="60" {if $job.email_error}class="error"{/if}
-               name="{$jobpref}[email]" value="{$job.email}" />
-        <span class="flags">
-          {include file="include/flags.radio.tpl" name="`$jobpref`[email_pub]" val=$job.mail_pub}
-        </span>
-      </td>
-    </tr>
+    {include file="include/emails.combobox.tpl" name=$jobpref|cat:'[email]' val=$job.email class="pair" i=$i error=$job.email_error}
     <tr class="pair">
       <td colspan="2">
         <div style="float: left">
             {include file="geoloc/form.address.tpl" name="`$jobpref`[adr]" id="`$jobid`_adr" adr=$job.adr}
           </div>
         </div>
-        <div style="float: right; width: 50%">
-          <div class="titre">Téléphone</div>
-          <div class="flags">
-            {include file="include/flags.radio.tpl" name="`$jobpref`[tel_pub]" val=$job.tel_pub}
+      </td>
+    </tr>
+    <tr class="pair">
+      <td colspan="2">
+        {foreach from=$job.tel key=t item=tel}
+          <div id="{"`$jobid`_tel_`$t`"}" style="clear: both">
+            {include file="profile/phone.tpl" prefname="`$jobpref`[tel]" prefid="`$jobid`_tel" telid=$t tel=$tel}
+          </div>
+        {/foreach}
+        {if $job.tel|@count eq 0}
+          <div id="{"`$jobid`_tel_0"}" style="clear: both">
+            {include file="profile/phone.tpl" prefname="`$jobpref`[tel]" prefid="`$jobid`_tel" telid=0 tel=0}
           </div>
-          <table style="clear: both">
-            <tr>
-              <td>Bureau&nbsp;:</td>
-              <td>
-                <input type="text" size="18" maxlength="18" {if $job.tel_error}class="error"{/if}
-                       name="{$jobpref}[tel]" value="{$job.tel}" />
-              </td>
-            </tr>
-            <tr>
-              <td>Fax&nbsp;:</td>
-              <td>
-                <input type="text" size="18" maxlength="18" {if $job.fax_error}class="error"{/if}
-                       name="{$jobpref}[fax]" value="{$job.fax}" /></td>
-            </tr>
-            <tr>
-              <td>Mobile&nbsp;:</td>
-              <td>
-                <input type="text" size="18" maxlength="18" {if $job.mobile_error}class="error"{/if}
-                       name="{$jobpref}[mobile]" value="{$job.mobile}" />
-              </td>
-            </tr>
-          </table>
+        {/if}
+        <div id="{$jobid}_tel_add" class="center" style="clear: both; padding-top: 4px;">
+          <a href="javascript:addTel('{$jobid}_tel', '{$jobpref}[tel]')">
+            {icon name=add title="Ajouter un numéro de téléphone"} Ajouter un numéro de téléphone
+          </a>
         </div>
       </td>
     </tr>
index 3bfa587..7e1a227 100644 (file)
   <a href="javascript:addJob()">
     {icon name=add title="Ajouter un emploi"} Ajouter un emploi
   </a>
+  <br/><br/>
 </div>
 
+<table class="bicol" style="margin-bottom: 1em" summary="Corps">
+  <tr>
+    <th colspan="2">
+      <div class="flags" style="float: left; text-align: left">
+        {include file="include/flags.radio.tpl" name="corps[pub]" val=$corps.pub}
+      </div>
+      Corps
+    </th>
+  </tr>
+  <tr>
+    <td class="titre">Corps d'origine</td>
+    <td>
+      <select name="corps[original]">
+        {foreach from=$original_corps item=o_corps}
+        <option value="{$o_corps.id}" {if $o_corps.id eq $corps.original}selected="selected"{/if}>{$o_corps.name}</option>
+        {/foreach}
+      </select>
+    </td>
+  </tr>
+  <tr>
+    <td class="titre">Corps actuel</td>
+    <td>
+      <select name="corps[current]">
+        {foreach from=$current_corps item=c_corps}
+        <option value="{$c_corps.id}" {if $c_corps.id eq $corps.current}selected="selected"{/if}>{$c_corps.name}</option>
+        {/foreach}
+      </select>
+    </td>
+  </tr>
+  <tr>
+    <td class="titre">Grade</td>
+    <td>
+      <select name="corps[rank]">
+        {foreach from=$corps_rank item=rank}
+        <option value="{$rank.id}" {if $rank.id eq $corps.rank}selected="selected"{/if}>{$rank.name}</option>
+        {/foreach}
+      </select>
+    </td>
+  </tr>
+</table>
+
 <table class="bicol" summary="CV" style="margin-top: 1.5em">
   <tr>
     <th>
index 52bc047..bf54ca1 100644 (file)
 {else}
 
 <p>
-  Afin de pouvoir être considéré(e) à la fois dans ta promotion d'origine et ta
+  Afin de pouvoir être considéré{if $sexe}e{/if} à la fois dans ta promotion d'origine et ta
   ou tes promotions d'adoption tu peux entrer ici ton année de sortie de l'école.
   Plus précisément, il s'agit de l'année d'entrée en quatrième année ou année d'application.
-  Pour tes cocons d'origine (X{$promo}) il s'agit de l'année {math equation="a + b" a=$promo b=3}.
+  Pour tes cocons d'origine ({$promo_display}) il s'agit de l'année {math equation="a + b" a=$promo b=3}.
 </p>
 
 <br />
diff --git a/templates/profile/phone.tpl b/templates/profile/phone.tpl
new file mode 100644 (file)
index 0000000..40715be
--- /dev/null
@@ -0,0 +1,51 @@
+{**************************************************************************}
+{*                                                                        *}
+{*  Copyright (C) 2003-2008 Polytechnique.org                             *}
+{*  http://opensource.polytechnique.org/                                  *}
+{*                                                                        *}
+{*  This program is free software; you can redistribute it and/or modify  *}
+{*  it under the terms of the GNU General Public License as published by  *}
+{*  the Free Software Foundation; either version 2 of the License, or     *}
+{*  (at your option) any later version.                                   *}
+{*                                                                        *}
+{*  This program is distributed in the hope that it will be useful,       *}
+{*  but WITHOUT ANY WARRANTY; without even the implied warranty of        *}
+{*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *}
+{*  GNU General Public License for more details.                          *}
+{*                                                                        *}
+{*  You should have received a copy of the GNU General Public License     *}
+{*  along with this program; if not, write to the Free Software           *}
+{*  Foundation, Inc.,                                                     *}
+{*  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA               *}
+{*                                                                        *}
+{**************************************************************************}
+
+{assign var=telpref value="`$prefname`[`$telid`]"}
+{assign var=id value="`$prefid`_`$telid`"}
+<div class="titre" style="float: left; width: 2.5em">N°{$telid+1}</div>
+<div style="float: left;">
+  <select name="{$telpref}[type]">
+    <option value="fixed"{if $tel.type eq 'fixed'} selected="selected"{/if}>Fixe</option>
+    <option value="mobile"{if $tel.type eq 'mobile'} selected="selected"{/if}>Mobile</option>
+    <option value="fax"{if $tel.type eq 'fax'} selected="selected"{/if}>Fax</option>
+  </select>
+  <input type="hidden" name="{$telpref}[removed]" value="0"/>
+  <input type="text" size="19" maxlength="28" name="{$telpref}[tel]" {if $tel.error}class="error"{/if} value="{$tel.tel}" />
+  <a href="javascript:removeTel('{$id}')">
+    {icon name=cross title="Supprimer ce numéro de téléphone"}
+  </a>
+  <a id="{$id}_addComment" href="javascript:addPhoneComment('{$id}', '{$telpref}')" {if $tel.comment neq ''}style="display:none" {/if}>
+    {icon name=comments title="Ajouter un commentaire"}
+  </a>
+</div>
+<div style="float: right" class="flags">
+  {include file="include/flags.radio.tpl" name="`$telpref`[pub]" val=$tel.pub}
+</div>
+<div id="{$id}_comment" style="clear: both;{if $tel.comment eq ''} display:none{/if}">
+  Commentaire :
+  <input type="text" size="45" maxlength="80" name="{$telpref}[comment]" {if $tel.error}class="error"{/if} value="{$tel.comment}"/>
+  <a href="javascript:removePhoneComment('{$id}', '{$telpref}')">
+    {icon name=cross title="Supprimer le commentaire"}
+  </a>
+</div>
+{* vim:set et sw=2 sts=2 sws=2 enc=utf-8: *}
index ad3816d..405e3af 100644 (file)
@@ -50,6 +50,20 @@ function chgMainWinLoc(strPage)
       {if $x.gpxs_join}<div><em class="intitule">Groupe{if count($x.gpxs) > 1}s{/if} et institution{if count($x.gpxs) > 1}s{/if} X&nbsp;: </em>
       <span><br/>{$x.gpxs_join|smarty:nodefaults}</span></div>{/if}
     {/if}
+    {if $x.networking}
+      <h2>Sur le web...</h2>
+      {foreach from=$x.networking item=network}
+        <img style="width: auto; padding: 0" src="profile/networking/{$network.type}" alt="{$network.name}" title="{$network.name}"/>
+        {if $network.filter == 'web'}
+          <a href="{$network.address}">{$network.address}</a>
+        {elseif $network.link != ''}
+          <a href="{$network.link}">{$network.address}</a>
+        {else}
+          {$network.address}
+        {/if}
+        <br/>
+      {/foreach}
+    {/if}
     {if $x.freetext}
     <h2>Commentaires&nbsp;:</h2>
     <span>{$x.freetext|miniwiki|smarty:nodefaults}</span>
@@ -58,11 +72,10 @@ function chgMainWinLoc(strPage)
   <div id="fiche_identite" class="part">
     <div class="civilite">
       {if $user->isFemale()}&bull;{/if}
-      {$user->fullName()}{if $x.nom_usage neq ""} ({$x.nom}){/if}
+      <span {if $x.name_tooltip neq ""}class="hinted" title="{$x.name_tooltip}"{/if}>{$x.name_display}</span>
       {if $logged}
       {if $x.nickname} (alias {$x.nickname}){/if}
       {/if}
-      {if $x.web}&nbsp;<a href="{$x.web}">{icon name="world_go" title="Site Web"}</a>{/if}
       {if $logged}
       &nbsp;{if !$x.dcd}<a href="vcard/{$user->login()}.vcf">{*
         *}{icon name=vcard title="Afficher la carte de visite"}</a>{/if}
@@ -88,7 +101,7 @@ function chgMainWinLoc(strPage)
       le {$x.date|date_format}
     </div>
     {/if}
-    {if $logged || $x.mobile}
+    {if $logged || $x.tels}
     <div class="contact">
       {if $logged}
       <div class='email'>
@@ -111,27 +124,36 @@ function chgMainWinLoc(strPage)
         {/if}
       </div>
       {/if}
-      {if $x.mobile}
-      <div class="mob">
-        <em class="intitule">Mobile&nbsp;: </em>{$x.mobile}
-      </div>
+      {if $x.tels}
+        {display_phones tels=$x.tels}
       {/if}
       <div class='spacer'></div>
     </div>
     {/if}
     <div class='formation'>
-      {if $x.iso3166}
-      <img src='images/flags/{$x.iso3166}.gif' alt='{$x.nationalite}' height='11' title='{$x.nationalite}' />&nbsp;
+      {if $x.iso3166_1}
+      <img src='images/flags/{$x.iso3166_1}.gif' alt='{$x.nationalite}' height='11' title='{$x.nationalite}' />&nbsp;
       {/if}
-      X {$user->promo()}
-      {if $x.promo_sortie && ($x.promo_sortie-3 > $x.promo)}
-        - X {math equation="a-b" a=$x.promo_sortie b=3}
+      {if $x.iso3166_2}
+      <img src='images/flags/{$x.iso3166_2}.gif' alt='{$x.nationalite2}' height='11' title='{$x.nationalite2}' />&nbsp;
       {/if}
-      {if $x.applis_join}
-        &nbsp;-&nbsp;Formation&nbsp;: {$x.applis_join|smarty:nodefaults}
+      {if $x.iso3166_3}
+      <img src='images/flags/{$x.iso3166_3}.gif' alt='{$x.nationalite3}' height='11' title='{$x.nationalite3}' />&nbsp;
       {/if}
+      {$user->promo()}
       {if $logged && $x.is_referent}
-      [<a href="referent/{$user->login()}" class='popup2'>Ma fiche référent</a>]
+      [<a href="referent/{$x.forlife}" class='popup2'>Ma fiche référent</a>]
+      {/if}
+      {if $x.education}
+        &nbsp;-&nbsp;Formation&nbsp;:
+        <ul>
+        {foreach from=$x.education item="edu"}
+          <li>{$edu|smarty:nodefaults}</li>
+        {/foreach}
+        </ul>
+      {/if}
+      {if $x.corps}
+        {$x.corps|smarty:nodefaults}
       {/if}
     </div>
   </div>
index 3aba3c2..29bdea5 100644 (file)
 
     if (schoolId) {
       $(".autocomplete[@name='schoolTxt']").addClass('hidden_valid');
-
-      $("[@name='diploma']").parent().load(baseurl + 'list/diploma/', { school:schoolId }, function() {
-          if ($("select[@name='diploma']").children("option").size() > 1) {
-            $("select[@name='diploma']").attr('value', '{/literal}{$smarty.request.diploma}{literal}');
-          } else {
-            $("select[@name='diploma']").attr('value', '');
-          }
-        });
     } else {
       $(".autocomplete[@name='schoolTxt']").removeClass('hidden_valid');
-
-      $("select[@name='diploma']").attr('value', '');
     }
+
+    $("[@name='diploma']").parent().load(baseurl + 'list/diploma/', { school:schoolId }, function() {
+        $("select[@name='diploma']").attr('value', '{/literal}{$smarty.request.diploma}{literal}');
+      });
   }
 
   // when choosing autocomplete from list, must validate
@@ -404,6 +398,29 @@ checked="checked"{/if}/>Chercher uniquement les adresses où les camarades sont
       <td>Commentaire contient</td>
       <td><input type="text" name="free" size="32" value="{$smarty.request.free}" /></td>
     </tr>
+    <tr>
+      <td>Numéro de téléphone</td>
+      <td><input type="text" name="phone_number" size="32" value="{$smarty.request.phone_number}"/></td>
+    </tr>
+    <tr>
+      <td style="vertical-align: middle">
+        <span>Networking et sites webs</span>
+      </td>
+      <td>
+        <table>
+          <tr>
+            <td style="padding-left: 0px;">
+              <input type="text" name="networking_address" size="32" value="{$smarty.request.networking_address}" />
+            </td>
+            <td>
+              <input type="text" name="networking_typeTxt" class="autocomplete" size="10" value="{$smarty.request.networking_typeTxt}" />
+              <input name="networking_type" class="autocompleteTarget" type="hidden" value="{$smarty.request.networking_type}"/>
+              <a href="networking_type" class="autocompleteToSelect">{icon name="table" title="Tous les types d'adresse"}</a>
+            </td>
+          </tr>
+        </table>
+      </td>
+    </tr>
         {if $smarty.session.auth ge AUTH_COOKIE}
     <tr>
       <td colspan="2">
index 2372f6d..1a25e3a 100644 (file)
 <select name="diploma">
 <option value=""> - </option>
 {section name=diploma loop=$choix_diplomas}
-<option value="{$choix_diplomas[diploma]}">
-  {$choix_diplomas[diploma]}
+{assign var=i value=$choix_diplomas[diploma]}
+{assign var=id value=$i-1}
+<option value="{$i}">
+  {$name_diplomas[$id]}
 </option>
 {/section}
 </select>
diff --git a/upgrade/merge-0.0.1/000_1920.sql b/upgrade/merge-0.0.1/000_1920.sql
new file mode 100644 (file)
index 0000000..0e6a0ed
--- /dev/null
@@ -0,0 +1,9 @@
+set @n = 19200001;
+
+INSERT INTO  auth_user_md5 (matricule, matricule_ax, promo, promo_sortie, nom_ini, prenom_ini, perms, nom, prenom)
+     SELECT  @n := @n + 1, id_ancien, promotion_etude, promotion_etude + 3, CONCAT(partic_patro, Nom_patronymique), prenom,
+             'pending', CONCAT(partic_patro, Nom_patronymique), prenom
+       FROM  fusionax_anciens
+      WHERE  promotion_etude = 1920;
+
+-- vim:set syntax=mysql:
diff --git a/upgrade/merge-0.0.1/00_names.sql b/upgrade/merge-0.0.1/00_names.sql
new file mode 100644 (file)
index 0000000..1bce81d
--- /dev/null
@@ -0,0 +1,8 @@
+CREATE OR REPLACE ALGORITHM=MERGE VIEW  fusionax_xorg_anciens AS
+                                SELECT  u.user_id, u.matricule_ax, u.promo,
+                                        n.display AS display_name, n.sort AS sort_name,
+                                        u.nom, u.prenom
+                                  FROM  auth_user_md5         AS u
+                            INNER JOIN  profile_names_display AS n ON (n.user_id = u.user_id);
+
+-- vim:set syntax=mysql:
diff --git a/upgrade/merge-0.0.1/01_emails.sql b/upgrade/merge-0.0.1/01_emails.sql
new file mode 100644 (file)
index 0000000..55de747
--- /dev/null
@@ -0,0 +1,19 @@
+INSERT INTO  profile_directory (uid, email_directory)
+     SELECT  user_id, Mel_usage
+       FROM  fusionax_anciens AS ax
+ INNER JOIN  auth_user_md5    AS u ON (ax.id_ancien = u.matricule_ax)
+      WHERE  Mel_publiable != '0' AND Mel_usage != '';
+
+INSERT IGNORE INTO  register_marketing (uid, email, type)
+            SELECT  user_id, Mel_usage, 'ax'
+              FROM  fusionax_anciens AS ax
+        INNER JOIN  auth_user_md5    AS u ON (ax.id_ancien = u.matricule_ax)
+         LEFT JOIN  emails           AS e ON (e.uid = u.user_id AND e.flags = 'active')
+             WHERE  Mel_usage != '' AND
+                    Mel_usage NOT LIKE '%@polytechnique.edu' AND
+                    Mel_usage NOT LIKE '%@polytechnique.org' AND
+                    Mel_usage NOT LIKE '%@m4x.org' AND
+                    Mel_usage NOT LIKE '%@melix.%' AND
+                    e.email IS NULL;
+
+-- vim:set syntax=mysql:
diff --git a/upgrade/merge-0.0.1/02_ax_data.sql b/upgrade/merge-0.0.1/02_ax_data.sql
new file mode 100644 (file)
index 0000000..1fc96e8
--- /dev/null
@@ -0,0 +1,23 @@
+CREATE TABLE IF NOT EXISTS alumni_data (
+  uid INT(11) NOT NULL,
+  matricule_ax CHAR(8) UNSIGNED NOT NULL,
+  login_ax VARCHAR(15) NOT NULL,
+  passwd_ax INT(11) UNSIGNED DEFAULT NULL,
+  promo_type ENUM('', 'A', 'B', 'C', 'N', 'S') NOT NULL,
+  membership_type ENUM('', '*', 'F', 'FB', 'P', 'PB', 'T', 'TB', 'TA') NOT NULL,
+  salutation ENUM('', '.', 'M', 'MME', 'MLLE') NOT NULL,
+  last_dues_paid_year INT(4) UNSIGNED NOT NULL,
+  represents ENUM('', 'K', 'DE') NOT NULL,
+  checked TINYINT(1) UNSIGNED NOT NULL DEFAULT 0,
+  PRIMARY KEY (uid)
+) CHARSET=utf8;
+
+
+INSERT INTO  alumni_data (uid, matricule_ax, login_ax, passwd_ax, promo_type, membership_type,
+             salutation, last_dues_paid_year, represents, checked)
+     SELECT  u.user_id, u.matricule_ax, f.Login, f.Password, f.Groupe_promo,
+             f.Type_membre, f.Civilite, f.annee_dernCot, f.Representant, 0
+       FROM  fusionax_anciens AS f
+ INNER JOIN  auth_user_md5    AS u ON (f.id_ancien = u.matricule_ax);
+
+-- vim:set syntax=mysql:
diff --git a/upgrade/merge-0.0.1/03_corps.sql b/upgrade/merge-0.0.1/03_corps.sql
new file mode 100644 (file)
index 0000000..856d082
--- /dev/null
@@ -0,0 +1,636 @@
+INSERT IGNORE INTO  profile_corps_rank_enum (abbreviation, name)
+            VALUES  (" ", "Aucun"),
+                    ("A", "Amiral"),
+                    ("A2", "Amiral 2e Son"),
+                    ("ADC", "Adm.Civil"),
+                    ("ADC2", "Adm.Civil retr."),
+                    ("ADC3", "Adm.Civil cg."),
+                    ("ADC4", "Adm.Civil dém."),
+                    ("ADC5", "Adm.Civil dét."),
+                    ("ADC6", "Adm.Civil dis."),
+                    ("ADC7", "Adm.Civil (H.C)"),
+                    ("ADC8", "Adm.Civil h.cl."),
+                    ("ADHC", "Adm. h.cl.INSEE"),
+                    ("ADHC2", "Adm.h.cl.INSEE retr."),
+                    ("ADHC3", "Adm.h.cl.INSEE cg."),
+                    ("ADHC4", "Adm.h.cl.INSEE dém."),
+                    ("ADHC5", "Adm.h.cl.INSEE dét."),
+                    ("ADHC6", "Adm.h.cl.INSEE dis."),
+                    ("ADHC7", "Adm.h.cl.INSEE (H.C.)"),
+                    ("ADIN", "Adm.INSEE"),
+                    ("ADIN2", "Adm.INSEE retr."),
+                    ("ADIN3", "Adm.INSEE cg"),
+                    ("ADIN4", "Adm.INSEE dém."),
+                    ("ADIN5", "Adm.INSEE dét."),
+                    ("ADIN6", "Adm.INSEE dis."),
+                    ("ADIN7", "Adm.INSEE (H.C.)"),
+                    ("CA", "Contre-Amiral"),
+                    ("CA2", "Contre-Amiral 2e Son"),
+                    ("CAA", "Contrôleur des Armées"),
+                    ("CB", "Chef de bataillon"),
+                    ("CB2", "Chef de bataillon retr."),
+                    ("CB8", "Chef de bataillon rés."),
+                    ("CBH", "Chef de bataillon"),
+                    ("CC", "Capitaine de Corvette"),
+                    ("CC2", "Capitaine de Corvette retr."),
+                    ("CC8", "Capitaine de Corvette rés."),
+                    ("CCA", "Commiss. Contr. Ass."),
+                    ("CCA2", "Commiss. Contr. Ass. retr."),
+                    ("CCA3", "Commiss. Contr. Ass. cg."),
+                    ("CCA4", "Commiss. Contr. Ass. dém."),
+                    ("CCA5", "Commiss. Contr. Ass. dét."),
+                    ("CCA6", "Commiss. Contr. Ass. dis."),
+                    ("CCA7", "Commiss. Contr. Ass. (HC)"),
+                    ("CCCA", "Commiss. Contr. Ch. Ass."),
+                    ("CCCA2", "Commiss. Contr. Ch. Ass. retr."),
+                    ("CCCA3", "Commiss. Contr. Ch. Ass. cg."),
+                    ("CCCA4", "Commiss. Contr. Ch. Ass. dém."),
+                    ("CCCA5", "Commiss. Contr. Ch. Ass. dét."),
+                    ("CCCA6", "Commiss. Contr. Ch. Ass. dis."),
+                    ("CCCA7", "Commiss. Contr. Ch. Ass. (HC)"),
+                    ("CCGA", "Commiss. Contr. Gén. Ass."),
+                    ("CCGA2", "Commiss. Contr. Gén. Ass.retr."),
+                    ("CCGA3", "Commiss. Contr. Gén. Ass. cg."),
+                    ("CCGA4", "Commiss. Contr. Gén. Ass. dém."),
+                    ("CCGA5", "Commiss. Contr. Gén. Ass. dét."),
+                    ("CCGA6", "Commiss. Contr. Gén. Ass. dis."),
+                    ("CCGA7", "Commiss. Contr. Gén. Ass. (HC)"),
+                    ("CCH", "Capitaine de Corvette hon."),
+                    ("Cdt", "Commandant"),
+                    ("Cdt2", "Commandant retr."),
+                    ("Cdt5", "Commandant dém."),
+                    ("Cdt8", "Commandant de rés."),
+                    ("CE", "Chef d'Escadron"),
+                    ("CE2", "Chef d'Escadron retr."),
+                    ("CE3", "Chef d'Escadrons"),
+                    ("CE4", "Chef d'Escadrons"),
+                    ("CE5", "Chef d'Escadrons de rés."),
+                    ("CF", "Capitaine de Frégate"),
+                    ("CF2", "Capitaine de Frégate"),
+                    ("CF9", "Capitaine de Frégate (CR)"),
+                    ("CFC1", "Ing.ch.SNCF"),
+                    ("CFC11", "Ing.ch.h.cl.SNCF"),
+                    ("CFC2", "Ing.ch.retr.SNCF"),
+                    ("CFC3", "Ing.ch.hon.SNCF"),
+                    ("CFC31", "Ing.ch.h.cl.SNCF"),
+                    ("CFC4", "Ing.ch.H.C.hon.SNCF"),
+                    ("CFC5", "Ing.ch.h.cl.hon.SNCF"),
+                    ("CFC6", "Ing.ch.h.cl.retr.SNCF"),
+                    ("CFD1", "Direct.Gén.SNCF"),
+                    ("CFD2", "Direct.Gén.hon.SNCF"),
+                    ("CFD3", "Direct.SNCF"),
+                    ("CFD4", "Direct.hon.SNCF"),
+                    ("CFD5", "Direct.retr.SNCF"),
+                    ("CFD6", "DGA hon.SNCF"),
+                    ("CFG1", "Ing.gén.SNCF"),
+                    ("CFG2", "Ing.gén.retr.SNCF"),
+                    ("CFG3", "Ing.gén.hon.SNCF"),
+                    ("CFH", "Capitaine de Frégate hon."),
+                    ("CFP1", "Ing.pp.SNCF"),
+                    ("CFP2", "Ing.pp.retr.SNCF"),
+                    ("CFP3", "Ing.pp.hon.SNCF"),
+                    ("CFP4", "Ing.pp.H.C.hon.SNCF"),
+                    ("CFP5", "Ing.pp.h.cl.hon.SNCF"),
+                    ("CFP6", "Ing.pp.h.cl.SNCF"),
+                    ("CGA", "Contrôleur Général des Armées"),
+                    ("CGA2", "Contrôl.Gén.des Armées 2e Son"),
+                    ("Cne", "Capitaine"),
+                    ("Cne2", "Capitaine retr."),
+                    ("Cne5", "Capitaine dém."),
+                    ("Cne6", "Capitaine dis."),
+                    ("Cne8", "Capitaine de rés."),
+                    ("Col", "Colonel"),
+                    ("Col2", "Colonel retr."),
+                    ("Col3", "Colonel Brth retr."),
+                    ("Col4", "Colonel (Air) retr."),
+                    ("Col5", "Colonel hon.(Air)"),
+                    ("Colh", "Colonel hon."),
+                    ("COM1C", "Commiss.1e cl.Marine"),
+                    ("COM2", "Commiss.Marine retr."),
+                    ("COM2C", "Commiss.2e cl.Marine"),
+                    ("COM4", "Commiss.Marine dém."),
+                    ("COM8", "Commiss.Marine rés."),
+                    ("COMC", "Commiss.ch.Marine"),
+                    ("COMC1", "Commiss.ch.1e cl.Marine"),
+                    ("COMC2", "Commiss.ch.Marine retr."),
+                    ("COMC8", "Commiss.ch.Marine rés."),
+                    ("COMD", "Commiss.Cdt"),
+                    ("COMG", "Comm.Gén.Mar.2e Son"),
+                    ("COMG1", "Comm.Gén.1e cl.Mar.2e Son"),
+                    ("COMG2", "Comm.Gén.2e cl.Mar.2e Son"),
+                    ("COMGP", "Commiss.gén.aux prix hon."),
+                    ("COMP", "Commiss.pp.Marine"),
+                    ("COMP2", "Commiss.pp Marine retr."),
+                    ("COMP8", "Commiss.pp.Marine rés."),
+                    ("CONE", "Contrôl.Gén Eco.et Financ."),
+                    ("CONE2", "Contrôl.Gén Eco.et Financ.ret"),
+                    ("CONE3", "Contrôl.Gén Eco.et Financ.cg."),
+                    ("CONE4", "Contrôl.Gén Eco.et Financ.dém."),
+                    ("CONE5", "Contrôl.Gén Eco.et Financ.dét."),
+                    ("CONE6", "Contrôl.Gén Eco.et Financ. dis"),
+                    ("CONE7", "Contrôl.Gén Eco.et Financ.H.C."),
+                    ("CONEH", "Contrôl.Gén Eco.et Financ.hon."),
+                    ("CV", "Capitaine de Vaisseau"),
+                    ("CV2", "Capitaine de Vaisseau retr."),
+                    ("CV9", "Capitaine de Vaisseau (CR)"),
+                    ("CVH", "Capitaine de Vaisseau hon."),
+                    ("DRT", "Direct.rég.Téléc."),
+                    ("DRT2", "Direct.rég.Téléc. retr."),
+                    ("DRT3", "Direct.rég.Téléc. cg."),
+                    ("DRT4", "Direct.rég.Téléc. dém."),
+                    ("DRT5", "Direct.rég.Téléc. dét."),
+                    ("DRT6", "Direct.rég.Téléc. dis."),
+                    ("DRT7", "Direct.rég.Téléc. (H.C.)"),
+                    ("DRT8", "Direct.rég.Téléc. hon."),
+                    ("EF2", "Ing.EDF retr."),
+                    ("EF3", "Ing.EDF cg."),
+                    ("EF4", "Ing.EDF dém."),
+                    ("EF5", "Ing.EDF dét."),
+                    ("EF6", "Ing.EDF dis."),
+                    ("EFC2", "Ing.ch.EDF retr."),
+                    ("EFC3", "Ing.ch.EDF cg."),
+                    ("EFC4", "Ing.ch.EDF dém."),
+                    ("EFC5", "Ing.ch.EDF dét."),
+                    ("EFC6", "Ing.ch.EDF dis."),
+                    ("EFC7", "Ing.ch.EDF (HC)"),
+                    ("EFCO1", "Contrôl.gén.hon.EDF"),
+                    ("EFD", "Direct. EDF"),
+                    ("EFD2", "Direct.hon.EDF"),
+                    ("EFDG", "Direct.Gén. EDF"),
+                    ("EFDG2", "Direct.Gén.hon.EDF"),
+                    ("EFG2", "Ing.gén.EDF retr."),
+                    ("EFGH", "Insp.gén.hon.EDF"),
+                    ("EFP2", "Ing.pp.EDF retr."),
+                    ("EFP3", "Ing.pp.EDF cg."),
+                    ("EFP4", "Ing.pp.EDF dém."),
+                    ("EFP5", "Ing.pp.EDF dét."),
+                    ("EFP6", "Ing.pp.EDF dis."),
+                    ("EFP7", "Ing.pp.EDF (HC)"),
+                    ("EFS", "Insp.gén.EDF"),
+                    ("EFS2", "Insp.gén.EDF retr."),
+                    ("EFS3", "Insp.gén.hon. EDF"),
+                    ("ESC", "Ing.ch.des Essences"),
+                    ("ESC10", "Ing.ch. 1e cl.des Essence CR"),
+                    ("ESC2", "Ing.ch.des Essences retr."),
+                    ("ESC3", "Ing.ch.des Essences cg."),
+                    ("ESC4", "Ing.ch.des Essences dém."),
+                    ("ESC5", "Ing.ch.des Essences dét."),
+                    ("ESC6", "Ing.ch.des Essences dis."),
+                    ("ESC7", "Ing.ch.des Essences (H.C.)"),
+                    ("ESC9", "Ing.ch.des Essences CR"),
+                    ("ESG", "Ing.gén.des Essences"),
+                    ("ESG2", "Ing.gén.des Essences retr."),
+                    ("ESG3", "Ing.gén.des Essences cg."),
+                    ("ESG4", "Ing.gén.des Essences dém."),
+                    ("ESG5", "Ing.gén.des Essences dét."),
+                    ("ESG6", "Ing.gén.des Essences dis."),
+                    ("ESG7", "Ing.gén.des Essences (H.C.)"),
+                    ("ESI", "Ing.des Essences"),
+                    ("ESI2", "Ing.des Eseences retr."),
+                    ("ESI3", "Ing.des Essences cg."),
+                    ("ESI4", "Ing.des Essences dém."),
+                    ("ESI5", "Ing.des Essences dét."),
+                    ("ESI6", "Ing.des Essences dis."),
+                    ("ESI7", "Ing.des Essences (H.C.)"),
+                    ("EV", "Enseigne de Vaisseau"),
+                    ("GA", "Général d'Armée"),
+                    ("GA2", "Général d'Armée 2e Son"),
+                    ("GAE", "Général d'Armée Aér."),
+                    ("GAE2", "Général d'Armée Aér.2e Son"),
+                    ("GB", "Général de Brigade"),
+                    ("GB2", "Général de Brigade 2e Son"),
+                    ("GBAE", "Général de Brigade Aér."),
+                    ("GBAE2", "Général de Brig.Aér.2e Son"),
+                    ("GCA", "Général de C.A."),
+                    ("GCA2", "Général de C.A. 2e Son"),
+                    ("GCAE", "Général de C.A.Aér."),
+                    ("GCAE2", "Général de C.A.Aér. 2e Son"),
+                    ("GD", "Général de Division"),
+                    ("GD2", "Général de Division 2e Son"),
+                    ("GDAE", "Général de Division Aér."),
+                    ("GDAE2", "Général de Div.Aér. 2e Son"),
+                    ("GDFC2", "Contrôleur gén.GDF retr."),
+                    ("GDFD3", "Direct.hon.GDF"),
+                    ("GDFI", "Insp.gén.hon.GDF"),
+                    ("GM2", "Ing. Arm. (GM) retr."),
+                    ("GM3", "Ing. Arm. (GM) cg."),
+                    ("GM4", "Ing. Arm. (GM) dém."),
+                    ("GM7", "Ing. Arm. (GM) H.C"),
+                    ("GM8", "Ing. Arm. (GM) rés."),
+                    ("GM9", "Ing. Arm. (GM) CR"),
+                    ("GMC", "Ing.ch.Arm.(GM)"),
+                    ("GMC1", "Ing.ch.Arm (GM)"),
+                    ("GMC2", "Ing.ch.Arm.(GM) retr."),
+                    ("GMC3", "Ing.ch.Arm.(GM) cg."),
+                    ("GMC4", "Ing.ch.Arm.(GM) dém."),
+                    ("GMC7", "Ing.ch.Arm.(GM) H.C"),
+                    ("GMC8", "Ing.ch.Arm.(GM) rés."),
+                    ("GMC9", "Ing.ch.Arm.(GM) CR"),
+                    ("GMG", "Ing.Gén.Arm.(GM)"),
+                    ("GMG02", "Ing.Gén.Arm.(GM) 2e Son"),
+                    ("GMG1", "Ing.Gén.1e cl.Arm.(GM) 2e Son"),
+                    ("GMG11", "Ing.Gén.1e cl.Arm.(GM)"),
+                    ("GMG2", "Ing.Gén.2e cl.Arm.(GM) 2e Son"),
+                    ("GMG22", "Ing.Gén.2e cl.Arm.(GM)"),
+                    ("GMP", "Ing.pp.Arm.(GM)"),
+                    ("GMP2", "Ing.pp.Arm.(GM) retr."),
+                    ("GMP3", "Ing.pp.Arm.(GM) cg."),
+                    ("GMP4", "Ing.pp.Arm.(GM) dém."),
+                    ("GMP7", "Ing.pp.Arm.(GM) H.C"),
+                    ("GMP8", "Ing.pp.Arm.(GM) rés."),
+                    ("GMP9", "Ing.pp.Arm.(GM) CR"),
+                    ("GMT12", "Ing.Gén.1e cl. Mat. 2e Son"),
+                    ("GMT2", "Ing.Gén.du Mat. 2e Son"),
+                    ("GMT22", "Ing.Gén.2e cl. Mat. 2e Son"),
+                    ("HG02", "Ing.Gén.Arm.(H) 2e Son"),
+                    ("IA", "Ing.Arm."),
+                    ("IA2", "Ing.Arm. retr."),
+                    ("IA3", "Ing.Arm. cg."),
+                    ("IA4", "Ing.Arm. dém."),
+                    ("IA5", "Ing.Arm. dét."),
+                    ("IA6", "Ing.Arm. dis."),
+                    ("IA7", "Ing.Arm. (H.C.)"),
+                    ("IA8", "Ing.Arm. rés."),
+                    ("IA9", "Ing.Arm. (CR)"),
+                    ("IAC8", "Ing.ch.Arm. rés."),
+                    ("IAv", "Ing.Av.C."),
+                    ("IAv2", "Ing.Av.C. retr."),
+                    ("IAV3", "Ing.Av.C. cg."),
+                    ("IAv4", "Ing.Av.C. dém."),
+                    ("IAv5", "Ing.Av.C. dét."),
+                    ("IAv6", "Ing.Av.C. dis."),
+                    ("IAv7", "Ing.Av.C. (H.C.)"),
+                    ("ICA", "Ing.ch.Arm."),
+                    ("ICA2", "Ing.ch.Arm.retr."),
+                    ("ICA3", "Ing.ch.Arm. cg."),
+                    ("ICA4", "Ing.ch.Arm. dém."),
+                    ("ICA5", "Ing.ch.Arm. dét."),
+                    ("ICA6", "Ing.ch.Arm. dis"),
+                    ("ICA7", "Ing.ch.Arm. (H.C.)"),
+                    ("ICA8", "Ing.ch.Arm.rés."),
+                    ("ICA9", "Ing.ch.Arm. (CR)"),
+                    ("ICAv", "Ing.ch.Av.C."),
+                    ("ICAv2", "Ing.ch.Av.C. retr."),
+                    ("ICAv3", "Ing.ch.Av.C. cg."),
+                    ("ICAv4", "Ing.ch.Av.C. dém."),
+                    ("ICAv5", "Ing.ch.Av.C. dét."),
+                    ("ICAv6", "Ing.ch.Av.C. dis."),
+                    ("ICAv7", "Ing.ch.Av.C. (H.C.)"),
+                    ("ICG", "Ing.ch.GREF"),
+                    ("ICG2", "Ing.ch.GREF retr."),
+                    ("ICG3", "Ing.ch.GREF cg."),
+                    ("ICG4", "Ing.ch.GREF dém."),
+                    ("ICG5", "Ing.ch.GREF dét."),
+                    ("ICG6", "Ing.ch.GREF dis."),
+                    ("ICG7", "Ing.ch.GREF (H.C.)"),
+                    ("ICGO", "Ing.ch.Géog."),
+                    ("ICGO2", "Ing.ch.Géog. retr."),
+                    ("ICGO3", "Ing.ch.Géog. cg"),
+                    ("ICGO4", "Ing.ch.Géog. dém."),
+                    ("ICGO5", "Ing.ch.Géog. dét."),
+                    ("ICGO6", "Ing.ch.Géog. dis."),
+                    ("ICGO7", "Ing.ch.Géog. (H.C.)"),
+                    ("ICIM", "Ing.ch.I.M."),
+                    ("ICIM2", "Ing.ch.I.M. retr."),
+                    ("ICIM3", "Ing.ch.I.M. cg."),
+                    ("ICIM4", "Ing.ch.I.M. dém."),
+                    ("ICIM5", "Ing.ch.I.M. dét."),
+                    ("ICIM6", "Ing.ch.I.M. dis."),
+                    ("ICIM7", "Ing.ch.I.M. (H.C.)"),
+                    ("ICM", "Ing.ch.Mines"),
+                    ("ICM2", "Ing.ch.Mines retr."),
+                    ("ICM3", "Ing.ch.Mines cg."),
+                    ("ICM4", "Ing.ch.Mines dém."),
+                    ("ICM5", "Ing.ch.Mines dét."),
+                    ("ICM6", "Ing.ch.Mines dis."),
+                    ("ICM7", "Ing.ch.Mines (H.C.)"),
+                    ("ICME", "Ing.ch.M.E."),
+                    ("ICME2", "Ing.ch.M.E. retr."),
+                    ("ICME3", "Ing.ch.M.E. cg."),
+                    ("ICME4", "Ing.ch.M.E. dém."),
+                    ("ICME5", "Ing.ch.M.E. dét."),
+                    ("ICME6", "Ing.ch.M.E. dis."),
+                    ("ICME7", "Ing.ch.M.E (H.C.)"),
+                    ("ICMO", "Ing.ch.Météo."),
+                    ("ICMO2", "Ing.ch.Météo.retr."),
+                    ("ICMO3", "Ing.ch.Météo.cg"),
+                    ("ICMO4", "Ing.ch.Météo.dém."),
+                    ("ICMO5", "Ing.ch.Météo.dét."),
+                    ("ICMO6", "Ing.ch.Météo.dis"),
+                    ("ICMO7", "Ing.ch.Météo. (H.C.)"),
+                    ("ICMT2", "Ing.ch.Mat. retr."),
+                    ("ICMT3", "Ing.ch.1e cl. Mat hon."),
+                    ("ICMT4", "Ing.ch.2e cl. Mat. hon."),
+                    ("ICPC", "Ing.ch.P.C."),
+                    ("ICPC2", "Ing.ch.P.C. retr."),
+                    ("ICPC3", "Ing.ch.P.C. cg."),
+                    ("ICPC4", "Ing.ch.P.C. dém."),
+                    ("ICPC5", "Ing.ch.P.C. dét."),
+                    ("ICPC6", "Ing.ch.P.C. dis."),
+                    ("ICPC7", "Ing.ch.P.C. (H.C.)"),
+                    ("ICT", "Ing.ch.Téléc."),
+                    ("ICT2", "Ing.ch.Téléc. retr."),
+                    ("ICT3", "Ing.ch.Téléc. cg."),
+                    ("ICT4", "Ing.ch.Téléc. dém."),
+                    ("ICT5", "Ing.ch.Téléc. dét."),
+                    ("ICT6", "Ing.ch.Téléc. dis."),
+                    ("ICT7", "Ing.ch.Téléc. (H.C.)"),
+                    ("ICTH", "Ing.ch.Téléc. hon."),
+                    ("IFi", "Insp.des Finances"),
+                    ("IFi2", "Insp.des Finances retr."),
+                    ("IFi3", "Insp.des Finances cg."),
+                    ("IFi4", "Insp.des Finances dém."),
+                    ("IFi5", "Insp.des Finances dét."),
+                    ("IFi6", "Insp.des Finances dis."),
+                    ("IFi7", "Insp.des Finances (H.C.)"),
+                    ("IG", "Ing.GREF"),
+                    ("IG11", "Ing.Gén.1e cl.Arm."),
+                    ("IG12", "Ing.Gén.1e cl.Arm. 2e Son"),
+                    ("IG13", "Ing.Gén.1e cl.Arm. cg."),
+                    ("IG15", "Ing.Gén.1e cl.Arm. dét."),
+                    ("IG16", "Ing.Gén.1e cl.Arm. dis."),
+                    ("IG17", "Ing.Gén.1e cl.Arm. (H.C.)"),
+                    ("IG19", "Ing.Gén.1e cl.Arm. (CR)"),
+                    ("IG2", "Ing.GREF retr."),
+                    ("IG21", "Ing.Gén.2e cl.Arm."),
+                    ("IG22", "Ing.Gén.2e cl.Arm. 2e Son"),
+                    ("IG23", "Ing.Gén.2e cl.Arm. cg."),
+                    ("IG25", "Ing.Gén.2e cl.Arm. dét."),
+                    ("IG26", "Ing.Gén.2e cl.Arm. dis."),
+                    ("IG27", "Ing.Gén.2e cl.Arm. (H.C.)"),
+                    ("IG29", "Ing.Gén.2e cl.Arm. (CR)"),
+                    ("IG3", "Ing.GREF cg."),
+                    ("IG4", "Ing.GREF dém."),
+                    ("IG5", "Ing.GREF dét."),
+                    ("IG6", "Ing.GREF dis."),
+                    ("IG7", "Ing.GREF (H.C.)"),
+                    ("IGA", "Ing.gén.Arm."),
+                    ("IGA2", "Ing.gén.Arm. 2e Son"),
+                    ("IGA3", "Ing.gén.Arm. cg."),
+                    ("IGA5", "Ing.gén.Arm. dét."),
+                    ("IGA6", "Ing.gén.Arm. dis."),
+                    ("IGA7", "Ing.gén.Arm. (H.C.)"),
+                    ("IGA8", "Ing.gén.Arm.(C.R.)"),
+                    ("IGAv", "Ing.gén.Av.C."),
+                    ("IGAv2", "Ing.gén.Av.C. retr."),
+                    ("IGAv3", "Ing.gén.Av.C. cg."),
+                    ("IGAv4", "Ing.gén.Av.C. dém."),
+                    ("IGAv5", "Ing.gén.Av.C. dét."),
+                    ("IGAv6", "Ing.gén.Av.C. dis"),
+                    ("IGAv7", "Ing.gén.Av.C. (H.C.)"),
+                    ("IGE", "Ing.gén.de cl.except.Arm."),
+                    ("IGE2", "Ing.gén.de cl.except.Arm.2eSon"),
+                    ("IGFi", "Insp.gén.des Finances"),
+                    ("IGFi2", "Insp.gén.des Finances retr."),
+                    ("IGFi3", "Insp.gén.des Finances cg."),
+                    ("IGFi4", "Insp.gén.des Finances dém."),
+                    ("IGFi5", "Insp.gén.des Finances dét."),
+                    ("IGFi6", "Insp.gén.des Finances dis."),
+                    ("IGFi7", "Insp.gén.des Finances (H.C.)"),
+                    ("IGG", "Ing.gén.GREF"),
+                    ("IGG2", "Ing.gén.GREF retr."),
+                    ("IGG3", "Ing.gén.GREF cg."),
+                    ("IGG4", "Ing.gén.GREF dém."),
+                    ("IGG5", "Ing.gén.GREF dét."),
+                    ("IGG6", "Ing.gén.GREF dis."),
+                    ("IGG7", "Ing.gén.GREF (H.C.)"),
+                    ("IGGO", "Ing.gén.Géog."),
+                    ("IGGO2", "Ing.gén.Géog. retr."),
+                    ("IGGO3", "Ing.gén.Géog. cg."),
+                    ("IGGO4", "Ing.gén.Géog. dém."),
+                    ("IGGO5", "Ing.gén.Géog. dét."),
+                    ("IGGO6", "Ing.gén.Géog. dis."),
+                    ("IGGO7", "Ing.gén.Géog. (H.C.)"),
+                    ("IGH", "Ing.gén.hors cl. Arm."),
+                    ("IGH2", "Ing.gén.hors cl.Arm.2e Son"),
+                    ("IGIM", "Ing.gén.I.M."),
+                    ("IGIM2", "Ing.gén.I.M. retr."),
+                    ("IGIN", "Insp.gén.INSEE"),
+                    ("IGIN2", "Insp.gén.INSEE retr."),
+                    ("IGIN3", "Insp.gén.INSEE cg."),
+                    ("IGIN4", "Insp.gén.INSEE dém."),
+                    ("IGIN5", "Insp.gén.INSEE dét."),
+                    ("IGIN6", "Insp.gén.INSEE dis."),
+                    ("IGIN7", "Insp.gén.INSEE (H.C.)"),
+                    ("IGIN8", "Insp.gén.INSEE hon."),
+                    ("IGM", "Ing.gén.Mines"),
+                    ("IGM2", "Ing.gén.Mines retr."),
+                    ("IGM3", "Ing.gén.Mines cg."),
+                    ("IGM4", "Ing.gén.Mines dém."),
+                    ("IGM5", "Ing.gén.Mines dét."),
+                    ("IGM6", "Ing.gén.Mines dis."),
+                    ("IGM7", "Ing.gén.Mines (H.C.)"),
+                    ("IGME", "Insp.gén.M.E."),
+                    ("IGME2", "Insp.gén.M.E. retr."),
+                    ("IGME3", "Insp.gén.M.E. cg"),
+                    ("IGME4", "Insp.gén.M.E. dém."),
+                    ("IGME5", "Insp.gén.M.E. dét."),
+                    ("IGME6", "Insp.gén.M.E. dis."),
+                    ("IGME7", "Insp.gén.M.E.(H.C)."),
+                    ("IGMO", "Ing.gén.Météo."),
+                    ("IGMO2", "Ing.gén.Météo. retr."),
+                    ("IGMO3", "Ing.gén.Météo. cg."),
+                    ("IGMO4", "Ing.gén.Météo. dém."),
+                    ("IGMO5", "Ing.gén.Météo. dét."),
+                    ("IGMO6", "Ing.gén.Météo. dis."),
+                    ("IGMO7", "Ing.gén.Météo. (H.C.)"),
+                    ("IGO", "Ing.Géog."),
+                    ("IGO2", "Ing.Géog. retr."),
+                    ("IGO3", "Ing.Géog. cg."),
+                    ("IGO4", "Ing.Géog. dém."),
+                    ("IGO5", "Ing.Géog. dét."),
+                    ("IGO6", "Ing.Géog. dis."),
+                    ("IGO7", "Ing.Géog. (H.C.)"),
+                    ("IGPC", "Ing.gén.P.C."),
+                    ("IGPC2", "Ing.gén.P.C. hon."),
+                    ("IGPC3", "Ing.gén.P.C. cg."),
+                    ("IGPC4", "Ing.gén.P.C. dém."),
+                    ("IGPC5", "Ing.gén.P.C. dét."),
+                    ("IGPC6", "Ing.gén.P.C. dis."),
+                    ("IGPC7", "Ing.gén.P.C. (H.C.)"),
+                    ("IGT", "Ing.gén.Téléc."),
+                    ("IGT12", "Ing.gén.1e cl.Téléc. retr."),
+                    ("IGT2", "Ing.gén.Téléc. retr."),
+                    ("IGT22", "Ing.gén.2e cl.Téléc. retr."),
+                    ("IGT3", "Ing.gén.Téléc. cg."),
+                    ("IGT4", "Ing.gén.Téléc. dém."),
+                    ("IGT5", "Ing.gén.Téléc. dét."),
+                    ("IGT6", "Ing.gén.Téléc. dis."),
+                    ("IGT7", "Ing.gén.Téléc.(H.C.)"),
+                    ("IGTH", "Ing.gén.Téléc. hon."),
+                    ("IIM", "Ing.I.M."),
+                    ("IIM2", "Ing.I.M. retr."),
+                    ("IIM3", "Ing.I.M. cg."),
+                    ("IIM4", "Ing.I.M. dém."),
+                    ("IIM5", "Ing.I.M. dét."),
+                    ("IIM6", "Ing.I.M. dis."),
+                    ("IIM7", "Ing.I.M. (H.C.)"),
+                    ("IM", "Ing.Mines"),
+                    ("IM2", "Ing.Mines retr."),
+                    ("IM3", "Ing.Mines cg."),
+                    ("IM4", "Ing.Mines dém."),
+                    ("IM5", "Ing.Mines dét."),
+                    ("IM6", "Ing.Mines dis."),
+                    ("IM7", "Ing.Mines (H.C.)"),
+                    ("IME", "Ing.M.E."),
+                    ("IME2", "Ing.M.E. retr."),
+                    ("IME3", "Ing.M.E. cg."),
+                    ("IME4", "Ing.M.E. dém."),
+                    ("IME5", "Ing.M.E. dét."),
+                    ("IME6", "Ing.M.E. dis."),
+                    ("IME7", "Ing.M.E (H.C.)"),
+                    ("IMO", "Ing.Météo."),
+                    ("IMO2", "Ing.Météo. retr."),
+                    ("IMO3", "Ing.Météo. cg."),
+                    ("IMO4", "Ing.Météo.dém."),
+                    ("IMO5", "Ing.Météo. dét."),
+                    ("IMO6", "Ing.Météo. dis."),
+                    ("IMO7", "Ing.Météo. (H.C.)"),
+                    ("ININ", "Insp.INSEE"),
+                    ("ININ2", "Insp.INSEE retr."),
+                    ("ININ3", "Insp.INSEE cg."),
+                    ("ININ4", "Insp.INSEE dém."),
+                    ("ININ5", "Insp.INSEE dét."),
+                    ("ININ6", "Insp.INSEE dis."),
+                    ("ININ7", "Insp.INSEE (H.C.)"),
+                    ("INT12", "Intent.Milit.1e cl. retr."),
+                    ("INT22", "Intent.Milit.2e cl. retr."),
+                    ("INTG", "Intent.Gén.2e Son"),
+                    ("INTG1", "Intent.Gén.1ere cl.2e Son"),
+                    ("INTG2", "Intent.Gén.2e cl.2e Son"),
+                    ("IPA", "Ing.pp.Arm."),
+                    ("IPA2", "Ing.pp.Arm.retr."),
+                    ("IPA3", "Ing.pp.Arm. cg."),
+                    ("IPA4", "Ing.pp.Arm. dém."),
+                    ("IPA5", "Ing.pp.Arm. dét."),
+                    ("IPA6", "Ing.pp.Arm. dis."),
+                    ("IPA7", "Ing.pp.Arm. (H.C.)"),
+                    ("IPA8", "Ing.pp.Arm. rés."),
+                    ("IPA9", "Ing.pp.Arm. (CR)"),
+                    ("IPC", "Ing.P.C."),
+                    ("IPC2", "Ing.P.C. retr."),
+                    ("IPC3", "Ing.P.C. cg."),
+                    ("IPC4", "Ing.P.C. dém."),
+                    ("IPC5", "Ing.P.C. dét."),
+                    ("IPC6", "Ing.P.C. dis."),
+                    ("IPC7", "Ing.P.C. (H.C.)"),
+                    ("IPG", "Ing.pp.GREF"),
+                    ("IPG2", "Ing.pp.GREF retr."),
+                    ("IPG3", "Ing.pp.GREF cg."),
+                    ("IPG4", "Ing.pp.GREF dém."),
+                    ("IPG5", "Ing.pp.GREF dét."),
+                    ("IPG6", "Ing.pp.GREF dis."),
+                    ("IPG7", "Ing.pp.GREF (H.C.)"),
+                    ("ISG2", "Insp.pp.des E.et F.OM.retr."),
+                    ("IT", "Ing.Téléc."),
+                    ("IT2", "Ing.Téléc. retr."),
+                    ("IT3", "Ing.Téléc. cg."),
+                    ("IT4", "Ing.Téléc. dém."),
+                    ("IT5", "Ing.Téléc. dét."),
+                    ("IT6", "Ing.Téléc. dis."),
+                    ("IT7", "Ing.Téléc. (H.C.)"),
+                    ("L.Co", "Lieut.-Colonel"),
+                    ("L.Co2", "Lieut.-Colonel retr."),
+                    ("L.Co5", "Lieut.-Colonel dém."),
+                    ("L.Co8", "Lieut.-Colonel rés."),
+                    ("L.Coh", "Lieut.-Colonel hon."),
+                    ("Lt", "Lieutenant"),
+                    ("Lt6", "Lieutenant dis."),
+                    ("Lt8", "Lieutenant rés."),
+                    ("LV", "Lieutenant de Vaisseau"),
+                    ("NAéG2", "Ing.gén.N.Aé.retr"),
+                    ("VA", "Vice-Amiral"),
+                    ("VA2", "Vice-Amiral 2e Son"),
+                    ("VAE", "Vice-Amiral d'Escadre"),
+                    ("VAE2", "Vice-Amiral d'Escadre 2e Son");
+
+INSERT IGNORE INTO  profile_corps_enum (abbreviation, name, still_exists)
+            VALUES  ("D", "Aucun (anc. démissionnaire)", 1),
+                    ("Ad.C", "Adm. des Colonies", 0),
+                    ("Agr.C", "Agriculture aux Colonies", 0),
+                    ("Z", "Ancien élève étranger", 0),
+                    ("Aé", "Arm.Aéronautique", 0),
+                    ("ABC", "Arme blindée", 0),
+                    ("Arm", "Ingénieurs de l'Armement", 1),
+                    ("A", "Artillerie", 0),
+                    ("AC", "Artillerie coloniale", 0),
+                    ("AM", "Artillerie de Marine", 0),
+                    ("AN", "Artillerie Navale", 0),
+                    ("Av.C", "Aviation Civile", 0),
+                    ("B", "Bourse d'études", 0),
+                    ("Cav", "Cavalerie", 0),
+                    ("Cha", "Chars de Combat", 0),
+                    ("C.A", "Commissaire de l'Air", 0),
+                    ("C.M", "Commissariat de la Marine", 0),
+                    ("C.Ap", "Contrôle des Assurances", 1),
+                    ("EF.Ma", "E.& F. du Maroc", 0),
+                    ("E.F", "Eaux et Forêts", 0),
+                    ("EFC", "Eaux et Forêts des Colonies", 0),
+                    ("EFOM", "Eaux et Forêts Outre-Mer", 0),
+                    ("ENA", "Ecole Nation.d'Administration", 0),
+                    ("-", "Elève à l'Ecole", 0),
+                    ("W", "Elève catégorie particulière", 0),
+                    ("w", "Elève étranger naturalisé", 0),
+                    (" ", "Elève non sorti de l'école", 0),
+                    ("FA", "Fabrication d'Armement", 0),
+                    ("Gend", "Gendarmerie", 0),
+                    ("G", "Génie", 0),
+                    ("GM", "Génie Maritime", 0),
+                    ("GR", "Génie Rural", 0),
+                    ("GREF", "Génie Rural Eaux et Forêts", 1),
+                    ("IG", "Géographe", 0),
+                    ("Géo.C", "Géologie des Colonies", 0),
+                    ("H", "Hydrographes", 0),
+                    ("I", "Infanterie", 0),
+                    ("I.C", "Infanterie Coloniale", 0),
+                    ("I.Ma", "Infanterie de Marine", 0),
+                    ("St", "Institut nat.de la statistique", 0),
+                    ("IM", "Instruments de mesure", 0),
+                    ("ME", "Manufactures Etat Tabacs", 0),
+                    ("Mat", "Matériel Armée de Terre", 0),
+                    ("Mét", "Météorologie nationale", 0),
+                    ("M", "Mines", 1),
+                    ("MC", "Mines coloniales", 0),
+                    ("MOM", "Mines Outre-Mer", 0),
+                    ("N.Aé", "Navigation Aérienne", 0),
+                    ("Air", "Offic.de l'Air", 0),
+                    ("ORTF", "Office Radio-Télévision franç.", 0),
+                    ("BaAir", "Officier des Bases de l'Air", 0),
+                    ("Mar", "Officiers de marine", 0),
+                    ("OMAir", "Officiers mécaniciens Air", 0),
+                    ("PC", "Ponts et Chaussées", 1),
+                    ("PCC", "Ponts et Chaussées Colonies", 0),
+                    ("PCOM", "Ponts et Chaussées Outre-Mer", 0),
+                    ("PTC", "Postes et Télécom.Colonies", 0),
+                    ("PTOM", "Postes et Télécom.Outre-Mer", 0),
+                    ("P", "Poudres", 0),
+                    ("Rad", "Radiodiffusion française", 0),
+                    ("Rech", "Recherche", 0),
+                    ("R", "Réformé en fin d'études", 0),
+                    ("Bât.", "Service des Bâtiments", 0),
+                    ("C.F", "SNCF", 0),
+                    ("Sp", "Sports", 0),
+                    ("Téléc", "Télécommunications", 1),
+                    ("Té.A", "Télécommunications d'Armement", 0),
+                    ("Tr", "Train", 0),
+                    ("Tra", "Transmissions", 0),
+                    ("Tra.C", "Transmissions Coloniales", 0),
+                    ("TPC", "Travaux publics des Colonies", 0),
+                    ("TP Ic", "Travaux publics en Indochine", 0),
+                    ("TPOM", "Travaux publics Outre-Mer", 0),
+                    ("TdM", "Troupes de Marine", 0),
+                    ("INSEE", "Administrateurs de l'INSEE", 1),
+                    ("Off", "Officiers des Armées", 1);
+
+INSERT IGNORE INTO  profile_corps (uid, original_corpsid, current_corpsid, rankid, corps_pub)
+            SELECT  u.user_id, c.id, c.id, r.id, 'ax'
+              FROM  auth_user_md5           AS u
+        INNER JOIN  fusionax_anciens        AS f ON (u.matricule_ax = f.id_ancien)
+        INNER JOIN  profile_corps_enum      AS c ON (f.corps_sortie = c.abbreviation)
+        INNER JOIN  profile_corps_rank_enum AS r ON (f.grade = r.abbreviation);
+
+ALTER TABLE watch_profile MODIFY field ENUM('nom', 'freetext', 'mobile', 'nationalite', 'nationalite2',
+                                            'nationalite3', 'nick', 'web', 'networking', 'edus', 'addresses',
+                                            'section', 'binets', 'medals', 'cv', 'jobs', 'photo', 'corps');
+
+--  vim:set syntax=mysql:
diff --git a/upgrade/merge-0.0.1/04_nationalities.sql b/upgrade/merge-0.0.1/04_nationalities.sql
new file mode 100644 (file)
index 0000000..abacfb6
--- /dev/null
@@ -0,0 +1,28 @@
+CREATE TEMPORARY TABLE IF NOT EXISTS tmp_update_fusionax_anciens (
+  good CHAR(4) DEFAULT NULL,
+  bad CHAR(4) DEFAULT NULL,
+  PRIMARY KEY(bad),
+  UNIQUE KEY(good)
+) CHARSET=utf8;
+
+INSERT IGNORE INTO  tmp_update_fusionax_anciens (bad, good)
+            VALUES  ('TC', 'CAM'),
+                    ('SH', 'CN'),
+                    ('R', 'RO'),
+                    ('TW', 'RC'),
+                    ('TG', 'RT'),
+                    ('U', 'ROU'),
+                    ('KP', 'ROK'),
+                    ('CRO', 'HR'),
+                    ('UKR', 'UA'),
+                    ('AM', 'ARM'),
+                    ('CS', 'CZ'),
+                    ('SU', 'RUS'),
+                    ('LET', 'LV'),
+                    ('MDA', 'MD');
+
+    UPDATE  fusionax_anciens            AS f
+INNER JOIN  tmp_update_fusionax_anciens AS t ON (f.Code_nationalite = t.bad)
+       SET  f.Code_nationalite = t.good;
+
+-- vim:set syntax=mysql:
diff --git a/upgrade/merge-0.0.1/05_check_nationalities.sql b/upgrade/merge-0.0.1/05_check_nationalities.sql
new file mode 100644 (file)
index 0000000..f575425
--- /dev/null
@@ -0,0 +1,10 @@
+-- Query to check if all the nationalities are now rocognized
+-- If the result of this query is not empty, 04_nationalities.sql nedds to be updated
+SELECT DISTINCT  Code_nationalite
+           FROM  fusionax_anciens AS f
+          WHERE  NOT EXISTS (SELECT  *
+                               FROM  geoloc_pays AS g
+                              WHERE  g.license_plate = f.Code_nationalite);
+
+
+-- vim:set syntax=mysql:
diff --git a/upgrade/merge-0.0.1/06_merge_nationalities.sql b/upgrade/merge-0.0.1/06_merge_nationalities.sql
new file mode 100644 (file)
index 0000000..52f7383
--- /dev/null
@@ -0,0 +1,23 @@
+ALTER TABLE geoloc_pays ADD INDEX (license_plate);
+
+   UPDATE  auth_user_md5    AS u
+LEFT JOIN  fusionax_anciens AS f ON (u.matricule_ax = f.id_ancien)
+LEFT JOIN  geoloc_pays      AS g ON (g.license_plate = f.Code_nationalite)
+      SET  u.nationalite = g.a2
+    WHERE  u.nationalite IS NULL;
+
+   UPDATE  auth_user_md5    AS u
+LEFT JOIN  fusionax_anciens AS f ON (u.matricule_ax = f.id_ancien)
+LEFT JOIN  geoloc_pays      AS g ON (g.license_plate = f.Code_nationalite)
+      SET  u.nationalite2 = g.a2
+    WHERE  u.nationalite != g.a2 AND u.nationalite2 IS NULL;
+
+   UPDATE  auth_user_md5    AS u
+LEFT JOIN  fusionax_anciens AS f ON (u.matricule_ax = f.id_ancien)
+LEFT JOIN  geoloc_pays      AS g ON (g.license_plate = f.Code_nationalite)
+      SET  u.nationalite3 = g.a2
+    WHERE  u.nationalite != g.a2 AND u.nationalite2 != g.a2 AND u.nationalite3 IS NULL;
+
+ALTER TABLE geoloc_pays DROP INDEX (license_plate);
+
+-- vim:set syntax=mysql:
diff --git a/upgrade/merge-0.0.1/07_education.php b/upgrade/merge-0.0.1/07_education.php
new file mode 100755 (executable)
index 0000000..6941b14
--- /dev/null
@@ -0,0 +1,163 @@
+#!/usr/bin/php5
+<?php
+require_once 'connect.db.inc.php';
+
+$globals->debug = 0; //do not store backtraces
+
+// get degree list
+$res = XDB::iterator("SELECT  id, abbreviation AS name
+                        FROM  profile_education_degree_enum
+                    ORDER BY  id");
+foreach ($res as $item) {
+    $degree_list[$item[1]] = $item[0];
+}
+
+// get degree's level list
+$res = XDB::iterator("SELECT  id, level AS name
+                        FROM  profile_education_degree_enum
+                    ORDER BY  id");
+foreach ($res as $item) {
+    $level_list [$item[1]] = $item[0];
+}
+
+// get university list
+$res = XDB::iterator("SELECT  id, IF(abbreviation = '', name, abbreviation) AS name
+                        FROM  profile_education_enum
+                    ORDER BY  id");
+foreach ($res as $item) {
+    $university_list [$item[1]] = $item[0];
+}
+
+// get field list
+$res = XDB::iterator("SELECT  id, field AS name
+                        FROM  profile_education_field_enum
+                    ORDER BY  id");
+foreach ($res as $item) {
+    $field_list [$item[1]] = $item[0];
+}
+
+// get Xorg education data
+$res = XDB::query("SELECT  p.uid, d.abbreviation AS degree, IF(e.abbreviation = '', e.name, e.abbreviation) AS university, p.program, p.id AS no
+                     FROM  profile_education             AS p
+               INNER JOIN  profile_education_enum        AS e ON (p.eduid = e.id)
+               INNER JOIN  profile_education_degree_enum AS d ON (p.degreeid = d.id)
+                    WHERE  p.id != 100
+                 ORDER BY  p.uid");
+$xorg_edu = $res->fetchAllAssoc();
+
+// get AX education data
+$res = XDB::iterator("SELECT  u.user_id AS uid, f.Intitule_diplome AS degree, f.Intitule_formation AS university,
+                              CONCAT(Descr_formation, ' ', tmp_1, ' ', tmp_2, ' ', tmp_3, ' ', tmp_4) AS program
+                        FROM  fusionax_formations   AS f
+                  INNER JOIN  fusionax_xorg_anciens AS u ON (f.id_ancien = u.matricule_ax)
+                    ORDER BY  u.user_id");
+$ax_edu = $res->fetchAllAssoc();
+
+// merge education data
+$nb_merge_succes = 0;
+$nb_total = 0;
+$xorg = next($xorg_edu);
+while ($ax = next($ax_edu)) {
+    array_walk($ax, 'trim');
+    if (($ax['degree'] == '') && ($ax['university'] = '')) {
+        continue;
+    }
+    while ($xorg['uid'] && ($xorg['uid'] < $ax['uid'])) {
+        $xorg = next($xorg_edu);
+    }
+
+    $no = 0;
+    if($xorg['uid'] == $ax['uid']) {
+        $uid = $xorg['uid'];
+        $i = 0;
+
+        while (($xorg['uid'] == $uid) && (!merge($ax, $xorg))) {
+            $xorg = next($xorg_edu);
+            $i++;
+            $no++;
+        }
+        while ($xorg['uid'] == $uid) {
+            $xorg = next($xorg_edu);
+            $no++;
+        }
+
+        if ($i > 0) {
+            $i = $no;
+        } else {
+            $i = $no - 1;
+        }
+        while ($i != 0) {
+            $xorg = prev($xorg_edu);
+            $i--;
+        }
+        if ($ax['no']) {
+            $no = $ax['no'];
+            $nb_merge_succes++;
+        }
+    }
+    adapt_ax($ax);
+    XDB::execute("REPLACE INTO  profile_education (uid, degreeid, eduid, program, fieldid, id)
+                        VALUES  {?}, {?}, {?}, {?}, {?}, {?}",
+                 $ax['uid'], $ax['degree'], $ax['university'], $ax['program'], $ax['field'], $no);
+    $nb_total++;
+    if (($nb_total % 1000) == 0) {
+        echo ".";
+    }
+}
+
+echo "\n";
+echo "$nb_merge_succes educations were succesfully merged among $nb_total entries.\n";
+
+// auxilliary functions
+
+// replaces AX data by corresponding id in Xorg database
+function adapt_ax(&$ax)
+{
+    if ($field_list[$ax['program']]) {
+        $ax['field'] = $field_list[$ax['program']];
+        $ax['program'] = null;
+    }
+    $ax['degree'] = $degree_list[$ax['degree']];
+    $ax['university'] = $university_list[$ax['university']];
+}
+
+// tries to merge two educations into ax and returns 1 in case of merge
+function merge(&$ax, $xorg)
+{
+    if ($ax['degree'] == '') {
+        if ($ax['university'] != $xorg['university']) {
+            return 0;
+        }
+        $ax['degree'] = $xorg['degree'];
+        $ax['university'] = $xorg['university'];
+    } else {
+        if ($ax['university'] == '') {
+            if (($level_list[$ax['degree']] == $level_list[$xorg['degree']]) || ($xorg['degree'] == "Dipl.") || ($ax['degree'] == "Dipl.")) {
+                if ($xorg['degree'] != "Dipl.") {
+                    $ax['degree'] = $xorg['degree'];
+                }
+                $ax['university'] = $xorg['university'];
+            } else {
+                return 0;
+            }
+        } else {
+            if (($ax['university'] == $xorg['university']) &&
+                (($level_list[$ax['degree']] == $level_list[$xorg['degree']]) || ($xorg['degree'] == "Dipl.") || ($ax['degree'] == "Dipl."))) {
+                if ($xorg['degree'] != "Dipl.") {
+                    $ax['degree'] = $xorg['degree'];
+                }
+            } else {
+                return 0;
+            }
+        }
+    }
+    if ($xorg['program']) {
+        $ax['field'] = $field_list[$ax['program']];
+        $ax['program'] = $xorg['program'];
+    }
+    $ax['no'] = $xorg['no'];
+    return 1;
+}
+
+/* vim:set et sw=4 sts=4 ts=4: */
+?>
diff --git a/upgrade/newdirectory-0.0.1/00_names.sql b/upgrade/newdirectory-0.0.1/00_names.sql
new file mode 100644 (file)
index 0000000..bd0d888
--- /dev/null
@@ -0,0 +1,45 @@
+CREATE TABLE IF NOT EXISTS `profile_names_display` (
+  `user_id` int(11) NOT NULL COMMENT 'id of alumni',
+  `display` varchar(100) NOT NULL COMMENT 'name to display',
+  `sort` varchar(100) NOT NULL COMMENT 'name used for sorting',
+  `tooltip` varchar(150) NOT NULL COMMENT 'text to explain display name if needed',
+  `firstname` varchar(50) NOT NULL COMMENT 'first name',
+  `lastname` varchar(50) NOT NULL COMMENT 'last name',
+  `yourself` varchar(100) NOT NULL COMMENT 'name we used to speak to him/her',
+  PRIMARY KEY  (`user_id`),
+  KEY `sort` (`sort`)
+) CHARSET=utf8 COMMENT='Alumnis'' names to display';
+
+INSERT INTO `profile_names_display` (
+    SELECT 
+        `user_id`, 
+        CONCAT(`prenom`, ' ',IF(`nom_usage` != '',CONCAT(`nom_usage`,' (',`nom`,')'),`nom`)), 
+        CONCAT(IF(`nom_usage` != '',`nom_usage`,`nom`),', ',`prenom`),
+        '',
+        `prenom`,
+        IF(`nom_usage` != '',`nom_usage`,`nom`),
+        `prenom`
+        FROM `auth_user_md5`);
+
+UPDATE `profile_names_display` AS n INNER JOIN `auth_user_md5` AS u ON n.lastname = u.prenom
+SET n.tooltip = CONCAT('Prénom : ', n.firstname,' - Nom : ', n.lastname);
+
+CREATE TABLE IF NOT EXISTS `profile_names_search` (
+  `user_id` int(11) NOT NULL COMMENT 'id of alumni',
+  `sn_id` smallint(6) NOT NULL COMMENT 'id of this search name in all alumni''s search names',
+  `search_name` varchar(50) NOT NULL COMMENT 'name to search for',
+  `name_type` enum('firstname','lastname','surname') NOT NULL default 'lastname' COMMENT 'type of name',
+  `search_score` smallint(6) NOT NULL COMMENT 'used to sort search results',
+  `pub` enum('always public','public','private') NOT NULL default 'private' COMMENT 'searchable on public site or only on private',
+  PRIMARY KEY  (`name_type`,`search_name`,`user_id`),
+  KEY `user_id` (`user_id`)
+) CHARSET=utf8 COMMENT='Names of alumni (search table)';
+
+INSERT INTO `profile_names_search` ( SELECT `user_id`, 0, `nom`, 'lastname', 10, 'always public' FROM `auth_user_md5` WHERE `nom` != '');
+INSERT INTO `profile_names_search` ( SELECT `user_id`, 1, `nom_usage`, 'lastname', 10, 'public' FROM `auth_user_md5` WHERE `nom` != `nom_usage` AND `nom_usage` != '');
+INSERT INTO `profile_names_search` ( SELECT `user_id`, 2, `nom_ini`, 'lastname', 7, 'private' FROM `auth_user_md5` WHERE `nom` != `nom_ini` AND `nom_ini` != '' AND `nom_ini` != `nom_usage`);
+INSERT INTO `profile_names_search` ( SELECT `user_id`, 3, `prenom`, 'firstname', 8, 'always public' FROM `auth_user_md5` WHERE `prenom` != '');
+INSERT INTO `profile_names_search` ( SELECT `user_id`, 4, `prenom_ini`, 'firstname', 5, 'private' FROM `auth_user_md5` WHERE `prenom_ini` != `prenom` AND `prenom_ini` != '');
+INSERT INTO `profile_names_search` ( SELECT `user_id`, 5, `profile_nick`, 'surname', 7, 'private' FROM `auth_user_quick` WHERE `profile_nick` != '');
+
+-- vim:set syntax=mysql:
diff --git a/upgrade/newdirectory-0.0.1/01_addrcomment.sql b/upgrade/newdirectory-0.0.1/01_addrcomment.sql
new file mode 100644 (file)
index 0000000..7de4690
--- /dev/null
@@ -0,0 +1,2 @@
+ALTER TABLE `adresses` ADD `comment` varchar(100) NOT NULL;
+
diff --git a/upgrade/newdirectory-0.0.1/02_networking.sql b/upgrade/newdirectory-0.0.1/02_networking.sql
new file mode 100644 (file)
index 0000000..17172c9
--- /dev/null
@@ -0,0 +1,44 @@
+CREATE TABLE IF NOT EXISTS `profile_networking_enum` (
+    `network_type` tinyint unsigned NOT NULL,
+    `name` varchar(30) NOT NULL,
+    `icon` varchar(50) NOT NULL COMMENT 'icon filename',
+    `filter` enum('email','web','number','none') NOT NULL DEFAULT 'none' COMMENT 'filter type for addresses',
+    `link` varchar(255) NOT NULL COMMENT 'string used to forge an URL linking to the the profile page',
+    PRIMARY KEY (`network_type`)
+) CHARSET=utf8 COMMENT='types of networking addresses';
+
+CREATE TABLE IF NOT EXISTS `profile_networking` (
+    `uid` int NOT NULL COMMENT 'user id',
+    `nwid` tinyint unsigned NOT NULL COMMENT 'number of the address for the user',
+    `network_type` tinyint unsigned NOT NULL,
+    `address` varchar(255) NOT NULL,
+    `pub` enum('private','public') NOT NULL DEFAULT 'private',
+    PRIMARY KEY (`uid`, `nwid`)
+) CHARSET=utf8 COMMENT='networking addresses';
+
+-- Insert a first address type for old URLs
+INSERT INTO `profile_networking_enum` (`network_type`, `name`, `icon`, `filter`)
+     VALUES (0, 'Page web', 'web.gif', 'web');
+
+INSERT INTO `profile_networking` (`uid`, `nwid`, `network_type`, `address`, `pub`)
+     SELECT `user_id`, 0, 0, `profile_web`, `profile_web_pub`
+       FROM `auth_user_quick`
+      WHERE `profile_web` <> "";
+
+-- Modify watch_profile to update 'field' from web to networking
+ALTER TABLE `watch_profile`
+     MODIFY `field` enum('nom', 'freetext', 'mobile', 'nationalite', 'nick',
+                         'web', 'networking', 'appli1', 'appli2', 'addresses',
+                         'section', 'binets', 'medals', 'cv', 'jobs', 'photo');
+
+UPDATE `watch_profile` SET `field` = 'networking' WHERE `field` = 'web';
+
+ALTER TABLE `watch_profile`
+     MODIFY `field` enum('nom', 'freetext', 'mobile', 'nationalite', 'nick',
+                         'networking', 'appli1', 'appli2', 'addresses',
+                         'section', 'binets', 'medals', 'cv', 'jobs', 'photo');
+
+-- Drop old web URL columns
+ALTER TABLE `auth_user_quick` DROP COLUMN `profile_web`;
+ALTER TABLE `auth_user_quick` DROP COLUMN `profile_web_pub`;
+
diff --git a/upgrade/newdirectory-0.0.1/03_emails.sql b/upgrade/newdirectory-0.0.1/03_emails.sql
new file mode 100644 (file)
index 0000000..6ad3c7f
--- /dev/null
@@ -0,0 +1,7 @@
+CREATE TABLE IF NOT EXISTS profile_directory (
+    uid INT NOT NULL,
+    email_directory VARCHAR(255) DEFAULT NULL,
+    PRIMARY KEY (uid)
+) CHARSET=utf8;
+
+ALTER TABLE register_marketing MODIFY COLUMN type ENUM('user', 'staff', 'ax');
diff --git a/upgrade/newdirectory-0.0.1/04_telephone.sql b/upgrade/newdirectory-0.0.1/04_telephone.sql
new file mode 100644 (file)
index 0000000..f415a79
--- /dev/null
@@ -0,0 +1,21 @@
+CREATE TABLE IF NOT EXISTS `profile_phones` (
+    `uid` smallint unsigned NOT NULL,
+    `link_type` enum('address', 'pro', 'user') NOT NULL DEFAULT 'user' COMMENT 'type of parent element',
+    `link_id` tinyint unsigned NOT NULL COMMENT 'id of his parent element',
+    `tel_id` tinyint unsigned NOT NULL COMMENT 'index of this number for the couple (user, parent element)',
+    `tel_type` enum('fixed', 'mobile', 'fax') NOT NULL DEFAULT 'fixed',
+    `search_tel` varchar(25) NOT NULL COMMENT 'search number in an international format with only digits and the initial +',
+    `display_tel` varchar(30) NOT NULL COMMENT 'display number',
+    `pub` enum('private', 'ax', 'public') NOT NULL DEFAULT 'private',
+    `comment` varchar(80) NOT NULL,
+    PRIMARY KEY(`uid`, `link_type`, `link_id`, `tel_id`),
+    INDEX (`search_tel`)
+);
+
+
+-- Adds a temporary column to convert phone prefixes from varchar to int
+ALTER TABLE `geoloc_pays` ADD COLUMN `tmp_phoneprf` smallint unsigned NULL;
+
+-- Adds phone format column
+ALTER TABLE `geoloc_pays` ADD COLUMN `phoneformat` varchar(25) NOT NULL AFTER `nat`;
+
diff --git a/upgrade/newdirectory-0.0.1/05_nationalities.sql b/upgrade/newdirectory-0.0.1/05_nationalities.sql
new file mode 100644 (file)
index 0000000..a7a585e
--- /dev/null
@@ -0,0 +1,15 @@
+ALTER TABLE auth_user_md5 ADD COLUMN nationalite2 CHAR(2) DEFAULT NULL,
+                          ADD COLUMN nationalite3 CHAR(2) DEFAULT NULL,
+                          ADD KEY nationalite2 (nationalite2),
+                          ADD KEY nationalite3 (nationalite3),
+                          MODIFY nationalite CHAR(2) DEFAULT NULL;
+
+UPDATE auth_user_md5 SET nationalite=NULL WHERE nationalite="00" OR nationalite='';
+
+DELETE FROM geoloc_pays WHERE a2="00";
+
+ALTER TABLE watch_profile MODIFY field enum('nom', 'freetext', 'mobile', 'nationalite', 'nationalite2', 'nationalite3',
+                                            'nick', 'web', 'networking', 'appli1', 'appli2', 'addresses',
+                                            'section', 'binets', 'medals', 'cv', 'jobs', 'photo');
+
+# vim:set syntax=mysql:
diff --git a/upgrade/newdirectory-0.0.1/06_education.sql b/upgrade/newdirectory-0.0.1/06_education.sql
new file mode 100644 (file)
index 0000000..be4f85e
--- /dev/null
@@ -0,0 +1,97 @@
+CREATE TABLE IF NOT EXISTS profile_education_field_enum (
+  id INT(2) NOT NULL AUTO_INCREMENT,
+  field VARCHAR(255) DEFAULT NULL,
+  PRIMARY KEY(id),
+  UNIQUE KEY(field)
+) CHARSET=utf8;
+
+CREATE TABLE IF NOT EXISTS profile_education_degree_enum (
+  id INT(2) NOT NULL AUTO_INCREMENT,
+  degree VARCHAR(255) DEFAULT NULL,
+  abbreviation VARCHAR(255) DEFAULT '' NOT NULL,
+  level TINYINT (1) UNSIGNED DEFAULT 0 NOT NULL,
+  PRIMARY KEY(id),
+  UNIQUE KEY(degree),
+  UNIQUE KEY(abbreviation)
+) CHARSET=utf8;
+
+CREATE TABLE IF NOT EXISTS profile_education_degree (
+  eduid INT(4) NOT NULL DEFAULT 0,
+  degreeid INT(2) NOT NULL DEFAULT 0,
+  PRIMARY KEY(eduid, degreeid)
+) CHARSET=utf8;
+
+CREATE TABLE IF NOT EXISTS profile_education_enum (
+  id INT(4) NOT NULL AUTO_INCREMENT,
+  name VARCHAR(255) DEFAULT NULL,
+  abbreviation VARCHAR(255) DEFAULT '' NOT NULL,
+  url VARCHAR(255) DEFAULT NULL,
+  country CHAR(2) NOT NULL DEFAULT 'FR',
+  PRIMARY KEY(id),
+  UNIQUE KEY(name),
+  UNIQUE KEY(IF(abbreviation = '', name, abbreviation))
+) CHARSET=utf8;
+
+CREATE TABLE IF NOT EXISTS profile_education (
+  id TINYINT(2) UNSIGNED NOT NULL DEFAULT 0,
+  uid INT(11) NOT NULL DEFAULT 0,
+  eduid INT(4) NOT NULL DEFAULT 0,
+  degreeid INT(4) NOT NULL DEFAULT 0,
+  fieldid INT(2) NOT NULL DEFAULT 0,
+  entry_year INT(4) DEFAULT NULL,
+  grad_year INT(4) DEFAULT NULL,
+  program VARCHAR(255) DEFAULT NULL,
+  flags SET('primary') DEFAULT '' NOT NULL,
+  PRIMARY KEY(id, uid)
+) CHARSET=utf8;
+
+INSERT INTO  profile_education_field_enum (field)
+     VALUES  ('Aéronautique'), ('Agronomie'), ('Assurance'), ('Biologie'),
+             ('Chimie'), ('Droit'), ('Économie'), ('Électronique/électricité'),
+             ('Environnement/développement durable'), ('Finance'), ('Géographie'),
+             ('Histoire'), ('Informatique'), ('Langues'), ('Mathématiques'),
+             ('Mathématiques appliquées'), ('Mécanique'), ('Médecine'),
+             ('Philosophie'), ('Physique'), ('Sciences politiques');
+
+INSERT INTO  profile_education_degree_enum (degree)
+     VALUES  ('Diplôme'), ('Ingénieur'), ('Corps'), ('MS'), ('PhD'),
+             ('DEA'), ('ME'), ('MBA'), ('MiF'), ('MPA'), ('Licence');
+
+INSERT INTO  profile_education_degree (eduid, degreeid)
+     SELECT  a.id, d.id
+       FROM  applis_def AS a
+ INNER JOIN  profile_education_degree_enum AS d ON (FIND_IN_SET(d.degree, a.type));
+
+INSERT INTO  profile_education_enum (id, name, url)
+     SELECT  id, text, url
+       FROM  applis_def;
+
+INSERT INTO  profile_education (id, uid, eduid, degreeid)
+     SELECT  a.ordre, a.uid, a.aid, d.id
+       FROM  applis_ins AS a
+ INNER JOIN  profile_education_degree_enum AS d ON (a.type = d.degree);
+
+     UPDATE  watch_profile AS w1
+ INNER JOIN  watch_profile AS w2 ON (w1.uid = w2.uid AND w1.field = 'appli1' AND w2.field = 'appli2')
+        SET  w1.ts = IF(w1.ts > w2.ts, w1.ts, w2.ts), w2.ts = IF(w1.ts > w2.ts, w1.ts, w2.ts);
+
+INSERT IGNORE INTO  watch_profile (uid, ts, field)
+            SELECT  uid, ts, 'appli1'
+              FROM  watch_profile
+             WHERE  field = 'appli2';
+
+ALTER TABLE watch_profile MODIFY field enum('nom', 'freetext', 'mobile', 'nationalite', 'nationalite2',
+                                            'nationalite3', 'nick', 'web', 'networking', 'appli1', 'appli2',
+                                            'edus', 'addresses', 'section', 'binets', 'medals', 'cv', 'jobs',
+                                            'photo');
+
+UPDATE watch_profile SET field = 'edus' WHERE field = 'appli1';
+
+DELETE FROM watch_profile WHERE field = 'appli2';
+
+ALTER TABLE watch_profile MODIFY field enum('nom', 'freetext', 'mobile', 'nationalite', 'nationalite2',
+                                            'nationalite3', 'nick', 'web', 'networking', 'edus', 'addresses',
+                                            'section', 'binets', 'medals', 'cv', 'jobs', 'photo');
+
+# vim:set syntax=mysql:
+
diff --git a/upgrade/newdirectory-0.0.1/07_corps b/upgrade/newdirectory-0.0.1/07_corps
new file mode 100644 (file)
index 0000000..50ed7d5
--- /dev/null
@@ -0,0 +1,31 @@
+CREATE TABLE IF NOT EXISTS profile_corps (
+  uid INT(11) NOT NULL,
+  original_corpsid INT(4) UNSIGNED NOT NULL DEFAULT 0,
+  current_corpsid INT(4) UNSIGNED NOT NULL DEFAULT 0,
+  rankid INT(4) UNSIGNED NOT NULL DEFAULT 0,
+  corps_pub ENUM('private', 'ax', 'public') NOT NULL DEFAULT 'private',
+  PRIMARY KEY(uid)
+) CHARSET=utf8;
+
+
+CREATE TABLE IF NOT EXISTS profile_corps_enum (
+  id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT,
+  name VARCHAR(255) NOT NULL DEFAULT '',
+  abbreviation CHAR(5) NOT NULL DEFAULT '',
+  still_exists TINYINT(1) UNSIGNED NOT NULL DEFAULT 1,
+  PRIMARY KEY(id),
+  UNIQUE KEY(name),
+  UNIQUE KEY(abbreviation)
+) CHARSET=utf8;
+
+
+CREATE TABLE IF NOT EXISTS profile_corps_rank_enum (
+  id INT(4) UNSIGNED NOT NULL AUTO_INCREMENT,
+  name VARCHAR(255) NOT NULL DEFAULT '',
+  abbreviation CHAR(5) NOT NULL DEFAULT '',
+  PRIMARY KEY(id),
+  UNIQUE KEY(name),
+  UNIQUE KEY(abbreviation)
+) CHARSET=utf8;
+
+--  vim:set syntax=mysql:
diff --git a/upgrade/newdirectory-0.0.1/08_nationalities.sql b/upgrade/newdirectory-0.0.1/08_nationalities.sql
new file mode 100644 (file)
index 0000000..247c102
--- /dev/null
@@ -0,0 +1,219 @@
+ALTER TABLE geoloc_pays ADD COLUMN license_plate CHAR(4) DEFAULT NULL;
+
+CREATE TEMPORARY TABLE IF NOT EXISTS tmp_update_geoloc_pays (
+  a2 CHAR(2) DEFAULT NULL,
+  code CHAR(4) DEFAULT NULL,
+  PRIMARY KEY(a2),
+  UNIQUE KEY(code)
+) CHARSET=utf8;
+
+INSERT IGNORE INTO  tmp_update_geoloc_pays (a2, code)
+            VALUES  ('AF', 'AFG'),
+                    ('ZA', 'ZA'),
+                    ('AL', 'AL'),
+                    ('DZ', 'DZ'),
+                    ('DE', 'D'),
+                    ('AD', 'AND'),
+                    ('AO', 'ANG'),
+                    ('AG', 'AG'),
+                    ('AN', 'NA'),
+                    ('SA', 'KSA'),
+                    ('AR', 'RA'),
+                    ('AM', 'ARM'),
+                    ('AU', 'AUS'),
+                    ('AT', 'A'),
+                    ('AZ', 'AZ'),
+                    ('BS', 'BS'),
+                    ('BH', 'BRN'),
+                    ('BD', 'BD'),
+                    ('BB', 'BDS'),
+                    ('BY', 'BY'),
+                    ('BE', 'B'),
+                    ('BZ', 'BZ'),
+                    ('BJ', 'DY'),
+                    ('BM', ''),
+                    ('BT', 'BHT'),
+                    ('BO', 'BOL'),
+                    ('BA', 'BIH'),
+                    ('BW', 'RB'),
+                    ('BR', 'BR'),
+                    ('BN', 'BRU'),
+                    ('BG', 'BG'),
+                    ('BF', 'BF'),
+                    ('BI', 'BU'),
+                    ('KH', 'K'),
+                    ('CM', 'CAM'),
+                    ('CA', 'CDN'),
+                    ('CV', 'CV'),
+                    ('CF', 'RCA'),
+                    ('CG', 'CGO'),
+                    ('CL', 'RCH'),
+                    ('CN', 'CN'),
+                    ('CY', 'CY'),
+                    ('CO', 'CO'),
+                    ('KM', 'COM'),
+                    ('CG', 'RCB'),
+                    ('CD', 'CD'),
+                    ('KR', 'ROK'),
+                    ('KP', 'DVRK'),
+                    ('CR', 'CR'),
+                    ('CI', 'CI'),
+                    ('HR', 'HR'),
+                    ('CU', 'C'),
+                    ('DK', 'DK'),
+                    ('DJ', 'DJI'),
+                    ('DO', 'DOM'),
+                    ('DM', 'WD'),
+                    ('EG', 'ET'),
+                    ('SV', 'ES'),
+                    ('AE', 'UAE'),
+                    ('EC', 'EC'),
+                    ('ER', 'ER'),
+                    ('ES', 'E'),
+                    ('EE', 'EST'),
+                    ('US', 'USA'),
+                    ('ET', 'ETH'),
+                    ('FO', 'FR'),
+                    ('FJ', 'FJI'),
+                    ('FI', 'FIN'),
+                    ('FR', 'F'),
+                    ('GA', 'G'),
+                    ('GM', 'WAG'),
+                    ('GE', 'GE'),
+                    ('GH', 'GH'),
+                    ('GI', 'GBZ'),
+                    ('GR', 'GR'),
+                    ('GD', 'WG'),
+                    ('GL', 'KN'),
+                    ('GT', 'GCA'),
+                    ('GN', 'RG'),
+                    ('GQ', 'GQ'),
+                    ('GY', 'GUY'),
+                    ('HT', 'RH'),
+                    ('HN', 'HN'),
+                    ('HK', 'HK'),
+                    ('HU', 'H'),
+                    ('VG', 'BVI'),
+                    ('IN', 'IND'),
+                    ('ID', 'RI'),
+                    ('IR', 'IR'),
+                    ('IQ', 'IRQ'),
+                    ('IE', 'IRL'),
+                    ('IS', 'IS'),
+                    ('IL', 'IL'),
+                    ('IT', 'I'),
+                    ('JM', 'JA'),
+                    ('JP', 'J'),
+                    ('JO', 'JOR'),
+                    ('KZ', 'KZ'),
+                    ('KE', 'EAK'),
+                    ('KG', 'KS'),
+                    ('KI', 'KIR'),
+                    ('KW', 'KWT'),
+                    ('LA', 'LAO'),
+                    ('LS', 'LS'),
+                    ('LV', 'LV'),
+                    ('LB', 'RL'),
+                    ('LR', 'LB'),
+                    ('LY', 'LAR'),
+                    ('LI', 'FL'),
+                    ('LT', 'LT'),
+                    ('LU', 'L'),
+                    ('MK', 'MK'),
+                    ('MG', 'RM'),
+                    ('MY', 'MAL'),
+                    ('MW', 'MW'),
+                    ('MV', 'MV'),
+                    ('ML', 'RMM'),
+                    ('MT', 'M'),
+                    ('MA', 'MA'),
+                    ('MH', 'MH'),
+                    ('MU', 'MS'),
+                    ('MR', 'RIM'),
+                    ('MX', 'MEX'),
+                    ('FM', 'FSM'),
+                    ('MD', 'MD'),
+                    ('MC', 'MC'),
+                    ('MN', 'MGL'),
+                    ('MZ', 'MOC'),
+                    ('MM', 'MYA'),
+                    ('NA', 'NAM'),
+                    ('NR', 'NAU'),
+                    ('NP', 'NEP'),
+                    ('NI', 'NIC'),
+                    ('NE', 'RN'),
+                    ('NG', 'WAN'),
+                    ('NO', 'N'),
+                    ('NZ', 'NZ'),
+                    ('OM', 'OM'),
+                    ('UG', 'EAU'),
+                    ('UZ', 'UZ'),
+                    ('PK', 'PK'),
+                    ('PW', 'PAL'),
+                    ('PS', 'PS'),
+                    ('PA', 'PA'),
+                    ('PG', 'PNG'),
+                    ('PY', 'PY'),
+                    ('NL', 'NL'),
+                    ('PE', 'PE'),
+                    ('PH', 'RP'),
+                    ('PL', 'PL'),
+                    ('PT', 'P'),
+                    ('QA', 'Q'),
+                    ('RE', 'RE'),
+                    ('RO', 'RO'),
+                    ('GB', 'GB'),
+                    ('RU', 'RUS'),
+                    ('RW', 'RWA'),
+                    ('LC', 'WL'),
+                    ('KN', 'SCN'),
+                    ('SM', 'RSM'),
+                    ('VA', 'V'),
+                    ('VC', 'WV'),
+                    ('SB', 'SOL'),
+                    ('WS', 'WS'),
+                    ('ST', 'STP'),
+                    ('SN', 'SN'),
+                    ('CS', 'SCG'),
+                    ('SC', 'SY'),
+                    ('SL', 'WAL'),
+                    ('SG', 'SGP'),
+                    ('SK', 'SK'),
+                    ('SI', 'SLO'),
+                    ('SO', 'SP'),
+                    ('SD', 'SUD'),
+                    ('LK', 'CL'),
+                    ('SE', 'S'),
+                    ('CH', 'CH'),
+                    ('SR', 'SME'),
+                    ('SZ', 'SD'),
+                    ('SY', 'SYR'),
+                    ('TJ', 'TJ'),
+                    ('TW', 'RC'),
+                    ('TZ', 'EAT'),
+                    ('TD', 'TCH'),
+                    ('CZ', 'CZ'),
+                    ('TH', 'THA'),
+                    ('TL', 'TL'),
+                    ('TG', 'RT'),
+                    ('TO', 'TO'),
+                    ('TT', 'TT'),
+                    ('TN', 'TN'),
+                    ('TM', 'TM'),
+                    ('TR', 'TR'),
+                    ('TV', 'TUV'),
+                    ('UA', 'UA'),
+                    ('UY', 'ROU'),
+                    ('VU', 'VU'),
+                    ('VE', 'YV'),
+                    ('VN', 'VN'),
+                    ('YE', 'YAR'),
+                    ('YU', 'YU'),
+                    ('ZM', 'Z'),
+                    ('ZW', 'ZW');
+
+    UPDATE  geoloc_pays            AS g
+INNER JOIN  tmp_update_geoloc_pays AS t ON (t.a2 = g.a2)
+       SET  g.license_plate = t.code;
+
+-- vim:set syntax=mysql:
diff --git a/upgrade/newdirectory-0.0.1/09_education.sql b/upgrade/newdirectory-0.0.1/09_education.sql
new file mode 100644 (file)
index 0000000..74de743
--- /dev/null
@@ -0,0 +1,550 @@
+-- Updates diplomas
+UPDATE profile_education_degree_enum SET abbreviation = 'PhD', degree = 'Doctorat', level = 8 WHERE degree = 'PhD';
+UPDATE profile_education_degree_enum SET abbreviation = 'Lic.', level = 3 WHERE degree = 'Licence';
+UPDATE profile_education_degree_enum SET abbreviation = 'MSc', degree = 'Master of Science', level = 5 WHERE degree = 'MS';
+UPDATE profile_education_degree_enum SET abbreviation = 'DEA', degree = "Diplôme d'Études Approfondies", level = 5 WHERE degree = 'DEA';
+UPDATE profile_education_degree_enum SET abbreviation = 'ME', degree = 'Master of Economics', level = 5 WHERE degree = 'ME';
+UPDATE profile_education_degree_enum SET abbreviation = 'MBA', degree = 'Master of Business Administration', level = 5 WHERE degree = 'MBA';
+UPDATE profile_education_degree_enum SET abbreviation = 'MiF', degree = 'Master in Finance', level = 5 WHERE degree = 'MiF';
+UPDATE profile_education_degree_enum SET abbreviation = 'MPA', degree = 'Master of Public Administration', level = 5 WHERE degree = 'MPA';
+UPDATE profile_education_degree_enum SET abbreviation = 'MIA', degree = 'Master of International Affairs', level = 5 WHERE degree = 'MIA';
+UPDATE profile_education_degree_enum SET abbreviation = 'Corps', degree = 'Corps', level = 5 WHERE degree = 'Corps';
+UPDATE profile_education_degree_enum SET abbreviation = 'Ing.', degree = 'Ingénieur', level = 5 WHERE degree = 'Ingénieur';
+UPDATE profile_education_degree_enum SET abbreviation = 'Dipl.', degree = 'Diplôme', level = 0 WHERE degree = 'Diplôme';
+
+INSERT INTO  profile_education_degree_enum (abbreviation, degree, level)
+     VALUES  ('Agr.', 'Agrégation', 4), ('CAPES', 'Certificat d\'Aptitude au Professorat de l\'Enseignement du Second degré', 4),
+             ('DESS', 'Diplôme d\'Études Supérieures Spécialisées', 5), ('BTS', 'Brevet de Technicien Supérieur', 2), ('MA', 'Master of Arts', 5),
+             ('Maîtr.', 'Maîtrise', 4), ('HDR', 'Habilitation à Diriger des Recherches', 8), ('DEUG', 'Diplôme d\'Études Universitaires Générales', 2),
+             ('MEE', 'Master of Electrical Engineering', 5), ('MPhil', 'Master of Philosophy', 5), ('MUP', 'Master of Urban Planning', 5),
+             ('MME', 'Master of Mechanical Engineering', 5), ('MCP', 'Master of City Planning', 5), ('BA', 'Bachelor of Arts', 3),
+             ('MEl', 'Master of Electronics', 5), ('MM', 'Master of Management', 5), ('MIB', 'Master of International Business', 5),
+             ('MC', 'Master of Chemistry', 5), ('MEM', 'Master of Engineering in Manufacturing', 5), ('MEng', 'Master of Engineering', 5),
+             ('MCE', 'Master of Chemical Engineering', 5), ('M', 'Master', 5), ('MMS', 'Master of Military Studies', 5),
+             ('MSI', 'Master of Science in Information', 5),
+             ('DESCF', 'Diplôme d\'Études Supérieures Comptables et Financières', 5), ('MB', 'Master of Biotechnology', 5);
+
+-- Updates universities
+UPDATE profile_education_enum
+SET abbreviation = 'Télécom', name = 'Télécom ParisTech', url = 'http://www.telecom-paristech.fr/'
+WHERE name = 'Télécom';
+UPDATE profile_education_enum
+SET abbreviation = 'ENGREF', name = 'École Nationale du Génie Rural des Eaux et des Forêts', url = 'http://www.agroparistech.fr/-Ecole-interne-ENGREF-.html'
+WHERE name = 'ENGREF';
+UPDATE profile_education_enum
+SET abbreviation = 'INSEE', name = 'Institut National de la Statistique et des Études Économiques'
+WHERE name = 'INSEE';
+UPDATE profile_education_enum
+SET abbreviation = 'Météo', name = 'École Nationale de la Météorologie'
+WHERE name = 'Météo';
+UPDATE profile_education_enum
+SET abbreviation = 'Mines', name = 'Mines ParisTech'
+WHERE name = 'Mines';
+UPDATE profile_education_enum
+SET abbreviation = 'Ponts', name = 'École des Ponts ParisTech'
+WHERE name = 'Ponts';
+UPDATE profile_education_enum
+SET abbreviation = 'ENSAE', name = 'École Nationale de la Statistique et de l\'Administration Économique ParisTech'
+WHERE name = 'ENSAE';
+UPDATE profile_education_enum
+SET abbreviation = 'ENSAM', name = 'Arts et Métiers ParisTech'
+WHERE name = 'ENSAM';
+UPDATE profile_education_enum
+SET abbreviation = 'ENSEEIHT', name = 'École Nationale Supérieure d\'Électrotechnique, d\'Électronique, d\'Informatique, d\'Hydraulique et des Télécommunications'
+WHERE name = 'ENSEEIHT';
+UPDATE profile_education_enum
+SET abbreviation = 'ENSIMAG', name = 'École Nationale Supérieure d\'Informatique et de Mathématiques Appliquées de Grenoble', url = 'http://ensimag.grenoble-inp.fr/'
+WHERE name = 'ENSIMAG';
+UPDATE profile_education_enum
+SET abbreviation = 'ENSTA', name = 'École Nationale Supérieure de Techniques Avancées'
+WHERE name = 'ENSTA';
+UPDATE profile_education_enum
+SET abbreviation = 'ENSPM', name = 'École Nationale Supérieure du Pétrole et des Moteurs'
+WHERE name = 'ENSPM';
+UPDATE profile_education_enum
+SET abbreviation = 'INAPG', name = 'Institut National Agronomique Paris-Grignon', url = 'http://www.agroparistech.fr/'
+WHERE name = 'INAPG';
+UPDATE profile_education_enum
+SET abbreviation = 'HEC', name = 'École des Hautes Études Commerciales'
+WHERE name = 'HEC';
+UPDATE profile_education_enum
+SET abbreviation = 'X', name = 'École polytechnique', url = 'http://www.polytechnique.edu/'
+WHERE name = 'X';
+UPDATE profile_education_enum
+SET abbreviation = 'SUPAERO', name = 'École Nationale Supérieure de l\'Aéronautique et de l\'Espace', url = 'http://www.isae.fr/'
+WHERE name = 'Supaéro';
+UPDATE profile_education_enum
+SET abbreviation = 'SupOptique', name = 'Institut d\'Optique Théorique et Appliquée'
+WHERE name = 'Supoptique';
+UPDATE profile_education_enum
+SET abbreviation = 'Supélec', name = 'École Supérieure d\'Électricité'
+WHERE name = 'Supélec';
+UPDATE profile_education_enum
+SET abbreviation = 'ENA', name = 'École Nationale d\'Administration'
+WHERE name = 'ENA';
+UPDATE profile_education_enum
+SET abbreviation = 'INSEAD', name = 'Institut Européen d\'Administration des Affaires', url = 'http://www.insead.edu/'
+WHERE name = 'INSEAD';
+UPDATE profile_education_enum
+SET abbreviation = 'Chimie Paris', name = 'Chimie Paris ParisTech', url = 'http://www.enscp.fr/'
+WHERE name = 'Chimie Paris';
+UPDATE profile_education_enum
+SET abbreviation = 'INSTN', name = 'Institut National des Sciences et Techniques Nucléaires'
+WHERE name = 'INSTN';
+UPDATE profile_education_enum
+SET abbreviation = 'UMPC', name = 'Université Pierre-et-Marie-Curie (Paris-VI)', url = 'http://www.upmc.fr/'
+WHERE name = 'Univ Paris  6 (Pierre et Marie Curie - Jussieu)';
+UPDATE profile_education_enum
+SET abbreviation = 'Paris-Sud', name = 'Université Paris-Sud (Paris-XI)'
+WHERE name = 'Univ Paris 11 (Orsay)';
+UPDATE profile_education_enum
+SET abbreviation = 'Paris-Diderot', name = 'Université Denis Diderot (Paris-VII)', url = 'http://www.univ-paris7.fr/'
+WHERE name = 'Univ Paris  7 (Denis Diderot - Jussieu)';
+UPDATE profile_education_enum
+SET abbreviation = 'Dauphine', name = 'Université de Technologie en Sciences des Organisations et de la Décision de Paris-Dauphine (Paris-IX)'
+WHERE name = 'Univ Paris  9 (Dauphine)';
+UPDATE profile_education_enum
+SET abbreviation = 'Panthéon-Sorbonne', name = 'Université Panthéon-Sorbonne (Paris-I)'
+WHERE name = 'Univ Paris  1 (Panthéon-Sorbonne)';
+UPDATE profile_education_enum
+SET abbreviation = 'Nanterre', name = 'Université de Paris Ouest - Nanterre La Défense (Paris-X)'
+WHERE name = 'Univ Paris 10 (Nanterre)';
+UPDATE profile_education_enum
+SET abbreviation = 'Paris-Descartes', name = 'Université Paris Descartes (Paris-V)'
+WHERE name = 'Univ Paris  5 (René Descartes)';
+UPDATE profile_education_enum
+SET abbreviation = 'Sorbonne Nouvelle', name = 'Université Sorbonne Nouvelle (Paris-III)'
+WHERE name = 'Univ Paris  3 (Sorbonne Nouvelle)';
+UPDATE profile_education_enum
+SET abbreviation = 'Vincennes-Saint-Denis', name = 'Université de Vincennes à Saint-Denis (Paris-VIII)'
+WHERE name = 'Univ Paris  8 (Vincennes - Saint Denis)';
+UPDATE profile_education_enum
+SET abbreviation = 'Paris-Val de Marne', name = 'Université Paris-Val de Marne (Paris-XII)'
+WHERE name = 'Univ Paris 12 (Val de Marne)';
+UPDATE profile_education_enum
+SET abbreviation = 'Paris-Nord', name = 'Université Paris-Nord (Paris-XIII)'
+WHERE name = 'Univ Paris 13 (Nord)';
+UPDATE profile_education_enum
+SET abbreviation = 'Paris-Sorbonne', name = 'Université Paris-Sorbonne (Paris-IV)'
+WHERE name = 'Univ Paris  4 (Sorbonne)';
+UPDATE profile_education_enum
+SET abbreviation = 'Assas', name = 'Université Panthéon-Assas (Paris-II)'
+WHERE name = 'Univ Paris  2 (Panthéon - Assas)';
+UPDATE profile_education_enum
+SET abbreviation = 'CDI', name = 'Collège des Ingénieurs'
+WHERE name = 'Collège des Ingénieurs';
+UPDATE profile_education_enum
+SET abbreviation = 'ENS Ulm', name = 'École Normale Supérieure'
+WHERE name = 'ENS Ulm';
+UPDATE profile_education_enum
+SET abbreviation = 'ENS Lyon', name = 'École Normale Supérieure de Lyon '
+WHERE name = 'ENS Lyon';
+UPDATE profile_education_enum
+SET abbreviation = 'ENS Cachan', name = 'École Normale Supérieure de Cachan'
+WHERE name = 'ENS Cachan';
+UPDATE profile_education_enum
+SET abbreviation = 'ESPCI', name = 'ESPCI ParisTech'
+WHERE name = 'ESPCI';
+UPDATE profile_education_enum
+SET abbreviation = 'Sciences Po', name = 'Institut d\'Études Politiques de Paris'
+WHERE name = 'IEP Paris';
+UPDATE profile_education_enum
+SET abbreviation = 'EHESS', name = 'École des Hautes Études en Sciences Sociales'
+WHERE name = 'EHESS';
+UPDATE profile_education_enum
+SET abbreviation = 'ENSIC', name = 'École Nationale Supérieure des Industries Chimiques'
+WHERE name = 'ENSIC';
+UPDATE profile_education_enum
+SET abbreviation = 'Grenoble INP', name = 'Institut Polytechnique de Grenoble', url = 'http://www.grenoble-inp.fr/'
+WHERE name = 'INPG';
+UPDATE profile_education_enum
+SET abbreviation = 'ESSEC', name = 'École Supérieure des Sciences Économiques et Commerciales'
+WHERE name = 'ESSEC';
+UPDATE profile_education_enum
+SET abbreviation = 'INPL', name = 'Institut National Polytechnique de Lorraine'
+WHERE name = 'INPL';
+UPDATE profile_education_enum
+SET abbreviation = 'ENSAPB', name = 'École Nationale Supérieure d\'Architecture de Paris-Belleville'
+WHERE name = 'EAPB (Ecole Architecture Paris Belleville)';
+UPDATE profile_education_enum
+SET abbreviation = 'ENSAPLV', name = 'École Nationale Supérieure d\'Architecture de Paris-La Villette'
+WHERE name = 'EAPLV (Ecole Architecture Paris La Villette)';
+UPDATE profile_education_enum
+SET abbreviation = 'EAVT', name = 'École d\'Architecture de la Ville et des Territoires à Marne-la-Vallée'
+WHERE name = 'EAVT (Ecole d\'architecture de Marne La Vallee)';
+UPDATE profile_education_enum
+SET abbreviation = 'ENSP', name = 'École Nationale Supérieure du Paysage'
+WHERE name = 'ENSP Versailles';
+UPDATE profile_education_enum
+SET abbreviation = '', name = 'École Nationale Supérieure du Génie Maritime', url = 'http://www.ensta.fr/'
+WHERE name = 'Génie maritime (Ecole nationale supérieur du)';
+UPDATE profile_education_enum
+SET abbreviation = 'CPA de Paris', name = 'Centre de Perfectionnement aux Affaires de Paris', url = ''
+WHERE name = 'Centre de Perfectionnement aux Affaires';
+UPDATE profile_education_enum
+SET abbreviation = '', name = 'ESCP-EAP', url = 'http://www.escp-eap.eu/'
+WHERE name = 'ESCP-EAP';
+UPDATE profile_education_enum
+SET abbreviation = 'CEPE', name = 'Centre d\'Études des Programmes Économiques'
+WHERE name = 'CEPE';
+UPDATE profile_education_enum
+SET abbreviation = '', name = 'Institut des Actuaires', url = 'http://www.institutdesactuaires.com/'
+WHERE name = 'Institut des actuaires';
+UPDATE profile_education_enum
+SET abbreviation = 'CEIPI', name = 'Centre d\'Études Internationales de la Propriété Industrielle'
+WHERE name = 'CEIPI';
+UPDATE profile_education_enum
+SET abbreviation = 'Université Paul-Sabatier', name = 'Université Paul-Sabatier (Toulouse III)'
+WHERE name = 'Univ Toulouse III (Paul Sabatier)';
+UPDATE profile_education_enum
+SET abbreviation = 'Université de Provence', name = 'Université de Provence (Aix-Marseille I)'
+WHERE name = 'Université de Provence';
+UPDATE profile_education_enum
+SET abbreviation = 'INSA Rouen', name = 'Institut National des Sciences Appliquées de Rouen'
+WHERE name = 'INSA Rouen';
+UPDATE profile_education_enum
+SET abbreviation = 'IAE de Paris', name = 'Institut d\'Administration des Entreprises de Paris', url = 'http://iae.univ-paris1.fr/'
+WHERE name = 'Institut d\'Administration des Entreprises';
+
+UPDATE profile_education_enum
+SET abbreviation = 'Berkeley', name = 'University of California, Berkeley', country = 'US'
+WHERE name = 'Univ Berkeley';
+UPDATE profile_education_enum
+SET abbreviation = 'CalTech', name = 'California Institute of Technology', country = 'US'
+WHERE name = 'CalTech';
+UPDATE profile_education_enum
+SET abbreviation = 'MIT', name = 'Massachusetts Institute of Technology', country = 'US'
+WHERE name = 'Massachusetts Institute of Technology';
+UPDATE profile_education_enum
+SET abbreviation = 'Cornell', name = 'Cornell University', country = 'US'
+WHERE name = 'Univ Cornell';
+UPDATE profile_education_enum
+SET abbreviation = 'Stanford', name = 'Stanford University', country = 'US'
+WHERE name = 'Univ Stanford';
+UPDATE profile_education_enum
+SET abbreviation = 'UCLA', name = 'University of California, Los Angeles', country = 'US'
+WHERE name = 'Univ UCLA';
+UPDATE profile_education_enum
+SET abbreviation = '', name = 'University of Illinois', country = 'US'
+WHERE name = 'Univ Illinois';
+UPDATE profile_education_enum
+SET abbreviation = 'Michigan', name = 'University of Michigan, Ann Arbor', country = 'US'
+WHERE name = 'Univ Michigan';
+UPDATE profile_education_enum
+SET abbreviation = '', name = 'Seattle University', country = 'US'
+WHERE name = 'Univ Seattle';
+UPDATE profile_education_enum
+SET abbreviation = 'UGA', name = 'University of Georgia', country = 'US'
+WHERE name = 'Univ Georgia';
+UPDATE profile_education_enum
+SET abbreviation = 'UT Austin', name = 'University of Texas at Austin', country = 'US'
+WHERE name = 'Univ Texas';
+UPDATE profile_education_enum
+SET abbreviation = 'RIP', name = 'Rensselaer Polytechnic Institute', country = 'US'
+WHERE name = 'Univ Rensselaer';
+UPDATE profile_education_enum
+SET abbreviation = 'NYU', name = 'New York University', country = 'US'
+WHERE name = 'Univ New York';
+UPDATE profile_education_enum
+SET abbreviation = 'Harvard', name = 'Harvard University', country = 'US'
+WHERE name = 'Univ Harvard';
+UPDATE profile_education_enum
+SET abbreviation = 'The Wharton School', name = 'The Wharton School of the University of Pennsylvania', country = 'US', url = 'http://www.wharton.upenn.edu/'
+WHERE name = 'Univ Wharton';
+UPDATE profile_education_enum
+SET abbreviation = 'Columbia University', name = 'Columbia University in the City of New York', country = 'US'
+WHERE name = 'Univ Columbia';
+UPDATE profile_education_enum
+SET abbreviation = 'WSBS', name = 'Watson School of Biological Sciences', country = 'US'
+WHERE name = 'Watson School of Biological Sciences';
+UPDATE profile_education_enum
+SET abbreviation = '', name = 'Colorado School of Mines', country = 'US'
+WHERE name = 'Univ Colorado School of Mines';
+UPDATE profile_education_enum
+SET abbreviation = 'Princeton', name = 'Princeton University', country = 'US'
+WHERE name = 'Univ Princeton';
+UPDATE profile_education_enum
+SET abbreviation = 'Georgia Tech', name = 'Georgia Institute of Technology', country = 'US'
+WHERE name = 'GeorgiaTech';
+UPDATE profile_education_enum
+SET abbreviation = 'JHU', name = 'Johns Hopkins University', country = 'US'
+WHERE name = 'Univ Johns Hopkins';
+UPDATE profile_education_enum
+SET abbreviation = '', name = 'University of Chicago', country = 'US'
+WHERE name = 'Univ Chicago';
+UPDATE profile_education_enum
+SET abbreviation = 'Yale', name = 'Yale University', country = 'US'
+WHERE name = 'Univ Yale';
+UPDATE profile_education_enum
+SET abbreviation = 'TAMU', name = 'Texas A&M University', country = 'US'
+WHERE name = 'Texas A&M University';
+UPDATE profile_education_enum
+SET abbreviation = 'UCSB', name = 'University of California, Santa Barbara', country = 'US'
+WHERE name = 'Univ Santa-Barbara';
+UPDATE profile_education_enum
+SET abbreviation = 'Kellogg', name = 'Kellogg School of Management', country = 'US'
+WHERE name = 'Kellogg School of Management';
+UPDATE profile_education_enum
+SET abbreviation = '', name = 'University of Iowa', country = 'US'
+WHERE name = 'Univ Iowa';
+UPDATE profile_education_enum
+SET abbreviation = 'UW-Madison', name = 'University of Wisconsin-Madison', country = 'US', url = 'http://www.wisc.edu/'
+WHERE name = 'Univ Wisconsin-Madison';
+UPDATE profile_education_enum
+SET abbreviation = 'UCSD', name = 'University of California, San Diego', country = 'US'
+WHERE name = 'Univ San Diego';
+UPDATE profile_education_enum
+SET abbreviation = 'NU', name = 'Northwestern University', country = 'US'
+WHERE name = 'Univ Northwestern';
+UPDATE profile_education_enum
+SET abbreviation = 'CU', name = 'University of Colorado at Boulder', country = 'US'
+WHERE name = 'Univ Colorado at Boulder';
+UPDATE profile_education_enum
+SET abbreviation = 'CMU', name = 'Carnegie Mellon University', country = 'US'
+WHERE name = 'Univ Carnegie Mellon';
+UPDATE profile_education_enum
+SET abbreviation = 'Carolina', name = 'University of North Carolina at Chapel Hill', country = 'US'
+WHERE name = 'Univ of North Carolina at Chapel Hill';
+
+UPDATE profile_education_enum
+SET abbreviation = 'TU Berlin', name = 'Technische Universität Berlin', country = 'DE'
+WHERE name = 'Univ TU Berlin';
+UPDATE profile_education_enum
+SET abbreviation = 'TU Darmstadt', name = 'Technische Universität Darmstadt', country = 'DE'
+WHERE name = 'Univ TU Darmstadt';
+UPDATE profile_education_enum
+SET abbreviation = 'TU München', name = 'Technische Universität München', country = 'DE'
+WHERE name = 'Univ TU München';
+UPDATE profile_education_enum
+SET abbreviation = 'Universität Karlsruhe', name = 'Universität Karlsruhe (TH)', country = 'DE'
+WHERE name = 'Univ Karlsruhe';
+UPDATE profile_education_enum
+SET abbreviation = 'RWTH', name = 'RWTH Aachen University', country = 'DE'
+WHERE name = 'Univ RWTH-Aachen';
+UPDATE profile_education_enum
+SET abbreviation = '', name = 'Universität Stuttgart', country = 'DE'
+WHERE name = 'Univ Stuttgart';
+
+UPDATE profile_education_enum
+SET abbreviation = 'EPM', name = 'École Polytechnique de Montréal', country = 'CA'
+WHERE name = 'EP Montréal';
+UPDATE profile_education_enum
+SET abbreviation = 'UBC', name = 'University of British Columbia', country = 'CA'
+WHERE name = 'Univ British Columbia';
+UPDATE profile_education_enum
+SET abbreviation = 'McGill', name = 'McGill University', country = 'CA'
+WHERE name = 'Univ McGill';
+UPDATE profile_education_enum
+SET abbreviation = 'UQÀM', name = 'Université du Québec à Montréal', country = 'CA' WHERE id = 125;
+
+UPDATE profile_education_enum
+SET abbreviation = 'UPC', name = 'Universitat Politècnica de Catalunya', country = 'ES'
+WHERE name = 'Univ Catalunya';
+UPDATE profile_education_enum
+SET abbreviation = 'UPM', name = 'Universidad Politècnica de Madrid', country = 'ES'
+WHERE name = 'Univ Madrid';
+UPDATE profile_education_enum
+SET abbreviation = 'UPF', name = 'Universitat Pompeu Fabra', country = 'ES'
+WHERE name = 'Univ Pompeu Fabra';
+
+UPDATE profile_education_enum
+SET abbreviation = 'Chalmers', name = 'Chalmers Tekniska Högskola', country = 'SE'
+WHERE name = 'Univ Chalmers';
+UPDATE profile_education_enum
+SET abbreviation = 'KTH', name = 'Kungliga Tekniska Högskolan', country = 'SE'
+WHERE name = 'Univ KTH';
+UPDATE profile_education_enum
+SET abbreviation = '', name = 'Stockholms Universitet', country = 'SE'
+WHERE name = 'Univ Stockholm';
+
+UPDATE profile_education_enum
+SET abbreviation = 'TU Delft', name = 'Technische Universiteit Delft', country = 'NL'
+WHERE name = 'Univ TU Delft';
+UPDATE profile_education_enum
+SET abbreviation = 'RSM', name = 'Rotterdam School of Management, Erasmus University', country = 'NL'
+WHERE name = 'RSM';
+UPDATE profile_education_enum
+SET abbreviation = '', name = 'Universiteit Leiden', country = 'NL'
+WHERE name = 'Univ Leiden';
+
+UPDATE profile_education_enum
+SET abbreviation = '', name = 'Kyoto University', country = 'JP'
+WHERE name = 'Univ Kyoto';
+UPDATE profile_education_enum
+SET abbreviation = 'Todai', name = 'University of Tokyo', country = 'JP'
+WHERE name = 'Univ Tokyo';
+UPDATE profile_education_enum
+SET abbreviation = 'Tokyo Tech', name = 'Tokyo Institute of Technology', country = 'JP'
+WHERE name = 'Tokyo Institute of Technology';
+
+UPDATE profile_education_enum
+SET abbreviation = 'UNIL', name = 'Université de Lausanne', country = 'CH'
+WHERE name = 'Univ Lausanne';
+UPDATE profile_education_enum
+SET abbreviation = '', name = 'Universität Zürich', country = 'CH'
+WHERE name = 'Univ Zürich';
+UPDATE profile_education_enum
+SET abbreviation = 'EPFL', name = 'École Polytechnique Fédérale de Lausanne', country = 'CH'
+WHERE name = 'EP Fédérale Lausanne';
+UPDATE profile_education_enum
+SET abbreviation = 'IMD', name = 'International Institute for Management Development', country = 'CH'
+WHERE name = 'Institute for Management Development';
+UPDATE profile_education_enum
+SET abbreviation = 'ETH Zürich', name = 'Eidgenössische Technische Hochschule Zürich', country = 'CH'
+WHERE name = 'ETH Zürich';
+
+UPDATE profile_education_enum
+SET abbreviation = 'UNIMI', name = 'Università degli Studi di Milano', country = 'IT'
+WHERE name = 'Univ Milano';
+UPDATE profile_education_enum
+SET abbreviation = 'UNITO', name = 'Università degli Studi di Torino', country = 'IT'
+WHERE name = 'Univ Torino';
+UPDATE profile_education_enum
+SET abbreviation = '', name = 'Politecnico di Milano', country = 'IT'
+WHERE name = 'Politecnico di Milano';
+UPDATE profile_education_enum
+SET abbreviation = 'EUI', name = 'European University Institute', country = 'IT'
+WHERE name = 'Institut Universitaire Européen';
+UPDATE profile_education_enum
+SET abbreviation = 'Università Bocconi', name = 'Università Commerciale Luigi Bocconi', url = 'http://www.unibocconi.it/', country = 'IT'
+WHERE name = 'Université Bocconi';
+
+UPDATE profile_education_enum
+SET abbreviation = 'MGU', name = 'Lomonosov Moscow State University', country = 'RU'
+WHERE name = 'Univ Moscow (lomonosov)';
+UPDATE profile_education_enum
+SET abbreviation = 'Bauman MSTU', name = 'Bauman Moscow State Technical University', country = 'RU', url = 'http://www.bmstu.ru/'
+WHERE name = 'Univ Moscow (Bauman)';
+
+UPDATE profile_education_enum
+SET abbreviation = 'Technion', name = 'Israel Institute of Technology', country = 'IL'
+WHERE name = 'Univ Technion';
+
+UPDATE profile_education_enum
+SET abbreviation = 'Oxford', name = 'University of Oxford', country = 'GB'
+WHERE name = 'Univ Oxford';
+UPDATE profile_education_enum
+SET abbreviation = '', name = 'London Business School', country = 'GB'
+WHERE name = 'London Business School';
+UPDATE profile_education_enum
+SET abbreviation = 'LSE', name = 'The London School of Economics and Political Science', country = 'GB'
+WHERE name = 'London School of Economics';
+UPDATE profile_education_enum
+SET abbreviation = 'Cambridge', name = 'University of Cambridge', country = 'GB'
+WHERE name = 'Univ Cambridge';
+UPDATE profile_education_enum
+SET abbreviation = 'Imperial College', name = 'Imperial College London', country = 'GB', url = 'http://www3.imperial.ac.uk/'
+WHERE name = 'Imperial College';
+UPDATE profile_education_enum
+SET abbreviation = 'Henley', name = 'Henley Management College', country = 'GB', url = 'http://www.henley.reading.ac.uk/'
+WHERE name = 'Henley Management College';
+UPDATE profile_education_enum
+SET abbreviation = '', name = 'University of Southampton', country = 'GB', url = 'http://www.soton.ac.uk/'
+WHERE name = 'Univ Southampton';
+UPDATE profile_education_enum
+SET abbreviation = '', name = 'Cardiff University', country = 'GB'
+WHERE name = 'Univ Cardiff';
+
+UPDATE profile_education_enum
+SET abbreviation = 'UNSW', name = 'The University of New South Wales', country = 'AU'
+WHERE name = 'Univ New South Wales  (Sydney Australia)';
+
+UPDATE profile_education_enum
+SET abbreviation = 'THU', name = 'Tsinghua University', country = 'CN'
+WHERE name = 'Univ Tsinghua';
+
+UPDATE profile_education_enum
+SET abbreviation = 'NUS', name = 'National University of Singapore', country = 'SG'
+WHERE name = 'National University of Singapore';
+
+UPDATE profile_education_enum
+SET abbreviation = 'NTNU', name = 'Norwegian University of Science and Technology', country = 'NO', url = 'http://www.ntnu.no/'
+WHERE name = 'Univ Trondheim';
+
+-- Cleans duplicated entries
+UPDATE profile_education SET eduid = 0 WHERE eduid = 70;
+DELETE FROM profile_education_enum WHERE id = 70;
+DELETE FROM profile_education_degree WHERE eduid = 70;
+
+UPDATE profile_education SET eduid = 91 WHERE eduid = 106;
+DELETE FROM profile_education_enum WHERE id = 106;
+DELETE FROM profile_education_degree WHERE eduid = 106;
+
+-- Adds new universities needed for the AX directory
+INSERT INTO  profile_education_enum (name, url, country, abbreviation)
+     VALUES  ('Institut Supérieur de l\'Aéronautique et de l\'Espace', 'http://www.isae.fr/', 'FR', 'ISAE'),
+             ('Institut des Hautes Études de Défense Nationale', 'http://www.ihedn.fr/', 'FR', 'IHEDN'),
+             ('École du Personnel Navigant d\'Essais et de Réception',
+              'http://www.defense.gouv.fr/dga/archives/l_epner_ecole_du_personnel_navigant_d_essais_et_de_reception', 'FR', 'EPNER'),
+             ('Agrocampus Ouest', 'http://www.agrocampus-ouest.fr/', 'FR', 'ENSAR'),
+             ('Montpellier SupAgro', 'http://www.supagro.fr/', 'fr', ''),
+             ('Institut Supérieur des Matériaux et de la Construction Mécanique Saint-Ouen', 'http://www.cefi.org/BOUCHON/BS/ISMCM_Saint-Ouen.htm',
+              'FR', 'ISMCM Saint-Ouen'),
+             ('École Centrale d\'Électronique ', 'http://www.ece.fr/', 'FR', 'ECE'),
+             ('École Nationale de l\'Aviation Civile', 'http://www.enac.fr/', 'FR', 'ENAC'),
+             ('Centre des Hautes Études de la Construction', 'http://www.chec.fr/', 'FR', 'CHEC'),
+             ('École de l\'Air', 'http://www.ecole-air.air.defense.gouv.fr/index.php?option=com_content&task=view&id=203&Itemid=251', 'FR', ''),
+             ('Institut Supérieur des Affaires', '', 'FR', 'ISA'),
+             ('École Supérieure de Gestion de Paris', 'http://www.esg.fr/', 'FR', 'ESG Paris'),
+             ('Institut des Hautes Études Européennes', 'http://www-ihee.u-strasbg.fr/', 'FR', 'IHEE'),
+             ('École Nationale de la Magistrature', 'http://www.enm.justice.fr/', 'FR', 'ENM'),
+             ('Institut de Formation Supérieure BioMédicale', 'http://www.igr.fr/ifsbm/', 'FR', 'IFSBM'),
+             ('Institut Supérieur de l\'AgroAlimentaire', 'http://www.isaa.fr/', 'FR', 'ISAA'),
+             ('École des Mines d\'Alès', 'http://www.ema.fr/', 'FR', 'EMA'),
+             ('Syracuse University', 'http://www.syr.edu/', 'US', 'SU'),
+             ('Dartmouth College', 'http://www.dartmouth.edu/', 'US', ''),
+             ('International Teachers Programme', 'http://www.itp-schools.org/', '', 'ITP'),
+             ('University of Kentucky', 'http://www.uky.edu/', 'US', 'UK'),
+             ('Marine Corps University', 'http://www.mcu.usmc.mil/', 'US', 'MCU'),
+             ('Chartered Institute of Management Accountants', 'http://www.cimaglobal.com/', 'GB', 'CIMA'),
+             ('University College London', 'http://www.ucl.ac.uk/', 'GB', 'UCL'),
+             ('Chartered Financial Analyst Institute', 'http://www.cfainstitute.org/', 'US', 'CFA Institute'),
+             ('Naval Postgraduate School', 'http://www.nps.edu/', 'US', 'NPS'),
+             ('Royal College of Art', 'http://www.rca.ac.uk/', 'GB', 'RCA'),
+             ('Uniwersytet Gdański', 'http://www.univ.gda.pl/', 'PL', ''),
+             ('College of Europe', 'http://www.coleurope.eu/', '', ''),
+             ('Purdue University', 'http://www.purdue.edu/', 'US', ''),
+             ('Queen\'s University', 'http://www.queensu.ca/', 'CA', 'Queen\'s'),
+             ('Université de Bretagne Occidentale', 'http://www.univ-brest.fr/', 'FR', 'UBO'),
+             ('University of California, Davis', 'http://www.ucdavis.edu/', 'US', 'UC Davis'),
+             ('Universität Stuttgarti', 'http://www.uni-stuttgart.de/', 'DE', ''),
+             ('Universitatea Politehnica din Bucureşti', 'http://www.pub.ro/', 'RO', 'Politehnica din Bucureşti'),
+             ('University of Birmingham', 'http://www.bham.ac.uk/', 'GB', ''),
+             ('University of Pennsylvania', 'http://www.upenn.edu/', 'US', ''),
+             ('University of Rome', '', 'IT', ''),
+             ('University of Sheffield', 'http://www.shef.ac.uk/', 'GB', ''),
+             ('University of Utah', 'http://www.utah.edu/', 'US', ''),
+             ('University of Washington', 'http://www.washington.edu/', 'US', ''),
+             ('Urbana University', 'http://www.urbana.edu/', 'US', ''),
+             ('Université de Technologie de Compiègne', 'http://www.utc.fr/', 'FR', 'UTC'),
+             ('Virginia Polytechnic Institute and State University', 'http://www.vt.edu/', 'US', 'Virginia Tech'),
+             ('Université Claude Bernard (Lyon I)', 'http://www.univ-lyon1.fr/', 'FR', 'Université Claude Bernard'),
+             ('Cleveland State University', 'http://www.csuohio.edu/', 'US', 'CSU'),
+             ('Centre de Perfectionnement aux Affaires du Nord', '', 'FR', 'CPA du Nord'),
+             ('Centre de Perfectionnement aux Affaires de Lyon', '', '', 'CPA de Lyon'),
+             ('Amherst College', 'http://www.amherst.edu/', 'US', '')
+             ('Ottawa University', 'http://www.ottawa.edu/', 'US', 'OU'),
+             ('Indiana University', 'http://www.indiana.edu/', 'US', ''),
+             ('University of Notre Dame du Lac', 'http://www.nd.edu/', 'US', 'Notre Dame'),
+             ('University of Maryland, College Park ', 'http://www.umd.edu/', 'US', 'UMCP'),
+             ('Vanderbilt University', 'http://www.vanderbilt.edu/', 'US', ''),
+             ('Institut National Polytechnique de Toulouse', 'http://www.inp-toulouse.fr/', 'FR', 'INP Toulouse'),
+             ('University of Houston', 'http://www.uh.edu/', 'US', 'UH'),
+             ('École Spéciale des Travaux Publics, du Bâtiment et de l\'Industrie', 'http://www.estp.fr/', 'FR', 'ESTP'),
+             ('Université Jean-Moulin (Lyon-III)', 'http://www.univ-lyon3.fr/', 'FR', 'Université Jean-Moulin'),
+             ('École Nationale Supérieure d\'Ingénieurs Électriciens de Grenoble', 'http://ense3.grenoble-inp.fr/', 'FR', 'ENSIEG'),
+             ('École Nationale Supérieure d\'Hydraulique et de Mécanique de Grenoble', 'http://ense3.grenoble-inp.fr/', 'FR', 'ENSHMG'),
+             ('Université de Rennes 1', 'http://www.univ-rennes1.fr/', 'FR', ''),
+             ('École Centrale Paris', 'http://www.ecp.fr/', 'FR', 'Centrale Paris'),
+             ('University of Dallas', 'http://www.udallas.edu/', 'US', ''),
+             ('Pontifical Catholic University of Chile', 'http://www.uc.cl/', 'CL', 'PUC'),
+             ('Universitat Oberta de Catalunya', 'http://www.uoc.edu/web/eng/', 'ES', 'UOC'),
+             ('University of California, Irvine', 'http://www.uci.edu/', 'US', 'UCI'),
+             ('Association Francophone de Management de Projet', 'http://www.afitep.fr/', 'FR', 'AFITEP'),
+             ('Centre Européen d\'Éducation Permanente', 'http://www.cedep.fr/', 'FR', 'CEDEP'),
+             ('Collège Interarmées de Défense', 'http://www.college.interarmees.defense.gouv.fr/', 'FR', ''),
+             ('Centre de Formation des Journalistes', 'http://www.cfpj.com/', 'FR', 'CFJ'),
+             ('Institut National des Hautes Études de Sécurité', 'http://www.inhes.interieur.gouv.fr/', 'FR', 'INHES');
+
+# vim:set syntax=mysql:
+
diff --git a/upgrade/newdirectory-0.0.1/10_promotion.sql b/upgrade/newdirectory-0.0.1/10_promotion.sql
new file mode 100644 (file)
index 0000000..fb3b7b5
--- /dev/null
@@ -0,0 +1,16 @@
+INSERT INTO  profile_education (id, uid, grad_year, entry_year, eduid, degreeid, flags)
+     SELECT  100, user_id, promo_sortie, promo, 20, 2, 'primary'
+       FROM  auth_user_md5;
+
+CREATE TABLE  profile_display (
+  uid INT(11) NOT NULL DEFAULT 0,
+  promo_display VARCHAR(255) DEFAULT '' NOT NULL,
+  PRIMARY KEY(uid)
+) CHARSET=utf8;
+
+INSERT IGNORE INTO  profile_display (uid, promo_display)
+            SELECT  uid, CONCAT("X", entry_year)
+              FROM  profile_education
+             WHERE  FIND_IN_SET('primary', flags);
+
+-- vim:set syntax=mysql:
diff --git a/upgrade/newdirectory-0.0.1/connect.db.inc.php b/upgrade/newdirectory-0.0.1/connect.db.inc.php
new file mode 100644 (file)
index 0000000..c3035a7
--- /dev/null
@@ -0,0 +1,28 @@
+<?php
+/***************************************************************************
+ *  Copyright (C) 2003-2008 Polytechnique.org                              *
+ *  http://opensource.polytechnique.org/                                   *
+ *                                                                         *
+ *  This program is free software; you can redistribute it and/or modify   *
+ *  it under the terms of the GNU General Public License as published by   *
+ *  the Free Software Foundation; either version 2 of the License, or      *
+ *  (at your option) any later version.                                    *
+ *                                                                         *
+ *  This program is distributed in the hope that it will be useful,        *
+ *  but WITHOUT ANY WARRANTY; without even the implied warranty of         *
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the          *
+ *  GNU General Public License for more details.                           *
+ *                                                                         *
+ *  You should have received a copy of the GNU General Public License      *
+ *  along with this program; if not, write to the Free Software            *
+ *  Foundation, Inc.,                                                      *
+ *  59 Temple Place, Suite 330, Boston, MA  02111-1307  USA                *
+ ***************************************************************************/
+
+ini_set('include_path', dirname(__FILE__).'/../../include:' . dirname(__FILE__).'/../../core/classes:/usr/share/php');
+
+require_once 'xorg.inc.php';
+require_once 'xdb.php';
+
+// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
+?>
diff --git a/upgrade/newdirectory-0.0.1/phones.php b/upgrade/newdirectory-0.0.1/phones.php
new file mode 100755 (executable)
index 0000000..63018a0
--- /dev/null
@@ -0,0 +1,201 @@
+#!/usr/bin/php5
+<?php
+require_once 'connect.db.inc.php';
+require_once 'profil.func.inc.php';
+
+$globals->debug = 0; //do not store backtraces
+
+// Convert phone prefixes from varchar to int
+$prefixes = XDB::iterRow("SELECT a2, phoneprf FROM geoloc_pays WHERE phoneprf IS NOT NULL");
+while (list($id, $pref) = $prefixes->next()) {
+    $pref = preg_replace('/[^0-9]/', '', $pref);
+    if ($pref[0] == '1') {
+        $pref = '1';
+    }
+    if ($pref[0] == '7') {
+        $pref = '7';
+    }
+    if ($pref != '' && strlen($pref) < 4) {
+        XDB::execute("UPDATE geoloc_pays SET tmp_phoneprf = {?} WHERE a2 = {?}", $pref, $id);
+    }
+}
+
+// geoloc_pays post operations
+// Drops old prfix column
+XDB::execute("ALTER TABLE geoloc_pays DROP COLUMN phoneprf");
+// Renames temporary column
+XDB::execute("ALTER TABLE geoloc_pays CHANGE COLUMN tmp_phoneprf phoneprf smallint unsigned NULL AFTER nat");
+// Adds an index on phoneprf column
+XDB::execute("ALTER TABLE geoloc_pays ADD INDEX (phoneprf)");
+// Adds French phone prefix
+XDB::execute("UPDATE geoloc_pays SET phoneprf = '33' WHERE a2 = 'FR'");
+// Adds some phone formats
+XDB::execute("UPDATE geoloc_pays SET phoneformat = '0# ## ## ## ##' WHERE phoneprf = '33'");    //France
+XDB::execute("UPDATE geoloc_pays SET phoneformat = '(+p) ### ### ####' WHERE phoneprf = '1'");  //USA and NANP countries
+
+
+
+//Phone number import
+
+$warnings = 0;
+
+// Import from auth_user_quick
+echo "\nImporting mobile phone numbers from auth_user_quick...\n";
+$phones = XDB::iterRow("SELECT user_id, profile_mobile_pub, profile_mobile FROM auth_user_quick WHERE profile_mobile <> ''");
+while (list($uid, $pub, $phone) = $phones->next()) {
+    $fmt_phone = format_phone_number($phone);
+    if ($fmt_phone != '') {
+        $display   = format_display_number($fmt_phone, $error);
+        if (!XDB::execute("INSERT INTO profile_phones (uid, link_type, link_id, tel_id, tel_type, search_tel, display_tel, pub)
+                                VALUES ({?}, 'user', 0, 0, 'mobile', {?}, {?}, {?})", $uid, $fmt_phone, $display, $pub)) {
+            echo "WARNING: insert of profile mobile phone number failed for user $uid.\n";
+            $warnings++;
+        }
+    }
+}
+
+
+// Import from entreprises
+echo "\nImporting professional phone numbers from entreprises...\n";
+$phones = XDB::iterator("SELECT uid, entrid, tel, fax, mobile, tel_pub FROM entreprises ORDER BY uid");
+while ($row = $phones->next()) {
+    $request = "INSERT INTO profile_phones (uid, link_type, link_id, tel_id, tel_type, search_tel, display_tel, pub)
+                     VALUES ({?}, 'pro', {?}, {?}, {?}, {?}, {?}, {?})";
+    $fmt_fixed   = format_phone_number($row['tel']);
+    $fmt_mobile  = format_phone_number($row['mobile']);
+    $fmt_fax     = format_phone_number($row['fax']);
+    if ($fmt_fixed != '') {
+        $disp_fixed  = format_display_number($fmt_fixed, $error);
+        if (!XDB::execute($request, $row['uid'], $row['entrid'], 0, 'fixed', $fmt_fixed, $disp_fixed, $row['tel_pub'])) {
+            echo 'WARNING: insert of professional fixed phone number failed for user ' . $row['uid'] . ' and entreprise ' . $row['entrid'] . ".\n";
+            $warnings++;
+        }
+    }
+    if ($fmt_mobile != '') {
+        $disp_mobile = format_display_number($fmt_mobile, $error);
+        if (!XDB::execute($request, $row['uid'], $row['entrid'], 1, 'mobile', $fmt_mobile, $disp_mobile, $row['tel_pub'])) {
+            echo 'WARNING: insert of professional mobile number failed for user ' . $row['uid'] . ' and entreprise ' . $row['entrid'] . ".\n";
+            $warnings++;
+        }
+    }
+    if ($fmt_fax != '') {
+        $disp_fax    = format_display_number($fmt_fax, $error);
+        if (!XDB::execute($request, $row['uid'], $row['entrid'], 2, 'fax', $fmt_fax, $disp_fax, $row['tel_pub'])) {
+            echo 'WARNING: insert of professional fax number failed for user ' . $row['uid'] . ' and entreprise ' . $row['entrid'] . ".\n";
+            $warnings++;
+        }
+    }
+}
+
+
+//import from tels
+echo "\nImporting personnal phone numbers from tels...\n";
+$phones = XDB::iterator("SELECT uid, adrid, telid, tel_type, tel_pub, tel FROM tels");
+$conversions = array();
+$autre_count = 0;
+while ($row = $phones->next()) {
+    $fmt_phone  = format_phone_number($row['tel']);
+    if ($fmt_phone != '') {
+        $display    = format_display_number($fmt_phone, $error);
+        $guess_type = guess_phone_type($row['tel_type'], $fmt_phone);
+
+        switch ($guess_type) {
+        case 'fixed':
+        case 'fax':
+        case 'mobile':
+            if (!XDB::execute("INSERT INTO profile_phones (uid, link_type, link_id, tel_id, tel_type, search_tel, display_tel, pub)
+                                    VALUES ({?}, 'address', {?}, {?}, {?}, {?}, {?}, {?})",
+                              $row['uid'], $row['adrid'], $row['telid'], $guess_type, $fmt_phone, $display, $row['tel_pub'])) {
+                echo  'WARNING: insert of address phone number failed for user ' . $row['uid'] . ', address ' . $row['adrid']
+                    . ' and telephone id ' . $row['telid'] . ".\n";
+                $warnings++;
+            } else {
+                if ($row['tel_type'] == 'Autre') {
+                    $autre_count++;
+                } else if (!isset($conversions[$row['tel_type']])) {
+                    $conversions[$row['tel_type']] = $guess_type;
+                }
+            }
+            break;
+        case 'conflict':
+            echo  'WARNING: conflict for user ' . $row['uid'] . ', address ' . $row['adrid']
+                . ' and telephone id ' . $row['telid'] . ': type = "' . $row['tel_type']
+                . '", number = "' .$fmt_phone . "\"\n";
+            $warnings++;
+            break;
+        case 'unknown':
+        default:
+            echo  'WARNING: unknown phone type (' . $row['tel_type'] . ') for user ' . $row['uid'] . ', address ' . $row['adrid']
+                . ' and telephone id ' . $row['telid'] . "\n";
+            $warnings++;
+        }
+    }
+}
+
+echo "\nSummary of automatic phone type conversion\n";
+foreach ($conversions as $old => $new) {
+    echo "* $old => $new\n";
+}
+echo "There was also $autre_count conversions from old type 'Autre' to a new one determined by the phone number.\n";
+
+
+
+//end of import
+if ($warnings) {
+    echo  "\n----------------------------------------------------------------------\n"
+        . " There is $warnings phone numbers that couldn't be imported.\n"
+        . " They need to be manually inserted.\n";
+}
+echo  "\nAfter solving any import problem and checking automatic conversions,\n"
+    . "you can drop useless columns and tables by these requests:\n"
+    . "DROP TABLE IF EXISTS `tels`;\n"
+    . "ALTER TABLE `auth_user_quick` DROP COLUMN `profile_mobile`;\n"
+    . "ALTER TABLE `auth_user_quick` DROP COLUMN `profile_mobile_pub`;\n"
+    . "ALTER TABLE `entreprises` DROP COLUMN `tel`;\n"
+    . "ALTER TABLE `entreprises` DROP COLUMN `fax`;\n"
+    . "ALTER TABLE `entreprises` DROP COLUMN `mobile`;\n"
+    . "ALTER TABLE `entreprises` DROP COLUMN `tel_pub`;\n";
+
+
+// auxilliary functions
+
+function guess_phone_type($str_type, $phone)
+{
+    $str_type = strtolower(trim($str_type));
+
+    // special case for phone type 'autre', guessing by phone number
+    if ($str_type == 'autre') {
+        if (substr($phone, 3) == '336') {
+            return 'mobile';
+        } else {
+            return 'fixed';
+        }
+    }
+
+    if ((strpos($str_type, 'mob') !== false) || (strpos($str_type, 'cell') !== false) || (strpos($str_type, 'port') !== false)) || (strpos($str_type, 'ptb') !== false) {
+        if (substr($phone, 3) == '336' || substr($phone, 2) != '33') {
+            return 'mobile';      //for France check if number is a mobile one
+        } else {
+            return 'conflict';
+        }
+    }
+    if (strpos($str_type, 'fax') !== false) {
+        if (substr($phone, 3) == '336') {
+            return 'conflict';
+        } else {
+            return 'fax';
+        }
+    }
+    if ((strpos($str_type, 'fixe') !== false) || (strpos($str_type, 'tél') !== false) || (strpos($str_type, 'tel') !== false) || (strpos($str_type, 'free') !== false)) {
+        if (substr($phone, 3) == '336') {
+            return 'conflict';
+        } else {
+            return 'fixed';
+        }
+    }
+
+    return 'unknown';
+}
+
+/* vim:set et sw=4 sts=4 ts=4: */
+?>
diff --git a/upgrade/newdirectory-0.0.1/update.sh b/upgrade/newdirectory-0.0.1/update.sh
new file mode 100755 (executable)
index 0000000..cbdc91e
--- /dev/null
@@ -0,0 +1,38 @@
+#!/bin/bash
+
+. ../inc/pervasive.sh
+
+mailman_stop
+mailman_templates
+mailman_start
+
+
+###########################################################
+for sql in *.sql
+do
+    echo -n $sql
+    $MYSQL x4dat < $sql &>/dev/null || echo -n " ERROR"
+    echo .
+done
+
+###########################################################
+
+echo "Importing phone numbers"
+
+./phones.php
+
+###########################################################
+
+echo "we will now upgrade the search table (this may be a long operation)
+
+please hit ^D to continue
+"
+
+cat
+
+pushd ../../bin
+./search.rebuild_db.php
+popd
+
+###########################################################
+