2 /***************************************************************************
3 * Copyright (C) 2003-2008 Polytechnique.org *
4 * http://opensource.polytechnique.org/ *
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. *
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. *
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 *
19 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *
20 ***************************************************************************/
22 define('NB_PER_PAGE', 25);
24 class XnetEventsModule
extends PLModule
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'),
38 function handler_events(&$page, $archive = null
)
42 $page->changeTpl('xnetevents/index.tpl');
44 $archive = ($archive == 'archive' && may_update());
46 if (Post
::has('del')) {
48 $eid = Post
::v('del');
49 } elseif (Post
::has('archive')) {
51 $eid = Post
::v('archive');
52 } elseif (Post
::has('unarchive')) {
53 $action = 'unarchive';
54 $eid = Post
::v('unarchive');
57 if (!is_null($action)) {
61 S
::assert_xsrf_token();
63 $res = XDB
::query("SELECT asso_id, short_name FROM groupex.evenements
64 WHERE eid = {?} AND asso_id = {?}",
65 $eid, $globals->asso('id'));
67 $tmp = $res->fetchOneRow();
73 if ($action == 'del') {
74 // deletes the event mailing aliases
77 "DELETE FROM virtual WHERE type = 'evt' AND alias LIKE {?}",
78 $tmp[1].'-absents@%');
80 "DELETE FROM virtual WHERE type = 'evt' AND alias LIKE {?}",
81 $tmp[1].'-participants@%');
84 // deletes the event items
85 XDB
::execute("DELETE FROM groupex.evenements_items WHERE eid = {?}", $eid);
87 // deletes the event participants
88 XDB
::execute("DELETE FROM groupex.evenements_participants
89 WHERE eid = {?}", $eid);
92 XDB
::execute("DELETE FROM groupex.evenements
93 WHERE eid = {?} AND asso_id = {?}",
94 $eid, $globals->asso('id'));
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')));
104 if ($action == 'archive') {
105 XDB
::execute("UPDATE groupex.evenements
107 WHERE eid = {?} AND asso_id = {?}",
108 $eid, $globals->asso('id'));
111 if ($action == 'unarchive') {
112 XDB
::execute("UPDATE groupex.evenements
114 WHERE eid = {?} AND asso_id = {?}",
115 $eid, $globals->asso('id'));
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 = {?})
130 AND archive = " . ($archive ?
"1 " : "0 ")
132 ORDER BY inscr_open DESC, debut DESC", S
::v('uid'), $globals->asso('id'));
135 $undisplayed_events = 0;
137 while ($e = $evenements->next()) {
138 if (!is_member() && !may_update() && !$e['accept_nonmembre']) {
139 $undisplayed_events ++
;
143 $e['show_participants'] = ($e['show_participants'] && (is_member() ||
may_update()));
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 = {?})
150 S
::v('uid'), $e['eid']);
151 $e['moments'] = $res->fetchAllAssoc();
154 $e['paid'] = $e['moments'][0]['paid'];
155 foreach ($e['moments'] as $m) {
156 $e['topay'] +
= $m['nb'] * $m['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();
165 foreach ($montants as $m) {
166 $p = strtr(substr($m, 0, strpos($m, 'EUR')), ',', '.');
167 $e['paid'] +
= trim($p);
170 if (Env
::has('updated') && $e['eid'] == Env
::i('updated')) {
171 $page->assign('updated', $e);
176 $page->assign('evenements', $evts);
177 $page->assign('undisplayed_events', $undisplayed_events);
180 function handler_sub(&$page, $eid = null
)
182 require_once dirname(__FILE__
).'/xnetevents/xnetevents.inc.php';
183 $page->changeTpl('xnetevents/subscribe.tpl');
185 $evt = get_event_detail($eid);
190 if (!$evt['inscr_open']) {
191 $page->kill('Les inscriptions pour cet événement sont closes');
193 if (!$evt['accept_nonmembre'] && !is_member() && !may_update()) {
194 $page->kill('Cet événement est fermé aux non-membres du groupe');
198 $res = XDB
::query("SELECT stamp FROM requests
199 WHERE type = 'paiements' AND data LIKE {?}",
200 PayReq
::same_event($evt['eid'], $globals->asso('id')));
201 $page->assign('validation', $res->numRows());
202 $page->assign('event', $evt);
204 if (!Post
::has('submit')) {
207 S
::assert_xsrf_token();
210 $moments = Post
::v('moment', array());
211 $pers = Post
::v('personnes', array());
214 foreach ($moments as $j => $v) {
215 $subs[$j] = intval($v);
217 // retreive ohter field when more than one person
218 if ($subs[$j] == 2) {
219 if (!isset($pers[$j]) ||
!is_numeric($pers[$j])
222 $page->trigError('Tu dois choisir un nombre d\'invités correct !');
225 $subs[$j] = 1 +
$pers[$j];
229 // impossible to unsubscribe if you already paid sthing
230 if (!array_sum($subs) && $evt['paid'] != 0) {
231 $page->trigError("Impossible de te désinscrire complètement ".
232 "parce que tu as fait un paiement par ".
233 "chèque ou par liquide. Contacte un ".
234 "administrateur du groupe si tu es sûr de ".
239 // update actual inscriptions
242 $paid = $evt['paid'] ?
$evt['paid'] : 0;
243 $telepaid= $evt['telepaid'] ?
$evt['telepaid'] : 0;
244 foreach ($subs as $j => $nb) {
247 "REPLACE INTO groupex.evenements_participants
248 VALUES ({?}, {?}, {?}, {?}, {?}, {?})",
249 $eid, S
::v('uid'), $j, $nb, Env
::has('notify_payment') ?
'notify_payment' : '',
250 $j == 1 ?
$paid - $telepaid : 0);
254 "DELETE FROM groupex.evenements_participants
255 WHERE eid = {?} AND uid = {?} AND item_id = {?}",
256 $eid, S
::v("uid"), $j);
261 if ($updated !== false
) {
262 subscribe_lists_event($total, S
::i('uid'), $evt);
264 $page->assign('event', get_event_detail($eid));
267 function handler_csv(&$page, $eid = null
, $item_id = null
)
269 require_once dirname(__FILE__
).'/xnetevents/xnetevents.inc.php';
271 if (!is_numeric($item_id)) {
275 $evt = get_event_detail($eid, $item_id);
280 header('Content-type: text/x-csv; encoding=UTF-8');
282 header('Cache-Control: ');
284 $page->changeTpl('xnetevents/csv.tpl', NO_SKIN
);
286 $admin = may_update();
288 $tri = (Env
::v('order') == 'alpha' ?
'promo, nom, prenom' : 'nom, prenom, promo');
290 $page->assign('participants',
291 get_event_participants($evt, $item_id, $tri));
293 $page->assign('admin', $admin);
294 $page->assign('moments', $evt['moments']);
295 $page->assign('money', $evt['money']);
296 $page->assign('telepayment', $evt['paiement_id']);
297 $page->assign('tout', !Env
::v('item_id', false
));
300 function handler_ical(&$page, $eid = null
)
304 require_once dirname(__FILE__
).'/xnetevents/xnetevents.inc.php';
305 $evt = get_event_detail($eid);
309 $evt['debut'] = preg_replace('/(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)/', "\\1\\2\\3T\\4\\5\\6", $evt['debut']);
310 $evt['fin'] = preg_replace('/(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)/', "\\1\\2\\3T\\4\\5\\6", $evt['fin']);
312 foreach ($evt['moments'] as $m) {
313 $evt['descriptif'] .= "\n\n** " . $m['titre'] . " **\n" . $m['details'];
316 $page->changeTpl('xnetevents/calendar.tpl', NO_SKIN
);
318 require_once('ical.inc.php');
319 $page->assign('asso', $globals->asso());
320 $page->assign('timestamp', time());
321 $page->assign('admin', may_update());
324 $page->assign('participants', get_event_participants($evt, null
, 'promo, nom, prenom'));
326 $page->register_function('display_ical', 'display_ical');
327 $page->assign_by_ref('e', $evt);
329 header('Content-Type: text/calendar; charset=utf-8');
332 function handler_edit(&$page, $eid = null
)
336 // get eid if the the given one is a short name
337 if (!is_null($eid) && !is_numeric($eid)) {
338 $res = XDB
::query("SELECT eid
339 FROM groupex.evenements
340 WHERE asso_id = {?} AND short_name = {?}",
341 $globals->asso('id'), $eid);
342 if ($res->numRows()) {
343 $eid = (int)$res->fetchOneCell();
347 // check the event is in our group
348 if (!is_null($eid)) {
349 $res = XDB
::query("SELECT short_name
350 FROM groupex.evenements
351 WHERE eid = {?} AND asso_id = {?}",
352 $eid, $globals->asso('id'));
353 if ($res->numRows()) {
354 $infos = $res->fetchOneAssoc();
360 $page->changeTpl('xnetevents/edit.tpl');
362 $moments = range(1, 4);
364 $page->assign('moments', $moments);
366 if (Post
::v('intitule')) {
367 S
::assert_xsrf_token();
369 require_once dirname(__FILE__
).'/xnetevents/xnetevents.inc.php';
370 $short_name = event_change_shortname($page, $eid,
371 $infos['short_name'],
372 Env
::v('short_name', ''));
373 if ($short_name != Env
::v('short_name')) {
378 'asso_id' => $globals->asso('id'),
379 'paiement_id' => Post
::v('paiement_id') > 0 ? Post
::v('paiement_id') : null
,
380 'debut' => Post
::v('deb_Year').'-'.Post
::v('deb_Month')
381 .'-'.Post
::v('deb_Day').' '.Post
::v('deb_Hour')
382 .':'.Post
::v('deb_Minute').':00',
383 'fin' => Post
::v('fin_Year').'-'.Post
::v('fin_Month')
384 .'-'.Post
::v('fin_Day').' '.Post
::v('fin_Hour')
385 .':'.Post
::v('fin_Minute').':00',
386 'short_name' => $short_name,
389 $trivial = array('intitule', 'descriptif', 'noinvite',
390 'show_participants', 'accept_nonmembre', 'organisateur_uid');
391 foreach ($trivial as $k) {
392 $evt[$k] = Post
::v($k);
395 $evt['organisateur_uid'] = S
::v('uid');
398 if (Post
::v('deadline')) {
399 $evt['deadline_inscription'] = Post
::v('inscr_Year').'-'
400 . Post
::v('inscr_Month').'-'
401 . Post
::v('inscr_Day');
403 $evt['deadline_inscription'] = null
;
406 // Store the modifications in the database
407 XDB
::execute('REPLACE INTO groupex.evenements
408 SET eid={?}, asso_id={?}, organisateur_uid={?}, intitule={?},
409 paiement_id = {?}, descriptif = {?}, debut = {?},
410 fin = {?}, show_participants = {?}, short_name = {?},
411 deadline_inscription = {?}, noinvite = {?},
412 accept_nonmembre = {?}',
413 $evt['eid'], $evt['asso_id'], $evt['organisateur_uid'],
414 $evt['intitule'], $evt['paiement_id'], $evt['descriptif'],
415 $evt['debut'], $evt['fin'], $evt['show_participants'],
416 $evt['short_name'], $evt['deadline_inscription'],
417 $evt['noinvite'], $evt['accept_nonmembre']);
419 // if new event, get its id
421 $eid = XDB
::insertId();
427 foreach ($moments as $i) {
428 if (Post
::v('titre'.$i)) {
431 $montant = strtr(Post
::v('montant'.$i), ',', '.');
432 $money_defaut +
= (float)$montant;
434 REPLACE INTO groupex.evenements_items
435 VALUES ({?}, {?}, {?}, {?}, {?})",
436 $eid, $i, Post
::v('titre'.$i),
437 Post
::v('details'.$i), $montant);
439 XDB
::execute("DELETE FROM groupex.evenements_items
440 WHERE eid = {?} AND item_id = {?}", $eid, $i);
443 // request for a new payment
444 if (Post
::v('paiement_id') == -1 && $money_defaut >= 0) {
445 require_once 'validations.inc.php';
446 $p = new PayReq(S
::v('uid'),
447 Post
::v('intitule')." - ".$globals->asso('nom'),
448 Post
::v('site'), $money_defaut,
449 Post
::v('confirmation'), 0, 999,
450 $globals->asso('id'), $eid);
454 $page->assign('paiement_message', Post
::v('confirmation'));
455 $page->assign('paiement_site', Post
::v('site'));
460 // events with no sub-event: add a sub-event with no name
461 if ($nb_moments == 0) {
462 XDB
::execute("INSERT INTO groupex.evenements_items
463 VALUES ({?}, {?}, '', '', 0)", $eid, 1);
467 pl_redirect('events');
471 // get a list of all the payment for this asso
472 $res = XDB
::iterator("SELECT id, text
473 FROM {$globals->money->mpay_tprefix}paiements
474 WHERE asso_id = {?}", $globals->asso('id'));
475 $paiements = array();
476 while ($a = $res->next()) $paiements[$a['id']] = $a['text']; {
477 $page->assign('paiements', $paiements);
480 // when modifying an old event retreive the old datas
483 "SELECT eid, intitule, descriptif, debut, fin, organisateur_uid,
484 show_participants, paiement_id, short_name,
485 deadline_inscription, noinvite, accept_nonmembre
486 FROM groupex.evenements
487 WHERE eid = {?}", $eid);
488 $evt = $res->fetchOneAssoc();
489 // find out if there is already a request for a payment for this event
490 require_once 'validations.inc.php';
491 $res = XDB
::query("SELECT stamp FROM requests
492 WHERE type = 'paiements' AND data LIKE {?}",
493 PayReq
::same_event($eid, $globals->asso('id')));
494 $stamp = $res->fetchOneCell();
496 $evt['paiement_id'] = -2;
497 $evt['paiement_req'] = $stamp;
499 $page->assign('evt', $evt);
500 // get all the different moments infos
501 $res = XDB
::iterator(
502 "SELECT item_id, titre, details, montant
503 FROM groupex.evenements_items AS ei
504 INNER JOIN groupex.evenements AS e ON(e.eid = ei.eid)
506 ORDER BY item_id", $eid);
508 while ($item = $res->next()) {
509 $items[$item['item_id']] = $item;
511 $page->assign('items', $items);
513 $page->assign('url_ref', $eid);
516 function handler_admin(&$page, $eid = null
, $item_id = null
)
520 require_once dirname(__FILE__
).'/xnetevents/xnetevents.inc.php';
522 $evt = get_event_detail($eid, $item_id);
527 $page->changeTpl('xnetevents/admin.tpl');
528 if (!$evt['show_participants'] && !may_update()) {
532 if (may_update() && Post
::v('adm')) {
533 S
::assert_xsrf_token();
535 $member = get_infos(Post
::v('mail'));
537 $page->trigError("Membre introuvable");
540 // change the price paid by a participant
541 if (Env
::v('adm') == 'prix' && $member) {
542 XDB
::execute("UPDATE groupex.evenements_participants
543 SET paid = IF(paid + {?} > 0, paid + {?}, 0)
544 WHERE uid = {?} AND eid = {?} AND item_id = 1",
545 strtr(Env
::v('montant'), ',', '.'),
546 strtr(Env
::v('montant'), ',', '.'),
547 $member['uid'], $evt['eid']);
550 // change the number of personns coming with a participant
551 if (Env
::v('adm') == 'nbs' && $member) {
552 $res = XDB
::query("SELECT paid
553 FROM groupex.evenements_participants
554 WHERE uid = {?} AND eid = {?}",
555 $member['uid'], $evt['eid']);
557 $paid = intval($res->fetchOneCell());
558 $nbs = Post
::v('nb', array());
560 foreach ($nbs as $id => $nb) {
561 $nb = max(intval($nb), 0);
562 XDB
::execute("REPLACE INTO groupex.evenements_participants
563 VALUES ({?}, {?}, {?}, {?}, {?}, {?})",
564 $evt['eid'], $member['uid'], $id, $nb, '', $id == 1 ?
$paid : 0);
567 $res = XDB
::query("SELECT COUNT(uid) AS cnt, SUM(nb) AS nb
568 FROM groupex.evenements_participants
569 WHERE uid = {?} AND eid = {?}
571 $member['uid'], $evt['eid']);
572 $u = $res->fetchOneAssoc();
573 $u = $u['cnt'] ?
$u['nb'] : null
;
574 subscribe_lists_event($u, $member['uid'], $evt);
577 $evt = get_event_detail($eid, $item_id);
580 $page->assign_by_ref('evt', $evt);
581 $page->assign('tout', is_null($item_id));
583 if (count($evt['moments'])) {
584 $page->assign('moments', $evt['moments']);
587 $tri = (Env
::v('order') == 'alpha' ?
'promo, nom, prenom' : 'nom, prenom, promo');
588 $whereitemid = is_null($item_id) ?
'' : "AND ep.item_id = $item_id";
590 'SELECT UPPER(SUBSTRING(IF(u.nom IS NULL, m.nom,
591 IF(u.nom_usage<>"", u.nom_usage, u.nom)), 1, 1)),
592 COUNT(DISTINCT ep.uid)
593 FROM groupex.evenements_participants AS ep
594 INNER JOIN groupex.evenements AS e ON (ep.eid = e.eid)
595 LEFT JOIN groupex.membres AS m ON ( ep.uid = m.uid AND e.asso_id = m.asso_id)
596 LEFT JOIN auth_user_md5 AS u ON ( u.user_id = ep.uid )
597 WHERE ep.eid = {?} '.$whereitemid . '
598 GROUP BY UPPER(SUBSTRING(IF(u.nom IS NULL,m.nom,u.nom), 1, 1))', $evt['eid']);
602 while (list($char, $nb) = $res->next()) {
603 $alphabet[ord($char)] = $char;
605 if (Env
::has('initiale') && $char == strtoupper(Env
::v('initiale'))) {
610 $page->assign('alphabet', $alphabet);
612 if ($evt['paiement_id']) {
613 $res = XDB
::iterator(
614 "SELECT IF(u.nom_usage<>'', u.nom_usage, u.nom) AS nom, u.prenom,
615 u.promo, a.alias AS email, t.montant
616 FROM {$globals->money->mpay_tprefix}transactions AS t
617 INNER JOIN auth_user_md5 AS u ON(t.uid = u.user_id)
618 INNER JOIN aliases AS a ON (a.id = t.uid AND a.type='a_vie' )
619 LEFT JOIN groupex.evenements_participants AS ep ON(ep.uid = t.uid AND ep.eid = {?})
620 WHERE t.ref = {?} AND ep.uid IS NULL",
621 $evt['eid'], $evt['paiement_id']);
622 $page->assign('oublis', $res->total());
623 $page->assign('oubliinscription', $res);
626 $absents = XDB
::iterator("SELECT p.uid,
627 IF(m.origine = 'X', IF(u.nom_usage != '', u.nom_usage, u.nom), m.nom) AS nom,
628 IF(m.origine = 'X', u.prenom, u.prenom) AS prenom,
629 IF(m.origine = 'X', u.promo, m.origine) AS promo,
630 IF(m.origine = 'X', FIND_IN_SET('femme', u.flags), m.sexe) AS sexe,
631 IF(m.origine = 'X', a.alias, m.email) AS email
632 FROM groupex.evenements_participants AS p
633 INNER JOIN groupex.membres AS m USING(uid)
634 LEFT JOIN groupex.evenements_participants AS p2 ON (p2.uid = m.uid AND p2.eid = p.eid
636 LEFT JOIN auth_user_md5 AS u ON (u.user_id = m.uid)
637 LEFT JOIN aliases AS a ON (a.id = u.user_id AND a.type = 'a_vie')
638 WHERE p.eid = {?} AND p2.eid IS NULL
639 " . (Env
::v('initiale') ?
" AND IF(u.nom IS NULL, m.nom,
640 IF(u.nom_usage<>'', u.nom_usage, u.nom)) LIKE '" . Env
::v('initiale') . "%'"
643 ORDER BY nom, prenom, promo", $evt['eid']);
645 $ofs = Env
::i('offset');
646 $tot = (Env
::v('initiale') ?
$tot : $nb_tot) - $absents->total();
647 $nbp = intval(($tot-1)/NB_PER_PAGE
);
650 $links['précédent'] = $ofs-1;
652 for ($i = 0; $i <= $nbp; $i++
) {
653 $links[(string)($i+
1)] = $i;
656 $links['suivant'] = $ofs+
1;
658 if (count($links)>1) {
659 $page->assign('links', $links);
663 $page->assign('absents', $absents);
664 $page->assign('participants',
665 get_event_participants($evt, $item_id, $tri,
666 "LIMIT ".($ofs*NB_PER_PAGE
).", ".NB_PER_PAGE
));
670 // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8: