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
),
32 '%grp/events/ical' => $this->make_hook('ical', AUTH_MDP
),
33 '%grp/events/edit' => $this->make_hook('edit', AUTH_MDP
, 'groupadmin'),
34 '%grp/events/admin' => $this->make_hook('admin', AUTH_MDP
),
38 function handler_events(&$page, $archive = null
)
42 if ($archive == 'archive') {
44 new_groupadmin_page('xnetevents/index.tpl');
47 new_group_open_page('xnetevents/index.tpl');
51 if (Post
::has('del')) {
53 $eid = Post
::v('del');
54 } elseif (Post
::has('archive')) {
56 $eid = Post
::v('archive');
57 } elseif (Post
::has('unarchive')) {
58 $action = 'unarchive';
59 $eid = Post
::v('unarchive');
62 if (!is_null($action)) {
67 $res = XDB
::query("SELECT asso_id, short_name FROM groupex.evenements
68 WHERE eid = {?} AND asso_id = {?}",
69 $eid, $globals->asso('id'));
71 $tmp = $res->fetchOneRow();
77 if ($action == 'del') {
78 // deletes the event mailing aliases
81 "DELETE FROM virtual WHERE type = 'evt' AND alias LIKE {?}",
82 $tmp[1].'-absents@%');
84 "DELETE FROM virtual WHERE type = 'evt' AND alias LIKE {?}",
85 $tmp[1].'-participants@%');
88 // deletes the event items
89 XDB
::execute("DELETE FROM groupex.evenements_items WHERE eid = {?}", $eid);
91 // deletes the event participants
92 XDB
::execute("DELETE FROM groupex.evenements_participants
93 WHERE eid = {?}", $eid);
96 XDB
::execute("DELETE FROM groupex.evenements
97 WHERE eid = {?} AND asso_id = {?}",
98 $eid, $globals->asso('id'));
100 // delete the requests for payments
101 require_once 'validations.inc.php';
102 XDB
::execute("DELETE FROM requests
103 WHERE type = 'paiements' AND data LIKE {?}",
104 PayReq
::same_event($eid, $globals->asso('id')));
107 if ($action == 'archive') {
108 XDB
::execute("UPDATE groupex.evenements
110 WHERE eid = {?} AND asso_id = {?}",
111 $eid, $globals->asso('id'));
114 if ($action == 'unarchive') {
115 XDB
::execute("UPDATE groupex.evenements
117 WHERE eid = {?} AND asso_id = {?}",
118 $eid, $globals->asso('id'));
121 $page->assign('archive', $archive);
122 $evenements = XDB
::iterator(
123 "SELECT e.*, LEFT(10, e.debut) AS debut_day, LEFT(10, e.fin) AS fin_day,
124 IF(e.deadline_inscription, e.deadline_inscription >= LEFT(NOW(), 10),
125 1) AS inscr_open, e.deadline_inscription,
126 u.nom, u.prenom, u.promo, a.alias,
127 MAX(ep.nb) IS NOT NULL AS inscrit, MAX(ep.paid) AS paid
128 FROM groupex.evenements AS e
129 INNER JOIN x4dat.auth_user_md5 AS u ON u.user_id = e.organisateur_uid
130 INNER JOIN x4dat.aliases AS a ON (a.type = 'a_vie' AND a.id = u.user_id)
131 LEFT JOIN groupex.evenements_participants AS ep ON (ep.eid = e.eid AND ep.uid = {?})
133 AND archive = " . ($archive ?
"1 " : "0 ")
134 . (is_member() ||
may_update() ?
"" : " AND accept_nonmembre != 0 ")
136 ORDER BY inscr_open DESC, debut DESC", S
::v('uid'), $globals->asso('id'));
140 while ($e = $evenements->next()) {
141 $e['show_participants'] = ($e['show_participants'] && (is_member() ||
may_update()));
143 "SELECT titre, details, montant, ei.item_id, nb, ep.paid
144 FROM groupex.evenements_items AS ei
145 LEFT JOIN groupex.evenements_participants AS ep
146 ON (ep.eid = ei.eid AND ep.item_id = ei.item_id AND uid = {?})
148 S
::v('uid'), $e['eid']);
149 $e['moments'] = $res->fetchAllAssoc();
152 $e['paid'] = $e['moments'][0]['paid'];
153 foreach ($e['moments'] as $m) {
154 $e['topay'] +
= $m['nb'] * $m['montant'];
159 FROM {$globals->money->mpay_tprefix}transactions AS t
160 WHERE ref = {?} AND uid = {?}", $e['paiement_id'], S
::v('uid'));
161 $montants = $query->fetchColumn();
163 foreach ($montants as $m) {
164 $p = strtr(substr($m, 0, strpos($m, 'EUR')), ',', '.');
165 $e['paid'] +
= trim($p);
168 if (Env
::has('updated') && $e['eid'] == Env
::i('updated')) {
169 $page->assign('updated', $e);
174 $page->assign('evenements', $evts);
177 function handler_sub(&$page, $eid = null
)
179 require_once dirname(__FILE__
).'/xnetevents/xnetevents.inc.php';
181 new_group_open_page('xnetevents/subscribe.tpl');
183 $evt = get_event_detail($eid);
188 if (!$evt['inscr_open']) {
189 $page->kill('Les inscriptions pour cet événement sont closes');
191 if (!$evt['accept_nonmembre'] && !is_member() && !may_update()) {
192 $page->kill('Cet événement est fermé aux non-membres du groupe');
195 $page->assign('event', $evt);
197 if (!Post
::has('submit')) {
201 $moments = Post
::v('moment', array());
202 $pers = Post
::v('personnes', array());
205 foreach ($moments as $j => $v) {
206 $subs[$j] = intval($v);
208 // retreive ohter field when more than one person
209 if ($subs[$j] == 2) {
210 if (!isset($pers[$j]) ||
!is_numeric($pers[$j])
213 $page->trig('Tu dois choisir un nombre d\'invités correct !');
216 $subs[$j] = 1 +
$pers[$j];
220 // impossible to unsubscribe if you already paid sthing
221 if (!array_sum($subs) && $evt['paid'] != 0) {
222 $page->trig("Impossible de te désinscrire complètement ".
223 "parce que tu as fait un paiement par ".
224 "chèque ou par liquide. Contacte un ".
225 "administrateur du groupe si tu es sûr de ".
230 // update actual inscriptions
233 $paid = $evt['paid'] ?
$evt['paid'] : 0;
234 foreach ($subs as $j => $nb) {
237 "REPLACE INTO groupex.evenements_participants
238 VALUES ({?}, {?}, {?}, {?}, {?})",
239 $eid, S
::v('uid'), $j, $nb, $paid);
243 "DELETE FROM groupex.evenements_participants
244 WHERE eid = {?} AND uid = {?} AND item_id = {?}",
245 $eid, S
::v("uid"), $j);
250 if ($updated !== false
) {
251 subscribe_lists_event($total, S
::i('uid'), $evt);
253 $page->assign('event', get_event_detail($eid));
256 function handler_csv(&$page, $eid = null
, $item_id = null
)
258 require_once dirname(__FILE__
).'/xnetevents/xnetevents.inc.php';
260 if (!is_numeric($item_id)) {
264 $evt = get_event_detail($eid, $item_id);
269 header('Content-type: text/x-csv; encoding=UTF-8');
271 header('Cache-Control: ');
273 $page->changeTpl('xnetevents/csv.tpl', NO_SKIN
);
275 $admin = may_update();
277 $tri = (Env
::v('order') == 'alpha' ?
'promo, nom, prenom' : 'nom, prenom, promo');
279 $page->assign('participants',
280 get_event_participants($evt, $item_id, $tri));
282 $page->assign('admin', $admin);
283 $page->assign('moments', $evt['moments']);
284 $page->assign('money', $evt['money']);
285 $page->assign('tout', !Env
::v('item_id', false
));
288 function handler_ical(&$page, $eid = null
)
292 require_once dirname(__FILE__
).'/xnetevents/xnetevents.inc.php';
293 $evt = get_event_detail($eid);
297 $evt['debut'] = preg_replace('/(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)/', "\\1\\2\\3T\\4\\5\\6", $evt['debut']);
298 $evt['fin'] = preg_replace('/(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)/', "\\1\\2\\3T\\4\\5\\6", $evt['fin']);
300 foreach ($evt['moments'] as $m) {
301 $evt['descriptif'] .= "\n\n** " . $m['titre'] . " **\n" . $m['details'];
304 $page->changeTpl('xnetevents/calendar.tpl', NO_SKIN
);
306 require_once('ical.inc.php');
307 $page->assign('asso', $globals->asso());
308 $page->assign('timestamp', time());
309 $page->assign('admin', may_update());
312 $page->assign('participants', get_event_participants($evt, null
, 'promo, nom, prenom'));
314 $page->register_function('display_ical', 'display_ical');
315 $page->assign_by_ref('e', $evt);
317 header('Content-Type: text/calendar; charset=utf-8');
320 function handler_edit(&$page, $eid = null
)
324 // get eid if the the given one is a short name
325 if (!is_null($eid) && !is_numeric($eid)) {
326 $res = XDB
::query("SELECT eid
327 FROM groupex.evenements
328 WHERE asso_id = {?} AND short_name = {?}",
329 $globals->asso('id'), $eid);
330 if ($res->numRows()) {
331 $eid = (int)$res->fetchOneCell();
335 // check the event is in our group
336 if (!is_null($eid)) {
337 $res = XDB
::query("SELECT short_name
338 FROM groupex.evenements
339 WHERE eid = {?} AND asso_id = {?}",
340 $eid, $globals->asso('id'));
341 if ($res->numRows()) {
342 $infos = $res->fetchOneAssoc();
348 new_groupadmin_page('xnetevents/edit.tpl');
350 $moments = range(1, 4);
352 $page->assign('moments', $moments);
354 if (Post
::v('intitule')) {
355 require_once dirname(__FILE__
).'/xnetevents/xnetevents.inc.php';
356 $short_name = event_change_shortname($page, $infos['short_name'],
357 Env
::v('short_name', ''));
358 if ($short_name != Env
::v('short_name')) {
363 'asso_id' => $globals->asso('id'),
364 'paiement_id' => Post
::v('paiement_id') > 0 ? Post
::v('paiement_id') : null
,
365 'debut' => Post
::v('deb_Year').'-'.Post
::v('deb_Month')
366 .'-'.Post
::v('deb_Day').' '.Post
::v('deb_Hour')
367 .':'.Post
::v('deb_Minute').':00',
368 'fin' => Post
::v('fin_Year').'-'.Post
::v('fin_Month')
369 .'-'.Post
::v('fin_Day').' '.Post
::v('fin_Hour')
370 .':'.Post
::v('fin_Minute').':00',
371 'short_name' => $short_name,
374 $trivial = array('intitule', 'descriptif', 'noinvite',
375 'show_participants', 'accept_nonmembre', 'organisateur_uid');
376 foreach ($trivial as $k) {
377 $evt[$k] = Post
::v($k);
380 $evt['organisateur_uid'] = S
::v('uid');
383 if (Post
::v('deadline')) {
384 $evt['deadline_inscription'] = Post
::v('inscr_Year').'-'
385 . Post
::v('inscr_Month').'-'
386 . Post
::v('inscr_Day');
388 $evt['deadline_inscription'] = null
;
391 // Store the modifications in the database
392 XDB
::execute('REPLACE INTO groupex.evenements
393 SET eid={?}, asso_id={?}, organisateur_uid={?}, intitule={?},
394 paiement_id = {?}, descriptif = {?}, debut = {?},
395 fin = {?}, show_participants = {?}, short_name = {?},
396 deadline_inscription = {?}, noinvite = {?},
397 accept_nonmembre = {?}',
398 $evt['eid'], $evt['asso_id'], $evt['organisateur_uid'],
399 $evt['intitule'], $evt['paiement_id'], $evt['descriptif'],
400 $evt['debut'], $evt['fin'], $evt['show_participants'],
401 $evt['short_name'], $evt['deadline_inscription'],
402 $evt['noinvite'], $evt['accept_nonmembre']);
404 // if new event, get its id
406 $eid = XDB
::insertId();
412 foreach ($moments as $i) {
413 if (Post
::v('titre'.$i)) {
416 $montant = strtr(Post
::v('montant'.$i), ',', '.');
417 $money_defaut +
= (float)$montant;
419 REPLACE INTO groupex.evenements_items
420 VALUES ({?}, {?}, {?}, {?}, {?})",
421 $eid, $i, Post
::v('titre'.$i),
422 Post
::v('details'.$i), $montant);
424 XDB
::execute("DELETE FROM groupex.evenements_items
425 WHERE eid = {?} AND item_id = {?}", $eid, $i);
428 // request for a new payment
429 if (Post
::v('paiement_id') == -1 && $money_defaut >= 0) {
430 require_once 'validations.inc.php';
431 $p = new PayReq(S
::v('uid'),
432 Post
::v('intitule')." - ".$globals->asso('nom'),
433 Post
::v('site'), $money_defaut,
434 Post
::v('confirmation'), 0, 999,
435 $globals->asso('id'), $eid);
439 $page->assign('paiement_message', Post
::v('confirmation'));
440 $page->assign('paiement_site', Post
::v('site'));
445 // events with no sub-event: add a sub-event with no name
446 if ($nb_moments == 0) {
447 XDB
::execute("INSERT INTO groupex.evenements_items
448 VALUES ({?}, {?}, '', '', 0)", $eid, 1);
452 pl_redirect('events');
456 // get a list of all the payment for this asso
457 $res = XDB
::iterator("SELECT id, text
458 FROM {$globals->money->mpay_tprefix}paiements
459 WHERE asso_id = {?}", $globals->asso('id'));
460 $paiements = array();
461 while ($a = $res->next()) $paiements[$a['id']] = $a['text']; {
462 $page->assign('paiements', $paiements);
465 // when modifying an old event retreive the old datas
468 "SELECT eid, intitule, descriptif, debut, fin, organisateur_uid,
469 show_participants, paiement_id, short_name,
470 deadline_inscription, noinvite, accept_nonmembre
471 FROM groupex.evenements
472 WHERE eid = {?}", $eid);
473 $evt = $res->fetchOneAssoc();
474 // find out if there is already a request for a payment for this event
475 require_once 'validations.inc.php';
476 $res = XDB
::query("SELECT stamp FROM requests
477 WHERE type = 'paiements' AND data LIKE {?}",
478 PayReq
::same_event($eid, $globals->asso('id')));
479 $stamp = $res->fetchOneCell();
481 $evt['paiement_id'] = -2;
482 $evt['paiement_req'] = $stamp;
484 $page->assign('evt', $evt);
485 // get all the different moments infos
486 $res = XDB
::iterator(
487 "SELECT item_id, titre, details, montant
488 FROM groupex.evenements_items AS ei
489 INNER JOIN groupex.evenements AS e ON(e.eid = ei.eid)
491 ORDER BY item_id", $eid);
493 while ($item = $res->next()) {
494 $items[$item['item_id']] = $item;
496 $page->assign('items', $items);
498 $page->assign('url_ref', $eid);
501 function handler_admin(&$page, $eid = null
, $item_id = null
)
505 require_once dirname(__FILE__
).'/xnetevents/xnetevents.inc.php';
507 $evt = get_event_detail($eid, $item_id);
512 if ($evt['show_participants']) {
513 new_group_page('xnetevents/admin.tpl');
515 new_groupadmin_page('xnetevents/admin.tpl');
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 = {?}",
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, $paid);
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 $ofs = Env
::i('offset');
597 $tot = Env
::v('initiale') ?
$tot : $nb_tot;
598 $nbp = intval(($tot-1)/NB_PER_PAGE
);
601 $links['précédent'] = $ofs-1;
603 for ($i = 0; $i <= $nbp; $i++
) {
604 $links[(string)($i+
1)] = $i;
607 $links['suivant'] = $ofs+
1;
609 if (count($links)>1) {
610 $page->assign('links', $links);
613 if ($evt['paiement_id']) {
614 $res = XDB
::iterator(
615 "SELECT IF(u.nom_usage<>'', u.nom_usage, u.nom) AS nom, u.prenom,
616 u.promo, a.alias AS email, t.montant
617 FROM {$globals->money->mpay_tprefix}transactions AS t
618 INNER JOIN auth_user_md5 AS u ON(t.uid = u.user_id)
619 INNER JOIN aliases AS a ON (a.id = t.uid AND a.type='a_vie' )
620 LEFT JOIN groupex.evenements_participants AS ep ON(ep.uid = t.uid AND ep.eid = {?})
621 WHERE t.ref = {?} AND ep.uid IS NULL",
622 $evt['eid'], $evt['paiement_id']);
623 $page->assign('oublis', $res->total());
624 $page->assign('oubliinscription', $res);
627 $page->assign('participants',
628 get_event_participants($evt, $item_id, $tri,
629 "LIMIT ".($ofs*NB_PER_PAGE
).", ".NB_PER_PAGE
));
633 // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8: