From: Stéphane Jacob Date: Fri, 13 Nov 2009 19:24:01 +0000 (+0100) Subject: Merge commit 'origin/master' into fusionax X-Git-Tag: xorg/1.0.0~332^2~312^2 X-Git-Url: http://git.polytechnique.org/?a=commitdiff_plain;h=ee71865181e96e7b0754ef9e7da4b3cb26f4c1d7;hp=be719660db2aa5d78e8cf3d83163a561eaab222d;p=platal.git Merge commit 'origin/master' into fusionax --- diff --git a/ChangeLog b/ChangeLog index 2a9ab3e..5ec8bf6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,22 @@ ================================================================================ +VERSION 0.f.0 XX XX XXXX + +New: + * Core: + - Centralises email management through an email combobox -JAC + +Bug/Wish: + * Profile: + - #16, #528, #917: Changes job interface, updates business sectors -JAC + - #188: Adds informations about the Corps d'État -JAC + - #209: Thoroughly changes education's implementation -JAC + - #373: User now chooses the name we use to talk to him/her -JAC + - #386: Adds the possibility to fill in multiple nationalities -JAC + - #443: Adds concept of ordinary firstname -JAC + - #450: Adds marital name, thus ordinary name can be any name -JAC + - #891: Improves education display -JAC + +================================================================================ VERSION 0.10.3 XX XX XXXX New: @@ -1408,7 +1426,9 @@ ACRONYMS: * CAT: Florian El Ahdab (LeChat) * FAL: Raphaël Marichez (Falco) * FRU: Florent Bruneau (Fruneau) + * GUI: Guillaume Bandet (GUI) * JAC: Stéphane Jacob (jacou) + * JM : Jean-Marc Bécu * JS : Jean Sébastien Bedo * MC : Pierre Habouzit (MadCoder) * mYk: Aymeric Augustin (mYk) diff --git a/bin/cron/checkdb.php b/bin/cron/checkdb.php index 6988415..98a22e7 100755 --- a/bin/cron/checkdb.php +++ b/bin/cron/checkdb.php @@ -73,17 +73,19 @@ 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 pid + FROM profile_addresses + WHERE pub != 'private' AND pub !='ax' AND pub != 'public'", + "Utiliseur n'ayant pas de flag de publicité pour une adresse."); +check("select uid from profile_phones where pub != 'private' and pub != 'ax' and pub != 'public'", "Utiliseur n'ayant pas de flag de publicite pour un numero de téléphone"); +check("select uid from profile_networking where pub != 'private' and pub != 'public'", "Utiliseur n'ayant pas de flag de publicité pour une adresse de networking"); /* validite des hruid */ check("SELECT user_id, nom, prenom, promo FROM auth_user_md5 WHERE hruid IS NULL OR hruid = ''", @@ -95,9 +97,9 @@ check("SELECT a.* LEFT JOIN auth_user_md5 AS u ON u.user_id=a.id WHERE (a.type='alias' OR a.type='a_vie') AND u.prenom is null"); -/* validite de applis_ins */ -check("select a.* from applis_ins as a left join auth_user_md5 as u on u.user_id=a.uid where u.prenom is null"); -check("select a.* from applis_ins as a left join applis_def as ad on ad.id=a.aid where ad.text is null"); +/* validite de profile_education */ +check("select a.* from profile_education as a left join auth_user_md5 as u on u.user_id=a.uid where u.prenom is null"); +check("select a.* from profile_education as a left join profile_education_enum as ad on ad.id=a.eduid where ad.name is null"); /* validite de binet_users */ check("select b.* from binets_ins as b left join auth_user_md5 as u on u.user_id=b.user_id where u.prenom is null"); @@ -123,10 +125,24 @@ 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 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 */ -//check("SELECT e.uid, e.country, e.region FROM entreprises AS e LEFT JOIN geoloc_region AS gr ON (e.country = gr.a2 AND e.region = gr.region) WHERE e.region != '' AND gr.name IS NULL","donne la liste des regions dans les profils pros qui n'ont pas d'entree correspondante dans geoloc_region"); +/* validite des formats téléphoniques */ +check("SELECT DISTINCT g.phonePrefix + FROM geoloc_countries AS g + WHERE EXISTS (SELECT h.phonePrefix + FROM geoloc_countries AS h + WHERE h.phonePrefix = g.phonePrefix + AND h.phoneFormat != (SELECT i.phoneFormat + FROM geoloc_countries AS i + WHERE i.phonePrefix = g.phonePrefix + 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 */ +check("SELECT a.pid, a.countryId + FROM profile_addresses AS a + LEFT JOIN geoloc_countries AS gc ON (a.countryId = gc.iso_3166_1_a2) + WHERE gc.countryFR IS NULL OR gc.countryFR = ''", + "donne la liste des pays dans les profils qui n'ont pas d'entree correspondante dans geoloc_countries"); /* donne la liste des emails douteux que les administrateurs n'ont pas encore traité */ check("SELECT a1.alias, a2.alias, e1.email, e2.flags @@ -180,6 +196,12 @@ check("SELECT matricule,nom,prenom,matricule_ax,COUNT(matricule_ax) AS c 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 !"); +/* no alumni is allowed to have empty names */ +check("SELECT s.uid, d.public_name + FROM profile_name AS s + INNER JOIN profile_display AS d ON (d.pid = s.uid) + WHERE 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 diff --git a/bin/cron/clean.php b/bin/cron/clean.php index ce90f01..6325f63 100755 --- a/bin/cron/clean.php +++ b/bin/cron/clean.php @@ -37,10 +37,12 @@ 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"); +query("ALTER TABLE profile_job_sector_enum ORDER BY name"); +query("ALTER TABLE profile_job_subsector_enum ORDER BY name"); +query("ALTER TABLE profile_job_subsubsector_enum ORDER BY name"); query("ALTER TABLE sections ORDER BY text"); // Prunes older autocomplete queries. diff --git a/bin/cron/phones.check.php b/bin/cron/phones.check.php new file mode 100755 index 0000000..62fa4e5 --- /dev/null +++ b/bin/cron/phones.check.php @@ -0,0 +1,103 @@ +#!/usr/bin/php5 +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 phonePrefix + FROM geoloc_countries + WHERE phonePrefix IS NOT NULL"); +$prefixes = $res->fetchColumn(); +foreach ($prefixes as $i => $prefix) { + $res = XDB::query("SELECT phoneFormat + FROM geoloc_countries + WHERE phonePrefix = {?} AND 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: +?> diff --git a/bin/search.rebuild_db.php b/bin/search.rebuild_db.php index 81fa957..1b9917f 100755 --- a/bin/search.rebuild_db.php +++ b/bin/search.rebuild_db.php @@ -26,17 +26,13 @@ require('user.func.inc.php'); ini_set('memory_limit', "16M"); $globals->debug = 0; // Do not store backtraces -XDB::execute('DELETE FROM search_name'); -$res = XDB::iterRow('SELECT auth_user_md5.user_id, nom, prenom, nom_usage, profile_nick - FROM auth_user_md5 - LEFT JOIN auth_user_quick USING(user_id)'); +$res = XDB::iterRow("SELECT user_id + FROM auth_user_md5"); $i = 0; -$muls = array(1, 1, 1, 0.2); -$pub = array(true, true, true, false); -while ($tmp = $res->next()) { - $uid = array_shift($tmp); - _user_reindex($uid, $tmp, $muls, $pub); - printf("\r%u / %u", ++$i, $res->total()); +$n = $res->total(); +while ($uid = $res->next()->fetchOneCell()) { + user_reindex($uid); + printf("\r%u / %u", ++$i, $n); } print "done\n"; diff --git a/classes/user.php b/classes/user.php index e5d8cdf..c6ea598 100644 --- a/classes/user.php +++ b/classes/user.php @@ -129,7 +129,7 @@ class User extends PlUser } global $globals; - $res = XDB::query("SELECT u.hruid, u.promo, + $res = XDB::query("SELECT u.hruid, d.promo, CONCAT(af.alias, '@{$globals->mail->domain}') AS forlife, CONCAT(ab.alias, '@{$globals->mail->domain}') AS bestalias, CONCAT(u.prenom, ' ', IF(u.nom_usage <> '', u.nom_usage, u.nom)) AS full_name, @@ -138,6 +138,7 @@ class User extends PlUser q.core_mail_fmt AS email_format, u.perms FROM auth_user_md5 AS u + INNER JOIN profile_display AS d ON (d.pid = u.user_id) LEFT JOIN auth_user_quick AS q ON (q.user_id = u.user_id) LEFT JOIN aliases AS af ON (af.id = u.user_id AND af.type = 'a_vie') LEFT JOIN aliases AS ab ON (ab.id = u.user_id AND FIND_IN_SET('bestalias', ab.flags)) diff --git a/classes/xnetpage.php b/classes/xnetpage.php index 29e8ea3..1cff3c8 100644 --- a/classes/xnetpage.php +++ b/classes/xnetpage.php @@ -90,7 +90,6 @@ class XnetPage extends PlPage if ($perms->hasFlag('groupannu')) { $sub['annuaire du groupe'] = "$dim/annuaire"; $sub['trombinoscope'] = "$dim/trombi"; - $sub['planisphère'] = "$dim/geoloc"; } if ($perms->hasFlag('groupmember')) { if ($globals->asso('forum')) { diff --git a/configs/.gitignore b/configs/.gitignore index 08b9b45..8767aa4 100644 --- a/configs/.gitignore +++ b/configs/.gitignore @@ -1,3 +1,4 @@ platal.conf platal.cron +ax_xorg_rsa.pem *.pem diff --git a/configs/platal.cron.in b/configs/platal.cron.in index 6923650..0e0d885 100644 --- a/configs/platal.cron.in +++ b/configs/platal.cron.in @@ -8,6 +8,7 @@ WD=/home/web/prod/platal/bin/cron 0 21 * * 0 web cd $WD; ./checkdb.php -v | mail -e -s "Verifications verbeuses sur la BDD de plat/al @VERSION@" br@staff.m4x.org 0 20 2-31 * * web cd $WD; ./emails.check.php | mail -e -s "Qualite de l'annuaire" br@staff.m4x.org 0 20 1 * * web cd $WD; ./emails.check.php -v | mail -e -s "Qualite de l'annuaire : verbeux" br@staff.m4x.org +0 22 * * * web cd $WD; ./phones.check.php > /dev/null # inscription report 0 6 * * 1 web cd $WD; ./rapports_inscription.php diff --git a/configs/platal.ini b/configs/platal.ini index e2d678e..1c89daf 100644 --- a/configs/platal.ini +++ b/configs/platal.ini @@ -24,8 +24,10 @@ mbox_helper = "/usr/bin/banana-mbox-helper" event_forum = "" event_reply = "" -[Geoloc] -webservice_url = "" +[Geocoder] +email = "" +gmaps_key = "" +gmaps_url = "http://maps.google.com/maps/geo" [Lists] rpchost = "localhost" diff --git a/htdocs/css/default.css b/htdocs/css/default.css index ca33953..abe4e46 100644 --- a/htdocs/css/default.css +++ b/htdocs/css/default.css @@ -107,6 +107,10 @@ p { background: inherit; } +.hinted { + border-bottom: 1px dashed black; +} + input.error, textarea.error { background-color: #faa; } @@ -224,6 +228,18 @@ td.action { } td.action a { padding: 0px 2px 0px 2px; } +div.titre { + color: #000000; + background: inherit; + font-weight: bold; +} + +span.titre { + color: #000000; + background: inherit; + font-weight: bold; +} + /******************************************************************************* 4 Tableau de choix de skins [ Styles pour les tableaux de types de ceux des skins ] diff --git a/htdocs/css/keynote.css b/htdocs/css/keynote.css index 3965dee..743a8a1 100644 --- a/htdocs/css/keynote.css +++ b/htdocs/css/keynote.css @@ -247,6 +247,18 @@ th.grayed { font-style: italic; } +div.titre { + color: #000000; + background: inherit; + font-weight: bold; +} + +span.titre { + color: #000000; + background: inherit; + font-weight: bold; +} + /******************************************************************************* 4 Tableau de choix de skins [ Styles pour les tableaux de types de ceux des skins ] @@ -322,7 +334,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/css/openweb.css b/htdocs/css/openweb.css index 0485009..c7afde1 100644 --- a/htdocs/css/openweb.css +++ b/htdocs/css/openweb.css @@ -215,6 +215,18 @@ td.action { } td.action a { padding: 0px 2px; } +div.titre { + color: #000000; + background: inherit; + font-weight: bold; +} + +span.titre { + color: #000000; + background: inherit; + font-weight: bold; +} + /******************************************************************************* 4 Tableau de choix de skins [ Styles pour les tableaux de types de ceux des skins ] diff --git a/htdocs/images/flags/EU.gif b/htdocs/images/flags/EU.gif new file mode 100644 index 0000000..28a762a Binary files /dev/null and b/htdocs/images/flags/EU.gif differ diff --git a/htdocs/images/flags/ME.gif b/htdocs/images/flags/ME.gif new file mode 100644 index 0000000..a260453 Binary files /dev/null and b/htdocs/images/flags/ME.gif differ diff --git a/htdocs/images/flags/RS.gif b/htdocs/images/flags/RS.gif new file mode 100644 index 0000000..3bd1fb2 Binary files /dev/null and b/htdocs/images/flags/RS.gif differ diff --git a/htdocs/images/networking/aim.png b/htdocs/images/networking/aim.png new file mode 100644 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 index 0000000..2b8a088 Binary files /dev/null and b/htdocs/images/networking/skype.png differ diff --git a/htdocs/images/networking/twitter.png b/htdocs/images/networking/twitter.png new file mode 100644 index 0000000..773d86f Binary files /dev/null and b/htdocs/images/networking/twitter.png differ diff --git a/htdocs/images/networking/viadeo.png b/htdocs/images/networking/viadeo.png new file mode 100644 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 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 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 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 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 index 0000000..fcc40a8 Binary files /dev/null and b/htdocs/images/networking/zephyr.png differ diff --git a/htdocs/javascript/profile.js b/htdocs/javascript/profile.js index 067845a..a85063b 100644 --- a/htdocs/javascript/profile.js +++ b/htdocs/javascript/profile.js @@ -18,254 +18,387 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * ***************************************************************************/ -// Page initialization +// Page initialization {{{1 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 = 1; + while ($('.edu_' + i).length != 0) { + prepareType(i - 1); + ++i; + } + break; + case 'adresses': + checkCurrentAddress(); break; case 'poly': - updateGroupSubLink(document.forms.prof_annu.groupesx_sub); + updateGroupSubLink(); break; case 'deco': for (var i in names) { - if (typeof names[i] != 'function') { - if (document.getElementById("medal_" + i) != null) { - getMedalName(i); - buildGrade(i, document.forms.prof_annu["medal_" + i + "_grade"].value); - } + if ($('#medal_' + i).length != 0) { + getMedalName(i); + buildGrade(i, $('#medal_' + i).find('[name*=medal_' + i + '_grade]').val()); } } break; case 'emploi': - for (var i = 0 ; document.getElementById('job_' + i) != null ; ++i) { - updateJobSecteur(i, 'job_' + i, 'jobs[' + i + ']', - document.forms.prof_annu["jobs[" + i + "][ss_secteur]"].value); + for (var i = 0 ; $('#job_' + i).length != 0; ++i) { + updateJobSector(i, $('#job_' + i).find("[name='jobs[" + i + "][subSector]']").val()); + updateJobSubSector(i, $('#job_' + i).find("[name='jobs[" + i + "][subSubSector]']").val()); + updateJobAlternates(i); } - setTimeout('registerEnterpriseAutocomplete(-1)', 100); break; } } -var applisType; -var applisTypeAll; - -// General - +var educationDegree; +var educationDegreeAll; +var educationDegreeName; var subgrades; var names; -function fillType(selectCtrl, appli, fill) + +// Names {{{1 + +function toggleNamesAdvanced() { - var i; - var i0=0; + $('.names_advanced').toggle(); +} - for (i = selectCtrl.options.length; i >=0; i--) { - selectCtrl.options[i] = null; +function addSearchName() +{ + var i = 0; + while ($('#search_name_' + i).length != 0) { + i++; } + Ajax.update_html('search_name_' + i, 'profile/ajax/searchname/' + i, function(data){ + $('#searchname').before(data); + changeNameFlag(i); + }); +} + +function removeSearchName(i) +{ + $('#search_name_' + i).remove(); + updateNameDisplay(); +} - if (fill || appli <0) { - selectCtrl.options[0] = new Option(' '); - i0=1; +function changeNameFlag(i) +{ + $('#flag_' + i).remove(); + var typeid = $('#search_name_' + i).find('select').val(); + var type = $('#search_name_' + i).find('select :selected').text(); + if ($('[name=sn_type_' + typeid + '_' + i + ']').val() > 0) { + $('#flag_cb_' + i).after(' ' + + 'site public' + + '' + + '' + + ''); + } else { + $('#flag_cb_' + i).after(' ' + + 'site privé' + + '' + + ''); } - 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 updateNameDisplay() +{ + var searchnames = ''; + for (var i = 0; i < 10; i++) { + if ($('#search_name_' + i).find(':text').val()) { + searchnames += $('#search_name_' + i).find('[name*=typeid]').val() + ';'; + searchnames += $('#search_name_' + i).find(':text').val() + ';;'; + } + } + Ajax.update_html(null, 'profile/ajax/buildnames/' + searchnames, function(data){ + var name = data.split(';'); + $('#public_name').html(name[0]); + $('#private_name').html(name[0] + name[1]); + }); +} -function selectType(selectCtrl, type) +function toggleParticle(id) { - for (i = 0; i < selectCtrl.options.length; i++) { - if (selectCtrl.options[i].text == type) - selectCtrl.selectedIndex=i; + if ($('#search_name_' + id).find("[name*='[particle]']").val() == '') { + $('#search_name_' + id).find("[name*='[particle]']").val(1); + } else { + $('#search_name_' + id).find("[name*='[particle]']").val(''); } } +// Nationalities {{{1 +function delNationality(i) +{ + $('#nationalite' + i).hide().find('select').val(''); +} -// Addresses +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 removeObject(id, pref) +// Education {{{1 + +function prepareType(id) { - document.getElementById(id).style.display = "none"; - document.forms.prof_annu[pref + "[removed]"].value = "1"; + var edu = $('.edu_' + id).find("[name='edus[" + id + "][eduid]']").val() - 1; + var sel = $('.edu_' + id).find('[name=edu_' + id + '_tmp]').val(); + var html = ''; + var length = educationDegree[edu].length; + for (i = 0; i < length; ++i) { + html += ''; - $res = XDB::iterator("select * from applis_def order by text"); - while ($arr_appli = $res->next()) { - $html .= ''; + $res = XDB::iterator("SELECT e.id AS id, gc.countryFR AS country, + IF(CHAR_LENGTH(e.name) > 76, e.abbreviation, e.name) AS name + FROM profile_education_enum AS e + LEFT JOIN geoloc_countries AS gc ON (e.country = gc.iso_3166_1_a2) + WHERE EXISTS (SELECT * + FROM profile_education_degree AS d + WHERE e.id = d.eduid) + ORDER BY gc.countryFR, e.name"); + $country = ""; + while ($arr_edu = $res->next()) { + if ($arr_edu["country"] != $country) { + $country = $arr_edu["country"]; + $html .= ""; + } + $html .= '\n", - $my_id, ($current==$my_id?"selected='selected'":""), $my_pays); - } - return $html; -} - -/** donne la liste deroulante des regions pour un pays - * @param $pays le pays dont on veut afficher les regions - * @param $current la region actuellement selectionnee - */ -function geoloc_region($country, $current, $avail_only = false) -{ - if ($avail_only) { - $res = XDB::iterRow('SELECT r.region, r.name - FROM geoloc_region AS r - INNER JOIN adresses AS a ON (a.country = r.a2 AND a.region = r.region) - WHERE r.a2 = {?} - GROUP BY r.region - ORDER BY r.name', $country); - } else { - $res = XDB::iterRow('SELECT region,name - FROM geoloc_region - WHERE a2 = {?} - ORDER BY name', $country); - } - $html = ""; - while (list($regid, $regname) = $res->next()) { - $html .= sprintf("\n", - $regid, ($current==$regid?"selected='selected'":""), $regname); - } - return $html; -} -// }}} - -// {{{ get_address_infos($txt) -/** retrieve the infos on a text address - * store on the fly the info of the city concerned - * @param $txt the raw text of an address - */ -function get_address_infos($txt) -{ - global $globals; - - $url = $globals->geoloc->webservice_url."address.php?precise=1&txt=" . urlencode($txt); - if ($globals->debug & DEBUG_BT) { - if (!isset(PlBacktrace::$bt['Geoloc'])) { - new PlBacktrace('Geoloc'); - } - PlBacktrace::$bt['Geoloc']->start($url); - } - $f = @fopen($url, 'r'); - if ($f === false) { - if ($globals->debug & DEBUG_BT) { - PlBacktrace::$bt['Geoloc']->stop(0, 'Can\'t fetch result'); - } - return false; - } - $keys = explode('|',fgets($f)); - $vals = explode('|',fgets($f)); - if ($globals->debug & DEBUG_BT) { - $data = array(); - for ($i = 0 ; $i < count($keys) ; ++$i) { - $data[] = array($keys[$i], $vals[$i]); - } - PlBacktrace::$bt['Geoloc']->stop(count($keys), null, $data); - } - $infos = empty_address(); - foreach ($keys as $i=>$key) { - if($vals[$i]) { - if ($key == 'sql') { - $infos[$key] = $vals[$i]; - } else { - $val = strtr($vals[$i], array(chr(197).chr(147) => "œ")); - $infos[$key] = $val; - } - } - } - if (empty($infos['country'])) { - $infos['country'] = '00'; - } - if (isset($infos['sql']) && $infos['sql']) { - $sql = explode(', ', trim($infos['sql'], '()')); - if (count($sql) == 16) { - for ($i = 0 ; $i < 16 ; ++$i) { - $sql[$i] = stripslashes(trim($sql[$i], ' \'')); - } - XDB::execute("REPLACE INTO geoloc_city - VALUES ({?}, {?}, {?}, {?}, {?}, {?}, - {?}, {?}, {?}, {?}, {?}, {?}, - {?}, {?}, {?}, {?})", - $sql[0], $sql[1], $sql[2], $sql[3], $sql[4], $sql[5], - $sql[6], $sql[7], $sql[8], $sql[9], $sql[10], $sql[11], - $sql[12], $sql[13], $sql[14], $sql[15]); - } - } - if (isset($infos['display']) && $infos['display']) - XDB::execute("UPDATE geoloc_pays - SET display = {?} - WHERE a2 = {?}", $infos['display'], $infos['country']); - if (isset($infos['cityid'])) { - fix_cities_not_on_map(1, $infos['cityid']); - if (floatval($infos['precise_lat']) && floatval($infos['precise_lon'])) { - $res = XDB::query("SELECT c.lat / 100000, c.lon / 100000 - FROM geoloc_city AS c - WHERE c.id = {?}", $infos['cityid']); - if ($res->numRows()) { - list($glat, $glng) = $res->fetchOneRow(); - $infos['precise_lat'] = $glat; - $infos['precise_lon'] = $glng; - } - } - } - return $infos; -} -// }}} - -// {{{ get_cities_maps($array) -/* get all the maps id of the cities contained in an array */ -function get_cities_maps($array) -{ - global $globals; - implode("\n",$array); - $url = $globals->geoloc->webservice_url."findMaps.php?datatext=".urlencode(implode("\n", $array)); - if (!($f = @fopen($url, 'r'))) return false; - $maps = array(); - while (!feof($f)) - { - $l = trim(fgets($f)); - $tab = explode(';', $l); - $i = $tab[0]; - unset($tab[0]); - $maps[$i] = $tab; - } - return $maps; -} -// }}} - -// {{{ get_new_maps($url) -/** set new maps from url **/ -function get_new_maps($url) -{ - if (!($f = @fopen($url, 'r'))) { - return false; - } - XDB::query('TRUNCATE TABLE geoloc_maps'); - $s = ''; - while (!feof($f)) { - $l = fgetcsv($f, 1024, ';', '"'); - foreach ($l as $i => $val) { - if ($val != 'NULL') { - $l[$i] = '\''.addslashes($val).'\''; - } - } - $s .= ',('.implode(',',$l).')'; - } - XDB::execute('INSERT INTO geoloc_maps VALUES '.substr($s, 1)); - return true; -} -// }}} - -// {{{ get_address_text($adr) -/** make the text of an address that can be read by a mailman - * @param $adr an array with all the usual fields - */ -function get_address_text($adr) -{ - $t = ""; - if (isset($adr['adr1']) && $adr['adr1']) $t.= $adr['adr1']; - if (isset($adr['adr2']) && $adr['adr2']) $t.= "\n".$adr['adr2']; - if (isset($adr['adr3']) && $adr['adr3']) $t.= "\n".$adr['adr3']; - $l = ""; - if (isset($adr['display']) && $adr['display']) { - $keys = explode(' ', $adr['display']); - foreach ($keys as $key) { - if (isset($adr[$key])) { - $l .= " ".$adr[$key]; - } else { - $l .= " ".$key; - } - } - if ($l) substr($l, 1); - } elseif ($adr['country'] == 'US' || $adr['country'] == 'CA' || $adr['country'] == 'GB') { - if ($adr['city']) $l .= $adr['city'].",\n"; - if ($adr['region']) $l .= $adr['region']." "; - if ($adr['postcode']) $l .= $adr['postcode']; - } else { - if (isset($adr['postcode']) && $adr['postcode']) $l .= $adr['postcode']." "; - if (isset($adr['city']) && $adr['city']) $l .= $adr['city']; - } - if ($l) $t .= "\n".trim($l); - if ($adr['country'] != '00' && (!$adr['countrytxt'] || $adr['countrytxt'] == mb_strtoupper($adr['countrytxt']))) { - $res = XDB::query("SELECT pays FROM geoloc_pays WHERE a2 = {?}", $adr['country']); - $adr['countrytxt'] = $res->fetchOneCell(); - } - if (isset($adr['countrytxt']) && $adr['countrytxt']) { - $t .= "\n".$adr['countrytxt']; - } - return trim($t); -} -// }}} - -// {{{ compare_addresses_text($a, $b) -/** compares if two address matches - * @param $a the raw text of an address - * @param $b the raw text of a complete valid address - */ -function compare_addresses_text($a, $b) -{ - $ta = mb_strtoupper(preg_replace(array("/[0-9,\"'#~:;_\- ]/", "/\r\n/"), array("", "\n"), $a)); - $tb = mb_strtoupper(preg_replace(array("/[0-9,\"'#~:;_\- ]/", "/\r\n/"), array("", "\n"), $b)); - - $la = explode("\n", $ta); - $lb = explode("\n", $tb); - - if (count($lb) > count($la) + 1) { - return false; - } - foreach ($la as $i=>$l) { - if (levenshtein(trim($l), trim($lb[$i])) > 3) { - return false; - } - } - return true; -} - -// }}} - -function empty_address() { - return Array( - "adr1" => "", - "adr2" => "", - "adr3" => "", - "cityid" => NULL, - "city" => "", - "postcode" => "", - "region" => "", - "regiontxt" => "", - "country" => "00", - "countrytxt" => "", - "precise_lat" => "", - "precise_lon" => ""); -} - -// create a simple address from a text without geoloc -function cut_address($txt) -{ - $txt = str_replace("\r\n", "\n", $txt); - ereg("^([^\n]*)(\n([^\n]*)(\n(.*))?)?$", trim($txt), $a); - return array("adr1" => trim($a[1]), "adr2" => trim($a[3]), "adr3" => trim(str_replace("\n", " ", $a[5]))); -} - -// {{{ localize_addresses($uid) -/* localize all the address of a user and modify the database - * if the new address match with the old one - * @param $uid the id of the user - */ -function localize_addresses($uid) -{ - $res = XDB::iterator("SELECT * - FROM adresses - WHERE uid = {?} and (cityid IS NULL OR cityid = 0)", $uid); - $erreur = Array(); - - while ($a = $res->next()) { - $new = get_address_infos($ta = get_address_text($a)); - if (compare_addresses_text($ta, get_address_text($new))) { - XDB::execute("UPDATE adresses - SET adr1 = {?}, adr2 = {?}, adr3 = {?}, - cityid = {?}, city = {?}, postcode = {?}, - region = {?}, regiontxt = {?}, country = {?}, - glat = {?}, glng = {?} - WHERE uid = {?} AND adrid = {?}", - $new['adr1'], $new['adr2'], $new['adr3'], - $new['cityid'], $new['city'], $new['postcode'], - $new['region'], $new['regiontxt'], $new['country'], - $new['precise_lat'], $new['precise_lon'], - $uid, $a['adrid']); - $new['store'] = true; - if (!$new['cityid']) { - $erreur[$a['adrid']] = $new; - } - } else { - $new['store'] = false; - $erreur[$a['adrid']] = $new; - } - } - return $erreur; -} -// }}} - -// {{{ synchro_city($id) -/** synchronise the local geoloc_city base to geoloc.org - * @param $id the id of the city to synchronize - */ -function synchro_city($id) -{ - global $globals; - $url = $globals->geoloc->webservice_url."cityFinder.php?method=id&id=".$id."&out=sql"; - if (!($f = @fopen($url, 'r'))) { - return false; - } - $s = fgets($f); - if ($s) { - return XDB::execute("REPLACE INTO geoloc_city VALUES ".$s) > 0; - } -} - // }}} - -// {{{ function fix_cities_not_on_map($limit) -function fix_cities_not_on_map($limit=false, $cityid=false) -{ - $missing = XDB::query("SELECT c.id - FROM geoloc_city AS c - LEFT JOIN geoloc_city_in_maps AS m ON(c.id = m.city_id) - WHERE m.city_id IS NULL" - . ($cityid ? " AND c.id = '" . $cityid . "'" : "" ) - . ($limit ? " LIMIT $limit" : "" )); - $maps = get_cities_maps($missing->fetchColumn()); - if ($maps) { - $values = ""; - foreach ($maps as $cityid => $maps_c) { - foreach ($maps_c as $map_id) { - $values .= ",($cityid, $map_id, '')"; - } - } - if (strlen($values) > 1) { - XDB::execute("REPLACE INTO geoloc_city_in_maps - VALUES ".substr($values, 1)); - } - } else { - return false; - } - return true; -} - -function set_smallest_levels() -{ - $maxlengths = XDB::iterRow("SELECT MAX(LENGTH(gm.path)), gcim.city_id - FROM geoloc_city_in_maps AS gcim - INNER JOIN geoloc_maps AS gm USING ( map_id ) - GROUP BY gcim.city_id"); - while (list($length, $id) = $maxlengths->next()) { - XDB::execute("UPDATE geoloc_city_in_maps AS gcim - INNER JOIN geoloc_maps AS gm USING(map_id) - SET gcim.infos = IF(LENGTH(gm.path) = {?}, 'smallest', '') - WHERE gcim.city_id = {?}", $length, $id); - } - return true; -} -// }}} - - -function geoloc_to_x($lon, $lat) -{ - return deg2rad(1) * $lon *100; -} - -function geoloc_to_y($lon, $lat) -{ - if ($lat < -75) { - return latToY(-75); - } - if ($lat > 75) { - return latToY(75); - } - return -100 * log(tan(pi()/4 + deg2rad(1)/2*$lat)); -} - -function size_of_city($nb) -{ - $s = round(log($nb + 1)*2,2); - if ($s < 1) { - return 1; - } - return $s; -} - -function size_of_territory($nb) -{ - return size_of_city($nb); -} - -function geoloc_getData_subcities($mapid, $SFields, &$cities, $direct=true) -{ - if ($SFields instanceof UserSet) { - $set = $SFields; - $SFields = array(); - } else { - $set = new UserSet(); - } - for ($i_mapfield=0; $i_mapfield < count($SFields) ; $i_mapfield++) { - if ($SFields[$i_mapfield]->fieldFormName == 'mapid') { - break; - } - } - $SFields[$i_mapfield] = new MapSField('mapid', - array('gcim.map_id'), - array('adresses','geoloc_city_in_maps'), - array('am','gcim'), - array(getadr_join('am'), 'am.cityid = gcim.city_id'), - $mapid); - $fields = new SFieldGroup(true, $SFields); - $where = $fields->get_where_statement(); - $joins = $fields->get_select_statement(); - if ($where) { - $where .= ' AND '; - } - $cityres = $set->get('gc.id, - gc.lon / 100000 AS x, gc.lat/100000 AS y, - gc.name, - COUNT(u.user_id) AS pop, - SUM(u.promo % 2) AS yellow', - "$joins - LEFT JOIN geoloc_city AS gc ON(gcim.city_id = gc.id)", - $where . ($direct ? "gcim.infos = 'smallest'" : '1'), - 'gc.id, gc.alias', - 'pop DESC'); - foreach($cityres as $c) { - if ($c['pop'] > 0) { - $city = $c; - $city['x'] = geoloc_to_x($c['x'], $c['y']); - $city['y'] = geoloc_to_y($c['x'], $c['y']); - $city['size'] = size_of_city($c['pop']); - $cities[$c['id']] = $city; - } - } -} - -function geoloc_getData_subcountries($mapid, $sin, $minentities) -{ - $countries = array(); - $cities = array(); - - if ($mapid === false) { - $wheremapid = "WHERE gm.parent IS NULL"; - } else { - $wheremapid = "WHERE gm.parent = {?}"; - } - $submapres = XDB::iterator( - "SELECT gm.map_id AS id, gm.name, gm.x, gm.y, gm.xclip, gm.yclip, - gm.width, gm.height, gm.scale, 1 AS rat - FROM geoloc_maps AS gm - ". $wheremapid, Env::v('mapid','')); - - global $globals; - - while ($c = $submapres->next()) { - $country = $c; - $country['color'] = 0xFFFFFF; - $country['swf'] = $globals->geoloc->webservice_url."maps/mercator/map_".$c['id'].".swf"; - $countries[$c['id']] = $country; - } - - if ($mapid === false) { - return array($countries, $cities); - } - - geoloc_getData_subcities(Env::i('mapid'), $sin, $cities); - $nbcities = count($cities); - $nocity = $nbcities == 0; - if ($sin instanceof UserSet) { - $set = $sin; - $SFields = array(); - } else { - $set = new UserSet(); - $SFields = $sin; - } - - for ($i_mapfield=0; $i_mapfield < count($SFields) ; $i_mapfield++) { - if ($SFields[$i_mapfield]->fieldFormName == 'mapid') { - break; - } - } - $SFields[$i_mapfield] = new MapSField('mapid', - array('map.parent'), - array('adresses','geoloc_city_in_maps','geoloc_maps'), - array('am','gcim','map'), - array(getadr_join('am'), - 'am.cityid = gcim.city_id', - 'map.map_id = gcim.map_id')); - $fields = new SFieldGroup(true, $SFields); - $where = $fields->get_where_statement(); - $joins = $fields->get_select_statement(); - $countryres = $set->get('map.map_id AS id, - COUNT(u.user_id) AS nbPop, - SUM(u.promo % 2) AS yellow, - COUNT(DISTINCT gcim.city_id) AS nbCities, - SUM(IF(u.user_id IS NULL,0,am.glng)) AS lonPop, - SUM(IF(u.user_id IS NULL, 0,am.glat)) AS latPop', - $joins, - $where, - 'map.map_id', - 'NULL'); - - $maxpop = 0; - $nbentities = $nbcities + count($countryres); - foreach ($countryres as $c) { - $c['latPop'] /= $c['nbPop']; - $c['lonPop'] /= $c['nbPop']; - $c['rad'] = size_of_territory($c['nbPop']); - if ($maxpop < $c['nbPop']) $maxpop = $c['nbPop']; - $c['xPop'] = geoloc_to_x($c['lonPop'], $c['latPop']); - $c['yPop'] = geoloc_to_y($c['lonPop'], $c['latPop']); - @$countries[$c['id']] = array_merge($countries[$c['id']], $c); - - $nbcities += $c['nbCities']; - } - - if ($nocity && $nbcities < $minentities){ - foreach($countries as $i => $c) { - $countries[$i]['nbPop'] = 0; - if (@$c['nbCities'] > 0) { - geoloc_getData_subcities($c['id'], $sin, $cities, false); - } - } - } - - foreach ($countries as $i => $c) { - if (@$c['nbPop'] > 0) { - $lambda = pow($c['nbPop'] / $maxpop,0.3); - $countries[$i]['color'] = 0x0000FF + round((1-$lambda) * 0xFF)*0x010100; - } - } - - return array($countries, $cities); -} -// }}} - -// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8: -?> diff --git a/include/name.func.inc.php b/include/name.func.inc.php new file mode 100644 index 0000000..aef47cd --- /dev/null +++ b/include/name.func.inc.php @@ -0,0 +1,291 @@ + $searchname[1]); + } + } + + $sn_types_public = build_types('public'); + $sn_types_private = build_types('private'); + $full_name = build_full_name($search_names, $sn_types_public); + return build_public_name($search_names, $sn_types_public, $full_name) . ';' . + build_private_name($search_names, $sn_types_private); +} + +function build_display_names(&$display_names, $search_names, $private_name_end = null, &$alias = null) +{ + $sn_types_public = build_types('public'); + $full_name = build_full_name($search_names, $sn_types_public); + $display_names['public_name'] = build_public_name($search_names, $sn_types_public, $full_name); + $display_names['private_name'] = $display_names['public_name'] . $private_name_end; + $display_names['directory_name'] = build_directory_name($search_names, $sn_types_public, $full_name); + $display_names['short_name'] = build_short_name($search_names, $sn_types_public, $alias); + $display_names['sort_name'] = build_sort_name($search_names, $sn_types_public); +} + +function build_types($pub = null) +{ + if ($pub == 'public') { + $sql_pub = "AND FIND_IN_SET('public', flags)"; + } elseif ($pub == 'private') { + $sql_pub = "AND NOT FIND_IN_SET('public', flags)"; + } else { + $sql_pub = ""; + } + $sql = "SELECT id, type, name + FROM profile_name_enum + WHERE NOT FIND_IN_SET('not_displayed', flags)" . $sql_pub; + $sn_types = XDB::iterator($sql); + $types = array(); + while ($sn_type = $sn_types->next()) { + if ($pub) { + $types[$sn_type['type']] = $sn_type['id']; + } else { + $types[$sn_type['id']] = $sn_type['name']; + } + } + return $types; +} + +function build_full_name(&$search_names, &$sn_types) +{ + $name = ""; + if (isset($search_names[$sn_types['lastname_ordinary']])) { + $name .= $search_names[$sn_types['lastname_ordinary']]['fullname'] . " (" + . $search_names[$sn_types['lastname']]['fullname'] . ")"; + } else { + $name .= $search_names[$sn_types['lastname']]['fullname']; + } + if (isset($search_names[$sn_types['lastname_marital']]) + || isset($search_names[$sn_types['pseudonym']])) { + $name .= " ("; + if (isset($search_names[$sn_types['lastname_marital']])) { + $user = S::user(); + if ($user->isFemale()) { + $name .= "Mme "; + } else { + $name .= "M "; + } + $name .= $search_names[$sn_types['lastname_marital']]['fullname']; + if (isset($search_names[$sn_types['pseudonym']])) { + $name .= ", "; + } + } + if (isset($search_names[$sn_types['pseudonym']])) { + $name .= $search_names[$sn_types['pseudonym']]['fullname']; + } + $name .= ")"; + } + return $name; +} + +function build_public_name(&$search_names, &$sn_types, $full_name) +{ + return $search_names[$sn_types['firstname']]['fullname'] . " " . $full_name; +} + +function build_private_name(&$search_names, &$sn_types) +{ + $name = ""; + if (isset($search_names[$sn_types['nickname']]) + || (isset($search_names[$sn_types['name_other']]) + || isset($search_names[$sn_types['name_other']]))) { + $name .= " ("; + if (isset($search_names[$sn_types['nickname']])) { + $name .= "alias " . $search_names[$sn_types['nickname']]['fullname']; + $i = 0; + while (isset($search_names[$sn_types['nickname']][$i])) { + $name .= ", " . $search_names[$sn_types['nickname']][$i]; + $i++; + } + if (isset($search_names[$sn_types['name_other']]) + || isset($search_names[$sn_types['name_other']])) { + $name .= ", "; + } + } + if (isset($search_names[$sn_types['firstname_other']])) { + $name .= "autres prénoms : " . $search_names[$sn_types['firstname_other']]['fullname']; + $i = 0; + while (isset($search_names[$sn_types['firstname_other']][$i])) { + $name .= ", " . $search_names[$sn_types['firstname_other']][$i]; + $i++; + } + if (isset($search_names[$sn_types['name_other']])) { + $name .= ", "; + } + } + if (isset($search_names[$sn_types['name_other']])) { + $name .= "autres noms : " . $search_names[$sn_types['name_other']]['fullname']; + $i = 0; + while (isset($search_names[$sn_types['name_other']][$i])) { + $name .= ", " . $search_names[$sn_types['name_other']][$i]; + $i++; + } + } + $name .= ")"; + } + return $name; +} + +function build_directory_name(&$search_names, &$sn_types, $full_name) +{ + return $full_name . " " . $search_names[$sn_types['firstname']]['fullname']; +} + +function build_short_name(&$search_names, &$sn_types, &$alias = null) +{ + if (isset($search_names[$sn_types['lastname_ordinary']])) { + $lastname = $search_names[$sn_types['lastname_ordinary']]['fullname']; + } else { + $lastname = $search_names[$sn_types['lastname']]['fullname']; + } + if (isset($search_names[$sn_types['firstname_ordinary']])) { + $firstname = $search_names[$sn_types['firstname_ordinary']]['fullname']; + } else { + $firstname = $search_names[$sn_types['firstname']]['fullname']; + } + if ($alias) { + $alias = make_username($firstname, $lastname); + } + return $firstname . " " . $lastname; +} + +function build_sort_name(&$search_names, &$sn_types) +{ + $name = ""; + if (isset($search_names[$sn_types['lastname_ordinary']])) { + $name .= $search_names[$sn_types['lastname_ordinary']]['name']; + } else { + $name .= $search_names[$sn_types['lastname']]['name']; + } + $name .= " " . $search_names[$sn_types['firstname']]['fullname']; + return $name; +} + +function set_profile_display(&$display_names) +{ + XDB::execute("UPDATE profile_display + SET public_name = {?}, private_name = {?}, + directory_name = {?}, short_name = {?}, sort_name = {?} + WHERE pid = {?}", + $display_names['public_name'], $display_names['private_name'], + $display_names['directory_name'], $display_names['short_name'], + $display_names['sort_name'], S::v('uid')); +} + +function build_sn_pub() +{ + $res = XDB::iterator("SELECT CONCAT(sn.particle, sn.name) AS fullname, sn.typeid, + sn.particle, sn.name, sn.id + FROM profile_name AS sn + INNER JOIN profile_name_enum AS e ON (e.id = sn.typeid) + WHERE sn.pid = {?} AND NOT FIND_IN_SET('not_displayed', e.flags) + AND FIND_IN_SET('public', e.flags) + ORDER BY NOT FIND_IN_SET('always_displayed', e.flags), e.id, sn.name", + S::i('uid')); + $sn_old = array(); + while ($old = $res->next()) { + $sn_old[$old['typeid']] = array('fullname' => $old['fullname'], + 'name' => $old['name'], + 'particle' => $old['particle'], + 'id' => $old['id']); + } + return $sn_old; +} + +function set_alias_names(&$sn_new, $sn_old, $update_new = false, $new_alias = null) +{ + $has_new = false; + foreach ($sn_new as $typeid => $sn) { + if (isset($sn['pub'])) { + if (isset($sn_old[$typeid]) && ($sn_old[$typeid]['fullname'] == $sn['fullname'] && $update_new)) { + XDB::execute("UPDATE profile_name + SET particle = {?}, name = {?}, typeid = {?} + WHERE id = {?} AND pid = {?}", + $sn['particle'], $sn['name'], $typeid, $sn_old[$typeid]['id'], S::i('uid')); + unset($sn_old[$typeid]); + } elseif ($update_new + || (isset($sn_old[$typeid]) && $sn_old[$typeid]['fullname'] == $sn['fullname'])) { + XDB::execute("INSERT INTO profile_name (particle, name, typeid, pid) + VALUES ({?}, {?}, {?}, {?})", + $sn['particle'], $sn['name'], $typeid, S::i('uid')); + unset($sn_old[$typeid]); + } else { + $has_new = true; + } + } else { + if ($sn['fullname'] != '') { + XDB::execute("INSERT INTO profile_name (particle, name, typeid, pid) + VALUES ('', {?}, {?}, {?})", + $sn['fullname'], $typeid, S::i('uid')); + } + $i = 0; + while (isset($sn[$i])) { + XDB::execute("INSERT INTO profile_name (particle, name, typeid, pid) + VALUES ('', {?}, {?}, {?})", + $sn[$i], $typeid, S::i('uid')); + $i++; + } + } + } + if (count($sn_old) > 0) { + if (!$update_new) { + $has_new = true; + foreach ($sn_old as $typeid => $sn) { + XDB::execute("INSERT INTO profile_name (particle, name, typeid, pid) + VALUES ({?}, {?}, {?}, {?})", + $sn['particle'], $sn['name'], $typeid, S::i('uid')); + } + } else { + foreach ($sn_old as $typeid => $sn) { + XDB::execute("DELETE FROM profile_name + WHERE pid = {?} AND id = {?}", + S::i('uid'), $sn['id']); + } + } + } + if ($update_new) { + XDB::execute("DELETE FROM aliases + WHERE FIND_IN_SET('usage', flags) AND id = {?}", + S::i('uid')); + } + if ($new_alias) { + XDB::execute("INSERT INTO aliases (alias, type, flags, id) + VALUES ({?}, 'alias', 'usage', {?})", + $new_alias, S::i('uid')); + } + require_once('user.func.inc.php'); + user_reindex(S::i('uid')); + return $has_new; +} + +// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8: +?> diff --git a/include/notifs.inc.php b/include/notifs.inc.php index 5e835db..efa2abc 100644 --- a/include/notifs.inc.php +++ b/include/notifs.inc.php @@ -146,21 +146,23 @@ function select_notifs($mail, $uid=null, $last=null, $iterator=true) // {{{ global $prf_desc; -$prf_desc = array('nom' => 'Son patronyme', - 'freetext' => 'Le texte libre', - 'mobile' => 'Son numéro de téléphone portable', - 'nationalite' => 'Sa nationalité', - 'nick' => 'Son surnom', - 'web' => "L'adresse de son site web", - 'appli1' => "Son école d'application", - 'appli2' => 'Son école de post-application', - 'addresses' => 'Ses adresses', - 'section' => 'Sa section sportive', - 'binets' => 'La liste de ses binets', - 'medals' => 'Ses décorations', - 'cv' => 'Son curriculum vitae', - 'jobs' => 'Ses informations professionnelles', - 'photo' => 'Sa photographie', +$prf_desc = array('search_names' => 'L\'un de ses noms', + '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', + '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', 'broken' => "Il n'a plus d'adresse de redirection valide"); function get_profile_change_details($event, $limit) { diff --git a/include/profil.func.inc.php b/include/profil.func.inc.php index 9c9c782..10b3416 100644 --- a/include/profil.func.inc.php +++ b/include/profil.func.inc.php @@ -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 phonePrefix AS phoneprf, phoneFormat AS format + FROM geoloc_countries + WHERE phonePrefix = {?} OR phonePrefix = {?} OR phonePrefix = {?} + 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: ?> diff --git a/include/reminder/profile_update.inc.php b/include/reminder/profile_update.inc.php index 397b1a5..1e7535e 100644 --- a/include/reminder/profile_update.inc.php +++ b/include/reminder/profile_update.inc.php @@ -51,8 +51,8 @@ class ReminderProfileUpdate extends Reminder $res = XDB::query('SELECT date < DATE_SUB(NOW(), INTERVAL 365 DAY) AS is_profile_old, date AS profile_date, LENGTH(p.attach) > 0 AS has_photo - FROM auth_user_md5 AS u - LEFT JOIN photo AS p ON (u.user_id = p.uid) + FROM auth_user_md5 AS u + LEFT JOIN photo AS p ON (u.user_id = p.uid) WHERE user_id = {?}', $this->user->id()); list($is_profile_old, $profile_date, $has_photo) = $res->fetchOneRow(); @@ -61,9 +61,11 @@ class ReminderProfileUpdate extends Reminder $page->assign('profile_last_update', $profile_date); $page->assign('photo_incitation', !$has_photo); - require_once 'geoloc.inc.php'; - $res = localize_addresses($this->user->id()); - $page->assign('geocoding_incitation', count($res)); + $res = XDB::query('SELECT COUNT(*) + FROM profile_addresses + WHERE pid = {?} AND accuracy = 0', + $this->user->id()); + $page->assign('geocoding_incitation', $res->fetchOneCell()); } public function template() @@ -88,10 +90,13 @@ class ReminderProfileUpdate extends Reminder WHERE user_id = {?}', $user->id()); list($is_profile_old, $has_photo) = $res->fetchOneRow(); - require_once 'geoloc.inc.php'; - $res = localize_addresses($user->id()); - return (count($res) || !$has_photo || $is_profile_old); + $res = XDB::query('SELECT COUNT(*) + FROM profile_addresses + WHERE pid = {?} AND accuracy = 0', + $user->id()); + + return ($res->fetchOneCell() || !$has_photo || $is_profile_old); } } diff --git a/include/user.func.inc.php b/include/user.func.inc.php index c419197..2bc3ad6 100644 --- a/include/user.func.inc.php +++ b/include/user.func.inc.php @@ -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 @@ -36,19 +36,20 @@ function user_clear_all_subs($user_id, $really_del=true) $user = User::getSilent($uid); list($alias) = explode('@', $user->forlifeEmail()); - $tables_to_clear = array('uid' => array('competences_ins', 'entreprises', 'langues_ins', 'mentor_pays', - 'mentor_secteurs', 'mentor', 'perte_pass', 'watch_sub'), + $tables_to_clear = array('uid' => array('competences_ins', 'profile_job', 'langues_ins', 'profile_mentor_country', + 'profile_mentor_sector', 'profile_mentor', 'perte_pass', 'watch_sub'), 'user_id' => array('requests', 'user_changes')); if ($really_del) { - array_push($tables_to_clear['uid'], 'emails', '#groupex#.membres', 'contacts', 'adresses', 'tels', - 'photo', 'perte_pass', 'langues_ins', '#forums#.abos', '#forums#.profils'); + array_push($tables_to_clear['uid'], 'emails', '#groupex#.membres', 'contacts', 'adresses', 'profile_phones', + 'photo', 'perte_pass', 'langues_ins', '#forums#.abos', 'forums.profils'); array_push($tables_to_clear['user_id'], 'newsletter_ins', 'auth_user_quick', 'binets_ins'); $tables_to_clear['id'] = array('aliases'); $tables_to_clear['contact'] = array('contacts'); XDB::execute("UPDATE auth_user_md5 SET date_ins = 0, promo_sortie = 0, nom_usage = '', password = '', perms = 'pending', - nationalite = '', cv = '', section = 0, date = 0, smtppass = '', mail_storage = '' + nationalite = '', nationalite2 = '', nationalite3 = '', cv = '', section = 0, + date = 0, smtppass = '', mail_storage = '' WHERE user_id = {?}", $uid); XDB::execute("DELETE virtual.* FROM virtual INNER JOIN virtual_redirect AS r USING(vid) WHERE redirect = {?}", $alias.'@'.$globals->mail->domain); @@ -131,18 +132,19 @@ function get_not_registered_user($login, $iterator = false) 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 - 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) - LEFT JOIN fonctions_def AS f ON(e.fonction = f.id) - LEFT JOIN geoloc_pays AS gp ON (gp.a2 = e.country) - LEFT JOIN geoloc_region AS gr ON (gr.a2 = e.country and gr.region = e.region) - WHERE e.uid = {?} - ORDER BY e.entrid"; + $sql = "SELECT en.name AS entreprise, s.name as secteur, f.fonction_fr as fonction, + j.description AS poste, gp.pays AS countrytxt, gr.name AS region, + j.id AS entrid, j.pub, j.email, j.email_pub, j.url AS w_web, en.url AS web, + e.adr1, e.adr2, e.adr3, e.postcode, e.city, e.adr_pub + FROM profile_job AS j + LEFT JOIN entreprises AS e ON (e.entrid = j.id AND e.uid = j.uid) + LEFT JOIN profile_job_enum AS en ON (j.jobid = en.id) + LEFT JOIN profile_job_subsubsector_enum AS s ON (j.subsubsectorid = s.id) + LEFT JOIN fonctions_def AS f ON (j.functionid = f.id) + LEFT JOIN geoloc_pays AS gp ON (gp.a2 = e.country) + LEFT JOIN geoloc_region AS gr ON (gr.a2 = e.country AND gr.region = e.region) + WHERE j.uid = {?} + ORDER BY j.id"; $res = XDB::query($sql, $uid); $all_pro = $res->fetchAllAssoc(); foreach ($all_pro as $i => $pro) { @@ -168,16 +170,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)) { @@ -197,9 +201,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]); } @@ -217,7 +219,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) @@ -232,11 +234,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)) { @@ -258,28 +259,35 @@ function get_user_details_adr($uid, $view = 'private') { function &get_user_details($login, $from_uid = '', $view = 'private') { - $reqsql = "SELECT u.user_id, u.promo, u.promo_sortie, u.prenom, u.nom, u.nom_usage, u.date, u.cv, + $reqsql = "SELECT u.user_id, d.promo, u.prenom, u.nom, u.nom_usage, u.date, u.cv, u.perms IN ('admin','user','disabled') AS inscrit, FIND_IN_SET('femme', u.flags) AS sexe, u.deces != 0 AS dcd, u.deces, - q.profile_nick AS nickname, q.profile_from_ax, q.profile_mobile AS mobile, q.profile_web AS web, q.profile_freetext AS freetext, - q.profile_mobile_pub AS mobile_pub, q.profile_web_pub AS web_pub, q.profile_freetext_pub AS freetext_pub, - q.profile_medals_pub AS medals_pub, - IF(gp.nat='',gp.pays,gp.nat) AS nationalite, gp.a2 AS iso3166, + q.profile_nick AS nickname, q.profile_from_ax, q.profile_freetext AS freetext, + q.profile_freetext_pub AS freetext_pub, + q.profile_medals_pub AS medals_pub, co.corps_pub AS corps_pub, + IF(gp1.nat='',gp1.pays,gp1.nat) AS nationalite, gp1.a2 AS iso3166_1, + IF(gp2.nat='',gp2.pays,gp2.nat) AS nationalite2, gp2.a2 AS iso3166_2, + IF(gp3.nat='',gp3.pays,gp3.nat) AS nationalite3, gp3.a2 AS iso3166_3, a.alias AS forlife, a2.alias AS bestalias, c.uid IS NOT NULL AS is_contact, s.text AS section, p.x, p.y, p.pub AS photo_pub, u.matricule_ax, m.expertise != '' AS is_referent, - (COUNT(e.email) > 0 OR FIND_IN_SET('googleapps', u.mail_storage) > 0) AS actif - FROM auth_user_md5 AS u - INNER JOIN auth_user_quick AS q USING(user_id) - INNER JOIN aliases AS a ON (u.user_id=a.id AND a.type='a_vie') - INNER JOIN aliases AS a2 ON (u.user_id=a2.id AND FIND_IN_SET('bestalias',a2.flags)) - LEFT JOIN contacts AS c ON (c.uid = {?} and c.contact = u.user_id) - LEFT JOIN geoloc_pays AS gp ON (gp.a2 = u.nationalite) - INNER JOIN sections AS s ON (s.id = u.section) - LEFT JOIN photo AS p ON (p.uid = u.user_id) - LEFT JOIN mentor AS m ON (m.uid = u.user_id) - LEFT JOIN emails AS e ON (e.uid = u.user_id AND e.flags='active') + (COUNT(e.email) > 0 OR FIND_IN_SET('googleapps', u.mail_storage) > 0) AS actif, + d.public_name, d.private_name + FROM auth_user_md5 AS u + INNER JOIN auth_user_quick AS q USING(user_id) + INNER JOIN aliases AS a ON (u.user_id = a.id AND a.type = 'a_vie') + INNER JOIN aliases AS a2 ON (u.user_id = a2.id AND FIND_IN_SET('bestalias', a2.flags)) + LEFT JOIN contacts AS c ON (c.uid = {?} and c.contact = u.user_id) + LEFT JOIN profile_corps AS co ON (co.uid = u.user_id) + LEFT JOIN geoloc_pays AS gp1 ON (gp1.a2 = u.nationalite) + LEFT JOIN geoloc_pays AS gp2 ON (gp2.a2 = u.nationalite2) + LEFT JOIN geoloc_pays AS gp3 ON (gp3.a2 = u.nationalite3) + INNER JOIN sections AS s ON (s.id = u.section) + LEFT JOIN photo AS p ON (p.uid = u.user_id) + LEFT JOIN profile_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_display AS d ON (d.pid = u.user_id) WHERE a.alias = {?} GROUP BY u.user_id"; $res = XDB::query($reqsql, $from_uid, $login); @@ -287,25 +295,11 @@ function &get_user_details($login, $from_uid = '', $view = 'private') $uid = $user['user_id']; // hide orange status, cv, nickname, section if (!has_user_right('private', $view)) { - $user['promo_sortie'] = $user['promo'] + 3; $user['cv'] = ''; $user['nickname'] = ''; $user['section'] = ''; } - // hide mobile - if (!has_user_right($user['mobile_pub'], $view)) { - if ($user['mobile'] == '') - $user['mobile_pub'] = $view; - else - $user['mobile'] = ''; - } - // hide web - if (!has_user_right($user['web_pub'], $view)) { - if ($user['web'] == '') - $user['web_pub'] = $view; - else - $user['web'] = ''; - } + // hide freetext if (!has_user_right($user['freetext_pub'], $view)) { if ($user['freetext'] == '') @@ -314,6 +308,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); @@ -343,20 +352,35 @@ function &get_user_details($login, $from_uid = '', $view = 'private') $user['gpxs_join'] = join(', ', $user['gpxs']); } - $res = XDB::iterRow("SELECT applis_def.text, applis_def.url, applis_ins.type - FROM applis_ins - INNER JOIN applis_def ON applis_def.id = applis_ins.aid - 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); + $res = XDB::iterRow("SELECT en.name AS name, en.url AS url, d.degree AS degree, + ed.grad_year AS grad_year, f.field AS field, ed.program AS program + FROM profile_education AS ed + LEFT JOIN profile_education_enum AS en ON (en.id = ed.eduid) + LEFT JOIN profile_education_degree_enum AS d ON (d.id = ed.degreeid) + LEFT JOIN profile_education_field_enum AS f ON (f.id = ed.fieldid) + WHERE uid = {?} AND NOT FIND_IN_SET('primary', flags) + ORDER BY ed.grad_year", $uid); + + if (list($name, $url, $degree, $grad_year, $field, $program) = $res->next()) { + require_once('education.func.inc.php'); + $user['education'][] = education_fmt($name, $url, $degree, $grad_year, $field, $program, $user['sexe'], true); + } + while (list($name, $url, $degree, $grad_year, $field, $program) = $res->next()) { + $user['education'][] = education_fmt($name, $url, $degree, $grad_year, $field, $program, $user['sexe'], true); + } + + if (has_user_right($user['corps_pub'], $view)) { + $res = XDB::query("SELECT e1.name AS original, e2.name AS current, r.name AS rank + FROM profile_corps AS c + LEFT JOIN profile_corps_enum AS e1 ON (c.original_corpsid = e1.id) + LEFT JOIN profile_corps_enum AS e2 ON (c.current_corpsid = e2.id) + LEFT JOIN profile_corps_rank_enum AS r ON (c.rankid = r.id) + WHERE c.uid = {?} AND c.original_corpsid != 1", $uid); + if ($res = $res->fetchOneRow()) { + list($original, $current, $rank) = $res; + $user['corps'] = "Corps d'origine : " . $original . ", corps actuel : " . $current . ", grade : " . $rank; + } } - $user['applis_join'] = join(', ', $user['applis_fmt']); if (has_user_right($user['medals_pub'], $view)) { $res = XDB::iterator("SELECT m.id, m.text AS medal, m.type, s.gid, g.text AS grade @@ -370,6 +394,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; } // }}} @@ -386,7 +423,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 ++; } } @@ -404,17 +441,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); } } } @@ -423,38 +460,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) { - $tel['tel_type'] = ($tel['tel_type'] ? $tel['tel_type'] : ''); - 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 @@ -466,10 +506,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() @@ -507,13 +556,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']; @@ -523,14 +565,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) { $req = XDB::query('SELECT MAX(adrid) + 1 FROM adresses @@ -574,9 +634,6 @@ function set_user_details($uid, $details) { if (isset($details['nom_usage'])) { XDB::execute("UPDATE auth_user_md5 SET nom_usage = {?} WHERE user_id = {?}", mb_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 @@ -607,63 +664,62 @@ 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 } // }}} // {{{ function _user_reindex -function _user_reindex($uid, $keys, $muls, $pubs) +function _user_reindex($uid, $keys) { foreach ($keys as $i => $key) { - if ($key == '') { + if ($key['name'] == '') { continue; } - $toks = preg_split('/[ \'\-]+/', $key); + $toks = preg_split('/[ \'\-]+/', $key['name']); $token = ""; $first = 5; while ($toks) { $token = strtolower(replace_accent(array_pop($toks) . $token)); - $score = ($toks ? 0 : 10 + $first) * $muls[$i]; + $score = ($toks ? 0 : 10 + $first) * ($key['score'] / 10); XDB::execute("REPLACE INTO search_name (token, uid, soundex, score, flags) VALUES ({?}, {?}, {?}, {?}, {?})", - $token, $uid, soundex_fr($token), $score, $pubs[$i] ? 'public' : ''); + $token, $uid, soundex_fr($token), $score, $key['public']); $first = 0; } } - $res = XDB::query("SELECT nom_ini, nom, nom_usage, prenom_ini, prenom, promo, matricule - FROM auth_user_md5 - WHERE user_id = {?}", $uid); - if (!$res->numRows()) { - unset($res); - return; - } - $array = $res->fetchOneRow(); - $promo = intval(array_pop($array)); - $mat = array_shift($array); - array_walk($array, 'soundex_fr'); - XDB::execute("REPLACE INTO recherche_soundex - SET matricule = {?}, nom1_soundex = {?}, nom2_soundex= {?}, nom3_soundex = {?}, - prenom1_soundex = {?}, prenom2_soundex= {?}, promo = {?}", - $mat, $array[0], $array[1], $array[2], $array[3], $array[4], $promo); - unset($res); - unset($array); } // }}} // {{{ function user_reindex function user_reindex($uid) { - XDB::execute("DELETE FROM search_name WHERE uid={?}", $uid); - $res = XDB::query("SELECT prenom, nom, nom_usage, profile_nick FROM auth_user_md5 INNER JOIN auth_user_quick USING(user_id) WHERE auth_user_md5.user_id = {?}", $uid); - if ($res->numRows()) { - _user_reindex($uid, $res->fetchOneRow(), array(1,1,1,0.2), array(true, true, true, false)); - } else { // not in auth_user_quick => still "pending" - $res = XDB::query("SELECT prenom, nom, nom_usage FROM auth_user_md5 WHERE auth_user_md5.user_id = {?}", $uid); - if ($res->numRows()) { - _user_reindex($uid, $res->fetchOneRow(), array(1,1,1), array(true, true, true)); - } - } + XDB::execute("DELETE FROM search_name + WHERE uid = {?}", + $uid); + $res = XDB::iterator("SELECT CONCAT(n.particle, n.name) AS name, e.score, + FIND_IN_SET('public', e.flags) AS public + FROM profile_name AS n + INNER JOIN profile_name_enum AS e ON (n.typeid = e.id) + WHERE n.pid = {?}", + $uid); + _user_reindex($uid, $res); } // }}} diff --git a/include/userset.inc.php b/include/userset.inc.php index f97dbad..354c21e 100644 --- a/include/userset.inc.php +++ b/include/userset.inc.php @@ -23,19 +23,22 @@ 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\')'; +@$globals->search->result_where_statement = " + 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 profile_job AS j ON (j.id = 0 AND j.uid = u.user_id) + LEFT JOIN profile_job_enum AS je ON (je.id = j.jobid) + LEFT JOIN profile_job_sector_enum AS es ON (j.sectorid = es.id) + LEFT JOIN fonctions_def AS ef ON (j.functionid = ef.id) + LEFT JOIN geoloc_countries AS n1 ON (u.nationalite = n1.iso_3166_1_a2) + LEFT JOIN geoloc_countries AS n2 ON (u.nationalite2 = n2.iso_3166_1_a2) + LEFT JOIN geoloc_countries AS n3 ON (u.nationalite2 = n3.iso_3166_1_a2) + LEFT JOIN profile_addresses AS adr ON (u.user_id = adr.pid + AND FIND_IN_SET('current', adr.flags)) + LEFT JOIN geoloc_countries AS gc ON (adr.countryId = gc.iso_3166_1_a2) + LEFT JOIN geoloc_administrativeareas AS gr ON (adr.countryId = gr.country + AND adr.administrativeAreaId = gr.id) + LEFT JOIN emails AS em ON (em.uid = u.user_id AND em.flags = 'active')"; class UserSet extends PlSet { @@ -156,55 +159,87 @@ 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', '-d.promo', 'sort_name'), '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('sort_name'), 'nom'); + $this->addSortKey('promo', array('-d.promo', 'sort_name'), 'promotion'); + $this->addSortKey('date_mod', array('-date', '-d.promo', 'sort_name'), 'dernière modification'); parent::__construct($set, $data, $params); } public function fields() { global $globals; - return "u.user_id AS id, u.*, + return "u.user_id AS id, u.*, d.promo, CONCAT(a.alias, '@{$globals->mail->domain}') AS bestemail, u.perms != 'pending' AS inscrit, u.perms != 'pending' AS wasinscrit, u.deces != 0 AS dcd, u.deces, u.matricule_ax, FIND_IN_SET('femme', u.flags) AS sexe, - e.entreprise, e.web AS job_web, es.label AS secteur, ef.fonction_fr AS fonction, - IF(n.nat='',n.pays,n.nat) AS nat, n.a2 AS iso3166, - ad0.text AS app0text, ad0.url AS app0url, ai0.type AS app0type, - ad1.text AS app1text, ad1.url AS app1url, ai1.type AS app1type, - 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" . + je.name AS entreprise, je.url AS job_web, es.name AS sector, ef.fonction_fr AS fonction, + IF(n1.nat = '', n1.countryFR, n1.nat) AS nat1, n1.iso_3166_1_a2 AS iso3166_1, + IF(n2.nat = '', n2.countryFR, n2.nat) AS nat2, n2.iso_3166_1_a2 AS iso3166_2, + IF(n3.nat = '', n3.countryFR, n3.nat) AS nat3, n3.iso_3166_1_a2 AS iso3166_3, + IF(ede0.abbreviation = '', ede0.name, ede0.abbreviation) AS eduname0, ede0.url AS eduurl0, + IF(edd0.abbreviation = '', edd0.degree, edd0.abbreviation) AS edudegree0, + edu0.grad_year AS edugrad_year0, f0.field AS edufield0, edu0.program AS eduprogram0, + IF(ede1.abbreviation = '', ede1.name, ede1.abbreviation) AS eduname1, ede1.url AS eduurl1, + IF(edd1.abbreviation = '', edd1.degree, edd1.abbreviation) AS edudegree1, + edu1.grad_year AS edugrad_year1, f1.field AS edufield1, edu1.program AS eduprogram1, + IF(ede2.abbreviation = '', ede2.name, ede2.abbreviation) AS eduname2, ede2.url AS eduurl2, + IF(edd2.abbreviation = '', edd2.degree, edd2.abbreviation) AS edudegree2, + edu2.grad_year AS edugrad_year2, f2.field AS edufield2, edu2.program AS eduprogram2, + IF(ede3.abbreviation = '', ede3.name, ede3.abbreviation) AS eduname3, ede3.url AS eduurl3, + IF(edd3.abbreviation = '', edd3.degree, edd3.abbreviation) AS edudegree3, + edu3.grad_year AS edugrad_year3, f3.field AS edufield3, edu3.program AS eduprogram3, + "// adr.localityId, gr.name AS region + . "gc.iso_3166_1_a2, gc.countryFR AS countrytxt + (COUNT(em.email) > 0 OR FIND_IN_SET('googleapps', u.mail_storage) > 0) AS actif, + d.directory_name, d.sort_name" . (S::logged() ? ", c.contact AS contact" : ''); } public function joins() { - return "LEFT JOIN entreprises AS e ON (e.entrid = 0 AND e.uid = u.user_id".(S::logged() ? "" : " AND e.pub = 'public'").") - LEFT JOIN emploi_secteur AS es ON (e.secteur = es.id) - LEFT JOIN fonctions_def AS ef ON (e.fonction = ef.id) - LEFT JOIN geoloc_pays AS n ON (u.nationalite = n.a2) - LEFT JOIN applis_ins AS ai0 ON (u.user_id = ai0.uid AND ai0.ordre = 0) - LEFT JOIN applis_def AS ad0 ON (ad0.id = ai0.aid) - LEFT JOIN applis_ins AS ai1 ON (u.user_id = ai1.uid AND ai1.ordre = 1) - LEFT JOIN applis_def AS ad1 ON (ad1.id = ai1.aid) - LEFT JOIN adresses AS adr ON (u.user_id = adr.uid - AND FIND_IN_SET('active', adr.statut)".(S::logged() ? "" : " AND adr.pub = 'public'").") - LEFT JOIN geoloc_pays AS gp ON (adr.country = gp.a2) - LEFT JOIN geoloc_region AS gr ON (adr.country = gr.a2 AND adr.region = gr.region) - LEFT JOIN aliases AS a ON (a.id = u.user_id AND FIND_IN_SET('bestalias', a.flags)) - LEFT JOIN emails AS em ON (em.uid = u.user_id AND em.flags = 'active')" . - (S::logged() ? - "LEFT JOIN contacts AS c On (c.contact = u.user_id AND c.uid = " . S::v('uid') . ")" + return "LEFT JOIN aliases AS a ON (u.user_id = a.id AND FIND_IN_SET('bestalias', a.flags)) + LEFT JOIN search_name AS n ON (u.user_id = n.uid) + LEFT JOIN profile_job AS j ON (j.uid = u.user_id".(S::logged() ? "" : " AND j.pub = 'public'").") + LEFT JOIN profile_job_enum AS je ON (je.id = j.jobid) + LEFT JOIN profile_job_sector_enum AS es ON (j.sectorid = es.id) + LEFT JOIN fonctions_def AS ef ON (j.functionid = ef.id) + LEFT JOIN geoloc_countries AS n1 ON (u.nationalite = n1.iso_3166_1_a2) + LEFT JOIN geoloc_countries AS n2 ON (u.nationalite2 = n2.iso_3166_1_a2) + LEFT JOIN geoloc_countries AS n3 ON (u.nationalite3 = n3.iso_3166_1_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 profile_addresses AS adr ON (u.user_id = adr.pid + AND FIND_IN_SET('current', adr.flags)" + . (S::logged() ? "" : + "AND adr.pub = 'public'") . ") + LEFT JOIN geoloc_countries AS gc ON (adr.countryId = gc.iso_3166_a2) + LEFT JOIN geoloc_administrativeareas AS gr ON (adr.countryId = gr.country + AND adr.administrativeAreaId = gr.id) + LEFT JOIN emails AS em ON (em.uid = u.user_id AND em.flags = 'active') + INNER JOIN profile_display AS d ON (d.pid = u.user_id)" . (S::logged() ? + "LEFT JOIN contacts AS c ON (c.contact = u.user_id AND c.uid = " . S::v('uid') . ")" : ""); } @@ -237,16 +272,22 @@ 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('sort_name'), 'nom'); + $this->addSortKey('promo', array('-d.promo', 'sort_name'), 'promotion'); + $this->addSortKey('date_mod', array('-date', '-d.promo', 'sort_name'), 'dernière modification'); parent::__construct($set, $data, $params); } public function fields() { - return "m.uid, u.prenom, u.nom, u.promo, u.hruid, - m.expertise, mp.pid, ms.secteur, ms.ss_secteur"; + return "m.uid, d.promo, u.hruid, + m.expertise, mp.country, ms.sectorid, ms.subsectorid, + d.directory_name, d.sort_name"; + } + + public function joins() + { + return "INNER JOIN profile_display AS d ON (d.pid = u.user_id)"; } public function bounds() @@ -277,23 +318,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', 'sort_name')); if (@$params['with_score']) { - $this->addSortKey('score', array('-score', '-watch_last', '-promo', 'nom', 'prenom'), 'pertinence'); + $this->addSortKey('score', array('-score', '-watch_last', '-d.promo', 'sort_name'), 'pertinence'); } - $this->addSortKey('name', array('nom', 'prenom'), 'nom'); - $this->addSortKey('promo', array('-promo', 'nom', 'prenom'), 'promotion'); + $this->addSortKey('name', array('sort_name'), 'nom'); + $this->addSortKey('promo', array('-d.promo', 'sort_name'), 'promotion'); parent::__construct($set, $data, $params); } public function fields() { - return "u.user_id, IF(u.nom_usage != '', u.nom_usage, u.nom) AS nom, u.prenom, u.promo, u.hruid "; + return "u.user_id, d.directory_name, d.sort_name, u.promo, d.promo, u.hruid "; } public function joins() { - return "INNER JOIN photo AS p ON (p.uid = u.user_id) "; + return "INNER JOIN photo AS p ON (p.uid = u.user_id) + INNER JOIN profile_display AS d ON (d.pid = u.user_id)"; } public function bounds() @@ -328,96 +370,6 @@ class TrombiView extends MultipageView } } -class GeolocView implements PlView -{ - private $set; - private $type; - private $params; - - public function __construct(PlSet &$set, $data, array $params) - { - $this->params = $params; - $this->set =& $set; - $this->type = $data; - } - - private function use_map() - { - return is_file(dirname(__FILE__) . '/../modules/geoloc/dynamap.swf') && - is_file(dirname(__FILE__) . '/../modules/geoloc/icon.swf'); - } - - public function args() - { - $args = $this->set->args(); - unset($args['initfile']); - unset($args['mapid']); - return $args; - } - - public function apply(PlPage &$page) - { - require_once 'geoloc.inc.php'; - require_once '../modules/search/search.inc.php'; - - switch ($this->type) { - case 'icon.swf': - pl_cached_content_headers("application/x-shockwave-flash"); - readfile(dirname(__FILE__).'/../modules/geoloc/icon.swf'); - exit; - - case 'dynamap.swf': - pl_cached_content_headers("application/x-shockwave-flash"); - readfile(dirname(__FILE__).'/../modules/geoloc/dynamap.swf'); - exit; - - case 'init': - $page->changeTpl('geoloc/init.tpl', NO_SKIN); - pl_cached_content_headers("text/xml", "utf-8"); - if (!empty($GLOBALS['IS_XNET_SITE'])) { - $page->assign('background', 0xF2E9D0); - } - break; - - case 'city': - $page->changeTpl('geoloc/city.tpl', NO_SKIN); - pl_cached_content_headers("text/xml", "utf-8"); - $only_current = Env::v('only_current', false)? ' AND FIND_IN_SET(\'active\', adrf.statut)' : ''; - $it =& $this->set->get('u.user_id AS id, u.prenom, u.nom, u.promo, al.alias', - "INNER JOIN adresses AS adrf ON (adrf.uid = u.user_id $only_current) - LEFT JOIN aliases AS al ON (u.user_id = al.id - AND FIND_IN_SET('bestalias', al.flags)) - INNER JOIN adresses AS avg ON (" . getadr_join('avg') . ")", - 'adrf.cityid = ' . Env::i('cityid'), null, null, 11); - $page->assign('users', $it); - break; - - case 'country': - if (Env::has('debug')) { - $page->changeTpl('geoloc/country.tpl', SIMPLE); - } else { - $page->changeTpl('geoloc/country.tpl', NO_SKIN); - pl_cached_content_headers("text/xml", "utf-8"); - } - $mapid = Env::has('mapid') ? Env::i('mapid', -2) : false; - list($countries, $cities) = geoloc_getData_subcountries($mapid, $this->set, 10); - $page->assign('countries', $countries); - $page->assign('cities', $cities); - break; - - default: - global $globals; - if (!$this->use_map()) { - $page->assign('request_geodesix', true); - } - $page->assign('annu', @$this->params['with_annu']); - $page->assign('protocole', @$_SERVER['HTTPS'] ? 'https' : 'http'); - $this->set->get('u.user_id', null, "u.perms != 'pending' AND u.deces = 0", "u.user_id", null); - return 'include/plview.geoloc.tpl'; - } - } -} - class GadgetView implements PlView { public function __construct(PlSet &$set, $data, array $params) @@ -428,23 +380,26 @@ class GadgetView implements PlView public function fields() { return "u.user_id AS id, u.*," . - (S::logged() ? "q.profile_mobile AS mobile, " : "IF(q.profile_mobile_pub = 'public', q.profile_mobile, NULL) as mobile, ") . "u.perms != 'pending' AS inscrit, u.perms != 'pending' AS wasinscrit, u.deces != 0 AS dcd, u.deces, FIND_IN_SET('femme', u.flags) AS sexe, - adr.city, gp.a2, gp.pays AS countrytxt, gr.name AS region" . + " // adr.city, gr.name AS region + . "gc.iso_3166_1_a2, gc.countryFR AS countrytxt" . (S::logged() ? ", c.contact AS contact" : ''); } 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)" . - (S::logged() ? - "LEFT JOIN contacts AS c On (c.contact = u.user_id AND c.uid = " . S::v('uid') . ")" - : ""); + return "LEFT JOIN profile_addresses AS adr ON (u.user_id = adr.pid AND + FIND_IN_SET('current', adr.flags)" + . (S::logged() ? "" : "AND adr.pub = 'public'") . ") + LEFT JOIN geoloc_countries AS gc ON (adr.countryId = gc.iso_3166_1_a2) + LEFT JOIN geoloc_administrativeareas AS gr ON (adr.countryId = gr.country + AND adr.administrativeAreaId = gr.id) + " . (S::logged() ? + "LEFT JOIN contacts AS c ON (c.contact = u.user_id + AND c.uid = " . S::v('uid') . ")" : ""); } public function apply(PlPage &$page) diff --git a/include/validations.inc.php b/include/validations.inc.php index 2d730a2..6666e28 100644 --- a/include/validations.inc.php +++ b/include/validations.inc.php @@ -85,6 +85,10 @@ abstract class Validate $this->stamp = date('YmdHis'); $this->unique = $_unique; $this->type = $_type; + $res = XDB::query("SELECT promo + FROM profile_display + WHERE pid={?}", $this->user->id()); + $this->promo = $res->fetchOneCell(); } // }}} diff --git a/include/validations/entreprises.inc.php b/include/validations/entreprises.inc.php new file mode 100644 index 0000000..6d269d8 --- /dev/null +++ b/include/validations/entreprises.inc.php @@ -0,0 +1,208 @@ +id = $_id; + $this->name = $_name; + $this->acronym = $_acronym; + $this->url = $_url; + $this->email = $_email; + $this->tel = $_tel; + $this->fax = $_fax; + $this->address = $_address; + + $_name = preg_replace('/[^0-9a-z]/i', ' ', strtolower(replace_accent($_name))); + $name = explode(" ", $_name); + $name_array = array_map("trim", $name); + $length = count($name_array); + $where = ""; + for ($i = 0; $i < $length; $i++) { + if (strlen($name_array[$i]) > 2) { + if ($where !== "") { + $where .= " OR "; + } + $where .= "name LIKE '%" . $name_array[$i] . "%'"; + } + } + $res = XDB::iterator('SELECT name + FROM profile_job_enum + WHERE ' . $where); + $this->suggestions = "| "; + while ($sug = $res->next()) { + $this->suggestions .= $sug['name'] . " | "; + } + } + + // }}} + // {{{ function formu() + + public function formu() + { + return 'include/form.valid.entreprises.tpl'; + } + + // }}} + // {{{ function editor() + + public function editor() + { + return 'include/form.valid.edit-entreprises.tpl'; + } + + // }}} + // {{{ function handle_editor() + + protected function handle_editor() + { + if (Env::has('holdingid')) { + $this->holdingid = trim(Env::v('holdingid')); + } + if (Env::has('name')) { + $this->name = trim(Env::v('name')); + if (Env::has('acronym')) { + $this->acronym = trim(Env::v('acronym')); + if (Env::has('url')) { + $this->url = trim(Env::v('url')); + if (Env::has('NAF_code')) { + $this->NAF_code = trim(Env::v('NAF_code')); + if (Env::has('AX_code')) { + $this->AX_code = trim(Env::v('AX_code')); + return true; + } + } + } + } + } + return false; + } + + // }}} + // {{{ function _mail_subj + + protected function _mail_subj() + { + return "[Polytechnique.org/Entreprises] Demande d'ajout d'une entreprise : " . $this->name; + } + + // }}} + // {{{ function _mail_body + + protected function _mail_body($isok) + { + if ($isok) { + return " L'entreprise " . $this->name . " vient d'être ajoutée à ta fiche."; + } else { + return " La demande que tu avais faite pour l'entreprise " . $this->name . + " a été refusée, car elle figure déjà dans notre base."; + } + } + + // }}} + // {{{ function commit() + + public function commit() + { + // TODO: use address and phone classes to update profile_job_enum and profile_phones once they are done. + + $res = XDB::query('SELECT id + FROM profile_job_enum + WHERE name = {?}', + $this->name); + if ($res->numRows() != 1) { + require_once 'profil.func.inc.php'; + require_once 'geocoding.inc.php'; + + XDB::execute('INSERT INTO profile_job_enum (name, acronym, url, email, holdingid, NAF_code, AX_code) + VALUES ({?}, {?}, {?}, {?}, {?}, {?}, {?})', + $this->name, $this->acronym, $this->url, $this->email, + $this->holdingid, $this->NAF_code, $this->AX_code); + + $jobid = XDB::insertId(); + $display_tel = format_display_number($this->tel, $error_tel); + $display_fax = format_display_number($this->fax, $error_fax); + XDB::execute("INSERT INTO profile_phones (uid, link_type, link_id, tel_id, tel_type, + search_tel, display_tel, pub) + VALUES ({?}, 'hq', 0, 0, 'fixed', {?}, {?}, 'public'), + ({?}, 'hq', 0, 1, 'fax', {?}, {?}, 'public')", + $jobid, format_phone_number($this->tel), $display_tel, + $jobid, format_phone_number($this->fax), $display_fax); + + $gmapsGeocoder = new GMapsGeocoder(); + $address = $gmapsGeocoder->getGeocodedAddress($this->address); + Geocoder::getAreaId($address, 'administrativeArea'); + Geocoder::getAreaId($address, 'subAdministrativeArea'); + Geocoder::getAreaId($address, 'locality'); + XDB::execute("INSERT INTO profile_addresses (jobid, type, id, accuracy, + text, postalText, postalCode, localityId, + subAdministrativeAreaId, administrativeAreaId, + countryId, latitude, longitude, updateTime, + north, south, east, west) + VALUES ({?}, 'hq', 0, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, + {?}, {?}, FROM_UNIXTIME({?}), {?}, {?}, {?}, {?})", + $jobid, $this->address['accuracy'], $this->address['text'], $this->address['postalText'], + $this->address['postalCode'], $this->address['localityId'], + $this->address['subAdministrativeAreaId'], $this->address['administrativeAreaId'], + $this->address['countryId'], $this->address['latitude'], $this->address['longitude'], + $this->address['updateTime'], $this->address['north'], $this->address['south'], + $this->address['east'], $this->address['west']); + } else { + $jobid = $res->fetchOneCell(); + $success = true; + } + return XDB::execute('UPDATE profile_job + SET jobid = {?} + WHERE uid = {?} AND id = {?}', + $jobid, $this->user->id(), $this->id); + } + + // }}} +} + +// }}} + +// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8: +?> diff --git a/include/validations/nomusage.inc.php b/include/validations/names.inc.php similarity index 51% rename from include/validations/nomusage.inc.php rename to include/validations/names.inc.php index 3a57c83..3969f85 100644 --- a/include/validations/nomusage.inc.php +++ b/include/validations/names.inc.php @@ -19,50 +19,57 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * ***************************************************************************/ -// {{{ class UsageReq +// {{{ class NamesReq4 -class UsageReq extends Validate +class NamesReq extends Validate { // {{{ properties public $unique = true; - public $nom_usage; - public $alias = ''; + public $sn_old; + public $sn_new; + public $display_names; + public $old_alias; + public $new_alias; + public $sn_types; - public $oldusage; - public $oldalias; - - public $homonyme; - public $reason; - - public $rules = "Refuser - tout ce qui n'est visiblement pas un nom de famille (ce qui est - extremement rare car à peu près n'importe quoi peut être un nom de - famille…)"; + public $rules = "Refuser tout ce qui n'est visiblement pas un nom de famille (ce qui est extremement rare car à peu près n'importe quoi peut être un nom de famille)."; // }}} // {{{ constructor - public function __construct(User &$_user, $_usage, $_reason) + public function __construct(User &$_user, $_search_names, $_private_name_end) { parent::__construct($_user, true, 'usage'); - $this->nom_usage = $_usage; - $this->reason = $_reason; - - $res = XDB::query("SELECT prenom FROM auth_user_md5 WHERE user_id = {?}", $this->user->id()); - $this->alias = make_username($res->fetchOneCell(), $this->nom_usage); - if (!$this->nom_usage) { - $this->alias = ""; + require_once 'name.func.inc.php'; + + $this->sn_types = build_types(); + $this->sn_old = build_sn_pub(); + $this->sn_new = $_search_names; + $this->new_alias = true; + $this->display_names = array(); + + build_display_names($this->display_names, $_search_names, $_private_name_end, $this->new_alias); + foreach ($this->sn_new AS $key => &$sn) { + if (!isset($sn['pub'])) { + unset($this->sn_new[$key]); + } + } + $res = XDB::query("SELECT alias + FROM aliases + WHERE id = {?} AND type = 'alias' AND FIND_IN_SET('usage', flags)", + $this->user->id()); + $this->old_alias = $res->fetchOneCell(); + if ($this->old_alias != $this->new_alias) { + $res = XDB::query("SELECT id + FROM aliases + WHERE alias = {?}", + $this->new_alias); + if ($res->fetchOneCell()) { + $this->new_alias = null; + } } - - $res = XDB::query(" - SELECT e.alias, u.nom_usage, a.id - FROM auth_user_md5 as u - LEFT JOIN aliases as e ON(e.type='alias' AND FIND_IN_SET('usage',e.flags) AND e.id = u.user_id) - LEFT JOIN aliases as a ON(a.alias = {?} AND a.id != u.user_id) - WHERE u.user_id = {?}", $this->alias, $this->user->id()); - list($this->oldalias, $this->oldusage, $this->homonyme) = $res->fetchOneRow(); } // }}} @@ -70,7 +77,7 @@ class UsageReq extends Validate public function formu() { - return 'include/form.valid.nomusage.tpl'; + return 'include/form.valid.names.tpl'; } // }}} @@ -78,7 +85,7 @@ class UsageReq extends Validate protected function _mail_subj() { - return "[Polytechnique.org/USAGE] Changement de nom d'usage"; + return "[Polytechnique.org/NOMS] Changement de noms"; } // }}} @@ -88,23 +95,25 @@ class UsageReq extends Validate { global $globals; if ($isok) { - $res = " Le changement de nom d'usage que tu as demandé vient d'être effectué."; - if ($this->oldalias) { - $res .= "\n\n Les alias {$this->oldalias}@{$globals->mail->domain} et @{$globals->mail->domain2} ont été supprimés."; - } - if ($this->nom_usage) { - $res .= "\n\n Les alias {$this->alias}@{$globals->mail->domain} et @{$globals->mail->domain2} sont maintenant à ta disposition !"; + $res = " Le changement de nom que tu as demandé vient d'être effectué."; + if ($this->old_alias != $this->new_alias) { + if ($this->old_alias) { + $res .= "\n\n Les alias {$this->old_alias}@{$globals->mail->domain} et @{$globals->mail->domain2} ont été supprimés."; + } + if ($this->new_alias) { + $res .= "\n\n Les alias {$this->new_alias}@{$globals->mail->domain} et @{$globals->mail->domain2} sont maintenant à ta disposition !"; + } } if ($globals->mailstorage->googleapps_domain) { require_once 'googleapps.inc.php'; $account = new GoogleAppsAccount($this->user); if ($account->active()) { - $res .= "\n\n Si tu utilises Google Apps, tu peux changer ton nom d'usage sur https://mail.google.com/a/polytechnique.org/#settings/accounts"; + $res .= "\n\n Si tu utilises Google Apps, tu peux changer ton nom d'usage sur https://mail.google.com/a/polytechnique.org/#settings/accounts."; } } return $res; } else { - return " La demande de changement de nom d'usage que tu avais faite a été refusée."; + return " La demande de changement de nom que tu avais faite a été refusée."; } } @@ -114,9 +123,11 @@ class UsageReq extends Validate public function commit() { require_once 'notifs.inc.php'; - register_watch_op($this->user->id(), WATCH_FICHE, '', 'nom'); - require_once('user.func.inc.php'); - set_new_usage($this->user->id(), $this->nom_usage, $this->alias); + require_once 'name.func.inc.php'; + + register_watch_op($this->user->id(), WATCH_FICHE, '', 'search_names'); + set_profile_display($this->display_names); + set_alias_names($this->sn_new, $this->sn_old, true, $this->new_alias); // Update the local User object, to pick up the new bestalias. $this->user = User::getSilent($this->user->id()); diff --git a/include/validations/orange.inc.php b/include/validations/orange.inc.php index 802d3d7..1d2acda 100644 --- a/include/validations/orange.inc.php +++ b/include/validations/orange.inc.php @@ -27,20 +27,26 @@ class OrangeReq extends Validate public $unique = true; - public $promo_sortie; + public $oldGradYear; + public $newGradYear; + public $entryYear; - public $rules = "A priori accepter (la validation sert à repousser les - petits malins). Refuse si tu connais la personne et que tu es sure + public $rules = "À priori accepter (la validation sert à repousser les + petits malins). Refuse si tu connais la personne et que tu es sûr qu'elle n'est pas orange."; // }}} // {{{ constructor - public function __construct(User &$_user, $_sortie) + public function __construct(User &$_user, $_newGradYear) { parent::__construct($_user, true, 'orange'); - $this->promo_sortie = $_sortie; - $res = XDB::query("SELECT promo FROM auth_user_md5 WHERE user_id = {?}", $_user->id()); + $this->newGradYear = $_newGradYear; + $res = XDB::query("SELECT entry_year + FROM profile_education + WHERE uid = {?} AND FIND_IN_SET('primary', flags)", $this->user->id()); + $this->entryYear = $res->fetchOneCell(); + $this->oldGradYear = $this->entryYear + 3; } // }}} @@ -65,10 +71,11 @@ class OrangeReq extends Validate protected function _mail_body($isok) { if ($isok) { - $res = " La demande de changement de promo de sortie que tu as demandée vient d'être effectuée."; - return $res; + return " La demande de changement de promotion de sortie que tu as demandée vient d'être effectuée. " + . "Si tu le souhaites, tu peux maintenant modifier l'affichage de ta promotion sur le site sur la page suivante : " + . "https://www.polytechnique.org/profile/edit"; } else { - return " La demande de changement de promo de sortie tu avais faite a été refusée."; + return " La demande de changement de promotion de sortie tu avais faite a été refusée."; } } @@ -77,7 +84,9 @@ class OrangeReq extends Validate public function commit() { - XDB::execute("UPDATE auth_user_md5 set promo_sortie = {?} WHERE user_id = {?}",$this->promo_sortie, $this->user->id()); + XDB::execute("UPDATE profile_education + SET grad_year = {?} + WHERE uid = {?} AND FIND_IN_SET('primary', flags)", $this->newGradYear, $this->user->id()); return true; } diff --git a/include/webservices/manageurs.server.inc.php b/include/webservices/manageurs.server.inc.php index 50a5854..562f402 100644 --- a/include/webservices/manageurs.server.inc.php +++ b/include/webservices/manageurs.server.inc.php @@ -4,138 +4,166 @@ require_once('webservices/manageurs.inc.php'); $error_mat = "You didn't provide me with a valid matricule number..."; $error_key = "You didn't provide me with a valid cipher key..."; -/** - le premier parametre doit etre le matricule - le second parametre facultatif doit etre le numero de l'adresse voulue : - -1 => on ne veut pas d'adresse - 0 => on veut toutes les adresses - n => on veut l'adresse numero n - - IL NE FAUT PAS CHANGER LES NOMS DES CHAMPS DE ADRESSES - S'IL Y A DES MODIFS A FAIRE VOIR AVEC MANAGEURS admin@manageurs.com -*/ + +// The first parameter has to be the identification number (matricule). +// The second parameter facultative has to be the number of the desired address: +// -1 => we do not want any address; +// 0 => we want all the addresses; +// n => we want the address number n. +// +// DO NOT CHANGE THE NAMES OF THE ADDRESSES' FIELDS. +// IF YOU HAVE TO MAKE SOME MODIFICATION, FIRST CONTACT: +// admin@manageurs.com function get_annuaire_infos($method, $params) { + require "geocoding.inc.php"; global $error_mat, $error_key, $globals; - //verif du mdp - if(!isset($params[0]) || ($params[0] != $globals->manageurs->manageurs_pass)){return false;} - //si on a adresse == -1 => on ne recupère aucune adresse - if(isset($params[2]) && ($params[2] == -1)) unset($params[2]); - - if( !empty($params[1]) ){ // on verifie qu'on a bien un matricule + // Password verification. + if(!isset($params[0]) || ($params[0] != $globals->manageurs->manageurs_pass)) { + return false; + } + // If address == -1, we do not retrieve any address. + if(isset($params[2]) && ($params[2] == -1)) { + unset($params[2]); + } - //on ne recupere pas les adresses inutilement - if(!isset($params[2])){ + // We check we actually have an identification number. + if(!empty($params[1])) { + // We only retrieve addresses when required. + 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{ + } else { $res = XDB::iterRow( - "SELECT q.profile_mobile AS cell, a.naissance AS age, - adr.adr1, adr.adr2, adr.adr3, - adr.postcode, adr.city, adr.country, - adr.uid, adr.adrid - FROM auth_user_md5 AS a - INNER JOIN auth_user_quick AS q USING (user_id) - LEFT JOIN adresses AS adr ON(adr.uid = a.user_id) + "SELECT a.naissance, addr.text, addr.postalCode, + l.name, addr.countryId, addr.pid, addr.id + FROM auth_user_md5 AS a + INNER JOIN auth_user_quick AS q USING (user_id) + LEFT JOIN profile_addresses AS addr ON(adr.pid = a.user_id) + LEFT JOIN geoloc_localities AS l ON (l.id = addr.localityId) WHERE a.matricule = {?} AND NOT FIND_IN_SET('pro', adr.statut) ORDER BY NOT FIND_IN_SET('active', adr.statut), 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'], - $adr['pays'], $uid, $adr['adrid']) = $res->next()) - { - $array['cell'] = $cell; + // Process the addresses we got. + if(list($age, $text, $adr['cp'], $adr['ville'], + $adr['pays'], $uid, $adr['adrid']) = $res->next()) { + list($adr['adr1'], $adr['adr2'], $adr['adr3']) = + explode("\n", Geocoder::getFirstLines($text, $adr['cp'], 3)); + $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; - //on clamp le numero au nombre d'adresses dispo + // We limit the address number by the number of available addresses. $adresse = min((int) $params[2], $res->total()); - if ($adresse != 1) { //on ne veut pas la premiere adresse + if ($adresse != 1) { // We don't want the first address. $i = 2; - while(list($cell, $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 + while(list($age, $text, $adr['cp'], $adr['ville'], + $adr['pays'], , $adr['adrid']) = $res->next()) { + list($adr['adr1'], $adr['adr2'], $adr['adr3']) = + explode("\n", Geocoder::getFirstLines($text, $adr['cp'], 3)); + if ($adresse == $i) { + // If we want this particular address. $array['adresse'][0] = $adr; //$res->free(); break; - } - elseif($adresse == 0){//si on veut toutes les adresses + } elseif ($adresse == 0) { + // If we want every address. $array['adresse'][] = $adr; } $i++; } } - // on rajoute les numéros de tél + // We add the phone numbers. $adrid_index = array(); - foreach ($array['adresse'] as $i => $a) $adrid_index[$a['adrid']] = $i; - // on rajoute les numéros de tels + foreach ($array['adresse'] as $i => $a) { + $adrid_index[$a['adrid']] = $i; + } $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); - while ($tel = $restel->next()) $array['adresse'][$adrid_index[$tel['adrid']]]['tels'][] = $tel; + "SELECT t.display_tel AS tel, t.tel_type, t.link_id as adrid + FROM profile_phones AS t + INNER JOIN profile_addresses AS a ON (t.link_id = a.id AND t.uid = a.pid) + 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); - foreach($adr['tels'] as $j => $t){ - if (!isset($array['adresse'][$i]['tel']) && (strpos($t['tel_type'], 'Tél') === 0)) $array['adresse'][$i]['tel'] = $t['tel']; - elseif (!isset($array['adresse'][$i]['fax']) && (strpos($t['tel_type'], 'Fax') === 0)) $array['adresse'][$i]['fax'] = $t['tel']; - else $lasttel = $t['tel']; - if (isset($array['adresse'][$i]['tel']) && isset($array['adresse'][$i]['fax'])) break; + foreach ($adr['tels'] as $j => $t) { + if (!isset($array['adresse'][$i]['tel']) && (strpos($t['tel_type'], 'Tél') === 0)) { + $array['adresse'][$i]['tel'] = $t['tel']; + } elseif (!isset($array['adresse'][$i]['fax']) + && (strpos($t['tel_type'], 'Fax') === 0)) { + $array['adresse'][$i]['fax'] = $t['tel']; + } else { + $lasttel = $t['tel']; + } + if (isset($array['adresse'][$i]['tel']) && isset($array['adresse'][$i]['fax'])) { + break; + } } - if (!isset($array['adresse'][$i]['tel']) && isset($lasttel)) + if (!isset($array['adresse'][$i]['tel']) && isset($lasttel)) { $array['adresse'][$i]['tel'] = $lasttel; - elseif (!isset($array['adresse'][$i]['fax']) && isset($lasttel)) + } elseif (!isset($array['adresse'][$i]['fax']) && isset($lasttel)) { $array['adresse'][$i]['fax'] = $lasttel; + } unset($array['adresse'][$i]['adrid']); unset($array['adresse'][$i]['tels']); } - } - else{ + } else { $array = false; } } - if ($array) { // on a bien eu un résultat : le matricule etait bon + if ($array) { // We did get a result: the identification number was rigth. - //on n'envoit que l'age à manageurs le format est YYYY-MM-DD 0123-56-89 - $year = (int) substr($array['age'],0,4); - $month = (int) substr($array['age'],5,2); - $day = (int) substr($array['age'],8,2); + // We only send the age to manageurs.com; the format is YYYY-MM-DD 0123-56-89. + $year = (int) substr($array['age'], 0, 4); + $month = (int) substr($array['age'], 5, 2); + $day = (int) substr($array['age'], 8, 2); $age = (int) date('Y') - $year - 1; if(( $month < (int)date('m')) || - (($month == (int)date('m')) && ($day >= (int)date('d')))) - { + (($month == (int)date('m')) && ($day >= (int)date('d')))) { $age += 1; } $array['age'] = $age; - //on commence le cryptage des donnees - if (manageurs_encrypt_init($params[1]) == 1) {//on a pas trouve la cle pour crypter + // We start the encryption of the data. + if (manageurs_encrypt_init($params[1]) == 1) { + // We did not find the key to encryptthe data. $args = array("erreur" => 3, "erreurstring" => $error_key); $reply = xmlrpc_encode_request(NULL,$args); } else { $reply = manageurs_encrypt_array($array); manageurs_encrypt_close(); } - } else {//le matricule n'etait pas valide + } else { + // The identification number was not valid. $args = array("erreur" => 2, "erreurstring" => $erreur_mat); $reply = xmlrpc_encode_request(NULL,$args); } - } else {//le matricule n'etait pas en argument + } else { + // The identification number was not in argument. $args = array("erreur" => 1, "erreurstring" => $error_mat); - $reply = xmlrpc_encode_request(NULL,$args); + $reply = xmlrpc_encode_request(NULL, $args); } return $reply; @@ -143,35 +171,36 @@ function get_annuaire_infos($method, $params) { function get_nouveau_infos($method, $params) { global $error_mat, $error_key, $globals; - //verif du mdp - if(!isset($params[0]) || ($params[0] != $globals->manageurs->manageurs_pass)){return false;} - if( !empty($params[1]) ){ // on verifie qu'on a bien un matricule - + // Password verification. + if(!isset($params[0]) || ($params[0] != $globals->manageurs->manageurs_pass)) { + return false; + } + // We check we actually have an identification number. + if(!empty($params[1])) { $res = XDB::query( - "SELECT a.nom, a.nom_usage,a.prenom, FIND_IN_SET('femme', a.flags) as femme ,a.deces!= 0 as decede , - a.naissance, a.promo, concat(al.alias, '@m4x.org') as mail - FROM auth_user_md5 AS a - INNER JOIN aliases as al ON a.user_id=al.id - WHERE al.flags='bestalias' and a.matricule = {?}",$params[1]); + "SELECT a.nom, a.nom_usage,a.prenom, FIND_IN_SET('femme', a.flags) as femme, + a.deces!= 0 as decede, a.naissance, a.promo, concat(al.alias, '@m4x.org') as mail + FROM auth_user_md5 AS a + INNER JOIN aliases AS al ON (a.user_id = al.id) + WHERE al.flags = 'bestalias' AND a.matricule = {?}",$params[1]); $data=$res->fetchOneAssoc(); //$data['mail'].='@polytechnique.org'; - //on commence le cryptage des donnees - if (manageurs_encrypt_init($params[1]) == 1) {//on a pas trouve la cle pour crypter + // We start the encryption of the data. + if (manageurs_encrypt_init($params[1]) == 1) { + // We did not find the key to encryptthe data. $args = array("erreur" => 3, "erreurstring" => $error_key); - $reply = xmlrpc_encode_request(NULL,$args); + $reply = xmlrpc_encode_request(NULL, $args); } else { $reply = manageurs_encrypt_array($data); manageurs_encrypt_close(); } + } else { + $reply = false; } - else{ - $reply=false; - } - return $reply; - + return $reply; } // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8: diff --git a/modules/admin.php b/modules/admin.php index 77427d9..af06bef 100644 --- a/modules/admin.php +++ b/modules/admin.php @@ -48,6 +48,7 @@ class AdminModule extends PLModule 'admin/ipwatch' => $this->make_hook('ipwatch', AUTH_MDP, 'admin'), 'admin/icons' => $this->make_hook('icons', AUTH_MDP, 'admin'), 'admin/accounts' => $this->make_hook('accounts', AUTH_MDP, 'admin'), + 'admin/jobs' => $this->make_hook('jobs', AUTH_MDP, 'admin'), ); } @@ -727,7 +728,7 @@ class AdminModule extends PLModule $action = Env::v('valid_promo') == 'Ajouter des membres' ? 'add' : 'ax'; pl_redirect('admin/promo/' . $action . '/' . Env::i('promo')); } else { - $page->trigError('Promo non valide'); + $page->trigError('Promotion non valide.'); } } @@ -1264,6 +1265,114 @@ class AdminModule extends PLModule WHERE perms = \'admin\' ORDER BY nom, prenom')); } + + function handler_jobs(&$page, $id = -1) + { + $page->changeTpl('admin/jobs.tpl'); + + if (Env::has('search')) { + $res = XDB::query("SELECT e.id, e.name, e.acronym + FROM profile_job_enum AS e + WHERE e.name LIKE CONCAT('% ', {?}, '%') OR e.acronym LIKE CONCAT('% ', {?}, '%')", + Env::t('job'), Env::t('job')); + + if ($res->numRows() <= 20) { + $page->assign('jobs', $res->fetchAllAssoc()); + } else { + $page->trigError("Il y a trop d'entreprises correspondant à ton choix. Affine-le !"); + } + + $page->assign('askedJob', Env::v('job')); + return; + } + + if (Env::has('edit')) { + // TODO: use address and phone classes to update profile_job_enum and profile_phones once they are done. + + S::assert_xsrf_token(); + $selectedJob = Env::has('selectedJob'); + + XDB::execute("DELETE FROM profile_phones + WHERE uid = {?} AND link_type = 'hq'", + $id); + XDB::execute("DELETE FROM profile_addresses + WHERE jobid = {?} AND type = 'hq'", + $id); + XDB::execute('DELETE FROM profile_job_enum + WHERE id = {?}', + $id); + + if (Env::has('change')) { + XDB::execute('UPDATE profile_job + SET jobid = {?} + WHERE jobid = {?}', + Env::i('newJobId'), $id); + + $page->trigSuccess("L'entreprise a bien été remplacée."); + } else { + require_once 'profil.func.inc.php'; + require_once 'geocoding.inc.php'; + + $display_tel = format_display_number(Env::v('tel'), $error_tel); + $display_fax = format_display_number(Env::v('fax'), $error_fax); + $gmapsGeocoder = new GMapsGeocoder(); + $address = array('text' => Env::t('address')); + $address = $gmapsGeocoder->getGeocodedAddress($address); + Geocoder::getAreaId($address, 'administrativeArea'); + Geocoder::getAreaId($address, 'subAdministrativeArea'); + Geocoder::getAreaId($address, 'locality'); + + XDB::execute('UPDATE profile_job_enum + SET name = {?}, acronym = {?}, url = {?}, email = {?}, + NAF_code = {?}, AX_code = {?}, holdingid = {?} + WHERE id = {?}', + Env::t('name'), Env::t('acronym'), Env::t('url'), Env::t('email'), + Env::t('NAF_code'), Env::i('AX_code'), Env::i('holdingId'), $id); + + XDB::execute("INSERT INTO profile_phones (uid, link_type, link_id, tel_id, tel_type, + search_tel, display_tel, pub) + VALUES ({?}, 'hq', 0, 0, 'fixed', {?}, {?}, 'public'), + ({?}, 'hq', 0, 1, 'fax', {?}, {?}, 'public')", + $id, format_phone_number(Env::v('tel')), $display_tel, + $id, format_phone_number(Env::v('fax')), $display_fax); + + XDB::execute("INSERT INTO profile_addresses (jobid, type, id, accuracy, + text, postalText, postalCode, localityId, + subAdministrativeAreaId, administrativeAreaId, + countryId, latitude, longitude, updateTime, + north, south, east, west) + VALUES ({?}, 'hq', 0, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, + {?}, {?}, FROM_UNIXTIME({?}), {?}, {?}, {?}, {?})", + $id, $address['accuracy'], $address['text'], $address['postalText'], + $address['postalCode'], $address['localityId'], + $address['subAdministrativeAreaId'], $address['administrativeAreaId'], + $address['countryId'], $address['latitude'], $address['longitude'], + $address['updateTime'], $address['north'], $address['south'], + $address['east'], $address['west']); + + $page->trigSuccess("L'entreprise a bien été mise à jour."); + } + } + + if (!Env::has('change') && $id != -1) { + $res = XDB::query("SELECT e.id, e.name, e.acronym, e.url, e.email, e.NAF_code, e.AX_code, + h.id AS holdingId, h.name AS holdingName, h.acronym AS holdingAcronym, + t.display_tel AS tel, f.display_tel AS fax, a.text AS address + FROM profile_job_enum AS e + LEFT JOIN profile_job_enum AS h ON (e.holdingid = h.id) + LEFT JOIN profile_phones AS t ON (t.uid = e.id AND link_type = 'hq' AND tel_id = 0) + LEFT JOIN profile_phones AS f ON (f.uid = e.id AND link_type = 'hq' AND tel_id = 1) + LEFT JOIN profile_addresses AS a ON (a.jobid = e.id AND a.type = 'hq') + WHERE e.id = {?}", + $id); + + if ($res->numRows() == 0) { + $page->trigError('Auncune entreprise ne correspond à cet identifiant.'); + } else { + $page->assign('selectedJob', $res->fetchOneAssoc()); + } + } + } } // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8: diff --git a/modules/email.php b/modules/email.php index 0898aa4..8c363a8 100644 --- a/modules/email.php +++ b/modules/email.php @@ -260,7 +260,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')) { - $result = $redirect->add_email(Env::v('email')); + $new_email = Env::v('email'); + if ($new_email == "new@example.org") { + $new_email = Env::v('email_new'); + } + $result = $redirect->add_email($new_email); + if ($result == ERROR_INVALID_EMAIL) { + $page->assign('email', $new_email); + } + $page->assign('retour', $result); } elseif (empty($actifs)) { $result = ERROR_INACTIVE_REDIRECTION; } elseif (is_array($actifs)) { @@ -312,6 +320,9 @@ class EmailModule extends PLModule // Display GoogleApps acount information. require_once 'googleapps.inc.php'; $page->assign('googleapps', GoogleAppsAccount::account_status($user->id())); + + require_once 'emails.combobox.inc.php'; + fill_email_combobox($page); } function handler_antispam(&$page, $statut_filtre = null) diff --git a/modules/events.php b/modules/events.php index d9c3a0b..c40e75e 100644 --- a/modules/events.php +++ b/modules/events.php @@ -149,16 +149,17 @@ class EventsModule extends PLModule // Fetch the events to display, along with their metadata. $array = array(); - $it = XDB::iterator("SELECT e.id,e.titre,e.texte,e.post_id,a.user_id,a.nom,a.prenom,a.promo,a.hruid, + $it = XDB::iterator("SELECT e.id, e.titre, e.texte, e.post_id, a.user_id, a.nom, a.prenom, d.promo AS promo_display ,a.hruid, p.x, p.y, p.attach IS NOT NULL AS img, FIND_IN_SET('wiki', e.flags) AS wiki, FIND_IN_SET('important', e.flags) AS important, e.creation_date > DATE_SUB(CURDATE(), INTERVAL 2 DAY) AS news, e.peremption < DATE_ADD(CURDATE(), INTERVAL 2 DAY) AS end, ev.user_id IS NULL AS nonlu FROM evenements AS e - LEFT JOIN evenements_photo AS p ON (e.id = p.eid) - INNER JOIN auth_user_md5 AS a ON e.user_id=a.user_id - LEFT JOIN evenements_vus AS ev ON (e.id = ev.evt_id AND ev.user_id = {?}) + LEFT JOIN evenements_photo AS p ON (e.id = p.eid) + INNER JOIN auth_user_md5 AS a ON (e.user_id = a.user_id) + INNER JOIN profile_display AS d ON (d.pid = a.user_id) + LEFT JOIN evenements_vus AS ev ON (e.id = ev.evt_id AND ev.user_id = {?}) WHERE FIND_IN_SET('valide', e.flags) AND peremption >= NOW() AND (e.promo_min = 0 || e.promo_min <= {?}) AND (e.promo_max = 0 || e.promo_max >= {?}) diff --git a/modules/fusionax.php b/modules/fusionax.php new file mode 100644 index 0000000..fac47d1 --- /dev/null +++ b/modules/fusionax.php @@ -0,0 +1,432 @@ + $this->make_hook('index', AUTH_MDP, 'admin'), + 'fusionax/import' => $this->make_hook('import', AUTH_MDP, 'admin'), + 'fusionax/view' => $this->make_hook('view', AUTH_MDP, 'admin'), + 'fusionax/ids' => $this->make_hook('ids', AUTH_MDP, 'admin'), + 'fusionax/deceased' => $this->make_hook('deceased', AUTH_MDP, 'admin'), + 'fusionax/promo' => $this->make_hook('promo', AUTH_MDP, 'admin'), + ); + } + + + function handler_index(&$page) + { + $globals = Platal::globals(); + + $page->changeTpl('fusionax/index.tpl'); + $page->assign('xorg_title', 'Polytechnique.org - Fusion des annuaires'); + if (isset($globals->fusionax) && isset($globals->fusionax->LastUpdate)) { + $page->assign('lastimport', date("d-m-Y", $globals->fusionax->LastUpdate)); + } + } + + /** Import de l'annuaire de l'AX depuis l'export situé dans le home de jacou */ + function handler_import(&$page, $action = 'index', $fileSQL = '') + { + $globals = Platal::globals(); + + if ($action == 'index') { + $page->changeTpl('fusionax/import.tpl'); + $page->addJsLink('jquery.js'); + if (isset($globals->fusionax) && isset($globals->fusionax->LastUpdate)) { + $page->assign( + 'lastimport', + "le " . date("d/m/Y à H:i", $globals->fusionax->LastUpdate)); + } + return; + } + + // toutes les actions sont faites en ajax en utilisant jquery + header("Content-type: text/javascript; charset=utf-8"); + + // log des actions + $report = array(); + + // création d'un fichier temporaire si nécessaire + if (Env::has('tmpdir')) { + $tmpdir = Env::v('tmpdir'); + } else { + $tmpdir = tempnam('/tmp', 'fusionax'); + unlink($tmpdir); + mkdir($tmpdir); + chmod($tmpdir, 0700); + } + + $modulepath = realpath(dirname(__FILE__) . '/fusionax/') . '/'; + $olddir = getcwd(); + chdir($tmpdir); + + if ($action == 'launch') { + // séparation de l'archive en fichiers par tables + exec($modulepath . 'import-ax.sh', $report); + $report[] = 'Fichier parsé.'; + $report[] = 'Import dans la base en cours...'; + $next = 'integrateSQL'; + } elseif ($action == 'integrateSQL') { + // intégration des données dans la base MySQL + // liste des fichiers sql à exécuter + $filesSQL = array( + 'Activites.sql', + 'Adresses.sql', + 'Anciens.sql', + 'Formations.sql', + 'Entreprises.sql'); + if ($fileSQL != '') { + // récupère le contenu du fichier sql + $queries = explode(';', file_get_contents($modulepath . $fileSQL)); + foreach ($queries as $q) { + if (trim($q)) { + // coupe le fichier en requêtes individuelles + if (substr($q, 0, 2) == '--') { + // affiche les commentaires dans le report + $lines = explode("\n", $q); + $l = $lines[0]; + $report[] = addslashes($l); + } + // exécute la requête + XDB::execute($q); + } + } + // trouve le prochain fichier à exécuter + $trans = array_flip($filesSQL); + $nextfile = $trans[$fileSQL] + 1; + } else { + $nextfile = 0; + } + if (!isset($filesSQL[$nextfile])) { + // tous les fichiers ont été exécutés, on passe à l'étape + // suivante + $next = 'clean'; + } else { + // on passe au fichier suivant + $next = 'integrateSQL/' . $filesSQL[$nextfile]; + } + } elseif ($action == 'clean') { + // nettoyage du fichier temporaire + chdir($olddir); + exec("rm -Rf $tmpdir", $report); + $report[] = "Fin de l\'import"; + // met à jour la date de dernier import + //$globals->change_dynamic_config(array('LastUpdate' => time()), 'FusionAx'); + } + foreach($report as $t) { + // affiche les lignes de report + echo "$('#fusionax_import').append('" . $t . "
');\n"; + } + if (isset($next)) { + $tmpdir = getcwd(); + chdir($olddir); + // lance le prochain script s'il y en a un + echo "$.getScript('fusionax/import/" . $next . "?tmpdir=" . urlencode($tmpdir) . "');"; + } + // exit pour ne pas afficher la page template par défaut + exit; + } + + /** Import de l'annuaire de l'AX depuis l'export situé dans le home de jacou */ + function handler_view(&$page, $action = '') + { + $globals = Platal::globals(); + + $page->changeTpl('fusionax/view.tpl'); + if ($action == 'create') { + XDB::execute('DROP VIEW IF EXISTS fusionax_deceased'); + XDB::execute('CREATE VIEW fusionax_deceased AS + SELECT u.user_id, a.id_ancien, u.nom, u.prenom, u.promo, u.deces AS deces_xorg, a.Date_deces AS deces_ax + FROM auth_user_md5 AS u + INNER JOIN fusionax_anciens AS a ON (a.id_ancien = u.matricule_ax) + WHERE u.deces != a.Date_deces'); + XDB::execute('DROP VIEW IF EXISTS fusionax_promo'); + XDB::execute('CREATE VIEW fusionax_promo AS + SELECT u.user_id, u.matricule_ax, CONCAT(u.nom, " ", u.prenom) AS display_name, u.promo AS promo_etude_xorg, + f.promotion_etude AS promo_etude_ax, u.promo_sortie AS promo_sortie_xorg + FROM auth_user_md5 AS u + INNER JOIN fusionax_anciens AS f ON (u.matricule_ax = f.id_ancien) + WHERE u.promo != f.promotion_etude AND !(f.promotion_etude = u.promo + 1 AND u.promo_sortie = u.promo + 4)'); + } + } + + /* Mets à NULL le matricule_ax de ces camarades pour marquer le fait qu'ils ne figurent pas dans l'annuaire de l'AX */ + private static function clear_wrong_in_xorg($user_id) + { + $res = XDB::execute("UPDATE fusionax_xorg_anciens + SET matricule_ax = NULL + WHERE user_id = {?}", $user_id); + if (!$res) { + return 0; + } + return XDB::affectedRows() / 2; + } + + /* Cherche les les anciens présents dans Xorg avec un matricule_ax ne correspondant à rien dans la base de l'AX + * (mises à part les promo 1921 et 1923 qui ne figurent pas dans les données de l'AX)*/ + private static function find_wrong_in_xorg($limit = 10) + { + return XDB::iterator("SELECT u.promo, u.user_id, u.display_name + FROM fusionax_xorg_anciens AS u + WHERE NOT EXISTS (SELECT * + FROM fusionax_anciens AS f + WHERE f.id_ancien = u.matricule_ax) + AND u.matricule_ax IS NOT NULL AND promo != 1921 AND promo != 1923"); + } + + /** Lier les identifiants d'un ancien dans les deux annuaires + * @param user_id identifiant dans l'annuaire X.org + * @param matricule_ax identifiant dans l'annuaire de l'AX + * @return 0 si la liaison a échoué, 1 sinon + */ + private static function link_by_ids($user_id, $matricule_ax) + { + $res = XDB::execute("UPDATE fusionax_import AS i + INNER JOIN fusionax_xorg_anciens AS u + SET u.matricule_ax = i.id_ancien, + i.user_id = u.user_id, + i.date_match_id = NOW() + WHERE i.id_ancien = {?} AND u.user_id = {?} + AND (u.matricule_ax != {?} OR u.matricule_ax IS NULL + OR i.user_id != {?} OR i.user_id IS NULL)", + $matricule_ax, $user_id, $matricule_ax, $user_id); + if (!$res) { + return 0; + } + return XDB::affectedRows() / 2; + } + + /** Recherche automatique d'anciens à lier entre les deux annuaires + * @param limit nombre d'anciens à trouver au max + * @param sure si true, ne trouve que des anciens qui sont quasi sûrs + * @return un XOrgDBIterator sur les entrées avec display_name, promo, + * user_id, id_ancien et display_name_ax + */ + private static function find_easy_to_link($limit = 10, $sure = false) + { + $easy_to_link = XDB::iterator(" + SELECT u.display_name, u.promo, u.user_id, ax.id_ancien, + CONCAT(ax.prenom, ' ', ax.nom_complet, ' (X ', ax.promotion_etude, ')') AS display_name_ax, + COUNT(*) AS nbMatches + FROM fusionax_anciens AS ax + INNER JOIN fusionax_import AS i ON (i.id_ancien = ax.id_ancien AND i.user_id IS NULL) + LEFT JOIN fusionax_xorg_anciens AS u ON (u.matricule_ax IS NULL + AND ax.Nom_patronymique = u.nom + AND ax.prenom = u.prenom + AND u.promo = ax.promotion_etude) + GROUP BY u.user_id + HAVING u.user_id IS NOT NULL AND nbMatches = 1 " . ($limit ? ('LIMIT ' . $limit) : '')); + if ($easy_to_link->total() > 0 || $sure) { + return $easy_to_link; + } + return XDB::iterator(" + SELECT u.display_name, u.promo, u.user_id, ax.id_ancien, + CONCAT(ax.prenom, ' ', ax.nom_complet, ' (X ', ax.promotion_etude, ')') AS display_name_ax, + COUNT(*) AS nbMatches + FROM fusionax_anciens AS ax + INNER JOIN fusionax_import AS i ON (i.id_ancien = ax.id_ancien AND i.user_id IS NULL) + LEFT JOIN fusionax_xorg_anciens AS u ON (u.matricule_ax IS NULL + AND (ax.Nom_patronymique = u.nom + OR ax.Nom_patronymique LIKE CONCAT(u.nom, ' %') + OR ax.Nom_patronymique LIKE CONCAT(u.nom, '-%') + OR ax.Nom_usuel = u.nom + OR u.nom LIKE CONCAT('% ', ax.Nom_patronymique)) + AND u.promo < ax.promotion_etude + 2 + AND u.promo > ax.promotion_etude - 2) + GROUP BY u.user_id + HAVING u.user_id IS NOT NULL AND nbMatches = 1 " . ($limit ? ('LIMIT ' . $limit) : '')); + } + + /** Module de mise en correspondance les ids */ + function handler_ids(&$page, $part = 'main', $user_id = null, $matricule_ax = null) + { + $globals = Platal::globals(); + $nbToLink = 100; + + $page->addJsLink('jquery.js'); + $page->assign('xorg_title', 'Polytechnique.org - Fusion - Mise en correspondance simple'); + if ($part == 'missingInAX') { + // locate all persons from this database that are not in AX's + $page->changeTpl('fusionax/idsMissingInAx.tpl'); + $missingInAX = XDB::iterator("SELECT promo, user_id, display_name + FROM fusionax_xorg_anciens + WHERE matricule_ax IS NULL"); + $page->assign('missingInAX', $missingInAX); + return; + } + if ($part == 'missingInXorg') { + // locate all persons from AX's database that are not here + $page->changeTpl('fusionax/idsMissingInXorg.tpl'); + $missingInXorg = XDB::iterator("SELECT a.promotion_etude AS promo, + CONCAT(a.prenom, ' ', a.Nom_usuel) AS display_name, + a.id_ancien + FROM fusionax_import + INNER JOIN fusionax_anciens AS a USING (id_ancien) + WHERE fusionax_import.user_id IS NULL"); + $page->assign('missingInXorg', $missingInXorg); + return; + } + if ($part == 'wrongInXorg') { + // locate all persons from Xorg database that have a bad AX id + $page->changeTpl('fusionax/idswrongInXorg.tpl'); + $wrongInXorg = FusionAxModule::find_wrong_in_xorg($nbToLink); + $page->assign('wrongInXorg', $wrongInXorg); + return; + } + if ($part == 'cleanwronginxorg') { + $linksToDo = FusionAxModule::find_wrong_in_xorg($nbToLink); + while ($l = $linksToDo->next()) { + FusionAxModule::clear_wrong_in_xorg($l['user_id']); + } + pl_redirect('fusionax/ids/wrongInXorg'); + } + if ($part == 'lier') { + if (Post::has('user_id') && Post::has('matricule_ax')) { + FusionAxModule::link_by_ids(Post::i('user_id'), Post::v('matricule_ax')); + } + } + if ($part == 'link') { + FusionAxModule::link_by_ids($user_id, $matricule_ax); + exit; + } + if ($part == 'linknext') { + $linksToDo = FusionAxModule::find_easy_to_link($nbToLink); + while ($l = $linksToDo->next()) { + FusionAxModule::link_by_ids($l['user_id'], $l['id_ancien']); + } + pl_redirect('fusionax/ids#autolink'); + } + if ($part == 'linkall') { + $linksToDo = FusionAxModule::find_easy_to_link(0); + while ($l = $linksToDo->next()) { + FusionAxModule::link_by_ids($l['user_id'], $l['id_ancien']); + } + } + { + $page->changeTpl('fusionax/ids.tpl'); + $missingInAX = XDB::query('SELECT COUNT(*) + FROM fusionax_xorg_anciens AS u + WHERE u.matricule_ax IS NULL'); + if ($missingInAX) { + $page->assign('nbMissingInAX', $missingInAX->fetchOneCell()); + } + $missingInXorg = XDB::query('SELECT COUNT(*) + FROM fusionax_import AS i + WHERE i.user_id IS NULL'); + if ($missingInXorg) { + $page->assign('nbMissingInXorg', $missingInXorg->fetchOneCell()); + } + $wrongInXorg = FusionAxModule::find_wrong_in_xorg($nbToLink); + if ($wrongInXorg->total() > 0) { + $page->assign('wrongInXorg', $wrongInXorg->total()); + } + $easyToLink = FusionAxModule::find_easy_to_link($nbToLink); + if ($easyToLink->total() > 0) { + $page->assign('nbMatch', $easyToLink->total()); + $page->assign('easyToLink', $easyToLink); + } + } + } + + function handler_deceased(&$page, $action = '') + { + if ($action == 'updateXorg') { + XDB::execute('UPDATE fusionax_deceased + SET deces_xorg = deces_ax + WHERE deces_xorg = "0000-00-00"'); + } + if ($action == 'updateAX') { + XDB::execute('UPDATE fusionax_deceased + SET deces_ax = deces_xorg + WHERE deces_ax = "0000-00-00"'); + } + if ($action == 'update') { + if (Post::has('user_id') && Post::has('date')) { + XDB::execute('UPDATE fusionax_deceased + SET deces_ax = {?}, deces_xorg = {?} + WHERE user_id = {?}', + Post::v('date'), Post::v('date'), Post::i('user_id')); + } + } + $page->changeTpl('fusionax/deceased.tpl'); + // deceased + $deceasedErrorsSql = XDB::query('SELECT COUNT(*) FROM fusionax_deceased'); + $page->assign('deceasedErrors', $deceasedErrorsSql->fetchOneCell()); + $res = XDB::iterator('SELECT d.user_id, d.id_ancien, d.nom, d.prenom, d.promo, d.deces_ax, + CONCAT(d.prenom, " ", d.nom) AS display_name + FROM fusionax_deceased AS d + WHERE d.deces_xorg = "0000-00-00" + LIMIT 10'); + $page->assign('nbDeceasedMissingInXorg', $res->total()); + $page->assign('deceasedMissingInXorg', $res); + $res = XDB::iterator('SELECT d.user_id, d.id_ancien, d.nom, d.prenom, d.promo, d.deces_xorg, + CONCAT(d.prenom, " ", d.nom) AS display_name + FROM fusionax_deceased AS d + WHERE d.deces_ax = "0000-00-00" + LIMIT 10'); + $page->assign('nbDeceasedMissingInAX', $res->total()); + $page->assign('deceasedMissingInAX', $res); + $res = XDB::iterator('SELECT d.user_id, d.id_ancien, d.nom, d.prenom, d.promo, + d.deces_ax, d.deces_xorg, + CONCAT(d.prenom, " ", d.nom, " ", d.user_id) AS display_name + FROM fusionax_deceased AS d + WHERE d.deces_xorg != "0000-00-00" AND d.deces_ax != "0000-00-00"'); + $page->assign('nbDeceasedDifferent', $res->total()); + $page->assign('deceasedDifferent', $res); + } + + function handler_promo(&$page, $action = '') + { + $page->changeTpl('fusionax/promo.tpl'); + $res = XDB::iterator('SELECT user_id, display_name, promo_etude_xorg, promo_sortie_xorg, promo_etude_ax + FROM fusionax_promo + WHERE !(promo_etude_ax + 1 = promo_etude_xorg AND promo_etude_xorg + 3 = promo_sortie_xorg)'); + $nbMissmatchingPromos = $res->total(); + $page->assign('nbMissmatchingPromos1', $res->total()); + $page->assign('missmatchingPromos1', $res); + $res = XDB::iterator('SELECT user_id, display_name, promo_etude_xorg, promo_sortie_xorg, promo_etude_ax + FROM fusionax_promo + WHERE promo_etude_ax + 1 = promo_etude_xorg AND promo_etude_xorg + 3 = promo_sortie_xorg'); + $nbMissmatchingPromos += $res->total(); + $page->assign('nbMissmatchingPromos2', $res->total()); + $page->assign('missmatchingPromos2', $res); + $page->assign('nbMissmatchingPromos', $nbMissmatchingPromos); + } +} + +// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:?> diff --git a/modules/fusionax/Activites.sql b/modules/fusionax/Activites.sql new file mode 100644 index 0000000..33ddbdc --- /dev/null +++ b/modules/fusionax/Activites.sql @@ -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 index 0000000..23af228 --- /dev/null +++ b/modules/fusionax/Adresses.sql @@ -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 index 0000000..7964f43 --- /dev/null +++ b/modules/fusionax/Anciens.sql @@ -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 index 0000000..a14ccd1 --- /dev/null +++ b/modules/fusionax/Entreprises.sql @@ -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 index 0000000..c2b09f6 --- /dev/null +++ b/modules/fusionax/Formations.sql @@ -0,0 +1,20 @@ +-- Import complet des formations + +DROP TABLE IF EXISTS `fusionax_formations`; + +CREATE TABLE IF NOT EXISTS `fusionax_formations` ( + FO CHAR(2) NOT NULL COMMENT 'Vaut toujours FO pour cette table', + id_ancien VARCHAR(8) NOT NULL COMMENT 'Id unique de l''ancien', + Intitule_diplome VARCHAR(60) collate utf8_general_ci NOT NULL COMMENT 'Intitulé du diplôme', + Intitule_formation VARCHAR(60) collate utf8_general_ci NOT NULL COMMENT 'Intitulé de la formation', + Descr_formation VARCHAR(60) collate utf8_general_ci NOT NULL COMMENT 'Description de la formation', + tmp_1 VARCHAR(60) collate utf8_general_ci NOT NULL, + tmp_2 VARCHAR(60) collate utf8_general_ci NOT NULL, + tmp_3 VARCHAR(60) collate utf8_general_ci NOT NULL, + tmp_4 VARCHAR(60) collate utf8_general_ci NOT NULL, + PRIMARY KEY (id_ancien, Intitule_diplome, Intitule_formation) +) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci; + + LOAD DATA LOCAL INFILE 'Formations.txt' + INTO TABLE fusionax_formations +FIELDS TERMINATED BY '\t' LINES TERMINATED BY '\r\n' (FO, id_ancien, Intitule_diplome, Intitule_formation, Descr_formation, tmp_1, tmp_2, tmp_3, tmp_4); diff --git a/modules/fusionax/formation.pl b/modules/fusionax/formation.pl new file mode 100755 index 0000000..3ee392a --- /dev/null +++ b/modules/fusionax/formation.pl @@ -0,0 +1,1289 @@ +#!/usr/bin/perl +use utf8; +open(FILE, "<:encoding(UTF-8)", "Formations.txt") || die ("Erreur d'ouverture"); +open(OUT, ">:encoding(UTF-8)", "Formations_out.txt") || die ("Erreur d'ouverture"); + +while () +{ + # On enlève les dates de mises à jour + s/..\/..\/..../\t/; + s/..\/..\/../\t/; + + s/\(//; + s/\)//; + s/3È Cycle//g; + s/3e cycle//g; + s/3e Cycle//g; + s/3È Cycle//g; + s/3ÈCycle//g; + s/3ÈCycle//g; + s/3ème cycle//g; + s/Master Chem\.Eng\.//g; + s/civ\.//g; + s/Civ\.//g; + s/ en / /g; + s/ ès / /g; + s/d'Etat//g; + s/ d'/ /g; + s/ de l'/ /g; + s/ de / /g; + s/Univ //g; + s/Univ\.//g; + + # On enlève les fiches tordues de l'AX qui sont plus complètes chez nous et on modifie les lignes chiantes + s/FO\t19850253\tDEA Sciences et Techniques Environnement Créteil//; + s/FO\t19770064\tBiologie Moléculaire//; + s/FO\t19520093\tBT//; + s/FO\t19960133\tEngineering Management Certificate//; + s/FO\t19560013\tIng I\.E\.G\.//; + s/FO\t19780033\tMécanique des Transfert//; + s/FO\t19920017\tDEA\+ Thèse Doctorat Pharmacochimie moléculaire//; + s/FO\t20010319\tM\.Sc\.in applied Mathematics//; + s/FO\t19660131\tMS Schenectady NY/FO\t19660131\tMSc\tNYU/; + s/FO\t19870204\tENS/FO\t19870204\tDEA\tENS Ulm/; + s/FO\t19910162\tDESS CAAE IAE/FO\t19910162\tDESS\tIAE de Paris/; + s/FO\t19950283\tDESS CAAE MBA/FO\t19950283\tMBA\tIAE de Paris/; + s/FO\t20020411\tME : Madrid/FO\t20020411\tME\tUPM/; + s/FO\t19910255\tDoct Physique Solide Paris XI/FO\t19910255\tPhD\tParis-Sud\tPhysique des solides/; + s/FO\t19890053\tDoct. de Physique Univ.Paris XI/FO\t19890053\tPhD\tParis-Sud\tPhysique/; + s/FO\t19890248\tPh.D Physique Paris XI/FO\t19890248\tPhD\tParis-Sud\tPhysique/; + s/FO\t19580112\tDESGE Lyon III/FO\t19580112\tDipl.\tUniversité Jean-Moulin/; + + # Modifications sur une ligne complète + s/IHEDN-CHEAR\t/IHEDN/; + s/CHEBAP/Ing.\tCHEC\tCHEBAP (Centre des Hautes Etudes du Béton Armé et Précontraint)/; + s/Escuela Sup\. Ing\. Caminos Canales y Puertos/Dipl.\tUPM/; + s/MS "Technology & Policy" MIT/MSc\tMIT/; + s/MS&E Stanford/MSc\tStanford/; + s/Engineering Management Cert.\t//; + s/Etudes sup\. Comptables & Financières\t//; + + # On enlève les professions + s/Adm\. HC\t//; + s/Prof\. ENSMP\t//; + s/Prés\.hon.Colonie Fr\.du Caire\t//; + s/Anc\. Avocat au Bareau Toulon\t//; + s/Insp\.gén\.hon\.CEA\t//; + s/Insp\.Gén\.CRdes Aff\.d'O\.M\.\t//; + s/Prof Emérite Gén\. Méca\.\t//; + s/Prof\.Hon\.Sup\.Aéro\t//; + s/Anc\.DG Dassault Aviation\t//; + s/Prof\.des Universités\t//; + s/Direct\.Hon.BNP\t//; + s/Prof\. hon\. Bordeaux I\t//; + s/Architecte DPLG\t//; + s/Conseiller Commercial hors classe\t//; + s/Professeur des Universités\t//; + s/Gestalt praticien\t//; + s/Adm\.\t//; + s/Psychologue Clinicien\t//; + s/Inspecteur des Finances\t//; + s/Don religion\t//; + s/Prof\. ENSMP\t//; + s/Pilote militaire Hélicoptère\t//; + s/Ing\. Navigant Essais Hélicoptère\t//; + s/Analyste SFAF\t//; + s/European Patent Attorney\t//; + s/Pilotage militaire\t//; + s/Mandataire agrée OEB\t//; + s/Chartered Financial Analyst\t//; + s/Pilote chasse\t//; + s/Avocat au Barreau Paris\t//; + s/Prof\.\t//; + s/EURATOM\t//; + + # On enlève les sigles inconnus + s/Baccalauréat canonique\t//; + s/BEL\t//; + s/BEMS\t//; + s/BESG\t//; + s/Brth\t//; + s/BT\t//; + s/CES Informatique\t//; + s/CESDR\t//; + s/CFAF\t//; + s/CHEA\t//; + s/CHEAR\t//; + s/CHEE&DD Session 9\t//; + s/CESB\t//; + s/CESSID\t//; + s/CNAM\t//; + s/Collège des Sciences Soc\. et Eco\.\t//; + s/CRC\t//; + s/CSCP\t//; + s/CSME Session 29\t//; + s/D\.E\.M\.\t//; + s/DECF\t//; + s/DECS\t//; + s/DESA//; + s/DIUUP\t//; + s/DRES Sciences\t//; + s/DSN\t//; + s/DT\t//; + s/EATG\t//; + s/EERN//; + s/Ecole Chasse\t//; + s/ENS Armement\t//; + s/ENSGM\t//; + s/ENSME\t//; + s/ESMIM Nancy\t//; + s/ESO\t//; + s/ETS II\t//; + s/Fla USA\t//; + s/IAC\t//; + s/IAF\t//; + s/ICAF Washington\t//; + s/ICG\t//; + s/IESTO\t//; + s/IGP Bordeaux\t//; + s/Inst\. Auguste Comte\t//; + s/Institut Auguste Comte\t//; + s/Institut Auguste Comte IAC\t//; + s/Institut Contrôle Gestion//; + s/ISNSE Argunne National Laboratory USA\t//; + s/FRM\t//; + s/MITI Japon\t//; + s/MRM\t//; + s/Pasadena//; + s/React\. School Harwell\t//; + s/SFAF\t//; + s/SFAF CIIA\t//; + s/SM Management\t//; + s/Univer\. Ecolo\. Tropic\.//; + + # On adapte les diplômes bien placés + s/Ing\./Ing.\t/; + s/Licenci./Lic.\t/; + s/Licence/Lic.\t/; + s/Lic\./Lic.\t/; + s/Deug/DEUG\t/; + s/DEUG/DEUG\t/; + s/Dipl.me/Dipl.\t/; + s/Dipl\./Dipl.\t/; + s/Anc\.El\./Dipl.\t/; + s/DU/Dipl.\t/; + s/Agr\./Agr.\t/; + s/Agr.g. d.Univers\./Agr.\t/; + s/Agrégée/Agr.\t/; + s/Agr.g./Agr.\t/; + s/Certifi./CAPES\t/; + s/Cert\./CAPES\t/; + s/CAPES/CAPES\t/; + s/DESCF/DESCF\t/; + s/DES\./DESS\t/; + s/DES\t/DESS\t/; + s/DES /DESS\t/; + s/DESS/DESS\t/; + s/DEA/DEA\t/; + s/Doctorat/PhD\t/; + s/Docteur/PhD\t/; + s/Doct\./PhD\t/; + s/Doct/PhD\t/; + s/Ph\.D/PhD\t/; + s/PhD/PhD\t/; + s/Ph D/PhD\t/; + s/Dr\./PhD\t/; + s/Doc\./PhD\t/; + s/Th.se/PhD\t/; + s/doctorat oncogénèse/PhD\t/; + s/HDR/HDR\t/; + s/HdR/HDR\t/; + s/Habil\. Dir\.Recherche/HDR\t/; + s/Habilitation à diriger les recherches/HDR\t/; + s/Habilitation à Diriger des Recherche/HDR\t/; + s/Habilitation à diriger des Recherches/HDR\t/; + s/Habilitation à diriger des Rech\./HDR\t/; + s/Habilitation à diriger des recherches/HDR\t/; + s/Habilitation U\./HDR\t/; + s/Habilitation/HDR\t/; + s/Habil\./HDR\t/; + s/Habilité à la dir\. rech\./HDR\t/; + s/MSUCLA/MSc\tUCLA/; + s/MSc /MSc\t/; + s/MS /MSc\t/; + s/MS\t/MSc\t/; + s/MS\./MSc\t/; + s/M\.Sc\./MSc\t/; + s/M\.Sc/MSc\t/; + s/M\. Sc\./MSc\t/; + s/Master of Sciences/MSc\t/; + s/Master of Science/MSc\t/; + s/Masters of Sciences/MSc\t/; + s/Master Urbanisme/MUP\t/; + s/MCityPlann/MUP\t/; + s/MCP/MUP\t/; + s/MUP/MUP\t/; + s/Executive MBA/MBA/; + s/EMBA/MBA/; + s/MBA/MBA\t/; + s/BTS/BTS\t/; + s/M\. A\./MA\t/; + s/M\.A\./MA\t/; + s/\tMA/\tMA\t/; + s/Executive MA/MA\t/; + s/ME/ME\t/; + s/M\.Eco\.Agric\./MEE\t/; + s/M\.Eco\./ME\t/; + s/M\. Eng\./MEng\t/; + s/Master Ing\./MEng\t/; + s/Masters of Electrical Engineering/MEE\t/; + s/MEE/MEE\t/; + s/MSEE/MEE\t/; + s/Ma.trise/Maîtr.\t/; + s/Ma.tre/Maîtr.\t/; + s/Mphil/MPhil\t/; + s/M\.Phil\./MPhil\t/; + s/MPhil/MPhil\t/; + s/MPA/MPA\t/; + s/MCP/MCP\t/; + s/Master Electronique/MEl\t/; + s/MEl/MEl\t/; + s/Master Management par les comp.tences et organisations/MM\t/; + s/Master of Management/MM\t/; + s/Management Paris/\tManagement/; + s/DDI/Dipl.\t/; + s/3.me Cycle Fac\./Dipl.\t/; + s/MIB/MIB\t/; + s/Master of Eng in Manufacturing/MEM\t/; + s/Master Engin.Science/MEng\t/; + s/BA /BA\t/; + s/Post Doc//; + s/Post PhD//; + s/Auditeur/Dipl.\t/; + s/Dr Phys\.chim\.biotransformation/PhD\t\tPhysique, chimie, biotransformation/; + + # On nettoye les tab en trop et les ponctutions inutiles + s/\t\t\t/\t/g; + s/\t\t/\t/g; + s/\t,/\t/g; + s/\t-/\t/g; + s/\t:/\t/g; + s/\t\./\t/g; + s/(\t)( )+/\t/g; + s/\ten /\t/g; + s/\tin /\t/g; + s/\tès /\t/g; + s/\tof /\t/g; + s/( )+(\t)/\t/g; + + + # On remet dans l'ordre lorsque le diplôme se situe après l'université + s/Manag\.Vanderblit/Vanderbilt University\tManagement/; + s/AMHERST MA/MA\tAmherst College/; + s/Executive Education, Harvard \tBusiness School/MBA\tHarvard/; + s/Harvard MPA/MPA\tHarvard/; + s/Harvard MA/MA\tHarvard/; + s/Advanced Manag\. Program Harvard/Harvard/; + s/DEA : ENS/DEA\tENS Ulm/; + s/ENS Ulm DEA/DEA\tENS Ulm/; + s/ENS Ulm :DEA/DEA\tENS Ulm/; + s/ENS Ulm : DEA/DEA\tENS Ulm/; + s/ENS Ulm : PhD/PhD\tENS Ulm/; + s/ENS Ulm/MSc\tENS Ulm/; + s/Ecole Normale Sup.Ulm/MSc\tENS Ulm/; + s/\tENS\t/\tENS Ulm/; + s/Moscow : ME/ME\tBauman MSTU/; + s/Supoptique : Ing\./Ing.\tSupOptique/; + s/EP Montr.al Ing\./Ing.\tEPM/; + s/EP Montr.al Ing/Ing.\tEPM/; + s/EP Montr.al MSc/MSc\tEPM/; + s/EP Montr.al MS/MSc\tEPM/; + s/MsChicago/MSc\tUniversity of Chicago/; + s/Sciences Po/Sciences Po\t/; + s/IEP DEA/DEA\tSciences Po/; + s/Master AMUR/MUP\tPonts\tMastère AMUR/; + s/Master CAR/MSc\tTélécom\tMastère CAR/; + s/Mastère SSIR ENST/MSc\tTélécom\tMastère SSIR/; + s/KTH Stockholm Master Mech. Eng./MME\tKTH/; + s/ESCP-EAP Executive MSc/MSc\tESCP-EAP/; + s/Biologie Paris VI/Paris VI\tBiologie/; + s/HEC : MS/MSc\tHEC/; + s/HEC : MA/MA\tHEC/; + s/HEC : MBA/MBA\tHEC/; + s/Master HEC Entrepreneurs/ME\tHEC\tHEC-Entrepreneurs /; + s/HEC-Entrepreneurs/ME\tHEC\tHEC-Entrepreneurs /; + s/Master HEC Finance/ME\tHEC/; + s/Strategic Management HEC/HEC\tStrategic Management/; + s/Marketing HEC/HEC\tMarketing/; + s/Economie EHESS-ENSAE/EHESS\tÉconomie/; + s/EHESS : PhD/PhD\tEHESS/; + s/EHESS DEA/DEA\tEHESS/; + s/EHESS Phd/PhD\tEHESS/; + s/ESSEC Mast.re Tehniques Financi.res/ME\tESSEC\tMastère Techniques Financières/; + s/ESSEC : MA/MA\tESSEC/; + s/ESSEC-MANNHEIM/ESSEC/; + s/ESSEC : MBA/MBA\tESSEC/; + s/M.decine : Dipl\./Dipl.\tMédecine/; + s/Sup.A.ro\. : PhD/PhD\tSUPAERO/; + s/INSEAD : MA/MA\tINSEAD/; + s/INSEAD : MBA/MBA\tINSEAD/; + s/TU Berlin :ME/ME\tTU Berlin/; + s/Mast.re Am.nagement et Ma.tr./MUP\t\tMastère Aménagement et Maîtr./; + s/Master Droit des affaires Int. & Eur./MIB\t\tMaster Droit des affaires Int. & Eur./; + s/Finance LSE/LSE\tFinance/; + s/Finance London Business School/London Business School\tFinance/; + s/Chimie Organique ENSTA/ENSTA\tChimie organique/; + s/Informatique Stanford/Stanford\tInformatique/; + + # On normalise les universités + s/Dipl ISUP\t/Dipl.\tUMPC\t/; + s/ISUP\t/Dipl.\tUMPC\t/; + s/DESIA\t/Dipl.\tSUPAERO\t/; + s/IHESI\t/Dipl.\tINHES\t/; + s/Ctre Form\.Journaliste\t/Dipl.\tCFJ\t/; + s/Collège InterArmées Défense\t/Dipl.\tCollège Interarmées de Défense\t/; + s/AFITEP\t/Dipl.\tAFITEP\t/; + s/CEDEP cycle 43\t/CEDEP\t/; + s/CEDEP\t/Dipl.\tCEDEP\t/; + s/Bocconi University Milan/Dipl.\tUniversità Bocconi/; + s/Columbia\t/Columbia University\t/; + s/EMP Columbia Bus\.School\./Dipl.\tColumbia University/; + s/Columbia & sciences Po/Columbia University/; + s/Columbia \+ LBS/Columbia University/; + s/Columbia University & sciences Po/Columbia University/; + s/Columbia University + LBS/Columbia University/; + s/CESS ENSAÉ/Dipl.\tENSAE/; + s/EAPB Ecole Architecture Paris Belleville/Dipl.\tENSAPB/; + s/EDP\/INSEAD/Dipl.\tINSEAD/; + s/PSD INSEAD/Dipl.\tINSEAD/; + s/INSEAD/Dipl.\tINSEAD/; + s/EDP\/INSEAD/Dipl.\tINSEAD/; + s/INSEAD/Dipl.\tINSEAD/; + s/PSD INSEAD/Dipl.\tINSEAD\tProgramme Supérieur pour Dirigeants/; + s/INSEAD - AMP/Dipl.\tINSEAD/; + s/INSEAD Executive Program/Dipl.\tINSEAD/; + s/IMI Harvard/Dipl.\tHarvard/; + s/Advanced Manag\. Program Harvard/MBA\tHarvard/; + s/Harvard Business Sch\. Alumnus/Dipl.\tHarvard/; + s/Executive Education, Harvard Business School/Dipl.\tHarvard/; + s/Harvard/Dipl.\tHarvard/; + s/Havard/Harvard/; + s/M\. Eng Cornell University/MEng\tCornell/; + s/Cornell Ithaca/Cornell/; + s/Cornell NY/Cornell/; + s/NY\t/NYU\t/; + s/New-York/NYU/; + s/New York University/NYU/; + s/New York/NYU/; + s/MS Politecnico di Milano/MSc\tPolitecnico di Milano/; + s/\tMilano/\tPolitecnico di Milano/; + s/Computer Sc\.MIT/MIT\tComputer science/; + s/Techno\.Policy MIT/MIT\tTechno. Policy/; + s/NA MIT/MA\tMIT/; + s/MIT/Dipl.\tMIT\t/; + s/MIT Chemical Engineering/MCE\tMIT/; + s/Massuchusetts Institute of Technology/MIT/; + s/Massachusetts Institute of Technologie/MIT/; + s/Massachusetts Institute of Techn\./MIT/; + s/Massachusetts Inst\. of Technology/MIT/; + s/Massachusetts Inst of Tech/MIT/; + s/Massachusetts/MIT/; + s/Msc\.Massachus\./MIT/; + s/Sup.A.ro./Ing.\tSUPAERO/; + s/Sup.A.ro.\/KTH/Ing.\tSUPAERO/; + s/Aéro\./SUPAERO/; + s/SUPAEROAstro &EECS/SUPAERO/; + s/SUPAERO\/KTH/SUPAERO/; + s/Syracuse USA/Dipl.\tSU/; + s/EHESS/Dipl.\tEHESS/; + s/IHEDN/Dipl.\tIHEDN/; + s/IHEDN 26° session/Dipl.\tIHEDN/; + s/Business School Dartmouth/Dipl.\tDartmouth College /; + s/ENSAE/Dipl.\tENSAE/; + s/ENSAE Statisticien économiste/Dipl.\tENSAE/; + s/ENSAE Malakoff/Dipl.\tENSAE/; + s/\tIllinois\t/\tUniversity of Illinois\t/; + s/University of Illinois/Dipl.\tUniversity of Illinois/; + s/CEPE/Dipl.\tCEPE/; + s/CEPE Ecole Pratique des Hautes Etudes/Dipl.\tCEPE/; + s/ECE/Ing.\tECE/; + s/Ecole Centrale d’Electronique ECE/Ing.\tECE/; + s/Science Stanford/Stanford\tSience/; + s/Econom\.Stanford/Stanford\tÉconomie/; + s/Electrical Eng Stanford/Stanford\tElectrical engineering/; + s/Management a Stanford/Stanford\tManagement/; + s/SEP Stanford/Dipl.\Stanford/; + s/Stanford SEP/Dipl.\tStanford/; + s/Stanford/Dipl.\tStanford/; + s/Stanford Executive Program/Dipl.\tStanford/; + s/Stanford University/Dipl.\tStanford/; + s/Stanford /Stanford\t/; + s/Sc\.Po\. Paris/Dipl.\tSciences Po\t/; + s/Sc\.Po\. Economie/Dipl.\tSciences Po\t/; + s/Sc\.Po\. Gestion et Strat.gie des Entreprises/Dipl.\tSciences Po\tGestion et Stratégie des Entreprises/; + s/Sc\.Po\./Dipl.\tSciences Po/; + s/Lauréat IEP/Dipl.\tSciences Po/; + s/IEP Paris Lic\./Dipl.\tSciences Po/; + s/IEP Paris/Dipl.\tSciences Po/; + s/IEP/Dipl.\tSciences Po/; + s/Auditeur Sc\.Politique/Dipl.\tSciences Po\t/; + s/Sciences politiques/Sciences Po/; + s/Sc\.Politique/Sciences Po/; + s/IAE Paris/MBA\tIAE de Paris/; + s/\tIAE\t/\tMBA\tIAE de Paris\t/; + s/EPNER/Dipl.\tEPNER/; + s/ENSAR/Ing.\tENSAR/; + s/Uc.Berkeley/Berkeley/; + s/UC Berkeley/Dipl.\tBerkeley/; + s/CEIPI/Dipl.\tCEIPI/; + s/Institute for Management Development/IMD/; + s/\tLausanne/\tUNIL/; + s/IMD Lausanne/Dipl.\tUNIL/; + s/EP F.d.ration Lausanne/Dipl.\tEPFL/; + s/EP F.d.rale Lausanne/Dipl.\tEPFL/; + s/cycle postgrade EPFL option Finance/Dipl.\tEPFL\toption Finance/; + s/Ecol\. Poly\. F.d.rale Lausanne/Dipl.\tEPFL/; + s/EP F.d.rale Lausanne/Dipl.\tEPFL/; + s/EPFL G.nie Mécanique/Dipl.\tEPFL\tGénie Mécanique/; + s/EP F.d.rale Lausane/Dipl.\tEPFL/; + s/Ecole Polytechnique Lausanne/EPFL/; + s/ISMCM Saint-Ouen/Dipl.\tISMCM Saint-Ouen/; + s/ISCM/ISMCM Saint-Ouen/; + s/ENAC/Dipl.\tENAC/; + s/HEC\/Ucla/HEC/; + s/Mast.re Gestion Financi.re HEC/ME\tHEC\tMastère Gestion Financière/; + s/\tHEC/\tDipl.\tHEC/; + s/CPA-HEC/HEC/; + s/HEC Master Gestion du Changement/ME\tHEC\tMaster Gestion du Changement/; + s/HEC Execut\. Management \/ CPA/Dipl.\tHEC/; + s/HEC Majeure Finance/Dipl.\tHEC\tMajeure Finance/; + s/CESA Achats HEC Management/Dipl.\tHEC/; + s/HEC Entrepreneurs/Dipl.\tHEC/; + s/HECc/HEC/; + s/HEC\/CPA/HEC/; + s/HEC Start\. Management/HEC\tStart. Management/; + s/HEC Finance/HEC\tFinance/; + s/Centre des Hautes Etudes la Construction/Ing.\tCHEC/; + s/CHEC/Ing.\tCHEC/; + s/Ecole Air/Dipl.\tÉcole de l\'Air/; + s/EAVT/Dipl.\tEAVT/; + s/EAVT Ecole architecture Marne La Vall.e/Dipl.\tEAVT/; + s/Master ENPC Action publique/M\tPonts\tMaster Action publique/; + s/ENPC/Ing.\tPonts/; + s/Master P\.C\./MSc\tPonts/; + s/P\.C\./Ponts\t/; + s/EAPLV Ecole Architecture Paris La Villette/Dipl.\tENSAPLV/; + s/EAPLV/Dipl.\tENSAPLV/; + s/Cambridge Profic\./Dipl.\tCambridge/; + s/London Business School/Dipl.\tLondon Business School/; + s/ENSIC/Dipl.\tENSIC/; + s/ENSIC Nancy/Ing.\tENSIC/; + s/Internat\. Teachers Progr./Dipl.\tITP/; + s/Institut Sup.rieur des Affaires/Dipl.\tISA/; + s/ISA/Dipl.\tISA/; + s/ISAA/Dipl.\tISAA/; + s/ENSCP/Ing.\tChimie Paris/; + s/Engineer Kentucky/Ing.\tUK/; + s/EP Gda.sk Pologne/Dipl.\tUniwersytet Gdański/; + s/ESPCI/Ing.\tESPCI/; + s/ESPCI Ecole Sup\. Phys\. et Chimie Industrielles/Ing.\tESPCI/; + s/ESG/Dipl.\tESG Paris/; + s/ESSEC Management g.n.ral/Dipl.\tESSEC/; + s/ESSEC/Dipl.\tESSEC/; + s/Ecole Nat. Eaux et For.t Nancy/Ing.\tENGREF/; + s/Sc\. environnement ENGREF/ENGREF\tSciences environnementales/; + s/\tGREF/\tENGREF/; + s/du Québec à Montréal/UQÀM/; + s/EP Montréal/Dipl.\tEPM/; + s/Mast\.Biotechnology Montréal/MB\tEPM/; + s/Montréal/EPM/; + s/Québec/UQÀM/; + s/Ec\.Polyt\.Montreal/EPM/; + s/Actuaire/Dipl.\tInstitut des Actuaires/; + s/Actuaire IAF-CEA/Dipl.\tInstitut des Actuaires/; + s/Actuaire IAF/Dipl.\tInstitut des Actuaires/; + s/Actuaire CEA/Dipl.\tInstitut des Actuaires/; + s/Actuariat-Iaf/Dipl.\tInstitut des Actuaires/; + s/Actuaire qualifi./Dipl.\tInstitut des Actuaires/; + s/Institut des Actuaires qualifié/Institut des Actuaires/; + s/Institut des Actuaires IAF-/Institut des Actuaires/; + s/STEGE MGT GENERAL ESCP-EAP/Dipl.\tESCP-EAP/; + s/ESCP-EAP/Dipl.\tESCP-EAP/; + s/\tESCP\t/\tESCP-EAP\t/; + s/IHEE/Dipl.\tIHEE/; + s/ENS G.ographiques/Corps\tGéographes/; + s/Ecole Nat. des Sc. G.ographiques/Corps\tGéographes/; + s/ENST Bretagne/Ing.\tTélécom Bretagne/; + s/Collède des Ing\./CDI/; + s/Collège des Ing\./CDI/; + s/Collège Ing\./CDI/; + s/Collèges des Ing\./CDI/; + s/Collège des Ingénieurs/CDI/; + s/CDI/Dipl.\tCDI/; + s/Ecole Nationale la Magistrature/Dipl.\tENM/; + s/ENSTA/Ing.\tENSTA/; + s/\tGM\t/\tENSTA\t/; + s/ENSP Versailles/Dipl.\tENSP/; + s/ENSP/Dipl.\tENSP/; + s/Investment Banking Program-Kellog School of Management/Dipl.\tKellogg/; + s/IFSBM/Dipl.\tIFSBM/; + s/Inst\.Form\. Sup\.Biom.dicale/Dipl.\tIFSBM/; + s/EMA/Ing.\tEMA/; + s/Ecole Supérieure Electricité/Ing.\tSupélec/; + s/ESE/Ing.\tSupélec/; + s/Supelec 86 - MBA/Supélec/; + s/UCSD/Dipl.\tUCSD\t/; + s/UC San Diego/UCSD/; + s/San Diego/UCSD/; + s/California UCSD/UCSD/; + s/ENSAM/Ing.\tENSAM/; + s/Arts et Métiers/ENSAM/; + s/IFFI/ENSAM\tIFFI/; + s/USMC Command & Staff College/MSc\tMCU/; + s/University Coll.Londres/Dipl.\tUCL/; + s/TU Munich/TU München/; + s/TU M.nchen/Dipl.\tTU München/; + s/\tMünchen/\tTU München/; + s/\tM\.\t/\tMines\t/; + s/Mines Paris/Mines/; + s/ENSMP/Ing.\tMines/; + s/ISIGE/Mines\tISIGE/; + s/LSE/Dipl.\tLSE/; + s/London School Econ\.& Polit\. Sc\./LSE/; + s/London School Economics/LSE/; + s/London School of Eco\./LSE/; + s/London School of Econ\./LSE/; + s/London School of Economics/LSE/; + s/Lonson School of Economics/LSE/; + s/Chartered Institute of Management Accountant/M\tCIMA/; + s/CFA/Dipl.\tCFA Institute/; + s/INAPG/Ing.\tINAPG/; + s/Agronome/Ing.\tINAPG/; + s/Agro/Ing.\tINAPG/; + s/INA PG/INAPG/; + s/Naval Postgraduate School/Dipl.\tNPS/; + s/ENSSEIHT Informatique/Ing.\tENSEEIHT/; + s/ENSEEIHT/Ing.\tENSEEIHT/; + s/ENSEEIHT Toulouse/ENSEEIHT/; + s/ENA/Dipl.\tENA/; + s/Colorado\t/Colorado School of Mines/; + s/Colorado Scholl of MInes/Dipl.\tColorado School of Mines/; + s/Colorado school of Mines/Dipl.\tColorado School of Mines/; + s/Ing RWTH-Aachen/Ing.\tRWTH/; + s/Ing RWTH-Aachen/Ing.\tRWTH/; + s/RWTH Aachen/Dipl.\tRWTH/; + s/TH Aachen/RWTH/; + s/RWTH-Aachen/RWTH/; + s/Th Aachen/RWTH/; + s/UCLA\t/Dipl.\tUCLA\t/; + s/Computer Sc\.Ucla/UCLA/; + s/UCLA Anderson/UCLA/; + s/Los Angeles/UCLA/; + s/Royal College of Art Londres/Dipl.\tRCA/; + s/Royal College of Art Londres /Dipl.\tRCA/; + s/de Caminos Madrid/UPM/; + s/Ingeniero Industrial UPM Madrid/Ing.\tUPM/; + s/ETSII Madrid/Dipl.\tUPM/; + s/Madrid/Dipl.\tUPM/; + s/ENS Cachan/Dipl.\tENS Cachan/; + s/\tCachan/\tENS Cachan/; + s/ENS CACHAN/ENS Cachan/; + s/ENS Cachan Math Appliquée/ENS Cachan\tMathématiques appliquées/; + s/Collège Europe Natolin Varsovie/Dipl.\tCollege of Europe/; + s/Collège Europ\.Bruges/\tCollege of Europe/; + s/New South Wales Sydney Australia/UNSW/; + s/New South Wales Sydney Austr\./UNSW/; + s/New South Wales/UNSW/; + s/Master of Env. Engin. Science UNSW Sydney/MEE\tUNSW/; + s/S Sydney/UNSW/; + s/Design UNSW/UNSW\tDesign/; + s/Interne Chirurgie/Dipl.\tMédecine/; + s/X-HEC/X\t/; + s/X Chimie Orga/X\tChimie organique/; + s/X Physique/Physique/; + s/X Math app\./Mathématiques appliquées/; + s/Chimie Ec\. Polyt\./X\tChimie/; + s/Master X Projet-Innovation-Conception/MSc\tX\tMaster X Projet-Innovation-Conception/; + s/Master PIC/M\tX\tMaster PIC/; + s/Ec\. Polyt\./X\t/; + s/Supoptique/Ing.\tSupOptique/; + s/Universiteit/Universiteit Leiden/; + s/\tLeiden/\tDipl.\tUniversiteit Leiden/; + s/Phys.Théor. ENS Lyon/ENS Lyon\tPhysique théorique/; + s/ENS Lyon/Dipl.\tENS Lyon/; + s/- U of Michigan/Michigan/; + s/Eng Birmingham/University of Birmingham/; + s/Imperial Collège/Imperial College/; + s/Advanced Mechanical Engin\. , Imperial College Londres/Imperial College\tAdvanced mechanical engineering/; + s/Imperial College GB/Imperial College/; + s/Boulder/CU/; + s/Californie Institute of Technology/CalTech/; + s/CIT/CalTech/; + s/Carnegie Mellon/CMU/; + s/Comput\.Carnégie Mellon Univ/CMU/; + s/Caroline du Nord Chapel Hill/Carolina/; + s/Ctre Perf\. aux Affaires/CPA de Paris/; + s/Centre Perfect\. aux Affaires/CPA de Paris/; + s/Centre Perfection\. aux Affaires/CPA de Paris/; + s/CPA\t/MBA\tCPA de Paris/; + s/CPA 73\/2\t/MBA\tCPA de Paris/; + s/CPA Lyon\t/MBA\tCPA de Lyon/; + s/CPA Nord\t/MBA\tCPA du Nord/; + s/\tChicago/\tUniversity of Chicago/; + s/Econom\.Chicago/University of Chicago\tÉconomie/; + s/Cleveland/CSU/; + s/Architect\.Univers\.Rome/University of Rome\tArchitecture/; + s/d'University of Rome/University of Rome/; + s/\tUC Davis/\tUC Davis/; + s/\tDavis/\tUC Davis/; + s/University of California/UCSB/; + s/Université Tokyo/Todai/; + s/Tokyo/Todai/; + s/Université Stuttgart/Universität Stuttgart/; + s/\tStuttgart\t/\tUniversität Stuttgart\t/; + s/diplomé Fac\. Aéronautique Stuttgart/Universität Stuttgart\tAéronautique/; + s/Zürich/Universität Zürich/; + s/Zurich/Universität Zürich/; + s/Ec\.Polyt\.Universität Zürich/ETH Zürich/; + s/Yale/Yale\t/; + s/Wisconsin-Madison/UW-Madison/; + s/Wisconsin USA/UW-Madison/; + s/Wisconsin/UW-Madison/; + s/Wharton/The Wharton School/; + s/Pennsylvania The Wharton School/The Wharton School/; + s/Pennsylvania\t/University of Pennsylvania\t/; + s/Washington/University of Washington/; + s/Urbana/Urbana University/; + s/Stat\.Texas A&M/TAMU/; + s/Texas A&M/TAMU/; + s/TAMU University/TAMU/; + s/Austin/UT Austin/; + s/Texas/UT Austin/; + s/UBC Canada/UBC/; + s/Torino/UNITO/; + s/Téléc\./Télécom/; + s/ENST\t/Télécom\t/; + s/ENST licencié sciences économiques/Télécom\tLicenci sciences économiques/; + s/Southampton/University of Southampton/; + s/Nat\. of Singapore/NUS/; + s/Singapour/NUS/; + s/Kyoto/Kyoto University/; + s/Karlsruhe/Universität Karlsruhe/; + s/Johns Hopkins/JHU/; + s/Sheffield/University of Sheffield/; + s/Santa Barbara/UCSB/; + s/Salt Lake City/University of Utah/; + s/Rotterdam School of Management/RSM/; + s/Queen's Canada/Queen's/; + s/Purdue/Purdue University/; + s/Pompeu Fabra/UPF/; + s/Polytech\. Bucarest/Universitatea Politehnica din Bucureşti/; + s/Petroleum Engineering - TU Delft/TU Delft\tPetroleum engineering/; + s/Paris Paris-Diderot/Paris-Diderot/; + s/Watson School of Biological/WSBS/; + s/Ottawa/OU/; + s/Northwestern University/NU/; + s/Northwestern/NU/; + s/N\.Dame Indiana/Notre Dame/; + s/Moscow/MGU/; + s/Mc Gill University/McGill/; + s/Maryland/UMCP/; + s/Iowa/University of Iowa /; + s/Institut Polytechnique Grenoble/Grenoble INP/; + s/INPG/Grenoble INP/; + s/INPL Institut National Polytechnique Lorraine/INPL/; + s/INP Toulouse/INP Toulouse\t/; + s/IHM INPT/INP Toulouse\tIHM/; + s/ENSPM/ENSPM\t/; + s/IFP/ENSPM/; + s/Houston/UH/; + s/Georgia\t/UGA\t/; + s/Finance Princeton/Princeton\tFinance/; + s/Elect\.Engineer\.Princeton/Princeton\tElectrical engineering/; + s/ENSHG/ENSHMG/; + s/Dallas/University of Dallas/; + s/British Columbia University/UBC/; + + s/\tSorbonne\t/\tPanthéon-Sorbonne\t/; + s/\t1\t/\tPanthéon-Sorbonne\t/; + s/Finance Paris I/Panthéon-Sorbonne\tFinance/; + s/Sc.Eco. Paris 1/Panthéon-Sorbonne\tSciences économiques/; + s/CAAE \. Paris I/Panthéon-Sorbonne/; + s/Paris 1er/Panthéon-Sorbonne/; + s/Paris 1 Modélisation Econ\.& Fin\./Panthéon-Sorbonne\tModélisation économie et finance/; + s/Paris 1\t/Panthéon-Sorbonne\t/; + s/Philo\.Paris I/Panthéon-Sorbonne\tPhilosophie/; + s/Paris I\t/Panthéon-Sorbonne\t/; + s/Droit Paris 2/Assas\tDroit/; + s/Paris 2/Assas/; + s/Paris II Panthéon - Assas/Assas/; + s/Paris II Panthéon/Assas/; + s/Paris-Sorbonne/Paris-Sorbonne\t/; + s/Philosophie Paris IV Sorbonne/Paris-Sorbonne\tPhilosophie/; + s/Paris 4/Paris-Sorbonne/; + s/Paris IV/Paris-Sorbonne\t/; + s/Paris 5/Paris-Descartes/; + s/Paris V\t/Paris-Descartes\t/; + s/Université Paris V/Paris-Descartes/; + s/UMPC/UMPC\t/; + s/et Habil\. à diriger les Rech\. Paris 6/UMPC/; + s/Stat. Paris 6/UMPC\tStatistiques/; + s/Sc\.des Matériaux Paris VI/UMPC\tScience des matériaux/; + s/Probabilités Paris VI/UMPC\tProbabilités/; + s/Probabilités et Finanace Paris VI/UMPC\tProbabilités et finance/; + s/Probab\. & Applications Paris 6/UMPC\tProbabilités et applications/; + s/Paris 6 Jussieu/UMPC/; + s/Paris 6/UMPC\t/; + s/Paris VI Pierre & Marie Curie/UMPC/; + s/paris VI\t/UMPC\t/; + s/Paris VI\t/UMPC\t/; + s/Paris VI Ecologie/UMPC\tÉcologie/; + s/ParisVI Proba\. & Finance/UMPC\tProbabilité et finance/; + s/Paris VI Finance/UMPC\tFinance/; + s/Paris VI Physique quantique/UMPC\tPhysique quantique/; + s/Paris VI Spéc\.Physique des Solides/UMPC\tPhysique des Solides/; + s/2 Proba\. & Finance Paris VI/UMPC\tProbabilité et finance/; + s/Biologie Paris VI/UMPC\tBiologie/; + s/CPM/UMPC/; + s/IARFAG Paris VI/UMPC\tInformatique/; + s/IARFAG/UMPC\tInformatique/; + s/Informatique - Paris 6/UMPC\tInformatique/; + s/Analyse numérique Paris VI/UMPC\tAnalyse numérique/; + s/\tParis\t/\tUMPC\t/; + s/TACS Dipl\./UMPC\tMaster Techniques Avancées en Calcul des Structures/; + s/Informatique - UMPC/UMPC\tInformatique/; + s/Analyse numérique UMPC/UMPC\tAnalyse numérique/; + s/à diriger les Rech\. UMPC/UMPC/; + s/2 Proba\. & Finance UMPC/UMPC\tProbabilité et finance/; + s/Japonais Paris VII/Paris-Diderot\tJaponais/; + s/Jussieu Paris 7/Paris-Diderot/; + s/Jussieu/Paris-Diderot/; + s/Math\. Appliquées Paris VII/Paris-Diderot\tMathématiques appliquées/; + s/Télédétection Paris VII/Paris-Diderot\tTélédétection/; + s/Physique des Solides Paris VII/Paris-Diderot\tPhysique des solides/; + s/Paris 7/Paris-Diderot/; + s/Paris VII\t/Paris-Diderot\t/; + s/Univers\.Paris VII Math\./Paris-Diderot\tMathématiques/; + s/Télécom Paris-Diderot/Paris-Diderot/; + s/Paris Paris-Diderot/Paris-Diderot/; + s/Paris 8/Vincennes-Saint-Denis/; + s/ANLA Paris IX/Dauphine/; + s/Economie Paris Dauphine/Dauphine\tÉconomie/; + s/Economie Ind. Paris IX/Dauphine\tÉconomie/; + s/Economie Ind. Paris Dauphine/Dauphine\tÉconomie/; + s/Paris 9/Dauphine/; + s/Paris Dauphine/Dauphine/; + s/Paris IX/Dauphine/; + s/Sc\.Econ\. Dauphine/Dauphine\tÉconomie/; + s/Gestion Publique Dauphine/Dauphine\tGestion publique/; + s/Economie ind\. Dauphine/Dauphine\tÉconomie/; + s/Paris X Philo. Esthétique/Nanterre\tPhilosophie/; + s/Paris X\t/Nanterre/; + s/Paris 10/Nanterre/; + s/Physique Paris XI/Paris-Sud\tPhysique/; + s/écologie Paris XI/Paris-Sud\tÉcologie/; + s/Univers\. Paris Sud/Paris-Sud/; + s/Paris XI\t/M\tParis-Sud\t/; + s/Paris XI Electronique/Paris-Sud\tÉlectronique/; + s/Master Paris 11/M\tParis-Sud/; + s/Master Paris 11/M\tParis-Sud/; + s/écologie Paris XI/Paris-Sud\tÉcologie/; + s/ATS Orsay/Paris-Sud/; + s/Paris 11 Orsay/Paris-Sud/; + s/Paris 11/Paris-Sud/; + s/paris 11/Paris-Sud/; + s/Orsay/Paris-Sud/; + s/Santé Publique Paris Sud/Paris-Sud\tSanté publique/; + s/Physique XI/Paris-Sud\tPhysique/; + s/Paris Paris-Sud/Paris-Sud/; + s/Droit des Affaires Paris 12/Paris-Val de Marne\tDroit des affaires/; + s/Paris 12/Paris-Val de Marne/; + s/Paris XII\t/Paris-Val de Marne\t/; + s/IUP Paris-Val de Marne/Paris-Val de Marne/; + s/Paris 13/Paris-Nord/; + s/Paris XIII/Paris-Nord/; + s/Aix Marseille II/Université de Provence/; + s/Université Lyon I/Université Claude Bernard/; + s/Lyon I/Université Claude Bernard/; + s/Paul-Sabatier/Université Paul-Sabatier/; + s/P\.Sabatier/Université Paul-Sabatier/; + s/ECP/Centrale Paris/; + s/Ecole Centrale/Centrale Paris/; + s/Catolica Chile/PUC/; + s/Catalunya/UOC/; + s/Californie Irvine/UCI/; + s/Californie/UCSD/; + + s/Master Adm. des Entreprises/MBA\t\tMaster Administration des Entreprises/; + s/Master P.trole Engineering/MSc\t\tMaster en Pétrole/; + s/Master of Space System Engineering/MSc\t\tMaster of Space System Engineering/; + s/Master d\'Histoire/M\t\tMastère d\'Histoire/; + s/Master Hydraulique/M\t\tMastère Hydraulique/; + s/Master Aérospace/M\t\tMastère Aérospace/; + s/\tUrbanisme\t/\t\tUrbanisme\t/; + s/3e c\.Urbanisme/\tUrbanisme/; + s/Acoustique musicale/\tAcoustique musicale/; + s/Acoustique\t/\tAcoustique/; + s/Aéro\.Astro &EECS/\tAéronautique et Astronomie/; + s/Algorithmique/\tAlgorithmique/; + s/Anal\. Modél\.Syst\. Biologi\./\tAnalyse et modélisation sytématique en biologie/; + s/Anal\.& Polit\.Economique/\tAnalyse et politique économique/; + s/Analyse & Modélisation/\tAnalyse et modélisation/; + s/Analyse & Polit\. Econom\./\tAnalyse et politique économique/; + s/Analyse & Polit\.Eco\./\tAnalyse et politique économique/; + s/Analyse & Politique Eco\./\tAnalyse et politique économique/; + s/Analyse & Politique Econ\./\tAnalyse et politique économique/; + s/Analyse & Politique Economiques/\tAnalyse et politique économique/; + s/Analyse donnée/\tAnalyse de données/; + s/Analyse Economique/\tAnalyse économique/; + s/Analyse et Politique Economiques/\tAnalyse et politique économique/; + s/Analyse Industr\./\tAnalyse industrielle/; + s/Analyse Numérique/\tAnalyse numérique/; + s/Arabe Littéral/\tArabe littéral/; + s/Astrophys\./\tAstrophysique/; + s/Base Fond\. Oncogenèse/\tBase fondamentale de l'oncogenèse/; + s/Bases fondamentales Oncogénèse/\tBase fondamentale de l'oncogenèse/; + s/Biologie marine/\tBiologie marine/; + s/Biologie moléculaire et céllulaire végétale/\tBiologie moléculaire et céllulaire végétale/; + s/Bio. Moléculaire/\tBiologie moléculaire/; + s/biologie moléculaire/\tBiologie moléculaire/; + s/Biochimie/\tBiochimie/; + s/Biochimic/\tBiochimie/; + s/Microbiologie/\tMicrobiologie/; + s/Biologie/\tBiologie/; + s/biologie/\tBiologie/; + s/biomécanique/\tBiomécanique/; + s/Biophysique/\tBiophysique/; + s/Business/\tBusiness/; + s/Cancérologie/\tCancérologie/; + s/CEA/\tCEA/; + s/Champs Particules Matières/\tChamps particules matières/; + s/Champs Particules Matière/\tChamps particules matières/; + s/Chemical Engineering/\tChemical engineering/; + s/Chem.Eng./\tChemical engineering/; + s/\tChimie\t/\t\tChimie\t/; + s/Chimie appliquée/\tChimie appliquée/; + s/Chimie moléculaire/\tChimie moléculaire/; + s/\tChimie Moléculaire/\t\tChimie moléculaire/; + s/Multinational Chimie Moléculaire/\tChimie moléculaire/; + s/Chimie Organique/\t\tChimie organique/; + s/Chimie Organique Ing./\tChimie organique/; + s/Computer Sc\.Dipl\./\tComputer science/; + s/Computer Sciences/\tComputer science/; + s/Cryptographe\/Algorighmie/\tCryptographe et algorithmique/; + s/algorithmique/\tAlgorithmique/; + s/Astro\., Géophysique & Techn\. Spatiales/\tAstronomie, géophysique et technologies spatiales/; + s/Astrophysique/\tAstrophysique/; + s/Automatique/\tAutomatique/; + s/Ecologie/\tÉcologie/; + s/Master Histoire/M\t\tHistoire/; + s/Affaires Internationales/\tAffaires internationales/; + s/Aménagement & Urbanisme/\tAménagement et urbanisme/; + s/Chinois/\tChinois/; + s/cryptographie/\tCryptographie/; + s/d'Histoire/\tHistoire/; + s/Dépollution des Sols/\tDépollution des sols/; + s/dével. culturel et dir. projet/\tDéveloppement culturel et direction de projets/; + s/DIC/\tDIC/; + s/Virologie/\tVirologie/; + s/Virologie Moléculaire/\tVirologie moléculaire/; + s/Transportation/\tTransportation/; + s/Transports/\tTransports/; + s/Transport\t/\tTransport/; + s/Trait. Signal/\tTrait\. Signal/; + s/Toxicologie/\tToxicologie/; + s/Théorie Information/\tThéorie Information/; + s/Théologie Catholique/\tThéologie Catholique/; + s/Théologie cath./\tThéologie cath\./; + s/Théologie\t/\tThéologie\t/; + s/Théolog\./\tThéolog\./; + s/Télécom\. Numériques/\tTélécom\. Numériques/; + s/Technologie Management/\tTechnologie Management/; + s/Techno\.Policy Dipl\./\tTechno\.Policy Dipl\./; + s/Technique agricole/\tTechnique agricole/; + s/Syst\. énergétiques/\tSyst\. énergétiques/; + s/Strat\. des Org\./\tStrat\. des Org\./; + s/Strat\. & Marketing/\tStrat\. & Marketing/; + s/Statistiques/\tStatistiques/; + s/Statistique et modèles aléatoires écon\. et finance/\tStatistique et modèles aléatoires écon\. et finance/; + s/Statist\./\tStatist\./; + s/Stat\.& Santé/\tStat\.& Santé/; + s/\tSt\.//; + s/spécialisé sécurité des syst\. inform\./\tspécialisé sécurité des syst\. inform\./; + s/Solides Structures & Syst\. Mécaniques/\tSolides Structures & Syst\. Mécaniques/; + s/Sociologie/\tSociologie/; + s/Signal et Communications Londres/\tSignal et Communications Londres/; + s/Sciences théoriques/\tSciences théoriques/; + s/Sciences Physiques/\tSciences Physiques/; + s/Sciences des Sols/\tSciences des Sols/; + s/Sciences Cognitives/\tSciences Cognitives/; + s/Sciences & Techniques environnement/\tSciences & Techniques environnement/; + s/Science Dipl\./\tScience/; + s/Science\t/\tSciences/; + s/Sciences\t/\tSciences/; + s/Sc\.Phys\. Théorique/\tPhysique théorique/; + s/Sc\.Phys\.\t/\tPhysique/; + s/Sc\.Natur\./\tSciences naturelles/; + s/Sc\.Microbio\./\tMicrobiologie/; + s/Sc\.Math\. Appliquées/\tMathématiques appliquées/; + s/Sc\.Math\.\t/\tMathématiques\t/; + s/Sc\.Info\.Géographique/\tInformatique géographique/; + s/Sc\.Hum\./\tScience humaine/; + s/Sc\.Gestion/\tGestion/; + s/Macroéconomie/\tMacroéconomie/; + s/Math\. Appliquées aux Sc\. Eco\./\tÉconomie/; + s/Sc.Econom./\tÉconomie/; + s/Sc\.Econ\. Finance/\tÉconomie et finance/; + s/Sc\.Econ\.\t/\tÉconomie\t/; + s/Sc\.Eco\.Internat\./\tÉconomie/; + s/Sc\.Eco\./\tÉconomie/; + s/Sc\.Eco\t/\tÉconomie\t/; + s/Sc\.du Bois/\tScience du bois/; + s/Sc\.des Matériaux/\tSciences des matériaux/; + s/Sc\.de la Vie/\tSciences de la vie/; + s/Sc\.de l'Organisation/\tScience de l'organisation/; + s/Sc\.de l'Eau 1994/\tScience de l'eau/; + s/Sc\.de l'Eau\t/\tScience de l'eau\t/; + s/Sc.Cognitives/\tSciences cognitives/; + s/Sc\.Chim\./\tChimie/; + s/Sc\.Appl\./\tScience appliquées/; + s/Sc\. Physiques Option Chimie/\tPhysique, chimie/; + s/Sc\. Phy\./\tPhysique/; + s/Sc\. Micro/\t/; + s/Sc\. matériaux/\tSciences des matériaux/; + s/Sc\. la Vie/\tSciences de la vie/; + s/Sc\. Informatique\/Micro-électronique/\tInformatique, micro-électronique/; + s/Sc\. Immunologie/\tImmunologie/; + s/Sc\. Histor\. et Philolog\./\tHistoire et philologie/; + s/Sc\. forestières/\tSciences forestières/; + s/Sc\. et Tech\. Environ\./\tTechnique environnementale/; + s/Sc\. Eco/\tÉconomie/; + s/Sc\. Cognitives/\tSciences cognitives/; + s/Sc\. biomédicales/\tSciences biomédicales/; + s/Sc\. Bactériologie/\tBactériologie/; + s/Sc\. & Génie Matériaux/\tGénie des matériaux/; + s/Sc\. & Génie des Matériaux/\tGénie des matériaux/; + s/Management Sc\./\tManagement des sciences/; + s/Sc\.\t/\tSciences\t/; + s/Sc Géodésie/\tGéodésie/; + s/Robotique/\tRobotique/; + s/retr\.Aérospatiale/\tAérospatiale/; + s/Réseaux/\tRéseaux/; + s/Rech\.Opérationnelle/\tRecherche opérationnelle/; + s/Rech\.Opér\./\tRecherche opérationnelle/; + s/Public Policy/\tPublic Policy/; + s/Psychopathologie/\tPsychopathologie/; + s/psychologie/\tPsychologie/; + s/Programmation/\tProgrammation/; + s/Processus stochastiques/\tProcessus stochastiques/; + s/Processus Stochastiques/\tProcessus stochastiques/; + s/Génie Procédés/\tGénie des procédés/; + s/Génie des Procédés/\tGénie des procédés/; + s/\tProcédés/\t\tProcédés/; + s/Probalilité & Finance/\tProbalilité & Finance/; + s/Probabilités Finance/\tProbabilités Finance/; + s/Probabilités et Applications/\tProbabilités et Applications/; + s/Probabilités\t/\tProbabilités\t/; + s/Physique, chimie, biotransformation/\tPhysique, chimie, biotransformation/; + s/Physique Théorique/\tPhysique théorique/; + s/Physique Solides/\tPhysique des solides/; + s/Physique Quantique/\tPhysique quantique/; + s/Physique nucléaire/\tPhysique nucléaire/; + s/Physique Nucléaire/\tPhysique nucléaire/; + s/Phys\.Nucléaire/\tPhysique nucléaire/; + s/Physique expérimentale/\tPhysique expérimentale/; + s/Physique du solide/\tPhysique des solides/; + s/Physique des Solides/\tPhysique des solides/; + s/Physique des Lasers/\tPhysique des lasers/; + s/Physique Chimie des matériaux/\tPhysique et chimie des matériaux/; + s/Physique\t/\tPhysique\t/; + s/Phys\.Théor\. Dipl\./\tPhysique théorique/; + s/Phys\.Théor\./\tPhysique théorique/; + s/Phys\.Réact\./\tPhysique des réacteurs/; + s/Phys\.Quantique/\tPhysique quantique/; + s/Phys\.Plasmas Spatiaux/\tPhysique des plasmas spatiaux/; + s/Phys\.Mathématiques/\tPhysiques mathématiques/; + s/Phys\.des Solides/\tPhysique des solides/; + s/Phys\. Théor\./\tPhysique théorique/; + s/Phys\. Réacteurs/\tPhysique des réacteurs/; + s/Phys\. Quantique/\tPhysique quantique/; + s/Géodynamique & Phys\./\tGéodynamique & physique/; + s/Phys\.Solid/\t\tPhysique des solides/; + s/Phys\./\tPhysique/; + s/Phys des Solides/\tPhysique des solides/; + s/philosophie et théologie/\tPhilosophie et théologie/; + s/Philosophie/\tPhilosophie/; + s/Philo\.et Eco\. Londres/\tPhilosophie et économie/; + s/Pharmacochimie Mol\.expérim\.et Métabolisme/\tPharmacochimie moléculaire expérimentales et métabolisme/; + s/Pharmaco\.& Biol\.Cellulaire/\tPharmacologie et biologie cellulaire/; + s/Pharmacolog\./\tPharmacologie/; + s/Particules & Matière/\tParticules et matières/; + s/Organisation et Pilotage Syst\. Product\. Indust\./\tOrganisation et pilotage syst. Product. Indust./; + s/Organisation & Syst\.Prod\./\tOrganisation et système de production/; + s/Russe/\tRusse/; + s/Polit\.Eco\.& Soc\./\tPolitique économique et sociale/; + s/Physique des Particules CNRS-CERN/\tPhysique des Particules CNRS-CERN/; + s/Physique M/\tPhysique moléculaire/; + s/Org\. Production et Entreprise/\tOrganisation production et entreprise/; + s/Org\. et Pilotage des Syst\. product\./\tOrganisation et pilotage des systèmes production/; + s/\tOptique/\t\tOptique/; + s/Océanographie/\tOcéanographie/; + s/océanologie/\tOcéanographie/; + s/Océano\./\tOcéanographie/; + s/Nucl\. Eng/\tNuclear engineering/; + s/Neurosciences/\tNeurosciences/; + s/Neuro/\tNeurosciences/; + s/Multinational Chimie molécullaire/\tChimie molécullaire/; + s/Multinational\t//; + s/Morphol\.Math\./\tMorphologie mathématiques/; + s/Modélisation Stochastique et Statistique/\tModélisation stochastique et statistique/; + s/Modèl\.Stochastiq\./\tModélisation stochastique/; + s/Milieux Coralliens/\tMilieux coralliens/; + s/Microélect\./\tMicroélectronique/; + s/Microéconomie/\tMicroéconomie/; + s/méthodes physiques télédétection/\tMéthodes physiques télédétection/; + s/Météorologie/\tMétéorologie/; + s/Médiateur Judiciaire et conventionnelle/\tMédiateur judiciaire et conventionnelle/; + s/Mechanical Engineering/\tMechanical Engineering/; + s/Mécanique\/Sc\. Matériaux/\tMécanique science des matériaux/; + s/Mécanique Théorique/\tMécanique théorique/; + s/Mécanique Fluides/\tMécanique fluides/; + s/Mécanique\t/\tMécanique\t/; + s/Méca Fluid\.Théor\./\tMécanique des fluides théoriques/; + s/Méc\.des Fluides/\tMécanique des fluides/; + s/Maths Financières/\tMathématiques financières/; + s/Maths Appl\.à l'Economie/\tMathématiques appliquées à l'économie/; + s/Mathématiques/\tMathématiques/; + s/Mathématique/\tMathématiques/; + s/Mathematics/\tMathématiques/; + s/Maths\t/\tMathématiques\t/; + s/Math\.Appliquées/\tMathématiques appliquées/; + s/Math\.Appliq\./\tMathématiques appliquées/; + s/Math\.Appl\./\tMathématiques appliquées/; + s/Math\. Stat\./\tMathématiques statistiques/; + s/Math\. Pures/\tMathématiques pures/; + s/Math\. Appliqués/\tMathématiques appliquées/; + s/Math\. Appliquées et Calcul Scient\./\tMathématiques appliquées et calcul scientifique/; + s/Math\. Appliquées/\tMathématiques appliquées/; + s/Math\. appli\. Sci\. homme/\tMathématiques appliquées aux sciences humaines/; + s/Informatique Math\.& Appl\./\tInformatique et mathématiques appliquées/; + s/\tinformatique\t/\t\tInformatique\t/; + s/Informatique Math\. et Appli\./\tInformatique et mathématiques appliquées/; + s/Math\./\tMathématiques/; + s/Nepali-Tibétain/\tNepali-Tibétain/; + s/MVA/\tMathématiques vision apprentissage/; + s/MMME//; + s/OJME//; + s/\tMicro\t/\t\tMicro\t/; + s/Médec\.AIHP/\Médecine/; + s/\tMarketing\t/\t\tMarketing\t/; + s/Lt\. Et\. Sup\. Banq\./\tLt. Et. Sup. Banq./; + s/Management Aéroportuaire/\tManagement Aéroportuaire/; + s/Logistique/\tLogistique/; + s/Lettres modernes/\tLettres modernes/; + s/Lettres Hist\. Art/\tLettres histoire de l'art/; + s/lettres classiques/\tLettres classiques/; + s/Lettres Anglais/\tLettres Anglais/; + s/Lettres\t/\tLettres\t/; + s/LCO//; + s/Laser & Matière/\tLaser & Matière/; + s/Langues Orientales/\tLangues orientales/; + s/Langues Orient\./\tLangues orientales/; + s/Intelligence Artificielle/\tIntelligence artificielle/; + s/Ingenierie & Gestion/\tIngenierie & gestion/; + s/Informatique Fondamentale/\tInformatique fondamentale/; + s/Informatique Dipl\./\tInformatique/; + s/Informatique Grenoble/\tInformatique/; + s/\tInformatique\t/\t\tInformatique\t/; + s/Information theory/\tInformation theory/; + s/Industrial Design Eng\./\tIndustrial Design Engineering/; + s/Immunologie/\tImmunologie/; + s/Immunology/\tImmunologie/; + s/Images Synthèse/\tImages synthèse/; + s/hydrologie-hydrogéologie/\thydrologie-hydrogéologie/; + s/Hydrologie/\tHydrologie/; + s/Hydrogéologie/\tHydrogéologie/; + s/Hydrodynamique/\tHydrodynamique/; + s/Histoire, Anglais, Lettres classiques & modernes/\tHistoire, Anglais, Lettres classiques & modernes/; + s/Histoire Droit/\tHistoire Droit/; + s/\tHistoire\t/\t\tHistoire\t/; + s/Hist\.de l'Art/\tHistoire l'art/; + s/HIST PHILOSOPHIE/\tHistoire et philosophie/; + s/HH GG/\tHistoire et géographie/; + s/Gestion scientifique/\tGestion scientifique/; + s/Gestion des Ress\. Naturelles Renouvelables/\tGestion des ressources naturelles renouvelables/; + s/\tGestion\t/\t\tGestion\t/; + s/Géophys\./\tGéophysique/; + s/Géographie/\tGéographie/; + s/Génie Electrique/\tGénie électrique/; + s/Génie Chimique/\tGénie chimique/; + s/Génie Atomique/\tGénie atomique/; + s/\tGénie\t/\t\tGénie\t/; + s/Génie civil/\tGénie civil/; + s/Génétique/\tGénétique/; + s/Finance Monnaie/\tFinance Monnaie/; + s/Finance Marché/\tFinance Marché/; + s/Finance et probabilité/\tFinance et probabilité/; + s/Finance et Monnaie/\tFinance et Monnaie/; + s/Finance Dipl\./\tFinance/; + s/Finance and Economics Londres/\tFinance and Economics/; + s/\tFinance\t/\t\tFinance\t/; + s/Expert Compt\./\tExpertise comptable/; + s/Etudes Latines/\tEtudes latines/; + s/études extrême orientales/\tÉtudes extrême orientales/; + s/et PhD\t//; + s/et HDR\t//; + s/Epidémiologie/\tÉpidémiologie/; + s/Environnement Marin/\tEnvironnement marin/; + s/\tEnvironnement\t/\t\tEnvironnement\t/; + s/Energétique/\tÉnergétique/; + s/Electronique/\tÉlectronique/; + s/Electron\./\tÉlectronique/; + s/Electrical Engineering/\tElectrical Engineering/; + s/Electrical Engin\. & Computer/\tElectrical engineering & Computer science/; + s/Electrical Eng Dipl\./\tElectrical engineering/; + s/Educateur spécialisé/\tÉducateur spécialisé/; + s/Économiee\t/\tÉconomie\t/; + s/Economie Monétaire & Bancaire/\tÉconomie monétaire & bancaire/; + s/Economie Internationale/\tÉconomie internationale/; + s/Economie innovation/\tÉconomie innovation/; + s/Economie Industrielle/\tÉconomie industrielle/; + s/Economie Ind\./\tÉconomie industrielle/; + s/Economie et Finance/\tÉconomie et fnance/; + s/Economie Environnement/\tÉconomie environnementale/; + s/Economie Envir\. et Ress\. Nat\./\tÉconomie environnementale et ressources naturelles/; + s/Economie du Dévelop\./\tÉconomie du développement/; + s/Economie Dipl\./\tÉconomie/; + s/Economie Développement/\tÉconomie développement/; + s/Economie des Institutions/\tÉconomie des institutions/; + s/Economie & Finance Internat./\tÉconomie & finance internationale/; + s/Economie\t/\tÉconomie\t/; + s/Econométrie/\tÉconométrie/; + s/Econom\.Dipl\./\tÉconométrie/; + s/Econ\.Po\./\tÉconomie politique/; + s/Econ\.Industrielle/\tÉconomie industrielle/; + s/Econ\.Appliquée/\tÉconomie appliquée/; + s/Econ\.& Finance Internat\./\tÉconomie & finance internationale/; + s/Econ\. & Finance/\tÉconomie & finance/; + s/Econ\.\t/\tÉconomie\t/; + s/écologie M/\tÉcologie/; + s/Eco\.Rech\.Dévelop\./\tÉconomie recherche et développement/; + s/Eco\.Appliquée/\tÉconomie appliquée/; + s/Eco\. Enviro\. & Ress\. Humaines/\tÉconomie environnementale & ressource humaines/; + s/Eco Finance Internationale/\tÉconomie finance internationale/; + s/Droit Public/\tDroit Public/; + s/Droit des affaires/\tDroit des affaires/; + s/Droit\t/\tDroit\t/; + s/INRIA/\tINRIA/; + s/\tInformatique\t/\t\tInformatique\t/; + s/Ecotoxicologie/\tEcotoxicologie/; + s/Droit public/\tDroit public/; + s/Droit des Affaires/\tDroit des Affaires/; + s/Anal\.Numér\./\tAnalyse numérique/; + s/& Gestion Energie/\tGestion de l'énergie/; + s/droit/\tdroit/; + + # On nettoye à la fin + s/\tSE\t/\t/; + s/rer\.Nat\.//; + s/Un\. Dipl\.\t//; + s/Dipl\. Dipl\./Dipl./; + s/Dipl\.Dipl\./Dipl./; + s/Ing Dipl\./Ing./; + s/Ing Ing\./Ing./; + s/Sc\.Dipl\.//; + s/\t2005\t//; + s/(Dipl\.)(\tDipl\.)+/Dipl./; + s/(Ing\.)(\tDipl\.)+/Ing./; + s/(Corps)(\tDipl\.)+/Corps/; + s/(MSc)(\tDipl\.)+/MSc/; + s/(PhD)(\tDipl\.)+/PhD/; + s/(DEA)(\tDipl\.)+/DEA/; + s/(ME)(\tDipl\.)+/ME/; + s/(MBA)(\tDipl\.)+/MBA/; + s/(MPA)(\tDipl\.)+/MPA/; + s/(Lic\.)(\tDipl\.)+/Lic./; + s/(MIA)(\tDipl\.)+/MIA/; + s/(Agr\.)(\tDipl\.)+/Agr./; + s/(CAPES)(\tDipl\.)+/CAPES/; + s/(DESS)(\tDipl\.)+/DESS/; + s/(BTS)(\tDipl\.)+/BTS/; + s/(MA)(\tDipl\.)+/MA/; + s/(Maîtr\.)(\tDipl\.)+/Maîtr./; + s/(HDR)(\tDipl\.)+/HDR/; + s/(DEUG)(\tDipl\.)+/DEUG/; + s/(MEE)(\tDipl\.)+/MEE/; + s/(MPhil)(\tDipl\.)+/MPhil/; + s/(MUP)(\tDipl\.)+/MUP/; + s/(MME)(\tDipl\.)+/MME/; + s/(MCP)(\tDipl\.)+/MCP/; + s/(BA)(\tDipl\.)+/BA/; + s/(MEl)(\tDipl\.)+/MEl/; + s/(MM)(\tDipl\.)+/MM/; + s/(MIB)(\tDipl\.)+/MIB/; + s/(MC)(\tDipl\.)+/MC/; + s/(MEM)(\tDipl\.)+/MEM/; + s/(MEng)(\tDipl\.)+/MEng/; + s/(MCE)(\tDipl\.)+/MCE/; + s/(M)(\tDipl\.)+/M/; + s/(MMS)(\tDipl\.)+/MMS/; + s/(MB)(\tDipl\.)+/MB/; + s/(MiF)(\tDipl\.)+/MiF/; + s/Ing\.\tPhD/Ing.\t\t/; + s/PhD\tPhD/PhD\t\t/; + s/MSc\tMSc/MSc/; + s/DEA\tMSc/DEA/; + s/DEA\tMSc/DEA/; + s/DEA\tMSc/DEA/; + s/PhD\tMSc/PhD/; + s/Dipl\.\tME/ME/; + s/MBA\tMBA/MBA/; + s/DEA\tM\t/DEA\t/; + s/PhD\tM\t/PhD\t/; + s/MSc\tMBA/MBA/; + s/PhD\tHDR/PhD/; + s/(Ing\.\t)+(Ing\.)/Ing./; + s/PhD\tIng/PhD/; + s/PhD\tIng\./PhD/; + s/MBA\tIng\./MBA/; + s/MBA\tMA/MBA/; + s/PhD\./PhD/; + s/Dipl\.\tIng\./Ing./; + s/MSc\tIng\./MSc/; + s/MIB\tIng\./MIB/; + + s/Université//g; + s/université//g; + s/Univers\.//g; + s/Sc\.\t//g; + s/Sc\. \t//g; + s/Paul-Sabatier/Université Paul-Sabatier/; + s/de Provence/Université de Provence/; + s/Jean-Moulin/Université Jean-Moulin/; + s/Claude Bernard/Université Claude Bernard/; + s/de Rennes/Université de Rennes 1/; + s/MIT Institute of Technology/MIT/; + s/London Royaume uni//; + s/\tLondon\t//; + s/\tGrenoble\t//; + s/ENS UlmAE/ENSAE/; + + s/\t /\t/g; + s/\t /\t/g; + s/\t,/\t/g; + s/\t-/\t/g; + s/\t:/\t/g; + s/\t\./\t/g; + s/\t /\t/g; + s/\t /\t/g; + s/ \t/\t/g; + s/ \t/\t/g; + s/London\tBusiness School/London Business School/; + s/DEA\tMSc/DEA/; + s/ME\tDipl\./ME/; + s/\tENS\t/\tENS Ulm/; + s/Économiee environ\. et ressources naturelles UCL Londres/UCL\tÉconomie environnementale et ressources naturelles/; + s/Dipl\.\tHEC 04//; + s/Neurosciencessciences/Neurosciences/; + s/HEC\tHEC-Entrepreneurs//; + s/Master Techniques Avancées en Calcul des Structures\tENS Cachan/Master Techniques Avancées en Calcul des Structures/; + s/DEA\t\tPanthéon-Sorbonne/DEA\tPanthéon-Sorbonne/; + s/MBA\t\tCollege of Europe/MBA\tCollege of Europe/; + s/DEA\t\tUMPC/DEA\tUMPC/; + s/Informatique UMPC/Informatique/; + + print OUT $_; +} + +close(FILE); +close(OUT); diff --git a/modules/fusionax/import-ax.sh b/modules/fusionax/import-ax.sh new file mode 100755 index 0000000..fb3a6db --- /dev/null +++ b/modules/fusionax/import-ax.sh @@ -0,0 +1,32 @@ +#! /bin/bash + +# import des données +#scp -i ax_xorg_rsa xorg@polytechniciens.com:/home/axasso/ax-import/export_4D.txt.rar . +#unrar e -inul export_4D.txt.rar +cp /home/x2004jacob/export*utf8.TXT . + +# séparation en fichiers de tables +cat export_total* | grep ^AD > Adresses.txt +cat export_total* | grep ^AN > Anciens.txt +cat export_total* | grep ^FO > Formations.txt +cat export_total* | grep ^AC > Activites.txt +cat export_total* | grep ^EN > Entreprises.txt + +exit 1 + +# intégration dans notre bdd +echo intégration dans notre bdd +$MYSQL x4dat < Activites.sql +$MYSQL x4dat < Adresses.sql +$MYSQL x4dat < Anciens.sql +$MYSQL x4dat < Entreprises.sql +./formation.pl +cat Formations_out.txt > Formations.txt +rm -f Formations_out.txt +$MYSQL x4dat < Formations.sql + + +# nettoyage +echo nettoyage +#rm Adresses.txt Anciens.txt Formations.txt Activites.txt Entreprises.txt export_4D.txt.rar export-total* +rm Adresses.txt Anciens.txt Formations.txt Activites.txt Entreprises.txt export-total* diff --git a/modules/geoloc.php b/modules/geoloc.php deleted file mode 100644 index 30ab573..0000000 --- a/modules/geoloc.php +++ /dev/null @@ -1,113 +0,0 @@ - $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'), - ); - } - - function handler_default(&$page, $action = null, $subaction = null) - { - global $globals; - - $set = new UserSet(); - $set->addMod('geoloc', 'Geolocalisation', true); - $set->apply('geoloc', $page, $action, $subaction); - } - - function handler_admin(&$page, $action = false) { - $page->changeTpl('geoloc/admin.tpl'); - require_once("geoloc.inc.php"); - $page->setTitle('Administration - Geolocalisation'); - - $nb_synchro = 0; - - if (Env::has('id') && is_numeric(Env::v('id'))) { - if (synchro_city(Env::v('id'))) $nb_synchro ++; - } - - if ($action == 'missinglat') { - $res = XDB::iterRow("SELECT id FROM geoloc_city WHERE lat = 0 AND lon = 0"); - while ($a = $res->next()) if (synchro_city($a[0])) $nb_synchro++; - } - - if ($nb_synchro) - $page->trigSuccess(($nb_synchro > 1)?($nb_synchro." villes ont été synchronisées"):"Une ville a été synchronisée"); - - $res = XDB::query("SELECT COUNT(*) FROM geoloc_city WHERE lat = 0 AND lon = 0"); - $page->assign("nb_missinglat", $res->fetchOneCell()); - } - - function handler_admin_dynamap(&$page, $action = false) { - $page->changeTpl('geoloc/admin_dynamap.tpl'); - - if ($action == 'cities_not_on_map') { - require_once('geoloc.inc.php'); - if (!fix_cities_not_on_map(20)) - $page->trigError("Impossible d'accéder au webservice"); - else - $refresh = true; - } - - if ($action == 'smallest_maps') { - require_once('geoloc.inc.php'); - set_smallest_levels(); - } - - if ($action == 'precise_coordinates') { - XDB::execute("UPDATE adresses AS a - INNER JOIN geoloc_city AS c ON(a.cityid = c.id) - SET a.glat = c.lat / 100000, a.glng = c.lon / 100000"); - } - - if ($action == 'newmaps') { - require_once('geoloc.inc.php'); - if (!get_new_maps(Env::v('url'))) - $page->trigError("Impossible d'accéder aux nouvelles cartes"); - } - - $countMissing = XDB::query("SELECT COUNT(*) FROM geoloc_city AS c LEFT JOIN geoloc_city_in_maps AS m ON(c.id = m.city_id) WHERE m.city_id IS NULL"); - $missing = $countMissing->fetchOneCell(); - - $countNoSmallest = XDB::query("SELECT SUM(IF(infos = 'smallest',1,0)) AS n FROM geoloc_city_in_maps GROUP BY city_id ORDER BY n"); - $noSmallest = $countNoSmallest->fetchOneCell() == 0; - - $countNoCoordinates = XDB::query("SELECT COUNT(*) FROM adresses WHERE cityid IS NOT NULL AND glat = 0 AND glng = 0"); - $noCoordinates = $countNoCoordinates->fetchOneCell(); - - if (isset($refresh) && $missing) { - $page->assign("pl_extra_header", ""); - } - $page->assign("nb_cities_not_on_map", $missing); - $page->assign("no_smallest", $noSmallest); - $page->assign("no_coordinates", $noCoordinates); - } - -} - -// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8: -?> diff --git a/modules/geoloc/.gitignore b/modules/geoloc/.gitignore deleted file mode 100644 index da97ff7..0000000 --- a/modules/geoloc/.gitignore +++ /dev/null @@ -1 +0,0 @@ -*.swf diff --git a/modules/newsletter.php b/modules/newsletter.php index 4f65bf9..908f1bf 100644 --- a/modules/newsletter.php +++ b/modules/newsletter.php @@ -151,12 +151,15 @@ class NewsletterModule extends PLModule if ($action == 'edit' && $aid != 'update') { $eaid = $aid; - if(Post::has('title')) { + if (Post::has('title')) { $art = new NLArticle(Post::v('title'), Post::v('body'), Post::v('append'), $eaid, Post::v('cid'), Post::v('pos')); } else { $art = ($eaid == 'new') ? new NLArticle() : $nl->getArt($eaid); } + if ($art && !$art->check()) { + $page->trigError("Cet article est trop long."); + } $page->assign('art', $art); } diff --git a/modules/payment/money/paypal.inc.php b/modules/payment/money/paypal.inc.php index 4d7fb02..08d83f4 100644 --- a/modules/payment/money/paypal.inc.php +++ b/modules/payment/money/paypal.inc.php @@ -21,8 +21,6 @@ class PayPal { - // {{{ properties - var $val_number; var $urlform; var $nomsite = "PayPal"; @@ -30,78 +28,81 @@ class PayPal var $infos; - // }}} - // {{{ constructor - function PayPal($val) { $this->val_number = $val; } - // }}} - // {{{ function form() - function prepareform(&$pay) { - // toute la doc sur : - // https://www.paypal.com/fr_FR/pdf/integration_guide.pdf - // attention : le renvoi automatique ne fonctionne que si - // on oblige les gens à créer un compte paypal - // nous ne l'utilisons pas ; il faut donc que l'utilisateur - // revienne sur le site + // Documentation: + // https://www.paypal.com/developer + // Warning: the automatic return only works if we force the + // users to create a paypal account. We do not use it; thus + // the user must come back on the site. global $globals, $platal; - $this->urlform = 'https://'.$globals->money->paypal_site.'/cgi-bin/webscr'; + $this->urlform = 'https://' . $globals->money->paypal_site . '/cgi-bin/webscr'; $req = XDB::query("SELECT IF(nom_usage!='', nom_usage, nom) AS nom FROM auth_user_md5 - WHERE user_id = {?}",S::v('uid')); + WHERE user_id = {?}", S::v('uid')); $name = $req->fetchOneCell(); $roboturl = str_replace("https://","http://",$globals->baseurl) - . '/' . $platal->ns . "payment/paypal_return/".S::v('uid')."?comment=".urlencode(Env::v('comment')); + . '/' . $platal->ns . "payment/paypal_return/" . S::v('uid') + . "?comment=" . urlencode(Env::v('comment')); - $this->infos = Array(); + $this->infos = array(); - $this->infos['commercant'] = Array( + $this->infos['commercant'] = array( 'business' => $globals->money->paypal_compte, - 'rm' => 2, + 'rm' => 2, 'return' => $roboturl, - 'cn' => 'Commentaires', + 'cn' => 'Commentaires', 'no_shipping' => 1, 'cbt' => empty($GLOBALS['IS_XNET_SITE']) ? - 'Revenir sur polytechnique.org' : - 'Revenir sur polytechnique.net'); + 'Revenir sur polytechnique.org.' : + 'Revenir sur polytechnique.net.' + ); - $info_client = Array( + $info_client = array( 'first_name' => S::v('prenom'), 'last_name' => $name, - 'email' => S::user()->bestEmail()); + 'email' => S::user()->bestEmail() + ); $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 - 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) - WHERE q.user_id = {?} - LIMIT 1", S::v('uid')); + "SELECT a.text, l.name AS city, a.postalCode AS zip, a.countryiId AS country, + IF(t1.display_tel != '', t1.display_tel, t2.display_tel) AS night_phone_b + FROM auth_user_quick AS q + LEFT JOIN profile_addresses AS a ON (q.user_id = a.pid AND FIND_IN_SET('current', a.flags)) + 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) + LEFT JOIN geoloc_localities AS l ON (l.id = a.localityId) + WHERE q.user_id = {?} + LIMIT 1", + S::v('uid')); $this->infos['client'] = array_map('replace_accent', array_merge($info_client, $res->fetchOneAssoc())); - - // on constuit la reference de la transaction - $prefix = ($pay->flags->hasflag('unique')) ? str_pad("",15,"0") : rand_url_id(); - $fullref = substr("$prefix-xorg-{$pay->id}",-15); - - $this->infos['commande'] = Array( - 'item_name' => replace_accent($pay->text), - 'amount' => $this->val_number, + list($this->infos['client']['address1'], $this->infos['client']['address2']) = + explode("\n", Geocoder::getFirstLines($this->infos['client']['text'], + $this->infos['client']['zip'], 2)); + unset($this->infos['client']['text']); + + // We build the transaction's reference + $prefix = ($pay->flags->hasflag('unique')) ? str_pad("", 15, "0") : rand_url_id(); + $fullref = substr("$prefix-xorg-{$pay->id}", -15); + + $this->infos['commande'] = array( + 'item_name' => replace_accent($pay->text), + 'amount' => $this->val_number, 'currency_code' => 'EUR', - 'custom' => $fullref); + 'custom' => $fullref + ); - $this->infos['divers'] = Array('cmd' => '_xclick'); + $this->infos['divers'] = array('cmd' => '_xclick'); } - - // }}} } $api = 'PayPal'; diff --git a/modules/profile.php b/modules/profile.php index 016fd32..7783972 100644 --- a/modules/profile.php +++ b/modules/profile.php @@ -24,45 +24,55 @@ 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), - 'groupes-x/logo' => $this->make_hook('xnetlogo', AUTH_PUBLIC), - - 'vcard' => $this->make_hook('vcard', AUTH_COOKIE), - '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/sector' => $this->make_hook('ajax_sector', AUTH_COOKIE, 'user', NO_AUTH), + 'profile/ajax/sub_sector' => $this->make_hook('ajax_sub_sector', AUTH_COOKIE, 'user', NO_AUTH), + 'profile/ajax/alternates' => $this->make_hook('ajax_alternates', 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), + 'profile/ajax/buildnames' => $this->make_hook('ajax_buildnames', 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/name_info' => $this->make_hook('name_info', AUTH_PUBLIC), + 'profile/orange' => $this->make_hook('p_orange', 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), + 'groupes-x/logo' => $this->make_hook('xnetlogo', AUTH_PUBLIC), + + '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/networking' => $this->make_hook('admin_networking', AUTH_MDP, 'admin'), + 'admin/trombino' => $this->make_hook('admin_trombino', AUTH_MDP, 'admin'), + 'admin/sectors' => $this->make_hook('admin_sectors', 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'), + 'admin/names' => $this->make_hook('admin_names', AUTH_MDP, 'admin'), ); } @@ -128,6 +138,32 @@ class ProfileModule extends PLModule exit; } + function handler_name_info(&$page) + { + header('Content-Type: text/html; charset=utf-8'); + $page->changeTpl('profile/name_info.tpl', SIMPLE); + $res = XDB::iterator("SELECT name, explanations, + FIND_IN_SET('public', flags) AS public, + FIND_IN_SET('has_particle', flags) AS has_particle + FROM profile_name_enum + WHERE NOT FIND_IN_SET('not_displayed', flags) + ORDER BY NOT FIND_IN_SET('public', flags)"); + $page->assign('types', $res); + } + + function handler_networking(&$page, $mid) + { + $res = XDB::query("SELECT icon + FROM profile_networking_enum + WHERE network_type = {?}", + $mid); + $img = dirname(__FILE__) . '/../htdocs/images/networking/' . $res->fetchOneCell(); + $type = mime_content_type($img); + header("Content-Type: $type"); + echo file_get_contents($img); + exit; + } + function handler_photo_change(&$page) { global $globals; @@ -330,7 +366,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'); @@ -360,11 +396,11 @@ class ProfileModule extends PLModule } } - function handler_applis_js(&$page) + function handler_education_js(&$page) { pl_cached_content_headers("text/javascript", "utf-8"); - $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) @@ -390,25 +426,37 @@ class ProfileModule extends PLModule $page->assign('medal_list', $mlist); } - function handler_ajax_address(&$page, $adid) + function handler_ajax_address(&$page, $id) { pl_content_headers("text/html"); $page->changeTpl('profile/adresses.address.tpl', NO_SKIN); - $page->assign('i', $adid); - $page->assign('adr', array()); + $page->assign('i', $id); + $page->assign('address', array()); } - function handler_ajax_tel(&$page, $adid, $telid) + function handler_ajax_tel(&$page, $prefid, $prefname, $telid) { pl_content_headers("text/html"); - $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/general.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) { pl_content_headers("text/html"); @@ -424,25 +472,57 @@ class ProfileModule extends PLModule $page->assign('i', $id); $page->assign('job', array()); $page->assign('new', true); - $res = XDB::query("SELECT id, label - FROM emploi_secteur"); - $page->assign('secteurs', $res->fetchAllAssoc()); - $res = XDB::query("SELECT id, fonction_fr, FIND_IN_SET('titre', flags) AS title - FROM fonctions_def - ORDER BY id"); - $page->assign('fonctions', $res->fetchAllAssoc()); + $res = XDB::query("SELECT id, name AS label + FROM profile_job_sector_enum"); + $page->assign('sectors', $res->fetchAllAssoc()); + require_once "emails.combobox.inc.php"; + fill_email_combobox($page); } - function handler_ajax_secteur(&$page, $id, $sect, $ssect = -1) + function handler_ajax_sector(&$page, $id, $jobid, $jobpref, $sect, $ssect = -1) { pl_content_headers("text/html"); - $res = XDB::iterator("SELECT id, label - FROM emploi_ss_secteur - WHERE secteur = {?}", $sect); - $page->changeTpl('profile/jobs.secteur.tpl', NO_SKIN); + $res = XDB::iterator("SELECT id, name, FIND_IN_SET('optgroup', flags) AS optgroup + FROM profile_job_subsector_enum + WHERE sectorid = {?}", $sect); + $page->changeTpl('profile/jobs.sector.tpl', NO_SKIN); $page->assign('id', $id); - $page->assign('ssecteurs', $res); + $page->assign('subSectors', $res); $page->assign('sel', $ssect); + if ($id != -1) { + $page->assign('change', 1); + $page->assign('jobid', $jobid); + $page->assign('jobpref', $jobpref); + } + } + + function handler_ajax_sub_sector(&$page, $id, $ssect, $sssect = -1) + { + header('Content-Type: text/html; charset=utf-8'); + $res = XDB::iterator("SELECT id, name + FROM profile_job_subsubsector_enum + WHERE subsectorid = {?}", $ssect); + $page->changeTpl('profile/jobs.sub_sector.tpl', NO_SKIN); + $page->assign('id', $id); + $page->assign('subSubSectors', $res); + $page->assign('sel', $sssect); + } + + function handler_ajax_alternates(&$page, $id, $sssect) + { + header('Content-Type: text/html; charset=utf-8'); + $res = XDB::iterator('SELECT name + FROM profile_job_alternates + WHERE subsubsectorid = {?} + ORDER BY id', + $sssect); + $page->changeTpl('profile/jobs.alternates.tpl', NO_SKIN); + $alternate = $res->next(); + $alternates = $alternate['name']; + while ($alternate = $res->next()) { + $alternates .= ', ' . $alternate['name']; + } + $page->assign('alternates', $alternates); } function handler_ajax_skill(&$page, $cat, $id) @@ -465,20 +545,43 @@ class ProfileModule extends PLModule } } + function handler_ajax_searchname(&$page, $id) + { + header('Content-Type: text/html; charset=utf-8'); + $page->changeTpl('profile/general.searchname.tpl', NO_SKIN); + $res = XDB::query("SELECT id, name, FIND_IN_SET('public', flags) AS pub + FROM profile_name_enum + WHERE NOT FIND_IN_SET('not_displayed', flags) + AND NOT FIND_IN_SET('always_displayed', flags)"); + $page->assign('sn_type_list', $res->fetchAllAssoc()); + $page->assign('i', $id); + } + + function handler_ajax_buildnames(&$page, $data) + { + header('Content-Type: text/html; charset=utf-8'); + $page->changeTpl('profile/general.buildnames.tpl', NO_SKIN); + require_once 'name.func.inc.php'; + $page->assign('names', build_javascript_names($data)); + } + function handler_p_orange(&$page) { $page->changeTpl('profile/orange.tpl'); require_once 'validations.inc.php'; - $res = XDB::query( - "SELECT u.promo, u.promo_sortie - FROM auth_user_md5 AS u - WHERE user_id={?}", S::v('uid')); + $res = XDB::query("SELECT e.entry_year, e.grad_year, d.promo, FIND_IN_SET('femme', u.flags) AS sexe + FROM auth_user_md5 AS u + INNER JOIN profile_display AS d ON (d.pid = u.user_id) + INNER JOIN profile_education AS e ON (e.uid = u.user_id AND FIND_IN_SET('primary', e.flags)) + WHERE u.user_id = {?}", S::v('uid')); - list($promo, $promo_sortie_old) = $res->fetchOneRow(); + list($promo, $promo_sortie_old, $promo_display, $sexe) = $res->fetchOneRow(); $page->assign('promo_sortie_old', $promo_sortie_old); - $page->assign('promo', $promo); + $page->assign('promo', $promo); + $page->assign('promo_display', $promo_display); + $page->assign('sexe', $sexe); if (!Env::has('promo_sortie')) { return; @@ -489,18 +592,18 @@ class ProfileModule extends PLModule $promo_sortie = Env::i('promo_sortie'); if ($promo_sortie < 1000 || $promo_sortie > 9999) { - $page->trigError('L\'année de sortie doit être un nombre de quatre chiffres'); + $page->trigError('L\'année de sortie doit être un nombre de quatre chiffres.'); } elseif ($promo_sortie < $promo + 3) { - $page->trigError('Trop tôt'); + $page->trigError('Trop tôt !'); } elseif ($promo_sortie == $promo_sortie_old) { $page->trigWarning('Tu appartiens déjà à la promotion correspondante à cette année de sortie.'); } elseif ($promo_sortie == $promo + 3) { - XDB::execute( - "UPDATE auth_user_md5 set promo_sortie={?} - WHERE user_id={?}", $promo_sortie, S::v('uid')); + XDB::execute("UPDATE profile_education + SET grad_year = {?} + WHERE uid = {?} AND FIND_IN_SET('primary', flags)", $promo_sortie, S::v('uid')); $page->trigSuccess('Ton statut "orange" a été supprimé.'); $page->assign('promo_sortie_old', $promo_sortie); } @@ -535,29 +638,29 @@ class ProfileModule extends PLModule ///// recuperations infos referent //expertise - $res = XDB::query("SELECT expertise FROM mentor WHERE uid = {?}", $user->id()); + $res = XDB::query("SELECT expertise FROM profile_mentor WHERE uid = {?}", $user->id()); $page->assign('expertise', $res->fetchOneCell()); - //secteurs - $secteurs = $ss_secteurs = Array(); + // Sectors + $sectors = $subSectors = Array(); $res = XDB::iterRow( - "SELECT s.label, ss.label - FROM mentor_secteurs AS m - LEFT JOIN emploi_secteur AS s ON(m.secteur = s.id) - LEFT JOIN emploi_ss_secteur AS ss ON(m.secteur = ss.secteur AND m.ss_secteur = ss.id) + "SELECT s.name AS label, ss.name AS label + FROM profile_mentor_sector AS m + LEFT JOIN profile_job_sector_enum AS s ON(m.sectorid = s.id) + LEFT JOIN profile_job_subsector_enum AS ss ON(m.sectorid = ss.sectorid AND m.subsectorid = ss.id) WHERE uid = {?}", $user->id()); - while (list($sec, $ssec) = $res->next()) { - $secteurs[] = $sec; - $ss_secteurs[] = $ssec; + while (list($sector, $subSector) = $res->next()) { + $sectors[] = $sector; + $subSectors[] = $subSector; } - $page->assign_by_ref('secteurs', $secteurs); - $page->assign_by_ref('ss_secteurs', $ss_secteurs); + $page->assign_by_ref('sectors', $sectors); + $page->assign_by_ref('subSectors', $subSectors); - //pays + // Countries. $res = XDB::query( - "SELECT gp.pays - FROM mentor_pays AS m - LEFT JOIN geoloc_pays AS gp ON(m.pid = gp.a2) + "SELECT gc.countryFR + FROM profile_mentor_country AS m + LEFT JOIN geoloc_countries AS gc ON (m.country = gc.iso_3166_1_a2) WHERE uid = {?}", $user->id()); $page->assign('pays', $res->fetchColumn()); @@ -571,32 +674,33 @@ class ProfileModule extends PLModule $page->setTitle('Conseil Pro'); - //recuperation des noms de secteurs - $res = XDB::iterRow("SELECT id, label FROM emploi_secteur"); - $secteurs[''] = ''; + // Retrieval of sector names + $res = XDB::iterRow("SELECT id, name AS label + FROM profile_job_sector_enum"); + $sectors[''] = ''; while (list($tmp_id, $tmp_label) = $res->next()) { - $secteurs[$tmp_id] = $tmp_label; + $sectors[$tmp_id] = $tmp_label; } - $page->assign_by_ref('secteurs', $secteurs); + $page->assign_by_ref('sectors', $sectors); // nb de mentors - $res = XDB::query("SELECT count(*) FROM mentor"); + $res = XDB::query("SELECT count(*) FROM profile_mentor"); $page->assign('mentors_number', $res->fetchOneCell()); // On vient d'un formulaire - $where = array(); - $pays_sel = XDB::escape(Env::v('pays_sel')); - $secteur_sel = XDB::escape(Env::v('secteur')); - $ss_secteur_sel = XDB::escape(Env::v('ss_secteur')); - $expertise_champ = XDB::escape(Env::v('expertise')); + $where = array(); + $pays_sel = XDB::escape(Env::v('pays_sel')); + $sectorSelection = XDB::escape(Env::v('sector')); + $subSectorSelection = XDB::escape(Env::v('subSector')); + $expertise_champ = XDB::escape(Env::v('expertise')); if ($pays_sel != "''") { - $where[] = "mp.pid = $pays_sel"; + $where[] = "mp.country = $pays_sel"; } - if ($secteur_sel != "''") { - $where[] = "ms.secteur = $secteur_sel"; - if ($ss_secteur_sel != "''") { - $where[] = "ms.ss_secteur = $ss_secteur_sel"; + if ($sectorSelection != "''") { + $where[] = "ms.sectorid = " . $sectorSelection; + if ($selectedSubSector != "''") { + $where[] = "ms.subsectorid = " . $subSectorSelection; } } if ($expertise_champ != "''") { @@ -606,9 +710,9 @@ class ProfileModule extends PLModule if ($where) { $where = join(' AND ', $where); - $set = new UserSet("INNER JOIN mentor AS m ON (m.uid = u.user_id) - LEFT JOIN mentor_pays AS mp ON (mp.uid = m.uid) - LEFT JOIN mentor_secteurs AS ms ON (ms.uid = m.uid)", + $set = new UserSet("INNER JOIN profile_mentor AS m ON (m.uid = u.user_id) + LEFT JOIN profile_mentor_country AS mp ON (mp.uid = m.uid) + LEFT JOIN profile_mentor_sector AS ms ON (ms.uid = m.uid)", $where); $set->addMod('mentor', 'Référents'); $set->apply('referent/search', $page, $action, $subaction); @@ -623,12 +727,12 @@ class ProfileModule extends PLModule { pl_content_headers("text/html"); $page->changeTpl('include/field.select.tpl', NO_SKIN); - $page->assign('onchange', 'setSSecteurs()'); + $page->assign('onchange', 'setSSectors()'); $page->assign('id', 'ssect_field'); - $page->assign('name', 'ss_secteur'); - $it = XDB::iterator("SELECT id,label AS field - FROM emploi_ss_secteur - WHERE secteur = {?}", $sect); + $page->assign('name', 'subSector'); + $it = XDB::iterator("SELECT id, name AS field + FROM profile_job_subsector_enum + WHERE sectorid = {?}", $sect); $page->assign('list', $it); } @@ -637,59 +741,17 @@ class ProfileModule extends PLModule pl_content_headers("text/html"); $page->changeTpl('include/field.select.tpl', NO_SKIN); $page->assign('name', 'pays_sel'); - $where = ($ssect ? ' AND ms.ss_secteur = {?}' : ''); - $it = XDB::iterator("SELECT a2 AS id, pays AS field - FROM geoloc_pays AS g - INNER JOIN mentor_pays AS mp ON (mp.pid = g.a2) - INNER JOIN mentor_secteurs AS ms ON (ms.uid = mp.uid) - WHERE ms.secteur = {?} $where - GROUP BY a2 - ORDER BY pays", $sect, $ssect); + $where = ($ssect ? ' AND ms.subsectorid = {?}' : ''); + $it = XDB::iterator("SELECT gc.iso_3166_1_a2 AS id, gc.countryFR AS field + FROM geoloc_countries AS gc + INNER JOIN profile_mentor_country AS mp ON (mp.country = gc.iso_3166_1_a2) + INNER JOIN profile_mentor_sector AS ms ON (ms.uid = mp.uid) + WHERE ms.sectorid = {?} " . $where . " + GROUP BY iso_3166_1_a2 + ORDER BY countryFR", $sect, $ssect); $page->assign('list', $it); } - function handler_p_usage(&$page) - { - $page->changeTpl('profile/nomusage.tpl'); - - require_once 'validations.inc.php'; - - $res = XDB::query( - "SELECT u.nom, u.nom_usage, u.flags, e.alias - FROM auth_user_md5 AS u - LEFT JOIN aliases AS e ON(u.user_id = e.id - AND FIND_IN_SET('usage', e.flags)) - WHERE user_id={?}", S::v('uid')); - - list($nom, $usage_old, $flags, $alias_old) = $res->fetchOneRow(); - $flags = new PlFlagSet($flags); - $page->assign('usage_old', $usage_old); - $page->assign('alias_old', $alias_old); - - $nom_usage = mb_strtoupper(trim(Env::v('nom_usage'))); - $page->assign('usage_req', $nom_usage); - - if (Env::has('submit') && ($nom_usage != $usage_old)) { - S::assert_xsrf_token(); - - // on vient de recevoir une requete, differente de l'ancien nom d'usage - if ($nom_usage == $nom) { - $page->trigWarning('Le nom d\'usage que tu demandes est identique à ton nom à l\'X, ' - . 'aucune modification n\'a donc été effectuée.'); - $page->assign('same', true); - } else { // le nom de mariage est distinct du nom à l'X - // on calcule l'alias pour l'afficher - $reason = Env::v('reason'); - if ($reason == 'other') { - $reason = Env::v('other_reason'); - } - $myusage = new UsageReq(S::user(), $nom_usage, $reason); - $myusage->submit(); - $page->assign('myusage', $myusage); - } - } - } - function handler_xnet(&$page) { $page->changeTpl('profile/groupesx.tpl'); @@ -779,6 +841,17 @@ class ProfileModule extends PLModule break; } } + function handler_admin_names(&$page, $action = 'list', $id = null) { + $page->setTitle('Administration - Types de noms'); + $page->assign('title', 'Gestion des types de noms'); + $table_editor = new PLTableEditor('admin/names', 'profile_name_enum', 'id', true); + $table_editor->describe('name', 'Nom', true); + $table_editor->describe('explanations', 'Explications', true); + $table_editor->describe('type', 'Type', true); + $table_editor->describe('flags', 'Flags', true); + $table_editor->describe('score', 'Score', true); + $table_editor->apply($page, $action, $id); + } function handler_admin_binets(&$page, $action = 'list', $id = null) { $page->setTitle('Administration - Binets'); $page->assign('title', 'Gestion des binets'); @@ -787,13 +860,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) { @@ -803,27 +902,41 @@ class ProfileModule extends PLModule $table_editor->describe('text','intitulé',true); $table_editor->apply($page, $action, $id); } - function handler_admin_ss_secteurs(&$page, $action = 'list', $id = null) { - $page->setTitle('Administration - Sous-secteurs'); - $page->assign('title', 'Gestion des sous-secteurs'); - $table_editor = new PLTableEditor('admin/ss_secteurs', 'emploi_ss_secteur', 'id', true); - $table_editor->describe('label', 'intitulé', true); + function handler_admin_sectors(&$page, $action = 'list', $id = null) { + $page->setTitle('Administration - Secteurs'); + $page->assign('title', 'Gestion des secteurs'); + $table_editor = new PLTableEditor('admin/sectors', 'profile_job_subsubsector_enum', 'id', true); + $table_editor->describe('sectorid', 'id du secteur', false); + $table_editor->describe('subsectorid', 'id du sous-secteur', false); + $table_editor->describe('name', 'nom', true); + $table_editor->describe('flags', 'affichage', true); $table_editor->apply($page, $action, $id); } - function handler_admin_fonctions(&$page, $action = 'list', $id = null) { - $page->setTitle('Administration - Fonctions'); - $page->assign('title', 'Gestion des fonctions'); - $table_editor = new PLTableEditor('admin/fonctions', 'fonctions_def', 'id', true); - $table_editor->describe('fonction_fr', 'intitulé', true); - $table_editor->describe('fonction_en', 'intitulé (ang)', true); - $table_editor->describe('flags', 'titre', true); + 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_secteurs(&$page, $action = 'list', $id = null) { - $page->setTitle('Administration - Secteurs'); - $page->assign('title', 'Gestion des secteurs'); - $table_editor = new PLTableEditor('admin/secteurs', 'emploi_secteur', 'id', true); - $table_editor->describe('label', 'intitulé', true); + 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) { diff --git a/modules/profile/addresses.inc.php b/modules/profile/addresses.inc.php index fa5d033..a59fa30 100644 --- a/modules/profile/addresses.inc.php +++ b/modules/profile/addresses.inc.php @@ -19,48 +19,29 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * ***************************************************************************/ -class ProfileAddress extends ProfileGeoloc +class ProfileAddress extends ProfileGeocoding { 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, $addrid, array &$address) { - if (@$address['changed']) { - $address['datemaj'] = time(); + if (!isset($address['tel'])) { + $address['tel'] = array(); } - $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']); - } - $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); + $profiletel = new ProfilePhones('address', $addrid); + $address['tel'] = $profiletel->value($page, 'tel', $address['tel'], $s); + $address['current'] = $this->bool->value($page, 'current', $address['current'], $s); $address['temporary'] = $this->bool->value($page, 'temporary', $address['temporary'], $s); - $address['current'] = $this->bool->value($page, 'current', @$address['current'], $s); - $address['pub'] = $this->pub->value($page, 'pub', $address['pub'], $s); - unset($address['parsevalid']); - unset($address['changed']); - unset($address['removed']); - unset($address['display']); + $address['secondary'] = $this->bool->value($page, 'secondary', $address['secondary'], $s); + $address['mail'] = $this->bool->value($page, 'mail', $address['mail'], $s); + $address['pub'] = $this->pub->value($page, 'pub', $address['pub'], $s); } public function value(ProfilePage &$page, $field, $value, &$success) @@ -68,101 +49,102 @@ class ProfileAddress extends ProfileGeoloc $init = false; if (is_null($value)) { $value = $page->values['addresses']; - $init = true; + $init = true; } - foreach ($value as $key=>&$adr) { - if (@$adr['removed']) { + foreach ($value as $key => &$address) { + if (isset($address['removed']) && $address['removed']) { unset($value[$key]); } } $current = 0; $success = true; - foreach ($value as $key=>&$adr) { - if (@$adr['current']) { + foreach ($value as $key => &$address) { + if (isset($address['current']) && $address['current']) { $current++; } } if ($current == 0 && count($value) > 0) { - foreach ($value as $key=>&$adr) { - $adr['current'] = true; + foreach ($value as $address) { + $address['current'] = true; break; } - } else if ($current > 1) { + } elseif ($current > 1) { $success = false; } - foreach ($value as $key=>&$adr) { - $ls = true; - $this->geolocAddress($adr, $s); - $ls = ($ls && $s); - $this->cleanAddress($page, $adr, $s); - $ls = ($ls && $s); - if (!trim($adr['text'])) { + foreach ($value as $key => &$address) { + if (!trim($address['text'])) { unset($value[$key]); - } else if (!$init) { - $success = ($success && $ls); + } elseif (!$init) { + $this->geocodeAddress($address, $s); + $success = $success && $s; } + $this->cleanAddress($page, $key, $address); } return $value; } - private function saveTel($adrid, $telid, array &$tel) + private function saveTel($addrid, $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'), $addrid, $telid, $tel['type'], + format_phone_number($tel['tel']), $tel['tel'], $tel['pub']); } - private function saveAddress($adrid, array &$address) + public function saveAddress($addrid, array &$address, $type) { + require_once "geocoding.inc.php"; + $flags = new PlFlagSet(); - if ($address['secondaire']) { - $flags->addFlag('res-secondaire'); - } - if ($address['mail']) { - $flags->addFlag('courrier'); - } - if ($address['temporary']) { - $flags->addFlag('temporaire'); - } if ($address['current']) { - $flags->addFlag('active'); + $flags->addFlag('current'); } - if ($address['checked']) { - $flags->addFlag('coord-checked'); + if ($address['temporary']) { + $flags->addFlag('temporary'); } - XDB::execute("INSERT INTO adresses (adr1, adr2, adr3, - postcode, city, cityid, - country, region, regiontxt, - pub, datemaj, statut, - uid, adrid, glat, glng) - 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); + if ($address['secondary']) { + $flags->addFlag('secondary'); } + if ($address['mail']) { + $flags->addFlag('mail'); + } + if ($address['cedex'] = + (strpos(strtoupper(preg_replace(array("/[0-9,\"'#~:;_\- ]/", "/\r\n/"), + array("", "\n"), $address['text'])), 'CEDEX')) !== false) { + $flags->addFlag('cedex'); + } + Geocoder::getAreaId($address, "administrativeArea"); + Geocoder::getAreaId($address, "subAdministrativeArea"); + Geocoder::getAreaId($address, "locality"); + XDB::execute("INSERT INTO profile_addresses (pid, type, id, flags, accuracy, + text, postalText, postalCode, localityId, + subAdministrativeAreaId, administrativeAreaId, + countryId, latitude, longitude, updateTime, pub, comment, + north, south, east, west) + VALUES ({?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, + {?}, {?}, FROM_UNIXTIME({?}), {?}, {?}, {?}, {?}, {?}, {?})", + S::i('uid'), $type, $addrid, $flags, $address['accuracy'], + $address['text'], $address['postalText'], $address['postalCode'], $address['localityId'], + $address['subAdministrativeAreaId'], $address['administrativeAreaId'], + $address['countryId'], $address['latitude'], $address['longitude'], + $address['updateTime'], $address['pub'], $address['comment'], + $address['north'], $address['south'], $address['east'], $address['west']); } public function save(ProfilePage &$page, $field, $value) { - XDB::execute("DELETE FROM adresses - WHERE uid = {?}", + XDB::execute("DELETE FROM profile_addresses + WHERE pid = {?} AND type = 'home'", 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); + foreach ($value as $addrid => &$address) { + $this->saveAddress($addrid, $address, 'home'); + $profiletel = new ProfilePhones('address', $addrid); + $profiletel->saveTels('tel', $address['tel']); } } } @@ -175,26 +157,23 @@ class ProfileAddresses extends ProfilePage { parent::__construct($wiz); $this->settings['addresses'] = new ProfileAddress(); - $this->watched['addresses'] = true; + $this->watched['addresses'] = true; } protected function _fetchData() { - // Build the addresses tree - $res = XDB::query("SELECT a.adrid AS id, a.adr1, a.adr2, a.adr3, - UNIX_TIMESTAMP(a.datemaj) AS datemaj, - a.postcode, a.city, a.cityid, a.region, a.regiontxt, - a.pub, a.country, gp.pays AS countrytxt, gp.display, - FIND_IN_SET('coord-checked', a.statut) AS checked, - FIND_IN_SET('res-secondaire', a.statut) AS secondaire, - 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 - FROM adresses AS a - INNER JOIN geoloc_pays AS gp ON(gp.a2 = a.country) - WHERE uid = {?} AND NOT FIND_IN_SET('pro', statut) - ORDER BY adrid", + $res = XDB::query("SELECT id, accuracy, text, postalText, + postalCode, localityId, subAdministrativeAreaId, administrativeAreaId, + countryId, latitude, longitude, pub, comment, UNIX_TIMESTAMP(updateTime) AS updateTime, + north, south, east, west, + FIND_IN_SET('current', flags) AS current, + FIND_IN_SET('temporary', flags) AS temporary, + FIND_IN_SET('secondary', flags) AS secondary, + FIND_IN_SET('mail', flags) AS mail, + FIND_IN_SET('cedex', flags) AS cedex + FROM profile_addresses + WHERE pid = {?} AND type = 'home' + ORDER BY id", S::i('uid')); if ($res->numRows() == 0) { $this->values['addresses'] = array(); @@ -202,16 +181,16 @@ 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 addrid, 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']); while ($tel = $res->next()) { - $adrid = $tel['adrid']; - unset($tel['adrid']); + $adrid = $tel['addrid']; + unset($tel['addrid']); while ($i < $adrNb && $this->values['addresses'][$i]['id'] < $adrid) { $i++; } @@ -226,11 +205,20 @@ class ProfileAddresses extends ProfilePage $address['tel'][] = $tel; } } - foreach ($this->values['addresses'] as $id=>&$address) { + foreach ($this->values['addresses'] as $id => &$address) { if (!isset($address['tel'])) { - $address['tel'] = array(); + $address['tel'] = array( + 0 => array( + 'type' => 'fixed', + 'tel' => '', + 'pub' => 'private', + 'comment' => '', + ) + ); } unset($address['id']); + $address['changed'] = 0; + $address['removed'] = 0; } } } diff --git a/modules/profile/general.inc.php b/modules/profile/general.inc.php index 8afe3f8..6fd592a 100644 --- a/modules/profile/general.inc.php +++ b/modules/profile/general.inc.php @@ -19,8 +19,11 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * ***************************************************************************/ -class ProfileNom implements ProfileSetting +class ProfileSearchNames implements ProfileSetting { + private $private_name_end; + private $search_names; + private function matchWord($old, $new, $newLen) { return ($i = strpos($old, $new)) !== false && ($i == 0 || $old{$i-1} == ' ') @@ -33,59 +36,325 @@ class ProfileNom implements ProfileSetting return preg_replace('/[^A-Z]/', ' ', $value); } - public function value(ProfilePage &$page, $field, $value, &$success) + private function prepare(ProfilePage &$page, $field, $value, $init, &$success) { $success = true; - $current = S::v($field); - $init = S::v($field . '_ini'); - if (is_null($value)) { - return $current; - } - if ($value == $current || $value == $init) { - return $value; - } - $ini = $this->prepareField($init); - $old = $this->prepareField($current); - $new = $this->prepareField($value); - $newLen = strlen($new); - $success = $this->matchWord($old, $new, $newLen) - || $this->matchWord($ini, $new, $newLen) - || ($field == 'nom' && $new == 'DE ' . $old); + $ini = $this->prepareField($init); + $new = $this->prepareField($value); + $newLen = strlen($new); + $success = $this->matchWord($ini, $new, $newLen) + || ($field == 'lastname' && $new == 'DE ' . $ini); if (!$success) { - Platal::page()->trigError("Le $field que tu as choisi ($value) est trop loin de ton $field initial ($init)" - . (($init == $current)? "" : " et de ton prénom précédent ($current)")); + $field = strtolower($field); + Platal::page()->trigError("Le " . $field . " que tu as choisi (" . $value . + ") est trop loin de ton " . $field . " initial (" . $init . ")."); + } + return $success ? $value : $init; + } + + public function value(ProfilePage &$page, $field, $value, &$success) + { + $success = true; + $success_tmp = true; + + if (is_null($value)) { + $sn_all = XDB::iterator("SELECT CONCAT(sn.particle, sn.name) AS name, + sn.particle, sn.typeid, e.type, e.name AS type_name, + FIND_IN_SET('has_particle', e.flags) AS has_particle, + FIND_IN_SET('always_displayed', e.flags) AS always_displayed, + FIND_IN_SET('public', e.flags) AS pub + FROM profile_name AS sn + INNER JOIN profile_name_enum AS e ON (e.id = sn.typeid) + WHERE sn.pid = {?} AND NOT FIND_IN_SET('not_displayed', e.flags) + ORDER BY NOT FIND_IN_SET('always_displayed', e.flags), e.id, sn.name", + S::v('uid')); + + $sn_types = XDB::iterator("SELECT id, type, name, + FIND_IN_SET('has_particle', flags) AS has_particle + FROM profile_name_enum + WHERE NOT FIND_IN_SET('not_displayed', flags) + AND FIND_IN_SET('always_displayed', flags) + ORDER BY id"); + + $value = array(); + $sn = $sn_all->next(); + while ($sn_type = $sn_types->next()) { + if ($sn_type['id'] == $sn['typeid']) { + $value[] = $sn; + $sn = $sn_all->next(); + } else { + $value[] = array('name' => '', + 'particle' => '', + 'typeid' => $sn_type['id'], + 'type' => $sn_type['type'], + 'type_name' => $sn_type['name'], + 'has_particle' => $sn_type['has_particle'], + 'always_displayed' => 1, + 'pub' => 1); + } + } + if ($sn) { + do { + $value[] = $sn; + } while ($sn = $sn_all->next()); + } + } else { + require_once 'name.func.inc.php'; + + $res = XDB::query("SELECT s.particle, s.name + FROM profile_name AS s + INNER JOIN profile_name_enum AS e ON (e.id = s.typeid) + WHERE s.pid = {?} AND e.type LIKE '%ini' + ORDER BY e.type = 'firstname_ini'", + S::i('uid')); + $res = $res->fetchAllAssoc(); + $initial = array(); + $initial['lastname'] = $res[0]['particle'] . $res[0]['name']; + $initial['firstname'] = $res[1]['name']; + $sn_types = build_types(); + $this->search_names = array(); + foreach ($value as &$sn) { + $sn['name'] = trim($sn['name']); + if ($sn['type'] == 'firstname' || $sn['type'] == 'lastname') { + $sn['name'] = $this->prepare($page, $sn['type'], $sn['name'], + $initial[$sn['type']], $success_tmp); + $success = $success && $success_tmp; + } + if ($sn['pub']) { + if (isset($sn['particle']) && ($sn['particle'] != '')) { + list($particle, $name) = explode(' ', $sn['name'], 2); + $particle = trim($particle) . ' '; + if (!$name) { + list($particle, $name) = explode('\'', $sn['name'], 2); + $particle = trim($particle); + } + } else { + $particle = ''; + $name = $sn['name']; + } + } + if ($sn['name'] != '') { + if ($sn['pub']) { + $this->search_names[$sn['typeid']] = array('fullname' => $sn['name'], + 'name' => $name, + 'particle' => $particle, + 'pub' => $sn['pub']); + } else { + if (isset($this->search_names[$sn['typeid']])) { + $this->search_names[$sn['typeid']][] = $sn['name']; + } else { + $this->search_names[$sn['typeid']] = array('fullname' => $sn['name']); + } + $sn['type_name'] = $sn_types[$sn['typeid']]; + } + } + } + $res = XDB::query("SELECT public_name, private_name + FROM profile_display + WHERE pid = {?}", + S::v('uid')); + list($public_name, $private_name) = $res->fetchOneRow(); + if ($success) { + $sn_types_private = build_types('private'); + $this->private_name_end = build_private_name($this->search_names, $sn_types_private); + $private_name = $public_name . $this->private_name_end; + } + Platal::page()->assign('public_name', $public_name); + Platal::page()->assign('private_name', $private_name); + } + + return $value; + } + + public function save(ProfilePage &$page, $field, $value) + { + require_once 'name.func.inc.php'; + $sn_old = build_sn_pub(); + XDB::execute("DELETE FROM s + USING profile_name AS s + INNER JOIN profile_name_enum AS e ON (s.typeid = e.id) + WHERE s.pid = {?} AND NOT FIND_IN_SET('not_displayed', e.flags)", + S::i('uid')); + $has_new = set_alias_names($this->search_names, $sn_old); + + // Only requires validation if modification in public names + if ($has_new) { + $new_names = new NamesReq(S::user(), $this->search_names, $this->private_name_end); + $new_names->submit(); + Platal::page()->trigWarning("La demande de modification de tes noms a bien été prise en compte." . + " Tu recevras un email dès que ces changements auront été effectués."); + } else { + $display_names = array(); + build_display_names($display_names, $this->search_names, $this->private_name_end); + set_profile_display($display_names); + } + } +} + +class ProfileEdu implements ProfileSetting +{ + public function __construct(){} + + static function sortByGradYear($line1, $line2) { + $a = (int) $line1['grad_year']; + $b = (int) $line2['grad_year']; + if ($a == $b) { + return 0; + } + return ($a < $b) ? -1 : 1; + } + + public function value(ProfilePage &$page, $field, $value, &$success) + { + $success = true; + if (is_null($value) || !is_array($value)) { + $value = array(); + $res = XDB::iterator("SELECT eduid, degreeid, fieldid, grad_year, program + FROM profile_education + WHERE uid = {?} AND !FIND_IN_SET('primary', flags) + ORDER BY id", + S::v('uid')); + while($edu = $res->next()) { + $value[] = $edu; + } + } else { + $i = 0; + foreach ($value as $key=>&$edu) { + if (($edu['grad_year'] < 1921) || ($edu['grad_year'] > (date('Y') + 4))) { + Platal::page()->trigError('L\'année d\'obtention du diplôme est mal renseignée, elle doit être du type : 2004.'); + $edu['error'] = true; + $success = false; + } + if ($key != $i) { + $value[$i] = $edu; + unset($value[$key]); + } + $i++; + } + usort($value, array("ProfileEdu", "sortByGradYear")); } - return $success ? $value : $current; + return $value; } - public function save(ProfilePage &$page, $field, $new_value) + public function save(ProfilePage &$page, $field, $value) { - $_SESSION[$field] = $new_value; + XDB::execute("DELETE FROM profile_education + WHERE uid = {?} AND !FIND_IN_SET('primary', flags)", + S::i('uid')); + foreach ($value as $eduid=>&$edu) { + if ($edu['eduid'] != '') { + XDB::execute("INSERT INTO profile_education + SET id = {?}, uid = {?}, eduid = {?}, degreeid = {?}, + fieldid = {?}, grad_year = {?}, program = {?}", + $eduid, S::i('uid'), $edu['eduid'], $edu['degreeid'], + $edu['fieldid'], $edu['grad_year'], $edu['program']); + } + } } } -class ProfileAppli implements ProfileSetting +class ProfileEmailDirectory implements ProfileSetting { + public function __construct(){} + public function save(ProfilePage &$page, $field, $value){} + 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; + } +} + +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 +366,51 @@ class ProfileGeneral extends ProfilePage public function __construct(PlWizard &$wiz) { parent::__construct($wiz); - $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['search_names'] + = new ProfileSearchNames(); + $this->settings['naissance'] + = new ProfileDate(); + $this->settings['freetext_pub'] = $this->settings['photo_pub'] = new ProfilePub(); $this->settings['freetext'] = $this->settings['nationalite'] - = $this->settings['nick'] + = $this->settings['nationalite2'] + = $this->settings['nationalite3'] + = $this->settings['yourself'] + = $this->settings['promo'] = 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('freetext' => true, 'tels' => true, + 'networking' => true, 'edus' => true, + 'nationalite' => true, 'nationalite2' => true, + 'nationalite3' => true, 'search_names' => true); } protected function _fetchData() { // Checkout all data... - $res = XDB::query("SELECT u.promo, u.promo_sortie, u.nom_usage, u.nationalite, u.naissance, - q.profile_mobile as mobile, q.profile_mobile_pub as mobile_pub, - q.profile_web as web, q.profile_web_pub as web_pub, + $res = XDB::query("SELECT p.promo, e.entry_year AS entry_year, e.grad_year AS grad_year, + 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.hruid, - 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) + u.matricule_ax, p.yourself + FROM auth_user_md5 AS u + INNER JOIN auth_user_quick AS q ON (u.user_id = q.user_id) + INNER JOIN profile_display AS p ON (p.pid = u.user_id) + INNER JOIN profile_education AS e ON (e.uid = u.user_id AND FIND_IN_SET('primary', e.flags)) + LEFT JOIN profile_phones AS t ON (u.user_id = t.uid AND link_type = 'user') + LEFT JOIN profile_directory AS d ON (d.uid = u.user_id) WHERE u.user_id = {?}", S::v('uid', -1)); $this->values = $res->fetchOneAssoc(); - // Reformat formation data - $this->values['appli1'] = array('id' => $this->values['appli_id1'], - 'type' => $this->values['appli_type1']); - unset($this->values['appli_id1']); - unset($this->values['appli_type1']); - $this->values['appli2'] = array('id' => $this->values['appli_id2'], - 'type' => $this->values['appli_type2']); - unset($this->values['appli_id2']); - unset($this->values['appli_type2']); - // Retreive photo informations $res = XDB::query("SELECT pub FROM photo @@ -158,35 +422,54 @@ class ProfileGeneral extends ProfilePage WHERE type='photo' AND user_id = {?}", S::v('uid')); $this->values['nouvellephoto'] = $res->fetchOneCell(); + + // Proposes choice for promotion + if ($this->values['entry_year'] != $this->values['grad_year'] - 3) { + for ($i = $this->values['entry_year']; $i < $this->values['grad_year'] - 2; $i++) { + $this->values['promo_choice'][] = "X" . $i; + } + } } protected function _saveData() { - if ($this->changed['nationalite'] || $this->changed['nom'] || $this->changed['prenom'] + if ($this->changed['nationalite'] || $this->changed['nationalite2'] || $this->changed['nationalite3'] || $this->changed['naissance']) { - XDB::execute("UPDATE auth_user_md5 - SET nationalite = {?}, nom={?}, prenom={?}, naissance={?} - WHERE user_id = {?}", - $this->values['nationalite'], $this->values['nom'], $this->values['prenom'], + if ($this->values['nationalite3'] == "") { + $this->values['nationalite3'] = NULL; + } + if ($this->values['nationalite2'] == "") { + $this->values['nationalite2'] = $this->values['nationalite3']; + $this->values['nationalite3'] = NULL; + } + if ($this->values['nationalite'] == "") { + $this->values['nationalite'] = $this->values['nationalite2']; + $this->values['nationalite2'] = $this->values['nationalite3']; + $this->values['nationalite3'] = NULL; + } + + XDB::execute("UPDATE auth_user_md5 + SET nationalite = {?}, nationalite2 = {?}, nationalite3 = {?}, naissance={?} + WHERE user_id = {?}", + $this->values['nationalite'], $this->values['nationalite2'], $this->values['nationalite3'], 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['freetext'] || $this->changed['freetext_pub']) { XDB::execute("UPDATE auth_user_quick - SET profile_nick= {?}, profile_mobile={?}, profile_mobile_pub={?}, - profile_web={?}, profile_web_pub={?}, 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['freetext'], $this->values['freetext_pub'], - $this->values['synchro_ax'], S::v('uid')); - } - if ($this->changed['nick']) { - require_once('user.func.inc.php'); - user_reindex(S::v('uid')); + SET profile_freetext={?}, profile_freetext_pub={?} + WHERE user_id = {?}", + $this->values['freetext'], $this->values['freetext_pub'], 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['photo_pub']) { XDB::execute("UPDATE photo @@ -194,11 +477,44 @@ class ProfileGeneral extends ProfilePage WHERE uid = {?}", $this->values['photo_pub'], S::v('uid')); } + if ($this->changed['yourself']) { + XDB::execute("UPDATE profile_display + SET yourself = {?} + WHERE pid = {?}", + $this->values['yourself'], S::v('uid')); + } + if ($this->changed['promo']) { + XDB::execute("UPDATE profile_display + SET promo = {?} + WHERE pid = {?}", + $this->values['promo'], 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()); + + $res = XDB::query("SELECT public_name, private_name + FROM profile_display + WHERE pid = {?}", + S::v('uid')); + $res = $res->fetchOneRow(); + $page->assign('public_name', $res[0]); + $page->assign('private_name', $res[1]); } } diff --git a/modules/profile/jobs.inc.php b/modules/profile/jobs.inc.php index d629711..c376f12 100644 --- a/modules/profile/jobs.inc.php +++ b/modules/profile/jobs.inc.php @@ -19,31 +19,106 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * ***************************************************************************/ -class ProfileJob extends ProfileGeoloc +class ProfileJob extends ProfileGeocoding { private $pub; - private $mail; - private $web; - private $tel; + private $email_new; + private $email; + private $url; private $bool; private $checks; public function __construct() { - $this->pub = new ProfilePub(); - $this->mail = new ProfileEmail(); - $this->web = new ProfileWeb(); - $this->tel = new ProfileTel(); - $this->bool = new ProfileBool(); - $this->checks = array('web' => array('web'), - 'mail' => array('email'), - 'tel' => array('tel', 'fax', 'mobile'), - 'pub' => array('pub', 'tel_pub', 'email_pub')); + $this->pub = new ProfilePub(); + $this->email + = $this->email_new + = new ProfileEmail(); + $this->url = new ProfileWeb(); + $this->bool = new ProfileBool(); + $this->checks = array('url' => array('w_url'), + 'email' => array('w_email'), + 'pub' => array('pub', 'w_email_pub'), + ); } - private function cleanJob(ProfilePage &$page, array &$job, &$success) + public function emptyJob() + { + return array( + 'id' => '0', + 'jobid' => '', + 'pub' => 'private', + 'name' => '', + 'hq_acronym' => '', + 'hq_url' => '', + 'hq_email' => '', + 'hq_address' => array( + 'text' => '', + 'accuracy' => '', + 'postalText' => '', + 'postalCode' => '', + 'administrativeAreaId' => '', + 'subAdministrativeAreaId' => '', + 'localityId' => '', + 'countryId' => '', + 'latitude' => '', + 'longitude' => '', + 'north' => '', + 'south' => '', + 'east' => '', + 'west' => '', + 'cedex' => '', + 'updateTime' => '', + 'changed' => '0', + 'removed' => '0', + ), + 'hq_phone' => '', + 'hq_fax' => '', + 'subSubSectorName' => null, + 'sector' => '0', + 'subSector' => '0', + 'subSubSector' => '0', + 'description' => '', + 'w_url' => '', + 'w_address' => array( + 'pub' => 'private', + 'text' => '', + 'accuracy' => '', + 'postalText' => '', + 'postalCode' => '', + 'administrativeAreaId' => '', + 'subAdministrativeAreaId' => '', + 'localityId' => '', + 'countryId' => '', + 'latitude' => '', + 'longitude' => '', + 'north' => '', + 'south' => '', + 'east' => '', + 'west' => '', + 'cedex' => '', + 'updateTime' => '', + 'changed' => '0', + 'removed' => '0', + ), + 'w_email' => '', + 'w_email_pub' => 'private', + 'w_email_new' => '', + 'w_phone' => array(0 => array( + 'type' => 'fixed', + 'tel' => '', + 'pub' => 'private', + 'comment' => '', + )), + ); + } + + private function cleanJob(ProfilePage &$page, $jobid, array &$job, &$success) { $success = true; + if ($job['w_email'] == "new@example.org") { + $job['w_email'] = $job['w_email_new']; + } foreach ($this->checks as $obj=>&$fields) { $chk =& $this->$obj; foreach ($fields as $field) { @@ -54,17 +129,61 @@ 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 (!$job['subSubSectorName']) { + $res = XDB::query("SELECT name + FROM profile_job_subsubsector_enum + WHERE id = {?}", + $job['subSubSector']); + $job['subSubSectorName'] = $res->fetchOneCell(); + } else { + $res = XDB::query("SELECT sectorid, subsectorid, id + FROM profile_job_subsubsector_enum + WHERE name = {?}", + $job['subSubSectorName']); + if ($res->numRows() != 1) { + $success = false; + $job['sector_error'] = true; + } else { + list($job['sector'], $job['subSector'], $job['subSubSector']) = $res->fetchOneRow(); + } + } + if ($job['name']) { + $res = XDB::query("SELECT id + FROM profile_job_enum + WHERE name = {?}", + $job['name']); + if ($res->numRows() != 1) { + $user = S::user(); + $this->geocodeAddress($job['hq_address'], $s); + if (!$s) { + $gmapsGeocoder = new GMapsGeocoder(); + $job['hq_address'] = $gmapsGeocoder->stripGeocodingFromAddress($job['hq_address']); + } + $req = new EntrReq($user, $jobid, $job['name'], $job['hq_acronym'], $job['hq_url'], + $job['hq_email'], $job['hq_fixed'], $job['hq_fax'], $job['hq_address']); + $req->submit(); + $job['jobid'] = null; + } else { + $job['jobid'] = $res->fetchOneCell(); + } + } + $job['w_address']['pub'] = $this->pub->value($page, 'address_pub', $job['w_address']['pub'], $s); + if (!isset($job['w_phone'])) { + $job['w_phone'] = array(); + } + $profiletel = new ProfilePhones('pro', $jobid); + $job['w_phone'] = $profiletel->value($page, 'tel', $job['w_phone'], $s); + unset($job['removed']); unset($job['new']); - unset($job['adr']['changed']); - unset($job['adr']['parsevalid']); - unset($job['adr']['display']); } public function value(ProfilePage &$page, $field, $value, &$success) { + require_once('validations.inc.php'); + $entreprise = Validate::get_typed_requests(S::i('uid'), 'entreprise'); + $entr_val = 0; + $init = false; if (is_null($value)) { $value = $page->values['jobs']; @@ -72,15 +191,20 @@ class ProfileJob extends ProfileGeoloc } $success = true; foreach ($value as $key=>&$job) { - if (@$job['removed'] || !trim($job['name'])) { + $job['name'] = trim($job['name']); + if (!$job['name'] && $entreprise) { + $job['tmp_name'] = $entreprise[$entr_val]->name; + $entr_val ++; + } + if (isset($job['removed']) && $job['removed']) { unset($value[$key]); } } foreach ($value as $key=>&$job) { $ls = true; - $this->geolocAddress($job['adr'], $s); + $this->geocodeAddress($job['w_address'], $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 +215,40 @@ class ProfileJob extends ProfileGeoloc public function save(ProfilePage &$page, $field, $value) { - XDB::execute("DELETE FROM entreprises + // TODO: use address and phone classes to update profile_job_enum and profile_phones once they are done. + + require_once('profil.func.inc.php'); + require_once('validations.inc.php'); + + XDB::execute("DELETE FROM profile_job WHERE uid = {?}", S::i('uid')); - $i = 0; - foreach ($value as &$job) { - 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, - glat, glng) - VALUES ({?}, {?}, {?}, {?}, {?}, - {?}, {?}, {?}, {?}, {?}, {?}, - {?}, {?}, {?}, {?}, {?}, - {?}, {?}, {?}, {?}, {?}, - {?}, {?}, {?}, {?}, {?}, - {?}, {?})", - 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['adr']['checked'] ? 'geoloc' : '', $job['adr']['precise_lat'], - $job['adr']['precise_lon']); + XDB::execute("DELETE FROM profile_addresses + WHERE pid = {?} AND type = 'job'", + S::i('uid')); + XDB::execute("DELETE FROM profile_phones + WHERE uid = {?} AND link_type = 'pro'", + S::i('uid')); + foreach ($value as $id=>&$job) { + if (isset($job['name']) && $job['name']) { + if (isset($job['jobid']) && $job['jobid']) { + XDB::execute("INSERT INTO profile_job (uid, id, description, sectorid, subsectorid, + subsubsectorid, email, url, pub, email_pub, jobid) + VALUES ({?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?})", + S::i('uid'), $id, $job['description'], $job['sector'], $job['subSector'], + $job['subSubSector'], $job['w_email'], $job['w_url'], $job['pub'], $job['w_email_pub'], $job['jobid']); + } else { + XDB::execute("INSERT INTO profile_job (uid, id, description, sectorid, subsectorid, + subsubsectorid, email, url, pub, email_pub) + VALUES ({?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?})", + S::i('uid'), $id, $job['description'], $job['sector'], $job['subSector'], + $job['subSubSector'], $job['w_email'], $job['w_url'], $job['pub'], $job['w_email_pub']); + } + $address = new ProfileAddress(); + $address->saveAddress($id, $job['w_address'], 'job'); + $profiletel = new ProfilePhones('pro', $id); + $profiletel->saveTels('tel', $job['w_phone']); + } } } } @@ -129,8 +261,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,53 +275,178 @@ 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, - 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.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 != '' - ORDER BY entrid", S::i('uid')); + $res = XDB::iterRow("SELECT j.id, j.jobid, je.name, j.sectorid, j.subsectorid, j.subsubsectorid, + s.name, j.description, j.email, j.email_pub, j.url, j.pub, + je.acronym, je.url, je.email, + aw.accuracy, aw.text, aw.postalText, aw.postalCode, aw.localityId, + aw.subAdministrativeAreaId, aw.administrativeAreaId, aw.countryId, + aw.latitude, aw.longitude, aw.pub, aw.updateTime, + aw.north, aw.south, aw.east, aw.west, + ah.accuracy, ah.text, ah.postalText, ah.postalCode, ah.localityId, + ah.subAdministrativeAreaId, ah.administrativeAreaId, ah.countryId, + ah.latitude, ah.longitude, ah.pub, ah.updateTime, + ah.north, ah.south, ah.east, ah.west + FROM profile_job AS j + LEFT JOIN profile_job_enum AS je ON (j.jobid = je.id) + LEFT JOIN profile_job_subsubsector_enum AS s ON (s.id = j.subsubsectorid) + LEFT JOIN profile_addresses AS aw ON (aw.pid = j.uid AND aw.type = 'job' + AND aw.id = j.id) + LEFT JOIN profile_addresses AS ah ON (ah.jobid = j.jobid AND ah.type = 'hq') + WHERE j.uid = {?} + ORDER BY j.id", + S::i('uid')); $this->values['jobs'] = array(); - while (list($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, - 'secteur' => $secteur, - 'ss_secteur' => $ss_secteur, - 'fonction' => $fonction, - 'poste' => $poste, - 'adr' => array('adr1' => $adr1, - 'adr2' => $adr2, - 'adr3' => $adr3, - 'postcode' => $postcode, - 'city' => $city, - 'cityid' => $cityid, - 'region' => $region, - 'regiontxt' => $regiontxt, - 'country' => $country, - 'countrytxt' => $countrytxt, - 'display' => $display, - 'pub' => $adr_pub, - '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); + + if ($res->numRows() > 0) { + while (list($id, $jobid, $name, $sector, $subSector, $subSubSector, + $subSubSectorName, $description, $w_email, $w_emailPub, $w_url, $pub, + $hq_acronym, $hq_url, $hq_email, + $w_accuracy, $w_text, $w_postalText, $w_postalCode, $w_localityId, + $w_subAdministrativeAreaId, $w_administrativeAreaId, $w_countryId, + $w_latitude, $w_longitude, $w_pub, $w_updateTime, + $w_north, $w_south, $w_east, $w_west, + $hq_accuracy, $hq_text, $hq_postalText, $hq_postalCode, $hq_localityId, + $hq_subAdministrativeAreaId, $hq_administrativeAreaId, $hq_countryId, + $hq_latitude, $hq_longitude, $hq_pub, $hq_updateTime, + $hq_north, $hq_south, $hq_east, $hq_west, + ) = $res->next()) { + $this->values['jobs'][] = array( + 'id' => $id, + 'jobid' => $jobid, + 'name' => $name, + 'sector' => $sector, + 'subSector' => $subSector, + 'subSubSector' => $subSubSector, + 'subSubSectorName' => $subSubSectorName, + 'description' => $description, + 'pub' => $pub, + 'w_email' => $w_email, + 'w_email_pub' => $w_emailPub, + 'w_url' => $w_url, + 'hq_acronym' => $hq_acronym, + 'hq_url' => $hq_url, + 'hq_email' => $hq_email, + 'w_address' => array( + 'accuracy' => $w_accuracy, + 'text' => $w_text, + 'postalText' => $w_postalText, + 'postalCode' => $w_postalCode, + 'localityId' => $w_localityId, + 'subAdministrativeAreaId' => $w_subAdministrativeAreaId, + 'administrativeAreaId' => $w_administrativeAreaId, + 'countryId' => $w_countryId, + 'latitude' => $w_latitude, + 'longitude' => $w_longitude, + 'pub' => $w_pub, + 'updateTime' => $w_updateTime, + 'north' => $w_north, + 'south' => $w_south, + 'east' => $w_east, + 'west' => $w_west, + ), + 'hq_address' => array( + 'accuracy' => $hq_accuracy, + 'text' => $hq_text, + 'postalText' => $hq_postalText, + 'postalCode' => $hq_postalCode, + 'localityId' => $hq_localityId, + 'subAdministrativeAreaId' => $hq_subAdministrativeAreaId, + 'administrativeAreaId' => $hq_administrativeAreaId, + 'countryId' => $hq_countryId, + 'latitude' => $hq_latitude, + 'longitude' => $hq_longitude, + 'pub' => $hq_pub, + 'updateTime' => $hq_updateTime, + 'north' => $hq_north, + 'south' => $hq_south, + 'east' => $hq_east, + 'west' => $hq_west, + ), + ); + } + + $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 ($phone = $res->next()) { + $jobid = $phone['jobid']; + while ($i < $jobNb && $this->values['jobs'][$i]['id'] < $jobid) { + $i++; + } + if ($i >= $jobNb) { + break; + } + $job =& $this->values['jobs'][$i]; + if (!isset($job['w_phone'])) { + $job['w_phone'] = array(); + } + if ($job['id'] == $jobid) { + $job['w_phone'][] = $phone; + } + } + foreach ($this->values['jobs'] as $id => &$job) { + if (!isset($job['w_phone'])) { + $job['w_phone'] = array( + 0 => array( + 'type' => 'fixed', + 'tel' => '', + 'pub' => 'private', + 'comment' => '', + ) + ); + } + } + + $job['w_email_new'] = ''; + if (!isset($job['hq_phone'])) { + $job['hq_phone'] = ''; + } + if (!isset($job['hq_fax'])) { + $job['hq_fax'] = ''; + } + if (!isset($job['w_email_pub'])) { + $job['w_email_pub'] = 'private'; + } + if (!$job['hq_address']['text']) { + $job['hq_address'] = array( + 'text' => '', + 'accuracy' => '', + 'postalText' => '', + 'postalCode' => '', + 'administrativeAreaId' => '', + 'subAdministrativeAreaId' => '', + 'localityId' => '', + 'countryId' => '', + 'latitude' => '', + 'longitude' => '', + 'north' => '', + 'south' => '', + 'east' => '', + 'west' => '', + 'cedex' => '', + 'updateTime' => '', + 'changed' => '0', + 'removed' => '0', + ); + } + $job['w_address']['cedex'] = ''; + $job['w_address']['changed'] = '0'; + $job['w_address']['removed'] = '0'; + } else { + $this->values['jobs'][] = $this->settings['jobs']->emptyJob(); } } @@ -200,17 +458,40 @@ 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) { - $res = XDB::query("SELECT id, label - FROM emploi_secteur"); - $page->assign('secteurs', $res->fetchAllAssoc()); - $res = XDB::query("SELECT id, fonction_fr, FIND_IN_SET('titre', flags) AS title - FROM fonctions_def - ORDER BY id"); - $page->assign('fonctions', $res->fetchAllAssoc()); + require_once "emails.combobox.inc.php"; + fill_email_combobox($page); + + $res = XDB::query("SELECT id, name AS label + FROM profile_job_sector_enum"); + $page->assign('sectors', $res->fetchAllAssoc()); + + $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()); } } diff --git a/modules/profile/mentor.inc.php b/modules/profile/mentor.inc.php index 2c85c64..e85318c 100644 --- a/modules/profile/mentor.inc.php +++ b/modules/profile/mentor.inc.php @@ -19,17 +19,17 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * ***************************************************************************/ -class ProfileSecteurs implements ProfileSetting +class ProfileSectors implements ProfileSetting { public function value(ProfilePage &$page, $field, $value, &$success) { $success = true; if (is_null($value)) { $value = array(); - $res = XDB::iterRow("SELECT m.secteur, m.ss_secteur, ss.label - FROM mentor_secteurs AS m - INNER JOIN emploi_secteur AS s ON(m.secteur = s.id) - INNER JOIN emploi_ss_secteur AS ss ON(s.id = ss.secteur AND m.ss_secteur = ss.id) + $res = XDB::iterRow("SELECT m.sectorid, m.subsectorid, ss.name + FROM profile_mentor_sector AS m + INNER JOIN profile_job_sector_enum AS s ON (m.sectorid = s.id) + INNER JOIN profile_job_subsector_enum AS ss ON (s.id = ss.sectorid AND m.subsectorid = ss.id) WHERE m.uid = {?}", S::i('uid')); while (list($s, $ss, $ssname) = $res->next()) { @@ -39,10 +39,10 @@ class ProfileSecteurs implements ProfileSetting $value[$s][$ss] = $ssname; } } - } else if (!is_array($value)) { + } elseif (!is_array($value)) { $value = array(); - } else if (count($value) > 10) { - Platal::page()->trigError("Le nombre de secteurs d'expertise est limité à 10"); + } elseif (count($value) > 10) { + Platal::page()->trigError("Le nombre de secteurs d'expertise est limité à 10."); $success = false; } ksort($value); @@ -55,15 +55,15 @@ class ProfileSecteurs implements ProfileSetting public function save(ProfilePage &$page, $field, $value) { - XDB::execute("DELETE FROM mentor_secteurs + XDB::execute("DELETE FROM profile_mentor_sector WHERE uid = {?}", S::i('uid')); if (!count($value)) { return; } - foreach ($value as $id=>&$sect) { - foreach ($sect as $sid=>&$name) { - XDB::execute("INSERT INTO mentor_secteurs (uid, secteur, ss_secteur) + foreach ($value as $id => $sect) { + foreach ($sect as $sid => $name) { + XDB::execute("INSERT INTO profile_mentor_sector (uid, sectorid, subsectorid) VALUES ({?}, {?}, {?})", S::i('uid'), $id, $sid); } @@ -78,9 +78,9 @@ class ProfileCountry implements ProfileSetting $success = true; if (is_null($value)) { $value = array(); - $res = XDB::iterRow("SELECT m.pid, p.pays - FROM mentor_pays AS m - INNER JOIN geoloc_pays AS p ON(m.pid = p.a2) + $res = XDB::iterRow("SELECT m.country, gc.countryFR + FROM profile_mentor_country AS m + INNER JOIN geoloc_countries AS gc ON (m.country = gc.iso_3166_1_a2) WHERE m.uid = {?}", S::i('uid')); while (list($id, $name) = $res->next()) { @@ -98,11 +98,11 @@ class ProfileCountry implements ProfileSetting public function save(ProfilePage &$page, $field, $value) { - XDB::execute("DELETE FROM mentor_pays + XDB::execute("DELETE FROM profile_mentor_country WHERE uid = {?}", S::i('uid')); foreach ($value as $id=>&$name) { - XDB::execute("INSERT INTO mentor_pays (uid, pid) + XDB::execute("INSERT INTO profile_mentor_country (uid, country) VALUES ({?}, {?})", S::i('uid'), $id); } @@ -118,14 +118,14 @@ class ProfileMentor extends ProfilePage { parent::__construct($wiz); $this->settings['expertise'] = null; - $this->settings['secteurs'] = new ProfileSecteurs(); + $this->settings['sectors'] = new ProfileSectors(); $this->settings['countries'] = new ProfileCountry(); } protected function _fetchData() { $res = XDB::query("SELECT expertise - FROM mentor + FROM profile_mentor WHERE uid = {?}", S::i('uid')); $this->values['expertise'] = $res->fetchOneCell(); @@ -136,12 +136,12 @@ class ProfileMentor extends ProfilePage if ($this->changed['expertise']) { $expertise = trim($this->values['expertise']); if (empty($expertise)) { - XDB::execute("DELETE FROM mentor + XDB::execute("DELETE FROM profile_mentor WHERE uid = {?}", S::i('uid')); $this->values['expertise'] = null; } else { - XDB::execute("REPLACE INTO mentor (uid, expertise) + XDB::execute("REPLACE INTO profile_mentor (uid, expertise) VALUES ({?}, {?})", S::i('uid'), $expertise); $this->values['expertise'] = $expertise; @@ -151,8 +151,12 @@ class ProfileMentor extends ProfilePage public function _prepare(PlPage &$page, $id) { - $page->assign('secteurs_sel', XDB::iterator("SELECT id, label - FROM emploi_secteur")); + $page->assign('sectorList', XDB::iterator('SELECT id, name + FROM profile_job_sector_enum')); + + $page->assign('countryList', XDB::iterator("SELECT iso_3166_1_a2, countryFR + FROM geoloc_countries + ORDER BY countryFR")); } } diff --git a/modules/profile/page.inc.php b/modules/profile/page.inc.php index 64d0bba..fa4a27b 100644 --- a/modules/profile/page.inc.php +++ b/modules/profile/page.inc.php @@ -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,14 +100,117 @@ 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 $id; + protected $link_type; + protected $link_id; + + public function __construct($type, $link_id, $id = 0) + { + if ($id != 0) { + $this->id = $id; + } else { + $this->id = S::i('uid'); + } + $this->tel = new ProfileTel(); + $this->pub = new ProfilePub(); + $this->link_type = $type; + $this->link_id = $link_id; + } + + public function value(ProfilePage &$page, $field, $value, &$success) + { + $success = true; + if (is_null($value)) { + $value = array(); + $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 = {?} + ORDER BY t.tel_id", + $this->id, $this->link_type); + if ($res->numRows() > 0) { + $value = $res->fetchAllAssoc(); + } else { + $value = array( + 0 => array( + 'type' => 'fixed', + 'tel' => '', + 'pub' => 'private', + 'comment' => '', + ) + ); + } + } + foreach ($value as $key=>&$phone) { + if (isset($phone['removed']) && $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 ({?}, {?}, {?}, {?}, {?}, + {?}, {?}, {?}, {?})", + $this->id, $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 = {?}", + $this->id, $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 { public function value(ProfilePage &$page, $field, $value, &$success) @@ -100,9 +219,9 @@ class ProfilePub extends ProfileNoSave if (is_null($value)) { return isset($page->values[$field]) ? $page->values[$field] : S::v($field); } - if (is_null($value) || !$value) { + if (!$value) { $value = 'private'; - } else if ($value == 'on') { // Checkbox + } elseif ($value == 'on') { // Checkbox $value = 'public'; } return $value; @@ -115,7 +234,7 @@ class ProfileBool extends ProfileNoSave { $success = true; if (is_null($value)) { - $value = @$page->values[$field]; + $value = isset($page->values[$field]) ? $page->values[$field] : null; } return $value ? "1" : ""; } @@ -146,47 +265,30 @@ class ProfileDate extends ProfileNoSave } } -abstract class ProfileGeoloc implements ProfileSetting +abstract class ProfileGeocoding implements ProfileSetting { - protected function geolocAddress(array &$address, &$success) + protected function geocodeAddress(array &$address, &$success) { - require_once 'geoloc.inc.php'; + require_once 'geocoding.inc.php'; $success = true; - unset($address['geoloc']); - unset($address['geoloc_cityid']); - if (@$address['parsevalid'] - || (@$address['text'] && @$address['changed']) - || (@$address['text'] && !@$address['cityid'])) { - $address = array_merge($address, empty_address()); - $new = get_address_infos(@$address['text']); - if (compare_addresses_text(@$address['text'], $geotxt = get_address_text($new)) - || (@$address['parsevalid'] && @$address['cityid'])) { - $address = array_merge($address, $new); - $address['checked'] = true; - } else if (@$address['parsevalid']) { - $address = array_merge($address, cut_address(@$address['text'])); - $address['checked'] = true; - $mailer = new PlMailer('geoloc/geoloc.mail.tpl'); - $mailer->assign('text', get_address_text($address)); - $mailer->assign('geoloc', $geotxt); - $mailer->send(); - } else if (@$address['changed'] || !@$address['checked']) { + if (isset($address['changed']) && $address['changed'] == 1) { + $gmapsGeocoder = new GMapsGeocoder(); + $address = $gmapsGeocoder->getGeocodedAddress($address); + if (isset($address['geoloc'])) { $success = false; - $address = array_merge($address, cut_address(@$address['text'])); - $address['checked'] = false; - $address['geoloc'] = $geotxt; - $address['geoloc_cityid'] = $new['cityid']; - } else { - $address = array_merge($address, cut_address(@$address['text'])); - $address['checked'] = true; } } elseif (@$address['changed'] && !@$address['text']) { $address = empty_address(); $address['pub'] = 'private'; } - $address['precise_lat'] = rtrim($address['precise_lat'], '.0'); - $address['precise_lon'] = rtrim($address['precise_lon'], '.0'); - $address['text'] = get_address_text($address); + if (isset($address['geoloc_choice']) && ($address['geoloc_choice'] == 0)) { + $mailer = new PlMailer('geoloc/geoloc.mail.tpl'); + $mailer->assign('text', $address['text']); + $mailer->assign('geoloc', $address['geoloc']); + $mailer->send(); + $gmapsGeocoder = new GMapsGeocoder(); + $address = $gmapsGeocoder->stripGeocodingFromAddress($address); + } } } diff --git a/modules/register.php b/modules/register.php index 9ac8d6b..7e2d4bb 100644 --- a/modules/register.php +++ b/modules/register.php @@ -421,7 +421,7 @@ class RegisterModule extends PLModule $res = XDB::iterRow( "SELECT sa.alias, IF(s.nom_usage,s.nom_usage,s.nom) AS nom, s.prenom, FIND_IN_SET('femme', s.flags) AS femme, - GROUP_CONCAT(m.email) AS mails, MAX(m.last) AS dateDernier + GROUP_CONCAT(m.email SEPARATOR ', ') AS mails, MAX(m.last) AS dateDernier FROM register_marketing AS m INNER JOIN auth_user_md5 AS s ON (m.sender = s.user_id) INNER JOIN aliases AS sa ON (sa.id = m.sender diff --git a/modules/search.php b/modules/search.php index 986d832..9820f3b 100644 --- a/modules/search.php +++ b/modules/search.php @@ -49,21 +49,24 @@ class SearchModule extends PLModule $school = Env::i('school'); } - if (!is_null($school)) { - $sql = 'SELECT type FROM applis_def WHERE id=' . $school; + if ((!is_null($school)) && ($school != '')) { + $sql = 'SELECT degreeid + FROM profile_education_degree + WHERE eduid=' . $school; } else { - $sql = 'DESCRIBE applis_def type'; + $sql = 'SELECT id + FROM profile_education_degree_enum + ORDER BY id'; } $res = XDB::query($sql); - $row = $res->fetchOneRow(); - if (!is_null($school)) { - $types = $row[0]; - } else { - $types = explode('(',$row[1]); - $types = str_replace("'","",substr($types[1],0,-1)); - } - Platal::page()->assign('choix_diplomas', explode(',',$types)); + Platal::page()->assign('choix_diplomas', $res->fetchColumn()); + + $sql = 'SELECT degree + FROM profile_education_degree_enum + ORDER BY id'; + $res = XDB::query($sql); + Platal::page()->assign('name_diplomas', $res->fetchColumn()); } function handler_quick(&$page, $action = null, $subaction = null) @@ -161,17 +164,21 @@ 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' => "(cat = 'GroupesX' OR 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' => 'iso_3166_1_a2', 'table' => 'geoloc_countries', 'text' => 'countryFR', + 'exact' => false), + 'fonction' => array('field' => 'id', 'table' => 'fonctions_def', 'text' => 'fonction_fr', 'exact' => true), + 'secteur' => array('field' => 'id', 'table' => 'profile_job_sector_enum', 'text' => 'name', 'exact' => false), + 'nationalite' => array('field' => 'iso_3166_1_a2', 'table' => 'geoloc_countries', + 'text' => 'nationalityFR', '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' => "(cat = 'GroupesX' OR 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_localities', 'text' => 'name', 'exact' => false) ); if (!Env::has('page')) { S::logger()->log('search', 'adv=' . var_export($_GET, true)); @@ -246,45 +253,49 @@ class SearchModule extends PLModule $beginwith = true; $field2 = false; $qsearch = str_replace(array('%', '_'), '', $q); + $distinct = true; switch ($type) { 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`)'; - $unique='`uid`'; - $field='`geoloc_city`.`name`'; + $db = 'geoloc_localities INNER JOIN + profile_addresses ON (geoloc_localities.id = profile_addresses.localityId)'; + $unique = 'uid'; + $field ='geoloc_localities.name'; break; case 'countryTxt': - $db = '`geoloc_pays` INNER JOIN - `adresses` ON(`geoloc_pays`.`a2` = `adresses`.`country`)'; - $unique='`uid`'; - $field = '`geoloc_pays`.`pays`'; - $field2 = '`geoloc_pays`.`country`'; - $realid='`geoloc_pays`.`a2`'; + $db = 'geoloc_countries INNER JOIN + profile_addresses ON (geoloc_countries.iso_3166_1_a2 = profile_addresses.countryId)'; + $unique = 'pid'; + $field = 'geoloc_countries.countryFR'; + $realid = 'geoloc_countries.iso_3166_1_a2'; break; case 'entreprise': - $db = '`entreprises`'; - $field = '`entreprise`'; - $unique='`uid`'; - break; - case 'firstname': - $field = '`prenom`'; - $beginwith = false; + $db = 'profile_job_enum INNER JOIN + profile_job ON (profile_job.jobid = profile_job_enum.id)'; + $field = 'profile_job_enum.name'; + $unique = 'profile_job.uid'; break; case 'fonctionTxt': - $db = '`fonctions_def` INNER JOIN - `entreprises` ON(`entreprises`.`fonction` = `fonctions_def`.`id`)'; - $field = '`fonction_fr`'; - $unique = '`uid`'; - $realid = '`fonctions_def`.`id`'; + $db = 'fonctions_def INNER JOIN + profile_job ON (profile_job.fonctionid = fonctions_def.id)'; + $field = 'fonction_fr'; + $unique = 'uid'; + $realid = 'fonctions_def.id'; $beginwith = false; break; case 'groupexTxt': @@ -299,46 +310,43 @@ class SearchModule extends PLModule $realid = 'a.id'; $unique = 'm.uid'; break; - case 'name': - $field = '`nom`'; - $field2 = '`nom_usage`'; - $beginwith = false; - break; case 'nationaliteTxt': - $db = '`geoloc_pays` INNER JOIN - `auth_user_md5` ON(`geoloc_pays`.`a2` = `auth_user_md5`.`nationalite`)'; - $field = 'IF(`geoloc_pays`.`nat`=\'\', - `geoloc_pays`.`pays`, - `geoloc_pays`.`nat`)'; - $realid = '`geoloc_pays`.`a2`'; + $db = 'geoloc_countries INNER JOIN + auth_user_md5 ON (geoloc_countries.a2 = auth_user_md5.nationalite + OR geoloc_countries.a2 = auth_user_md5.nationalite2 + OR geoloc_countries.a2 = auth_user_md5.nationalite3)'; + $field = 'geoloc_countries.nationalityFR'; + $realid = 'geoloc_countries.iso_3166_1_a2'; break; - case 'nickname': - $field = '`profile_nick`'; - $db = '`auth_user_quick`'; - $beginwith = false; - break; - case 'poste': - $db = '`entreprises`'; - $field = '`poste`'; - $unique='`uid`'; + case 'description': + $db = 'profile_job'; + $field = 'description'; + $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; case 'secteurTxt': - $db = '`emploi_secteur` INNER JOIN - `entreprises` ON(`entreprises`.`secteur` = `emploi_secteur`.`id`)'; - $field = '`emploi_secteur`.`label`'; - $realid = '`emploi_secteur`.`id`'; - $unique = '`uid`'; + $db = 'profile_job_sector_enum INNER JOIN + profile_job ON (profile_job.sectorid = profile_job_sector_enum.id)'; + $field = 'profile_job_sector_enum.name'; + $realid = 'profile_job_sector_enum.id'; + $unique = 'uid'; $beginwith = false; break; + case 'subSubSector': + $db = 'profile_job_subsubsector_enum'; + $field = 'name'; + $beginwith = false; + $unique = 'name'; + $distinct = false; + break; case 'sectionTxt': $db = '`sections` INNER JOIN `auth_user_md5` ON(`auth_user_md5`.`section` = `sections`.`id`)'; @@ -364,17 +372,18 @@ class SearchModule extends PLModule $field2_t = make_field_test($field2, $beginwith); $field_select = 'IF(' . $field_t . ', ' . $field . ', ' . $field2. ')'; } - $list = XDB::iterator('SELECT ' . $field_select . ' AS field, - COUNT(DISTINCT ' . $unique . ') AS nb - ' . ($realid ? (', ' . $realid . ' AS id') : '') . ' + $list = XDB::iterator('SELECT ' . $field_select . ' AS field' + . ($distinct ? (', COUNT(DISTINCT ' . $unique . ') AS nb') : '') + . ($realid ? (', ' . $realid . ' AS id') : '') . ' FROM ' . $db . ' WHERE ' . $field_t . ($field2 ? (' OR ' . $field2_t) : '') . ' GROUP BY ' . $field_select . ' - ORDER BY nb DESC + ORDER BY ' . ($distinct ? 'nb DESC' : $field_select) . ' 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()) { @@ -383,7 +392,9 @@ class SearchModule extends PLModule $res .= $q."|-1\n"; } else { $res .= $result['field'].'|'; - $res .= $result['nb']; + if (isset($result['nb'])) { + $res .= $result['nb']; + } if (isset($result['id'])) { $res .= '|'.$result['id']; } @@ -408,10 +419,15 @@ 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`'; - $id = '`a2`'; + $db = 'geoloc_countries'; + $field = 'countryFR'; + $id = 'iso_3166_1_a2'; $page->assign('onchange', 'changeCountry(this.value)'); break; case 'fonction': @@ -429,29 +445,35 @@ class SearchModule extends PLModule $field = 'nom'; break; case 'nationalite': - $db = '`geoloc_pays` INNER JOIN - `auth_user_md5` ON (`geoloc_pays`.`a2` = `auth_user_md5`.`nationalite`)'; - $field = 'IF(`nat`=\'\', `pays`, `nat`)'; - $id = '`a2`'; + $db = 'geoloc_countries INNER JOIN + auth_user_md5 ON (geoloc_countries.iso_3166_1_a2 = auth_user_md5.nationalite + OR geoloc_countries.iso_3166_1_a2 = auth_user_md5.nationalite2 + OR geoloc_countries.iso_3166_1_a2 = auth_user_md5.nationalite3)'; + $field = 'nationalityFR'; + $id = 'iso_3166_1_a2'; break; case 'region': - $db = '`geoloc_region`'; - $field = '`name`'; - $id = '`region`'; + $db = 'geoloc_administrativeareas'; + $field = 'name'; + $id = 'id'; if (isset($_REQUEST['country'])) { - $where .= ' WHERE `a2` = "'.$_REQUEST['country'].'"'; + $where .= ' WHERE country = "' . $_REQUEST['country'] . '"'; } break; case 'school': - $db = '`applis_def`'; + $db = 'profile_education_enum'; + $field = 'name'; + $id = 'id'; $page->assign('onchange', 'changeSchool(this.value)'); break; case 'section': $db = '`sections`'; break; case 'secteur': - $db = '`emploi_secteur`'; - $field = '`label`'; + $db = 'profile_job_sector_enum INNER JOIN + profile_job ON (profile_job.sectorid = profile_job_sector_enum.id)'; + $field = 'profile_job_sector_enum.name'; + $id = 'profile_job_sector_enum.id'; break; default: exit(); } diff --git a/modules/search/classes.inc.php b/modules/search/classes.inc.php index 4f7b4a3..1d6a047 100644 --- a/modules/search/classes.inc.php +++ b/modules/search/classes.inc.php @@ -29,42 +29,68 @@ u.perms IN (\'admin\',\'user\', \'disabled\') AS inscrit, u.perms != \'pending\' AS wasinscrit, FIND_IN_SET(\'femme\', u.flags) AS sexe, - a.alias AS forlife, - ad0.text AS app0text, ad0.url AS app0url, ai0.type AS app0type, - ad1.text AS app1text, ad1.url AS app1url, ai1.type AS app1type, - es.label AS secteur, ef.fonction_fr AS fonction, - IF(n.nat=\'\',n.pays,n.nat) AS nat, n.a2 AS iso3166, + 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.name AS secteur, ef.fonction_fr AS fonction, + 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,'; + ee.name, + 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,"; -@$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\')'; + 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', je.name, '') 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 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 profile_job AS e ON (e.uid = u.user_id) + LEFT JOIN profile_job_enum AS ee ON (e.jobid = ee.id) + LEFT JOIN profile_job_sector_enum AS es ON (es.id = e.sectorid) + LEFT JOIN fonctions_def AS ef ON (e.fonction = ef.id) + LEFT JOIN geoloc_countries AS n1 ON (u.nationalite = n1.iso_3166_1_a2) + LEFT JOIN geoloc_countries AS n2 ON (u.nationalite2 = n2.iso_3166_1_a2) + LEFT JOIN geoloc_countries AS n3 ON (u.nationalite3 = n3.iso_3166_1_a2) + LEFT JOIN profile_addresses AS adr ON (u.user_id = adr.pid + AND FIND_IN_SET('current', adr.flags)) + LEFT JOIN geoloc_countries AS gp ON (adr.countryId = gp.iso_3166_1_a2) + LEFT JOIN geoloc_administrativeareas AS gr ON (adr.countryId = gr.country + AND adr.administrativeAreaId = gr.id) + 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 +235,8 @@ class QuickSearch extends SField /** stores admin searches */ var $email; var $ip; + /** stores phone number */ + var $phone; // }}} // {{{ constructor @@ -227,7 +255,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 +293,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; + } } // }}} @@ -317,6 +351,11 @@ class QuickSearch extends SField $where[] = "false"; } } + 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); } @@ -342,6 +381,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; } // }}} @@ -499,6 +545,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; diff --git a/modules/search/search.inc.php b/modules/search/search.inc.php index 06d3686..7665c12 100644 --- a/modules/search/search.inc.php +++ b/modules/search/search.inc.php @@ -22,64 +22,69 @@ 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)':''); +function getAddressJoin($table) { + return 'u.user_id = ' . $table . '.pid' . (Env::v('only_current', false) ? ' AND FIND_IN_SET(\'current\', ' . $table . '.flags)' : ''); } function advancedSearchFromInput() { if ($with_soundex = Env::has('with_soundex')) { - $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'); + $nameField = new RefWithSoundexSField('name', array('n.soundex'), 'search_name', + 'n', 'u.user_id = n.uid'); } else { - $nameField = new NameSField('name',array('u.nom','u.nom_usage'),''); - $firstnameField = new StringSField('firstname',array('u.prenom'),''); + $nameField = new NameSField('name', array('n.token'), 'search_name', 'n', 'u.user_id = n.uid'); } - $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); - } else { - $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')); + $townField = new RefSField('city', array('av.localityId', 'av.postalCode'), 'profile_addresses', + 'av', getAddressJoin('av')); + $countryField = new RefSField('country', array('ap.countryId'), 'profile_addresses', 'ap', getAddressJoin('ap')); + $regionField = new RefSField('region',array('ar.administrativeAreaId'), 'profile_addresses', 'ar', getAddressJoin('ar')); - $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('je.name'), '', '',''); + $posteField = new RefSField('poste', array('ep.description'), 'profile_job', 'ep', 'u.user_id = ep.uid', false); + $fonctionField = new RefSField('fonction', array('en.fonction_fr'), 'fonctions_def', 'en', + 'u.user_id = profile_job.uid AND fonctions_def.id = profile_job.functionid'); + $secteurField = new RefSField('secteur', array('fm.sectorid'), 'profile_job', '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, - $townField, $countryField, $regionField, $mapField, $entrepriseField, + $nameField, $promo1Field, + $promo2Field, $womanField, $subscriberField, $aliveField, + $townField, $countryField, $regionField, $entrepriseField, $posteField, $secteurField, $cvField, $natField, $binetField, $groupexField, $sectionField, $schoolField, $diplomaField, - $freeField, $fonctionField); + $freeField, $fonctionField, $nwAddressField, $nwTypeField, + $nwPhoneField, $referentField); } // }}} diff --git a/plugins/function.display_address.php b/plugins/function.display_address.php index 66cb09c..7114a2b 100644 --- a/plugins/function.display_address.php +++ b/plugins/function.display_address.php @@ -39,13 +39,10 @@ function display_address_isIdentity($idt, $value, $test_reverse = true) 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 ""; - + $txtad = $param['adr']['text']; + 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 = "\"Google"; + $comment = ""; + if ($param['adr']['comment'] != "") + { + $commentHtml = str_replace(array('&', '"'), array('&', '"'), $param['adr']['comment']); + $commentJs = str_replace(array('\\', '\''), array('\\\\', '\\\''), $commentHtml); + $comment = "\"Commentaire\""; + } if ($restore) { array_unshift($lines, $idt); } if ($param['titre']) { if ($param['titre_div']) - $txthtml .= "
".pl_entity_decode($param['titre'])." ".$map."
\n"; + $txthtml .= "
".pl_entity_decode($param['titre'])." ".$map.$comment."
\n"; else - $txthtml .= "".pl_entity_decode($param['titre'])." ".$map."
\n"; + $txthtml .= "".pl_entity_decode($param['titre'])." ".$map.$comment."
\n"; } foreach ($lines as $line) { $txthtml .= "".$line."
\n"; } - if ($param['adr']['tel']) - $txthtml .= "
\nTél : \n".$param['adr']['tel']."\n
\n"; - if ($param['adr']['fax']) - $txthtml .= "
\nFax : \n".$param['adr']['fax']."\n
\n"; - if ($param['adr']['mobile']) - $txthtml .= "
\nTél : \n".$param['adr']['mobile']."\n
\n"; - if ($param['adr']['tels'] && count($param['adr']['tels'])) { - foreach ($param['adr']['tels'] as $tel) - $txthtml .= "
\n".$tel['tel_type']." : \n".$tel['tel']."\n
\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.geoloc_region.php b/plugins/function.display_phones.php similarity index 50% rename from plugins/function.geoloc_region.php rename to plugins/function.display_phones.php index 1a66dae..b676d50 100644 --- a/plugins/function.geoloc_region.php +++ b/plugins/function.display_phones.php @@ -19,12 +19,43 @@ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * ***************************************************************************/ -function smarty_function_geoloc_region($params, &$smarty) { - require_once 'geoloc.inc.php'; - if(!isset($params['country']) || !isset($params['region'])) { - return; +function smarty_function_display_phones($param, &$smarty) +{ + $txthtml = ""; + if (count($param['tels'])) { + foreach ($param['tels'] as $tel) { + $tel_type = ($param['dcd'] ? 'Dernier ' : ''); + 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 .= "
\n" . $tel_type . " : \n" . $tel['tel'] . "\n"; + $comment = ""; + if ($tel['comment'] != "") { + $commentHtml = str_replace(array('&', '"'), array('&', '"'), $tel['comment']); + $commentJs = str_replace(array('\\', '\''), array('\\\\', '\\\''), $commentHtml); + $txthtml .= "\"Commentaire\"\n"; + } + $txthtml .= "
\n"; + } } - return geoloc_region($params['country'], $params['region'], @$params['available']); + return $txthtml; } // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8: diff --git a/plugins/function.geoloc_country.php b/plugins/function.geoloc_country.php deleted file mode 100644 index fd4c8d9..0000000 --- a/plugins/function.geoloc_country.php +++ /dev/null @@ -1,31 +0,0 @@ - diff --git a/plugins/function.select_nat.php b/plugins/function.select_nat.php index ebfa2f3..3c9b4d0 100644 --- a/plugins/function.select_nat.php +++ b/plugins/function.select_nat.php @@ -20,27 +20,32 @@ ***************************************************************************/ -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); +function select_nat($valeur, $pad=false) { + $res = XDB::iterRow("SELECT iso_3166_1_a2 AS id, nationalityFR AS text + FROM geoloc_countries + WHERE nationalityFR IS NOT NULL + ORDER BY nationalityFR"); $sel = ' selected="selected"'; // on ajoute une entree vide si $pad est vrai $html = ""; if ($pad) { - $html.= '\n"; + $html .= sprintf("\n", ($valeur ? $sel : "")); } - while (list($my_id,$my_text) = $res->next()) { - $html .= sprintf("\n",$my_id,($valeur==$my_id?$sel:""),$my_text); + while (list($my_id, $my_text) = $res->next()) { + $html .= sprintf("\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); } diff --git a/templates/admin/index.tpl b/templates/admin/index.tpl index 06b3972..b1ed636 100644 --- a/templates/admin/index.tpl +++ b/templates/admin/index.tpl @@ -96,7 +96,7 @@ Ajout promotion   |   - Edition + Édition   |   Homonymes   |   @@ -124,15 +124,27 @@ {icon name=user_gray} Champs + Formation + + Formations +   |   + Domaines de formation +   |   + Niveau de formation +   |   + Niveau par formation + + + Emploi - Formations + Secteurs   |   - Secteurs + Entreprises   |   - Sous-secteurs + Corps   |   - Fonctions + Grade @@ -143,17 +155,13 @@ Décorations   |   Sections - - - - Géoloc - - Synchro   |   - Dynamap + Noms +   |   + Networking - + Compte Skins diff --git a/templates/admin/jobs.tpl b/templates/admin/jobs.tpl new file mode 100644 index 0000000..fe5c7ed --- /dev/null +++ b/templates/admin/jobs.tpl @@ -0,0 +1,111 @@ +{**************************************************************************} +{* *} +{* Copyright (C) 2003-2009 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 *} +{* *} +{**************************************************************************} + +

Entreprises

+ +{if $jobs} +

+ Liste des entreprises correspondant à ta recherche : +

+{/if} + +{if $selectedJob} +
+{xsrf_token_field} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {$selectedJob.address} + + + + + + + + + + + + + +
Entreprise n° {$selectedJob.id}
Nom
Acronyme
Page web
Adresse email
Code NAF
Code AX
Identifiant de la holding
Nom de la holding{$selectedJob.holdingName}
Acronyme de la holding{$selectedJob.holdingAcronym}
Adresse
Téléphone
Fax
Remplacer par l'entreprise n°
+

+ Confirmation du remplacement de cette entreprise :  +
+ +

+
+{/if} + +
+

+ Nom ou acronyme de l'entreprise : +
+ +

+
+ +{* vim:set et sw=2 sts=2 sws=2 enc=utf-8: *} diff --git a/templates/axletter/edit.tpl b/templates/axletter/edit.tpl index eeb4f72..8bbb112 100644 --- a/templates/axletter/edit.tpl +++ b/templates/axletter/edit.tpl @@ -20,7 +20,7 @@ {* *} {**************************************************************************} -

Edition de message

+

Édition de message

{xsrf_token_field} diff --git a/templates/core/vcard.tpl b/templates/core/vcard.tpl new file mode 100644 index 0000000..fd0f95b --- /dev/null +++ b/templates/core/vcard.tpl @@ -0,0 +1,99 @@ +{**************************************************************************} +{* *} +{* Copyright (C) 2003-2009 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: *} diff --git a/templates/emails/redirect.tpl b/templates/emails/redirect.tpl index a87f473..493d0c7 100644 --- a/templates/emails/redirect.tpl +++ b/templates/emails/redirect.tpl @@ -177,17 +177,14 @@ {/foreach} - - -
-  
- Ajouter une adresse email : - -    + + {cycle values="pair,impair" assign=class_combobox} + {include file="include/emails.combobox.tpl" name="email" val=$email class=$class_combobox error=$error_email i="0"} +
+ {xsrf_token_field} -
- - +
+ diff --git a/templates/events/index.tpl b/templates/events/index.tpl index 904d698..23004ce 100644 --- a/templates/events/index.tpl +++ b/templates/events/index.tpl @@ -27,7 +27,7 @@ {else}

-Bienvenue {$smarty.session.prenom}{if $birthday} +Bienvenue {$smarty.session.yourself_name}{if $birthday}  et joyeux anniversaire de la part de toute l'équipe ! {else}, {/if} @@ -191,7 +191,7 @@ Bienvenue {$smarty.session.prenom}{if $birthday} Annonce proposée par - {$ev.prenom} {$ev.nom} X{$ev.promo} + {$ev.prenom} {$ev.nom} {$ev.promo_display} diff --git a/templates/fusionax/deceased.tpl b/templates/fusionax/deceased.tpl new file mode 100644 index 0000000..6e99c47 --- /dev/null +++ b/templates/fusionax/deceased.tpl @@ -0,0 +1,59 @@ +{**************************************************************************} +{* *} +{* Copyright (C) 2003-2009 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 *} +{* *} +{**************************************************************************} + +

Fusion des annuaires X.org - AX / Décès

+ +{if $deceasedErrors} +

Voici les {$deceasedErrors} différences entre les deux annuaires pour les renseignements de +décès.

+ +{if $nbDeceasedMissingInXorg > 0} +

Anciens déclarés décédés dans l'annuaire AX mais pas sur Xorg

+{include file='fusionax/listFusion.tpl' fusionList=$deceasedMissingInXorg field1='deces_ax' namefield1='Décès AX'} + +
Inclure toutes les dates de décès connues par l'AX sur Xorg. +{/if} + +{if $nbDeceasedMissingInAX > 0} +

Anciens déclarés décédés dans l'annuaire Xorg mais pas chez l'AX

+{include file='fusionax/listFusion.tpl' fusionList=$deceasedMissingInAX field1='deces_xorg' namefield1='Décès X.org'} + +Considérer ces cas comme traités (il n'y a rien à importer). +{/if} + +{if $nbDeceasedDifferent > 0} +

Anciens déclarés décédés dans les deux annuaires mais pas avec la même date

+{include file='fusionax/listFusion.tpl' fusionList=$deceasedDifferent field1='deces_xorg' field2='deces_ax' namefield1='Décès X.org' namefield2='Décès AX'} + +

Mettre en correspondance

+
+ User ID X.org :
+ Date de décès :
+ +
+{/if} + +{else} +

Aucune différence pour les renseignements de décès entre les deux annuaires.

+{/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 index 0000000..e2cd34d --- /dev/null +++ b/templates/fusionax/ids.tpl @@ -0,0 +1,87 @@ +{**************************************************************************} +{* *} +{* Copyright (C) 2003-2009 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 *} +{* *} +{**************************************************************************} + +

Fusion des annuaires X.org - AX / Identifiants

+ +

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.

+ +{if $nbMissingInAX} +

Anciens manquants à l'AX

+ +

{$nbMissingInAX} ancien{if $nbMissingInAX > 1}s{/if}.

+{/if} + +{if $nbMissingInXorg > 0} +

Anciens manquants à x.org

+ +

{$nbMissingInXorg} ancien{if $nbMissingInXorg > 1}s{/if}.

+{/if} + +{if $wrongInXorg > 0} +

Anciens ayant un matricule_ax sur Xorg ne correspondant à rien dans la base de l'AX

+ +

{$wrongInXorg} ancien{if $wrongInXorg > 1}s{/if}.

+{/if} + +

Mettre en correspondance

+
+ Matricule AX :
+ User ID X.org :
+ +
+ +

+ diff --git a/templates/fusionax/idsMissingInAx.tpl b/templates/fusionax/idsMissingInAx.tpl new file mode 100644 index 0000000..2fa5d20 --- /dev/null +++ b/templates/fusionax/idsMissingInAx.tpl @@ -0,0 +1,29 @@ +{**************************************************************************} +{* *} +{* Copyright (C) 2003-2009 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 *} +{* *} +{**************************************************************************} + +

Fusion des annuaires X.org - AX / Identifiants / Manquants dans l'annuaire de l'AX

+ +

+ +{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 index 0000000..c2bd5ec --- /dev/null +++ b/templates/fusionax/idsMissingInXorg.tpl @@ -0,0 +1,29 @@ +{**************************************************************************} +{* *} +{* Copyright (C) 2003-2009 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 *} +{* *} +{**************************************************************************} + +

Fusion des annuaires X.org - AX / Identifiants / Manquants dans l'annuaire d'X.org

+ +

+ +{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 index 0000000..8cf158b --- /dev/null +++ b/templates/fusionax/idswrongInXorg.tpl @@ -0,0 +1,32 @@ +{**************************************************************************} +{* *} +{* Copyright (C) 2003-2009 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 *} +{* *} +{**************************************************************************} + +

Fusion des annuaires X.org - AX / Identifiants / 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)

+ +

+ +{if $wrongInXorg} +{include file='fusionax/listFusion.tpl' fusionList=$wrongInXorg field1='user_id' namefield1='ID X.org'} + +

Mettre à NULL le matricule_ax de ces camarades pour marquer le fait qu'ils ne figurent pas dans l'annuaire de l'AX

+{/if} diff --git a/templates/profile/adresses.tel.tpl b/templates/fusionax/import.tpl similarity index 69% rename from templates/profile/adresses.tel.tpl rename to templates/fusionax/import.tpl index a49004b..6e04ee5 100644 --- a/templates/profile/adresses.tel.tpl +++ b/templates/fusionax/import.tpl @@ -20,17 +20,33 @@ {* *} {**************************************************************************} -{assign var=telpref value="`$adpref`[tel][`$t`]"} -{assign var=telid value="`$adid`_tel_`$t`"} -
- {include file="include/flags.radio.tpl" name="`$telpref`[pub]" val=$tel.pub} + +

Fusion des annuaires X.org - AX

+ +

Import de l'annuaire AX

+{if $lastimport} +

Dernier import {$lastimport}

+{/if} + +{if $keymissing} +

Impossible de faire l'import, il manque la clef d'authentification :

+
{$keymissing}
+{else} +
+
-N°{$t+1} - - - - - {icon name=cross title="Supprimer ce numéro de téléphone"} - +{/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 index 0000000..d11a8b5 --- /dev/null +++ b/templates/fusionax/index.tpl @@ -0,0 +1,37 @@ +{**************************************************************************} +{* *} +{* Copyright (C) 2003-2009 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 *} +{* *} +{**************************************************************************} + +

Fusion des annuaires X.org - AX

+ + +{* 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 index 0000000..db89cf8 --- /dev/null +++ b/templates/fusionax/listFusion.tpl @@ -0,0 +1,69 @@ +{**************************************************************************} +{* *} +{* Copyright (C) 2003-2009 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 *} +{* *} +{**************************************************************************} + + + + + + {if $field1} + + {/if} + {if $field2} + + {/if} + {if $field3} + + {/if} + {if $field4} + + {/if} + {if $fusionAction} + + {/if} + +{if $fusionList} +{iterate from=$fusionList item=c} + + + + {if $field1} + + {/if} + {if $field2} + + {/if} + {if $field3} + + {/if} + {if $field4} + + {/if} + {if $fusionAction} + + {/if} + +{/iterate} +{/if} +
AncienFiches{$namefield1}{$namefield2}{$namefield3}{$namefield4}Action
{$c.display_name} (X {$c.promo}) + {if $c.user_id}{icon name="user_suit" title="Administrer utilisateur"}{/if} + {if $c.id_ancien}{icon name="user_gray" title="fiche AX"}{/if} + {$c.$field1}{$c.$field2}{$c.$field3}{$c.$field4}{$name}
diff --git a/templates/fusionax/promo.tpl b/templates/fusionax/promo.tpl new file mode 100644 index 0000000..1095f74 --- /dev/null +++ b/templates/fusionax/promo.tpl @@ -0,0 +1,37 @@ +{**************************************************************************} +{* *} +{* Copyright (C) 2003-2009 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 *} +{* *} +{**************************************************************************} + +

Fusion des annuaires X.org - AX / Promotions

+ +

+ +{if $nbMissmatchingPromos > 0} +

Il y a {$nbMissmatchingPromos} différences entre les deux bases dans pour les promotions.

+

Grosses différences (oranjisation ?) :

+{include file='fusionax/listFusion.tpl' fusionList=$missmatchingPromos1 field1='user_id' namefield1='ID X.org' field3='promo_etude_xorg' +namefield3='etude_xorg' field4='promo_sortie_xorg' namefield4='sortie_xorg' field2='promo_etude_ax' namefield2='etude_ax'} + +

Petites différences : promo_etude_xorg == promo_etude_ax + 1 et promo_etude_xorg + 3 == promo_sortie_xorg, a priori ce sont les étrangers que nous avons mal +inclus

+{include file='fusionax/listFusion.tpl' fusionList=$missmatchingPromos2 field1='user_id' namefield1='ID X.org' field3='promo_etude_xorg' +namefield3='etude_xorg' field4='promo_sortie_xorg' namefield4='sortie_xorg' field2='promo_etude_ax' namefield2='etude_ax'} +{/if} diff --git a/templates/fusionax/view.tpl b/templates/fusionax/view.tpl new file mode 100644 index 0000000..cbbbf36 --- /dev/null +++ b/templates/fusionax/view.tpl @@ -0,0 +1,25 @@ +{**************************************************************************} +{* *} +{* Copyright (C) 2003-2009 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 *} +{* *} +{**************************************************************************} + +

Fusion des annuaires X.org - AX / Création des VIEW annexes nécessaires aux corrélations

+ +

Création des VIEW annexes nécessaires aux corrélations

diff --git a/templates/gadgets/ig-minifiche.tpl b/templates/gadgets/ig-minifiche.tpl index 64a931e..591f22c 100644 --- a/templates/gadgets/ig-minifiche.tpl +++ b/templates/gadgets/ig-minifiche.tpl @@ -29,8 +29,14 @@ {if !$c.dcd && ($c.inscrit || $smarty.session.auth eq AUTH_PUBLIC)}{/if}
- {if $c.iso3166} - {$c.nat}  + {if $c.iso3166_1} + {$c.nat1}  + {/if} + {if $c.iso3166_2} + {$c.nat2}  + {/if} + {if $c.iso3166_3} + {$c.nat3}  {/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/geoloc/country.tpl b/templates/geoloc/country.tpl deleted file mode 100644 index 46e2f18..0000000 --- a/templates/geoloc/country.tpl +++ /dev/null @@ -1,47 +0,0 @@ -{**************************************************************************} -{* *} -{* Copyright (C) 2003-2009 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 *} -{* *} -{**************************************************************************} - - - - {foreach from=$countries item="country"} - - - - - {if $country.nbPop > 0 or $country.id eq 0} - - - - {/if} - - {/foreach} - - - {foreach from=$cities item="city"} - - - - - {/foreach} - - -{* vim:set et sw=2 sts=2 sws=2 enc=utf-8: *} diff --git a/templates/geoloc/form.address.tpl b/templates/geoloc/form.address.tpl index 9e543e9..229d1e8 100644 --- a/templates/geoloc/form.address.tpl +++ b/templates/geoloc/form.address.tpl @@ -20,47 +20,51 @@ {* *} {**************************************************************************} - -{if $adr.geoloc} -
- La geolocalisation n'a pas donné un résultat certain, valide la nouvelle adresse - ou modifie l'ancienne pour que ton adresse puisse être prise en compte. +{if $address.geoloc} +
+ Le géocodage n'a pas donné un résultat certain ! Tu as le choix entre : +
+ - {/if} +
- -{if $adr.geoloc} - - - - - -
-
- Valider ta version - • - Valider la version géolocalisée + +{if $address.geoloc} + {/if}
- - - - - - - - - - - - - +{if $address.geoloc} + + + + +{/if} + + + + + + + + + + + + + + + + + + {* vim:set et sw=2 sts=2 sws=2 enc=utf-8: *} diff --git a/templates/include/emails.combobox.tpl b/templates/include/emails.combobox.tpl new file mode 100644 index 0000000..4fbf255 --- /dev/null +++ b/templates/include/emails.combobox.tpl @@ -0,0 +1,136 @@ +{**************************************************************************} +{* *} +{* Copyright (C) 2003-2009 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=new value="new"|cat:$i} +{assign var=combobox value="combobox"|cat:$i} + + + {if $name eq "email_directory"} + Email annuaire AX + {elseif $name eq "email"} + Ajouter une adresse email + {else} + Email professionnel + {/if} + + {if $name eq "email"}{/if} + + {if $name neq "email"}
{/if} + + {if $name neq "email"} +
+
+ {if $name eq "email_directory"} + + {icon name="flag_orange" title="Visible sur l'annuaire"} + {elseif $name neq "email"} + {include file="include/flags.radio.tpl" name="`$jobpref`[`$prefix`email_pub]" val=$pub} + {/if} +
+ {/if} + + {if $name eq "email"}{/if} + + + + {if $name eq "email"}{/if} + + + + + {if $name eq "email"}{/if} + +{if $name neq "email"} + + + Attention : 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 + l'ajouter là, surtout + si tu n'en as plus de valide. + + +{/if} + +{* vim:set et sw=2 sts=2 sws=2 enc=utf-8: *} diff --git a/templates/include/emploi.tpl b/templates/include/emploi.tpl index 6046b01..293cf3d 100644 --- a/templates/include/emploi.tpl +++ b/templates/include/emploi.tpl @@ -19,20 +19,21 @@ {* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *} {* *} {**************************************************************************} -{if $address.entreprise || $address.secteur || $address.fonction || +{if $address.entreprise || $address.sector || $address.fonction || $address.poste || $address.fonction || $address.email || $address.web}
{if $address.entreprise || $address.web} - + {/if} - {if $address.secteur} + {if $address.sector} - + {/if} diff --git a/templates/include/field.promo.tpl b/templates/include/field.promo.tpl index 36219dc..f5c3326 100644 --- a/templates/include/field.promo.tpl +++ b/templates/include/field.promo.tpl @@ -20,67 +20,67 @@ {* *} {**************************************************************************} - + {/literal} +//]]> {if $full}
Ent/Org : {$address.entreprise}{if $address.web} [site]{/if}{if $address.web}{$address.entreprise}{$address.entreprise}{else}{$address.entreprise}{/if} + {if $address.w_web} [Page perso]{/if}
Secteur : {$address.secteur}{if $address.ss_secteur} ({$address.ss_secteur}){/if}{$address.sector}{if $address.subSector} ({$address.subSector}){/if}
{/if} - - - + + - - - - + + + + - - - - + size="4" maxlength="4" value="{$promo_max|default:0}" + onkeyup="return updateRange();" onchange="return updateRange();" /> incluse +  (ex : 2000) + + + + + {if $full}
Promotion la plus ancienne +
Promotion la plus ancienne incluse -  (ex : 1980) -
Promotion la plus jeune + size="4" maxlength="4" value="{$promo_min|default:0}" + onkeyup="return updateRange();" onchange="return updateRange();" /> incluse +  (ex : 1980) +
Promotion la plus jeune incluse -  (ex : 2000) -
- -
+ +
{/if} diff --git a/templates/include/form.valid.edit-entreprises.tpl b/templates/include/form.valid.edit-entreprises.tpl new file mode 100644 index 0000000..16308bf --- /dev/null +++ b/templates/include/form.valid.edit-entreprises.tpl @@ -0,0 +1,44 @@ +{**************************************************************************} +{* *} +{* Copyright (C) 2003-2009 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 *} +{* *} +{**************************************************************************} + +Nom : +
+Acronyme : +
+Site web : +
+Email : +
+Holding : +
+Code NAF : +
+Code AX : +
+Adresse : +
+Téléphone : +
+Fax : +
+ +{* vim:set et sw=2 sts=2 sws=2 enc=utf-8: *} diff --git a/templates/include/form.valid.entreprises.tpl b/templates/include/form.valid.entreprises.tpl new file mode 100644 index 0000000..5396880 --- /dev/null +++ b/templates/include/form.valid.entreprises.tpl @@ -0,0 +1,74 @@ +{**************************************************************************} +{* *} +{* Copyright (C) 2003-2009 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 *} +{* *} +{**************************************************************************} + + + + Nom : + {$valid->name} + + + Noms similaires existants : + {$valid->suggestions} + + + Acronyme : + {$valid->acronym} + + + Site web : + {$valid->url} + + + Email : + {$valid->email} + + + Holding : + {$valid->holdingid} + + + Code NAF : + {$valid->NAF_code} + + + Code AX : + {$valid->AX_code} + + + Adresse : + {$valid->address} + + + Téléphone : + {$valid->tel} + + + Fax : + {$valid->fax} + + + + Bien remplir tous les champs, en particulier les codes NAF et AX ! + + + +{* vim:set et sw=2 sts=2 sws=2 enc=utf-8: *} diff --git a/templates/include/form.valid.nomusage.tpl b/templates/include/form.valid.names.tpl similarity index 75% rename from templates/include/form.valid.nomusage.tpl rename to templates/include/form.valid.names.tpl index 1408192..4e9d58b 100644 --- a/templates/include/form.valid.nomusage.tpl +++ b/templates/include/form.valid.names.tpl @@ -22,25 +22,29 @@ - Nom d'usage : - {$valid->nom_usage} + Ancien alias : + {$valid->old_alias} - Nouvel alias : - {$valid->alias|default:'suppression'} + Nouvel alias : + {$valid->new_alias} +{foreach from=$valid->sn_new item=sn key=typeid} - Raison : - {$valid->reason} + *{$valid->sn_types.$typeid} : + {$sn.name} -{if $valid->homonyme} +{/foreach} +{foreach from=$valid->sn_old item=sn key=typeid} - - Probleme d'homonymie ! - {$valid->homonyme} - + †{$valid->sn_types.$typeid} : + {$sn.name} + +{/foreach} + + + * nouveau nom ; † ancien nom -{/if} {* vim:set et sw=2 sts=2 sws=2 enc=utf-8: *} diff --git a/templates/include/form.valid.orange.tpl b/templates/include/form.valid.orange.tpl index d4c4741..6b8a357 100644 --- a/templates/include/form.valid.orange.tpl +++ b/templates/include/form.valid.orange.tpl @@ -23,11 +23,11 @@ Promotion : - {$valid->user->promo()} + {$valid->entryYear} Année de sortie : - {$valid->promo_sortie} au lieu de {math equation="a + b" a=$valid->user->promo() b=3} + {$valid->newGradYear} au lieu de {$valid->oldGradYear} {* vim:set et sw=2 sts=2 sws=2 enc=utf-8: *} diff --git a/templates/include/minifiche.tpl b/templates/include/minifiche.tpl index 0fd2a14..b6f1d2a 100644 --- a/templates/include/minifiche.tpl +++ b/templates/include/minifiche.tpl @@ -26,24 +26,36 @@ {if $smarty.session.auth ge AUTH_COOKIE}
{$c.prenom} {$c.nom} + alt="{$c.name_display}" />
{/if} -
- {if $c.iso3166} - {$c.nat}  +
+ {if $c.iso3166_1} + {$c.nat1}  {/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} + {$c.nat2}  + {/if} + {if $c.iso3166_3} + {$c.nat3}  + {/if} + {$c.promo_display}{if $c.eduname0}, {education_fmt name=$c.eduname0 url=$c.eduurl0 degree=$c.edudegree0 + grad_year=$c.edugrad_year0 field=$c.edufield0 program=$c.eduprogram0 sexe=$c.sexe}{* + *}{/if}{if $c.eduname1}, {education_fmt name=$c.eduname1 url=$c.eduurl1 degree=$c.edudegree1 + grad_year=$c.edugrad_year1 field=$c.edufield1 program=$c.eduprogram1 sexe=$c.sexe}{* + *}{/if}{if $c.eduname2}, {education_fmt name=$c.eduname2 url=$c.eduurl2 degree=$c.edudegree2 + grad_year=$c.edugrad_year2 field=$c.edufield2 program=$c.eduprogram2 sexe=$c.sexe}{* + *}{/if}{if $c.eduname3}, {education_fmt name=$c.eduname3 url=$c.eduurl3 degree=$c.edudegree3 + grad_year=$c.edugrad_year3 field=$c.edufield3 program=$c.eduprogram3 sexe=$c.sexe}{* + *}{/if}{if $c.dcd}, décédé{if $c.sexe}e{/if} le {$c.deces|date_format}{/if}
@@ -119,7 +131,7 @@ Profession : {if $c.job_web}{$c.entreprise}{else}{$c.entreprise}{/if} - {if $c.secteur} ({$c.secteur}){/if}{if $c.fonction}
{$c.fonction}{/if} + {if $c.sector} ({$c.sector}){/if}{if $c.fonction}
{$c.fonction}{/if} {/if} diff --git a/templates/include/plview.geoloc.tpl b/templates/include/plview.geoloc.tpl deleted file mode 100644 index a0952fd..0000000 --- a/templates/include/plview.geoloc.tpl +++ /dev/null @@ -1,84 +0,0 @@ -{**************************************************************************} -{* *} -{* Copyright (C) 2003-2009 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 *} -{* *} -{**************************************************************************} - - - -{if !$request_geodesix} - -

- {if $smarty.request.only_current neq 'on'} - [Ne voir que les adresses principales] - {else} - [Voir toutes les adresses] - {/if} -

- -

- - - - - -

- {if $annu} -

- Lister les X présents sur cette carte -

- {/if} -

Carte fournie gracieusement par Geodesix.

-{else} -

Le moteur de carte n'a pas été installé sur cette version de plat/al. Veuillez contacter Geodesix.

-{/if} -

Pour toute question, problème ou suggestion tu peux envoyer un email à -{#globals.geoloc.email#}.

- -{* vim:set et sw=2 sts=2 sws=2 enc=utf-8: *} diff --git a/templates/include/plview.referent.tpl b/templates/include/plview.referent.tpl index 76d47c3..cb0033e 100644 --- a/templates/include/plview.referent.tpl +++ b/templates/include/plview.referent.tpl @@ -21,30 +21,30 @@ {**************************************************************************}
-{foreach from=$set item=p} -
-
- {$p.nom} {$p.prenom} -
-
- X{$p.promo} -
-
- +{foreach from=$set item=p} +
+
+ {$p.name_display} +
+
+ {$p.promo_display} +
+
+ - {icon name=user_suit title="Voir sa fiche"} - + {icon name=user_suit title="Voir sa fiche"} - Voir sa fiche référent - -
-
- - - - - -
Expertise :{$p.expertise|nl2br}
-
-
+
+
+
+ + + + + +
Expertise :{$p.expertise|nl2br}
+
+
{/foreach}
diff --git a/templates/include/plview.trombi.tpl b/templates/include/plview.trombi.tpl index 971dd4e..66c8973 100644 --- a/templates/include/plview.trombi.tpl +++ b/templates/include/plview.trombi.tpl @@ -59,18 +59,19 @@ - {$set[trombi.index_prev].prenom} {$set[trombi.index_prev].nom}{if $trombi_with_promo} ({$set[trombi.index_prev].promo}){/if} + {$set[trombi.index_prev].name_display}{if $trombi_with_promo} ({$set[trombi.index_prev].promo_display}){/if} - {$set[trombi].prenom} {$set[trombi].nom}{if $trombi_with_promo} ({$set[trombi].promo}){/if} + {$set[trombi].name_display}{if $trombi_with_promo} ({$set[trombi].promo_display}){/if} {if $set[trombi.index_next]} - {$set[trombi.index_next].prenom} {$set[trombi.index_next].nom}{if $trombi_with_promo} ({$set[trombi.index_next].promo}){/if} + {$set[trombi.index_next].name_display}{if $trombi_with_promo} ({$set[trombi.index_next].promo_display}){/if} {/if} @@ -90,7 +91,8 @@ - {$set[trombi].prenom} {$set[trombi].nom}{if $trombi_with_promo} ({$set[trombi].promo}){/if} + + {$set[trombi].name_display}{if $trombi_with_promo} ({$set[trombi].promo_display}){/if} diff --git a/templates/include/trombi.tpl b/templates/include/trombi.tpl index 29cc27a..73c2d33 100644 --- a/templates/include/trombi.tpl +++ b/templates/include/trombi.tpl @@ -37,7 +37,7 @@ {/if}
- {$p.prenom} {$p.nom}{if $trombi_show_promo} ({$p.promo}){/if} + {$p.name_display}{if $trombi_show_promo} ({$p.promo_display}){/if} {if $loop eq "3"} diff --git a/templates/marketing/private.tpl b/templates/marketing/private.tpl index 3701aa4..477b6af 100644 --- a/templates/marketing/private.tpl +++ b/templates/marketing/private.tpl @@ -64,7 +64,10 @@ Sa dernière relance date du {$relance|date_format}. {iterate from=$addr item=a} {$a.email} - {if $a.alias}{$a.alias} {if $a.type eq user}(*){/if}{/if} + + {if $a.alias neq ''}{$a.alias} + {if $a.type eq user}(*){/if}{else}Email connu de l'AX{/if} + {$a.date|date_format|default:'-'} {$a.last|date_format|default:'-'} {$a.nb|default:"-"} @@ -100,7 +103,7 @@ Sa dernière relance date du {$relance|date_format}. {xsrf_token_field} - + diff --git a/templates/newsletter/edit.tpl b/templates/newsletter/edit.tpl index 5fd721e..e86bb48 100644 --- a/templates/newsletter/edit.tpl +++ b/templates/newsletter/edit.tpl @@ -169,7 +169,6 @@ [retour]

-{if !$art->check()}

article trop long !

{/if}
Edition de l'email de relanceÉdition de l'email de relance
From :
diff --git a/templates/platal/motdepasse.success.tpl b/templates/platal/motdepasse.success.tpl index e4fe950..cf9f2b5 100644 --- a/templates/platal/motdepasse.success.tpl +++ b/templates/platal/motdepasse.success.tpl @@ -29,7 +29,7 @@ Mot de passe enregistré le {$smarty.now|date_format}

- Attention! Il est crypté irréversiblement, + Attention ! Il est crypté irréversiblement, donc non récupérable. Pour retrouver un accès au site consécutivement à une perte de mot de passe, la procédure est longue et laborieuse… diff --git a/templates/profile/adresses.address.tpl b/templates/profile/adresses.address.tpl index 8679831..3067c22 100644 --- a/templates/profile/adresses.address.tpl +++ b/templates/profile/adresses.address.tpl @@ -20,30 +20,32 @@ {* *} {**************************************************************************} -{assign var=adpref value="addresses[$i]"} -{assign var=adid value="addresses_$i"} - - -

Version texte
+{assign var=prefname value="addresses[$i]"} +{assign var=prefid value="addresses_$i"} + - +
@@ -51,45 +53,68 @@ + + + + + + + + + + + + + + + + + + + +{* 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 index 0000000..f2bcc5a --- /dev/null +++ b/templates/profile/general.networking.tpl @@ -0,0 +1,48 @@ +{**************************************************************************} +{* *} +{* Copyright (C) 2003-2009 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 *} +{* *} +{**************************************************************************} + + + + + +{* 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 index 0000000..e7c2735 --- /dev/null +++ b/templates/profile/general.searchname.tpl @@ -0,0 +1,65 @@ +{**************************************************************************} +{* *} +{* Copyright (C) 2003-2009 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 *} +{* *} +{**************************************************************************} + + + + + + + +{* vim:set et sw=2 sts=2 sws=2 enc=utf-8: *} diff --git a/templates/profile/general.tpl b/templates/profile/general.tpl index 753075d..799004a 100644 --- a/templates/profile/general.tpl +++ b/templates/profile/general.tpl @@ -20,60 +20,100 @@ {* *} {**************************************************************************} -
- - +
Adresse n°{$i+1}
- {include file="include/flags.radio.tpl" name="`$adpref`[pub]" val=$adr.pub} + {include file="include/flags.radio.tpl" name="`$prefname`[pub]" val=$address.pub}
-
{include file="geoloc/form.address.tpl" name=$adpref id=$adid adr=$adr}
+ {include file="geoloc/form.address.tpl" prefname=$prefname prefid=$prefid address=$address id=$i} +
+
+
+ + +
- - + +
- - +
- - +
- {foreach from=$adr.tel key=t item=tel} -
- {include file="profile/adresses.tel.tpl" t=$t tel=$tel} -
+ {foreach from=$address.tel key=t item=tel} +
+ {include file="profile/phone.tpl" prefname="`$prefname`[tel]" + prefid="`$prefid`_tel" telid=$t tel=$tel} +
{/foreach} - {if $adr.tel|@count eq 0} -
- {include file="profile/adresses.tel.tpl" t=0 tel=0} -
+ {if $address.tel|@count eq 0} +
+ {include file="profile/phone.tpl" prefname="`$prefname`[tel]" prefid="`$prefid`_tel" telid=0 tel=0} +
{/if} -
- + diff --git a/templates/profile/adresses.tpl b/templates/profile/adresses.tpl index 845279d..19fa656 100644 --- a/templates/profile/adresses.tpl +++ b/templates/profile/adresses.tpl @@ -20,18 +20,18 @@ {* *} {**************************************************************************} -{foreach key=i item=adr from=$addresses} +{foreach key=i item=address from=$addresses}
-{include file="profile/adresses.address.tpl" i=$i adr=$adr} +{include file="profile/adresses.address.tpl" i=$i address=$address}
{/foreach} {if $addresses|@count eq 0}
-{include file="profile/adresses.address.tpl" i=0 adr=0} +{include file="profile/adresses.address.tpl" i=0 address=0}
{/if} -
+
{icon name=add title="Ajouter une adresse"} Ajouter une adresse diff --git a/templates/geoloc/admin.tpl b/templates/profile/education.js.tpl similarity index 84% rename from templates/geoloc/admin.tpl rename to templates/profile/education.js.tpl index 9cbe2e1..e955c99 100644 --- a/templates/geoloc/admin.tpl +++ b/templates/profile/education.js.tpl @@ -20,17 +20,8 @@ {* *} {**************************************************************************} -

Geoloc

- -

Synchroniser des villes avec geoloc.org

+educationDegree = new Array({education_degree}); +educationDegreeAll = new Array({education_degree_all}); +educationDegreeName = new Array({education_degree_name}); -{if $nb_missinglat} -

[toutes les villes sans coordonnées ({$nb_missinglat})]

-{/if} - -
-

-La ville dont l'id est : -

-
{* vim:set et sw=2 sts=2 sws=2 enc=utf-8: *} diff --git a/templates/profile/fiche_referent.tpl b/templates/profile/fiche_referent.tpl index 54fdf5d..6178c73 100644 --- a/templates/profile/fiche_referent.tpl +++ b/templates/profile/fiche_referent.tpl @@ -26,12 +26,12 @@
{$user->fullName()}
- X{$user->promo()} -  {$user->bestEmail()} + {$user->promo()} -  {$user->bestEmail()}
- {if $expertise != '' || $secteurs|count || $pays|count } + {if $expertise != '' || $sectors|count || $pays|count }

Informations de référent :

{if $expertise} @@ -40,12 +40,12 @@ {$expertise|nl2br}
{/if} - {if $secteurs|count} + {if $sectors|count}
Secteurs :
    - {foreach from=$secteurs item="secteur" key="i"} -
  • {$secteur}{if $ss_secteurs.$i != ''} ({$ss_secteurs.$i}){/if}
  • + {foreach from=$sectors item="sector" key="i"} +
  • {$sector}{if $subSector.$i != ''} ({$subSector.$i}){/if}
  • {/foreach}
diff --git a/templates/profile/applis.js.tpl b/templates/profile/general.buildnames.tpl similarity index 95% rename from templates/profile/applis.js.tpl rename to templates/profile/general.buildnames.tpl index 6ae64c0..0f05555 100644 --- a/templates/profile/applis.js.tpl +++ b/templates/profile/general.buildnames.tpl @@ -20,7 +20,6 @@ {* *} {**************************************************************************} -applisType = new Array({applis_type}); -applisTypeAll = new Array({applis_type_all}); +{$names} {* vim:set et sw=2 sts=2 sws=2 enc=utf-8: *} diff --git a/templates/profile/general.edu.tpl b/templates/profile/general.edu.tpl new file mode 100644 index 0000000..9e10f05 --- /dev/null +++ b/templates/profile/general.edu.tpl @@ -0,0 +1,76 @@ +{**************************************************************************} +{* *} +{* Copyright (C) 2003-2009 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`]"} +
+ + {icon name=cross title="Supprimer cette formation"} + + +
+ Diplôme : + + + +
+ Domaine de formation : + + +
+ Année d'obtention du diplôme : + + + (par exemple : 2008) +
+ Intitulé de la formation : + + +
+
+ + +   + + + {$nw.name} + {$nw.name} +
+ +
+ + + + + {if $sn.pub}{icon name="flag_green" title="site public"} + {else}{icon name="flag_red" title="site privé"}{/if} +   + {if $sn_type_list} + + {foreach from=$sn_type_list item=sn_type} + + {/foreach} + {else} + {$sn.type_name} + + + + + {/if} + + + + {if $sn.has_particle} + {/if} + + {if !$sn.always_displayed} + {icon name=cross title="Supprimer ce nom"} + {/if} +
+
- + - - + - - + + + + + + {foreach from=$search_names item=sn key=id} + {include file="profile/general.searchname.tpl" i=$id sn=$sn + class="names_advanced" style="display: none" error_name=$errors.search_names} + {/foreach} + + +
-
- - {icon name="flag_green" title="site public"} -
- Informations générales -
Noms
- Nom - + + {icon name="flag_green" title="site public"} Affichage public - + + {$public_name} + + + {icon name="page_edit" title="Plus de détail"} +
- Prénom - + + {icon name="flag_red" title="site privé"} Affichage privé - + + {$private_name}
- Promotion + Comment t'appeller
+ sur le site, dans la lettre mensuelle...
- X{$promo}{if ($promo != $promo_sortie - 3)} - X{math equation="a - b" a=$promo_sortie b=3}{/if} - modifier{if ($promo_sortie -3 == $promo)} pour les oranges{/if} + +
+ Gestion de tes noms, prénoms, surnoms... + Ils déterminent la façon dont ton nom apparaît sur les annuaires + en ligne et papier et ta fiche apparaitra quand on cherche un de ces noms. Pour plus + d'explications sur l'icône suivante + {icon name="information" title="Plus d'infos"}.
+
Si un de tes noms commence par une particule, + coche la case en bout de ligne.
+
+
+ + + + + - + @@ -82,81 +122,67 @@ - + + - - - + + - - - -
+
+ + {icon name="flag_green" title="site public"} +
+ Informations générales +
- Nom d'usage
- {if $smarty.session.sexe} - (Notamment nom d'épouse) - {else} - (si différent de {$nom} seulement) - {/if} + Promotion
- {$nom_usage|default:"Aucun"} - {if $nom_usage}modifier{else}Faire une demande{/if} + {if !$promo_choice} + {$promo} + + {else} + + {/if} + {icon name="page_edit" title="modifier"}
Date de naissance + Date de naissance +
+ {icon name=add title="Ajouter une nationalité"}
- Application
- (4e année de l'X) -
- -
- - + {select_nat valeur=$nationalite2 pad=1} + {icon name=cross title="Supprimer cette nationalité"}
- Post-application -
- + {select_nat valeur=$nationalite3 pad=1} -
- - -
- Si ta formation ne figure pas dans la liste, - contacte-nous. + {icon name=cross title="Supprimer cette nationalité"}
+ -{if !$no_private_key} - +
- - - + - - + -
- Synchronisation avec l'AX + +
+ + {icon name="flag_green" title="site public"} +
+ Formations
- - {icon name="flag_orange" title="transmis à l'AX"} - - Autoriser la synchronisation vers l'AX par des administrateurs ou des scripts automatiques. - + {foreach from=$edus key=eduid item=edu} + {cycle values="impair, pair" assign=class} + {include file="profile/general.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/general.edu.tpl" eduid=0 edu=0 class=$class} + {/if} + {cycle values="impair, pair" assign=class} + {assign var=eduaddid value=$edus|@count} +
+
-

- Le service annuaire de l'AX met à jour l'annuaire papier à partir des informations que tu lui fournis. Tu peux choisir ici d'envoyer directement les données de ta fiche Polytechnique.org vers ta fiche AX. -

-

- L'opération de synchronisation prend en compte toutes les informations que tu as marquées comme transmises à l'AX (en orange ou en vert). Elle peut alors effacer, modifier ou rajouter des informations sur ta fiche AX selon ce qui s'y trouve déjà. -

-

- -

+
+ Si ta formation ne figure pas dans la liste, + contacte-nous.
-{/if} + @@ -206,41 +232,53 @@ - - - - + {if $email_error} + {include file="include/emails.combobox.tpl" name="email_directory" val=$email_directory_error error=$email_error i="0"} + {else}{include file="include/emails.combobox.tpl" name="email_directory" val=$email_directory error=$email_error i="0"}{/if} - - + {foreach from=$networking item=network key=id} + {include file="profile/general.networking.tpl" nw=$network i=$id} + {/foreach} + + + @@ -250,8 +288,7 @@   - Complément libre
- Commentaire, ICQ… ? + Commentaire - + {foreach item=text key=bid from=$binets} @@ -58,7 +58,7 @@
{$text}
- {icon name="cross" title="Supprimer ce binet"} + {icon name="cross" title="Supprimer ce binet"} {/foreach} @@ -88,7 +88,7 @@ {/if} diff --git a/templates/profile/jobs.secteur.tpl b/templates/profile/jobs.alternates.tpl similarity index 87% rename from templates/profile/jobs.secteur.tpl rename to templates/profile/jobs.alternates.tpl index 0a624fe..f8b5fb5 100644 --- a/templates/profile/jobs.secteur.tpl +++ b/templates/profile/jobs.alternates.tpl @@ -21,11 +21,6 @@ {**************************************************************************} - +({$alternates}) {* vim:set et sw=2 sts=2 sws=2 enc=utf-8: *} diff --git a/templates/profile/jobs.job.tpl b/templates/profile/jobs.job.tpl index 63294af..3cb051e 100644 --- a/templates/profile/jobs.job.tpl +++ b/templates/profile/jobs.job.tpl @@ -20,11 +20,16 @@ {* *} {**************************************************************************} -{assign var=jobid value="job_`$i`"} +{assign var=jobid value="job_"|cat:$i} {assign var=jobpref value="jobs[`$i`]"} +{assign var=sector_text value="sector_text_"|cat:$i} +{assign var=sector value="sector_"|cat:$i} +{assign var=entreprise value="entreprise_"|cat:$i}
+ +
- - - {icon name="flag_red" title="privé"} -   - Surnom - - + + Téléphones personnels
- Téléphone mobile - - - - {include file="include/flags.radio.tpl" name="mobile_pub" val=$mobile_pub} - + + {foreach from=$tels key=telid item=tel} +
+ {include file="profile/phone.tpl" prefname='tels' prefid='tels' telid=$telid tel=$tel} +
+ {/foreach} + {if $tels|@count eq 0} +
+ {include file="profile/phone.tpl" prefname='tels' preid='tels' telid=0 tel=0} +
+ {/if} +
- - -   - Page web Perso + + Messageries, networking et sites web - +
+
{if $old}ex-{/if}Binet(s) - {select_db_table table="binets_def" valeur=0 champ="text" pad='1'} + href="javascript:addBinet()">{icon name="add" title="Ajouter ce binet"}
{assign var=groupcat value=""} {assign var=ingroup value=false} - {iterate from=$listgroups item=group} {if $group.dom neq $groupcat} {if $ingroup} @@ -148,9 +148,9 @@
Signification des symboles :
{if $grp_public}{icon name=error} L'annuaire du groupe est à visibilité restreinte et ce groupe n'apparaîtra pas sur ta - fiche{/if} + fiche.{/if} {if $grp_public && $grp_admin}
{/if} - {if $grp_admin}{icon name=wrench} Tu es administrateur du groupe{/if} + {if $grp_admin}{icon name=wrench} Tu es administrateur du groupe.{/if}
+ - - + {if !$job.tmp_name && !$job.name} + + + + {/if} + + - - + + - - - + + + - - + + + + + - - + + + + + + + + + + + + + + - - + + + + + + + - + + + + + @@ -123,39 +169,33 @@
Adresse
- {include file="include/flags.radio.tpl" name="`$jobpref`[adr][pub]" val=$job.adr.pub} + {include file="include/flags.radio.tpl" name="`$jobpref`[w_address][pub]" val=$job.w_address.pub}
- {include file="geoloc/form.address.tpl" name="`$jobpref`[adr]" id="`$jobid`_adr" adr=$job.adr} + {include file="geoloc/form.address.tpl" prefname="`$jobpref`[w_address]" + prefid=$jobid address=$job.w_address}
-
-
Téléphone
-
- {include file="include/flags.radio.tpl" name="`$jobpref`[tel_pub]" val=$job.tel_pub} + +
+ {include file="include/emails.combobox.tpl" name=$jobpref|cat:'[w_email]' val=$job.w_email + class="pair" i=$i error=$job.w_email_error prefix="w_" pub=$job.w_email_pub id=$i} + + diff --git a/templates/profile/jobs.sector.tpl b/templates/profile/jobs.sector.tpl new file mode 100644 index 0000000..56154a8 --- /dev/null +++ b/templates/profile/jobs.sector.tpl @@ -0,0 +1,42 @@ +{**************************************************************************} +{* *} +{* Copyright (C) 2003-2009 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 *} +{* *} +{**************************************************************************} + + + + +{* vim:set et sw=2 sts=2 sws=2 enc=utf-8: *} diff --git a/templates/geoloc/city.tpl b/templates/profile/jobs.sub_sector.tpl similarity index 75% rename from templates/geoloc/city.tpl rename to templates/profile/jobs.sub_sector.tpl index 27f619f..99fb20b 100644 --- a/templates/geoloc/city.tpl +++ b/templates/profile/jobs.sub_sector.tpl @@ -1,27 +1,31 @@ -{**************************************************************************} -{* *} -{* Copyright (C) 2003-2009 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="beginning" value=true} - {assign var="nb_displayed" value=0} - {foreach from=$users item="user"}{if !$beginning}
{/if}{if $nb_displayed < 10}{$user.prenom} {$user.nom|mb_strtolower|ucwords} - {$user.promo}{else}{/if}{assign var="nb_displayed" value=$nb_displayed+1}{assign var="beginning" value=false}{/foreach} -
-{* vim:set et sw=2 sts=2 sws=2 enc=utf-8: *} +{**************************************************************************} +{* *} +{* Copyright (C) 2003-2009 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 *} +{* *} +{**************************************************************************} + + + + +{* vim:set et sw=2 sts=2 sws=2 enc=utf-8: *} diff --git a/templates/profile/jobs.tpl b/templates/profile/jobs.tpl index 835b2cd..62c8f0f 100644 --- a/templates/profile/jobs.tpl +++ b/templates/profile/jobs.tpl @@ -31,8 +31,50 @@ {icon name=add title="Ajouter un emploi"} Ajouter un emploi +

+
@@ -42,80 +48,120 @@ {include file="include/flags.radio.tpl" name="`$jobpref`[pub]" val=$job.pub} Entreprise n°{$i+1} : - (en cours de validation){else} + + {/if} {icon name=cross title="Supprimer cet emploi"}
Page Web
+ Si ton entreprise ne figure pas dans la liste, + clique ici et complète les informations la concernant. +
Secteur d'activité
Sous-secteur d'activité - -
Poste occupé
Fonction occupée
Ta place dans l'entreprise
Secteur d'activité + + {icon name="table" title="Tous les secteurs"} +
- Si des informations font défaut dans les listes ci-dessus, - contacte-nous. +
- Email professionnel : - - - {include file="include/flags.radio.tpl" name="`$jobpref`[email_pub]" val=$job.email_pub} - + Description + +
Page perso +
+ {foreach from=$job.w_phone key=t item=phone} +
+ {include file="profile/phone.tpl" prefname="`$jobpref`[w_phone]" prefid="`$jobid`_w_phone" telid=$t tel=$phone} +
+ {/foreach} + {if $job.w_phone|@count eq 0} +
+ {include file="profile/phone.tpl" prefname="`$jobpref`[w_phone]" prefid="`$jobid`_w_phone" telid=0 tel=0}
- - - - - - - - - - - - - -
Bureau : - -
Fax : -
Mobile : - -
+ {/if} +
+ + + + + + + + + + + + + + + +
+
+ {include file="include/flags.radio.tpl" name="corps[pub]" val=$corps.pub} +
+ Corps +
Corps d'origine + +
Corps actuel + +
Grade + +
+ - {if $survey.mode != Survey::MODE_ALL} + {if $survey.mode != Survey::MODE_ALL} - + {if $is_admin} {/if} diff --git a/upgrade/0.9.14/connect.db.inc.php b/upgrade/0.9.14/connect.db.inc.php index 1cade25..936a7e1 100644 --- a/upgrade/0.9.14/connect.db.inc.php +++ b/upgrade/0.9.14/connect.db.inc.php @@ -1,6 +1,6 @@ debug = 0; //do not store backtraces + +// get degree list +$res = XDB::iterator("SELECT id, abbreviation AS name + FROM profile_education_degree_enum + ORDER BY id"); +foreach ($res as $item) { + $degree_list[$item[1]] = $item[0]; +} + +// get degree's level list +$res = XDB::iterator("SELECT id, level AS name + FROM profile_education_degree_enum + ORDER BY id"); +foreach ($res as $item) { + $level_list [$item[1]] = $item[0]; +} + +// get university list +$res = XDB::iterator("SELECT id, IF(abbreviation = '', name, abbreviation) AS name + FROM profile_education_enum + ORDER BY id"); +foreach ($res as $item) { + $university_list [$item[1]] = $item[0]; +} + +// get field list +$res = XDB::iterator("SELECT id, field AS name + FROM profile_education_field_enum + ORDER BY id"); +foreach ($res as $item) { + $field_list [$item[1]] = $item[0]; +} + +// get Xorg education data +$res = XDB::query("SELECT p.uid, d.abbreviation AS degree, IF(e.abbreviation = '', e.name, e.abbreviation) AS university, p.program, p.id AS no + FROM profile_education AS p + INNER JOIN profile_education_enum AS e ON (p.eduid = e.id) + INNER JOIN profile_education_degree_enum AS d ON (p.degreeid = d.id) + WHERE p.id != 100 + ORDER BY p.uid"); +$xorg_edu = $res->fetchAllAssoc(); + +// get AX education data +$res = XDB::iterator("SELECT u.user_id AS uid, f.Intitule_diplome AS degree, f.Intitule_formation AS university, + CONCAT(Descr_formation, ' ', tmp_1, ' ', tmp_2, ' ', tmp_3, ' ', tmp_4) AS program + FROM fusionax_formations AS f + INNER JOIN fusionax_xorg_anciens AS u ON (f.id_ancien = u.matricule_ax) + ORDER BY u.user_id"); +$ax_edu = $res->fetchAllAssoc(); + +// merge education data +$nb_merge_succes = 0; +$nb_total = 0; +$xorg = next($xorg_edu); +while ($ax = next($ax_edu)) { + array_walk($ax, 'trim'); + if (($ax['degree'] == '') && ($ax['university'] = '')) { + continue; + } + while ($xorg['uid'] && ($xorg['uid'] < $ax['uid'])) { + $xorg = next($xorg_edu); + } + + $no = 0; + if($xorg['uid'] == $ax['uid']) { + $uid = $xorg['uid']; + $i = 0; + + while (($xorg['uid'] == $uid) && (!merge($ax, $xorg))) { + $xorg = next($xorg_edu); + $i++; + $no++; + } + while ($xorg['uid'] == $uid) { + $xorg = next($xorg_edu); + $no++; + } + + if ($i > 0) { + $i = $no; + } else { + $i = $no - 1; + } + while ($i != 0) { + $xorg = prev($xorg_edu); + $i--; + } + if ($ax['no']) { + $no = $ax['no']; + $nb_merge_succes++; + } + } + adapt_ax($ax); + XDB::execute("REPLACE INTO profile_education (uid, degreeid, eduid, program, fieldid, id) + VALUES {?}, {?}, {?}, {?}, {?}, {?}", + $ax['uid'], $ax['degree'], $ax['university'], $ax['program'], $ax['field'], $no); + $nb_total++; + if (($nb_total % 1000) == 0) { + echo "."; + } +} + +echo "\n"; +echo "$nb_merge_succes educations were succesfully merged among $nb_total entries.\n"; + +// auxilliary functions + +// replaces AX data by corresponding id in Xorg database +function adapt_ax(&$ax) +{ + if ($field_list[$ax['program']]) { + $ax['field'] = $field_list[$ax['program']]; + $ax['program'] = null; + } + $ax['degree'] = $degree_list[$ax['degree']]; + $ax['university'] = $university_list[$ax['university']]; +} + +// tries to merge two educations into ax and returns 1 in case of merge +function merge(&$ax, $xorg) +{ + if ($ax['degree'] == '') { + if ($ax['university'] != $xorg['university']) { + return 0; + } + $ax['degree'] = $xorg['degree']; + $ax['university'] = $xorg['university']; + } else { + if ($ax['university'] == '') { + if (($level_list[$ax['degree']] == $level_list[$xorg['degree']]) || ($xorg['degree'] == "Dipl.") || ($ax['degree'] == "Dipl.")) { + if ($xorg['degree'] != "Dipl.") { + $ax['degree'] = $xorg['degree']; + } + $ax['university'] = $xorg['university']; + } else { + return 0; + } + } else { + if (($ax['university'] == $xorg['university']) && + (($level_list[$ax['degree']] == $level_list[$xorg['degree']]) || ($xorg['degree'] == "Dipl.") || ($ax['degree'] == "Dipl."))) { + if ($xorg['degree'] != "Dipl.") { + $ax['degree'] = $xorg['degree']; + } + } else { + return 0; + } + } + } + if ($xorg['program']) { + $ax['field'] = $field_list[$ax['program']]; + $ax['program'] = $xorg['program']; + } + $ax['no'] = $xorg['no']; + return 1; +} + +/* vim:set et sw=4 sts=4 ts=4: */ +?> diff --git a/upgrade/merge-0.0.1/connect.db.inc.php b/upgrade/merge-0.0.1/connect.db.inc.php new file mode 120000 index 0000000..442fab7 --- /dev/null +++ b/upgrade/merge-0.0.1/connect.db.inc.php @@ -0,0 +1 @@ +../../bin/connect.db.inc.php \ No newline at end of file diff --git a/upgrade/newdirectory-0.0.1/00_names.sql b/upgrade/newdirectory-0.0.1/00_names.sql new file mode 100644 index 0000000..6260e32 --- /dev/null +++ b/upgrade/newdirectory-0.0.1/00_names.sql @@ -0,0 +1,114 @@ +DROP TABLE IF EXISTS profile_display; + +CREATE TABLE profile_display ( + pid INT(11) NOT NULL DEFAULT 0, + yourself VARCHAR(255) NOT NULL, + public_name VARCHAR(255) NOT NULL, + private_name VARCHAR(255) NOT NULL, + directory_name VARCHAR(255) NOT NULL, + short_name VARCHAR(255) NOT NULL, + sort_name VARCHAR(255) NOT NULL, + promo VARCHAR(255) DEFAULT '' NOT NULL, + PRIMARY KEY(pid) +) CHARSET=utf8; + +INSERT INTO profile_display (pid, yourself, public_name, private_name, directory_name, short_name, sort_name) + SELECT u.user_id, u.prenom, + CONCAT(u.prenom, ' ', IF(u.nom_usage != '', CONCAT(u.nom_usage, ' (', u.nom, ')') , u.nom)), + CONCAT(u.prenom, ' ', IF(u.nom_usage != '', CONCAT(u.nom_usage, ' (', u.nom, ')') , u.nom), + IF(q.profile_nick != '', CONCAT(' (alias ', q.profile_nick, ')'), '')), + CONCAT(IF(u.nom_usage != '', CONCAT(u.nom_usage, ' (', u.nom, ')') , u.nom), ' ', u.prenom), + CONCAT(u.prenom, ' ', IF(u.nom_usage != '', u.nom_usage, u.nom)), + CONCAT(IF(u.nom_usage != '', u.nom_usage, u.nom), ' ', u.prenom) + FROM auth_user_md5 AS u + LEFT JOIN auth_user_quick AS q ON (u.user_id = q.user_id); + + +DROP TABLE IF EXISTS profile_name_enum; + +CREATE TABLE IF NOT EXISTS profile_name_enum ( + id TINYINT(2) UNSIGNED NOT NULL AUTO_INCREMENT, + name VARCHAR(255) NOT NULL, + explanations VARCHAR(255) NOT NULL, + type VARCHAR(255) NOT NULL, + flags SET('has_particle', 'not_displayed', 'always_displayed', 'public') NOT NULL, + score TINYINT(2) UNSIGNED NOT NULL DEFAULT 10, + PRIMARY KEY (id), + UNIQUE (name) +) CHARSET=utf8; + +INSERT INTO profile_name_enum (name, flags, explanations, type, score) + VALUES ('Nom patronymique', 'has_particle,always_displayed,public', + 'Le nom de famille avec lequel tu es né', 'lastname', 10), + ('Nom marital', 'has_particle,always_displayed,public', + 'Ton nom d\'épouse ou d\'époux', 'lastname_marital', 10), + ('Nom usuel', 'has_particle,always_displayed,public', + 'Le nom de famille que tu utilises usuellement s\'il est différent du nom patronymique, ce peut-être une version racourcie de celui-ci, ton nom marital, une combinaison de ces deux noms...', + 'lastname_ordinary', 10), + ('Prénom', 'always_displayed,public', 'Ton prénom', 'firstname', 10), + ('Pseudonyme (nom de plume)', 'always_displayed,public', + 'Pseudonyme pour les artistes, gens de lettres', 'pseudonym', 10), + ('Surnom', '', 'Surnom à l\'École ou ailleurs', 'nickname', 2), + ('Prénom usuel', 'public', 'Si tu utilises une version raccourcie, francisée... de ton prénom', + 'firstname_ordinary', 10), + ('Autre prénom', '', 'Si tu as d\'autres prénoms et que tu souhaites les faire apparaître', + 'firstname_other', 1), + ('Autre nom', '', 'Si tu as d\'autres noms et que tu souhaites les faire apparaître', + 'name_other', 1), + ('Nom initial', 'has_particle,not_displayed,public', '', 'name_ini', 10), + ('Prénom initial', 'has_particle,not_displayed,public', '', 'firstname_ini', 10); + + +DROP TABLE IF EXISTS profile_name; + +CREATE TABLE IF NOT EXISTS profile_name ( + id TINYINT(2) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 'id of this name for this user', + pid INT(11) NOT NULL COMMENT 'id of alumni', + name VARCHAR(255) NOT NULL COMMENT 'name to search for', + particle VARCHAR(255) NOT NULL DEFAULT '' COMMENT 'particle of the name to search for', + typeid TINYINT(2) UNSIGNED NOT NULL COMMENT 'type of name', + PRIMARY KEY (pid, id), + INDEX pid (pid) +) CHARSET=utf8 COMMENT = 'Names of alumni (search table)'; + +INSERT INTO profile_name (pid, name, typeid) + SELECT u.user_id, u.nom, e.id + FROM auth_user_md5 AS u + INNER JOIN profile_name_enum AS e ON (e.name = 'Nom patronymique') + WHERE nom != ''; + +INSERT INTO profile_name (pid, name, typeid) + SELECT u.user_id, u.nom_ini, e.id + FROM auth_user_md5 AS u + INNER JOIN profile_name_enum AS e ON (e.name = 'Nom initial') + WHERE nom_ini != ''; + +INSERT INTO profile_name (pid, name, typeid) + SELECT u.user_id, u.prenom, e.id + FROM auth_user_md5 AS u + INNER JOIN profile_name_enum AS e ON (e.name = 'Prénom') + WHERE prenom != ''; + +INSERT INTO profile_name (pid, name, typeid) + SELECT u.user_id, u.prenom_ini, e.id + FROM auth_user_md5 AS u + INNER JOIN profile_name_enum AS e ON (e.name = 'Prénom initial') + WHERE prenom_ini != ''; + +INSERT INTO profile_name (pid, name, typeid) + SELECT u.user_id, u.nom_usage, e.id + FROM auth_user_md5 AS u + INNER JOIN profile_name_enum AS e ON (e.name = 'Nom usuel') + WHERE nom_usage != ''; + +INSERT INTO profile_name (pid, name, typeid) + SELECT q.user_id, q.profile_nick, e.id + FROM auth_user_quick AS q + INNER JOIN profile_name_enum AS e ON (e.name = 'Surnom') + WHERE profile_nick != ''; + +DROP TABLE IF EXISTS recherche_soundex; + +DELETE FROM search_autocomplete + WHERE name = 'name' OR name = 'firstname' OR name = 'nickname'; +-- 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 index 0000000..7de4690 --- /dev/null +++ b/upgrade/newdirectory-0.0.1/01_addrcomment.sql @@ -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 index 0000000..8b3e0d6 --- /dev/null +++ b/upgrade/newdirectory-0.0.1/02_networking.sql @@ -0,0 +1,46 @@ +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`), + INDEX uid (uid) +) 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`; + +# vim:set syntax=mysql: diff --git a/upgrade/newdirectory-0.0.1/03_emails.sql b/upgrade/newdirectory-0.0.1/03_emails.sql new file mode 100644 index 0000000..6ad3c7f --- /dev/null +++ b/upgrade/newdirectory-0.0.1/03_emails.sql @@ -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 index 0000000..bff48ee --- /dev/null +++ b/upgrade/newdirectory-0.0.1/04_telephone.sql @@ -0,0 +1,23 @@ +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`), + INDEX uid (uid) +); + + +-- 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`; + +# vim:set syntax=mysql: diff --git a/upgrade/newdirectory-0.0.1/05_nationalities.sql b/upgrade/newdirectory-0.0.1/05_nationalities.sql new file mode 100644 index 0000000..a7a585e --- /dev/null +++ b/upgrade/newdirectory-0.0.1/05_nationalities.sql @@ -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 index 0000000..708e8ef --- /dev/null +++ b/upgrade/newdirectory-0.0.1/06_education.sql @@ -0,0 +1,96 @@ +CREATE TABLE IF NOT EXISTS profile_education_field_enum ( + id INT(2) NOT NULL AUTO_INCREMENT, + field VARCHAR(255) DEFAULT NULL, + PRIMARY KEY(id), + UNIQUE KEY(field) +) CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS profile_education_degree_enum ( + id INT(2) NOT NULL AUTO_INCREMENT, + degree VARCHAR(255) DEFAULT NULL, + abbreviation VARCHAR(255) DEFAULT '' NOT NULL, + level TINYINT (1) UNSIGNED DEFAULT 0 NOT NULL, + PRIMARY KEY(id), + UNIQUE KEY(degree) +) CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS profile_education_degree ( + eduid INT(4) NOT NULL DEFAULT 0, + degreeid INT(2) NOT NULL DEFAULT 0, + PRIMARY KEY(eduid, degreeid) +) CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS profile_education_enum ( + id INT(4) NOT NULL AUTO_INCREMENT, + name VARCHAR(255) DEFAULT NULL, + abbreviation VARCHAR(255) DEFAULT '' NOT NULL, + url VARCHAR(255) DEFAULT NULL, + country CHAR(2) NOT NULL DEFAULT 'FR', + PRIMARY KEY(id), + UNIQUE KEY(name) +) CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS profile_education ( + id TINYINT(2) UNSIGNED NOT NULL DEFAULT 0, + uid INT(11) NOT NULL DEFAULT 0, + eduid INT(4) NOT NULL DEFAULT 0, + degreeid INT(4) NOT NULL DEFAULT 0, + fieldid INT(2) NOT NULL DEFAULT 0, + entry_year INT(4) DEFAULT NULL, + grad_year INT(4) DEFAULT NULL, + program VARCHAR(255) DEFAULT NULL, + flags SET('primary') DEFAULT '' NOT NULL, + PRIMARY KEY(id, uid), + INDEX uid (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 index 0000000..f0b52d9 --- /dev/null +++ b/upgrade/newdirectory-0.0.1/07_corps @@ -0,0 +1,49 @@ +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; + + UPDATE profile_corps AS c +INNER JOIN profile_corps_enum AS e ON (c.original_corpsid = e.id) + LEFT JOIN profile_corps_enum AS a ON (a.name = "Aucun (anc. démissionnaire)") + SET c.original_corpsid = a.id + WHERE e.name = "Ancien élève étranger"; + +UPDATE profile_corps_enum + SET name = "Aucun" + WHERE name = "Aucun (anc. démissionnaire)"; + +DELETE FROM profile_corps_enum + WHERE name = "Ancien élève étranger"; + + +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/newdirectory-0.0.1/08_nationalities.sql b/upgrade/newdirectory-0.0.1/08_nationalities.sql new file mode 100644 index 0000000..247c102 --- /dev/null +++ b/upgrade/newdirectory-0.0.1/08_nationalities.sql @@ -0,0 +1,219 @@ +ALTER TABLE geoloc_pays ADD COLUMN license_plate CHAR(4) DEFAULT NULL; + +CREATE TEMPORARY TABLE IF NOT EXISTS tmp_update_geoloc_pays ( + a2 CHAR(2) DEFAULT NULL, + code CHAR(4) DEFAULT NULL, + PRIMARY KEY(a2), + UNIQUE KEY(code) +) CHARSET=utf8; + +INSERT IGNORE INTO tmp_update_geoloc_pays (a2, code) + VALUES ('AF', 'AFG'), + ('ZA', 'ZA'), + ('AL', 'AL'), + ('DZ', 'DZ'), + ('DE', 'D'), + ('AD', 'AND'), + ('AO', 'ANG'), + ('AG', 'AG'), + ('AN', 'NA'), + ('SA', 'KSA'), + ('AR', 'RA'), + ('AM', 'ARM'), + ('AU', 'AUS'), + ('AT', 'A'), + ('AZ', 'AZ'), + ('BS', 'BS'), + ('BH', 'BRN'), + ('BD', 'BD'), + ('BB', 'BDS'), + ('BY', 'BY'), + ('BE', 'B'), + ('BZ', 'BZ'), + ('BJ', 'DY'), + ('BM', ''), + ('BT', 'BHT'), + ('BO', 'BOL'), + ('BA', 'BIH'), + ('BW', 'RB'), + ('BR', 'BR'), + ('BN', 'BRU'), + ('BG', 'BG'), + ('BF', 'BF'), + ('BI', 'BU'), + ('KH', 'K'), + ('CM', 'CAM'), + ('CA', 'CDN'), + ('CV', 'CV'), + ('CF', 'RCA'), + ('CG', 'CGO'), + ('CL', 'RCH'), + ('CN', 'CN'), + ('CY', 'CY'), + ('CO', 'CO'), + ('KM', 'COM'), + ('CG', 'RCB'), + ('CD', 'CD'), + ('KR', 'ROK'), + ('KP', 'DVRK'), + ('CR', 'CR'), + ('CI', 'CI'), + ('HR', 'HR'), + ('CU', 'C'), + ('DK', 'DK'), + ('DJ', 'DJI'), + ('DO', 'DOM'), + ('DM', 'WD'), + ('EG', 'ET'), + ('SV', 'ES'), + ('AE', 'UAE'), + ('EC', 'EC'), + ('ER', 'ER'), + ('ES', 'E'), + ('EE', 'EST'), + ('US', 'USA'), + ('ET', 'ETH'), + ('FO', 'FR'), + ('FJ', 'FJI'), + ('FI', 'FIN'), + ('FR', 'F'), + ('GA', 'G'), + ('GM', 'WAG'), + ('GE', 'GE'), + ('GH', 'GH'), + ('GI', 'GBZ'), + ('GR', 'GR'), + ('GD', 'WG'), + ('GL', 'KN'), + ('GT', 'GCA'), + ('GN', 'RG'), + ('GQ', 'GQ'), + ('GY', 'GUY'), + ('HT', 'RH'), + ('HN', 'HN'), + ('HK', 'HK'), + ('HU', 'H'), + ('VG', 'BVI'), + ('IN', 'IND'), + ('ID', 'RI'), + ('IR', 'IR'), + ('IQ', 'IRQ'), + ('IE', 'IRL'), + ('IS', 'IS'), + ('IL', 'IL'), + ('IT', 'I'), + ('JM', 'JA'), + ('JP', 'J'), + ('JO', 'JOR'), + ('KZ', 'KZ'), + ('KE', 'EAK'), + ('KG', 'KS'), + ('KI', 'KIR'), + ('KW', 'KWT'), + ('LA', 'LAO'), + ('LS', 'LS'), + ('LV', 'LV'), + ('LB', 'RL'), + ('LR', 'LB'), + ('LY', 'LAR'), + ('LI', 'FL'), + ('LT', 'LT'), + ('LU', 'L'), + ('MK', 'MK'), + ('MG', 'RM'), + ('MY', 'MAL'), + ('MW', 'MW'), + ('MV', 'MV'), + ('ML', 'RMM'), + ('MT', 'M'), + ('MA', 'MA'), + ('MH', 'MH'), + ('MU', 'MS'), + ('MR', 'RIM'), + ('MX', 'MEX'), + ('FM', 'FSM'), + ('MD', 'MD'), + ('MC', 'MC'), + ('MN', 'MGL'), + ('MZ', 'MOC'), + ('MM', 'MYA'), + ('NA', 'NAM'), + ('NR', 'NAU'), + ('NP', 'NEP'), + ('NI', 'NIC'), + ('NE', 'RN'), + ('NG', 'WAN'), + ('NO', 'N'), + ('NZ', 'NZ'), + ('OM', 'OM'), + ('UG', 'EAU'), + ('UZ', 'UZ'), + ('PK', 'PK'), + ('PW', 'PAL'), + ('PS', 'PS'), + ('PA', 'PA'), + ('PG', 'PNG'), + ('PY', 'PY'), + ('NL', 'NL'), + ('PE', 'PE'), + ('PH', 'RP'), + ('PL', 'PL'), + ('PT', 'P'), + ('QA', 'Q'), + ('RE', 'RE'), + ('RO', 'RO'), + ('GB', 'GB'), + ('RU', 'RUS'), + ('RW', 'RWA'), + ('LC', 'WL'), + ('KN', 'SCN'), + ('SM', 'RSM'), + ('VA', 'V'), + ('VC', 'WV'), + ('SB', 'SOL'), + ('WS', 'WS'), + ('ST', 'STP'), + ('SN', 'SN'), + ('CS', 'SCG'), + ('SC', 'SY'), + ('SL', 'WAL'), + ('SG', 'SGP'), + ('SK', 'SK'), + ('SI', 'SLO'), + ('SO', 'SP'), + ('SD', 'SUD'), + ('LK', 'CL'), + ('SE', 'S'), + ('CH', 'CH'), + ('SR', 'SME'), + ('SZ', 'SD'), + ('SY', 'SYR'), + ('TJ', 'TJ'), + ('TW', 'RC'), + ('TZ', 'EAT'), + ('TD', 'TCH'), + ('CZ', 'CZ'), + ('TH', 'THA'), + ('TL', 'TL'), + ('TG', 'RT'), + ('TO', 'TO'), + ('TT', 'TT'), + ('TN', 'TN'), + ('TM', 'TM'), + ('TR', 'TR'), + ('TV', 'TUV'), + ('UA', 'UA'), + ('UY', 'ROU'), + ('VU', 'VU'), + ('VE', 'YV'), + ('VN', 'VN'), + ('YE', 'YAR'), + ('YU', 'YU'), + ('ZM', 'Z'), + ('ZW', 'ZW'); + + UPDATE geoloc_pays AS g +INNER JOIN tmp_update_geoloc_pays AS t ON (t.a2 = g.a2) + SET g.license_plate = t.code; + +-- vim:set syntax=mysql: diff --git a/upgrade/newdirectory-0.0.1/09_education.sql b/upgrade/newdirectory-0.0.1/09_education.sql new file mode 100644 index 0000000..6ba922e --- /dev/null +++ b/upgrade/newdirectory-0.0.1/09_education.sql @@ -0,0 +1,577 @@ +-- Updates diplomas +UPDATE profile_education_degree_enum SET abbreviation = 'PhD', degree = 'Doctorat', level = 8 WHERE degree = 'PhD'; +UPDATE profile_education_degree_enum SET abbreviation = 'Lic.', level = 3 WHERE degree = 'Licence'; +UPDATE profile_education_degree_enum SET abbreviation = 'MSc', degree = 'Master of Science', level = 5 WHERE degree = 'MS'; +UPDATE profile_education_degree_enum SET abbreviation = 'DEA', degree = "Diplôme d'Études Approfondies", level = 5 WHERE degree = 'DEA'; +UPDATE profile_education_degree_enum SET abbreviation = 'ME', degree = 'Master of Economics', level = 5 WHERE degree = 'ME'; +UPDATE profile_education_degree_enum SET abbreviation = 'MBA', degree = 'Master of Business Administration', level = 5 WHERE degree = 'MBA'; +UPDATE profile_education_degree_enum SET abbreviation = 'MiF', degree = 'Master in Finance', level = 5 WHERE degree = 'MiF'; +UPDATE profile_education_degree_enum SET abbreviation = 'MPA', degree = 'Master of Public Administration', level = 5 WHERE degree = 'MPA'; +UPDATE profile_education_degree_enum SET abbreviation = 'MIA', degree = 'Master of International Affairs', level = 5 WHERE degree = 'MIA'; +UPDATE profile_education_degree_enum SET abbreviation = 'Corps', degree = 'Corps', level = 5 WHERE degree = 'Corps'; +UPDATE profile_education_degree_enum SET abbreviation = 'Ing.', degree = 'Ingénieur', level = 5 WHERE degree = 'Ingénieur'; +UPDATE profile_education_degree_enum SET abbreviation = 'Dipl.', degree = 'Diplôme', level = 0 WHERE degree = 'Diplôme'; + +INSERT INTO profile_education_degree_enum (abbreviation, degree, level) + VALUES ('Agr.', 'Agrégation', 4), ('CAPES', 'Certificat d\'Aptitude au Professorat de l\'Enseignement du Second degré', 4), + ('DESS', 'Diplôme d\'Études Supérieures Spécialisées', 5), ('BTS', 'Brevet de Technicien Supérieur', 2), ('MA', 'Master of Arts', 5), + ('Maîtr.', 'Maîtrise', 4), ('HDR', 'Habilitation à Diriger des Recherches', 8), ('DEUG', 'Diplôme d\'Études Universitaires Générales', 2), + ('MEE', 'Master of Electrical Engineering', 5), ('MPhil', 'Master of Philosophy', 5), ('MUP', 'Master of Urban Planning', 5), + ('MME', 'Master of Mechanical Engineering', 5), ('MCP', 'Master of City Planning', 5), ('BA', 'Bachelor of Arts', 3), + ('MEl', 'Master of Electronics', 5), ('MM', 'Master of Management', 5), ('MIB', 'Master of International Business', 5), + ('MC', 'Master of Chemistry', 5), ('MEM', 'Master of Engineering in Manufacturing', 5), ('MEng', 'Master of Engineering', 5), + ('MCE', 'Master of Chemical Engineering', 5), ('M', 'Master', 5), ('MMS', 'Master of Military Studies', 5), + ('MSI', 'Master of Science in Information', 5), + ('DESCF', 'Diplôme d\'Études Supérieures Comptables et Financières', 5), ('MB', 'Master of Biotechnology', 5); + +-- Updates universities +UPDATE profile_education_enum +SET abbreviation = 'Télécom', name = 'Télécom ParisTech', url = 'http://www.telecom-paristech.fr/' +WHERE name = 'Télécom'; +UPDATE profile_education_enum +SET abbreviation = 'ENGREF', name = 'École Nationale du Génie Rural des Eaux et des Forêts', url = 'http://www.agroparistech.fr/-Ecole-interne-ENGREF-.html' +WHERE name = 'ENGREF'; +UPDATE profile_education_enum +SET abbreviation = 'INSEE', name = 'Institut National de la Statistique et des Études Économiques' +WHERE name = 'INSEE'; +UPDATE profile_education_enum +SET abbreviation = 'Météo', name = 'École Nationale de la Météorologie' +WHERE name = 'Météo'; +UPDATE profile_education_enum +SET abbreviation = 'Mines', name = 'Mines ParisTech' +WHERE name = 'Mines'; +UPDATE profile_education_enum +SET abbreviation = 'Ponts', name = 'École des Ponts ParisTech' +WHERE name = 'Ponts'; +UPDATE profile_education_enum +SET abbreviation = 'ENSAE', name = 'École Nationale de la Statistique et de l\'Administration Économique ParisTech' +WHERE name = 'ENSAE'; +UPDATE profile_education_enum +SET abbreviation = 'ENSAM', name = 'Arts et Métiers ParisTech' +WHERE name = 'ENSAM'; +UPDATE profile_education_enum +SET abbreviation = 'ENSEEIHT', name = 'École Nationale Supérieure d\'Électrotechnique, d\'Électronique, d\'Informatique, d\'Hydraulique et des Télécommunications' +WHERE name = 'ENSEEIHT'; +UPDATE profile_education_enum +SET abbreviation = 'ENSIMAG', name = 'École Nationale Supérieure d\'Informatique et de Mathématiques Appliquées de Grenoble', url = 'http://ensimag.grenoble-inp.fr/' +WHERE name = 'ENSIMAG'; +UPDATE profile_education_enum +SET abbreviation = 'ENSTA', name = 'École Nationale Supérieure de Techniques Avancées' +WHERE name = 'ENSTA'; +UPDATE profile_education_enum +SET abbreviation = 'ENSPM', name = 'École Nationale Supérieure du Pétrole et des Moteurs' +WHERE name = 'ENSPM'; +UPDATE profile_education_enum +SET abbreviation = 'INAPG', name = 'Institut National Agronomique Paris-Grignon', url = 'http://www.agroparistech.fr/' +WHERE name = 'INAPG'; +UPDATE profile_education_enum +SET abbreviation = 'HEC', name = 'École des Hautes Études Commerciales' +WHERE name = 'HEC'; +UPDATE profile_education_enum +SET abbreviation = 'X', name = 'École polytechnique', url = 'http://www.polytechnique.edu/' +WHERE name = 'X'; +UPDATE profile_education_enum +SET abbreviation = 'SUPAERO', name = 'École Nationale Supérieure de l\'Aéronautique et de l\'Espace', url = 'http://www.isae.fr/' +WHERE name = 'Supaéro'; +UPDATE profile_education_enum +SET abbreviation = 'SupOptique', name = 'Institut d\'Optique Théorique et Appliquée' +WHERE name = 'Supoptique'; +UPDATE profile_education_enum +SET abbreviation = 'Supélec', name = 'École Supérieure d\'Électricité' +WHERE name = 'Supélec'; +UPDATE profile_education_enum +SET abbreviation = 'ENA', name = 'École Nationale d\'Administration' +WHERE name = 'ENA'; +UPDATE profile_education_enum +SET abbreviation = 'INSEAD', name = 'Institut Européen d\'Administration des Affaires', url = 'http://www.insead.edu/' +WHERE name = 'INSEAD'; +UPDATE profile_education_enum +SET abbreviation = 'Chimie Paris', name = 'Chimie Paris ParisTech', url = 'http://www.enscp.fr/' +WHERE name = 'Chimie Paris'; +UPDATE profile_education_enum +SET abbreviation = 'INSTN', name = 'Institut National des Sciences et Techniques Nucléaires' +WHERE name = 'INSTN'; +UPDATE profile_education_enum +SET abbreviation = 'UMPC', name = 'Université Pierre-et-Marie-Curie (Paris-VI)', url = 'http://www.upmc.fr/' +WHERE name = 'Univ Paris 6 (Pierre et Marie Curie - Jussieu)'; +UPDATE profile_education_enum +SET abbreviation = 'Paris-Sud', name = 'Université Paris-Sud (Paris-XI)' +WHERE name = 'Univ Paris 11 (Orsay)'; +UPDATE profile_education_enum +SET abbreviation = 'Paris-Diderot', name = 'Université Denis Diderot (Paris-VII)', url = 'http://www.univ-paris7.fr/' +WHERE name = 'Univ Paris 7 (Denis Diderot - Jussieu)'; +UPDATE profile_education_enum +SET abbreviation = 'Dauphine', name = 'Université de Technologie en Sciences des Organisations et de la Décision de Paris-Dauphine (Paris-IX)' +WHERE name = 'Univ Paris 9 (Dauphine)'; +UPDATE profile_education_enum +SET abbreviation = 'Panthéon-Sorbonne', name = 'Université Panthéon-Sorbonne (Paris-I)' +WHERE name = 'Univ Paris 1 (Panthéon-Sorbonne)'; +UPDATE profile_education_enum +SET abbreviation = 'Nanterre', name = 'Université de Paris Ouest - Nanterre La Défense (Paris-X)' +WHERE name = 'Univ Paris 10 (Nanterre)'; +UPDATE profile_education_enum +SET abbreviation = 'Paris-Descartes', name = 'Université Paris Descartes (Paris-V)' +WHERE name = 'Univ Paris 5 (René Descartes)'; +UPDATE profile_education_enum +SET abbreviation = 'Sorbonne Nouvelle', name = 'Université Sorbonne Nouvelle (Paris-III)' +WHERE name = 'Univ Paris 3 (Sorbonne Nouvelle)'; +UPDATE profile_education_enum +SET abbreviation = 'Vincennes-Saint-Denis', name = 'Université de Vincennes à Saint-Denis (Paris-VIII)' +WHERE name = 'Univ Paris 8 (Vincennes - Saint Denis)'; +UPDATE profile_education_enum +SET abbreviation = 'Paris-Val de Marne', name = 'Université Paris-Val de Marne (Paris-XII)' +WHERE name = 'Univ Paris 12 (Val de Marne)'; +UPDATE profile_education_enum +SET abbreviation = 'Paris-Nord', name = 'Université Paris-Nord (Paris-XIII)' +WHERE name = 'Univ Paris 13 (Nord)'; +UPDATE profile_education_enum +SET abbreviation = 'Paris-Sorbonne', name = 'Université Paris-Sorbonne (Paris-IV)' +WHERE name = 'Univ Paris 4 (Sorbonne)'; +UPDATE profile_education_enum +SET abbreviation = 'Assas', name = 'Université Panthéon-Assas (Paris-II)' +WHERE name = 'Univ Paris 2 (Panthéon - Assas)'; +UPDATE profile_education_enum +SET abbreviation = 'CDI', name = 'Collège des Ingénieurs' +WHERE name = 'Collège des Ingénieurs'; +UPDATE profile_education_enum +SET abbreviation = 'ENS Ulm', name = 'École Normale Supérieure' +WHERE name = 'ENS Ulm'; +UPDATE profile_education_enum +SET abbreviation = 'ENS Lyon', name = 'École Normale Supérieure de Lyon ' +WHERE name = 'ENS Lyon'; +UPDATE profile_education_enum +SET abbreviation = 'ENS Cachan', name = 'École Normale Supérieure de Cachan' +WHERE name = 'ENS Cachan'; +UPDATE profile_education_enum +SET abbreviation = 'ESPCI', name = 'ESPCI ParisTech' +WHERE name = 'ESPCI'; +UPDATE profile_education_enum +SET abbreviation = 'Sciences Po', name = 'Institut d\'Études Politiques de Paris' +WHERE name = 'IEP Paris'; +UPDATE profile_education_enum +SET abbreviation = 'EHESS', name = 'École des Hautes Études en Sciences Sociales' +WHERE name = 'EHESS'; +UPDATE profile_education_enum +SET abbreviation = 'ENSIC', name = 'École Nationale Supérieure des Industries Chimiques' +WHERE name = 'ENSIC'; +UPDATE profile_education_enum +SET abbreviation = 'Grenoble INP', name = 'Institut Polytechnique de Grenoble', url = 'http://www.grenoble-inp.fr/' +WHERE name = 'INPG'; +UPDATE profile_education_enum +SET abbreviation = 'ESSEC', name = 'École Supérieure des Sciences Économiques et Commerciales' +WHERE name = 'ESSEC'; +UPDATE profile_education_enum +SET abbreviation = 'INPL', name = 'Institut National Polytechnique de Lorraine' +WHERE name = 'INPL'; +UPDATE profile_education_enum +SET abbreviation = 'ENSAPB', name = 'École Nationale Supérieure d\'Architecture de Paris-Belleville' +WHERE name = 'EAPB (Ecole Architecture Paris Belleville)'; +UPDATE profile_education_enum +SET abbreviation = 'ENSAPLV', name = 'École Nationale Supérieure d\'Architecture de Paris-La Villette' +WHERE name = 'EAPLV (Ecole Architecture Paris La Villette)'; +UPDATE profile_education_enum +SET abbreviation = 'EAVT', name = 'École d\'Architecture de la Ville et des Territoires à Marne-la-Vallée' +WHERE name = 'EAVT (Ecole d\'architecture de Marne La Vallee)'; +UPDATE profile_education_enum +SET abbreviation = 'ENSP', name = 'École Nationale Supérieure du Paysage' +WHERE name = 'ENSP Versailles'; +UPDATE profile_education_enum +SET abbreviation = '', name = 'École Nationale Supérieure du Génie Maritime', url = 'http://www.ensta.fr/' +WHERE name = 'Génie maritime (Ecole nationale supérieur du)'; +UPDATE profile_education_enum +SET abbreviation = 'CPA de Paris', name = 'Centre de Perfectionnement aux Affaires de Paris', url = '' +WHERE name = 'Centre de Perfectionnement aux Affaires'; +UPDATE profile_education_enum +SET abbreviation = '', name = 'ESCP-EAP', url = 'http://www.escp-eap.eu/' +WHERE name = 'ESCP-EAP'; +UPDATE profile_education_enum +SET abbreviation = 'CEPE', name = 'Centre d\'Études des Programmes Économiques' +WHERE name = 'CEPE'; +UPDATE profile_education_enum +SET abbreviation = '', name = 'Institut des Actuaires', url = 'http://www.institutdesactuaires.com/' +WHERE name = 'Institut des actuaires'; +UPDATE profile_education_enum +SET abbreviation = 'CEIPI', name = 'Centre d\'Études Internationales de la Propriété Industrielle' +WHERE name = 'CEIPI'; +UPDATE profile_education_enum +SET abbreviation = 'Université Paul-Sabatier', name = 'Université Paul-Sabatier (Toulouse III)' +WHERE name = 'Univ Toulouse III (Paul Sabatier)'; +UPDATE profile_education_enum +SET abbreviation = 'Université de Provence', name = 'Université de Provence (Aix-Marseille I)' +WHERE name = 'Université de Provence'; +UPDATE profile_education_enum +SET abbreviation = 'INSA Rouen', name = 'Institut National des Sciences Appliquées de Rouen' +WHERE name = 'INSA Rouen'; +UPDATE profile_education_enum +SET abbreviation = 'IAE de Paris', name = 'Institut d\'Administration des Entreprises de Paris', url = 'http://iae.univ-paris1.fr/' +WHERE name = 'Institut d\'Administration des Entreprises'; + +UPDATE profile_education_enum +SET abbreviation = 'Berkeley', name = 'University of California, Berkeley', country = 'US' +WHERE name = 'Univ Berkeley'; +UPDATE profile_education_enum +SET abbreviation = 'CalTech', name = 'California Institute of Technology', country = 'US' +WHERE name = 'CalTech'; +UPDATE profile_education_enum +SET abbreviation = 'MIT', name = 'Massachusetts Institute of Technology', country = 'US' +WHERE name = 'Massachusetts Institute of Technology'; +UPDATE profile_education_enum +SET abbreviation = 'Cornell', name = 'Cornell University', country = 'US' +WHERE name = 'Univ Cornell'; +UPDATE profile_education_enum +SET abbreviation = 'Stanford', name = 'Stanford University', country = 'US' +WHERE name = 'Univ Stanford'; +UPDATE profile_education_enum +SET abbreviation = 'UCLA', name = 'University of California, Los Angeles', country = 'US' +WHERE name = 'Univ UCLA'; +UPDATE profile_education_enum +SET abbreviation = '', name = 'University of Illinois', country = 'US' +WHERE name = 'Univ Illinois'; +UPDATE profile_education_enum +SET abbreviation = 'Michigan', name = 'University of Michigan, Ann Arbor', country = 'US' +WHERE name = 'Univ Michigan'; +UPDATE profile_education_enum +SET abbreviation = '', name = 'Seattle University', country = 'US' +WHERE name = 'Univ Seattle'; +UPDATE profile_education_enum +SET abbreviation = 'UGA', name = 'University of Georgia', country = 'US' +WHERE name = 'Univ Georgia'; +UPDATE profile_education_enum +SET abbreviation = 'UT Austin', name = 'University of Texas at Austin', country = 'US' +WHERE name = 'Univ Texas'; +UPDATE profile_education_enum +SET abbreviation = 'RIP', name = 'Rensselaer Polytechnic Institute', country = 'US' +WHERE name = 'Univ Rensselaer'; +UPDATE profile_education_enum +SET abbreviation = 'NYU', name = 'New York University', country = 'US' +WHERE name = 'Univ New York'; +UPDATE profile_education_enum +SET abbreviation = 'Harvard', name = 'Harvard University', country = 'US' +WHERE name = 'Univ Harvard'; +UPDATE profile_education_enum +SET abbreviation = 'The Wharton School', name = 'The Wharton School of the University of Pennsylvania', country = 'US', url = 'http://www.wharton.upenn.edu/' +WHERE name = 'Univ Wharton'; +UPDATE profile_education_enum +SET abbreviation = 'Columbia University', name = 'Columbia University in the City of New York', country = 'US' +WHERE name = 'Univ Columbia'; +UPDATE profile_education_enum +SET abbreviation = 'WSBS', name = 'Watson School of Biological Sciences', country = 'US' +WHERE name = 'Watson School of Biological Sciences'; +UPDATE profile_education_enum +SET abbreviation = '', name = 'Colorado School of Mines', country = 'US' +WHERE name = 'Univ Colorado School of Mines'; +UPDATE profile_education_enum +SET abbreviation = 'Princeton', name = 'Princeton University', country = 'US' +WHERE name = 'Univ Princeton'; +UPDATE profile_education_enum +SET abbreviation = 'Georgia Tech', name = 'Georgia Institute of Technology', country = 'US' +WHERE name = 'GeorgiaTech'; +UPDATE profile_education_enum +SET abbreviation = 'JHU', name = 'Johns Hopkins University', country = 'US' +WHERE name = 'Univ Johns Hopkins'; +UPDATE profile_education_enum +SET abbreviation = '', name = 'University of Chicago', country = 'US' +WHERE name = 'Univ Chicago'; +UPDATE profile_education_enum +SET abbreviation = 'Yale', name = 'Yale University', country = 'US' +WHERE name = 'Univ Yale'; +UPDATE profile_education_enum +SET abbreviation = 'TAMU', name = 'Texas A&M University', country = 'US' +WHERE name = 'Texas A&M University'; +UPDATE profile_education_enum +SET abbreviation = 'UCSB', name = 'University of California, Santa Barbara', country = 'US' +WHERE name = 'Univ Santa-Barbara'; +UPDATE profile_education_enum +SET abbreviation = 'Kellogg', name = 'Kellogg School of Management', country = 'US' +WHERE name = 'Kellogg School of Management'; +UPDATE profile_education_enum +SET abbreviation = '', name = 'University of Iowa', country = 'US' +WHERE name = 'Univ Iowa'; +UPDATE profile_education_enum +SET abbreviation = 'UW-Madison', name = 'University of Wisconsin-Madison', country = 'US', url = 'http://www.wisc.edu/' +WHERE name = 'Univ Wisconsin-Madison'; +UPDATE profile_education_enum +SET abbreviation = 'UCSD', name = 'University of California, San Diego', country = 'US' +WHERE name = 'Univ San Diego'; +UPDATE profile_education_enum +SET abbreviation = 'NU', name = 'Northwestern University', country = 'US' +WHERE name = 'Univ Northwestern'; +UPDATE profile_education_enum +SET abbreviation = 'CU', name = 'University of Colorado at Boulder', country = 'US' +WHERE name = 'Univ Colorado at Boulder'; +UPDATE profile_education_enum +SET abbreviation = 'CMU', name = 'Carnegie Mellon University', country = 'US' +WHERE name = 'Univ Carnegie Mellon'; +UPDATE profile_education_enum +SET abbreviation = 'Carolina', name = 'University of North Carolina at Chapel Hill', country = 'US' +WHERE name = 'Univ of North Carolina at Chapel Hill'; +UPDATE profile_education_enum +SET abbreviation = 'UM', country = 'US' +WHERE name = 'University of Miami'; + +UPDATE profile_education_enum +SET abbreviation = 'TU Berlin', name = 'Technische Universität Berlin', country = 'DE' +WHERE name = 'Univ TU Berlin'; +UPDATE profile_education_enum +SET abbreviation = 'TU Darmstadt', name = 'Technische Universität Darmstadt', country = 'DE' +WHERE name = 'Univ TU Darmstadt'; +UPDATE profile_education_enum +SET abbreviation = 'TU München', name = 'Technische Universität München', country = 'DE' +WHERE name = 'Univ TU München'; +UPDATE profile_education_enum +SET abbreviation = 'Universität Karlsruhe', name = 'Universität Karlsruhe (TH)', country = 'DE' +WHERE name = 'Univ Karlsruhe'; +UPDATE profile_education_enum +SET abbreviation = 'RWTH', name = 'RWTH Aachen University', country = 'DE' +WHERE name = 'Univ RWTH-Aachen'; +UPDATE profile_education_enum +SET abbreviation = '', name = 'Universität Stuttgart', country = 'DE' +WHERE name = 'Univ Stuttgart'; + +UPDATE profile_education_enum +SET abbreviation = 'EPM', name = 'École Polytechnique de Montréal', country = 'CA' +WHERE name = 'EP Montréal'; +UPDATE profile_education_enum +SET abbreviation = 'UBC', name = 'University of British Columbia', country = 'CA' +WHERE name = 'Univ British Columbia'; +UPDATE profile_education_enum +SET abbreviation = 'McGill', name = 'McGill University', country = 'CA' +WHERE name = 'Univ McGill'; +UPDATE profile_education_enum +SET abbreviation = 'UQÀM', name = 'Université du Québec à Montréal', country = 'CA' WHERE id = 125; + +UPDATE profile_education_enum +SET abbreviation = 'UPC', name = 'Universitat Politècnica de Catalunya', country = 'ES' +WHERE name = 'Univ Catalunya'; +UPDATE profile_education_enum +SET abbreviation = 'UPM', name = 'Universidad Politècnica de Madrid', country = 'ES' +WHERE name = 'Univ Madrid'; +UPDATE profile_education_enum +SET abbreviation = 'UPF', name = 'Universitat Pompeu Fabra', country = 'ES' +WHERE name = 'Univ Pompeu Fabra'; + +UPDATE profile_education_enum +SET abbreviation = 'Chalmers', name = 'Chalmers Tekniska Högskola', country = 'SE' +WHERE name = 'Univ Chalmers'; +UPDATE profile_education_enum +SET abbreviation = 'KTH', name = 'Kungliga Tekniska Högskolan', country = 'SE' +WHERE name = 'Univ KTH'; +UPDATE profile_education_enum +SET abbreviation = '', name = 'Stockholms Universitet', country = 'SE' +WHERE name = 'Univ Stockholm'; + +UPDATE profile_education_enum +SET abbreviation = 'TU Delft', name = 'Technische Universiteit Delft', country = 'NL' +WHERE name = 'Univ TU Delft'; +UPDATE profile_education_enum +SET abbreviation = 'RSM', name = 'Rotterdam School of Management, Erasmus University', country = 'NL' +WHERE name = 'RSM'; +UPDATE profile_education_enum +SET abbreviation = '', name = 'Universiteit Leiden', country = 'NL' +WHERE name = 'Univ Leiden'; + +UPDATE profile_education_enum +SET abbreviation = '', name = 'Kyoto University', country = 'JP' +WHERE name = 'Univ Kyoto'; +UPDATE profile_education_enum +SET abbreviation = 'Todai', name = 'University of Tokyo', country = 'JP' +WHERE name = 'Univ Tokyo'; +UPDATE profile_education_enum +SET abbreviation = 'Tokyo Tech', name = 'Tokyo Institute of Technology', country = 'JP' +WHERE name = 'Tokyo Institute of Technology'; + +UPDATE profile_education_enum +SET abbreviation = 'UNIL', name = 'Université de Lausanne', country = 'CH' +WHERE name = 'Univ Lausanne'; +UPDATE profile_education_enum +SET abbreviation = '', name = 'Universität Zürich', country = 'CH' +WHERE name = 'Univ Zürich'; +UPDATE profile_education_enum +SET abbreviation = 'EPFL', name = 'École Polytechnique Fédérale de Lausanne', country = 'CH' +WHERE name = 'EP Fédérale Lausanne'; +UPDATE profile_education_enum +SET abbreviation = 'IMD', name = 'International Institute for Management Development', country = 'CH' +WHERE name = 'Institute for Management Development'; +UPDATE profile_education_enum +SET abbreviation = 'ETH Zürich', name = 'Eidgenössische Technische Hochschule Zürich', country = 'CH' +WHERE name = 'ETH Zürich'; + +UPDATE profile_education_enum +SET abbreviation = 'UNIMI', name = 'Università degli Studi di Milano', country = 'IT' +WHERE name = 'Univ Milano'; +UPDATE profile_education_enum +SET abbreviation = 'UNITO', name = 'Università degli Studi di Torino', country = 'IT' +WHERE name = 'Univ Torino'; +UPDATE profile_education_enum +SET abbreviation = '', name = 'Politecnico di Milano', country = 'IT' +WHERE name = 'Politecnico di Milano'; +UPDATE profile_education_enum +SET abbreviation = 'EUI', name = 'European University Institute', country = 'IT' +WHERE name = 'Institut Universitaire Européen'; +UPDATE profile_education_enum +SET abbreviation = 'Università Bocconi', name = 'Università Commerciale Luigi Bocconi', url = 'http://www.unibocconi.it/', country = 'IT' +WHERE name = 'Université Bocconi'; + +UPDATE profile_education_enum +SET abbreviation = 'MGU', name = 'Lomonosov Moscow State University', country = 'RU' +WHERE name = 'Univ Moscow (lomonosov)'; +UPDATE profile_education_enum +SET abbreviation = 'Bauman MSTU', name = 'Bauman Moscow State Technical University', country = 'RU', url = 'http://www.bmstu.ru/' +WHERE name = 'Univ Moscow (Bauman)'; + +UPDATE profile_education_enum +SET abbreviation = 'Technion', name = 'Israel Institute of Technology', country = 'IL' +WHERE name = 'Univ Technion'; + +UPDATE profile_education_enum +SET abbreviation = 'Oxford', name = 'University of Oxford', country = 'GB' +WHERE name = 'Univ Oxford'; +UPDATE profile_education_enum +SET abbreviation = '', name = 'London Business School', country = 'GB' +WHERE name = 'London Business School'; +UPDATE profile_education_enum +SET abbreviation = 'LSE', name = 'The London School of Economics and Political Science', country = 'GB' +WHERE name = 'London School of Economics'; +UPDATE profile_education_enum +SET abbreviation = 'Cambridge', name = 'University of Cambridge', country = 'GB' +WHERE name = 'Univ Cambridge'; +UPDATE profile_education_enum +SET abbreviation = 'Imperial College', name = 'Imperial College London', country = 'GB', url = 'http://www3.imperial.ac.uk/' +WHERE name = 'Imperial College'; +UPDATE profile_education_enum +SET abbreviation = 'Henley', name = 'Henley Management College', country = 'GB', url = 'http://www.henley.reading.ac.uk/' +WHERE name = 'Henley Management College'; +UPDATE profile_education_enum +SET abbreviation = '', name = 'University of Southampton', country = 'GB', url = 'http://www.soton.ac.uk/' +WHERE name = 'Univ Southampton'; +UPDATE profile_education_enum +SET abbreviation = '', name = 'Cardiff University', country = 'GB' +WHERE name = 'Univ Cardiff'; + +UPDATE profile_education_enum +SET abbreviation = 'UNSW', name = 'The University of New South Wales', country = 'AU' +WHERE name = 'Univ New South Wales (Sydney Australia)'; + +UPDATE profile_education_enum +SET abbreviation = 'THU', name = 'Tsinghua University', country = 'CN' +WHERE name = 'Univ Tsinghua'; + +UPDATE profile_education_enum +SET abbreviation = 'NUS', name = 'National University of Singapore', country = 'SG' +WHERE name = 'National University of Singapore'; + +UPDATE profile_education_enum +SET abbreviation = 'NTNU', name = 'Norwegian University of Science and Technology', country = 'NO', url = 'http://www.ntnu.no/' +WHERE name = 'Univ Trondheim'; + +UPDATE profile_education_enum +SET abbreviation = '', country = 'GB' +WHERE name = 'University of Surrey'; +UPDATE profile_education_enum +SET abbreviation = 'OIV', country = 'FR' +WHERE name = 'Organisme International de la Vigne et du Vin'; +UPDATE profile_education_enum +SET abbreviation = 'NSU', name = 'Novosibirsk State University', url = 'http://www.nsu.ru/', country = 'RU' +WHERE name = 'Université de Novossibirsk (Новосибирский Государственный Университет)'; + +-- Cleans duplicated entries +UPDATE profile_education SET eduid = 0 WHERE eduid = 70; +DELETE FROM profile_education_enum WHERE id = 70; +DELETE FROM profile_education_degree WHERE eduid = 70; + +UPDATE profile_education SET eduid = 91 WHERE eduid = 106; +DELETE FROM profile_education_enum WHERE id = 106; +DELETE FROM profile_education_degree WHERE eduid = 106; + +-- Adds new universities needed for the AX directory +INSERT INTO profile_education_enum (name, url, country, abbreviation) + VALUES ('Institut Supérieur de l\'Aéronautique et de l\'Espace', 'http://www.isae.fr/', 'FR', 'ISAE'), + ('Institut des Hautes Études de Défense Nationale', 'http://www.ihedn.fr/', 'FR', 'IHEDN'), + ('École du Personnel Navigant d\'Essais et de Réception', + 'http://www.defense.gouv.fr/dga/archives/l_epner_ecole_du_personnel_navigant_d_essais_et_de_reception', 'FR', 'EPNER'), + ('Agrocampus Ouest', 'http://www.agrocampus-ouest.fr/', 'FR', 'ENSAR'), + ('Montpellier SupAgro', 'http://www.supagro.fr/', 'fr', ''), + ('Institut Supérieur des Matériaux et de la Construction Mécanique Saint-Ouen', 'http://www.cefi.org/BOUCHON/BS/ISMCM_Saint-Ouen.htm', + 'FR', 'ISMCM Saint-Ouen'), + ('École Centrale d\'Électronique ', 'http://www.ece.fr/', 'FR', 'ECE'), + ('École Nationale de l\'Aviation Civile', 'http://www.enac.fr/', 'FR', 'ENAC'), + ('Centre des Hautes Études de la Construction', 'http://www.chec.fr/', 'FR', 'CHEC'), + ('École de l\'Air', 'http://www.ecole-air.air.defense.gouv.fr/index.php?option=com_content&task=view&id=203&Itemid=251', 'FR', ''), + ('Institut Supérieur des Affaires', '', 'FR', 'ISA'), + ('École Supérieure de Gestion de Paris', 'http://www.esg.fr/', 'FR', 'ESG Paris'), + ('Institut des Hautes Études Européennes', 'http://www-ihee.u-strasbg.fr/', 'FR', 'IHEE'), + ('École Nationale de la Magistrature', 'http://www.enm.justice.fr/', 'FR', 'ENM'), + ('Institut de Formation Supérieure BioMédicale', 'http://www.igr.fr/ifsbm/', 'FR', 'IFSBM'), + ('Institut Supérieur de l\'AgroAlimentaire', 'http://www.isaa.fr/', 'FR', 'ISAA'), + ('École des Mines d\'Alès', 'http://www.ema.fr/', 'FR', 'EMA'), + ('Syracuse University', 'http://www.syr.edu/', 'US', 'SU'), + ('Dartmouth College', 'http://www.dartmouth.edu/', 'US', ''), + ('International Teachers Programme', 'http://www.itp-schools.org/', '', 'ITP'), + ('University of Kentucky', 'http://www.uky.edu/', 'US', 'UK'), + ('Marine Corps University', 'http://www.mcu.usmc.mil/', 'US', 'MCU'), + ('Chartered Institute of Management Accountants', 'http://www.cimaglobal.com/', 'GB', 'CIMA'), + ('University College London', 'http://www.ucl.ac.uk/', 'GB', 'UCL'), + ('Chartered Financial Analyst Institute', 'http://www.cfainstitute.org/', 'US', 'CFA Institute'), + ('Naval Postgraduate School', 'http://www.nps.edu/', 'US', 'NPS'), + ('Royal College of Art', 'http://www.rca.ac.uk/', 'GB', 'RCA'), + ('Uniwersytet Gdański', 'http://www.univ.gda.pl/', 'PL', ''), + ('College of Europe', 'http://www.coleurope.eu/', '', ''), + ('Purdue University', 'http://www.purdue.edu/', 'US', ''), + ('Queen\'s University', 'http://www.queensu.ca/', 'CA', 'Queen\'s'), + ('Université de Bretagne Occidentale', 'http://www.univ-brest.fr/', 'FR', 'UBO'), + ('University of California, Davis', 'http://www.ucdavis.edu/', 'US', 'UC Davis'), + ('Universität Stuttgarti', 'http://www.uni-stuttgart.de/', 'DE', ''), + ('Universitatea Politehnica din Bucureşti', 'http://www.pub.ro/', 'RO', 'Politehnica din Bucureşti'), + ('University of Birmingham', 'http://www.bham.ac.uk/', 'GB', ''), + ('University of Pennsylvania', 'http://www.upenn.edu/', 'US', ''), + ('University of Rome', '', 'IT', ''), + ('University of Sheffield', 'http://www.shef.ac.uk/', 'GB', ''), + ('University of Utah', 'http://www.utah.edu/', 'US', ''), + ('University of Washington', 'http://www.washington.edu/', 'US', ''), + ('Urbana University', 'http://www.urbana.edu/', 'US', ''), + ('Université de Technologie de Compiègne', 'http://www.utc.fr/', 'FR', 'UTC'), + ('Virginia Polytechnic Institute and State University', 'http://www.vt.edu/', 'US', 'Virginia Tech'), + ('Université Claude Bernard (Lyon I)', 'http://www.univ-lyon1.fr/', 'FR', 'Université Claude Bernard'), + ('Cleveland State University', 'http://www.csuohio.edu/', 'US', 'CSU'), + ('Centre de Perfectionnement aux Affaires du Nord', '', 'FR', 'CPA du Nord'), + ('Centre de Perfectionnement aux Affaires de Lyon', '', '', 'CPA de Lyon'), + ('Amherst College', 'http://www.amherst.edu/', 'US', ''), + ('Ottawa University', 'http://www.ottawa.edu/', 'US', 'OU'), + ('Indiana University', 'http://www.indiana.edu/', 'US', ''), + ('University of Notre Dame du Lac', 'http://www.nd.edu/', 'US', 'Notre Dame'), + ('University of Maryland, College Park ', 'http://www.umd.edu/', 'US', 'UMCP'), + ('Vanderbilt University', 'http://www.vanderbilt.edu/', 'US', ''), + ('Institut National Polytechnique de Toulouse', 'http://www.inp-toulouse.fr/', 'FR', 'INP Toulouse'), + ('University of Houston', 'http://www.uh.edu/', 'US', 'UH'), + ('École Spéciale des Travaux Publics, du Bâtiment et de l\'Industrie', 'http://www.estp.fr/', 'FR', 'ESTP'), + ('Université Jean-Moulin (Lyon-III)', 'http://www.univ-lyon3.fr/', 'FR', 'Université Jean-Moulin'), + ('École Nationale Supérieure d\'Ingénieurs Électriciens de Grenoble', 'http://ense3.grenoble-inp.fr/', 'FR', 'ENSIEG'), + ('École Nationale Supérieure d\'Hydraulique et de Mécanique de Grenoble', 'http://ense3.grenoble-inp.fr/', 'FR', 'ENSHMG'), + ('Université de Rennes 1', 'http://www.univ-rennes1.fr/', 'FR', ''), + ('École Centrale Paris', 'http://www.ecp.fr/', 'FR', 'Centrale Paris'), + ('University of Dallas', 'http://www.udallas.edu/', 'US', ''), + ('Pontifical Catholic University of Chile', 'http://www.uc.cl/', 'CL', 'PUC'), + ('Universitat Oberta de Catalunya', 'http://www.uoc.edu/web/eng/', 'ES', 'UOC'), + ('University of California, Irvine', 'http://www.uci.edu/', 'US', 'UCI'), + ('Association Francophone de Management de Projet', 'http://www.afitep.fr/', 'FR', 'AFITEP'), + ('Centre Européen d\'Éducation Permanente', 'http://www.cedep.fr/', 'FR', 'CEDEP'), + ('Collège Interarmées de Défense', 'http://www.college.interarmees.defense.gouv.fr/', 'FR', ''), + ('Centre de Formation des Journalistes', 'http://www.cfpj.com/', 'FR', 'CFJ'), + ('Institut National des Hautes Études de Sécurité', 'http://www.inhes.interieur.gouv.fr/', 'FR', 'INHES'), + ('Université d\'Orléans', 'http://www.univ-orleans.fr/', 'FR', ''); + + +-- Médecine is not a university but an educational field +REPLACE INTO profile_education (uid, id, fieldid, eduid, degreeid) + SELECT e.uid, e.id, f.id, 0, d.id + FROM profile_education AS e + INNER JOIN profile_education_enum AS l ON (l.id = e.eduid) + INNER JOIN profile_education_degree_enum AS d ON (d.degree = "Doctorat") + INNER JOIN profile_education_field_enum AS f ON (f.field = "Médecine") + WHERE l.name = "Médecine"; + +DELETE FROM profile_education_enum + WHERE name = "Médecine"; + +# vim:set syntax=mysql: + diff --git a/upgrade/newdirectory-0.0.1/10_promotion.sql b/upgrade/newdirectory-0.0.1/10_promotion.sql new file mode 100644 index 0000000..de629b4 --- /dev/null +++ b/upgrade/newdirectory-0.0.1/10_promotion.sql @@ -0,0 +1,12 @@ +INSERT INTO profile_education (id, uid, grad_year, entry_year, eduid, degreeid, flags) + SELECT 100, u.user_id, u.promo_sortie, u.promo, e.id, d.id, 'primary' + FROM auth_user_md5 AS u + LEFT JOIN profile_education_enum AS e ON (e.abbreviation = "X") + LEFT JOIN profile_education_degree_enum AS d ON (d.degree = "Ingénieur"); + + UPDATE profile_display AS d +INNER JOIN profile_education AS e ON (d.pid = e.uid) + SET d.promo = CONCAT("X", entry_year) + WHERE FIND_IN_SET('primary', e.flags); + +-- vim:set syntax=mysql: diff --git a/upgrade/newdirectory-0.0.1/11_jobs.sql b/upgrade/newdirectory-0.0.1/11_jobs.sql new file mode 100644 index 0000000..b10dbc6 --- /dev/null +++ b/upgrade/newdirectory-0.0.1/11_jobs.sql @@ -0,0 +1,48 @@ +DROP TABLE IF EXISTS profile_job_enum; + +CREATE TABLE IF NOT EXISTS profile_job_enum ( + id INT(6) UNSIGNED NOT NULL AUTO_INCREMENT, + name VARCHAR(255) NOT NULL DEFAULT '', + acronym VARCHAR(255) NOT NULL DEFAULT '', + url VARCHAR(255) NOT NULL DEFAULT '', + email VARCHAR(255) NOT NULL DEFAULT '', + holdingid INT(6) UNSIGNED DEFAULT NULL, + NAF_code CHAR(5) NOT NULL DEFAULT '', + AX_code BIGINT(10) UNSIGNED NOT NULL, + PRIMARY KEY (id), + UNIQUE KEY (name) +) CHARSET=utf8; + +DROP TABLE IF EXISTS profile_job; + +CREATE TABLE IF NOT EXISTS profile_job ( + id TINYINT(1) UNSIGNED NOT NULL, + uid INT(11) NOT NULL DEFAULT 0, + jobid INT(6) UNSIGNED NOT NULL DEFAULT 0, + sectorid TINYINT(2) UNSIGNED NOT NULL DEFAULT 0, + subsectorid TINYINT(3) UNSIGNED NOT NULL DEFAULT 0, + subsubsectorid SMALLINT(3) UNSIGNED NOT NULL DEFAULT 0, + description VARCHAR(255) NOT NULL DEFAULT '', + url VARCHAR(255) NOT NULL DEFAULT '', + email VARCHAR(255) NOT NULL DEFAULT '', + pub ENUM('private', 'ax', 'public') DEFAULT 'private', + email_pub ENUM('private', 'ax', 'public') DEFAULT 'private', + PRIMARY KEY (uid, id), + INDEX uid (uid) +) CHARSET=utf8; + +INSERT IGNORE INTO profile_job_enum (name, url) + SELECT entreprise, web + FROM entreprises; + +INSERT INTO profile_job (id, uid, jobid, email, pub, email_pub, description) + SELECT e.entrid, e.uid, j.id, e.email, e.pub, e.email_pub, + CONCAT_WS(', ', IF(e.poste = '', NULL, e.poste), IF(e.fonction = 0, NULL, f.fonction_fr), + IF(e.ss_secteur IS NULL , IF(e.secteur IS NULL, NULL, s.label), ss.label)) + FROM entreprises AS e + INNER JOIN profile_job_enum AS j ON (e.entreprise = j.name) + LEFT JOIN fonctions_def AS f ON (f.id = e.fonction) + LEFT JOIN emploi_ss_secteur AS ss ON (ss.id = e.ss_secteur) + LEFT JOIN emploi_secteur AS s ON (s.id = e.secteur); + +-- vim:set syntax=mysql: diff --git a/upgrade/newdirectory-0.0.1/12_secteurs.sql b/upgrade/newdirectory-0.0.1/12_secteurs.sql new file mode 100644 index 0000000..799870c --- /dev/null +++ b/upgrade/newdirectory-0.0.1/12_secteurs.sql @@ -0,0 +1,44 @@ +DROP TABLE IF EXISTS profile_job_sector_enum; + +CREATE TABLE IF NOT EXISTS profile_job_sector_enum ( + id TINYINT(2) UNSIGNED NOT NULL AUTO_INCREMENT, + name VARCHAR(256) NOT NULL DEFAULT '', + PRIMARY KEY(id), + UNIQUE KEY(name) +) CHARSET=utf8; + +DROP TABLE IF EXISTS profile_job_subsector_enum; + +CREATE TABLE IF NOT EXISTS profile_job_subsector_enum ( + id TINYINT(3) UNSIGNED NOT NULL AUTO_INCREMENT, + sectorid TINYINT(2) UNSIGNED NOT NULL, + flags SET('optgroup') DEFAULT '' NOT NULL, + name VARCHAR(256) NOT NULL DEFAULT '', + PRIMARY KEY(id) +) CHARSET=utf8; + +DROP TABLE IF EXISTS profile_job_subsubsector_enum; + +CREATE TABLE IF NOT EXISTS profile_job_subsubsector_enum ( + id SMALLINT(3) UNSIGNED NOT NULL AUTO_INCREMENT, + sectorid TINYINT(2) UNSIGNED NOT NULL, + subsectorid TINYINT(3) UNSIGNED NOT NULL, + name VARCHAR(256) NOT NULL DEFAULT '', + flags SET('display') NOT NULL DEFAULT 'display', + PRIMARY KEY(id) +) CHARSET=utf8; + +DROP TABLE IF EXISTS profile_job_alternates; + +CREATE TABLE IF NOT EXISTS profile_job_alternates ( + id TINYINT(2) UNSIGNED NOT NULL DEFAULT 0, + subsubsectorid SMALLINT(3) UNSIGNED NOT NULL, + name VARCHAR(256) NOT NULL DEFAULT '', + PRIMARY KEY(id, subsubsectorid), + UNIQUE KEY(name) +) CHARSET=utf8; + + +ALTER TABLE profile_phones CHANGE COLUMN link_type link_type ENUM('address','pro','user', 'hq') NOT NULL DEFAULT 'user'; + +-- vim:set syntax=mysql: diff --git a/upgrade/newdirectory-0.0.1/13_mentoring.sql b/upgrade/newdirectory-0.0.1/13_mentoring.sql new file mode 100644 index 0000000..90987c1 --- /dev/null +++ b/upgrade/newdirectory-0.0.1/13_mentoring.sql @@ -0,0 +1,35 @@ +DROP TABLE IF EXISTS profile_mentor; +DROP TABLE IF EXISTS profile_mentor_country; +DROP TABLE IF EXISTS profile_mentor_sector; + +CREATE TABLE IF NOT EXISTS profile_mentor ( + uid INT(11) NOT NULL DEFAULT 0, + expertise TEXT NOT NULL, + PRIMARY KEY (uid), + FULLTEXT INDEX (expertise) +) CHARSET=utf8; + +INSERT INTO profile_mentor (uid, expertise) + SELECT uid, expertise + FROM mentor; + +CREATE TABLE IF NOT EXISTS profile_mentor_country ( + uid INT(11) NOT NULL DEFAULT 0, + country CHAR(2) NOT NULL DEFAULT "FR", + PRIMARY KEY (uid, country), + INDEX uid (uid) +) CHARSET=utf8; + +INSERT INTO profile_mentor_country (uid, country) + SELECT uid, pid + FROM mentor_pays; + +CREATE TABLE IF NOT EXISTS profile_mentor_sector ( + uid INT(11) NOT NULL DEFAULT 0, + sectorid TINYINT(2) UNSIGNED NOT NULL, + subsectorid TINYINT(3) UNSIGNED NOT NULL, + PRIMARY KEY (uid, sectorid, subsectorid), + INDEX uid (uid) +) CHARSET=utf8; + +-- vim:set syntax=mysql: diff --git a/upgrade/newdirectory-0.0.1/14_watchnames.sql b/upgrade/newdirectory-0.0.1/14_watchnames.sql new file mode 100644 index 0000000..04b3483 --- /dev/null +++ b/upgrade/newdirectory-0.0.1/14_watchnames.sql @@ -0,0 +1,13 @@ +ALTER TABLE watch_profile MODIFY field enum('search_names', 'nom', 'freetext', 'mobile', 'nationalite', + 'nationalite2', 'nationalite3', 'nick', 'web', 'networking', + 'edus', 'addresses', 'section', 'binets', 'medals', 'cv', + 'jobs', 'photo', 'corps'); + +UPDATE watch_profile SET field = 'search_names' WHERE field = 'nom' OR field = 'nick'; + +ALTER TABLE watch_profile MODIFY field enum('search_names', 'freetext', 'mobile', 'nationalite', + 'nationalite2', 'nationalite3', 'web', 'networking','edus', + 'addresses', 'section', 'binets', 'medals', 'cv', 'jobs', + 'photo', 'corps'); + +# vim:set syntax=mysql: diff --git a/upgrade/newdirectory-0.0.1/15_addresses.sql b/upgrade/newdirectory-0.0.1/15_addresses.sql new file mode 100644 index 0000000..2311f47 --- /dev/null +++ b/upgrade/newdirectory-0.0.1/15_addresses.sql @@ -0,0 +1,115 @@ +DROP TABLE IF EXISTS profile_addresses; + +CREATE TABLE IF NOT EXISTS profile_addresses ( + pid INT(11) DEFAULT NULL, + jobid INT(6) UNSIGNED DEFAULT NULL, + type ENUM('home','job','hq') NOT NULL DEFAULT 'home', + id TINYINT(3) UNSIGNED NOT NULL DEFAULT 0, + flags SET('current','temporary','secondary','mail','cedex') DEFAULT NULL, + accuracy TINYINT(1) UNSIGNED NOT NULL DEFAULT 0, + text TEXT NOT NULL, + postalText TEXT NOT NULL, + postalCode VARCHAR(255) DEFAULT NULL, + localityId INT(11) DEFAULT NULL, + subAdministrativeAreaId INT(11) DEFAULT NULL, + administrativeAreaId INT(11) DEFAULT NULL, + countryId CHAR(2) DEFAULT NULL, + latitude FLOAT(10,7) DEFAULT NULL, + longitude FLOAT(10,7) DEFAULT NULL, + north FLOAT(10,7) DEFAULT NULL, + south FLOAT(10,7) DEFAULT NULL, + east FLOAT(10,7) DEFAULT NULL, + west FLOAT(10,7) DEFAULT NULL, + updateTime DATETIME NOT NULL DEFAULT 0, + pub ENUM('public','ax','private') NOT NULL DEFAULT 'private', + comment VARCHAR(255) DEFAULT NULL, + PRIMARY KEY(pid, jobid, type, id), + INDEX pid (pid), + INDEX jobid (jobid), + INDEX type (type), + INDEX adrid (id), + INDEX localityId (localityId), + INDEX administrativeAreaId (administrativeAreaId), + INDEX subAdministrativeAreaId (subAdministrativeAreaId), + INDEX countryId (countryId) +) CHARSET=utf8; + +INSERT INTO profile_addresses (pid, id, postalCode, updateTime, pub, comment, latitude, longitude, countryId, + type, flags) + SELECT uid, adrid, postcode, datemaj, pub, comment, glat, glng, country, + IF(FIND_IN_SET('pro', 'statut'), 'job', 'home'), + CONCAT(IF(FIND_IN_SET('res-secondaire', 'statut'), 'secondary,', ''), + IF(FIND_IN_SET('courrier', 'statut'), 'mail,', ''), + IF(FIND_IN_SET('active', 'statut'), 'current,', ''), + IF(FIND_IN_SET('temporaire', 'statut'), 'temporary', '')) + FROM adresses; + +CREATE TABLE IF NOT EXISTS geoloc_countries ( + iso_3166_1_a2 CHAR(2) NOT NULL, + iso_3166_1_a3 CHAR(3) NOT NULL, + iso_3166_1_num SMALLINT(3) UNSIGNED NOT NULL, + worldRegion CHAR(2) DEFAULT NULL, + countryFR VARCHAR(255) NOT NULL, + country VARCHAR(255) NOT NULL, + capital VARCHAR(255) NOT NULL, + nationalityFR VARCHAR(255) DEFAULT NULL, + nationality VARCHAR(255) DEFAULT NULL, + phonePrefix SMALLINT(5) UNSIGNED DEFAULT NULL, + phoneFormat VARCHAR(255) NOT NULL, + licensePlate CHAR(4) DEFAULT NULL, + belongsTo CHAR(2) DEFAULT NULL, + PRIMARY KEY(iso_3166_1_a2), + UNIQUE KEY(iso_3166_1_a3), + UNIQUE KEY(iso_3166_1_num), + INDEX(iso_3166_1_a2), + INDEX(phonePrefix) +) CHARSET=utf8; + +UPDATE geoloc_pays + SET n3 = 450 + WHERE a2 = "MG"; + +UPDATE geoloc_pays + SET n3 = 807 + WHERE a2 = "MK"; + +INSERT INTO geoloc_countries (iso_3166_1_a2, iso_3166_1_a3, iso_3166_1_num, worldRegion, + countryFR, country, capital, nationalityFR, + phonePrefix, phoneFormat, licensePlate) + SELECT a2, a3, n3, worldrgn, pays, country, capital, nat, phoneprf, phoneformat, license_plate + FROM geoloc_pays; + +CREATE TABLE IF NOT EXISTS geoloc_administrativeareas ( + id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, + name VARCHAR(255) NOT NULL, + country CHAR(2) NOT NULL, + PRIMARY KEY(id), + UNIQUE KEY(id, name, country), + INDEX(id), + INDEX(name), + INDEX(country) +) CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS geoloc_subadministrativeareas ( + id INT(11) UNSIGNED NOT NULL AUTO_INCREMENT, + name VARCHAR(255) NOT NULL, + country CHAR(2) NOT NULL, + PRIMARY KEY(id), + UNIQUE KEY(id, name, country), + INDEX(id), + INDEX(name), + INDEX(country) +) CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS geoloc_localities ( + id BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, + name VARCHAR(255) NOT NULL, + country CHAR(2) NOT NULL, + PRIMARY KEY(id), + UNIQUE KEY(id, name, country), + INDEX(id), + INDEX(name), + INDEX(country) +) CHARSET=utf8; + +-- vim:set syntax=mysql: diff --git a/upgrade/newdirectory-0.0.1/16_countries.sql b/upgrade/newdirectory-0.0.1/16_countries.sql new file mode 100644 index 0000000..a302a0a --- /dev/null +++ b/upgrade/newdirectory-0.0.1/16_countries.sql @@ -0,0 +1,829 @@ +ALTER TABLE geoloc_countries MODIFY COLUMN phoneFormat VARCHAR(255) NOT NULL DEFAULT ""; + +DELETE FROM geoloc_countries + WHERE iso_3166_1_a2 = "TP" OR iso_3166_1_a2 = "YU"; + +INSERT INTO geoloc_countries (iso_3166_1_a2, iso_3166_1_a3, iso_3166_1_num, worldRegion, + country, countryFR, capital, nationalityFR, + licensePlate, belongsTo, phonePrefix) + VALUES ("AX", "ALA", 248, "EU", "Åland, Îles", "Åland Islands", "Mariehamn", NULL, "AX", "FI", 358), + ("GG", "GGY", 831, "EU", "Guernsey", "Guernesey", "St Peter Port", NULL, "GBG", "GB", 44), + ("GY", "GUY", 328, NULL, "Guyana", "Guyana", "Georgetown", "Guyanien", "GUY", NULL, 592), + ("HK", "HKG", 344, NULL, "Hong Kong", "Hong-Kong", "Hong-Kong", "Hongkongais", "HK", NULL, 852), + ("IM", "IMN", 833, NULL, "Isle of Man", "Île de Man", "Douglas", "Mannois", "GBM", NULL, 44), + ("JE", "JEY", 832, NULL, "Jersey", "Jersey", "Saint-Hélier", "Jersiais", "GBJ", NULL, 44), + ("MO", "MAC", 446, NULL, "Macao", "Macao", "Macao", "Macanais", "MO", NULL, 853), + ("ME", "MNE", 499, NULL, "Montenegro", "Monténégro", "Podgorica", "Monténégrin", "MNE", + NULL, 382), + ("PS", "PSE", 275, NULL, "Palestinian Territory, Occupied", "Palestiniens occupé, Territoire", + "Jérusalem", "Palestinien", "PS", NULL, 970), + ("BL", "BLM", 652, "EU", "Saint Barthélemy", "Saint-Barthélemy", "Gustavia", NULL, "F", "FR", 33), + ("MF", "MAF", 663, "EU", "Saint Martin", "Saint-Martin", "Marigot", NULL, "F", "FR", 33), + ("PM", "SPM", 666, "EU", "Saint Pierre and Miquelon", "Saint-Pierre-et-Miquelon", "Saint-Pierre", + NULL, "F", "FR", 33), + ("RS", "SRB", 688, NULL, "Serbia", "Serbie", "Belgrade", "Serbe", "SRB", NULL, 381), + ("TL", "TLS", 626, NULL, "Timor-Leste", "Timor-Leste", "Dili", "Timorais", "TL", NULL, 670); + +UPDATE geoloc_countries + SET country = "Croatia" + WHERE iso_3166_1_a2 = "HR"; + +UPDATE geoloc_countries + SET country = "Slovakia" + WHERE iso_3166_1_a2 = "SK"; + +UPDATE geoloc_countries + SET country = "Saint Helena" + WHERE iso_3166_1_a2 = "SH"; + +UPDATE geoloc_countries + SET countryFR = "Antigua-et-Barbuda" + WHERE iso_3166_1_a2 = "AG"; + +UPDATE geoloc_countries + SET countryFR = "Cameroun" + WHERE iso_3166_1_a2 = "CM"; + +UPDATE geoloc_countries + SET countryFR = "Centrafricaine, République" + WHERE iso_3166_1_a2 = "CF"; + +UPDATE geoloc_countries + SET countryFR = "Cocos (Keeling), Îles" + WHERE iso_3166_1_a2 = "CC"; + +UPDATE geoloc_countries + SET countryFR = "Égypte" + WHERE iso_3166_1_a2 = "EG"; + +UPDATE geoloc_countries + SET countryFR = "Émirats arabes unis" + WHERE iso_3166_1_a2 = "AE"; + +UPDATE geoloc_countries + SET countryFR = "Équateur" + WHERE iso_3166_1_a2 = "EC"; + +UPDATE geoloc_countries + SET countryFR = "Érythrée" + WHERE iso_3166_1_a2 = "ER"; + +UPDATE geoloc_countries + SET countryFR = "Èthiopie" + WHERE iso_3166_1_a2 = "ET"; + +UPDATE geoloc_countries + SET countryFR = "États-Unis" + WHERE iso_3166_1_a2 = "US"; + +UPDATE geoloc_countries + SET countryFR = "Géorgie du Sud et les Îles Sandwich du Sud" + WHERE iso_3166_1_a2 = "GS"; + +UPDATE geoloc_countries + SET countryFR = "Guinée-Bissau" + WHERE iso_3166_1_a2 = "GW"; + +UPDATE geoloc_countries + SET countryFR = "Heard, Île et MacDonald" + WHERE iso_3166_1_a2 = "HM"; + +UPDATE geoloc_countries + SET countryFR = "Îles mineures éloignées des États-Unis" + WHERE iso_3166_1_a2 = "UM"; + +UPDATE geoloc_countries + SET countryFR = "Îles vierges britanniques", country = "Virgin Islands, British" + WHERE iso_3166_1_a2 = "VG"; + +UPDATE geoloc_countries + SET countryFR = "Îles vierges des États-Unis", country = "Virgin Islands, US" + WHERE iso_3166_1_a2 = "VI"; + +UPDATE geoloc_countries + SET countryFR = "Iran, République islamique d'" + WHERE iso_3166_1_a2 = "IR"; + +UPDATE geoloc_countries + SET countryFR = "Lao, République démocratique populaire" + WHERE iso_3166_1_a2 = "LA"; + +UPDATE geoloc_countries + SET countryFR = "Macédoine, L'Ex-République Yougoslave" + WHERE iso_3166_1_a2 = "MK"; + +UPDATE geoloc_countries + SET countryFR = "Micronésie, États fédérés de" + WHERE iso_3166_1_a2 = "FM"; + +UPDATE geoloc_countries + SET countryFR = "Océan Indien, Territoire britannique de l'" + WHERE iso_3166_1_a2 = "IO"; + +UPDATE geoloc_countries + SET countryFR = "Russie, Fédération de" + WHERE iso_3166_1_a2 = "RU"; + +UPDATE geoloc_countries + SET countryFR = "Saint-Siège (État de la Cité du Vatican)" + WHERE iso_3166_1_a2 = "VA"; + +UPDATE geoloc_countries + SET countryFR = "Saint-Kitts-et-Nevis" + WHERE iso_3166_1_a2 = "KN"; + +UPDATE geoloc_countries + SET countryFR = "Congo, La République démocratique du" + WHERE iso_3166_1_a2 = "CD"; + +UPDATE geoloc_countries + SET countryFR = "Saint-Vincent-et-les-Grenadines" + WHERE iso_3166_1_a2 = "VC"; + +UPDATE geoloc_countries + SET countryFR = "Samoa" + WHERE iso_3166_1_a2 = "WS"; + +UPDATE geoloc_countries + SET countryFR = "Sao Tomé-et-Principe" + WHERE iso_3166_1_a2 = "ST"; + +UPDATE geoloc_countries + SET countryFR = "Svalbard et Île Jan Mayen" + WHERE iso_3166_1_a2 = "SJ"; + +UPDATE geoloc_countries + SET countryFR = "Trinité-et-Tobago" + WHERE iso_3166_1_a2 = "TT"; + +UPDATE geoloc_countries + SET countryFR = "Venezuela" + WHERE iso_3166_1_a2 = "VE"; + +UPDATE geoloc_countries + SET countryFR = "Viet Nam" + WHERE iso_3166_1_a2 = "VN"; + +UPDATE geoloc_countries + SET countryFR = "Wallis et Futuna", country = "Wallis and Futuna" + WHERE iso_3166_1_a2 = "WF"; + +UPDATE geoloc_countries + SET countryFR = "Yémen" + WHERE iso_3166_1_a2 = "YE"; + +UPDATE geoloc_countries + SET belongsTo = "FR" + WHERE iso_3166_1_a2 = "GF" OR iso_3166_1_a2 = "PF" OR iso_3166_1_a2 = "TF" + OR iso_3166_1_a2 = "GP" OR iso_3166_1_a2 = "MQ" OR iso_3166_1_a2 = "YT" + OR iso_3166_1_a2 = "NC" OR iso_3166_1_a2 = "RE"; + +UPDATE geoloc_countries + SET belongsTo = "US", nationalityFR = NULL + WHERE iso_3166_1_a2 = "UM"; + +UPDATE geoloc_countries + SET nationalityFR = "Afghan" + WHERE iso_3166_1_a2 = "AF"; + +UPDATE geoloc_countries + SET nationalityFR = "Andorran" + WHERE iso_3166_1_a2 = "AD"; + +UPDATE geoloc_countries + SET nationalityFR = NULL, belongsTo = "GB", capital = "The Valley" + WHERE iso_3166_1_a2 = "AI"; + +UPDATE geoloc_countries + SET nationalityFR = "Angolais" + WHERE iso_3166_1_a2 = "AO"; + +UPDATE geoloc_countries + SET nationalityFR = NULL + WHERE iso_3166_1_a2 = "AQ"; + +UPDATE geoloc_countries + SET nationalityFR = "Antiguais" + WHERE iso_3166_1_a2 = "AG"; + +UPDATE geoloc_countries + SET nationalityFR = NULL, belongsTo = "NL", capital = "Willemstad" + WHERE iso_3166_1_a2 = "AN"; + +UPDATE geoloc_countries + SET nationalityFR = "Saoudien", capital = "Riyad" + WHERE iso_3166_1_a2 = "SA"; + +UPDATE geoloc_countries + SET nationalityFR = "Arménien" + WHERE iso_3166_1_a2 = "AM"; + +UPDATE geoloc_countries + SET nationalityFR = "Arubais", capital = "Oranjestad" + WHERE iso_3166_1_a2 = "AW"; + +UPDATE geoloc_countries + SET nationalityFR = "Azerbaïdjanais" + WHERE iso_3166_1_a2 = "AZ"; + +UPDATE geoloc_countries + SET nationalityFR = "Bahaméen" + WHERE iso_3166_1_a2 = "BS"; + +UPDATE geoloc_countries + SET nationalityFR = "Bahreïnien" + WHERE iso_3166_1_a2 = "BH"; + +UPDATE geoloc_countries + SET nationalityFR = "Bangladais" + WHERE iso_3166_1_a2 = "BD"; + +UPDATE geoloc_countries + SET nationalityFR = "Barbadien" + WHERE iso_3166_1_a2 = "BB"; + +UPDATE geoloc_countries + SET nationalityFR = "Biélorusse", capital = "Minsk" + WHERE iso_3166_1_a2 = "BY"; + +UPDATE geoloc_countries + SET nationalityFR = "Béliziens" + WHERE iso_3166_1_a2 = "BZ"; + +UPDATE geoloc_countries + SET nationalityFR = NULL, belongsTo = "GB" + WHERE iso_3166_1_a2 = "BM"; + +UPDATE geoloc_countries + SET nationalityFR = "Bolivien" + WHERE iso_3166_1_a2 = "BO"; + +UPDATE geoloc_countries + SET nationalityFR = "Bosnien" + WHERE iso_3166_1_a2 = "BA"; + +UPDATE geoloc_countries + SET nationalityFR = NULL, belongsTo = "NO" + WHERE iso_3166_1_a2 = "BV"; + +UPDATE geoloc_countries + SET nationalityFR = "Brunéiens" + WHERE iso_3166_1_a2 = "BN"; + +UPDATE geoloc_countries + SET nationalityFR = "Burundais" + WHERE iso_3166_1_a2 = "BI"; + +UPDATE geoloc_countries + SET nationalityFR = NULL, belongsTo = "GB", capital = "George Town" + WHERE iso_3166_1_a2 = "KY"; + +UPDATE geoloc_countries + SET nationalityFR = "Cap-verdiens" + WHERE iso_3166_1_a2 = "CV"; + +UPDATE geoloc_countries + SET nationalityFR = "Centrafricain" + WHERE iso_3166_1_a2 = "CF"; + +UPDATE geoloc_countries + SET nationalityFR = NULL, belongsTo = "AU", capital = "Flying Fish Cove" + WHERE iso_3166_1_a2 = "CX"; + +UPDATE geoloc_countries + SET nationalityFR = "Chypriotes" + WHERE iso_3166_1_a2 = "CY"; + +UPDATE geoloc_countries + SET nationalityFR = NULL, belongsTo = "AU", capital = "West Island" + WHERE iso_3166_1_a2 = "CC"; + +UPDATE geoloc_countries + SET nationalityFR = "Comorien" + WHERE iso_3166_1_a2 = "KM"; + +UPDATE geoloc_countries + SET nationalityFR = "Congolais" + WHERE iso_3166_1_a2 = "CG"; + +UPDATE geoloc_countries + SET nationalityFR = "Nord-Coréens" + WHERE iso_3166_1_a2 = "CK"; + +UPDATE geoloc_countries + SET nationalityFR = "Maori des îles Cook" + WHERE iso_3166_1_a2 = "KP"; + +UPDATE geoloc_countries + SET nationalityFR = "Djibouti" + WHERE iso_3166_1_a2 = "DJ"; + +UPDATE geoloc_countries + SET nationalityFR = "Dominicain" + WHERE iso_3166_1_a2 = "DO"; + +UPDATE geoloc_countries + SET nationalityFR = "Dominiquais" + WHERE iso_3166_1_a2 = "DM"; + +UPDATE geoloc_countries + SET nationalityFR = "Salvadorien" + WHERE iso_3166_1_a2 = "SV"; + +UPDATE geoloc_countries + SET nationalityFR = "Émirien" + WHERE iso_3166_1_a2 = "AE"; + +UPDATE geoloc_countries + SET nationalityFR = "Érythréen" + WHERE iso_3166_1_a2 = "ER"; + +UPDATE geoloc_countries + SET nationalityFR = "Éthiopiens" + WHERE iso_3166_1_a2 = "ET"; + +UPDATE geoloc_countries + SET nationalityFR = NULL, belongsTo = "GB", capital = "Port Stanley" + WHERE iso_3166_1_a2 = "FK"; + +UPDATE geoloc_countries + SET nationalityFR = NULL, belongsTo = "DK" + WHERE iso_3166_1_a2 = "FO"; + +UPDATE geoloc_countries + SET nationalityFR = "Fidjiens" + WHERE iso_3166_1_a2 = "FJ"; + +UPDATE geoloc_countries + SET nationalityFR = "Gambiens" + WHERE iso_3166_1_a2 = "GM"; + +UPDATE geoloc_countries + SET nationalityFR = NULL, belongsTo = "GB", capital = "Grytviken" + WHERE iso_3166_1_a2 = "GS"; + +UPDATE geoloc_countries + SET nationalityFR = "Géorgien", capital = "Tbilissi" + WHERE iso_3166_1_a2 = "GE"; + +UPDATE geoloc_countries + SET nationalityFR = "Ghanéen" + WHERE iso_3166_1_a2 = "GH"; + +UPDATE geoloc_countries + SET nationalityFR = NULL, belongsTo = "GB" + WHERE iso_3166_1_a2 = "GI"; + +UPDATE geoloc_countries + SET nationalityFR = "Grenadien" + WHERE iso_3166_1_a2 = "GD"; + +UPDATE geoloc_countries + SET nationalityFR = NULL, belongsTo = "DK", capital = "Nuuk" + WHERE iso_3166_1_a2 = "GL"; + +UPDATE geoloc_countries + SET nationalityFR = NULL, belongsTo = "US" + WHERE iso_3166_1_a2 = "GU"; + +UPDATE geoloc_countries + SET nationalityFR = "Guatémaltèque" + WHERE iso_3166_1_a2 = "GT"; + +UPDATE geoloc_countries + SET nationalityFR = "Guinéens" + WHERE iso_3166_1_a2 = "GN"; + +UPDATE geoloc_countries + SET nationalityFR = "Bissau-Guinéens" + WHERE iso_3166_1_a2 = "GW"; + +UPDATE geoloc_countries + SET nationalityFR = "Équato-Guinéens" + WHERE iso_3166_1_a2 = "GQ"; + +UPDATE geoloc_countries + SET nationalityFR = NULL, belongsTo = "FR", capital = "Cayenne" + WHERE iso_3166_1_a2 = "GF"; + +UPDATE geoloc_countries + SET nationalityFR = NULL, belongsTo = "AU" + WHERE iso_3166_1_a2 = "HM"; + +UPDATE geoloc_countries + SET nationalityFR = "Hondurien" + WHERE iso_3166_1_a2 = "HN"; + +UPDATE geoloc_countries + SET nationalityFR = NULL, belongsTo = "GB", capital = "Road Town" + WHERE iso_3166_1_a2 = "VG"; + +UPDATE geoloc_countries + SET nationalityFR = NULL, belongsTo = "US", capital = "Charlotte Amalie" + WHERE iso_3166_1_a2 = "VI"; + +UPDATE geoloc_countries + SET nationalityFR = "Indonésien", capital = "Jakarta" + WHERE iso_3166_1_a2 = "ID"; + +UPDATE geoloc_countries + SET nationalityFR = "Irakien", capital = "Bagdad" + WHERE iso_3166_1_a2 = "IQ"; + +UPDATE geoloc_countries + SET nationalityFR = "Jordanien", capital = "Amman" + WHERE iso_3166_1_a2 = "JO"; + +UPDATE geoloc_countries + SET capital = "New Delhi" + WHERE iso_3166_1_a2 = "IN"; + +UPDATE geoloc_countries + SET capital = "Téhéran" + WHERE iso_3166_1_a2 = "IR"; + +UPDATE geoloc_countries + SET capital = "Jérusalem" + WHERE iso_3166_1_a2 = "IL"; + +UPDATE geoloc_countries + SET capital = "Tōkyō" + WHERE iso_3166_1_a2 = "JP"; + +UPDATE geoloc_countries + SET capital = "Astana" + WHERE iso_3166_1_a2 = "KZ"; + +UPDATE geoloc_countries + SET nationalityFR = "Kirghiz", capital = "Bichkek" + WHERE iso_3166_1_a2 = "KG"; + +UPDATE geoloc_countries + SET nationalityFR = "Koweïtien", capital = "Koweït" + WHERE iso_3166_1_a2 = "KW"; + +UPDATE geoloc_countries + SET nationalityFR = "Kényan" + WHERE iso_3166_1_a2 = "KE"; + +UPDATE geoloc_countries + SET nationalityFR = "Gilbertins" + WHERE iso_3166_1_a2 = "KI"; + +UPDATE geoloc_countries + SET nationalityFR = "Laotien", capital = "Vientiane" + WHERE iso_3166_1_a2 = "LA"; + +UPDATE geoloc_countries + SET nationalityFR = "Lesothans" + WHERE iso_3166_1_a2 = "LS"; + +UPDATE geoloc_countries + SET nationalityFR = "Libérien" + WHERE iso_3166_1_a2 = "LR"; + +UPDATE geoloc_countries + SET nationalityFR = "Libyen" + WHERE iso_3166_1_a2 = "LY"; + +UPDATE geoloc_countries + SET nationalityFR = "Liechtensteinois" + WHERE iso_3166_1_a2 = "LI"; + +UPDATE geoloc_countries + SET capital = "Beyrouth" + WHERE iso_3166_1_a2 = "LB"; + +UPDATE geoloc_countries + SET nationalityFR = "Malaisien", capital = "Putrajaya" + WHERE iso_3166_1_a2 = "MY"; + +UPDATE geoloc_countries + SET nationalityFR = "Malawites" + WHERE iso_3166_1_a2 = "MW"; + +UPDATE geoloc_countries + SET nationalityFR = "Maldivien", capital = "Malé" + WHERE iso_3166_1_a2 = "MV"; + +UPDATE geoloc_countries + SET nationalityFR = "Maltais" + WHERE iso_3166_1_a2 = "MT"; + +UPDATE geoloc_countries + SET nationalityFR = NULL, belongsTo = "US", capital = "Saipan" + WHERE iso_3166_1_a2 = "MP"; + +UPDATE geoloc_countries + SET nationalityFR = "Marshallais" + WHERE iso_3166_1_a2 = "MH"; + +UPDATE geoloc_countries + SET nationalityFR = "Mauricien" + WHERE iso_3166_1_a2 = "MU"; + +UPDATE geoloc_countries + SET nationalityFR = "Mauritanien" + WHERE iso_3166_1_a2 = "MR"; + +UPDATE geoloc_countries + SET nationalityFR = "Micronésien" + WHERE iso_3166_1_a2 = "FM"; + +UPDATE geoloc_countries + SET nationalityFR = "Moldave" + WHERE iso_3166_1_a2 = "MD"; + +UPDATE geoloc_countries + SET nationalityFR = "Monégasque" + WHERE iso_3166_1_a2 = "MC"; + +UPDATE geoloc_countries + SET nationalityFR = "Mongol", capital = "Oulan-Bator" + WHERE iso_3166_1_a2 = "MN"; + +UPDATE geoloc_countries + SET nationalityFR = NULL, belongsTo = "GB", capital = "Plymouth[" + WHERE iso_3166_1_a2 = "MS"; + +UPDATE geoloc_countries + SET nationalityFR = "Mozambicain" + WHERE iso_3166_1_a2 = "MZ"; + +UPDATE geoloc_countries + SET nationalityFR = "Birman", capital = "Naypyidaw" + WHERE iso_3166_1_a2 = "MM"; + +UPDATE geoloc_countries + SET capital = "Mamoudzou" + WHERE iso_3166_1_a2 = "YT"; + +UPDATE geoloc_countries + SET nationalityFR = "Namibien" + WHERE iso_3166_1_a2 = "NA"; + +UPDATE geoloc_countries + SET nationalityFR = "Nauruan" + WHERE iso_3166_1_a2 = "NR"; + +UPDATE geoloc_countries + SET nationalityFR = "Népalais", capital = "Katmandou" + WHERE iso_3166_1_a2 = "NP"; + +UPDATE geoloc_countries + SET nationalityFR = "Nicaraguayen" + WHERE iso_3166_1_a2 = "NI"; + +UPDATE geoloc_countries + SET nationalityFR = "Nigérien" + WHERE iso_3166_1_a2 = "NE"; + +UPDATE geoloc_countries + SET nationalityFR = "Nigérian" + WHERE iso_3166_1_a2 = "NG"; + +UPDATE geoloc_countries + SET nationalityFR = "Niuéen" + WHERE iso_3166_1_a2 = "NU"; + +UPDATE geoloc_countries + SET nationalityFR = NULL, belongsTo = "AU", capital = "Kingston" + WHERE iso_3166_1_a2 = "NF"; + +UPDATE geoloc_countries + SET capital = "Nouméa" + WHERE iso_3166_1_a2 = "NC"; + +UPDATE geoloc_countries + SET nationalityFR = NULL, belongsTo = "GB", capital = "Diego Garcia" + WHERE iso_3166_1_a2 = "IO"; + +UPDATE geoloc_countries + SET nationalityFR = "Omani", capital = "Mascate" + WHERE iso_3166_1_a2 = "OM"; + +UPDATE geoloc_countries + SET nationalityFR = "Ougandais" + WHERE iso_3166_1_a2 = "UG"; + +UPDATE geoloc_countries + SET nationalityFR = "Ouzbek", capital = "Tachkent" + WHERE iso_3166_1_a2 = "UZ"; + +UPDATE geoloc_countries + SET nationalityFR = "Qatari", capital = "Doha" + WHERE iso_3166_1_a2 = "QA"; + +UPDATE geoloc_countries + SET nationalityFR = "Pakistanais", capital = "Islamabad" + WHERE iso_3166_1_a2 = "PK"; + +UPDATE geoloc_countries + SET nationalityFR = "Philippins", capital = "Manille" + WHERE iso_3166_1_a2 = "PH"; + +UPDATE geoloc_countries + SET nationalityFR = NULL, belongsTo = "GB", capital = "Adamstown" + WHERE iso_3166_1_a2 = "PN"; + +UPDATE geoloc_countries + SET capital = "Papeete" + WHERE iso_3166_1_a2 = "PF"; + +UPDATE geoloc_countries + SET nationalityFR = "Palaien" + WHERE iso_3166_1_a2 = "PW"; + +UPDATE geoloc_countries + SET nationalityFR = "Panaméen" + WHERE iso_3166_1_a2 = "PA"; + +UPDATE geoloc_countries + SET nationalityFR = "Papouasien" + WHERE iso_3166_1_a2 = "PG"; + +UPDATE geoloc_countries + SET nationalityFR = "Paraguayen" + WHERE iso_3166_1_a2 = "PY"; + +UPDATE geoloc_countries + SET nationalityFR = NULL, belongsTo = "US" + WHERE iso_3166_1_a2 = "PR"; + +UPDATE geoloc_countries + SET nationalityFR = "Congolais" + WHERE iso_3166_1_a2 = "CD"; + +UPDATE geoloc_countries + SET nationalityFR = "Rwandais" + WHERE iso_3166_1_a2 = "RW"; + +UPDATE geoloc_countries + SET nationalityFR = NULL, capital = "" + WHERE iso_3166_1_a2 = "EH"; + +UPDATE geoloc_countries + SET nationalityFR = "Vatican" + WHERE iso_3166_1_a2 = "VA"; + +UPDATE geoloc_countries + SET nationalityFR = "Kititien" + WHERE iso_3166_1_a2 = "KN"; + +UPDATE geoloc_countries + SET nationalityFR = "Saint-marinois" + WHERE iso_3166_1_a2 = "SM"; + +UPDATE geoloc_countries + SET nationalityFR = "Saint-Vincentais, Grenadin" + WHERE iso_3166_1_a2 = "VC"; + +UPDATE geoloc_countries + SET nationalityFR = NULL, belongsTo = "GB", capital = "Jamestown" + WHERE iso_3166_1_a2 = "SH"; + +UPDATE geoloc_countries + SET nationalityFR = "Saint-Lucien" + WHERE iso_3166_1_a2 = "LC"; + +UPDATE geoloc_countries + SET nationalityFR = "Salomonien" + WHERE iso_3166_1_a2 = "SB"; + +UPDATE geoloc_countries + SET nationalityFR = NULL, belongsTo = "US", capital = "Fagatogo" + WHERE iso_3166_1_a2 = "AS"; + +UPDATE geoloc_countries + SET nationalityFR = "Samoan" + WHERE iso_3166_1_a2 = "WS"; + +UPDATE geoloc_countries + SET nationalityFR = "Santoméen" + WHERE iso_3166_1_a2 = "ST"; + +UPDATE geoloc_countries + SET nationalityFR = "Seychellois" + WHERE iso_3166_1_a2 = "SC"; + +UPDATE geoloc_countries + SET nationalityFR = "Sierra-Léonais" + WHERE iso_3166_1_a2 = "SL"; + +UPDATE geoloc_countries + SET capital = "Singapour" + WHERE iso_3166_1_a2 = "SG"; + +UPDATE geoloc_countries + SET nationalityFR = "Slovaques" + WHERE iso_3166_1_a2 = "SK"; + +UPDATE geoloc_countries + SET nationalityFR = "Somalien" + WHERE iso_3166_1_a2 = "SO"; + +UPDATE geoloc_countries + SET nationalityFR = "Soudanais" + WHERE iso_3166_1_a2 = "SD"; + +UPDATE geoloc_countries + SET nationalityFR = "Sri Lankais", capital = "Sri Jayawardenapura" + WHERE iso_3166_1_a2 = "LK"; + +UPDATE geoloc_countries + SET nationalityFR = "Surinamien" + WHERE iso_3166_1_a2 = "SR"; + +UPDATE geoloc_countries + SET nationalityFR = NULL, belongsTo = "NO" + WHERE iso_3166_1_a2 = "SJ"; + +UPDATE geoloc_countries + SET nationalityFR = "Swazi", capital = "Mbabane" + WHERE iso_3166_1_a2 = "SZ"; + +UPDATE geoloc_countries + SET nationalityFR = "Syrien", capital = "Damas" + WHERE iso_3166_1_a2 = "SY"; + +UPDATE geoloc_countries + SET capital = "Douchanbé" + WHERE iso_3166_1_a2 = "TJ"; + +UPDATE geoloc_countries + SET capital = "Taipei" + WHERE iso_3166_1_a2 = "TW"; + +UPDATE geoloc_countries + SET capital = "Saint-Pierre", nationalityFR = NULL, belongsTo = "FR" + WHERE iso_3166_1_a2 = "TF"; + +UPDATE geoloc_countries + SET nationalityFR = "Thaïlandais", capital = "Bangkok" + WHERE iso_3166_1_a2 = "TH"; + +UPDATE geoloc_countries + SET nationalityFR = NULL, belongsTo = "NZ" + WHERE iso_3166_1_a2 = "TK"; + +UPDATE geoloc_countries + SET nationalityFR = "Turkmène", capital = "Achgabat" + WHERE iso_3166_1_a2 = "TM"; + +UPDATE geoloc_countries + SET nationalityFR = NULL, belongsTo = "GB", capital = "Cockburn Town" + WHERE iso_3166_1_a2 = "TC"; + +UPDATE geoloc_countries + SET capital = "Ankara" + WHERE iso_3166_1_a2 = "TR"; + +UPDATE geoloc_countries + SET nationalityFR = "Tanzanien" + WHERE iso_3166_1_a2 = "TZ"; + +UPDATE geoloc_countries + SET nationalityFR = "Tchadien" + WHERE iso_3166_1_a2 = "TD"; + +UPDATE geoloc_countries + SET nationalityFR = "Togolais" + WHERE iso_3166_1_a2 = "TG"; + +UPDATE geoloc_countries + SET nationalityFR = "Tongien" + WHERE iso_3166_1_a2 = "TO"; + +UPDATE geoloc_countries + SET nationalityFR = "Trinidadien" + WHERE iso_3166_1_a2 = "TT"; + +UPDATE geoloc_countries + SET nationalityFR = "Tuvaluan" + WHERE iso_3166_1_a2 = "TV"; + +UPDATE geoloc_countries + SET capital = "Hanoi" + WHERE iso_3166_1_a2 = "VN"; + +UPDATE geoloc_countries + SET nationalityFR = "Vanuatais" + WHERE iso_3166_1_a2 = "VU"; + +UPDATE geoloc_countries + SET nationalityFR = NULL, belongsTo = "FR", capital = "Mata-Utu" + WHERE iso_3166_1_a2 = "WF"; + +UPDATE geoloc_countries + SET nationalityFR = "Yéménite", capital = "Sanaa" + WHERE iso_3166_1_a2 = "YE"; + +UPDATE geoloc_countries + SET nationalityFR = "Zambien" + WHERE iso_3166_1_a2 = "ZM"; + +UPDATE geoloc_countries + SET nationalityFR = "Zimbabwéen" + WHERE iso_3166_1_a2 = "ZW"; + +-- vim:set syntax=mysql: diff --git a/upgrade/newdirectory-0.0.1/README b/upgrade/newdirectory-0.0.1/README new file mode 100644 index 0000000..291c826 --- /dev/null +++ b/upgrade/newdirectory-0.0.1/README @@ -0,0 +1,6 @@ +Il faudra déplacer le yourself qui est mis dans profile_display dans le script 00_names.sql vers l'account. + +Le 12_secteurs.sql est à faire avant le alternate_subsubsectors.php et pour que ce dernier fonctionne, il faut que le fichier +arbo-UTF8.xml soit dans le même dossier. + +Le script addresses.php *doit* être lancé dans un screen - il prend plusieurs jours à tourner. diff --git a/upgrade/newdirectory-0.0.1/addresses.php b/upgrade/newdirectory-0.0.1/addresses.php new file mode 100755 index 0000000..0b659e6 --- /dev/null +++ b/upgrade/newdirectory-0.0.1/addresses.php @@ -0,0 +1,136 @@ +#!/usr/bin/php5 +debug = 0; // Do not store backtraces. + +$res = XDB::query('SELECT MIN(user_id), MAX(user_id) + FROM auth_user_md5'); + +$pids = $res->fetchOneRow(); + +$minPid = $pids[0]; +$maxPid = $pids[1]; + +echo "This will take a few minutes.\n". + +// Fills the 'text' field in profile_addresses. +for ($pid = $minPid; $pid < $maxPid + 1; ++$pid) { + $res = XDB::iterator("SELECT a.adrid AS id, a.adr1, a.adr2, a.adr3, + UNIX_TIMESTAMP(a.datemaj) AS datemaj, + a.postcode, a.city, a.cityid, a.region, a.regiontxt, + a.pub, a.country, gp.pays AS countrytxt, gp.display, + FIND_IN_SET('coord-checked', a.statut) AS checked, + FIND_IN_SET('res-secondaire', a.statut) AS secondaire, + FIND_IN_SET('courrier', a.statut) AS mail, + FIND_IN_SET('temporaire', a.statut) AS temporary, + FIND_IN_SET('active', a.statut) AS current, + FIND_IN_SET('pro', a.statut) AS pro, + a.glat AS precise_lat, a.glng AS precise_lon + FROM adresses AS a + INNER JOIN geoloc_pays AS gp ON(gp.a2 = a.country) + WHERE uid = {?} + ORDER BY adrid", + $pid); + + while ($address = $res->next()) { + $text = get_address_text($address); + XDB::iterator('UPDATE profile_addresses + SET text = {?} + WHERE pid = {?} AND type = {?} AND id = {?}', + $text, $pid, $address['pro'] ? 'job' : 'home', $address['id']); + } +} + +echo "Filling the 'text' filles is over. Geocoding will start now and will take a few days\n"; + +// Tries to geocode all the addresses. +for ($pid = $minPid; $pid < $maxPid + 1; ++$pid) { + $res = XDB::iterator('SELECT * + FROM profile_addresses + WHERE pid = {?}', + $pid); + + while ($address = $res->next()) { + $updateTime = $address['updateTime']; + $gmapsGeocoder = new GMapsGeocoder(); + $address = $gmapsGeocoder->getGeocodedAddress($address); + + if (!isset($address['geoloc'])) { + // TODO: use address and phone classes to update profile_job_enum and profile_phones once they are done. + + XDB::execute('DELETE FROM profile_addresses + WHERE pid = {?} AND id = {?} AND type = {?}', + $address['pid'], $address['id'], $address['type']); + + Geocoder::getAreaId($address, 'administrativeArea'); + Geocoder::getAreaId($address, 'subAdministrativeArea'); + Geocoder::getAreaId($address, 'locality'); + XDB::execute('INSERT INTO profile_addresses (pid, type, id, flags, accuracy, + text, postalText, postalCode, localityId, + subAdministrativeAreaId, administrativeAreaId, + countryId, latitude, longitude, updateTime, pub, comment, + north, south, east, west) + VALUES ({?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, + {?}, {?}, FROM_UNIXTIME({?}), {?}, {?}, {?}, {?}, {?}, {?})', + $address['pid'], $address['type'], $address['id'], $flags, $address['accuracy'], + $address['text'], $address['postalText'], $address['postalCode'], $address['localityId'], + $address['subAdministrativeAreaId'], $address['administrativeAreaId'], + $address['countryId'], $address['latitude'], $address['longitude'], + $updateTime, $address['pub'], $address['comment'], + $address['north'], $address['south'], $address['east'], $address['west']); + } else { + XDB::execute('UPDATE profile_addresses + SET postalText = {?} + WHERE pid = {?} AND id = {?} AND type = {?}', + $address['postalText'], $address['pid'], $address['id'], $address['type']); + } + + sleep(60); // So we don't get blacklisted by Google. + } +} + +echo "Geocoding is over.\n"; + +function get_address_text($adr) +{ + $t = ""; + if (isset($adr['adr1']) && $adr['adr1']) $t.= $adr['adr1']; + if (isset($adr['adr2']) && $adr['adr2']) $t.= "\n".$adr['adr2']; + if (isset($adr['adr3']) && $adr['adr3']) $t.= "\n".$adr['adr3']; + $l = ""; + if (isset($adr['display']) && $adr['display']) { + $keys = explode(' ', $adr['display']); + foreach ($keys as $key) { + if (isset($adr[$key])) { + $l .= " ".$adr[$key]; + } else { + $l .= " ".$key; + } + } + if ($l) substr($l, 1); + } elseif ($adr['country'] == 'US' || $adr['country'] == 'CA' || $adr['country'] == 'GB') { + if ($adr['city']) $l .= $adr['city'].",\n"; + if ($adr['region']) $l .= $adr['region']." "; + if ($adr['postcode']) $l .= $adr['postcode']; + } else { + if (isset($adr['postcode']) && $adr['postcode']) $l .= $adr['postcode']." "; + if (isset($adr['city']) && $adr['city']) $l .= $adr['city']; + } + if ($l) $t .= "\n".trim($l); + if ($adr['country'] != '00' && (!$adr['countrytxt'] || $adr['countrytxt'] == strtoupper($adr['countrytxt']))) { + $res = XDB::query('SELECT pays + FROM geoloc_pays + WHERE a2 = {?}', + $adr['country']); + $adr['countrytxt'] = $res->fetchOneCell(); + } + if (isset($adr['countrytxt']) && $adr['countrytxt']) { + $t .= "\n".$adr['countrytxt']; + } + return trim($t); +} + +/* vim:set et sw=4 sts=4 ts=4: */ +?> diff --git a/upgrade/newdirectory-0.0.1/alternate_subsubsectors.php b/upgrade/newdirectory-0.0.1/alternate_subsubsectors.php new file mode 100755 index 0000000..e94dadd --- /dev/null +++ b/upgrade/newdirectory-0.0.1/alternate_subsubsectors.php @@ -0,0 +1,49 @@ +#!/usr/bin/php5 +debug = 0; //do not store backtraces + +$data = implode('', file('arbo-UTF8.xml')); +$parser = xml_parser_create(); +xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0); +xml_parser_set_option($parser, XML_OPTION_SKIP_WHITE, 1); +xml_parse_into_struct($parser, $data, $values, $tags); +xml_parser_free($parser); + +// loop through the structures +foreach ($values as $val) { + if ($val['tag'] == 'grand-domaine' && $val['type'] == 'open') { + $res = XDB::execute('INSERT INTO profile_job_sector_enum (name) + VALUES ({?})', + ucfirst(mb_strtolower($val['attributes']['intitule']))); + $sectorid = XDB::insertId(); + } + if ($val['tag'] == 'domaine' && $val['type'] == 'open') { + $res = XDB::execute('INSERT INTO profile_job_subsector_enum (sectorid, name) + VALUES ({?}, {?})', + $sectorid, $val['attributes']['intitule']); + $subsectorid = XDB::insertId(); + } + if ($val['tag'] == 'domaine-intermediaire' && $val['type'] == 'open') { + $res = XDB::execute('INSERT INTO profile_job_subsector_enum (sectorid, name, flags) + VALUES ({?}, {?}, \'optgroup\')', + $sectorid, $val['attributes']['intitule']); + } + if ($val['tag'] == 'fiche' && $val['type'] == 'open') { + $res = XDB::execute('INSERT INTO profile_job_subsubsector_enum (sectorid, subsectorid, name) + VALUES ({?}, {?}, {?})', + $sectorid, $subsectorid, $val['attributes']['intitule']); + $subsubsectorid = XDB::insertId(); + $id = 0; + } + if ($val['tag'] == 'appellation' && $val['type'] == 'complete') { + $res = XDB::execute('INSERT INTO profile_job_alternates (id, subsubsectorid, name) + VALUES ({?}, {?}, {?})', + $id, $subsubsectorid, $val['attributes']['intitule']); + ++$id; + } +} + +/* vim:set et sw=4 sts=4 ts=4: */ +?> 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 120000 index 0000000..442fab7 --- /dev/null +++ b/upgrade/newdirectory-0.0.1/connect.db.inc.php @@ -0,0 +1 @@ +../../bin/connect.db.inc.php \ No newline at end of file diff --git a/upgrade/newdirectory-0.0.1/phones.php b/upgrade/newdirectory-0.0.1/phones.php new file mode 100755 index 0000000..274c407 --- /dev/null +++ b/upgrade/newdirectory-0.0.1/phones.php @@ -0,0 +1,201 @@ +#!/usr/bin/php5 +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 index 0000000..cbdc91e --- /dev/null +++ b/upgrade/newdirectory-0.0.1/update.sh @@ -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 + +########################################################### +
diff --git a/templates/profile/mentor.tpl b/templates/profile/mentor.tpl index 7e3f372..14a0a83 100644 --- a/templates/profile/mentor.tpl +++ b/templates/profile/mentor.tpl @@ -22,7 +22,7 @@

{icon name=information title="Afficher ma fiche référent"}Tu peux consulter ta fiche référent qui n'est accessible que par les X.

-{if (!$expertise)||(!($secteurs|@count))} +{if (!$expertise)||(!($sectors|@count))}

Attention : pour figurer dans la base de données des mentors, il faut remplir la dernière case en bas de cette page et avoir au moins un secteur d'activité de prédilection.
@@ -44,7 +44,7 @@

  • ou bien, plus âgés, qui souhaitent réorienter leur carrière.
  • - +
    @@ -70,7 +73,7 @@ {foreach from=$countries item=country key=i}
    {icon name=cross title="Supprimer ce pays"} + href="javascript:removeElement('countries', '{$i}')">{icon name=cross title="Supprimer ce pays"}
    {$country}
    @@ -90,12 +93,12 @@ - @@ -103,20 +106,20 @@ - diff --git a/templates/profile/skill.skill.tpl b/templates/profile/skill.skill.tpl index 4662872..12f7e23 100644 --- a/templates/profile/skill.skill.tpl +++ b/templates/profile/skill.skill.tpl @@ -23,14 +23,14 @@
    {$skill.text} -
    + - {icon name=cross title="Supprimer"} + {icon name=cross title="Supprimer"}
    {* vim:set et sw=2 sts=2 sws=2 enc=utf-8: *} diff --git a/templates/profile/skill.tpl b/templates/profile/skill.tpl index 98590c6..3fed3b0 100644 --- a/templates/profile/skill.tpl +++ b/templates/profile/skill.tpl @@ -20,7 +20,7 @@ {* *} {**************************************************************************} -
    @@ -60,8 +60,11 @@ - + + {iterate from=$countryList item=country} + + {/iterate}
    +
    Secteur
    - - {iterate from=$secteurs_sel item=secteur} - + {iterate from=$sectorList item=sector} + {/iterate}
    Sous-secteur
    - +
    - {if $secteurs|@count} - {foreach from=$secteurs item=secteur key=s} - {foreach from=$secteur item=ss_sect key=ss} -
    - +
    + {if $sectors|@count} + {foreach from=$sectors item=sector key=s} + {foreach from=$sector item=subSector key=ss} +
    + {icon name=cross title="Supprimer ce secteur"} - - {$ss_sect} + + {$subSector}
    {/foreach} {/foreach} diff --git a/templates/geoloc/admin_dynamap.tpl b/templates/profile/name_info.tpl similarity index 59% rename from templates/geoloc/admin_dynamap.tpl rename to templates/profile/name_info.tpl index 490acd9..148f3b6 100644 --- a/templates/geoloc/admin_dynamap.tpl +++ b/templates/profile/name_info.tpl @@ -20,45 +20,38 @@ {* *} {**************************************************************************} -

    - Administration de la dynamap -

    +

    Les différents types de noms

    + + + + + + + + + {iterate from=$types item=type} + + + + + + + {/iterate} +
    TypeDescriptionConfidentialité ¹Prise en compte de la particule ²
    {$type.name}{$type.explanations} + {if $type.public} + {icon name="flag_green" title="site public"} + {else} + {icon name="flag_red" title="site privé"} + {/if} + {if $type.has_particle}Oui{else}Non{/if}
    + +

    Légende :

    +
      +
    • ¹ {icon name="flag_green" title="site public"} signifie que les données sont visibles + sur la partie publique du site alors que {icon name="flag_red" title="site privé"} indique + qu'elles sont cantonnées au site privé.
    • +
    • ² Pour les types concernés, il faut cocher la case en bout de ligne si le nom débute + par une particule, comme cela tu seras correctement classé dans l'ordre alphabétique.
    • +
    -

    - Utiliser de nouvelles cartes -

    -
    -

    - -
    - -

    -
    - -

    - Placement des villes sur les cartes -

    -{if $nb_cities_not_on_map} -

    - Il y a {$nb_cities_not_on_map} villes qui ne sont pas placées dans les cartes. - [Réparer] -

    -{else} -

    Toutes les villes de la base sont placées dans des cartes.

    -{/if} -{if $no_smallest} -

    - Il faut définir la plus petite carte - pour chaque ville (à ne faire qu'une fois quand on a placé toutes les villes). -

    -{/if} -{if $no_coordinates} -

    - Placement précis des adresses -

    -

    - {$no_coordinates} adresses n'ont pas été bien reconnues précisément. - [Mettre les coordonnées du centre de la ville] -

    -{/if} {* vim:set et sw=2 sts=2 sws=2 enc=utf-8: *} diff --git a/templates/profile/nomusage.tpl b/templates/profile/nomusage.tpl deleted file mode 100644 index 87f0a32..0000000 --- a/templates/profile/nomusage.tpl +++ /dev/null @@ -1,131 +0,0 @@ -{**************************************************************************} -{* *} -{* Copyright (C) 2003-2009 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 *} -{* *} -{**************************************************************************} - -

    Nom d'usage

    - -{if $same} -

    - Tu peux soit refaire une demande de nom d'usage, soit retourner à l'édition de ton profil. -

    -{else} - {if $myusage} - {if $usage_old} -

    - Ta demande de suppression de ton nom d'usage ainsi que de tes - alias {$alias_old}@{#globals.mail.domain#} et - {$alias_old}@{#globals.mail.domain2#} a bien été enregistrée. -

    - {/if} - - {if $myusage->alias} -

    - Ta demande d'ajout de ton nom d'usage a bien été enregistrée. Sa - validation engendrera la création des alias - {$myusage->alias}@{#globals.mail.domain#} et - {$myusage->alias}@{#globals.mail.domain2#}. -

    - {/if} - -

    - Tu recevras un email dès que les changements demandés auront été effectués. - Encore merci de nous faire confiance pour tes emails ! -

    - - {else} - -

    -Le nom d'usage est un patronyme qui doit être reconnu par la - loi (nom du conjoint, d'un de ses parents, ou bien plus -exceptionnellement sur changement de l'état civil…). -

    - -

    -Les surnoms sont systématiquement refusés. Pour -utiliser une adresse personnalisée, il faut se tourner vers -l'alias @{#globals.mail.alias_dom#}. -

    - -

    - Afin d'être joignable à la fois sous ton nom à l'X et sous ton nom d'usage, tu peux - saisir ici ce dernier. Il apparaîtra alors dans l'annuaire et tu disposeras - des adresses correspondantes @{#globals.mail.domain#} et @{#globals.mail.domain2#}, en plus de - celles que tu possèdes déjà. -

    - -
    - -{literal} -
    -{/literal} - {xsrf_token_field} - - - - - - - - - - - - - - - - -
    Nom d'usage
    - - -
    Raison du changement de nom
    -
    - {if $usage_old} -
    - {/if} -
    -
    - -
    - {if !$usage_old} - - {else} - - - {/if} -
    -
    - {/if} -{/if} - - -{* vim:set et sw=2 sts=2 sws=2 enc=utf-8: *} diff --git a/templates/profile/orange.tpl b/templates/profile/orange.tpl index 08a62db..df9aea4 100644 --- a/templates/profile/orange.tpl +++ b/templates/profile/orange.tpl @@ -32,10 +32,10 @@ {else}

    - Afin de pouvoir être considéré(e) à la fois dans ta promotion d'origine et ta + Afin de pouvoir être considéré{if $sexe}e{/if} à la fois dans ta promotion d'origine et ta ou tes promotions d'adoption tu peux entrer ici ton année de sortie de l'École. Plus précisément, il s'agit de l'année d'entrée en quatrième année ou année d'application. - Pour tes cocons d'origine (X{$promo}) il s'agit de l'année {math equation="a + b" a=$promo b=3}. + Pour tes cocons d'origine ({$promo}) il s'agit de l'année {math equation="a + b" a=$promo b=3}.


    diff --git a/templates/geoloc/init.tpl b/templates/profile/phone.tpl similarity index 52% rename from templates/geoloc/init.tpl rename to templates/profile/phone.tpl index 9fdda87..e12cec4 100644 --- a/templates/geoloc/init.tpl +++ b/templates/profile/phone.tpl @@ -19,41 +19,33 @@ {* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *} {* *} {**************************************************************************} - - - - - - - - - - + +{assign var=telpref value="`$prefname`[`$telid`]"} +{assign var=id value="`$prefid`_`$telid`"} +
    N°{$telid+1}
    + +
    + {include file="include/flags.radio.tpl" name="`$telpref`[pub]" val=$tel.pub} +
    + {* vim:set et sw=2 sts=2 sws=2 enc=utf-8: *} diff --git a/templates/profile/profile.tpl b/templates/profile/profile.tpl index 988bb9b..b95e2ae 100644 --- a/templates/profile/profile.tpl +++ b/templates/profile/profile.tpl @@ -50,6 +50,20 @@ function chgMainWinLoc(strPage) {if $x.gpxs_join}
    Groupe{if count($x.gpxs) > 1}s{/if} et institution{if count($x.gpxs) > 1}s{/if} X :
    {$x.gpxs_join|smarty:nodefaults}
    {/if} {/if} + {if $x.networking} +

    Sur le web...

    + {foreach from=$x.networking item=network} + {$network.name} + {if $network.filter == 'web'} + {$network.address} + {elseif $network.link != ''} + {$network.address} + {else} + {$network.address} + {/if} +
    + {/foreach} + {/if} {if $x.freetext}

    Commentaires :

    {$x.freetext|miniwiki|smarty:nodefaults} @@ -58,11 +72,10 @@ function chgMainWinLoc(strPage)
    {if $user->isFemale()}•{/if} - {$user->fullName()}{if $x.nom_usage neq ""} ({$x.nom}){/if} + {$x.name_display} {if $logged} {if $x.nickname} (alias {$x.nickname}){/if} {/if} - {if $x.web} {icon name="world_go" title="Site Web"}{/if} {if $logged}  {if !$x.dcd}{* *}{icon name=vcard title="Afficher la carte de visite"}{/if} @@ -88,7 +101,7 @@ function chgMainWinLoc(strPage) le {$x.date|date_format}
    {/if} - {if $logged || $x.mobile} + {if $logged || $x.tels}
    {if $logged} {/if} - {if $x.mobile} -
    - {if $x.dcd}Dernier m{else}M{/if}obile : {$x.mobile} -
    + {if $x.tels} + {display_phones tels=$x.tels dcd=$x.dcd} {/if}
    {/if}
    - {if $x.iso3166} - {$x.nationalite}  + {if $x.iso3166_1} + {$x.nationalite}  {/if} - X {$user->promo()} - {if $x.promo_sortie && ($x.promo_sortie-3 > $x.promo)} - - X {math equation="a-b" a=$x.promo_sortie b=3} + {if $x.iso3166_2} + {$x.nationalite2}  {/if} - {if $x.applis_join} -  - Formation : {$x.applis_join|smarty:nodefaults} + {if $x.iso3166_3} + {$x.nationalite3}  {/if} + {$user->promo()} {if $logged && $x.is_referent} - [Ma fiche référent] + [Ma fiche référent] + {/if} + {if $x.education} +  - Formation : +
      + {foreach from=$x.education item="edu"} +
    • {$edu|smarty:nodefaults}
    • + {/foreach} +
    + {/if} + {if $x.corps} + {$x.corps|smarty:nodefaults} {/if}
    diff --git a/templates/profile/referent.tpl b/templates/profile/referent.tpl index 90f5afb..01e3d30 100644 --- a/templates/profile/referent.tpl +++ b/templates/profile/referent.tpl @@ -40,22 +40,22 @@ var baseurl = platal_baseurl + "referent/"; {literal} var Ajax2 = new AjaxEngine(); -function setSecteur(secteur) +function setSector(sector) { - if (secteur == '') { + if (sector == '') { document.getElementById('scat').style.display = 'none'; document.getElementById('country').style.display = 'none'; document.getElementById('keywords').style.display = 'none'; } else { - Ajax.update_html('ssect_chg', baseurl + 'ssect/' + secteur); - Ajax2.update_html('country_chg', baseurl + 'country/' + secteur); + Ajax.update_html('ssect_chg', baseurl + 'ssect/' + sector); + Ajax2.update_html('country_chg', baseurl + 'country/' + sector); document.getElementById('scat').style.display = ''; document.getElementById('country').style.display = ''; document.getElementById('keywords').style.display = ''; } } -function setSSecteurs() +function setSubSectors() { var sect = document.getElementById('sect_field').value; var ssect = document.getElementById('ssect_field').value; @@ -72,8 +72,8 @@ function setSSecteurs() Secteur de compétence
    du référent
    - + {html_options options=$sectors selected=$sectorSelection}
    +
    @@ -33,7 +33,7 @@
    Domaine : - {assign var=ingroup value=false} {iterate from=$comp_list item=comp} @@ -60,7 +60,7 @@
    - +
    - + - - - - - - - - @@ -325,8 +307,8 @@ checked="checked"{/if}/>Chercher uniquement les adresses où les camarades sont - - + + @@ -405,6 +387,29 @@ checked="checked"{/if}/>Chercher uniquement les adresses où les camarades sont + + + + + + + + {if $smarty.session.auth ge AUTH_COOKIE} + - + +
    @@ -73,7 +73,7 @@
    Domaine : - {iterate from=$lang_list item=lang} diff --git a/templates/search/adv.form.tpl b/templates/search/adv.form.tpl index cd84941..3720f97 100644 --- a/templates/search/adv.form.tpl +++ b/templates/search/adv.form.tpl @@ -75,19 +75,13 @@ 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 @@ -184,23 +178,11 @@
    NomNom, prénom, surnom... - -
    Prénom - -
    Surnom - +
    PosteDescription
    SecteurCommentaire contient
    Numéro de téléphone
    + Networking et sites webs + + + + + + +
    + + + + + {icon name="table" title="Tous les types d'adresse"} +
    +
    diff --git a/templates/search/adv.grade.form.tpl b/templates/search/adv.grade.form.tpl index d4492af..8973524 100644 --- a/templates/search/adv.grade.form.tpl +++ b/templates/search/adv.grade.form.tpl @@ -23,8 +23,10 @@ diff --git a/templates/skin/common.menu.tpl b/templates/skin/common.menu.tpl index afdb681..a68c154 100644 --- a/templates/skin/common.menu.tpl +++ b/templates/skin/common.menu.tpl @@ -65,7 +65,6 @@ - diff --git a/templates/survey/index.tpl b/templates/survey/index.tpl index c248d92..1240f46 100644 --- a/templates/survey/index.tpl +++ b/templates/survey/index.tpl @@ -41,12 +41,12 @@ {assign var="has_cs" value="true"} {/if} {/iterate} -
    {if !$has_cs}Aucun sondage en cours{/if} {if $smarty.session.auth}{icon name=page_edit} Proposer un sondage{/if} -

    diff --git a/templates/survey/show_root.tpl b/templates/survey/show_root.tpl index cf22562..e20ed25 100644 --- a/templates/survey/show_root.tpl +++ b/templates/survey/show_root.tpl @@ -37,9 +37,9 @@
    Type de sondage : {$survey_modes[$survey.mode]}
    Promotions :Promotions : {if $survey.promos eq "#"} erreur @@ -93,7 +93,7 @@

    {if $survey_editmode} - {icon name=tick} + {icon name=tick} {if $survey_updatemode}Enregistrer les modifications{else}Proposer ce sondage{/if} | diff --git a/templates/xnetgrp/annuaire.tpl b/templates/xnetgrp/annuaire.tpl index ec51d81..1e90754 100644 --- a/templates/xnetgrp/annuaire.tpl +++ b/templates/xnetgrp/annuaire.tpl @@ -129,7 +129,7 @@ Le groupe {$asso.nom} compte {$nb_tot} membres :

    - {icon name=user_edit title="Edition du profil"} + {icon name=user_edit title="Édition du profil"} {icon name=delete title="Supprimer de l'annuaire"}