Merge commit 'origin/master' into fusionax
authorStéphane Jacob <jacou@melix.net>
Tue, 7 Oct 2008 10:36:09 +0000 (12:36 +0200)
committerStéphane Jacob <jacou@melix.net>
Tue, 7 Oct 2008 10:36:09 +0000 (12:36 +0200)
121 files changed:
ChangeLog
bin/cron/checkdb.php
bin/cron/clean.php
bin/cron/phones.check.php [new file with mode: 0755]
configs/.gitignore
configs/platal.cron.in
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/webservices/manageurs.server.inc.php
include/xorg/session.inc.php [new file with mode: 0644]
modules/email.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/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/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/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/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/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 ae3c74f..bd76ce4 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,17 @@
 ================================================================================
+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
+
+================================================================================
 VERSION 0.9.18                                                        XX XX XXXX
 
 Bug/Wish:
@@ -1261,7 +1274,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 b891fec..66b74aa 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 de aliases */
 check("SELECT a.*
@@ -91,9 +90,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");
@@ -119,6 +118,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 */
@@ -175,7 +184,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 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
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 e43ef73..f730360 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');
+                   'fusionax', 'gadgets', 'googleapps');
 
 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..64da8f1
--- /dev/null
@@ -0,0 +1,173 @@
+<?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
+                       INNER JOIN  geoloc_pays            AS g ON (e.country = g.a2)
+                         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  eduid, degreeid
+                           FROM  profile_education_degree AS d
+                     INNER JOIN  profile_education_enum   AS e ON (e.id = d.eduid)
+                     INNER 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()
+{
+    $html = "";
+    $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()
+{
+    $html = "";
+    $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 != "Licence") || ($long)) {
+        if (($degree != "Ingénieur") && ($degree != "Diplôme")) {
+            $txt .= $degree;
+        }
+        if ($name != "Université") {
+            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..1b05890
--- /dev/null
@@ -0,0 +1,107 @@
+<?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;
+
+    $uid        = S::v('uid');
+    $forlife    = S::v('forlife');
+    $email_type = "directory";
+
+    $res = XDB::query(
+            "SELECT  email_directory
+               FROM  profile_directory
+              WHERE  uid={?}", $uid);
+    $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}'",
+            $forlife . '@' . $globals->mail->domain, $forlife . '@' . $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')", $uid);
+    $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($uid);
+    $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={?}", $uid);
+    $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 d9232a3..3e57923 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);
@@ -275,8 +276,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)
@@ -310,16 +311,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)) {
@@ -339,9 +342,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]);
         }
@@ -359,7 +360,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)
@@ -374,11 +375,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)) {
@@ -402,26 +402,33 @@ 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,
                        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
+                       (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  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')
+           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)
                 WHERE  a.alias = {?}
              GROUP BY  u.user_id";
     $res  = XDB::query($reqsql, $from_uid, $login);
@@ -434,20 +441,7 @@ function &get_user_details($login, $from_uid = '', $view = 'private')
         $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'] == '')
@@ -456,6 +450,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);
 
@@ -485,20 +494,36 @@ 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
+                     INNER JOIN  profile_education_enum        AS en ON (en.id = ed.eduid)
+                     INNER JOIN  profile_education_degree_enum AS d  ON (d.id  = ed.degreeid)
+                     INNER 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);
+
+    $user['education'] = "";
+    require_once('education.func.inc.php');
+    if (list($name, $url, $degree, $grad_year, $field, $program) = $res->next()) {
+        $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
@@ -512,6 +537,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;
 }
 // }}}
@@ -528,7 +566,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 ++;
         }
     }
@@ -546,17 +584,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);
             }
         }
     }
@@ -565,36 +603,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
@@ -606,10 +649,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()
@@ -647,13 +699,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'];
@@ -663,14 +708,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();
@@ -715,9 +778,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
@@ -748,7 +808,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 c05f5ac..5d66dc1 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
 {
@@ -158,15 +158,15 @@ 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);
     }
 
@@ -179,32 +179,56 @@ class MinificheView extends MultipageView
                 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,
+                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,
                 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  emails         AS em  ON (em.uid = u.user_id AND em.flags = 'active')" .
+        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)" .
                 (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') . ")"
                  : "");
     }
 
@@ -237,17 +261,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,
-                a.alias AS forlife, m.expertise, mp.pid,
-                ms.secteur, ms.ss_secteur";
+        return "m.uid, u.promo,
+                a.alias AS bestalias, 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)";
     }
 
     public function bounds()
@@ -278,23 +308,24 @@ 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, a.alias AS forlife ";
+        return "u.user_id, nd.display AS name_display, nd.tooltip AS name_tooltip, nd.sort AS name_sort, u.promo, a.alias AS forlife ";
     }
 
     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_names_display AS nd ON (nd.user_id = u.user_id)";
     }
 
     public function bounds()
@@ -435,7 +466,6 @@ class GadgetView implements PlView
     {
         return "u.user_id AS id,
                 u.*, a.alias AS forlife," .
-                (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,
@@ -446,11 +476,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 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 43e4c19..09cfe6e 100644 (file)
@@ -241,7 +241,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)) {
@@ -288,6 +296,9 @@ class EmailModule extends PLModule
 
         require_once 'googleapps.inc.php';
         $page->assign('googleapps', GoogleAppsAccount::account_status($uid));
+
+        require_once 'emails.combobox.inc.php';
+        fill_email_combobox($page);
     }
 
     function handler_antispam(&$page, $statut_filtre = null)
diff --git a/modules/fusionax.php b/modules/fusionax.php
new file mode 100644 (file)
index 0000000..28958be
--- /dev/null
@@ -0,0 +1,413 @@
+<?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'),
+        );
+    }
+
+
+    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 i  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, u.nom, u.prenom, 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);
+    }
+}
+
+// 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..fe09ed3
--- /dev/null
@@ -0,0 +1,16 @@
+-- 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_formation` VARCHAR(60) collate utf8_general_ci NOT NULL COMMENT 'Intitulé de la formation',
+  `Date_maj` DATE NOT NULL COMMENT 'Date de mise à jour de ces informations',
+  PRIMARY KEY (`id_ancien`, `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_formation, @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/import-ax.sh b/modules/fusionax/import-ax.sh
new file mode 100755 (executable)
index 0000000..505f87b
--- /dev/null
@@ -0,0 +1,28 @@
+#! /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 < Formations.sql
+$MYSQL x4dat < Entreprises.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 e1b4d0f..be68922 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 8dace8e..5699b1a 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'),
 
         );
     }
@@ -123,6 +132,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;
@@ -313,7 +335,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');
@@ -340,15 +362,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)
@@ -386,17 +408,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');
@@ -451,6 +485,15 @@ 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');
@@ -773,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) {
@@ -812,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..59ed455 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 = {?}
+                                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 = {?}",
+                     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,56 @@ 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']
                                   = 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  u.promo, u.promo_sortie, 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)
+                        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 +324,69 @@ 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();
     }
 
     protected function _saveData()
     {
-        if ($this->changed['nationalite'] || $this->changed['nom'] || $this->changed['prenom']
-            || $this->changed['naissance']) {
+        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 = {?}, nom={?}, prenom={?}, naissance={?}
+                            SET  nationalite = {?}, nationalite2 = {?}, nationalite3 = {?}, nom={?}, prenom={?}, naissance={?}
                           WHERE  user_id = {?}",
-                         $this->values['nationalite'], $this->values['nom'], $this->values['prenom'],
+                         $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 +397,38 @@ 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'));
+        }
     }
 
     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 c9ca317..5ab4df8 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)
@@ -162,17 +165,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));
@@ -252,11 +257,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`)';
@@ -266,15 +278,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`';
@@ -307,7 +319,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`)';
@@ -321,14 +335,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;
@@ -376,6 +390,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()) {
@@ -409,6 +424,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`';
@@ -431,7 +451,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;
@@ -444,7 +466,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..8383991 100644 (file)
     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 +233,8 @@ class QuickSearch extends SField
     /** stores admin searches */
     var $email;
     var $ip;
+    /** stores phone number */
+    var $phone;
 
     // }}}
     // {{{ constructor
@@ -227,7 +253,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 +291,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 +342,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 +372,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 +536,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 0b00d3a..a201df6 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 6ac15f5..331f0b4 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}
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..f0a490b
--- /dev/null
@@ -0,0 +1,36 @@
+{**************************************************************************}
+{*                                                                        *}
+{*  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/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>
+<li>Corrélation des <a href="fusionax/deceased">dates de décès</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..cd362f6
--- /dev/null
@@ -0,0 +1,57 @@
+{**************************************************************************}
+{*                                                                        *}
+{*  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 $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 $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/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 6ff4e13..c501e94 100644 (file)
     {if !$c.dcd && $c.inscrit}</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 50ca5f4..bc3a644 100644 (file)
     {if $smarty.session.auth ge AUTH_COOKIE}
     <div class="photo">
       <img src="photo/{if $c.inscrit}{$c.forlife}{else}{make_forlife nom=$c.nom prenom=$c.prenom promo=$c.promo}{/if}"
-           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/{if $c.inscrit}{$c.forlife}{else}{make_forlife nom=$c.nom prenom=$c.prenom promo=$c.promo}{/if}" 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}
+      X {$c.promo}{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 76dce26..cc0caa4 100644 (file)
@@ -24,9 +24,9 @@
 {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"> 
+    <div class="edu"> 
       X{$p.promo} 
     </div> 
     <div class="bits" style="width: 40%;"> 
index e09cab6..9c4bd58 100644 (file)
   <tr>
     <td class="center" style="vertical-align: bottom; padding-bottom: 15px">
       <a href="{$mainsiteurl}profile/{$set[trombi.index_prev].forlife}" 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}){/if}
       </a>
     </td>
     <td class="center" style="vertical-align: bottom; padding-bottom: 15px">
       <a href="{$mainsiteurl}profile/{$set[trombi].forlife}" 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}){/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].forlife}" 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}){/if}
       </a>
     {/if}
     </td>
@@ -90,7 +90,7 @@
   <tr style="margin-top: 0; padding-top: 0">
     <td class="center" style="vertical-align: bottom">
       <a href="{$mainsiteurl}profile/{$set[trombi].forlife}" 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}){/if}
       </a>
     </td>
     <td></td><td></td>
index e49bf6f..88a8c83 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}){/if}
       </a>
     </td>
   {if $loop eq "3"}
index 85de8e3..3b078ea 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 0203991..90b92f3 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">modifier</a></span>
+      <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" {if ($promo_sortie -3 == $promo)} {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">
-    <td>
-      <span class="titre">Post-application</span>
-    </td>
+  <tr id="nationalite3" {if !$nationalite3}style="display: none"{/if}>
+    <td></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>
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 138fca4..54c6b07 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 $x.sexe}&bull;{/if}
-      {$x.prenom} {if $x.nom_usage eq ""}{$x.nom}{else}{$x.nom_usage} ({$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/{$x.forlife}.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,28 +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}
+      {if $x.iso3166_2}
+      <img src='images/flags/{$x.iso3166_2}.gif' alt='{$x.nationalite2}' height='11' title='{$x.nationalite2}' />&nbsp;
+      {/if}
+      {if $x.iso3166_3}
+      <img src='images/flags/{$x.iso3166_3}.gif' alt='{$x.nationalite3}' height='11' title='{$x.nationalite3}' />&nbsp;
       {/if}
       X {$x.promo}
       {if ($x.promo_sortie-3 > $x.promo)}
         - X {math equation="a-b" a=$x.promo_sortie b=3}
       {/if}
-      {if $x.applis_join}
-        &nbsp;-&nbsp;Formation&nbsp;: {$x.applis_join|smarty:nodefaults}
+      {if $x.education}
+        &nbsp;-&nbsp;Formation&nbsp;: {$x.education|smarty:nodefaults}
       {/if}
       {if $logged && $x.is_referent}
       [<a href="referent/{$x.forlife}" class='popup2'>Ma fiche référent</a>]
       {/if}
+      {if $x.corps}
+        <br />
+        {$x.corps|smarty:nodefaults}
+      {/if}
     </div>
   </div>
   {if $x.adr}
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/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..16982fa
--- /dev/null
@@ -0,0 +1,90 @@
+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,
+  PRIMARY KEY(id),
+  UNIQUE KEY(degree)
+) 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,
+  url VARCHAR(255) DEFAULT NULL,
+  country CHAR(2) NOT NULL DEFAULT 'FR',
+  PRIMARY KEY(id),
+  UNIQUE KEY(name)
+) CHARSET=utf8;
+
+CREATE TABLE IF NOT EXISTS profile_education (
+  id INT(2) 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,
+  grad_year INT(4) DEFAULT NULL,
+  program VARCHAR(255) DEFAULT 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/connect.db.inc.php b/upgrade/newdirectory-0.0.1/connect.db.inc.php
new file mode 100644 (file)
index 0000000..2e66895
--- /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__).'/../../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
+
+###########################################################
+