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');
189 $page->assign('event', $evt);
191 if (!Post
::has('submit')) {
195 $moments = Post
::v('moment', array());
196 $pers = Post
::v('personnes', array());
199 foreach ($moments as $j => $v) {
200 $subs[$j] = intval($v);
202 // retreive ohter field when more than one person
203 if ($subs[$j] == 2) {
204 if (!isset($pers[$j]) ||
!is_numeric($pers[$j])
207 $page->trig('Tu dois choisir un nombre d\'invités correct !');
210 $subs[$j] = 1 +
$pers[$j];
214 // impossible to unsubscribe if you already paid sthing
215 if (!array_sum($subs) && $evt['paid'] != 0) {
216 $page->trig("Impossible de te désinscrire complètement ".
217 "parce que tu as fait un paiement par ".
218 "chèque ou par liquide. Contacte un ".
219 "administrateur du groupe si tu es sûr de ".
224 // update actual inscriptions
227 $paid = $evt['paid'] ?
$evt['paid'] : 0;
228 foreach ($subs as $j => $nb) {
231 "REPLACE INTO groupex.evenements_participants
232 VALUES ({?}, {?}, {?}, {?}, {?})",
233 $eid, S
::v('uid'), $j, $nb, $paid);
237 "DELETE FROM groupex.evenements_participants
238 WHERE eid = {?} AND uid = {?} AND item_id = {?}",
239 $eid, S
::v("uid"), $j);
244 if ($updated !== false
) {
245 subscribe_lists_event($total, S
::i('uid'), $evt);
247 $page->assign('event', get_event_detail($eid));
250 function handler_csv(&$page, $eid = null
, $item_id = null
)
252 require_once dirname(__FILE__
).'/xnetevents/xnetevents.inc.php';
254 if (!is_numeric($item_id)) {
258 $evt = get_event_detail($eid, $item_id);
263 header('Content-type: text/x-csv; encoding=UTF-8');
265 header('Cache-Control: ');
267 $page->changeTpl('xnetevents/csv.tpl', NO_SKIN
);
269 $admin = may_update();
271 $tri = (Env
::v('order') == 'alpha' ?
'promo, nom, prenom' : 'nom, prenom, promo');
273 $page->assign('participants',
274 get_event_participants($evt, $item_id, $tri));
276 $page->assign('admin', $admin);
277 $page->assign('moments', $evt['moments']);
278 $page->assign('money', $evt['money']);
279 $page->assign('tout', !Env
::v('item_id', false
));
282 function handler_ical(&$page, $eid = null
)
286 require_once dirname(__FILE__
).'/xnetevents/xnetevents.inc.php';
287 $evt = get_event_detail($eid);
291 $evt['debut'] = preg_replace('/(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)/', "\\1\\2\\3T\\4\\5\\6", $evt['debut']);
292 $evt['fin'] = preg_replace('/(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)/', "\\1\\2\\3T\\4\\5\\6", $evt['fin']);
294 foreach ($evt['moments'] as $m) {
295 $evt['descriptif'] .= "\n\n** " . $m['titre'] . " **\n" . $m['details'];
298 $page->changeTpl('xnetevents/calendar.tpl', NO_SKIN
);
300 require_once('ical.inc.php');
301 $page->assign('asso', $globals->asso());
302 $page->assign('timestamp', time());
303 $page->assign('admin', may_update());
306 $page->assign('participants', get_event_participants($evt, null
, 'promo, nom, prenom'));
308 $page->register_function('display_ical', 'display_ical');
309 $page->assign_by_ref('e', $evt);
311 header('Content-Type: text/calendar; charset=utf-8');
314 function handler_edit(&$page, $eid = null
)
318 // get eid if the the given one is a short name
319 if (!is_null($eid) && !is_numeric($eid)) {
320 $res = XDB
::query("SELECT eid
321 FROM groupex.evenements
322 WHERE asso_id = {?} AND short_name = {?}",
323 $globals->asso('id'), $eid);
324 if ($res->numRows()) {
325 $eid = (int)$res->fetchOneCell();
329 // check the event is in our group
330 if (!is_null($eid)) {
331 $res = XDB
::query("SELECT short_name
332 FROM groupex.evenements
333 WHERE eid = {?} AND asso_id = {?}",
334 $eid, $globals->asso('id'));
335 if ($res->numRows()) {
336 $infos = $res->fetchOneAssoc();
342 $page->changeTpl('xnetevents/edit.tpl');
344 $moments = range(1, 4);
346 $page->assign('moments', $moments);
348 if (Post
::v('intitule')) {
349 require_once dirname(__FILE__
).'/xnetevents/xnetevents.inc.php';
350 $short_name = event_change_shortname($page, $infos['short_name'],
351 Env
::v('short_name', ''));
352 if ($short_name != Env
::v('short_name')) {
357 'asso_id' => $globals->asso('id'),
358 'paiement_id' => Post
::v('paiement_id') > 0 ? Post
::v('paiement_id') : null
,
359 'debut' => Post
::v('deb_Year').'-'.Post
::v('deb_Month')
360 .'-'.Post
::v('deb_Day').' '.Post
::v('deb_Hour')
361 .':'.Post
::v('deb_Minute').':00',
362 'fin' => Post
::v('fin_Year').'-'.Post
::v('fin_Month')
363 .'-'.Post
::v('fin_Day').' '.Post
::v('fin_Hour')
364 .':'.Post
::v('fin_Minute').':00',
365 'short_name' => $short_name,
368 $trivial = array('intitule', 'descriptif', 'noinvite',
369 'show_participants', 'accept_nonmembre', 'organisateur_uid');
370 foreach ($trivial as $k) {
371 $evt[$k] = Post
::v($k);
374 $evt['organisateur_uid'] = S
::v('uid');
377 if (Post
::v('deadline')) {
378 $evt['deadline_inscription'] = Post
::v('inscr_Year').'-'
379 . Post
::v('inscr_Month').'-'
380 . Post
::v('inscr_Day');
382 $evt['deadline_inscription'] = null
;
385 // Store the modifications in the database
386 XDB
::execute('REPLACE INTO groupex.evenements
387 SET eid={?}, asso_id={?}, organisateur_uid={?}, intitule={?},
388 paiement_id = {?}, descriptif = {?}, debut = {?},
389 fin = {?}, show_participants = {?}, short_name = {?},
390 deadline_inscription = {?}, noinvite = {?},
391 accept_nonmembre = {?}',
392 $evt['eid'], $evt['asso_id'], $evt['organisateur_uid'],
393 $evt['intitule'], $evt['paiement_id'], $evt['descriptif'],
394 $evt['debut'], $evt['fin'], $evt['show_participants'],
395 $evt['short_name'], $evt['deadline_inscription'],
396 $evt['noinvite'], $evt['accept_nonmembre']);
398 // if new event, get its id
400 $eid = XDB
::insertId();
406 foreach ($moments as $i) {
407 if (Post
::v('titre'.$i)) {
410 $montant = strtr(Post
::v('montant'.$i), ',', '.');
411 $money_defaut +
= (float)$montant;
413 REPLACE INTO groupex.evenements_items
414 VALUES ({?}, {?}, {?}, {?}, {?})",
415 $eid, $i, Post
::v('titre'.$i),
416 Post
::v('details'.$i), $montant);
418 XDB
::execute("DELETE FROM groupex.evenements_items
419 WHERE eid = {?} AND item_id = {?}", $eid, $i);
422 // request for a new payment
423 if (Post
::v('paiement_id') == -1 && $money_defaut >= 0) {
424 require_once 'validations.inc.php';
425 $p = new PayReq(S
::v('uid'),
426 Post
::v('intitule')." - ".$globals->asso('nom'),
427 Post
::v('site'), $money_defaut,
428 Post
::v('confirmation'), 0, 999,
429 $globals->asso('id'), $eid);
433 $page->assign('paiement_message', Post
::v('confirmation'));
434 $page->assign('paiement_site', Post
::v('site'));
439 // events with no sub-event: add a sub-event with no name
440 if ($nb_moments == 0) {
441 XDB
::execute("INSERT INTO groupex.evenements_items
442 VALUES ({?}, {?}, '', '', 0)", $eid, 1);
446 pl_redirect('events');
450 // get a list of all the payment for this asso
451 $res = XDB
::iterator("SELECT id, text
452 FROM {$globals->money->mpay_tprefix}paiements
453 WHERE asso_id = {?}", $globals->asso('id'));
454 $paiements = array();
455 while ($a = $res->next()) $paiements[$a['id']] = $a['text']; {
456 $page->assign('paiements', $paiements);
459 // when modifying an old event retreive the old datas
462 "SELECT eid, intitule, descriptif, debut, fin, organisateur_uid,
463 show_participants, paiement_id, short_name,
464 deadline_inscription, noinvite, accept_nonmembre
465 FROM groupex.evenements
466 WHERE eid = {?}", $eid);
467 $evt = $res->fetchOneAssoc();
468 // find out if there is already a request for a payment for this event
469 require_once 'validations.inc.php';
470 $res = XDB
::query("SELECT stamp FROM requests
471 WHERE type = 'paiements' AND data LIKE {?}",
472 PayReq
::same_event($eid, $globals->asso('id')));
473 $stamp = $res->fetchOneCell();
475 $evt['paiement_id'] = -2;
476 $evt['paiement_req'] = $stamp;
478 $page->assign('evt', $evt);
479 // get all the different moments infos
480 $res = XDB
::iterator(
481 "SELECT item_id, titre, details, montant
482 FROM groupex.evenements_items AS ei
483 INNER JOIN groupex.evenements AS e ON(e.eid = ei.eid)
485 ORDER BY item_id", $eid);
487 while ($item = $res->next()) {
488 $items[$item['item_id']] = $item;
490 $page->assign('items', $items);
492 $page->assign('url_ref', $eid);
495 function handler_admin(&$page, $eid = null
, $item_id = null
)
499 require_once dirname(__FILE__
).'/xnetevents/xnetevents.inc.php';
501 $evt = get_event_detail($eid, $item_id);
506 $page->changeTpl('xnetevents/admin.tpl');
507 if (!$evt['show_participants'] && !may_update()) {
511 if (may_update() && Post
::v('adm')) {
512 $member = get_infos(Post
::v('mail'));
514 $page->trig("Membre introuvable");
517 // change the price paid by a participant
518 if (Env
::v('adm') == 'prix' && $member) {
519 XDB
::execute("UPDATE groupex.evenements_participants
520 SET paid = IF(paid + {?} > 0, paid + {?}, 0)
521 WHERE uid = {?} AND eid = {?}",
522 strtr(Env
::v('montant'), ',', '.'),
523 strtr(Env
::v('montant'), ',', '.'),
524 $member['uid'], $evt['eid']);
527 // change the number of personns coming with a participant
528 if (Env
::v('adm') == 'nbs' && $member) {
529 $res = XDB
::query("SELECT paid
530 FROM groupex.evenements_participants
531 WHERE uid = {?} AND eid = {?}",
532 $member['uid'], $evt['eid']);
534 $paid = intval($res->fetchOneCell());
535 $nbs = Post
::v('nb', array());
537 foreach ($nbs as $id => $nb) {
538 $nb = max(intval($nb), 0);
539 XDB
::execute("REPLACE INTO groupex.evenements_participants
540 VALUES ({?}, {?}, {?}, {?}, {?})",
541 $evt['eid'], $member['uid'], $id, $nb, $paid);
544 $res = XDB
::query("SELECT COUNT(uid) AS cnt, SUM(nb) AS nb
545 FROM groupex.evenements_participants
546 WHERE uid = {?} AND eid = {?}
548 $member['uid'], $evt['eid']);
549 $u = $res->fetchOneAssoc();
550 $u = $u['cnt'] ? null
: $u['nb'];
551 subscribe_lists_event($u, $member['uid'], $evt);
554 $evt = get_event_detail($eid, $item_id);
557 $page->assign('evt', $evt);
558 $page->assign('tout', is_null($item_id));
560 if (count($evt['moments'])) {
561 $page->assign('moments', $evt['moments']);
564 $tri = (Env
::v('order') == 'alpha' ?
'promo, nom, prenom' : 'nom, prenom, promo');
565 $whereitemid = is_null($item_id) ?
'' : "AND ep.item_id = $item_id";
567 'SELECT UPPER(SUBSTRING(IF(u.nom IS NULL, m.nom,
568 IF(u.nom_usage<>"", u.nom_usage, u.nom)), 1, 1)),
569 COUNT(DISTINCT ep.uid)
570 FROM groupex.evenements_participants AS ep
571 INNER JOIN groupex.evenements AS e ON (ep.eid = e.eid)
572 LEFT JOIN groupex.membres AS m ON ( ep.uid = m.uid AND e.asso_id = m.asso_id)
573 LEFT JOIN auth_user_md5 AS u ON ( u.user_id = ep.uid )
574 WHERE ep.eid = {?} '.$whereitemid.'
575 GROUP BY UPPER(SUBSTRING(IF(u.nom IS NULL,m.nom,u.nom), 1, 1))', $evt['eid']);
579 while (list($char, $nb) = $res->next()) {
580 $alphabet[ord($char)] = $char;
582 if (Env
::has('initiale') && $char == strtoupper(Env
::v('initiale'))) {
587 $page->assign('alphabet', $alphabet);
589 $ofs = Env
::i('offset');
590 $tot = Env
::v('initiale') ?
$tot : $nb_tot;
591 $nbp = intval(($tot-1)/NB_PER_PAGE
);
594 $links['précédent'] = $ofs-1;
596 for ($i = 0; $i <= $nbp; $i++
) {
597 $links[(string)($i+
1)] = $i;
600 $links['suivant'] = $ofs+
1;
602 if (count($links)>1) {
603 $page->assign('links', $links);
606 if ($evt['paiement_id']) {
607 $res = XDB
::iterator(
608 "SELECT IF(u.nom_usage<>'', u.nom_usage, u.nom) AS nom, u.prenom,
609 u.promo, a.alias AS email, t.montant
610 FROM {$globals->money->mpay_tprefix}transactions AS t
611 INNER JOIN auth_user_md5 AS u ON(t.uid = u.user_id)
612 INNER JOIN aliases AS a ON (a.id = t.uid AND a.type='a_vie' )
613 LEFT JOIN groupex.evenements_participants AS ep ON(ep.uid = t.uid AND ep.eid = {?})
614 WHERE t.ref = {?} AND ep.uid IS NULL",
615 $evt['eid'], $evt['paiement_id']);
616 $page->assign('oublis', $res->total());
617 $page->assign('oubliinscription', $res);
620 $absents = XDB
::iterator("SELECT p.uid,
621 IF(m.origine = 'X', IF(u.nom_usage != '', u.nom_usage, u.nom), m.nom) AS nom,
622 IF(m.origine = 'X', u.prenom, u.prenom) AS prenom,
623 IF(m.origine = 'X', u.promo, m.origine) AS promo,
624 IF(m.origine = 'X', FIND_IN_SET('femme', u.flags), m.sexe) AS sexe,
625 IF(m.origine = 'X', a.alias, m.email) AS email
626 FROM groupex.evenements_participants AS p
627 INNER JOIN groupex.membres AS m USING(uid)
628 LEFT JOIN groupex.evenements_participants AS p2 ON (p2.uid = m.uid AND p2.eid = p.eid
630 LEFT JOIN auth_user_md5 AS u ON (u.user_id = m.uid)
631 LEFT JOIN aliases AS a ON (a.id = u.user_id AND a.type = 'a_vie')
632 WHERE p.eid = {?} AND p2.eid IS NULL
634 ORDER BY nom, prenom, promo", $evt['eid']);
636 $page->assign('absents', $absents);
637 $page->assign('participants',
638 get_event_participants($evt, $item_id, $tri,
639 "LIMIT ".($ofs*NB_PER_PAGE
).", ".NB_PER_PAGE
));
643 // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8: