15eaa7fc24e28001c2f84a08ce64519178815c38
2 /***************************************************************************
3 * Copyright (C) 2003-2006 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
),
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)) {
64 return PL_NOT_ALLOWED
;
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();
73 return PL_NOT_ALLOWED
;
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 $page->assign('admin', may_update());
124 $evenements = XDB
::iterator(
125 "SELECT e.*, LEFT(10, e.debut) AS debut_day, LEFT(10, e.fin) AS fin_day,
126 IF(e.deadline_inscription, e.deadline_inscription >= LEFT(NOW(), 10),
127 1) AS inscr_open, e.deadline_inscription,
128 u.nom, u.prenom, u.promo, a.alias,
129 MAX(ep.nb) AS inscrit, MAX(ep.paid) AS paid
130 FROM groupex.evenements AS e
131 INNER JOIN x4dat.auth_user_md5 AS u ON u.user_id = e.organisateur_uid
132 INNER JOIN x4dat.aliases AS a ON (a.type = 'a_vie' AND a.id = u.user_id)
133 LEFT JOIN groupex.evenements_participants AS ep ON (ep.eid = e.eid AND ep.uid = {?})
135 AND archive = " . ($archive ?
"1 " : "0 ")
136 . (is_member() ||
may_update() ?
"" : " AND accept_nonmembre != 0 ")
138 ORDER BY inscr_open DESC, debut DESC", S
::v('uid'), $globals->asso('id'));
142 while ($e = $evenements->next()) {
143 $e['show_participants'] = ($e['show_participants'] && (is_member() ||
may_update()));
145 "SELECT titre, details, montant, ei.item_id, nb
146 FROM groupex.evenements_items AS ei
147 LEFT JOIN groupex.evenements_participants AS ep
148 ON (ep.eid = ei.eid AND ep.item_id = ei.item_id AND uid = {?})
150 S
::v('uid'), $e['eid']);
151 $e['moments'] = $res->fetchAllAssoc();
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);
172 $page->assign('evenements', $evts);
173 $page->assign('is_member', is_member());
176 function handler_sub(&$page, $eid = null
)
178 require_once dirname(__FILE__
).'/xnetevents/xnetevents.inc.php';
180 new_group_open_page('xnetevents/subscribe.tpl');
182 $evt = get_event_detail($eid);
187 if (!$evt['inscr_open']) {
188 $page->kill('Les inscriptions pour cet événement sont closes');
190 if (!$evt['accept_nonmembre'] && !is_member() && !may_update()) {
191 $page->kill('Cet événement est fermé aux non-membres du groupe');
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
230 foreach ($subs as $j => $nb) {
233 "REPLACE INTO groupex.evenements_participants
234 VALUES ({?}, {?}, {?}, {?}, {?})",
235 $eid, S
::v('uid'), $j, $nb, $evt['paid']);
236 $page->assign('updated', true
);
239 "DELETE FROM groupex.evenements_participants
240 WHERE eid = {?} AND uid = {?} AND item_id = {?}",
241 $eid, S
::v("uid"), $j);
242 $page->assign('updated', true
);
246 $page->assign('event', get_event_detail($eid));
249 function handler_csv(&$page, $eid = null
, $item_id = null
)
251 require_once dirname(__FILE__
).'/xnetevents/xnetevents.inc.php';
253 if (!is_numeric($item_id)) {
257 $evt = get_event_detail($eid, $item_id);
262 header('Content-type: text/x-csv; encoding=iso-8859-1');
264 header('Cache-Control: ');
266 $page->changeTpl('xnetevents/csv.tpl', NO_SKIN
);
268 $admin = may_update();
270 $tri = (Env
::v('order') == 'alpha' ?
'promo, nom, prenom' : 'nom, prenom, promo');
272 $page->assign('participants',
273 get_event_participants($evt, $item_id, $tri));
275 $page->assign('admin', $admin);
276 $page->assign('moments', $evt['moments']);
277 $page->assign('money', $evt['money']);
278 $page->assign('tout', !Env
::v('item_id', false
));
281 function handler_ical(&$page, $eid = null
)
285 require_once dirname(__FILE__
).'/xnetevents/xnetevents.inc.php';
286 $evt = get_event_detail($eid);
290 $evt['debut'] = preg_replace('/(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)/', "\\1\\2\\3T\\4\\5\\6", $evt['debut']);
291 $evt['fin'] = preg_replace('/(\d+)-(\d+)-(\d+) (\d+):(\d+):(\d+)/', "\\1\\2\\3T\\4\\5\\6", $evt['fin']);
293 foreach ($evt['moments'] as $m) {
294 $evt['descriptif'] .= "\n\n** " . $m['titre'] . " **\n" . $m['details'];
297 $page->changeTpl('xnetevents/calendar.tpl', NO_SKIN
);
299 require_once('ical.inc.php');
300 $page->assign('asso', $globals->asso());
301 $page->assign('timestamp', time());
302 $page->assign('admin', may_update());
305 $page->assign('participants', get_event_participants($evt, null
, 'promo, nom, prenom'));
307 $page->register_function('display_ical', 'display_ical');
308 $page->assign_by_ref('e', $evt);
310 header('Content-Type: text/calendar; charset=utf-8');
313 function handler_edit(&$page, $eid = null
)
317 // get eid if the the given one is a short name
318 if (!is_null($eid) && !is_numeric($eid)) {
319 $res = XDB
::query("SELECT eid
320 FROM groupex.evenements
321 WHERE asso_id = {?} AND short_name = {?}",
322 $globals->asso('id'), $eid);
323 if ($res->numRows()) {
324 $eid = (int)$res->fetchOneCell();
328 // check the event is in our group
329 if (!is_null($eid)) {
330 $res = XDB
::query("SELECT short_name, asso_id
331 FROM groupex.evenements
332 WHERE eid = {?}", $eid);
333 $infos = $res->fetchOneAssoc();
334 if ($infos['asso_id'] != $globals->asso('id')) {
335 return PL_NOT_ALLOWED
;
339 new_groupadmin_page('xnetevents/edit.tpl');
341 $moments = range(1, 4);
342 $page->assign('moments', $moments);
344 if (Post
::v('intitule')) {
345 require_once dirname(__FILE__
).'/xnetevents/xnetevents.inc.php';
346 $short_name = event_change_shortname($page, $infos['short_name'],
347 Env
::v('short_name', ''));
351 'asso_id' => $globals->asso('id'),
352 'paiement_id' => Post
::v('paiement_id') > 0 ? Post
::v('paiement_id') : null
,
353 'debut' => Post
::v('deb_Year').'-'.Post
::v('deb_Month')
354 .'-'.Post
::v('deb_Day').' '.Post
::v('deb_Hour')
355 .':'.Post
::v('deb_Minute').':00',
356 'fin' => Post
::v('fin_Year').'-'.Post
::v('fin_Month')
357 .'-'.Post
::v('fin_Day').' '.Post
::v('fin_Hour')
358 .':'.Post
::v('fin_Minute').':00',
359 'short_name' => $short_name,
362 $trivial = array('intitule', 'descriptif', 'noinvite',
363 'show_participants', 'accept_nonmembre', 'organisateur_uid');
364 foreach ($trivial as $k) {
365 $evt[$k] = Post
::v($k);
368 $evt['organisateur_uid'] = S
::v('uid');
371 if (Post
::v('deadline')) {
372 $evt['deadline_inscription'] = Post
::v('inscr_Year').'-'
373 . Post
::v('inscr_Month').'-'
374 . Post
::v('inscr_Day');
376 $evt['deadline_inscription'] = null
;
379 // Store the modifications in the database
380 XDB
::execute('REPLACE INTO groupex.evenements
381 SET eid={?}, asso_id={?}, organisateur_uid={?}, intitule={?},
382 paiement_id = {?}, descriptif = {?}, debut = {?},
383 fin = {?}, show_participants = {?}, short_name = {?},
384 deadline_inscription = {?}, noinvite = {?},
385 accept_nonmembre = {?}',
386 $evt['eid'], $evt['asso_id'], $evt['organisateur_uid'],
387 $evt['intitule'], $evt['paiement_id'], $evt['descriptif'],
388 $evt['debut'], $evt['fin'], $evt['show_participants'],
389 $evt['short_name'], $evt['deadline_inscription'],
390 $evt['noinvite'], $evt['accept_nonmembre']);
392 // if new event, get its id
394 $eid = mysql_insert_id();
400 foreach ($moments as $i) {
401 if (Post
::v('titre'.$i)) {
404 $montant = strtr(Post
::v('montant'.$i), ',', '.');
405 $money_defaut +
= (float)$montant;
407 REPLACE INTO groupex.evenements_items
408 VALUES ({?}, {?}, {?}, {?}, {?})",
409 $eid, $i, Post
::v('titre'.$i),
410 Post
::v('details'.$i), $montant);
412 XDB
::execute("DELETE FROM groupex.evenements_items
413 WHERE eid = {?} AND item_id = {?}", $eid, $i);
417 // request for a new payment
418 if (Post
::v('paiement_id') == -1 && $money_defaut >= 0) {
419 require_once 'validations.inc.php';
420 $p = new PayReq(S
::v('uid'),
421 Post
::v('intitule')." - ".$globals->asso('nom'),
422 Post
::v('site'), $money_defaut,
423 Post
::v('confirmation'), 0, 999,
424 $globals->asso('id'), $eid);
428 // events with no sub-event: add a sub-event with no name
429 if ($nb_moments == 0) {
430 XDB
::execute("INSERT INTO groupex.evenements_items
431 VALUES ({?}, {?}, '', '', 0)", $eid, 1);
434 pl_redirect('events');
437 // get a list of all the payment for this asso
438 $res = XDB
::iterator("SELECT id, text
439 FROM {$globals->money->mpay_tprefix}paiements
440 WHERE asso_id = {?}", $globals->asso('id'));
441 $paiements = array();
442 while ($a = $res->next()) $paiements[$a['id']] = $a['text']; {
443 $page->assign('paiements', $paiements);
446 // when modifying an old event retreive the old datas
449 "SELECT eid, intitule, descriptif, debut, fin, organisateur_uid,
450 show_participants, paiement_id, short_name,
451 deadline_inscription, noinvite, accept_nonmembre
452 FROM groupex.evenements
453 WHERE eid = {?}", $eid);
454 $evt = $res->fetchOneAssoc();
455 // find out if there is already a request for a payment for this event
456 require_once 'validations.inc.php';
457 $res = XDB
::query("SELECT stamp FROM requests
458 WHERE type = 'paiements' AND data LIKE {?}",
459 PayReq
::same_event($eid, $globals->asso('id')));
460 $stamp = $res->fetchOneCell();
462 $evt['paiement_id'] = -2;
463 $evt['paiement_req'] = $stamp;
465 $page->assign('evt', $evt);
466 // get all the different moments infos
467 $res = XDB
::iterator(
468 "SELECT item_id, titre, details, montant
469 FROM groupex.evenements_items AS ei
470 INNER JOIN groupex.evenements AS e ON(e.eid = ei.eid)
472 ORDER BY item_id", $eid);
474 while ($item = $res->next()) {
475 $items[$item['item_id']] = $item;
477 $page->assign('items', $items);
479 $page->assign('url_ref', $eid);
482 function handler_admin(&$page, $eid = null
, $item_id = null
)
486 require_once dirname(__FILE__
).'/xnetevents/xnetevents.inc.php';
488 $evt = get_event_detail($eid, $item_id);
493 if ($evt['show_participants']) {
494 new_group_page('xnetevents/admin.tpl');
496 new_groupadmin_page('xnetevents/admin.tpl');
499 if (may_update() && Post
::v('adm')) {
500 $member = get_infos(Post
::v('mail'));
502 $page->trig("Membre introuvable");
505 // change the price paid by a participant
506 if (Env
::v('adm') == 'prix' && $member) {
507 XDB
::execute("UPDATE groupex.evenements_participants
508 SET paid = IF(paid + {?} > 0, paid + {?}, 0)
509 WHERE uid = {?} AND eid = {?}",
510 strtr(Env
::v('montant'), ',', '.'),
511 strtr(Env
::v('montant'), ',', '.'),
512 $member['uid'], $eid);
515 // change the number of personns coming with a participant
516 if (Env
::v('adm') == 'nbs' && $member) {
517 $res = XDB
::query("SELECT paid
518 FROM groupex.evenements_participants
519 WHERE uid = {?} AND eid = {?}",
520 $member['uid'], $eid);
522 $paid = intval($res->fetchOneCell());
523 $nbs = Post
::v('nb', array());
525 foreach ($nbs as $id => $nb) {
526 $nb = max(intval($nb), 0);
529 XDB
::execute("REPLACE INTO groupex.evenements_participants
530 VALUES ({?}, {?}, {?}, {?}, {?})",
531 $eid, $member['uid'], $id, $nb, $paid);
533 XDB
::execute("DELETE FROM groupex.evenements_participants
534 WHERE uid = {?} AND eid = {?} AND item_id = {?}",
535 $member['uid'], $eid, $id);
539 $res = XDB
::query("SELECT uid FROM groupex.evenements_participants
540 WHERE uid = {?} AND eid = {?}",
541 $member['uid'], $eid);
542 $u = $res->fetchOneCell();
543 subscribe_lists_event($u, $member['uid'], $evt);
546 $evt = get_event_detail($eid, $item_id);
549 $page->assign('admin', may_update());
550 $page->assign('evt', $evt);
551 $page->assign('tout', is_null($item_id));
553 if (count($evt['moments'])) {
554 $page->assign('moments', $evt['moments']);
557 $tri = (Env
::v('order') == 'alpha' ?
'promo, nom, prenom' : 'nom, prenom, promo');
558 $whereitemid = is_null($item_id) ?
'' : "AND ep.item_id = $item_id";
560 'SELECT UPPER(SUBSTRING(IF(u.nom IS NULL, m.nom,
561 IF(u.nom_usage<>"", u.nom_usage, u.nom)), 1, 1)),
562 COUNT(DISTINCT ep.uid)
563 FROM groupex.evenements_participants AS ep
564 INNER JOIN groupex.evenements AS e ON (ep.eid = e.eid)
565 LEFT JOIN groupex.membres AS m ON ( ep.uid = m.uid AND e.asso_id = m.asso_id)
566 LEFT JOIN auth_user_md5 AS u ON ( u.user_id = ep.uid )
567 WHERE ep.eid = {?} '.$whereitemid.'
568 GROUP BY UPPER(SUBSTRING(IF(u.nom IS NULL,m.nom,u.nom), 1, 1))', $eid);
572 while (list($char, $nb) = $res->next()) {
573 $alphabet[ord($char)] = $char;
575 if (Env
::has('initiale') && $char == strtoupper(Env
::v('initiale'))) {
580 $page->assign('alphabet', $alphabet);
582 $ofs = Env
::i('offset');
583 $tot = Env
::v('initiale') ?
$tot : $nb_tot;
584 $nbp = intval(($tot-1)/NB_PER_PAGE
);
587 $links['précédent'] = $ofs-1;
589 for ($i = 0; $i <= $nbp; $i++
) {
590 $links[(string)($i+
1)] = $i;
593 $links['suivant'] = $ofs+
1;
595 if (count($links)>1) {
596 $page->assign('links', $links);
599 if ($evt['paiement_id']) {
600 $res = XDB
::iterator(
601 "SELECT IF(u.nom_usage<>'', u.nom_usage, u.nom) AS nom, u.prenom,
602 u.promo, a.alias AS email, t.montant
603 FROM {$globals->money->mpay_tprefix}transactions AS t
604 INNER JOIN auth_user_md5 AS u ON(t.uid = u.user_id)
605 INNER JOIN aliases AS a ON (a.id = t.uid AND a.type='a_vie' )
606 LEFT JOIN groupex.evenements_participants AS ep ON(ep.uid = t.uid AND ep.eid = {?})
607 WHERE t.ref = {?} AND ep.uid IS NULL",
608 $evt['eid'], $evt['paiement_id']);
609 $page->assign('oublis', $res->total());
610 $page->assign('oubliinscription', $res);
613 $page->assign('participants',
614 get_event_participants($evt, $item_id, $tri,
615 "LIMIT ".($ofs*NB_PER_PAGE
).", ".NB_PER_PAGE
));