5e3d31b148f7780ee822f8769d03618d9a936d3d
[platal.git] / modules / xnetevents.php
1 <?php
2 /***************************************************************************
3 * Copyright (C) 2003-2006 Polytechnique.org *
4 * http://opensource.polytechnique.org/ *
5 * *
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. *
10 * *
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. *
15 * *
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 *
18 * Foundation, Inc., *
19 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA *
20 ***************************************************************************/
21
22 define('NB_PER_PAGE', 25);
23
24 class XnetEventsModule extends PLModule
25 {
26 function handlers()
27 {
28 return array(
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),
34 );
35 }
36
37 function handler_events(&$page, $archive = null)
38 {
39 global $globals;
40
41 if ($archive == 'archive') {
42 $archive = true;
43 new_groupadmin_page('xnetevents/index.tpl');
44 } else {
45 $archive = false;
46 new_group_open_page('xnetevents/index.tpl');
47 }
48
49 $action = null;
50 if (Post::has('del')) {
51 $action = 'del';
52 $eid = Post::v('del');
53 } elseif (Post::has('archive')) {
54 $action = 'archive';
55 $eid = Post::v('archive');
56 } elseif (Post::has('unarchive')) {
57 $action = 'unarchive';
58 $eid = Post::v('unarchive');
59 }
60
61 if (!is_null($action)) {
62 if (!may_update()) {
63 return PL_NOT_ALLOWED;
64 }
65
66 $res = XDB::query("SELECT asso_id, short_name FROM groupex.evenements
67 WHERE eid = {?} AND asso_id = {?}",
68 $eid, $globals->asso('id'));
69
70 $tmp = $res->fetchOneRow();
71 if (!$tmp) {
72 return PL_NOT_ALLOWED;
73 }
74 }
75
76 if ($action == 'del') {
77 // deletes the event mailing aliases
78 if ($tmp[1]) {
79 XDB::execute(
80 "DELETE FROM virtual WHERE type = 'evt' AND alias LIKE {?}",
81 $tmp[1].'-absents@%');
82 XDB::execute(
83 "DELETE FROM virtual WHERE type = 'evt' AND alias LIKE {?}",
84 $tmp[1].'-participants@%');
85 }
86
87 // deletes the event items
88 XDB::execute("DELETE FROM groupex.evenements_items WHERE eid = {?}", $eid);
89
90 // deletes the event participants
91 XDB::execute("DELETE FROM groupex.evenements_participants
92 WHERE eid = {?}", $eid);
93
94 // deletes the event
95 XDB::execute("DELETE FROM groupex.evenements
96 WHERE eid = {?} AND asso_id = {?}",
97 $eid, $globals->asso('id'));
98
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')));
104 }
105
106 if ($action == 'archive') {
107 XDB::execute("UPDATE groupex.evenements
108 SET archive = 1
109 WHERE eid = {?} AND asso_id = {?}",
110 $eid, $globals->asso('id'));
111 }
112
113 if ($action == 'unarchive') {
114 XDB::execute("UPDATE groupex.evenements
115 SET archive = 0
116 WHERE eid = {?} AND asso_id = {?}",
117 $eid, $globals->asso('id'));
118 }
119
120 $page->assign('archive', $archive);
121 $page->assign('admin', may_update());
122
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 = {?})
133 WHERE asso_id = {?}
134 AND archive = " . ($archive ? "1 " : "0 ")
135 . (is_member() || may_update() ? "" : " AND accept_nonmembre != 0 ")
136 . "GROUP BY e.eid
137 ORDER BY inscr_open DESC, debut DESC", S::v('uid'), $globals->asso('id'));
138
139 $evts = array();
140
141 while ($e = $evenements->next()) {
142 $e['show_participants'] = ($e['show_participants'] && (is_member() || may_update()));
143 $res = XDB::query(
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 = {?})
148 WHERE ei.eid = {?}",
149 S::v('uid'), $e['eid']);
150 $e['moments'] = $res->fetchAllAssoc();
151
152 $e['topay'] = 0;
153 foreach ($e['moments'] as $m) {
154 $e['topay'] += $m['nb'] * $m['montant'];
155 }
156
157 $query = XDB::query(
158 "SELECT 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();
162
163 foreach ($montants as $m) {
164 $p = strtr(substr($m, 0, strpos($m, 'EUR')), ',', '.');
165 $e['paid'] += trim($p);
166 }
167
168 $evts[] = $e;
169 }
170
171 $page->assign('evenements', $evts);
172 $page->assign('is_member', is_member());
173 }
174
175 function handler_sub(&$page, $eid = null)
176 {
177 require_once dirname(__FILE__).'/xnetevents/xnetevents.inc.php';
178
179 new_group_open_page('xnetevents/subscribe.tpl');
180
181 $evt = get_event_detail($eid);
182 if (!$evt) {
183 return PL_NOT_FOUND;
184 }
185
186 if (!$evt['inscr_open']) {
187 $page->kill('Les inscriptions pour cet événement sont closes');
188 }
189 if (!$evt['accept_nonmembre'] && !is_member() && !may_update()) {
190 $page->kill('Cet événement est fermé aux non-membres du groupe');
191 }
192
193 $page->assign('event', $evt);
194
195 if (!Post::has('submit')) {
196 return;
197 }
198
199 $moments = Post::v('moment', array());
200 $pers = Post::v('personnes', array());
201 $subs = array();
202
203 foreach ($moments as $j => $v) {
204 $subs[$j] = intval($v);
205
206 // retreive ohter field when more than one person
207 if ($subs[$j] == 2) {
208 if (!isset($pers[$j]) || !is_numeric($pers[$j])
209 || $pers[$j] < 0)
210 {
211 $page->trig('Tu dois choisir un nombre d\'invités correct !');
212 return;
213 }
214 $subs[$j] = 1 + $pers[$j];
215 }
216 }
217
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 ".
224 "ne pas venir");
225 return;
226 }
227
228 // update actual inscriptions
229 foreach ($subs as $j => $nb) {
230 if ($nb > 0) {
231 XDB::execute(
232 "REPLACE INTO groupex.evenements_participants
233 VALUES ({?}, {?}, {?}, {?}, {?})",
234 $eid, S::v('uid'), $j, $nb, $evt['paid']);
235 $page->assign('updated', true);
236 } else {
237 XDB::execute(
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);
242 }
243 }
244
245 $page->assign('event', get_event_detail($eid));
246 }
247
248 function handler_csv(&$page, $eid = null, $item_id = null)
249 {
250 require_once dirname(__FILE__).'/xnetevents/xnetevents.inc.php';
251
252 if (!is_numeric($item_id)) {
253 $item_id = null;
254 }
255
256 $evt = get_event_detail($eid, $item_id);
257 if (!$evt) {
258 return PL_NOT_FOUND;
259 }
260
261 header('Content-type: text/x-csv; encoding=iso-8859-1');
262 header('Pragma: ');
263 header('Cache-Control: ');
264
265 $page->changeTpl('xnetevents/csv.tpl', NO_SKIN);
266
267 $admin = may_update();
268
269 $tri = (Env::v('order') == 'alpha' ? 'promo, nom, prenom' : 'nom, prenom, promo');
270
271 $page->assign('participants',
272 get_event_participants($evt, $item_id, $tri));
273
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));
278 }
279
280 function handler_edit(&$page, $eid = null)
281 {
282 global $globals;
283
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;
292 }
293 }
294
295 new_groupadmin_page('xnetevents/edit.tpl');
296
297 $moments = range(1, 4);
298 $page->assign('moments', $moments);
299
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', ''));
304
305 $evt = array(
306 'eid' => $eid,
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,
317 );
318
319 $trivial = array('intitule', 'descriptif', 'noinvite',
320 'show_participants', 'accept_nonmembre');
321 foreach ($trivial as $k) {
322 $evt[$k] = Post::v($k);
323 }
324
325 if (Post::v('deadline')) {
326 $evt['deadline_inscription'] = Post::v('inscr_Year').'-'
327 . Post::v('inscr_Month').'-'
328 . Post::v('inscr_Day');
329 } else {
330 $evt['deadline_inscription'] = null;
331 }
332
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']);
345
346 // if new event, get its id
347 if (!$eid) {
348 $eid = mysql_insert_id();
349 }
350
351 $nb_moments = 0;
352 $money_defaut = 0;
353
354 foreach ($moments as $i) {
355 if (Post::v('titre'.$i)) {
356 $nb_moments++;
357
358 $montant = strtr(Post::v('montant'.$i), ',', '.');
359 $money_defaut += (float)$montant;
360 XDB::execute("
361 REPLACE INTO groupex.evenements_items
362 VALUES ({?}, {?}, {?}, {?}, {?})",
363 $eid, $i, Post::v('titre'.$i),
364 Post::v('details'.$i), $montant);
365 } else {
366 XDB::execute("DELETE FROM groupex.evenements_items
367 WHERE eid = {?} AND item_id = {?}", $eid, $i);
368 }
369 }
370
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);
379 $p->submit();
380 }
381
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);
386 }
387
388 if (is_null($evt['eid'])) {
389 pl_redirect('events/'.$eid);
390 }
391 }
392
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);
400 }
401
402 // when modifying an old event retreive the old datas
403 if ($eid) {
404 $res = XDB::query(
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();
417 if ($stamp) {
418 $evt['paiement_id'] = -2;
419 $evt['paiement_req'] = $stamp;
420 }
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)
427 WHERE e.eid = {?}
428 ORDER BY item_id", $eid);
429 $items = array();
430 while ($item = $res->next()) {
431 $items[$item['item_id']] = $item;
432 }
433 $page->assign('items', $items);
434 }
435 }
436
437 function handler_admin(&$page, $eid = null, $item_id = null)
438 {
439 global $globals;
440
441 require_once dirname(__FILE__).'/xnetevents/xnetevents.inc.php';
442
443 $evt = get_event_detail($eid, $item_id);
444 if (!$evt) {
445 return PL_NOT_FOUND;
446 }
447
448 if ($evt['show_participants']) {
449 new_group_page('xnetevents/admin.tpl');
450 } else {
451 new_groupadmin_page('xnetevents/admin.tpl');
452 }
453
454 if (may_update() && Post::v('adm')) {
455 $member = get_infos(Post::v('mail'));
456 if (!$member) {
457 $page->trig("Membre introuvable");
458 }
459
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);
468 }
469
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);
476
477 $paid = intval($res->fetchOneCell());
478 $nbs = Post::v('nb', array());
479
480 foreach ($nbs as $id => $nb) {
481 $nb = max(intval($nb), 0);
482
483 if ($nb) {
484 XDB::execute("REPLACE INTO groupex.evenements_participants
485 VALUES ({?}, {?}, {?}, {?}, {?})",
486 $eid, $member['uid'], $id, $nb, $paid);
487 } else {
488 XDB::execute("DELETE FROM groupex.evenements_participants
489 WHERE uid = {?} AND eid = {?} AND item_id = {?}",
490 $member['uid'], $eid, $id);
491 }
492 }
493
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);
499 }
500
501 $evt = get_event_detail($eid, $item_id);
502 }
503
504 $page->assign('admin', may_update());
505 $page->assign('evt', $evt);
506 $page->assign('tout', is_null($item_id));
507
508 if (count($evt['moments'])) {
509 $page->assign('moments', $evt['moments']);
510 }
511
512 $tri = (Env::v('order') == 'alpha' ? 'promo, nom, prenom' : 'nom, prenom, promo');
513 $whereitemid = is_null($item_id) ? '' : "AND ep.item_id = $item_id";
514 $res = XDB::iterRow(
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);
524
525 $alphabet = array();
526 $nb_tot = 0;
527 while (list($char, $nb) = $res->next()) {
528 $alphabet[ord($char)] = $char;
529 $nb_tot += $nb;
530 if (Env::has('initiale') && $char == strtoupper(Env::v('initiale'))) {
531 $tot = $nb;
532 }
533 }
534 ksort($alphabet);
535 $page->assign('alphabet', $alphabet);
536
537 $ofs = Env::i('offset');
538 $tot = Env::v('initiale') ? $tot : $nb_tot;
539 $nbp = intval(($tot-1)/NB_PER_PAGE);
540 $links = array();
541 if ($ofs) {
542 $links['précédent'] = $ofs-1;
543 }
544 for ($i = 0; $i <= $nbp; $i++) {
545 $links[(string)($i+1)] = $i;
546 }
547 if ($ofs < $nbp) {
548 $links['suivant'] = $ofs+1;
549 }
550 if (count($links)>1) {
551 $page->assign('links', $links);
552 }
553
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);
566 }
567
568 $page->assign('participants',
569 get_event_participants($evt, $item_id, $tri,
570 "LIMIT ".($ofs*NB_PER_PAGE).", ".NB_PER_PAGE));
571 }
572 }
573
574 ?>