2 /***************************************************************************
3 * Copyright (C) 2003-2009 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')));
101 $globals->updateNbValid();
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 first_day, LEFT(10, e.fin) AS last_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;
136 $this->load('xnetevents.inc.php');
138 while ($e = $evenements->next()) {
139 if (!is_member() && !may_update() && !$e['accept_nonmembre']) {
140 $undisplayed_events ++
;
144 $e['show_participants'] = ($e['show_participants'] && (is_member() ||
may_update()));
146 "SELECT titre, details, montant, ei.item_id, nb, ep.paid
147 FROM groupex.evenements_items AS ei
148 LEFT JOIN groupex.evenements_participants AS ep
149 ON (ep.eid = ei.eid AND ep.item_id = ei.item_id AND uid = {?})
151 S
::v('uid'), $e['eid']);
152 $e['moments'] = $res->fetchAllAssoc();
155 $e['paid'] = $e['moments'][0]['paid'];
156 foreach ($e['moments'] as $m) {
157 $e['topay'] +
= $m['nb'] * $m['montant'];
162 FROM {$globals->money->mpay_tprefix}transactions AS t
163 WHERE ref = {?} AND uid = {?}", $e['paiement_id'], S
::v('uid'));
164 $montants = $query->fetchColumn();
166 foreach ($montants as $m) {
167 $p = strtr(substr($m, 0, strpos($m, 'EUR')), ',', '.');
168 $e['paid'] +
= trim($p);
173 if (Env
::has('updated') && $e['eid'] == Env
::i('updated')) {
174 $page->assign('updated', $e);
179 $page->assign('evenements', $evts);
180 $page->assign('undisplayed_events', $undisplayed_events);
183 function handler_sub(&$page, $eid = null
)
185 $this->load('xnetevents.inc.php');
186 $page->changeTpl('xnetevents/subscribe.tpl');
188 $evt = get_event_detail($eid);
192 if ($evt === false
) {
193 global $globals, $platal;
194 $url = $globals->asso('sub_url');
196 $url = $platal->ns
. 'subscribe';
198 $page->kill('Cet événement est reservé aux membres du groupe ' . $globals->asso('nom') .
199 '. Pour devenir membre, rends-toi sur la page de <a href="' . $url . '">demande d\'inscripton</a>.');
202 if (!$evt['inscr_open']) {
203 $page->kill('Les inscriptions pour cet événement sont closes');
205 if (!$evt['accept_nonmembre'] && !is_member() && !may_update()) {
206 $page->kill('Cet événement est fermé aux non-membres du groupe');
210 $res = XDB
::query("SELECT stamp FROM requests
211 WHERE type = 'paiements' AND data LIKE {?}",
212 PayReq
::same_event($evt['eid'], $globals->asso('id')));
213 $page->assign('validation', $res->numRows());
214 $page->assign('event', $evt);
216 if (!Post
::has('submit')) {
219 S
::assert_xsrf_token();
222 $moments = Post
::v('moment', array());
223 $pers = Post
::v('personnes', array());
226 foreach ($moments as $j => $v) {
227 $subs[$j] = intval($v);
229 // retreive ohter field when more than one person
230 if ($subs[$j] == 2) {
231 if (!isset($pers[$j]) ||
!is_numeric($pers[$j])
234 $page->trigError('Tu dois choisir un nombre d\'invités correct !');
237 $subs[$j] = 1 +
$pers[$j];
241 // impossible to unsubscribe if you already paid sthing
242 if (!array_sum($subs) && $evt['paid'] != 0) {
243 $page->trigError("Impossible de te désinscrire complètement ".
244 "parce que tu as fait un paiement par ".
245 "chèque ou par liquide. Contacte un ".
246 "administrateur du groupe si tu es sûr de ".
251 // update actual inscriptions
254 $paid = $evt['paid'] ?
$evt['paid'] : 0;
255 $telepaid= $evt['telepaid'] ?
$evt['telepaid'] : 0;
256 foreach ($subs as $j => $nb) {
259 "REPLACE INTO groupex.evenements_participants
260 VALUES ({?}, {?}, {?}, {?}, {?}, {?})",
261 $eid, S
::v('uid'), $j, $nb, Env
::has('notify_payment') ?
'notify_payment' : '',
262 $j == 1 ?
$paid - $telepaid : 0);
266 "DELETE FROM groupex.evenements_participants
267 WHERE eid = {?} AND uid = {?} AND item_id = {?}",
268 $eid, S
::v("uid"), $j);
273 if ($updated !== false
) {
274 $page->trigSuccess('Ton inscription à l\'événement a été mise à jour avec succès.');
275 subscribe_lists_event($total, S
::i('uid'), $evt);
277 $page->assign('event', get_event_detail($eid));
280 function handler_csv(&$page, $eid = null
, $item_id = null
)
282 $this->load('xnetevents.inc.php');
284 if (!is_numeric($item_id)) {
288 $evt = get_event_detail($eid, $item_id);
293 header('Content-type: text/x-csv; encoding=UTF-8');
295 header('Cache-Control: ');
297 $page->changeTpl('xnetevents/csv.tpl', NO_SKIN
);
299 $admin = may_update();
301 $tri = (Env
::v('order') == 'alpha' ?
'promo, nom, prenom' : 'nom, prenom, promo');
303 $page->assign('participants',
304 get_event_participants($evt, $item_id, $tri));
306 $page->assign('admin', $admin);
307 $page->assign('moments', $evt['moments']);
308 $page->assign('money', $evt['money']);
309 $page->assign('telepayment', $evt['paiement_id']);
310 $page->assign('tout', !Env
::v('item_id', false
));
313 function handler_ical(&$page, $eid = null
)
317 $this->load('xnetevents.inc.php');
318 $evt = get_event_detail($eid);
322 $evt['debut'] = preg_replace('/(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)/', "\\1\\2\\3T\\4\\5\\6", $evt['debut']);
323 $evt['fin'] = preg_replace('/(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)/', "\\1\\2\\3T\\4\\5\\6", $evt['fin']);
325 foreach ($evt['moments'] as $m) {
326 $evt['descriptif'] .= "\n\n** " . $m['titre'] . " **\n" . $m['details'];
329 $page->changeTpl('xnetevents/calendar.tpl', NO_SKIN
);
331 require_once('ical.inc.php');
332 $page->assign('asso', $globals->asso());
333 $page->assign('timestamp', time());
334 $page->assign('admin', may_update());
337 $page->assign('participants', get_event_participants($evt, null
, 'promo, nom, prenom'));
339 $page->register_function('display_ical', 'display_ical');
340 $page->assign_by_ref('e', $evt);
342 header('Content-Type: text/calendar; charset=utf-8');
345 function handler_edit(&$page, $eid = null
)
349 // get eid if the the given one is a short name
350 if (!is_null($eid) && !is_numeric($eid)) {
351 $res = XDB
::query("SELECT eid
352 FROM groupex.evenements
353 WHERE asso_id = {?} AND short_name = {?}",
354 $globals->asso('id'), $eid);
355 if ($res->numRows()) {
356 $eid = (int)$res->fetchOneCell();
360 // check the event is in our group
361 if (!is_null($eid)) {
362 $res = XDB
::query("SELECT short_name
363 FROM groupex.evenements
364 WHERE eid = {?} AND asso_id = {?}",
365 $eid, $globals->asso('id'));
366 if ($res->numRows()) {
367 $infos = $res->fetchOneAssoc();
373 $page->changeTpl('xnetevents/edit.tpl');
375 $moments = range(1, 4);
377 $page->assign('moments', $moments);
379 if (Post
::v('intitule')) {
380 S
::assert_xsrf_token();
382 $this->load('xnetevents.inc.php');
383 $short_name = event_change_shortname($page, $eid,
384 $infos['short_name'],
385 Env
::v('short_name', ''));
386 if ($short_name != Env
::v('short_name')) {
391 'asso_id' => $globals->asso('id'),
392 'paiement_id' => Post
::v('paiement_id') > 0 ? Post
::v('paiement_id') : null
,
393 'debut' => Post
::v('deb_Year').'-'.Post
::v('deb_Month')
394 .'-'.Post
::v('deb_Day').' '.Post
::v('deb_Hour')
395 .':'.Post
::v('deb_Minute').':00',
396 'fin' => Post
::v('fin_Year').'-'.Post
::v('fin_Month')
397 .'-'.Post
::v('fin_Day').' '.Post
::v('fin_Hour')
398 .':'.Post
::v('fin_Minute').':00',
399 'short_name' => $short_name,
402 $trivial = array('intitule', 'descriptif', 'noinvite',
403 'show_participants', 'accept_nonmembre', 'organisateur_uid');
404 foreach ($trivial as $k) {
405 $evt[$k] = Post
::v($k);
408 $evt['organisateur_uid'] = S
::v('uid');
411 if (Post
::v('deadline')) {
412 $evt['deadline_inscription'] = Post
::v('inscr_Year').'-'
413 . Post
::v('inscr_Month').'-'
414 . Post
::v('inscr_Day');
416 $evt['deadline_inscription'] = null
;
419 // Store the modifications in the database
420 XDB
::execute('REPLACE INTO groupex.evenements
421 SET eid={?}, asso_id={?}, organisateur_uid={?}, intitule={?},
422 paiement_id = {?}, descriptif = {?}, debut = {?},
423 fin = {?}, show_participants = {?}, short_name = {?},
424 deadline_inscription = {?}, noinvite = {?},
425 accept_nonmembre = {?}',
426 $evt['eid'], $evt['asso_id'], $evt['organisateur_uid'],
427 $evt['intitule'], $evt['paiement_id'], $evt['descriptif'],
428 $evt['debut'], $evt['fin'], $evt['show_participants'],
429 $evt['short_name'], $evt['deadline_inscription'],
430 $evt['noinvite'], $evt['accept_nonmembre']);
432 // if new event, get its id
434 $eid = XDB
::insertId();
440 foreach ($moments as $i) {
441 if (Post
::v('titre'.$i)) {
444 $montant = strtr(Post
::v('montant'.$i), ',', '.');
445 $money_defaut +
= (float)$montant;
447 REPLACE INTO groupex.evenements_items
448 VALUES ({?}, {?}, {?}, {?}, {?})",
449 $eid, $i, Post
::v('titre'.$i),
450 Post
::v('details'.$i), $montant);
452 XDB
::execute("DELETE FROM groupex.evenements_items
453 WHERE eid = {?} AND item_id = {?}", $eid, $i);
456 // request for a new payment
457 if (Post
::v('paiement_id') == -1 && $money_defaut >= 0) {
458 require_once 'validations.inc.php';
459 $p = new PayReq(S
::user(),
460 Post
::v('intitule')." - ".$globals->asso('nom'),
461 Post
::v('site'), $money_defaut,
462 Post
::v('confirmation'), 0, 999,
463 $globals->asso('id'), $eid);
467 $page->assign('paiement_message', Post
::v('confirmation'));
468 $page->assign('paiement_site', Post
::v('site'));
473 // events with no sub-event: add a sub-event with no name
474 if ($nb_moments == 0) {
475 XDB
::execute("INSERT INTO groupex.evenements_items
476 VALUES ({?}, {?}, '', '', 0)", $eid, 1);
480 pl_redirect('events');
484 // get a list of all the payment for this asso
485 $res = XDB
::iterator("SELECT id, text
486 FROM {$globals->money->mpay_tprefix}paiements
487 WHERE asso_id = {?}", $globals->asso('id'));
488 $paiements = array();
489 while ($a = $res->next()) $paiements[$a['id']] = $a['text']; {
490 $page->assign('paiements', $paiements);
493 // when modifying an old event retreive the old datas
496 "SELECT eid, intitule, descriptif, debut, fin, organisateur_uid,
497 show_participants, paiement_id, short_name,
498 deadline_inscription, noinvite, accept_nonmembre
499 FROM groupex.evenements
500 WHERE eid = {?}", $eid);
501 $evt = $res->fetchOneAssoc();
502 // find out if there is already a request for a payment for this event
503 require_once 'validations.inc.php';
504 $res = XDB
::query("SELECT stamp FROM requests
505 WHERE type = 'paiements' AND data LIKE {?}",
506 PayReq
::same_event($eid, $globals->asso('id')));
507 $stamp = $res->fetchOneCell();
509 $evt['paiement_id'] = -2;
510 $evt['paiement_req'] = $stamp;
512 $page->assign('evt', $evt);
513 // get all the different moments infos
514 $res = XDB
::iterator(
515 "SELECT item_id, titre, details, montant
516 FROM groupex.evenements_items AS ei
517 INNER JOIN groupex.evenements AS e ON(e.eid = ei.eid)
519 ORDER BY item_id", $eid);
521 while ($item = $res->next()) {
522 $items[$item['item_id']] = $item;
524 $page->assign('items', $items);
526 $page->assign('url_ref', $eid);
529 function handler_admin(&$page, $eid = null
, $item_id = null
)
533 $this->load('xnetevents.inc.php');
535 $evt = get_event_detail($eid, $item_id);
540 $page->changeTpl('xnetevents/admin.tpl');
541 if (!$evt['show_participants'] && !may_update()) {
545 if (may_update() && Post
::v('adm')) {
546 S
::assert_xsrf_token();
548 $member = get_infos(Post
::v('mail'));
550 $page->trigError("Membre introuvable");
553 // change the price paid by a participant
554 if (Env
::v('adm') == 'prix' && $member) {
555 XDB
::execute("UPDATE groupex.evenements_participants
556 SET paid = IF(paid + {?} > 0, paid + {?}, 0)
557 WHERE uid = {?} AND eid = {?} AND item_id = 1",
558 strtr(Env
::v('montant'), ',', '.'),
559 strtr(Env
::v('montant'), ',', '.'),
560 $member['uid'], $evt['eid']);
563 // change the number of personns coming with a participant
564 if (Env
::v('adm') == 'nbs' && $member) {
565 $res = XDB
::query("SELECT paid
566 FROM groupex.evenements_participants
567 WHERE uid = {?} AND eid = {?}",
568 $member['uid'], $evt['eid']);
570 $paid = intval($res->fetchOneCell());
571 $nbs = Post
::v('nb', array());
573 foreach ($nbs as $id => $nb) {
574 $nb = max(intval($nb), 0);
575 XDB
::execute("REPLACE INTO groupex.evenements_participants
576 VALUES ({?}, {?}, {?}, {?}, {?}, {?})",
577 $evt['eid'], $member['uid'], $id, $nb, '', $id == 1 ?
$paid : 0);
580 $res = XDB
::query("SELECT COUNT(uid) AS cnt, SUM(nb) AS nb
581 FROM groupex.evenements_participants
582 WHERE uid = {?} AND eid = {?}
584 $member['uid'], $evt['eid']);
585 $u = $res->fetchOneAssoc();
586 $u = $u['cnt'] ?
$u['nb'] : null
;
587 subscribe_lists_event($u, $member['uid'], $evt);
590 $evt = get_event_detail($eid, $item_id);
593 $page->assign_by_ref('evt', $evt);
594 $page->assign('tout', is_null($item_id));
596 if (count($evt['moments'])) {
597 $page->assign('moments', $evt['moments']);
600 $tri = (Env
::v('order') == 'alpha' ?
'promo, nom, prenom' : 'nom, prenom, promo');
601 $whereitemid = is_null($item_id) ?
'' : "AND ep.item_id = $item_id";
603 'SELECT UPPER(SUBSTRING(IF(u.nom IS NULL, m.nom,
604 IF(u.nom_usage<>"", u.nom_usage, u.nom)), 1, 1)),
605 COUNT(DISTINCT ep.uid)
606 FROM groupex.evenements_participants AS ep
607 INNER JOIN groupex.evenements AS e ON (ep.eid = e.eid)
608 LEFT JOIN groupex.membres AS m ON ( ep.uid = m.uid AND e.asso_id = m.asso_id)
609 LEFT JOIN auth_user_md5 AS u ON ( u.user_id = ep.uid )
610 WHERE ep.eid = {?} '.$whereitemid . '
611 GROUP BY UPPER(SUBSTRING(IF(u.nom IS NULL,m.nom,u.nom), 1, 1))', $evt['eid']);
615 while (list($char, $nb) = $res->next()) {
616 $alphabet[ord($char)] = $char;
618 if (Env
::has('initiale') && $char == strtoupper(Env
::v('initiale'))) {
623 $page->assign('alphabet', $alphabet);
625 if ($evt['paiement_id']) {
626 $res = XDB
::iterator(
627 "SELECT IF(u.nom_usage<>'', u.nom_usage, u.nom) AS nom, u.prenom,
628 u.promo, a.alias AS email, t.montant
629 FROM {$globals->money->mpay_tprefix}transactions AS t
630 INNER JOIN auth_user_md5 AS u ON(t.uid = u.user_id)
631 INNER JOIN aliases AS a ON (a.id = t.uid AND a.type='a_vie' )
632 LEFT JOIN groupex.evenements_participants AS ep ON(ep.uid = t.uid AND ep.eid = {?})
633 WHERE t.ref = {?} AND ep.uid IS NULL",
634 $evt['eid'], $evt['paiement_id']);
635 $page->assign('oublis', $res->total());
636 $page->assign('oubliinscription', $res);
639 $absents = XDB
::iterator("SELECT p.uid,
640 IF(m.origine = 'X', IF(u.nom_usage != '', u.nom_usage, u.nom), m.nom) AS nom,
641 IF(m.origine = 'X', u.prenom, u.prenom) AS prenom,
642 IF(m.origine = 'X', u.promo, m.origine) AS promo,
643 IF(m.origine = 'X', FIND_IN_SET('femme', u.flags), m.sexe) AS sexe,
644 IF(m.origine = 'X', a.alias, m.email) AS email
645 FROM groupex.evenements_participants AS p
646 INNER JOIN groupex.membres AS m USING(uid)
647 LEFT JOIN groupex.evenements_participants AS p2 ON (p2.uid = m.uid AND p2.eid = p.eid
649 LEFT JOIN auth_user_md5 AS u ON (u.user_id = m.uid)
650 LEFT JOIN aliases AS a ON (a.id = u.user_id AND a.type = 'a_vie')
651 WHERE p.eid = {?} AND p2.eid IS NULL
652 " . (Env
::v('initiale') ?
" AND IF(u.nom IS NULL, m.nom,
653 IF(u.nom_usage<>'', u.nom_usage, u.nom)) LIKE '" . Env
::v('initiale') . "%'"
656 ORDER BY nom, prenom, promo", $evt['eid']);
658 $ofs = Env
::i('offset');
659 $tot = (Env
::v('initiale') ?
$tot : $nb_tot);
660 $nbp = ceil($tot / NB_PER_PAGE
);
664 $links['précédent'] = $ofs - 1;
666 for ($i = 1 ; $i <= $nbp; $i++
) {
667 $links[(string)$i] = $i - 1;
670 $links['suivant'] = $ofs+
1;
672 $page->assign('links', $links);
676 $page->assign('absents', $absents);
677 $page->assign('participants',
678 get_event_participants($evt, $item_id, $tri,
679 "LIMIT ".($ofs*NB_PER_PAGE
).", ".NB_PER_PAGE
));
683 // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8: