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)) {
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')));
103 if ($action == 'archive') {
104 XDB
::execute("UPDATE groupex.evenements
106 WHERE eid = {?} AND asso_id = {?}",
107 $eid, $globals->asso('id'));
110 if ($action == 'unarchive') {
111 XDB
::execute("UPDATE groupex.evenements
113 WHERE eid = {?} AND asso_id = {?}",
114 $eid, $globals->asso('id'));
117 $page->assign('archive', $archive);
118 $evenements = XDB
::iterator(
119 "SELECT e.*, LEFT(10, e.debut) AS debut_day, LEFT(10, e.fin) AS fin_day,
120 IF(e.deadline_inscription, e.deadline_inscription >= LEFT(NOW(), 10),
121 1) AS inscr_open, e.deadline_inscription,
122 u.nom, u.prenom, u.promo, a.alias,
123 MAX(ep.nb) IS NOT NULL AS inscrit, MAX(ep.paid) AS paid
124 FROM groupex.evenements AS e
125 INNER JOIN x4dat.auth_user_md5 AS u ON u.user_id = e.organisateur_uid
126 INNER JOIN x4dat.aliases AS a ON (a.type = 'a_vie' AND a.id = u.user_id)
127 LEFT JOIN groupex.evenements_participants AS ep ON (ep.eid = e.eid AND ep.uid = {?})
129 AND archive = " . ($archive ?
"1 " : "0 ")
131 ORDER BY inscr_open DESC, debut DESC", S
::v('uid'), $globals->asso('id'));
134 $undisplayed_events = 0;
136 while ($e = $evenements->next()) {
137 if (!is_member() && !may_update() && !$e['accept_nonmembre']) {
138 $undisplayed_events ++
;
142 $e['show_participants'] = ($e['show_participants'] && (is_member() ||
may_update()));
144 "SELECT titre, details, montant, ei.item_id, nb, ep.paid
145 FROM groupex.evenements_items AS ei
146 LEFT JOIN groupex.evenements_participants AS ep
147 ON (ep.eid = ei.eid AND ep.item_id = ei.item_id AND uid = {?})
149 S
::v('uid'), $e['eid']);
150 $e['moments'] = $res->fetchAllAssoc();
153 $e['paid'] = $e['moments'][0]['paid'];
154 foreach ($e['moments'] as $m) {
155 $e['topay'] +
= $m['nb'] * $m['montant'];
160 FROM {$globals->money->mpay_tprefix}transactions AS t
161 WHERE ref = {?} AND uid = {?}", $e['paiement_id'], S
::v('uid'));
162 $montants = $query->fetchColumn();
164 foreach ($montants as $m) {
165 $p = strtr(substr($m, 0, strpos($m, 'EUR')), ',', '.');
166 $e['paid'] +
= trim($p);
169 if (Env
::has('updated') && $e['eid'] == Env
::i('updated')) {
170 $page->assign('updated', $e);
175 $page->assign('evenements', $evts);
176 $page->assign('undisplayed_events', $undisplayed_events);
179 function handler_sub(&$page, $eid = null
)
181 require_once dirname(__FILE__
).'/xnetevents/xnetevents.inc.php';
182 $page->changeTpl('xnetevents/subscribe.tpl');
184 $evt = get_event_detail($eid);
189 if (!$evt['inscr_open']) {
190 $page->kill('Les inscriptions pour cet événement sont closes');
192 if (!$evt['accept_nonmembre'] && !is_member() && !may_update()) {
193 $page->kill('Cet événement est fermé aux non-membres du groupe');
197 $res = XDB
::query("SELECT stamp FROM requests
198 WHERE type = 'paiements' AND data LIKE {?}",
199 PayReq
::same_event($evt['eid'], $globals->asso('id')));
200 $page->assign('validation', $res->numRows());
201 $page->assign('event', $evt);
203 if (!Post
::has('submit')) {
207 $moments = Post
::v('moment', array());
208 $pers = Post
::v('personnes', array());
211 foreach ($moments as $j => $v) {
212 $subs[$j] = intval($v);
214 // retreive ohter field when more than one person
215 if ($subs[$j] == 2) {
216 if (!isset($pers[$j]) ||
!is_numeric($pers[$j])
219 $page->trigError('Tu dois choisir un nombre d\'invités correct !');
222 $subs[$j] = 1 +
$pers[$j];
226 // impossible to unsubscribe if you already paid sthing
227 if (!array_sum($subs) && $evt['paid'] != 0) {
228 $page->trigError("Impossible de te désinscrire complètement ".
229 "parce que tu as fait un paiement par ".
230 "chèque ou par liquide. Contacte un ".
231 "administrateur du groupe si tu es sûr de ".
236 // update actual inscriptions
239 $paid = $evt['paid'] ?
$evt['paid'] : 0;
240 $telepaid= $evt['telepaid'] ?
$evt['telepaid'] : 0;
241 foreach ($subs as $j => $nb) {
244 "REPLACE INTO groupex.evenements_participants
245 VALUES ({?}, {?}, {?}, {?}, {?}, {?})",
246 $eid, S
::v('uid'), $j, $nb, Env
::has('notify_payment') ?
'notify_payment' : '',
247 $j == 1 ?
$paid - $telepaid : 0);
251 "DELETE FROM groupex.evenements_participants
252 WHERE eid = {?} AND uid = {?} AND item_id = {?}",
253 $eid, S
::v("uid"), $j);
258 if ($updated !== false
) {
259 subscribe_lists_event($total, S
::i('uid'), $evt);
261 $page->assign('event', get_event_detail($eid));
264 function handler_csv(&$page, $eid = null
, $item_id = null
)
266 require_once dirname(__FILE__
).'/xnetevents/xnetevents.inc.php';
268 if (!is_numeric($item_id)) {
272 $evt = get_event_detail($eid, $item_id);
277 header('Content-type: text/x-csv; encoding=UTF-8');
279 header('Cache-Control: ');
281 $page->changeTpl('xnetevents/csv.tpl', NO_SKIN
);
283 $admin = may_update();
285 $tri = (Env
::v('order') == 'alpha' ?
'promo, nom, prenom' : 'nom, prenom, promo');
287 $page->assign('participants',
288 get_event_participants($evt, $item_id, $tri));
290 $page->assign('admin', $admin);
291 $page->assign('moments', $evt['moments']);
292 $page->assign('money', $evt['money']);
293 $page->assign('telepayment', $evt['paiement_id']);
294 $page->assign('tout', !Env
::v('item_id', false
));
297 function handler_ical(&$page, $eid = null
)
301 require_once dirname(__FILE__
).'/xnetevents/xnetevents.inc.php';
302 $evt = get_event_detail($eid);
306 $evt['debut'] = preg_replace('/(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)/', "\\1\\2\\3T\\4\\5\\6", $evt['debut']);
307 $evt['fin'] = preg_replace('/(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)/', "\\1\\2\\3T\\4\\5\\6", $evt['fin']);
309 foreach ($evt['moments'] as $m) {
310 $evt['descriptif'] .= "\n\n** " . $m['titre'] . " **\n" . $m['details'];
313 $page->changeTpl('xnetevents/calendar.tpl', NO_SKIN
);
315 require_once('ical.inc.php');
316 $page->assign('asso', $globals->asso());
317 $page->assign('timestamp', time());
318 $page->assign('admin', may_update());
321 $page->assign('participants', get_event_participants($evt, null
, 'promo, nom, prenom'));
323 $page->register_function('display_ical', 'display_ical');
324 $page->assign_by_ref('e', $evt);
326 header('Content-Type: text/calendar; charset=utf-8');
329 function handler_edit(&$page, $eid = null
)
333 // get eid if the the given one is a short name
334 if (!is_null($eid) && !is_numeric($eid)) {
335 $res = XDB
::query("SELECT eid
336 FROM groupex.evenements
337 WHERE asso_id = {?} AND short_name = {?}",
338 $globals->asso('id'), $eid);
339 if ($res->numRows()) {
340 $eid = (int)$res->fetchOneCell();
344 // check the event is in our group
345 if (!is_null($eid)) {
346 $res = XDB
::query("SELECT short_name
347 FROM groupex.evenements
348 WHERE eid = {?} AND asso_id = {?}",
349 $eid, $globals->asso('id'));
350 if ($res->numRows()) {
351 $infos = $res->fetchOneAssoc();
357 $page->changeTpl('xnetevents/edit.tpl');
359 $moments = range(1, 4);
361 $page->assign('moments', $moments);
363 if (Post
::v('intitule')) {
364 require_once dirname(__FILE__
).'/xnetevents/xnetevents.inc.php';
365 $short_name = event_change_shortname($page, $eid,
366 $infos['short_name'],
367 Env
::v('short_name', ''));
368 if ($short_name != Env
::v('short_name')) {
373 'asso_id' => $globals->asso('id'),
374 'paiement_id' => Post
::v('paiement_id') > 0 ? Post
::v('paiement_id') : null
,
375 'debut' => Post
::v('deb_Year').'-'.Post
::v('deb_Month')
376 .'-'.Post
::v('deb_Day').' '.Post
::v('deb_Hour')
377 .':'.Post
::v('deb_Minute').':00',
378 'fin' => Post
::v('fin_Year').'-'.Post
::v('fin_Month')
379 .'-'.Post
::v('fin_Day').' '.Post
::v('fin_Hour')
380 .':'.Post
::v('fin_Minute').':00',
381 'short_name' => $short_name,
384 $trivial = array('intitule', 'descriptif', 'noinvite',
385 'show_participants', 'accept_nonmembre', 'organisateur_uid');
386 foreach ($trivial as $k) {
387 $evt[$k] = Post
::v($k);
390 $evt['organisateur_uid'] = S
::v('uid');
393 if (Post
::v('deadline')) {
394 $evt['deadline_inscription'] = Post
::v('inscr_Year').'-'
395 . Post
::v('inscr_Month').'-'
396 . Post
::v('inscr_Day');
398 $evt['deadline_inscription'] = null
;
401 // Store the modifications in the database
402 XDB
::execute('REPLACE INTO groupex.evenements
403 SET eid={?}, asso_id={?}, organisateur_uid={?}, intitule={?},
404 paiement_id = {?}, descriptif = {?}, debut = {?},
405 fin = {?}, show_participants = {?}, short_name = {?},
406 deadline_inscription = {?}, noinvite = {?},
407 accept_nonmembre = {?}',
408 $evt['eid'], $evt['asso_id'], $evt['organisateur_uid'],
409 $evt['intitule'], $evt['paiement_id'], $evt['descriptif'],
410 $evt['debut'], $evt['fin'], $evt['show_participants'],
411 $evt['short_name'], $evt['deadline_inscription'],
412 $evt['noinvite'], $evt['accept_nonmembre']);
414 // if new event, get its id
416 $eid = XDB
::insertId();
422 foreach ($moments as $i) {
423 if (Post
::v('titre'.$i)) {
426 $montant = strtr(Post
::v('montant'.$i), ',', '.');
427 $money_defaut +
= (float)$montant;
429 REPLACE INTO groupex.evenements_items
430 VALUES ({?}, {?}, {?}, {?}, {?})",
431 $eid, $i, Post
::v('titre'.$i),
432 Post
::v('details'.$i), $montant);
434 XDB
::execute("DELETE FROM groupex.evenements_items
435 WHERE eid = {?} AND item_id = {?}", $eid, $i);
438 // request for a new payment
439 if (Post
::v('paiement_id') == -1 && $money_defaut >= 0) {
440 require_once 'validations.inc.php';
441 $p = new PayReq(S
::v('uid'),
442 Post
::v('intitule')." - ".$globals->asso('nom'),
443 Post
::v('site'), $money_defaut,
444 Post
::v('confirmation'), 0, 999,
445 $globals->asso('id'), $eid);
449 $page->assign('paiement_message', Post
::v('confirmation'));
450 $page->assign('paiement_site', Post
::v('site'));
455 // events with no sub-event: add a sub-event with no name
456 if ($nb_moments == 0) {
457 XDB
::execute("INSERT INTO groupex.evenements_items
458 VALUES ({?}, {?}, '', '', 0)", $eid, 1);
462 pl_redirect('events');
466 // get a list of all the payment for this asso
467 $res = XDB
::iterator("SELECT id, text
468 FROM {$globals->money->mpay_tprefix}paiements
469 WHERE asso_id = {?}", $globals->asso('id'));
470 $paiements = array();
471 while ($a = $res->next()) $paiements[$a['id']] = $a['text']; {
472 $page->assign('paiements', $paiements);
475 // when modifying an old event retreive the old datas
478 "SELECT eid, intitule, descriptif, debut, fin, organisateur_uid,
479 show_participants, paiement_id, short_name,
480 deadline_inscription, noinvite, accept_nonmembre
481 FROM groupex.evenements
482 WHERE eid = {?}", $eid);
483 $evt = $res->fetchOneAssoc();
484 // find out if there is already a request for a payment for this event
485 require_once 'validations.inc.php';
486 $res = XDB
::query("SELECT stamp FROM requests
487 WHERE type = 'paiements' AND data LIKE {?}",
488 PayReq
::same_event($eid, $globals->asso('id')));
489 $stamp = $res->fetchOneCell();
491 $evt['paiement_id'] = -2;
492 $evt['paiement_req'] = $stamp;
494 $page->assign('evt', $evt);
495 // get all the different moments infos
496 $res = XDB
::iterator(
497 "SELECT item_id, titre, details, montant
498 FROM groupex.evenements_items AS ei
499 INNER JOIN groupex.evenements AS e ON(e.eid = ei.eid)
501 ORDER BY item_id", $eid);
503 while ($item = $res->next()) {
504 $items[$item['item_id']] = $item;
506 $page->assign('items', $items);
508 $page->assign('url_ref', $eid);
511 function handler_admin(&$page, $eid = null
, $item_id = null
)
515 require_once dirname(__FILE__
).'/xnetevents/xnetevents.inc.php';
517 $evt = get_event_detail($eid, $item_id);
522 $page->changeTpl('xnetevents/admin.tpl');
523 if (!$evt['show_participants'] && !may_update()) {
527 if (may_update() && Post
::v('adm')) {
528 $member = get_infos(Post
::v('mail'));
530 $page->trigError("Membre introuvable");
533 // change the price paid by a participant
534 if (Env
::v('adm') == 'prix' && $member) {
535 XDB
::execute("UPDATE groupex.evenements_participants
536 SET paid = IF(paid + {?} > 0, paid + {?}, 0)
537 WHERE uid = {?} AND eid = {?} AND item_id = 1",
538 strtr(Env
::v('montant'), ',', '.'),
539 strtr(Env
::v('montant'), ',', '.'),
540 $member['uid'], $evt['eid']);
543 // change the number of personns coming with a participant
544 if (Env
::v('adm') == 'nbs' && $member) {
545 $res = XDB
::query("SELECT paid
546 FROM groupex.evenements_participants
547 WHERE uid = {?} AND eid = {?}",
548 $member['uid'], $evt['eid']);
550 $paid = intval($res->fetchOneCell());
551 $nbs = Post
::v('nb', array());
553 foreach ($nbs as $id => $nb) {
554 $nb = max(intval($nb), 0);
555 XDB
::execute("REPLACE INTO groupex.evenements_participants
556 VALUES ({?}, {?}, {?}, {?}, {?}, {?})",
557 $evt['eid'], $member['uid'], $id, $nb, '', $id == 1 ?
$paid : 0);
560 $res = XDB
::query("SELECT COUNT(uid) AS cnt, SUM(nb) AS nb
561 FROM groupex.evenements_participants
562 WHERE uid = {?} AND eid = {?}
564 $member['uid'], $evt['eid']);
565 $u = $res->fetchOneAssoc();
566 $u = $u['cnt'] ?
$u['nb'] : null
;
567 subscribe_lists_event($u, $member['uid'], $evt);
570 $evt = get_event_detail($eid, $item_id);
573 $page->assign_by_ref('evt', $evt);
574 $page->assign('tout', is_null($item_id));
576 if (count($evt['moments'])) {
577 $page->assign('moments', $evt['moments']);
580 $tri = (Env
::v('order') == 'alpha' ?
'promo, nom, prenom' : 'nom, prenom, promo');
581 $whereitemid = is_null($item_id) ?
'' : "AND ep.item_id = $item_id";
583 'SELECT UPPER(SUBSTRING(IF(u.nom IS NULL, m.nom,
584 IF(u.nom_usage<>"", u.nom_usage, u.nom)), 1, 1)),
585 COUNT(DISTINCT ep.uid)
586 FROM groupex.evenements_participants AS ep
587 INNER JOIN groupex.evenements AS e ON (ep.eid = e.eid)
588 LEFT JOIN groupex.membres AS m ON ( ep.uid = m.uid AND e.asso_id = m.asso_id)
589 LEFT JOIN auth_user_md5 AS u ON ( u.user_id = ep.uid )
590 WHERE ep.eid = {?} '.$whereitemid . '
591 GROUP BY UPPER(SUBSTRING(IF(u.nom IS NULL,m.nom,u.nom), 1, 1))', $evt['eid']);
595 while (list($char, $nb) = $res->next()) {
596 $alphabet[ord($char)] = $char;
598 if (Env
::has('initiale') && $char == strtoupper(Env
::v('initiale'))) {
603 $page->assign('alphabet', $alphabet);
605 if ($evt['paiement_id']) {
606 $res = XDB
::iterator(
607 "SELECT IF(u.nom_usage<>'', u.nom_usage, u.nom) AS nom, u.prenom,
608 u.promo, a.alias AS email, t.montant
609 FROM {$globals->money->mpay_tprefix}transactions AS t
610 INNER JOIN auth_user_md5 AS u ON(t.uid = u.user_id)
611 INNER JOIN aliases AS a ON (a.id = t.uid AND a.type='a_vie' )
612 LEFT JOIN groupex.evenements_participants AS ep ON(ep.uid = t.uid AND ep.eid = {?})
613 WHERE t.ref = {?} AND ep.uid IS NULL",
614 $evt['eid'], $evt['paiement_id']);
615 $page->assign('oublis', $res->total());
616 $page->assign('oubliinscription', $res);
619 $absents = XDB
::iterator("SELECT p.uid,
620 IF(m.origine = 'X', IF(u.nom_usage != '', u.nom_usage, u.nom), m.nom) AS nom,
621 IF(m.origine = 'X', u.prenom, u.prenom) AS prenom,
622 IF(m.origine = 'X', u.promo, m.origine) AS promo,
623 IF(m.origine = 'X', FIND_IN_SET('femme', u.flags), m.sexe) AS sexe,
624 IF(m.origine = 'X', a.alias, m.email) AS email
625 FROM groupex.evenements_participants AS p
626 INNER JOIN groupex.membres AS m USING(uid)
627 LEFT JOIN groupex.evenements_participants AS p2 ON (p2.uid = m.uid AND p2.eid = p.eid
629 LEFT JOIN auth_user_md5 AS u ON (u.user_id = m.uid)
630 LEFT JOIN aliases AS a ON (a.id = u.user_id AND a.type = 'a_vie')
631 WHERE p.eid = {?} AND p2.eid IS NULL
632 " . (Env
::v('initiale') ?
" AND IF(u.nom IS NULL, m.nom,
633 IF(u.nom_usage<>'', u.nom_usage, u.nom)) LIKE '" . Env
::v('initiale') . "%'"
636 ORDER BY nom, prenom, promo", $evt['eid']);
638 $ofs = Env
::i('offset');
639 $tot = (Env
::v('initiale') ?
$tot : $nb_tot) - $absents->total();
640 $nbp = intval(($tot-1)/NB_PER_PAGE
);
643 $links['précédent'] = $ofs-1;
645 for ($i = 0; $i <= $nbp; $i++
) {
646 $links[(string)($i+
1)] = $i;
649 $links['suivant'] = $ofs+
1;
651 if (count($links)>1) {
652 $page->assign('links', $links);
656 $page->assign('absents', $absents);
657 $page->assign('participants',
658 get_event_participants($evt, $item_id, $tri,
659 "LIMIT ".($ofs*NB_PER_PAGE
).", ".NB_PER_PAGE
));
663 // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8: