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