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 foreach ($subs as $j => $nb) {
236 "REPLACE INTO groupex.evenements_participants
237 VALUES ({?}, {?}, {?}, {?}, {?}, {?})",
238 $eid, S
::v('uid'), $j, $nb, Env
::has('notify_payment') ?
'notify_payment' : '', $paid);
242 "DELETE FROM groupex.evenements_participants
243 WHERE eid = {?} AND uid = {?} AND item_id = {?}",
244 $eid, S
::v("uid"), $j);
249 if ($updated !== false
) {
250 subscribe_lists_event($total, S
::i('uid'), $evt);
252 $page->assign('event', get_event_detail($eid));
255 function handler_csv(&$page, $eid = null
, $item_id = null
)
257 require_once dirname(__FILE__
).'/xnetevents/xnetevents.inc.php';
259 if (!is_numeric($item_id)) {
263 $evt = get_event_detail($eid, $item_id);
268 header('Content-type: text/x-csv; encoding=UTF-8');
270 header('Cache-Control: ');
272 $page->changeTpl('xnetevents/csv.tpl', NO_SKIN
);
274 $admin = may_update();
276 $tri = (Env
::v('order') == 'alpha' ?
'promo, nom, prenom' : 'nom, prenom, promo');
278 $page->assign('participants',
279 get_event_participants($evt, $item_id, $tri));
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
));
287 function handler_ical(&$page, $eid = null
)
291 require_once dirname(__FILE__
).'/xnetevents/xnetevents.inc.php';
292 $evt = get_event_detail($eid);
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']);
299 foreach ($evt['moments'] as $m) {
300 $evt['descriptif'] .= "\n\n** " . $m['titre'] . " **\n" . $m['details'];
303 $page->changeTpl('xnetevents/calendar.tpl', NO_SKIN
);
305 require_once('ical.inc.php');
306 $page->assign('asso', $globals->asso());
307 $page->assign('timestamp', time());
308 $page->assign('admin', may_update());
311 $page->assign('participants', get_event_participants($evt, null
, 'promo, nom, prenom'));
313 $page->register_function('display_ical', 'display_ical');
314 $page->assign_by_ref('e', $evt);
316 header('Content-Type: text/calendar; charset=utf-8');
319 function handler_edit(&$page, $eid = null
)
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();
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();
347 $page->changeTpl('xnetevents/edit.tpl');
349 $moments = range(1, 4);
351 $page->assign('moments', $moments);
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')) {
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,
373 $trivial = array('intitule', 'descriptif', 'noinvite',
374 'show_participants', 'accept_nonmembre', 'organisateur_uid');
375 foreach ($trivial as $k) {
376 $evt[$k] = Post
::v($k);
379 $evt['organisateur_uid'] = S
::v('uid');
382 if (Post
::v('deadline')) {
383 $evt['deadline_inscription'] = Post
::v('inscr_Year').'-'
384 . Post
::v('inscr_Month').'-'
385 . Post
::v('inscr_Day');
387 $evt['deadline_inscription'] = null
;
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']);
403 // if new event, get its id
405 $eid = XDB
::insertId();
411 foreach ($moments as $i) {
412 if (Post
::v('titre'.$i)) {
415 $montant = strtr(Post
::v('montant'.$i), ',', '.');
416 $money_defaut +
= (float)$montant;
418 REPLACE INTO groupex.evenements_items
419 VALUES ({?}, {?}, {?}, {?}, {?})",
420 $eid, $i, Post
::v('titre'.$i),
421 Post
::v('details'.$i), $montant);
423 XDB
::execute("DELETE FROM groupex.evenements_items
424 WHERE eid = {?} AND item_id = {?}", $eid, $i);
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);
438 $page->assign('paiement_message', Post
::v('confirmation'));
439 $page->assign('paiement_site', Post
::v('site'));
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);
451 pl_redirect('events');
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);
464 // when modifying an old event retreive the old datas
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();
480 $evt['paiement_id'] = -2;
481 $evt['paiement_req'] = $stamp;
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)
490 ORDER BY item_id", $eid);
492 while ($item = $res->next()) {
493 $items[$item['item_id']] = $item;
495 $page->assign('items', $items);
497 $page->assign('url_ref', $eid);
500 function handler_admin(&$page, $eid = null
, $item_id = null
)
504 require_once dirname(__FILE__
).'/xnetevents/xnetevents.inc.php';
506 $evt = get_event_detail($eid, $item_id);
511 $page->changeTpl('xnetevents/admin.tpl');
512 if (!$evt['show_participants'] && !may_update()) {
516 if (may_update() && Post
::v('adm')) {
517 $member = get_infos(Post
::v('mail'));
519 $page->trig("Membre introuvable");
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']);
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']);
539 $paid = intval($res->fetchOneCell());
540 $nbs = Post
::v('nb', array());
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);
549 $res = XDB
::query("SELECT COUNT(uid) AS cnt, SUM(nb) AS nb
550 FROM groupex.evenements_participants
551 WHERE uid = {?} AND eid = {?}
553 $member['uid'], $evt['eid']);
554 $u = $res->fetchOneAssoc();
555 $u = $u['cnt'] ? null
: $u['nb'];
556 subscribe_lists_event($u, $member['uid'], $evt);
559 $evt = get_event_detail($eid, $item_id);
562 $page->assign('evt', $evt);
563 $page->assign('tout', is_null($item_id));
565 if (count($evt['moments'])) {
566 $page->assign('moments', $evt['moments']);
569 $tri = (Env
::v('order') == 'alpha' ?
'promo, nom, prenom' : 'nom, prenom, promo');
570 $whereitemid = is_null($item_id) ?
'' : "AND ep.item_id = $item_id";
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']);
584 while (list($char, $nb) = $res->next()) {
585 $alphabet[ord($char)] = $char;
587 if (Env
::has('initiale') && $char == strtoupper(Env
::v('initiale'))) {
592 $page->assign('alphabet', $alphabet);
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);
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
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') . "%'"
625 ORDER BY nom, prenom, promo", $evt['eid']);
627 $ofs = Env
::i('offset');
628 $tot = (Env
::v('initiale') ?
$tot : $nb_tot) - $absents->total();
629 $nbp = intval(($tot-1)/NB_PER_PAGE
);
632 $links['précédent'] = $ofs-1;
634 for ($i = 0; $i <= $nbp; $i++
) {
635 $links[(string)($i+
1)] = $i;
638 $links['suivant'] = $ofs+
1;
640 if (count($links)>1) {
641 $page->assign('links', $links);
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
));
652 // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8: