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