5e3d31b148f7780ee822f8769d03618d9a936d3d
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/edit' => $this->make_hook('edit', AUTH_MDP
),
33 '%grp/events/admin' => $this->make_hook('admin', AUTH_MDP
),
37 function handler_events(&$page, $archive = null
)
41 if ($archive == 'archive') {
43 new_groupadmin_page('xnetevents/index.tpl');
46 new_group_open_page('xnetevents/index.tpl');
50 if (Post
::has('del')) {
52 $eid = Post
::v('del');
53 } elseif (Post
::has('archive')) {
55 $eid = Post
::v('archive');
56 } elseif (Post
::has('unarchive')) {
57 $action = 'unarchive';
58 $eid = Post
::v('unarchive');
61 if (!is_null($action)) {
63 return PL_NOT_ALLOWED
;
66 $res = XDB
::query("SELECT asso_id, short_name FROM groupex.evenements
67 WHERE eid = {?} AND asso_id = {?}",
68 $eid, $globals->asso('id'));
70 $tmp = $res->fetchOneRow();
72 return PL_NOT_ALLOWED
;
76 if ($action == 'del') {
77 // deletes the event mailing aliases
80 "DELETE FROM virtual WHERE type = 'evt' AND alias LIKE {?}",
81 $tmp[1].'-absents@%');
83 "DELETE FROM virtual WHERE type = 'evt' AND alias LIKE {?}",
84 $tmp[1].'-participants@%');
87 // deletes the event items
88 XDB
::execute("DELETE FROM groupex.evenements_items WHERE eid = {?}", $eid);
90 // deletes the event participants
91 XDB
::execute("DELETE FROM groupex.evenements_participants
92 WHERE eid = {?}", $eid);
95 XDB
::execute("DELETE FROM groupex.evenements
96 WHERE eid = {?} AND asso_id = {?}",
97 $eid, $globals->asso('id'));
99 // delete the requests for payments
100 require_once 'validations.inc.php';
101 XDB
::execute("DELETE FROM requests
102 WHERE type = 'paiements' AND data LIKE {?}",
103 PayReq
::same_event($eid, $globals->asso('id')));
106 if ($action == 'archive') {
107 XDB
::execute("UPDATE groupex.evenements
109 WHERE eid = {?} AND asso_id = {?}",
110 $eid, $globals->asso('id'));
113 if ($action == 'unarchive') {
114 XDB
::execute("UPDATE groupex.evenements
116 WHERE eid = {?} AND asso_id = {?}",
117 $eid, $globals->asso('id'));
120 $page->assign('archive', $archive);
121 $page->assign('admin', may_update());
123 $evenements = XDB
::iterator(
124 "SELECT e.*, LEFT(10, e.debut) AS debut_day, LEFT(10, e.fin) AS fin_day,
125 IF(e.deadline_inscription, e.deadline_inscription >= LEFT(NOW(), 10),
126 1) AS inscr_open, e.deadline_inscription,
127 u.nom, u.prenom, u.promo, a.alias,
128 MAX(ep.nb) AS inscrit, MAX(ep.paid) AS paid
129 FROM groupex.evenements AS e
130 INNER JOIN x4dat.auth_user_md5 AS u ON u.user_id = e.organisateur_uid
131 INNER JOIN x4dat.aliases AS a ON (a.type = 'a_vie' AND a.id = u.user_id)
132 LEFT JOIN groupex.evenements_participants AS ep ON (ep.eid = e.eid AND ep.uid = {?})
134 AND archive = " . ($archive ?
"1 " : "0 ")
135 . (is_member() ||
may_update() ?
"" : " AND accept_nonmembre != 0 ")
137 ORDER BY inscr_open DESC, debut DESC", S
::v('uid'), $globals->asso('id'));
141 while ($e = $evenements->next()) {
142 $e['show_participants'] = ($e['show_participants'] && (is_member() ||
may_update()));
144 "SELECT titre, details, montant, ei.item_id, nb
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 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);
171 $page->assign('evenements', $evts);
172 $page->assign('is_member', is_member());
175 function handler_sub(&$page, $eid = null
)
177 require_once dirname(__FILE__
).'/xnetevents/xnetevents.inc.php';
179 new_group_open_page('xnetevents/subscribe.tpl');
181 $evt = get_event_detail($eid);
186 if (!$evt['inscr_open']) {
187 $page->kill('Les inscriptions pour cet événement sont closes');
189 if (!$evt['accept_nonmembre'] && !is_member() && !may_update()) {
190 $page->kill('Cet événement est fermé aux non-membres du groupe');
193 $page->assign('event', $evt);
195 if (!Post
::has('submit')) {
199 $moments = Post
::v('moment', array());
200 $pers = Post
::v('personnes', array());
203 foreach ($moments as $j => $v) {
204 $subs[$j] = intval($v);
206 // retreive ohter field when more than one person
207 if ($subs[$j] == 2) {
208 if (!isset($pers[$j]) ||
!is_numeric($pers[$j])
211 $page->trig('Tu dois choisir un nombre d\'invités correct !');
214 $subs[$j] = 1 +
$pers[$j];
218 // impossible to unsubscribe if you already paid sthing
219 if (array_sum($subs) && $evt['paid'] != 0) {
220 $page->trig("Impossible de te désinscrire complètement ".
221 "parce que tu as fait un paiement par ".
222 "chèque ou par liquide. Contacte un ".
223 "administrateur du groupe si tu es sûr de ".
228 // update actual inscriptions
229 foreach ($subs as $j => $nb) {
232 "REPLACE INTO groupex.evenements_participants
233 VALUES ({?}, {?}, {?}, {?}, {?})",
234 $eid, S
::v('uid'), $j, $nb, $evt['paid']);
235 $page->assign('updated', true
);
238 "DELETE FROM groupex.evenements_participants
239 WHERE eid = {?} AND uid = {?} AND item_id = {?}",
240 $eid, S
::v("uid"), $j);
241 $page->assign('updated', true
);
245 $page->assign('event', get_event_detail($eid));
248 function handler_csv(&$page, $eid = null
, $item_id = null
)
250 require_once dirname(__FILE__
).'/xnetevents/xnetevents.inc.php';
252 if (!is_numeric($item_id)) {
256 $evt = get_event_detail($eid, $item_id);
261 header('Content-type: text/x-csv; encoding=iso-8859-1');
263 header('Cache-Control: ');
265 $page->changeTpl('xnetevents/csv.tpl', NO_SKIN
);
267 $admin = may_update();
269 $tri = (Env
::v('order') == 'alpha' ?
'promo, nom, prenom' : 'nom, prenom, promo');
271 $page->assign('participants',
272 get_event_participants($evt, $item_id, $tri));
274 $page->assign('admin', $admin);
275 $page->assign('moments', $evt['moments']);
276 $page->assign('money', $evt['money']);
277 $page->assign('tout', !Env
::v('item_id', false
));
280 function handler_edit(&$page, $eid = null
)
284 // check the event is in our group
285 if (!is_null($eid)) {
286 $res = XDB
::query("SELECT short_name, asso_id
287 FROM groupex.evenements
288 WHERE eid = {?}", $eid);
289 $infos = $res->fetchOneAssoc();
290 if ($infos['asso_id'] != $globals->asso('id')) {
291 return PL_NOT_ALLOWED
;
295 new_groupadmin_page('xnetevents/edit.tpl');
297 $moments = range(1, 4);
298 $page->assign('moments', $moments);
300 if (Post
::v('intitule')) {
301 require_once dirname(__FILE__
).'/xnetevents/xnetevents.inc.php';
302 $short_name = event_change_shortname($page, $infos['short_name'],
303 Env
::v('short_name', ''));
307 'asso_id' => $globals->asso('id'),
308 'organisateur_uid' => S
::v('uid'),
309 'paiement_id' => Post
::v('paiement_id') > 0 ? Post
::v('paiement_id') : null
,
310 'debut' => Post
::v('deb_Year').'-'.Post
::v('deb_Month')
311 .'-'.Post
::v('deb_Day').' '.Post
::v('deb_Hour')
312 .':'.Post
::v('deb_Minute').':00',
313 'fin' => Post
::v('fin_Year').'-'.Post
::v('fin_Month')
314 .'-'.Post
::v('fin_Day').' '.Post
::v('fin_Hour')
315 .':'.Post
::v('fin_Minute').':00',
316 'short_name' => $short_name,
319 $trivial = array('intitule', 'descriptif', 'noinvite',
320 'show_participants', 'accept_nonmembre');
321 foreach ($trivial as $k) {
322 $evt[$k] = Post
::v($k);
325 if (Post
::v('deadline')) {
326 $evt['deadline_inscription'] = Post
::v('inscr_Year').'-'
327 . Post
::v('inscr_Month').'-'
328 . Post
::v('inscr_Day');
330 $evt['deadline_inscription'] = null
;
333 // Store the modifications in the database
334 XDB
::execute('REPLACE INTO groupex.evenements
335 SET eid={?}, asso_id={?}, organisateur_uid={?}, intitule={?},
336 paiement_id = {?}, descriptif = {?}, debut = {?},
337 fin = {?}, show_participants = {?}, short_name = {?},
338 deadline_inscription = {?}, noinvite = {?},
339 accept_nonmembre = {?}',
340 $evt['eid'], $evt['asso_id'], $evt['organisateur_uid'],
341 $evt['intitule'], $evt['paiement_id'], $evt['descriptif'],
342 $evt['debut'], $evt['fin'], $evt['show_participants'],
343 $evt['short_name'], $evt['deadline_inscription'],
344 $evt['noinvite'], $evt['accept_nonmembre']);
346 // if new event, get its id
348 $eid = mysql_insert_id();
354 foreach ($moments as $i) {
355 if (Post
::v('titre'.$i)) {
358 $montant = strtr(Post
::v('montant'.$i), ',', '.');
359 $money_defaut +
= (float)$montant;
361 REPLACE INTO groupex.evenements_items
362 VALUES ({?}, {?}, {?}, {?}, {?})",
363 $eid, $i, Post
::v('titre'.$i),
364 Post
::v('details'.$i), $montant);
366 XDB
::execute("DELETE FROM groupex.evenements_items
367 WHERE eid = {?} AND item_id = {?}", $eid, $i);
371 // request for a new payment
372 if (Post
::v('paiement_id') == -1 && $money_defaut >= 0) {
373 require_once 'validations.inc.php';
374 $p = new PayReq(S
::v('uid'),
375 Post
::v('intitule')." - ".$globals->asso('nom'),
376 Post
::v('site'), $money_defaut,
377 Post
::v('confirmation'), 0, 999,
378 $globals->asso('id'), $eid);
382 // events with no sub-event: add a sub-event with no name
383 if ($nb_moments == 0) {
384 XDB
::execute("INSERT INTO groupex.evenements_items
385 VALUES ({?}, {?}, '', '', 0)", $eid, 1);
388 if (is_null($evt['eid'])) {
389 pl_redirect('events/'.$eid);
393 // get a list of all the payment for this asso
394 $res = XDB
::iterator("SELECT id, text
395 FROM {$globals->money->mpay_tprefix}paiements
396 WHERE asso_id = {?}", $globals->asso('id'));
397 $paiements = array();
398 while ($a = $res->next()) $paiements[$a['id']] = $a['text']; {
399 $page->assign('paiements', $paiements);
402 // when modifying an old event retreive the old datas
405 "SELECT eid, intitule, descriptif, debut, fin,
406 show_participants, paiement_id, short_name,
407 deadline_inscription, noinvite, accept_nonmembre
408 FROM groupex.evenements
409 WHERE eid = {?}", $eid);
410 $evt = $res->fetchOneAssoc();
411 // find out if there is already a request for a payment for this event
412 require_once 'validations.inc.php';
413 $res = XDB
::query("SELECT stamp FROM requests
414 WHERE type = 'paiements' AND data LIKE {?}",
415 PayReq
::same_event($eid, $globals->asso('id')));
416 $stamp = $res->fetchOneCell();
418 $evt['paiement_id'] = -2;
419 $evt['paiement_req'] = $stamp;
421 $page->assign('evt', $evt);
422 // get all the different moments infos
423 $res = XDB
::iterator(
424 "SELECT item_id, titre, details, montant
425 FROM groupex.evenements_items AS ei
426 INNER JOIN groupex.evenements AS e ON(e.eid = ei.eid)
428 ORDER BY item_id", $eid);
430 while ($item = $res->next()) {
431 $items[$item['item_id']] = $item;
433 $page->assign('items', $items);
437 function handler_admin(&$page, $eid = null
, $item_id = null
)
441 require_once dirname(__FILE__
).'/xnetevents/xnetevents.inc.php';
443 $evt = get_event_detail($eid, $item_id);
448 if ($evt['show_participants']) {
449 new_group_page('xnetevents/admin.tpl');
451 new_groupadmin_page('xnetevents/admin.tpl');
454 if (may_update() && Post
::v('adm')) {
455 $member = get_infos(Post
::v('mail'));
457 $page->trig("Membre introuvable");
460 // change the price paid by a participant
461 if (Env
::v('adm') == 'prix' && $member) {
462 XDB
::execute("UPDATE groupex.evenements_participants
463 SET paid = IF(paid + {?} > 0, paid + {?}, 0)
464 WHERE uid = {?} AND eid = {?}",
465 strtr(Env
::v('montant'), ',', '.'),
466 strtr(Env
::v('montant'), ',', '.'),
467 $member['uid'], $eid);
470 // change the number of personns coming with a participant
471 if (Env
::v('adm') == 'nbs' && $member) {
472 $res = XDB
::query("SELECT paid
473 FROM groupex.evenements_participants
474 WHERE uid = {?} AND eid = {?}",
475 $member['uid'], $eid);
477 $paid = intval($res->fetchOneCell());
478 $nbs = Post
::v('nb', array());
480 foreach ($nbs as $id => $nb) {
481 $nb = max(intval($nb), 0);
484 XDB
::execute("REPLACE INTO groupex.evenements_participants
485 VALUES ({?}, {?}, {?}, {?}, {?})",
486 $eid, $member['uid'], $id, $nb, $paid);
488 XDB
::execute("DELETE FROM groupex.evenements_participants
489 WHERE uid = {?} AND eid = {?} AND item_id = {?}",
490 $member['uid'], $eid, $id);
494 $res = XDB
::query("SELECT uid FROM groupex.evenements_participants
495 WHERE uid = {?} AND eid = {?}",
496 $member['uid'], $eid);
497 $u = $res->fetchOneCell();
498 subscribe_lists_event($u, $member['uid'], $evt);
501 $evt = get_event_detail($eid, $item_id);
504 $page->assign('admin', may_update());
505 $page->assign('evt', $evt);
506 $page->assign('tout', is_null($item_id));
508 if (count($evt['moments'])) {
509 $page->assign('moments', $evt['moments']);
512 $tri = (Env
::v('order') == 'alpha' ?
'promo, nom, prenom' : 'nom, prenom, promo');
513 $whereitemid = is_null($item_id) ?
'' : "AND ep.item_id = $item_id";
515 'SELECT UPPER(SUBSTRING(IF(u.nom IS NULL, m.nom,
516 IF(u.nom_usage<>"", u.nom_usage, u.nom)), 1, 1)),
517 COUNT(DISTINCT ep.uid)
518 FROM groupex.evenements_participants AS ep
519 INNER JOIN groupex.evenements AS e ON (ep.eid = e.eid)
520 LEFT JOIN groupex.membres AS m ON ( ep.uid = m.uid AND e.asso_id = m.asso_id)
521 LEFT JOIN auth_user_md5 AS u ON ( u.user_id = ep.uid )
522 WHERE ep.eid = {?} '.$whereitemid.'
523 GROUP BY UPPER(SUBSTRING(IF(u.nom IS NULL,m.nom,u.nom), 1, 1))', $eid);
527 while (list($char, $nb) = $res->next()) {
528 $alphabet[ord($char)] = $char;
530 if (Env
::has('initiale') && $char == strtoupper(Env
::v('initiale'))) {
535 $page->assign('alphabet', $alphabet);
537 $ofs = Env
::i('offset');
538 $tot = Env
::v('initiale') ?
$tot : $nb_tot;
539 $nbp = intval(($tot-1)/NB_PER_PAGE
);
542 $links['précédent'] = $ofs-1;
544 for ($i = 0; $i <= $nbp; $i++
) {
545 $links[(string)($i+
1)] = $i;
548 $links['suivant'] = $ofs+
1;
550 if (count($links)>1) {
551 $page->assign('links', $links);
554 if ($evt['paiement_id']) {
555 $res = XDB
::iterator(
556 "SELECT IF(u.nom_usage<>'', u.nom_usage, u.nom) AS nom, u.prenom,
557 u.promo, a.alias AS email, t.montant
558 FROM {$globals->money->mpay_tprefix}transactions AS t
559 INNER JOIN auth_user_md5 AS u ON(t.uid = u.user_id)
560 INNER JOIN aliases AS a ON (a.id = t.uid AND a.type='a_vie' )
561 LEFT JOIN groupex.evenements_participants AS ep ON(ep.uid = t.uid AND ep.eid = {?})
562 WHERE t.ref = {?} AND ep.uid IS NULL",
563 $evt['eid'], $evt['paiement_id']);
564 $page->assign('oublis', $res->total());
565 $page->assign('oubliinscription', $res);
568 $page->assign('participants',
569 get_event_participants($evt, $item_id, $tri,
570 "LIMIT ".($ofs*NB_PER_PAGE
).", ".NB_PER_PAGE
));