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 ")
130 . (is_member() ||
may_update() ?
"" : " AND accept_nonmembre != 0 ")
132 ORDER BY inscr_open DESC, debut DESC", S
::v('uid'), $globals->asso('id'));
136 while ($e = $evenements->next()) {
137 $e['show_participants'] = ($e['show_participants'] && (is_member() ||
may_update()));
139 "SELECT titre, details, montant, ei.item_id, nb, ep.paid
140 FROM groupex.evenements_items AS ei
141 LEFT JOIN groupex.evenements_participants AS ep
142 ON (ep.eid = ei.eid AND ep.item_id = ei.item_id AND uid = {?})
144 S
::v('uid'), $e['eid']);
145 $e['moments'] = $res->fetchAllAssoc();
148 $e['paid'] = $e['moments'][0]['paid'];
149 foreach ($e['moments'] as $m) {
150 $e['topay'] +
= $m['nb'] * $m['montant'];
155 FROM {$globals->money->mpay_tprefix}transactions AS t
156 WHERE ref = {?} AND uid = {?}", $e['paiement_id'], S
::v('uid'));
157 $montants = $query->fetchColumn();
159 foreach ($montants as $m) {
160 $p = strtr(substr($m, 0, strpos($m, 'EUR')), ',', '.');
161 $e['paid'] +
= trim($p);
164 if (Env
::has('updated') && $e['eid'] == Env
::i('updated')) {
165 $page->assign('updated', $e);
170 $page->assign('evenements', $evts);
173 function handler_sub(&$page, $eid = null
)
175 require_once dirname(__FILE__
).'/xnetevents/xnetevents.inc.php';
176 $page->changeTpl('xnetevents/subscribe.tpl');
178 $evt = get_event_detail($eid);
183 if (!$evt['inscr_open']) {
184 $page->kill('Les inscriptions pour cet événement sont closes');
186 if (!$evt['accept_nonmembre'] && !is_member() && !may_update()) {
187 $page->kill('Cet événement est fermé aux non-membres du groupe');
191 $res = XDB
::query("SELECT stamp FROM requests
192 WHERE type = 'paiements' AND data LIKE {?}",
193 PayReq
::same_event($evt['eid'], $globals->asso('id')));
194 $page->assign('validation', $res->numRows());
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 $telepaid= $evt['telepaid'] ?
$evt['telepaid'] : 0;
235 foreach ($subs as $j => $nb) {
238 "REPLACE INTO groupex.evenements_participants
239 VALUES ({?}, {?}, {?}, {?}, {?}, {?})",
240 $eid, S
::v('uid'), $j, $nb, Env
::has('notify_payment') ?
'notify_payment' : '',
241 $j == 1 ?
$paid - $telepaid : 0);
245 "DELETE FROM groupex.evenements_participants
246 WHERE eid = {?} AND uid = {?} AND item_id = {?}",
247 $eid, S
::v("uid"), $j);
252 if ($updated !== false
) {
253 subscribe_lists_event($total, S
::i('uid'), $evt);
255 $page->assign('event', get_event_detail($eid));
258 function handler_csv(&$page, $eid = null
, $item_id = null
)
260 require_once dirname(__FILE__
).'/xnetevents/xnetevents.inc.php';
262 if (!is_numeric($item_id)) {
266 $evt = get_event_detail($eid, $item_id);
271 header('Content-type: text/x-csv; encoding=UTF-8');
273 header('Cache-Control: ');
275 $page->changeTpl('xnetevents/csv.tpl', NO_SKIN
);
277 $admin = may_update();
279 $tri = (Env
::v('order') == 'alpha' ?
'promo, nom, prenom' : 'nom, prenom, promo');
281 $page->assign('participants',
282 get_event_participants($evt, $item_id, $tri));
284 $page->assign('admin', $admin);
285 $page->assign('moments', $evt['moments']);
286 $page->assign('money', $evt['money']);
287 $page->assign('telepayment', $evt['paiement_id']);
288 $page->assign('tout', !Env
::v('item_id', false
));
291 function handler_ical(&$page, $eid = null
)
295 require_once dirname(__FILE__
).'/xnetevents/xnetevents.inc.php';
296 $evt = get_event_detail($eid);
300 $evt['debut'] = preg_replace('/(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)/', "\\1\\2\\3T\\4\\5\\6", $evt['debut']);
301 $evt['fin'] = preg_replace('/(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)/', "\\1\\2\\3T\\4\\5\\6", $evt['fin']);
303 foreach ($evt['moments'] as $m) {
304 $evt['descriptif'] .= "\n\n** " . $m['titre'] . " **\n" . $m['details'];
307 $page->changeTpl('xnetevents/calendar.tpl', NO_SKIN
);
309 require_once('ical.inc.php');
310 $page->assign('asso', $globals->asso());
311 $page->assign('timestamp', time());
312 $page->assign('admin', may_update());
315 $page->assign('participants', get_event_participants($evt, null
, 'promo, nom, prenom'));
317 $page->register_function('display_ical', 'display_ical');
318 $page->assign_by_ref('e', $evt);
320 header('Content-Type: text/calendar; charset=utf-8');
323 function handler_edit(&$page, $eid = null
)
327 // get eid if the the given one is a short name
328 if (!is_null($eid) && !is_numeric($eid)) {
329 $res = XDB
::query("SELECT eid
330 FROM groupex.evenements
331 WHERE asso_id = {?} AND short_name = {?}",
332 $globals->asso('id'), $eid);
333 if ($res->numRows()) {
334 $eid = (int)$res->fetchOneCell();
338 // check the event is in our group
339 if (!is_null($eid)) {
340 $res = XDB
::query("SELECT short_name
341 FROM groupex.evenements
342 WHERE eid = {?} AND asso_id = {?}",
343 $eid, $globals->asso('id'));
344 if ($res->numRows()) {
345 $infos = $res->fetchOneAssoc();
351 $page->changeTpl('xnetevents/edit.tpl');
353 $moments = range(1, 4);
355 $page->assign('moments', $moments);
357 if (Post
::v('intitule')) {
358 require_once dirname(__FILE__
).'/xnetevents/xnetevents.inc.php';
359 $short_name = event_change_shortname($page, $infos['short_name'],
360 Env
::v('short_name', ''));
361 if ($short_name != Env
::v('short_name')) {
366 'asso_id' => $globals->asso('id'),
367 'paiement_id' => Post
::v('paiement_id') > 0 ? Post
::v('paiement_id') : null
,
368 'debut' => Post
::v('deb_Year').'-'.Post
::v('deb_Month')
369 .'-'.Post
::v('deb_Day').' '.Post
::v('deb_Hour')
370 .':'.Post
::v('deb_Minute').':00',
371 'fin' => Post
::v('fin_Year').'-'.Post
::v('fin_Month')
372 .'-'.Post
::v('fin_Day').' '.Post
::v('fin_Hour')
373 .':'.Post
::v('fin_Minute').':00',
374 'short_name' => $short_name,
377 $trivial = array('intitule', 'descriptif', 'noinvite',
378 'show_participants', 'accept_nonmembre', 'organisateur_uid');
379 foreach ($trivial as $k) {
380 $evt[$k] = Post
::v($k);
383 $evt['organisateur_uid'] = S
::v('uid');
386 if (Post
::v('deadline')) {
387 $evt['deadline_inscription'] = Post
::v('inscr_Year').'-'
388 . Post
::v('inscr_Month').'-'
389 . Post
::v('inscr_Day');
391 $evt['deadline_inscription'] = null
;
394 // Store the modifications in the database
395 XDB
::execute('REPLACE INTO groupex.evenements
396 SET eid={?}, asso_id={?}, organisateur_uid={?}, intitule={?},
397 paiement_id = {?}, descriptif = {?}, debut = {?},
398 fin = {?}, show_participants = {?}, short_name = {?},
399 deadline_inscription = {?}, noinvite = {?},
400 accept_nonmembre = {?}',
401 $evt['eid'], $evt['asso_id'], $evt['organisateur_uid'],
402 $evt['intitule'], $evt['paiement_id'], $evt['descriptif'],
403 $evt['debut'], $evt['fin'], $evt['show_participants'],
404 $evt['short_name'], $evt['deadline_inscription'],
405 $evt['noinvite'], $evt['accept_nonmembre']);
407 // if new event, get its id
409 $eid = XDB
::insertId();
415 foreach ($moments as $i) {
416 if (Post
::v('titre'.$i)) {
419 $montant = strtr(Post
::v('montant'.$i), ',', '.');
420 $money_defaut +
= (float)$montant;
422 REPLACE INTO groupex.evenements_items
423 VALUES ({?}, {?}, {?}, {?}, {?})",
424 $eid, $i, Post
::v('titre'.$i),
425 Post
::v('details'.$i), $montant);
427 XDB
::execute("DELETE FROM groupex.evenements_items
428 WHERE eid = {?} AND item_id = {?}", $eid, $i);
431 // request for a new payment
432 if (Post
::v('paiement_id') == -1 && $money_defaut >= 0) {
433 require_once 'validations.inc.php';
434 $p = new PayReq(S
::v('uid'),
435 Post
::v('intitule')." - ".$globals->asso('nom'),
436 Post
::v('site'), $money_defaut,
437 Post
::v('confirmation'), 0, 999,
438 $globals->asso('id'), $eid);
442 $page->assign('paiement_message', Post
::v('confirmation'));
443 $page->assign('paiement_site', Post
::v('site'));
448 // events with no sub-event: add a sub-event with no name
449 if ($nb_moments == 0) {
450 XDB
::execute("INSERT INTO groupex.evenements_items
451 VALUES ({?}, {?}, '', '', 0)", $eid, 1);
455 pl_redirect('events');
459 // get a list of all the payment for this asso
460 $res = XDB
::iterator("SELECT id, text
461 FROM {$globals->money->mpay_tprefix}paiements
462 WHERE asso_id = {?}", $globals->asso('id'));
463 $paiements = array();
464 while ($a = $res->next()) $paiements[$a['id']] = $a['text']; {
465 $page->assign('paiements', $paiements);
468 // when modifying an old event retreive the old datas
471 "SELECT eid, intitule, descriptif, debut, fin, organisateur_uid,
472 show_participants, paiement_id, short_name,
473 deadline_inscription, noinvite, accept_nonmembre
474 FROM groupex.evenements
475 WHERE eid = {?}", $eid);
476 $evt = $res->fetchOneAssoc();
477 // find out if there is already a request for a payment for this event
478 require_once 'validations.inc.php';
479 $res = XDB
::query("SELECT stamp FROM requests
480 WHERE type = 'paiements' AND data LIKE {?}",
481 PayReq
::same_event($eid, $globals->asso('id')));
482 $stamp = $res->fetchOneCell();
484 $evt['paiement_id'] = -2;
485 $evt['paiement_req'] = $stamp;
487 $page->assign('evt', $evt);
488 // get all the different moments infos
489 $res = XDB
::iterator(
490 "SELECT item_id, titre, details, montant
491 FROM groupex.evenements_items AS ei
492 INNER JOIN groupex.evenements AS e ON(e.eid = ei.eid)
494 ORDER BY item_id", $eid);
496 while ($item = $res->next()) {
497 $items[$item['item_id']] = $item;
499 $page->assign('items', $items);
501 $page->assign('url_ref', $eid);
504 function handler_admin(&$page, $eid = null
, $item_id = null
)
508 require_once dirname(__FILE__
).'/xnetevents/xnetevents.inc.php';
510 $evt = get_event_detail($eid, $item_id);
515 $page->changeTpl('xnetevents/admin.tpl');
516 if (!$evt['show_participants'] && !may_update()) {
520 if (may_update() && Post
::v('adm')) {
521 $member = get_infos(Post
::v('mail'));
523 $page->trig("Membre introuvable");
526 // change the price paid by a participant
527 if (Env
::v('adm') == 'prix' && $member) {
528 XDB
::execute("UPDATE groupex.evenements_participants
529 SET paid = IF(paid + {?} > 0, paid + {?}, 0)
530 WHERE uid = {?} AND eid = {?} AND item_id = 1",
531 strtr(Env
::v('montant'), ',', '.'),
532 strtr(Env
::v('montant'), ',', '.'),
533 $member['uid'], $evt['eid']);
536 // change the number of personns coming with a participant
537 if (Env
::v('adm') == 'nbs' && $member) {
538 $res = XDB
::query("SELECT paid
539 FROM groupex.evenements_participants
540 WHERE uid = {?} AND eid = {?}",
541 $member['uid'], $evt['eid']);
543 $paid = intval($res->fetchOneCell());
544 $nbs = Post
::v('nb', array());
546 foreach ($nbs as $id => $nb) {
547 $nb = max(intval($nb), 0);
548 XDB
::execute("REPLACE INTO groupex.evenements_participants
549 VALUES ({?}, {?}, {?}, {?}, {?}, {?})",
550 $evt['eid'], $member['uid'], $id, $nb, '', $id == 1 ?
$paid : 0);
553 $res = XDB
::query("SELECT COUNT(uid) AS cnt, SUM(nb) AS nb
554 FROM groupex.evenements_participants
555 WHERE uid = {?} AND eid = {?}
557 $member['uid'], $evt['eid']);
558 $u = $res->fetchOneAssoc();
559 $u = $u['cnt'] ? null
: $u['nb'];
560 subscribe_lists_event($u, $member['uid'], $evt);
563 $evt = get_event_detail($eid, $item_id);
566 $page->assign_by_ref('evt', $evt);
567 $page->assign('tout', is_null($item_id));
569 if (count($evt['moments'])) {
570 $page->assign('moments', $evt['moments']);
573 $tri = (Env
::v('order') == 'alpha' ?
'promo, nom, prenom' : 'nom, prenom, promo');
574 $whereitemid = is_null($item_id) ?
'' : "AND ep.item_id = $item_id";
576 'SELECT UPPER(SUBSTRING(IF(u.nom IS NULL, m.nom,
577 IF(u.nom_usage<>"", u.nom_usage, u.nom)), 1, 1)),
578 COUNT(DISTINCT ep.uid)
579 FROM groupex.evenements_participants AS ep
580 INNER JOIN groupex.evenements AS e ON (ep.eid = e.eid)
581 LEFT JOIN groupex.membres AS m ON ( ep.uid = m.uid AND e.asso_id = m.asso_id)
582 LEFT JOIN auth_user_md5 AS u ON ( u.user_id = ep.uid )
583 WHERE ep.eid = {?} '.$whereitemid . '
584 GROUP BY UPPER(SUBSTRING(IF(u.nom IS NULL,m.nom,u.nom), 1, 1))', $evt['eid']);
588 while (list($char, $nb) = $res->next()) {
589 $alphabet[ord($char)] = $char;
591 if (Env
::has('initiale') && $char == strtoupper(Env
::v('initiale'))) {
596 $page->assign('alphabet', $alphabet);
598 if ($evt['paiement_id']) {
599 $res = XDB
::iterator(
600 "SELECT IF(u.nom_usage<>'', u.nom_usage, u.nom) AS nom, u.prenom,
601 u.promo, a.alias AS email, t.montant
602 FROM {$globals->money->mpay_tprefix}transactions AS t
603 INNER JOIN auth_user_md5 AS u ON(t.uid = u.user_id)
604 INNER JOIN aliases AS a ON (a.id = t.uid AND a.type='a_vie' )
605 LEFT JOIN groupex.evenements_participants AS ep ON(ep.uid = t.uid AND ep.eid = {?})
606 WHERE t.ref = {?} AND ep.uid IS NULL",
607 $evt['eid'], $evt['paiement_id']);
608 $page->assign('oublis', $res->total());
609 $page->assign('oubliinscription', $res);
612 $absents = XDB
::iterator("SELECT p.uid,
613 IF(m.origine = 'X', IF(u.nom_usage != '', u.nom_usage, u.nom), m.nom) AS nom,
614 IF(m.origine = 'X', u.prenom, u.prenom) AS prenom,
615 IF(m.origine = 'X', u.promo, m.origine) AS promo,
616 IF(m.origine = 'X', FIND_IN_SET('femme', u.flags), m.sexe) AS sexe,
617 IF(m.origine = 'X', a.alias, m.email) AS email
618 FROM groupex.evenements_participants AS p
619 INNER JOIN groupex.membres AS m USING(uid)
620 LEFT JOIN groupex.evenements_participants AS p2 ON (p2.uid = m.uid AND p2.eid = p.eid
622 LEFT JOIN auth_user_md5 AS u ON (u.user_id = m.uid)
623 LEFT JOIN aliases AS a ON (a.id = u.user_id AND a.type = 'a_vie')
624 WHERE p.eid = {?} AND p2.eid IS NULL
625 " . (Env
::v('initiale') ?
" AND IF(u.nom IS NULL, m.nom,
626 IF(u.nom_usage<>'', u.nom_usage, u.nom)) LIKE '" . Env
::v('initiale') . "%'"
629 ORDER BY nom, prenom, promo", $evt['eid']);
631 $ofs = Env
::i('offset');
632 $tot = (Env
::v('initiale') ?
$tot : $nb_tot) - $absents->total();
633 $nbp = intval(($tot-1)/NB_PER_PAGE
);
636 $links['précédent'] = $ofs-1;
638 for ($i = 0; $i <= $nbp; $i++
) {
639 $links[(string)($i+
1)] = $i;
642 $links['suivant'] = $ofs+
1;
644 if (count($links)>1) {
645 $page->assign('links', $links);
649 $page->assign('absents', $absents);
650 $page->assign('participants',
651 get_event_participants($evt, $item_id, $tri,
652 "LIMIT ".($ofs*NB_PER_PAGE
).", ".NB_PER_PAGE
));
656 // vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8: