db91a51d59c5e63108e4ed6a2d98e7034c423f68
[platal.git] / modules / xnetevents.php
1 <?php
2 /***************************************************************************
3 * Copyright (C) 2003-2007 Polytechnique.org *
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
22 define('NB_PER_PAGE', 25);
23
24 class XnetEventsModule extends PLModule
25 {
26 function handlers()
27 {
28 return array(
29 '%grp/events' => $this->make_hook('events', AUTH_MDP),
30 '%grp/events/sub' => $this->make_hook('sub', AUTH_MDP),
31 '%grp/events/csv' => $this->make_hook('csv', AUTH_MDP),
32 '%grp/events/ical' => $this->make_hook('ical', AUTH_MDP),
33 '%grp/events/edit' => $this->make_hook('edit', AUTH_MDP, 'groupadmin'),
34 '%grp/events/admin' => $this->make_hook('admin', AUTH_MDP, 'groupmember'),
35 );
36 }
37
38 function handler_events(&$page, $archive = null)
39 {
40 global $globals;
41
42 $page->changeTpl('xnetevents/index.tpl');
43 $action = null;
44 $archive = ($archive == 'archive' && may_update());
45
46 if (Post::has('del')) {
47 $action = 'del';
48 $eid = Post::v('del');
49 } elseif (Post::has('archive')) {
50 $action = 'archive';
51 $eid = Post::v('archive');
52 } elseif (Post::has('unarchive')) {
53 $action = 'unarchive';
54 $eid = Post::v('unarchive');
55 }
56
57 if (!is_null($action)) {
58 if (!may_update()) {
59 return PL_FORBIDDEN;
60 }
61
62 $res = XDB::query("SELECT asso_id, short_name FROM groupex.evenements
63 WHERE eid = {?} AND asso_id = {?}",
64 $eid, $globals->asso('id'));
65
66 $tmp = $res->fetchOneRow();
67 if (!$tmp) {
68 return PL_FORBIDDEN;
69 }
70 }
71
72 if ($action == 'del') {
73 // deletes the event mailing aliases
74 if ($tmp[1]) {
75 XDB::execute(
76 "DELETE FROM virtual WHERE type = 'evt' AND alias LIKE {?}",
77 $tmp[1].'-absents@%');
78 XDB::execute(
79 "DELETE FROM virtual WHERE type = 'evt' AND alias LIKE {?}",
80 $tmp[1].'-participants@%');
81 }
82
83 // deletes the event items
84 XDB::execute("DELETE FROM groupex.evenements_items WHERE eid = {?}", $eid);
85
86 // deletes the event participants
87 XDB::execute("DELETE FROM groupex.evenements_participants
88 WHERE eid = {?}", $eid);
89
90 // deletes the event
91 XDB::execute("DELETE FROM groupex.evenements
92 WHERE eid = {?} AND asso_id = {?}",
93 $eid, $globals->asso('id'));
94
95 // delete the requests for payments
96 require_once 'validations.inc.php';
97 XDB::execute("DELETE FROM requests
98 WHERE type = 'paiements' AND data LIKE {?}",
99 PayReq::same_event($eid, $globals->asso('id')));
100 }
101
102 if ($action == 'archive') {
103 XDB::execute("UPDATE groupex.evenements
104 SET archive = 1
105 WHERE eid = {?} AND asso_id = {?}",
106 $eid, $globals->asso('id'));
107 }
108
109 if ($action == 'unarchive') {
110 XDB::execute("UPDATE groupex.evenements
111 SET archive = 0
112 WHERE eid = {?} AND asso_id = {?}",
113 $eid, $globals->asso('id'));
114 }
115
116 $page->assign('archive', $archive);
117 $evenements = XDB::iterator(
118 "SELECT e.*, LEFT(10, e.debut) AS debut_day, LEFT(10, e.fin) AS fin_day,
119 IF(e.deadline_inscription, e.deadline_inscription >= LEFT(NOW(), 10),
120 1) AS inscr_open, e.deadline_inscription,
121 u.nom, u.prenom, u.promo, a.alias,
122 MAX(ep.nb) IS NOT NULL AS inscrit, MAX(ep.paid) AS paid
123 FROM groupex.evenements AS e
124 INNER JOIN x4dat.auth_user_md5 AS u ON u.user_id = e.organisateur_uid
125 INNER JOIN x4dat.aliases AS a ON (a.type = 'a_vie' AND a.id = u.user_id)
126 LEFT JOIN groupex.evenements_participants AS ep ON (ep.eid = e.eid AND ep.uid = {?})
127 WHERE asso_id = {?}
128 AND archive = " . ($archive ? "1 " : "0 ")
129 . (is_member() || may_update() ? "" : " AND accept_nonmembre != 0 ")
130 . "GROUP BY e.eid
131 ORDER BY inscr_open DESC, debut DESC", S::v('uid'), $globals->asso('id'));
132
133 $evts = array();
134
135 while ($e = $evenements->next()) {
136 $e['show_participants'] = ($e['show_participants'] && (is_member() || may_update()));
137 $res = XDB::query(
138 "SELECT titre, details, montant, ei.item_id, nb, ep.paid
139 FROM groupex.evenements_items AS ei
140 LEFT JOIN groupex.evenements_participants AS ep
141 ON (ep.eid = ei.eid AND ep.item_id = ei.item_id AND uid = {?})
142 WHERE ei.eid = {?}",
143 S::v('uid'), $e['eid']);
144 $e['moments'] = $res->fetchAllAssoc();
145
146 $e['topay'] = 0;
147 $e['paid'] = $e['moments'][0]['paid'];
148 foreach ($e['moments'] as $m) {
149 $e['topay'] += $m['nb'] * $m['montant'];
150 }
151
152 $query = XDB::query(
153 "SELECT montant
154 FROM {$globals->money->mpay_tprefix}transactions AS t
155 WHERE ref = {?} AND uid = {?}", $e['paiement_id'], S::v('uid'));
156 $montants = $query->fetchColumn();
157
158 foreach ($montants as $m) {
159 $p = strtr(substr($m, 0, strpos($m, 'EUR')), ',', '.');
160 $e['paid'] += trim($p);
161 }
162
163 if (Env::has('updated') && $e['eid'] == Env::i('updated')) {
164 $page->assign('updated', $e);
165 }
166 $evts[] = $e;
167 }
168
169 $page->assign('evenements', $evts);
170 }
171
172 function handler_sub(&$page, $eid = null)
173 {
174 require_once dirname(__FILE__).'/xnetevents/xnetevents.inc.php';
175 $page->changeTpl('xnetevents/subscribe.tpl');
176
177 $evt = get_event_detail($eid);
178 if (!$evt) {
179 return PL_NOT_FOUND;
180 }
181
182 if (!$evt['inscr_open']) {
183 $page->kill('Les inscriptions pour cet événement sont closes');
184 }
185 if (!$evt['accept_nonmembre'] && !is_member() && !may_update()) {
186 $page->kill('Cet événement est fermé aux non-membres du groupe');
187 }
188
189 $page->assign('event', $evt);
190
191 if (!Post::has('submit')) {
192 return;
193 }
194
195 $moments = Post::v('moment', array());
196 $pers = Post::v('personnes', array());
197 $subs = array();
198
199 foreach ($moments as $j => $v) {
200 $subs[$j] = intval($v);
201
202 // retreive ohter field when more than one person
203 if ($subs[$j] == 2) {
204 if (!isset($pers[$j]) || !is_numeric($pers[$j])
205 || $pers[$j] < 0)
206 {
207 $page->trig('Tu dois choisir un nombre d\'invités correct !');
208 return;
209 }
210 $subs[$j] = 1 + $pers[$j];
211 }
212 }
213
214 // impossible to unsubscribe if you already paid sthing
215 if (!array_sum($subs) && $evt['paid'] != 0) {
216 $page->trig("Impossible de te désinscrire complètement ".
217 "parce que tu as fait un paiement par ".
218 "chèque ou par liquide. Contacte un ".
219 "administrateur du groupe si tu es sûr de ".
220 "ne pas venir");
221 return;
222 }
223
224 // update actual inscriptions
225 $updated = false;
226 $total = 0;
227 $paid = $evt['paid'] ? $evt['paid'] : 0;
228 foreach ($subs as $j => $nb) {
229 if ($nb >= 0) {
230 XDB::execute(
231 "REPLACE INTO groupex.evenements_participants
232 VALUES ({?}, {?}, {?}, {?}, {?})",
233 $eid, S::v('uid'), $j, $nb, $paid);
234 $updated = $eid;
235 } else {
236 XDB::execute(
237 "DELETE FROM groupex.evenements_participants
238 WHERE eid = {?} AND uid = {?} AND item_id = {?}",
239 $eid, S::v("uid"), $j);
240 $updated = $eid;
241 }
242 $total += $nb;
243 }
244 if ($updated !== false) {
245 subscribe_lists_event($total, S::i('uid'), $evt);
246 }
247 $page->assign('event', get_event_detail($eid));
248 }
249
250 function handler_csv(&$page, $eid = null, $item_id = null)
251 {
252 require_once dirname(__FILE__).'/xnetevents/xnetevents.inc.php';
253
254 if (!is_numeric($item_id)) {
255 $item_id = null;
256 }
257
258 $evt = get_event_detail($eid, $item_id);
259 if (!$evt) {
260 return PL_NOT_FOUND;
261 }
262
263 header('Content-type: text/x-csv; encoding=UTF-8');
264 header('Pragma: ');
265 header('Cache-Control: ');
266
267 $page->changeTpl('xnetevents/csv.tpl', NO_SKIN);
268
269 $admin = may_update();
270
271 $tri = (Env::v('order') == 'alpha' ? 'promo, nom, prenom' : 'nom, prenom, promo');
272
273 $page->assign('participants',
274 get_event_participants($evt, $item_id, $tri));
275
276 $page->assign('admin', $admin);
277 $page->assign('moments', $evt['moments']);
278 $page->assign('money', $evt['money']);
279 $page->assign('tout', !Env::v('item_id', false));
280 }
281
282 function handler_ical(&$page, $eid = null)
283 {
284 global $globals;
285
286 require_once dirname(__FILE__).'/xnetevents/xnetevents.inc.php';
287 $evt = get_event_detail($eid);
288 if (!$evt) {
289 return PL_FORBIDDEN;
290 }
291 $evt['debut'] = preg_replace('/(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)/', "\\1\\2\\3T\\4\\5\\6", $evt['debut']);
292 $evt['fin'] = preg_replace('/(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)/', "\\1\\2\\3T\\4\\5\\6", $evt['fin']);
293
294 foreach ($evt['moments'] as $m) {
295 $evt['descriptif'] .= "\n\n** " . $m['titre'] . " **\n" . $m['details'];
296 }
297
298 $page->changeTpl('xnetevents/calendar.tpl', NO_SKIN);
299
300 require_once('ical.inc.php');
301 $page->assign('asso', $globals->asso());
302 $page->assign('timestamp', time());
303 $page->assign('admin', may_update());
304
305 if (may_update()) {
306 $page->assign('participants', get_event_participants($evt, null, 'promo, nom, prenom'));
307 }
308 $page->register_function('display_ical', 'display_ical');
309 $page->assign_by_ref('e', $evt);
310
311 header('Content-Type: text/calendar; charset=utf-8');
312 }
313
314 function handler_edit(&$page, $eid = null)
315 {
316 global $globals;
317
318 // get eid if the the given one is a short name
319 if (!is_null($eid) && !is_numeric($eid)) {
320 $res = XDB::query("SELECT eid
321 FROM groupex.evenements
322 WHERE asso_id = {?} AND short_name = {?}",
323 $globals->asso('id'), $eid);
324 if ($res->numRows()) {
325 $eid = (int)$res->fetchOneCell();
326 }
327 }
328
329 // check the event is in our group
330 if (!is_null($eid)) {
331 $res = XDB::query("SELECT short_name
332 FROM groupex.evenements
333 WHERE eid = {?} AND asso_id = {?}",
334 $eid, $globals->asso('id'));
335 if ($res->numRows()) {
336 $infos = $res->fetchOneAssoc();
337 } else {
338 return PL_FORBIDDEN;
339 }
340 }
341
342 $page->changeTpl('xnetevents/edit.tpl');
343
344 $moments = range(1, 4);
345 $error = false;
346 $page->assign('moments', $moments);
347
348 if (Post::v('intitule')) {
349 require_once dirname(__FILE__).'/xnetevents/xnetevents.inc.php';
350 $short_name = event_change_shortname($page, $infos['short_name'],
351 Env::v('short_name', ''));
352 if ($short_name != Env::v('short_name')) {
353 $error = true;
354 }
355 $evt = array(
356 'eid' => $eid,
357 'asso_id' => $globals->asso('id'),
358 'paiement_id' => Post::v('paiement_id') > 0 ? Post::v('paiement_id') : null,
359 'debut' => Post::v('deb_Year').'-'.Post::v('deb_Month')
360 .'-'.Post::v('deb_Day').' '.Post::v('deb_Hour')
361 .':'.Post::v('deb_Minute').':00',
362 'fin' => Post::v('fin_Year').'-'.Post::v('fin_Month')
363 .'-'.Post::v('fin_Day').' '.Post::v('fin_Hour')
364 .':'.Post::v('fin_Minute').':00',
365 'short_name' => $short_name,
366 );
367
368 $trivial = array('intitule', 'descriptif', 'noinvite',
369 'show_participants', 'accept_nonmembre', 'organisateur_uid');
370 foreach ($trivial as $k) {
371 $evt[$k] = Post::v($k);
372 }
373 if (!$eid) {
374 $evt['organisateur_uid'] = S::v('uid');
375 }
376
377 if (Post::v('deadline')) {
378 $evt['deadline_inscription'] = Post::v('inscr_Year').'-'
379 . Post::v('inscr_Month').'-'
380 . Post::v('inscr_Day');
381 } else {
382 $evt['deadline_inscription'] = null;
383 }
384
385 // Store the modifications in the database
386 XDB::execute('REPLACE INTO groupex.evenements
387 SET eid={?}, asso_id={?}, organisateur_uid={?}, intitule={?},
388 paiement_id = {?}, descriptif = {?}, debut = {?},
389 fin = {?}, show_participants = {?}, short_name = {?},
390 deadline_inscription = {?}, noinvite = {?},
391 accept_nonmembre = {?}',
392 $evt['eid'], $evt['asso_id'], $evt['organisateur_uid'],
393 $evt['intitule'], $evt['paiement_id'], $evt['descriptif'],
394 $evt['debut'], $evt['fin'], $evt['show_participants'],
395 $evt['short_name'], $evt['deadline_inscription'],
396 $evt['noinvite'], $evt['accept_nonmembre']);
397
398 // if new event, get its id
399 if (!$eid) {
400 $eid = XDB::insertId();
401 }
402
403 $nb_moments = 0;
404 $money_defaut = 0;
405
406 foreach ($moments as $i) {
407 if (Post::v('titre'.$i)) {
408 $nb_moments++;
409
410 $montant = strtr(Post::v('montant'.$i), ',', '.');
411 $money_defaut += (float)$montant;
412 XDB::execute("
413 REPLACE INTO groupex.evenements_items
414 VALUES ({?}, {?}, {?}, {?}, {?})",
415 $eid, $i, Post::v('titre'.$i),
416 Post::v('details'.$i), $montant);
417 } else {
418 XDB::execute("DELETE FROM groupex.evenements_items
419 WHERE eid = {?} AND item_id = {?}", $eid, $i);
420 }
421 }
422 // request for a new payment
423 if (Post::v('paiement_id') == -1 && $money_defaut >= 0) {
424 require_once 'validations.inc.php';
425 $p = new PayReq(S::v('uid'),
426 Post::v('intitule')." - ".$globals->asso('nom'),
427 Post::v('site'), $money_defaut,
428 Post::v('confirmation'), 0, 999,
429 $globals->asso('id'), $eid);
430 if ($p->accept()) {
431 $p->submit();
432 } else {
433 $page->assign('paiement_message', Post::v('confirmation'));
434 $page->assign('paiement_site', Post::v('site'));
435 $error = true;
436 }
437 }
438
439 // events with no sub-event: add a sub-event with no name
440 if ($nb_moments == 0) {
441 XDB::execute("INSERT INTO groupex.evenements_items
442 VALUES ({?}, {?}, '', '', 0)", $eid, 1);
443 }
444
445 if (!$error) {
446 pl_redirect('events');
447 }
448 }
449
450 // get a list of all the payment for this asso
451 $res = XDB::iterator("SELECT id, text
452 FROM {$globals->money->mpay_tprefix}paiements
453 WHERE asso_id = {?}", $globals->asso('id'));
454 $paiements = array();
455 while ($a = $res->next()) $paiements[$a['id']] = $a['text']; {
456 $page->assign('paiements', $paiements);
457 }
458
459 // when modifying an old event retreive the old datas
460 if ($eid) {
461 $res = XDB::query(
462 "SELECT eid, intitule, descriptif, debut, fin, organisateur_uid,
463 show_participants, paiement_id, short_name,
464 deadline_inscription, noinvite, accept_nonmembre
465 FROM groupex.evenements
466 WHERE eid = {?}", $eid);
467 $evt = $res->fetchOneAssoc();
468 // find out if there is already a request for a payment for this event
469 require_once 'validations.inc.php';
470 $res = XDB::query("SELECT stamp FROM requests
471 WHERE type = 'paiements' AND data LIKE {?}",
472 PayReq::same_event($eid, $globals->asso('id')));
473 $stamp = $res->fetchOneCell();
474 if ($stamp) {
475 $evt['paiement_id'] = -2;
476 $evt['paiement_req'] = $stamp;
477 }
478 $page->assign('evt', $evt);
479 // get all the different moments infos
480 $res = XDB::iterator(
481 "SELECT item_id, titre, details, montant
482 FROM groupex.evenements_items AS ei
483 INNER JOIN groupex.evenements AS e ON(e.eid = ei.eid)
484 WHERE e.eid = {?}
485 ORDER BY item_id", $eid);
486 $items = array();
487 while ($item = $res->next()) {
488 $items[$item['item_id']] = $item;
489 }
490 $page->assign('items', $items);
491 }
492 $page->assign('url_ref', $eid);
493 }
494
495 function handler_admin(&$page, $eid = null, $item_id = null)
496 {
497 global $globals;
498
499 require_once dirname(__FILE__).'/xnetevents/xnetevents.inc.php';
500
501 $evt = get_event_detail($eid, $item_id);
502 if (!$evt) {
503 return PL_NOT_FOUND;
504 }
505
506 $page->changeTpl('xnetevents/admin.tpl');
507 if (!$evt['show_participants'] && !may_update()) {
508 return PL_FORBIDDEN;
509 }
510
511 if (may_update() && Post::v('adm')) {
512 $member = get_infos(Post::v('mail'));
513 if (!$member) {
514 $page->trig("Membre introuvable");
515 }
516
517 // change the price paid by a participant
518 if (Env::v('adm') == 'prix' && $member) {
519 XDB::execute("UPDATE groupex.evenements_participants
520 SET paid = IF(paid + {?} > 0, paid + {?}, 0)
521 WHERE uid = {?} AND eid = {?}",
522 strtr(Env::v('montant'), ',', '.'),
523 strtr(Env::v('montant'), ',', '.'),
524 $member['uid'], $evt['eid']);
525 }
526
527 // change the number of personns coming with a participant
528 if (Env::v('adm') == 'nbs' && $member) {
529 $res = XDB::query("SELECT paid
530 FROM groupex.evenements_participants
531 WHERE uid = {?} AND eid = {?}",
532 $member['uid'], $evt['eid']);
533
534 $paid = intval($res->fetchOneCell());
535 $nbs = Post::v('nb', array());
536
537 foreach ($nbs as $id => $nb) {
538 $nb = max(intval($nb), 0);
539 XDB::execute("REPLACE INTO groupex.evenements_participants
540 VALUES ({?}, {?}, {?}, {?}, {?})",
541 $evt['eid'], $member['uid'], $id, $nb, $paid);
542 }
543
544 $res = XDB::query("SELECT COUNT(uid) AS cnt, SUM(nb) AS nb
545 FROM groupex.evenements_participants
546 WHERE uid = {?} AND eid = {?}
547 GROUP BY uid",
548 $member['uid'], $evt['eid']);
549 $u = $res->fetchOneAssoc();
550 $u = $u['cnt'] ? null : $u['nb'];
551 subscribe_lists_event($u, $member['uid'], $evt);
552 }
553
554 $evt = get_event_detail($eid, $item_id);
555 }
556
557 $page->assign('evt', $evt);
558 $page->assign('tout', is_null($item_id));
559
560 if (count($evt['moments'])) {
561 $page->assign('moments', $evt['moments']);
562 }
563
564 $tri = (Env::v('order') == 'alpha' ? 'promo, nom, prenom' : 'nom, prenom, promo');
565 $whereitemid = is_null($item_id) ? '' : "AND ep.item_id = $item_id";
566 $res = XDB::iterRow(
567 'SELECT UPPER(SUBSTRING(IF(u.nom IS NULL, m.nom,
568 IF(u.nom_usage<>"", u.nom_usage, u.nom)), 1, 1)),
569 COUNT(DISTINCT ep.uid)
570 FROM groupex.evenements_participants AS ep
571 INNER JOIN groupex.evenements AS e ON (ep.eid = e.eid)
572 LEFT JOIN groupex.membres AS m ON ( ep.uid = m.uid AND e.asso_id = m.asso_id)
573 LEFT JOIN auth_user_md5 AS u ON ( u.user_id = ep.uid )
574 WHERE ep.eid = {?} '.$whereitemid.'
575 GROUP BY UPPER(SUBSTRING(IF(u.nom IS NULL,m.nom,u.nom), 1, 1))', $evt['eid']);
576
577 $alphabet = array();
578 $nb_tot = 0;
579 while (list($char, $nb) = $res->next()) {
580 $alphabet[ord($char)] = $char;
581 $nb_tot += $nb;
582 if (Env::has('initiale') && $char == strtoupper(Env::v('initiale'))) {
583 $tot = $nb;
584 }
585 }
586 ksort($alphabet);
587 $page->assign('alphabet', $alphabet);
588
589 $ofs = Env::i('offset');
590 $tot = Env::v('initiale') ? $tot : $nb_tot;
591 $nbp = intval(($tot-1)/NB_PER_PAGE);
592 $links = array();
593 if ($ofs) {
594 $links['précédent'] = $ofs-1;
595 }
596 for ($i = 0; $i <= $nbp; $i++) {
597 $links[(string)($i+1)] = $i;
598 }
599 if ($ofs < $nbp) {
600 $links['suivant'] = $ofs+1;
601 }
602 if (count($links)>1) {
603 $page->assign('links', $links);
604 }
605
606 if ($evt['paiement_id']) {
607 $res = XDB::iterator(
608 "SELECT IF(u.nom_usage<>'', u.nom_usage, u.nom) AS nom, u.prenom,
609 u.promo, a.alias AS email, t.montant
610 FROM {$globals->money->mpay_tprefix}transactions AS t
611 INNER JOIN auth_user_md5 AS u ON(t.uid = u.user_id)
612 INNER JOIN aliases AS a ON (a.id = t.uid AND a.type='a_vie' )
613 LEFT JOIN groupex.evenements_participants AS ep ON(ep.uid = t.uid AND ep.eid = {?})
614 WHERE t.ref = {?} AND ep.uid IS NULL",
615 $evt['eid'], $evt['paiement_id']);
616 $page->assign('oublis', $res->total());
617 $page->assign('oubliinscription', $res);
618 }
619
620 $absents = XDB::iterator("SELECT p.uid,
621 IF(m.origine = 'X', IF(u.nom_usage != '', u.nom_usage, u.nom), m.nom) AS nom,
622 IF(m.origine = 'X', u.prenom, u.prenom) AS prenom,
623 IF(m.origine = 'X', u.promo, m.origine) AS promo,
624 IF(m.origine = 'X', FIND_IN_SET('femme', u.flags), m.sexe) AS sexe,
625 IF(m.origine = 'X', a.alias, m.email) AS email
626 FROM groupex.evenements_participants AS p
627 INNER JOIN groupex.membres AS m USING(uid)
628 LEFT JOIN groupex.evenements_participants AS p2 ON (p2.uid = m.uid AND p2.eid = p.eid
629 AND p2.nb != 0)
630 LEFT JOIN auth_user_md5 AS u ON (u.user_id = m.uid)
631 LEFT JOIN aliases AS a ON (a.id = u.user_id AND a.type = 'a_vie')
632 WHERE p.eid = {?} AND p2.eid IS NULL
633 GROUP BY m.uid
634 ORDER BY nom, prenom, promo", $evt['eid']);
635
636 $page->assign('absents', $absents);
637 $page->assign('participants',
638 get_event_participants($evt, $item_id, $tri,
639 "LIMIT ".($ofs*NB_PER_PAGE).", ".NB_PER_PAGE));
640 }
641 }
642
643 // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
644 ?>