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