2 /***************************************************************************
3 * Copyright (C) 2003-2007 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)) {
62 $res = XDB
::query("SELECT asso_id, short_name FROM groupex.evenements
63 WHERE eid = {?} AND asso_id = {?}",
64 $eid, $globals->asso('id'));
66 $tmp = $res->fetchOneRow();
72 if ($action == 'del') {
73 // deletes the event mailing aliases
76 "DELETE FROM virtual WHERE type = 'evt' AND alias LIKE {?}",
77 $tmp[1].'-absents@%');
79 "DELETE FROM virtual WHERE type = 'evt' AND alias LIKE {?}",
80 $tmp[1].'-participants@%');
83 // deletes the event items
84 XDB
::execute("DELETE FROM groupex.evenements_items WHERE eid = {?}", $eid);
86 // deletes the event participants
87 XDB
::execute("DELETE FROM groupex.evenements_participants
88 WHERE eid = {?}", $eid);
91 XDB
::execute("DELETE FROM groupex.evenements
92 WHERE eid = {?} AND asso_id = {?}",
93 $eid, $globals->asso('id'));
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')));
102 if ($action == 'archive') {
103 XDB
::execute("UPDATE groupex.evenements
105 WHERE eid = {?} AND asso_id = {?}",
106 $eid, $globals->asso('id'));
109 if ($action == 'unarchive') {
110 XDB
::execute("UPDATE groupex.evenements
112 WHERE eid = {?} AND asso_id = {?}",
113 $eid, $globals->asso('id'));
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 = {?})
128 AND archive = " . ($archive ?
"1 " : "0 ")
129 . (is_member() ||
may_update() ?
"" : " AND accept_nonmembre != 0 ")
131 ORDER BY inscr_open DESC, debut DESC", S
::v('uid'), $globals->asso('id'));
135 while ($e = $evenements->next()) {
136 $e['show_participants'] = ($e['show_participants'] && (is_member() ||
may_update()));
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 = {?})
143 S
::v('uid'), $e['eid']);
144 $e['moments'] = $res->fetchAllAssoc();
147 $e['paid'] = $e['moments'][0]['paid'];
148 foreach ($e['moments'] as $m) {
149 $e['topay'] +
= $m['nb'] * $m['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();
158 foreach ($montants as $m) {
159 $p = strtr(substr($m, 0, strpos($m, 'EUR')), ',', '.');
160 $e['paid'] +
= trim($p);
163 if (Env
::has('updated') && $e['eid'] == Env
::i('updated')) {
164 $page->assign('updated', $e);
169 $page->assign('evenements', $evts);
172 function handler_sub(&$page, $eid = null
)
174 require_once dirname(__FILE__
).'/xnetevents/xnetevents.inc.php';
175 $page->changeTpl('xnetevents/subscribe.tpl');
177 $evt = get_event_detail($eid);
182 if (!$evt['inscr_open']) {
183 $page->kill('Les inscriptions pour cet événement sont closes');
185 if (!$evt['accept_nonmembre'] && !is_member() && !may_update()) {
186 $page->kill('Cet événement est fermé aux non-membres du groupe');
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);
196 if (!Post
::has('submit')) {
200 $moments = Post
::v('moment', array());
201 $pers = Post
::v('personnes', array());
204 foreach ($moments as $j => $v) {
205 $subs[$j] = intval($v);
207 // retreive ohter field when more than one person
208 if ($subs[$j] == 2) {
209 if (!isset($pers[$j]) ||
!is_numeric($pers[$j])
212 $page->trig('Tu dois choisir un nombre d\'invités correct !');
215 $subs[$j] = 1 +
$pers[$j];
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 ".
229 // update actual inscriptions
232 $paid = $evt['paid'] ?
$evt['paid'] : 0;
233 $telepaid= $evt['telepaid'] ?
$evt['telepaid'] : 0;
234 foreach ($subs as $j => $nb) {
237 "REPLACE INTO groupex.evenements_participants
238 VALUES ({?}, {?}, {?}, {?}, {?}, {?})",
239 $eid, S
::v('uid'), $j, $nb, Env
::has('notify_payment') ?
'notify_payment' : '',
240 $j == 1 ?
$paid - $telepaid : 0);
244 "DELETE FROM groupex.evenements_participants
245 WHERE eid = {?} AND uid = {?} AND item_id = {?}",
246 $eid, S
::v("uid"), $j);
251 if ($updated !== false
) {
252 subscribe_lists_event($total, S
::i('uid'), $evt);
254 $page->assign('event', get_event_detail($eid));
257 function handler_csv(&$page, $eid = null
, $item_id = null
)
259 require_once dirname(__FILE__
).'/xnetevents/xnetevents.inc.php';
261 if (!is_numeric($item_id)) {
265 $evt = get_event_detail($eid, $item_id);
270 header('Content-type: text/x-csv; encoding=UTF-8');
272 header('Cache-Control: ');
274 $page->changeTpl('xnetevents/csv.tpl', NO_SKIN
);
276 $admin = may_update();
278 $tri = (Env
::v('order') == 'alpha' ?
'promo, nom, prenom' : 'nom, prenom, promo');
280 $page->assign('participants',
281 get_event_participants($evt, $item_id, $tri));
283 $page->assign('admin', $admin);
284 $page->assign('moments', $evt['moments']);
285 $page->assign('money', $evt['money']);
286 $page->assign('tout', !Env
::v('item_id', false
));
289 function handler_ical(&$page, $eid = null
)
293 require_once dirname(__FILE__
).'/xnetevents/xnetevents.inc.php';
294 $evt = get_event_detail($eid);
298 $evt['debut'] = preg_replace('/(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)/', "\\1\\2\\3T\\4\\5\\6", $evt['debut']);
299 $evt['fin'] = preg_replace('/(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)/', "\\1\\2\\3T\\4\\5\\6", $evt['fin']);
301 foreach ($evt['moments'] as $m) {
302 $evt['descriptif'] .= "\n\n** " . $m['titre'] . " **\n" . $m['details'];
305 $page->changeTpl('xnetevents/calendar.tpl', NO_SKIN
);
307 require_once('ical.inc.php');
308 $page->assign('asso', $globals->asso());
309 $page->assign('timestamp', time());
310 $page->assign('admin', may_update());
313 $page->assign('participants', get_event_participants($evt, null
, 'promo, nom, prenom'));
315 $page->register_function('display_ical', 'display_ical');
316 $page->assign_by_ref('e', $evt);
318 header('Content-Type: text/calendar; charset=utf-8');
321 function handler_edit(&$page, $eid = null
)
325 // get eid if the the given one is a short name
326 if (!is_null($eid) && !is_numeric($eid)) {
327 $res = XDB
::query("SELECT eid
328 FROM groupex.evenements
329 WHERE asso_id = {?} AND short_name = {?}",
330 $globals->asso('id'), $eid);
331 if ($res->numRows()) {
332 $eid = (int)$res->fetchOneCell();
336 // check the event is in our group
337 if (!is_null($eid)) {
338 $res = XDB
::query("SELECT short_name
339 FROM groupex.evenements
340 WHERE eid = {?} AND asso_id = {?}",
341 $eid, $globals->asso('id'));
342 if ($res->numRows()) {
343 $infos = $res->fetchOneAssoc();
349 $page->changeTpl('xnetevents/edit.tpl');
351 $moments = range(1, 4);
353 $page->assign('moments', $moments);
355 if (Post
::v('intitule')) {
356 require_once dirname(__FILE__
).'/xnetevents/xnetevents.inc.php';
357 $short_name = event_change_shortname($page, $infos['short_name'],
358 Env
::v('short_name', ''));
359 if ($short_name != Env
::v('short_name')) {
364 'asso_id' => $globals->asso('id'),
365 'paiement_id' => Post
::v('paiement_id') > 0 ? Post
::v('paiement_id') : null
,
366 'debut' => Post
::v('deb_Year').'-'.Post
::v('deb_Month')
367 .'-'.Post
::v('deb_Day').' '.Post
::v('deb_Hour')
368 .':'.Post
::v('deb_Minute').':00',
369 'fin' => Post
::v('fin_Year').'-'.Post
::v('fin_Month')
370 .'-'.Post
::v('fin_Day').' '.Post
::v('fin_Hour')
371 .':'.Post
::v('fin_Minute').':00',
372 'short_name' => $short_name,
375 $trivial = array('intitule', 'descriptif', 'noinvite',
376 'show_participants', 'accept_nonmembre', 'organisateur_uid');
377 foreach ($trivial as $k) {
378 $evt[$k] = Post
::v($k);
381 $evt['organisateur_uid'] = S
::v('uid');
384 if (Post
::v('deadline')) {
385 $evt['deadline_inscription'] = Post
::v('inscr_Year').'-'
386 . Post
::v('inscr_Month').'-'
387 . Post
::v('inscr_Day');
389 $evt['deadline_inscription'] = null
;
392 // Store the modifications in the database
393 XDB
::execute('REPLACE INTO groupex.evenements
394 SET eid={?}, asso_id={?}, organisateur_uid={?}, intitule={?},
395 paiement_id = {?}, descriptif = {?}, debut = {?},
396 fin = {?}, show_participants = {?}, short_name = {?},
397 deadline_inscription = {?}, noinvite = {?},
398 accept_nonmembre = {?}',
399 $evt['eid'], $evt['asso_id'], $evt['organisateur_uid'],
400 $evt['intitule'], $evt['paiement_id'], $evt['descriptif'],
401 $evt['debut'], $evt['fin'], $evt['show_participants'],
402 $evt['short_name'], $evt['deadline_inscription'],
403 $evt['noinvite'], $evt['accept_nonmembre']);
405 // if new event, get its id
407 $eid = XDB
::insertId();
413 foreach ($moments as $i) {
414 if (Post
::v('titre'.$i)) {
417 $montant = strtr(Post
::v('montant'.$i), ',', '.');
418 $money_defaut +
= (float)$montant;
420 REPLACE INTO groupex.evenements_items
421 VALUES ({?}, {?}, {?}, {?}, {?})",
422 $eid, $i, Post
::v('titre'.$i),
423 Post
::v('details'.$i), $montant);
425 XDB
::execute("DELETE FROM groupex.evenements_items
426 WHERE eid = {?} AND item_id = {?}", $eid, $i);
429 // request for a new payment
430 if (Post
::v('paiement_id') == -1 && $money_defaut >= 0) {
431 require_once 'validations.inc.php';
432 $p = new PayReq(S
::v('uid'),
433 Post
::v('intitule')." - ".$globals->asso('nom'),
434 Post
::v('site'), $money_defaut,
435 Post
::v('confirmation'), 0, 999,
436 $globals->asso('id'), $eid);
440 $page->assign('paiement_message', Post
::v('confirmation'));
441 $page->assign('paiement_site', Post
::v('site'));
446 // events with no sub-event: add a sub-event with no name
447 if ($nb_moments == 0) {
448 XDB
::execute("INSERT INTO groupex.evenements_items
449 VALUES ({?}, {?}, '', '', 0)", $eid, 1);
453 pl_redirect('events');
457 // get a list of all the payment for this asso
458 $res = XDB
::iterator("SELECT id, text
459 FROM {$globals->money->mpay_tprefix}paiements
460 WHERE asso_id = {?}", $globals->asso('id'));
461 $paiements = array();
462 while ($a = $res->next()) $paiements[$a['id']] = $a['text']; {
463 $page->assign('paiements', $paiements);
466 // when modifying an old event retreive the old datas
469 "SELECT eid, intitule, descriptif, debut, fin, organisateur_uid,
470 show_participants, paiement_id, short_name,
471 deadline_inscription, noinvite, accept_nonmembre
472 FROM groupex.evenements
473 WHERE eid = {?}", $eid);
474 $evt = $res->fetchOneAssoc();
475 // find out if there is already a request for a payment for this event
476 require_once 'validations.inc.php';
477 $res = XDB
::query("SELECT stamp FROM requests
478 WHERE type = 'paiements' AND data LIKE {?}",
479 PayReq
::same_event($eid, $globals->asso('id')));
480 $stamp = $res->fetchOneCell();
482 $evt['paiement_id'] = -2;
483 $evt['paiement_req'] = $stamp;
485 $page->assign('evt', $evt);
486 // get all the different moments infos
487 $res = XDB
::iterator(
488 "SELECT item_id, titre, details, montant
489 FROM groupex.evenements_items AS ei
490 INNER JOIN groupex.evenements AS e ON(e.eid = ei.eid)
492 ORDER BY item_id", $eid);
494 while ($item = $res->next()) {
495 $items[$item['item_id']] = $item;
497 $page->assign('items', $items);
499 $page->assign('url_ref', $eid);
502 function handler_admin(&$page, $eid = null
, $item_id = null
)
506 require_once dirname(__FILE__
).'/xnetevents/xnetevents.inc.php';
508 $evt = get_event_detail($eid, $item_id);
513 $page->changeTpl('xnetevents/admin.tpl');
514 if (!$evt['show_participants'] && !may_update()) {
518 if (may_update() && Post
::v('adm')) {
519 $member = get_infos(Post
::v('mail'));
521 $page->trig("Membre introuvable");
524 // change the price paid by a participant
525 if (Env
::v('adm') == 'prix' && $member) {
526 XDB
::execute("UPDATE groupex.evenements_participants
527 SET paid = IF(paid + {?} > 0, paid + {?}, 0)
528 WHERE uid = {?} AND eid = {?} AND item_id = 1",
529 strtr(Env
::v('montant'), ',', '.'),
530 strtr(Env
::v('montant'), ',', '.'),
531 $member['uid'], $evt['eid']);
534 // change the number of personns coming with a participant
535 if (Env
::v('adm') == 'nbs' && $member) {
536 $res = XDB
::query("SELECT paid
537 FROM groupex.evenements_participants
538 WHERE uid = {?} AND eid = {?}",
539 $member['uid'], $evt['eid']);
541 $paid = intval($res->fetchOneCell());
542 $nbs = Post
::v('nb', array());
544 foreach ($nbs as $id => $nb) {
545 $nb = max(intval($nb), 0);
546 XDB
::execute("REPLACE INTO groupex.evenements_participants
547 VALUES ({?}, {?}, {?}, {?}, {?}, {?})",
548 $evt['eid'], $member['uid'], $id, $nb, '', $id == 1 ?
$paid : 0);
551 $res = XDB
::query("SELECT COUNT(uid) AS cnt, SUM(nb) AS nb
552 FROM groupex.evenements_participants
553 WHERE uid = {?} AND eid = {?}
555 $member['uid'], $evt['eid']);
556 $u = $res->fetchOneAssoc();
557 $u = $u['cnt'] ? null
: $u['nb'];
558 subscribe_lists_event($u, $member['uid'], $evt);
561 $evt = get_event_detail($eid, $item_id);
564 $page->assign('evt', $evt);
565 $page->assign('tout', is_null($item_id));
567 if (count($evt['moments'])) {
568 $page->assign('moments', $evt['moments']);
571 $tri = (Env
::v('order') == 'alpha' ?
'promo, nom, prenom' : 'nom, prenom, promo');
572 $whereitemid = is_null($item_id) ?
'' : "AND ep.item_id = $item_id";
574 'SELECT UPPER(SUBSTRING(IF(u.nom IS NULL, m.nom,
575 IF(u.nom_usage<>"", u.nom_usage, u.nom)), 1, 1)),
576 COUNT(DISTINCT ep.uid)
577 FROM groupex.evenements_participants AS ep
578 INNER JOIN groupex.evenements AS e ON (ep.eid = e.eid)
579 LEFT JOIN groupex.membres AS m ON ( ep.uid = m.uid AND e.asso_id = m.asso_id)
580 LEFT JOIN auth_user_md5 AS u ON ( u.user_id = ep.uid )
581 WHERE ep.eid = {?} '.$whereitemid . '
582 GROUP BY UPPER(SUBSTRING(IF(u.nom IS NULL,m.nom,u.nom), 1, 1))', $evt['eid']);
586 while (list($char, $nb) = $res->next()) {
587 $alphabet[ord($char)] = $char;
589 if (Env
::has('initiale') && $char == strtoupper(Env
::v('initiale'))) {
594 $page->assign('alphabet', $alphabet);
596 if ($evt['paiement_id']) {
597 $res = XDB
::iterator(
598 "SELECT IF(u.nom_usage<>'', u.nom_usage, u.nom) AS nom, u.prenom,
599 u.promo, a.alias AS email, t.montant
600 FROM {$globals->money->mpay_tprefix}transactions AS t
601 INNER JOIN auth_user_md5 AS u ON(t.uid = u.user_id)
602 INNER JOIN aliases AS a ON (a.id = t.uid AND a.type='a_vie' )
603 LEFT JOIN groupex.evenements_participants AS ep ON(ep.uid = t.uid AND ep.eid = {?})
604 WHERE t.ref = {?} AND ep.uid IS NULL",
605 $evt['eid'], $evt['paiement_id']);
606 $page->assign('oublis', $res->total());
607 $page->assign('oubliinscription', $res);
610 $absents = XDB
::iterator("SELECT p.uid,
611 IF(m.origine = 'X', IF(u.nom_usage != '', u.nom_usage, u.nom), m.nom) AS nom,
612 IF(m.origine = 'X', u.prenom, u.prenom) AS prenom,
613 IF(m.origine = 'X', u.promo, m.origine) AS promo,
614 IF(m.origine = 'X', FIND_IN_SET('femme', u.flags), m.sexe) AS sexe,
615 IF(m.origine = 'X', a.alias, m.email) AS email
616 FROM groupex.evenements_participants AS p
617 INNER JOIN groupex.membres AS m USING(uid)
618 LEFT JOIN groupex.evenements_participants AS p2 ON (p2.uid = m.uid AND p2.eid = p.eid
620 LEFT JOIN auth_user_md5 AS u ON (u.user_id = m.uid)
621 LEFT JOIN aliases AS a ON (a.id = u.user_id AND a.type = 'a_vie')
622 WHERE p.eid = {?} AND p2.eid IS NULL
623 " . (Env
::v('initiale') ?
" AND IF(u.nom IS NULL, m.nom,
624 IF(u.nom_usage<>'', u.nom_usage, u.nom)) LIKE '" . Env
::v('initiale') . "%'"
627 ORDER BY nom, prenom, promo", $evt['eid']);
629 $ofs = Env
::i('offset');
630 $tot = (Env
::v('initiale') ?
$tot : $nb_tot) - $absents->total();
631 $nbp = intval(($tot-1)/NB_PER_PAGE
);
634 $links['précédent'] = $ofs-1;
636 for ($i = 0; $i <= $nbp; $i++
) {
637 $links[(string)($i+
1)] = $i;
640 $links['suivant'] = $ofs+
1;
642 if (count($links)>1) {
643 $page->assign('links', $links);
647 $page->assign('absents', $absents);
648 $page->assign('participants',
649 get_event_participants($evt, $item_id, $tri,
650 "LIMIT ".($ofs*NB_PER_PAGE
).", ".NB_PER_PAGE
));
654 // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8: