New evolutive marketing engine
[platal.git] / modules / carnet.php
CommitLineData
0337d704 1<?php
2/***************************************************************************
5ddeb07c 3 * Copyright (C) 2003-2007 Polytechnique.org *
0337d704 4 * http://opensource.polytechnique.org/ *
5 * *
6 * This program is free software; you can redistribute it and/or modify *
7 * it under the terms of the GNU General Public License as published by *
8 * the Free Software Foundation; either version 2 of the License, or *
9 * (at your option) any later version. *
10 * *
11 * This program is distributed in the hope that it will be useful, *
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14 * GNU General Public License for more details. *
15 * *
16 * You should have received a copy of the GNU General Public License *
17 * along with this program; if not, write to the Free Software *
18 * Foundation, Inc., *
19 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *
20 ***************************************************************************/
21
c9f82d49 22class CarnetModule extends PLModule
23{
24 function handlers()
25 {
26 return array(
5e193297 27 'carnet' => $this->make_hook('index', AUTH_COOKIE),
28 'carnet/panel' => $this->make_hook('panel', AUTH_COOKIE),
29 'carnet/notifs' => $this->make_hook('notifs', AUTH_COOKIE),
fc12cbd1 30
5e193297 31 'carnet/contacts' => $this->make_hook('contacts', AUTH_COOKIE),
32 'carnet/contacts/pdf' => $this->make_hook('pdf', AUTH_COOKIE),
963c0b2e 33 'carnet/contacts/ical' => $this->make_hook('ical', AUTH_PUBLIC),
5e193297 34 'carnet/contacts/vcard' => $this->make_hook('vcard', AUTH_COOKIE),
b48a0758 35
5e193297 36 'carnet/rss' => $this->make_hook('rss', AUTH_PUBLIC),
c9f82d49 37 );
38 }
0337d704 39
8d8f7607 40 function on_subscribe($forlife, $uid, $promo, $password)
41 {
42 require_once 'notifs.inc.php';
43 register_watch_op($uid, WATCH_INSCR);
44 inscription_notifs_base($uid);
45 }
46
fc12cbd1 47 function _add_rss_link(&$page)
48 {
cab08090 49 if (!S::has('core_rss_hash')) {
fc12cbd1 50 return;
fd8f77de 51 }
162370e7 52 $page->setRssLink('Polytechnique.org :: Carnet',
53 '/carnet/rss/'.S::v('forlife') .'/'.S::v('core_rss_hash').'/rss.xml');
fc12cbd1 54 }
55
b48a0758 56 function handler_index(&$page)
57 {
58 $page->changeTpl('carnet/index.tpl');
59 $page->assign('xorg_title','Polytechnique.org - Mon carnet');
60 $this->_add_rss_link($page);
b48a0758 61 }
62
fc12cbd1 63 function handler_panel(&$page)
64 {
65 $page->changeTpl('carnet/panel.tpl');
66
67 if (Get::has('read')) {
5e2307dc 68 $_SESSION['watch_last'] = Get::v('read');
8b00e0e0 69 pl_redirect('carnet/panel');
fc12cbd1 70 }
71
72 require_once 'notifs.inc.php';
73
74 $page->assign('now',date('YmdHis'));
cab08090 75 $notifs = new Notifs(S::v('uid'), true);
fc12cbd1 76
77 $page->assign('notifs', $notifs);
78 $page->assign('today', date('Y-m-d'));
79 $this->_add_rss_link($page);
fc12cbd1 80 }
81
b48a0758 82 function _handler_notifs_promos(&$page, &$watch, $action, $arg)
83 {
84 if(preg_match('!^ *(\d{4}) *$!', $arg, $matches)) {
85 $p = intval($matches[1]);
86 if($p<1900 || $p>2100) {
a7de4ef7 87 $page->trig("la promo entrée est invalide");
b48a0758 88 } else {
89 if ($action == 'add_promo') {
90 $watch->_promos->add($p);
91 } else {
92 $watch->_promos->del($p);
93 }
94 }
95 } elseif (preg_match('!^ *(\d{4}) *- *(\d{4}) *$!', $arg, $matches)) {
96 $p1 = intval($matches[1]);
97 $p2 = intval($matches[2]);
98 if($p1<1900 || $p1>2100) {
a7de4ef7 99 $page->trig('la première promo de la plage entrée est invalide');
b48a0758 100 } elseif($p2<1900 || $p2>2100) {
a7de4ef7 101 $page->trig('la seconde promo de la plage entrée est invalide');
b48a0758 102 } else {
103 if ($action == 'add_promo') {
104 $watch->_promos->addRange($p1, $p2);
105 } else {
106 $watch->_promos->delRange($p1, $p2);
107 }
108 }
109 } else {
a7de4ef7 110 $page->trig("La promo (ou la plage de promo) entrée est dans un format incorrect.");
b48a0758 111 }
112 }
113
114 function handler_notifs(&$page, $action = null, $arg = null)
115 {
b48a0758 116 $page->changeTpl('carnet/notifs.tpl');
117
118 require_once 'notifs.inc.php';
119
cab08090 120 $watch = new Watch(S::v('uid'));
b48a0758 121
08cce2ff 122 $res = XDB::query("SELECT promo_sortie
b48a0758 123 FROM auth_user_md5
124 WHERE user_id = {?}",
cab08090 125 S::v('uid', -1));
b48a0758 126 $promo_sortie = $res->fetchOneCell();
127 $page->assign('promo_sortie', $promo_sortie);
128
129 switch ($action) {
130 case 'add_promo':
131 case 'del_promo':
132 $this->_handler_notifs_promos($page, $watch, $action, $arg);
133 break;
134
135 case 'del_nonins':
136 $watch->_nonins->del($arg);
137 break;
138
139 case 'add_nonins':
140 $watch->_nonins->add($arg);
141 break;
142 }
143
144 if (Env::has('subs')) $watch->_subs->update('sub');
145 if (Env::has('flags_contacts')) {
5e2307dc 146 $watch->watch_contacts = Env::b('contacts');
b48a0758 147 $watch->saveFlags();
148 }
149 if (Env::has('flags_mail')) {
5e2307dc 150 $watch->watch_mail = Env::b('mail');
b48a0758 151 $watch->saveFlags();
152 }
153
154 $page->assign_by_ref('watch', $watch);
b48a0758 155 }
156
157 function _get_list($offset, $limit) {
cab08090 158 $uid = S::v('uid');
08cce2ff 159 $res = XDB::query("SELECT COUNT(*) FROM contacts WHERE uid = {?}", $uid);
b48a0758 160 $total = $res->fetchOneCell();
161
5e2307dc 162 $order = Get::v('order');
b48a0758 163 $orders = Array(
164 'nom' => 'nom DESC, u.prenom, u.promo',
165 'promo' => 'promo DESC, nom, u.prenom',
166 'last' => 'u.date DESC, nom, u.prenom, promo');
167 if ($order != 'promo' && $order != 'last')
168 $order = 'nom';
169 $order = $orders[$order];
5e2307dc 170 if (Get::v('inv') == '')
b48a0758 171 $order = str_replace(" DESC,", ",", $order);
172
08cce2ff 173 $res = XDB::query("
b48a0758 174 SELECT u.prenom, IF(u.nom_usage='',u.nom,u.nom_usage) AS nom, a.alias AS forlife, u.promo
175 FROM contacts AS c
176 INNER JOIN auth_user_md5 AS u ON (u.user_id = c.contact)
177 INNER JOIN aliases AS a ON (u.user_id = a.id AND a.type='a_vie')
178 WHERE c.uid = {?}
179 ORDER BY $order
180 LIMIT {?}, {?}", $uid, $offset*$limit, $limit);
181 $list = $res->fetchAllAssoc();
182
183 return Array($total, $list);
184 }
185
186 function handler_contacts(&$page, $action = null)
187 {
b48a0758 188 $page->changeTpl('carnet/mescontacts.tpl');
189 require_once("applis.func.inc.php");
190 $page->assign('xorg_title','Polytechnique.org - Mes contacts');
59a61432 191 $this->_add_rss_link($page);
b48a0758 192
cab08090 193 $uid = S::v('uid');
5e2307dc 194 $user = Env::v('user');
b48a0758 195
5e2307dc 196 switch (Env::v('action')) {
b48a0758 197 case 'retirer':
198 if (is_numeric($user)) {
08cce2ff 199 if (XDB::execute('DELETE FROM contacts
e2f609cd 200 WHERE uid = {?} AND contact = {?}',
b48a0758 201 $uid, $user))
202 {
a7de4ef7 203 $page->trig("Contact retiré !");
b48a0758 204 }
205 } else {
08cce2ff 206 if (XDB::execute(
e2f609cd 207 'DELETE FROM c
b48a0758 208 USING contacts AS c
209 INNER JOIN aliases AS a ON (c.contact=a.id and a.type!="homonyme")
210 WHERE c.uid = {?} AND a.alias={?}', $uid, $user))
211 {
a7de4ef7 212 $page->trig("Contact retiré !");
b48a0758 213 }
214 }
215 break;
216
217 case 'ajouter':
218 require_once('user.func.inc.php');
219 if (($login = get_user_login($user)) !== false) {
08cce2ff 220 if (XDB::execute(
b48a0758 221 'INSERT INTO contacts (uid, contact)
222 SELECT {?}, id
223 FROM aliases
224 WHERE alias = {?}', $uid, $login))
225 {
a7de4ef7 226 $page->trig('Contact ajouté !');
b48a0758 227 } else {
a7de4ef7 228 $page->trig('Contact déjà dans la liste !');
b48a0758 229 }
230 }
231 }
232
233 if ($action == 'trombi') {
b48a0758 234 $trombi = new Trombi(array($this, '_get_list'));
235 $trombi->setNbRows(4);
236 $page->assign_by_ref('trombi',$trombi);
237
5e2307dc 238 $order = Get::v('order');
b48a0758 239 if ($order != 'promo' && $order != 'last')
240 $order = 'nom';
241 $page->assign('order', $order);
5e2307dc 242 $page->assign('inv', Get::v('inv'));
b48a0758 243
244 } else {
245
5e2307dc 246 $order = Get::v('order');
b48a0758 247 $orders = Array(
248 'nom' => 'sortkey DESC, a.prenom, a.promo',
249 'promo' => 'promo DESC, sortkey, a.prenom',
250 'last' => 'a.date DESC, sortkey, a.prenom, promo');
251 if ($order != 'promo' && $order != 'last')
252 $order = 'nom';
253 $page->assign('order', $order);
5e2307dc 254 $page->assign('inv', Get::v('inv'));
b48a0758 255 $order = $orders[$order];
5e2307dc 256 if (Get::v('inv') == '')
b48a0758 257 $order = str_replace(" DESC,", ",", $order);
258
259 $sql = "SELECT contact AS id,
260 a.*, l.alias AS forlife,
261 1 AS inscrit,
262 a.perms != 'pending' AS wasinscrit,
263 a.deces != 0 AS dcd, a.deces, a.matricule_ax,
264 FIND_IN_SET('femme', a.flags) AS sexe,
265 e.entreprise, es.label AS secteur, ef.fonction_fr AS fonction,
266 IF(n.nat='',n.pays,n.nat) AS nat, n.a2 AS iso3166,
267 ad0.text AS app0text, ad0.url AS app0url, ai0.type AS app0type,
268 ad1.text AS app1text, ad1.url AS app1url, ai1.type AS app1type,
269 adr.city, gp.a2, gp.pays AS countrytxt, gr.name AS region,
e0210288 270 IF(a.nom_usage<>'',a.nom_usage,a.nom) AS sortkey,
271 COUNT(em.email) > 0 AS actif
b48a0758 272 FROM contacts AS c
273 INNER JOIN auth_user_md5 AS a ON (a.user_id = c.contact)
274 INNER JOIN aliases AS l ON (a.user_id = l.id AND l.type='a_vie')
275 LEFT JOIN entreprises AS e ON (e.entrid = 0 AND e.uid = a.user_id)
276 LEFT JOIN emploi_secteur AS es ON (e.secteur = es.id)
277 LEFT JOIN fonctions_def AS ef ON (e.fonction = ef.id)
278 LEFT JOIN geoloc_pays AS n ON (a.nationalite = n.a2)
279 LEFT JOIN applis_ins AS ai0 ON (a.user_id = ai0.uid AND ai0.ordre = 0)
280 LEFT JOIN applis_def AS ad0 ON (ad0.id = ai0.aid)
281 LEFT JOIN applis_ins AS ai1 ON (a.user_id = ai1.uid AND ai1.ordre = 1)
282 LEFT JOIN applis_def AS ad1 ON (ad1.id = ai1.aid)
283 LEFT JOIN adresses AS adr ON (a.user_id = adr.uid
284 AND FIND_IN_SET('active', adr.statut))
285 LEFT JOIN geoloc_pays AS gp ON (adr.country = gp.a2)
286 LEFT JOIN geoloc_region AS gr ON (adr.country = gr.a2 AND adr.region = gr.region)
e0210288 287 LEFT JOIN emails AS em ON (em.uid = a.user_id AND em.flags = 'active')
b48a0758 288 WHERE c.uid = $uid
e0210288 289 GROUP BY a.user_id
b48a0758 290 ORDER BY ".$order;
291
cfa54940 292 $page->assign('citer', XDB::iterator($sql));
b48a0758 293 }
b48a0758 294 }
295
296 function handler_pdf(&$page, $arg0 = null, $arg1 = null)
297 {
ee5990c7 298 require_once dirname(__FILE__).'/carnet/contacts.pdf.inc.php';
b48a0758 299 require_once 'user.func.inc.php';
300
301 session_write_close();
302
303 $sql = "SELECT a.alias
304 FROM aliases AS a
305 INNER JOIN auth_user_md5 AS u ON ( a.id = u.user_id )
306 INNER JOIN contacts AS c ON ( a.id = c.contact )
307 WHERE c.uid = {?} AND a.type='a_vie'";
308 if ($arg0 == 'promo') {
309 $sql .= ' ORDER BY u.promo, u.nom, u.prenom';
310 } else {
311 $sql .= ' ORDER BY u.nom, u.prenom, u.promo';
312 }
313
cab08090 314 $citer = XDB::iterRow($sql, S::v('uid'));
b48a0758 315 $pdf = new ContactsPDF();
316
317 while (list($alias) = $citer->next()) {
318 $user = get_user_details($alias);
93c099e1 319 $pdf = ContactsPDF::addContact($pdf, $user, $arg0 == 'photos' || $arg1 == 'photos');
b48a0758 320 }
321 $pdf->Output();
322
323 exit;
324 }
325
c9f82d49 326 function handler_rss(&$page, $user = null, $hash = null)
327 {
328 require_once 'rss.inc.php';
329 require_once 'notifs.inc.php';
0337d704 330
c9f82d49 331 $uid = init_rss('carnet/rss.tpl', $user, $hash);
332 $notifs = new Notifs($uid, false);
333 $page->assign('notifs', $notifs);
c9f82d49 334 }
fbfb06dc 335
963c0b2e 336 function handler_ical(&$page, $alias = null, $hash = null)
fbfb06dc 337 {
963c0b2e 338 require_once 'rss.inc.php';
339 $uid = init_rss(null, $alias, $hash, false);
340 if (S::logged()) {
341 if (!$uid) {
342 $uid = S::i('uid');
343 } else if ($uid != S::i('uid')) {
344 require_once 'xorg.misc.inc.php';
345 send_warning_email("Récupération d\'un autre utilisateur ($uid)");
346 }
347 } else if (!$uid) {
348 exit;
349 }
99544d53 350 require_once 'ical.inc.php';
801fcad8 351 $page->changeTpl('carnet/calendar.tpl', NO_SKIN);
3585b0c8 352 $page->register_function('display_ical', 'display_ical');
fbfb06dc 353
f3b3f363 354 $res = XDB::iterRow(
355 'SELECT u.prenom,
356 IF(u.nom_usage = \'\',u.nom,u.nom_usage) AS nom,
357 u.promo,
358 u.naissance,
359 DATE_ADD(u.naissance, INTERVAL 1 DAY) AS end,
360 u.date_ins,
361 a.alias AS forlife
362 FROM contacts AS c
363 INNER JOIN auth_user_md5 AS u ON (u.user_id = c.contact)
364 INNER JOIN aliases AS a ON (u.user_id = a.id AND a.type = \'a_vie\')
963c0b2e 365 WHERE c.uid = {?}', $uid);
f3b3f363 366
367 $annivs = Array();
368 while (list($prenom, $nom, $promo, $naissance, $end, $ts, $forlife) = $res->next()) {
369 $naissance = str_replace('-', '', $naissance);
370 $end = str_replace('-', '', $end);
371 $annivs[] = array(
372 'timestamp' => strtotime($ts),
373 'date' => $naissance,
374 'tomorrow' => $end,
375 'forlife' => $forlife,
376 'summary' => 'Anniversaire de '.$prenom
377 .' '.$nom.' - x '.$promo,
378 );
fbfb06dc 379 }
f3b3f363 380 $page->assign('events', $annivs);
fbfb06dc 381
382 header('Content-Type: text/calendar; charset=utf-8');
fbfb06dc 383 }
5e193297 384
917c4d11 385 function handler_vcard(&$page, $photos = null)
5e193297 386 {
387 $res = XDB::query('SELECT contact
388 FROM contacts
389 WHERE uid = {?}', S::v('uid'));
917c4d11 390 $vcard = new VCard($res->fetchColumn(), $photos == 'photos');
5e193297 391 $vcard->do_page(&$page);
392 }
4da0b8d7 393}
c9f82d49 394
a7de4ef7 395// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
c9f82d49 396?>