$this->make_hook('events', AUTH_MDP), 'grp/events/csv' => $this->make_hook('csv', AUTH_MDP), 'grp/events/edit' => $this->make_hook('edit', AUTH_MDP), 'grp/events/admin' => $this->make_hook('admin', AUTH_MDP), ); } function handler_events(&$page) { global $globals; new_group_page('xnet/groupe/evenements.tpl'); /**** manage inscriptions ****/ // inscription to events if (Env::has('ins')) { for ($i=1; Env::has('evt_'.$i); $i++) { $eid = Env::get('evt_'.$i); $res = $globals->xdb->query(" SELECT deadline_inscription, LEFT(NOW(), 10) AS now, noinvite, membres_only FROM groupex.evenements WHERE eid = {?}", $eid); $e = $res->fetchOneAssoc(); // impossible to change inscription: either inscription closed or members only if ($e['deadline_inscription'] && $e['deadline_inscription'] < $e['now']) { $page->trig("Les inscriptions sont closes"); continue; } if ($e['membres_only'] && !is_member()) { $page->trig("Les inscriptions à cet événement ne sont pas publiques"); continue; } // impossible to unsubscribe if you already paid sthing $total_inscr = 0; $inscriptions = array(); for ($j=1; Env::has('moment'.$eid.'_'.$j); $j++) { $inscriptions[$j] = Env::get('moment'.$eid.'_'.$j); // retreive ohter field when more than one person if ($inscriptions[$j] == 2) $inscriptions[$j] = 1 + Env::get('personnes'.$eid.'_'.$j,0); // avoid negative count if other field incorrect if ($inscriptions[$j] < 0) $inscriptions[$j] = 0; // avoid floating count if other field incorrect $inscriptions[$j] = floor($inscriptions[$j]); // avoid invite if no invite allowed if ($inscriptions[$j] > 1 && $e['noinvite']) $inscriptions[$j] = 1; $total_inscr += $inscriptions[$j]; } $unsubscribing = ($total_inscr == 0); // retreive the amount already paid for this event in cash $res = $globals->xdb->query(" SELECT paid FROM groupex.evenements_participants WHERE eid = {?} AND uid = {?} LIMIT 1", $eid, Session::get("uid")); $paid = $res->fetchOneCell(); if (!$paid) $paid = 0; if ($unsubscribing && $paid != 0) { $page->trig("Impossible de te désinscrire complètement ". "parce que tu as fait un paiement par ". "chèque ou par liquide. Contacte un ". "administrateur du groupe si tu es sûr de ". "ne pas venir"); continue; } // update actual inscriptions foreach ($inscriptions as $j=>$nb) { if ($nb > 0) { $globals->xdb->execute( "REPLACE INTO groupex.evenements_participants VALUES ({?}, {?}, {?}, {?}, {?})", $eid, Session::get("uid"), $j, $nb, $paid); } else { $globals->xdb->execute( "DELETE FROM groupex.evenements_participants WHERE eid = {?} AND uid = {?} AND item_id = {?}", $eid, Session::get("uid"), $j); } } } } /**** retreive all infos about all events ****/ $page->assign('logged', logged()); $page->assign('admin', may_update()); $evenements = $globals->xdb->iterator( "SELECT e.eid, IF(e.intitule = '', ' ', e.intitule) AS intitule, IF(e.descriptif = '', ' ', e.descriptif) AS descriptif, e.debut, e.fin, LEFT(10,e.debut) AS debut_day, LEFT(10,e.fin) AS fin_day, e.paiement_id, e.membres_only, e.noinvite, e.show_participants, u.nom, u.prenom, u.promo, a.alias, MAX(ep.nb) AS inscrit, MAX(ep.paid) AS paid, e.short_name, IF(e.deadline_inscription, e.deadline_inscription >= LEFT(NOW(), 10), 1) AS inscr_open, e.deadline_inscription FROM groupex.evenements AS e INNER JOIN x4dat.auth_user_md5 AS u ON u.user_id = e.organisateur_uid LEFT JOIN x4dat.aliases AS a ON (a.type = 'a_vie' AND a.id = u.user_id) LEFT JOIN groupex.evenements_participants AS ep ON (ep.eid = e.eid AND ep.uid = {?}) WHERE asso_id = {?} GROUP BY e.eid ORDER BY debut", Session::get('uid'), $globals->asso('id')); $evts = array(); while ($e = $evenements->next()) { $e['moments'] = $globals->xdb->iterator( "SELECT titre, details, montant, ei.item_id, nb FROM groupex.evenements_items AS ei LEFT JOIN groupex.evenements_participants AS ep ON (ep.eid = ei.eid AND ep.item_id = ei.item_id AND uid = {?}) WHERE ei.eid = {?}", Session::get('uid'), $e['eid']); $query = $globals->xdb->query( "SELECT montant FROM {$globals->money->mpay_tprefix}transactions AS t WHERE ref = {?} AND uid = {?}", $e['paiement_id'], Session::get('uid')); $montants = $query->fetchColumn(); foreach ($montants as $m) { $p = strtr(substr($m, 0, strpos($m, "EUR")), ",", "."); $e['paid'] += trim($p); } $evts[] = $e; } $page->assign('evenements', $evts); $page->assign('is_member', is_member()); } function handler_csv(&$page, $eid = null, $item_id = null) { require_once('xnet/evenements.php'); if (!is_numeric($item_id)) { $item_id = null; } $evt = get_event_detail($eid, $item_id); if (!$evt) { return PL_NOT_FOUND; } header('Content-type: text/x-csv'); header('Pragma: '); header('Cache-Control: '); new_nonhtml_page('xnet/groupe/evt-csv.tpl'); $admin = may_update(); $tri = (Env::get('order') == 'alpha' ? 'promo, nom, prenom' : 'nom, prenom, promo'); if (Env::has('initiale')) { $ini = 'AND IF(u.nom IS NULL, m.nom, IF(u.nom_usage<>"", u.nom_usage, u.nom)) LIKE "'.addslashes(Env::get('initiale')).'%"'; } else { $ini = ''; } $participants = get_event_participants($eid, $item_id, $ini, $tri, "", $evt['money'] && $admin, $evt['paiement_id']); $page->assign('participants', $participants); $page->assign('admin', $admin); $page->assign('moments', $evt['moments']); $page->assign('money', $evt['money']); $page->assign('tout', !Env::get('item_id', false)); } function handler_edit(&$page, $eid = null) { global $globals; new_groupadmin_page('xnet/groupe/evt-modif.tpl'); $page->assign('logged', logged()); $page->assign('admin', may_update()); $moments = range(1, 4); $page->assign('moments', $moments); if (!is_null($eid)) { $res = $globals->xdb->query("SELECT short_name, asso_id FROM groupex.evenements WHERE eid = {?}", $eid); $infos = $res->fetchOneAssoc(); if ($infos['asso_id'] != $globals->asso('id')) { return PL_NOT_ALLOWED; } } $get_form = true; if (Post::get('intitule')) { $get_form = false; $short_name = Env::get('short_name'); // Quelques vérifications sur l'alias (caractères spéciaux) if ($short_name && !preg_match( "/^[a-zA-Z0-9\-.]{3,20}$/", $short_name)) { $page->trig("Le raccourci demandé n'est pas valide. Vérifie qu'il comporte entre 3 et 20 caractères et qu'il ne contient que des lettres non accentuées, des chiffres ou les caractères - et ."); $short_name = $infos['short_name']; $get_form = true; } //vérifier que l'alias n'est pas déja pris if ($short_name && $short_name != $infos['short_name']) { $res = $globals->xdb->query('SELECT COUNT(*) FROM virtual WHERE alias LIKE {?}', $short_name."-%"); if ($res->fetchOneCell() > 0) { $page->trig("Le raccourci demandé est déjà utilisé. Choisis en un autre."); $short_name = $infos['short_name']; $get_form = true; } } // if had a previous shortname change the old lists if ($short_name && $infos['short_name'] && $short_name != $infos['short_name']) { $globals->xdb->execute("UPDATE virtual SET alias = REPLACE(alias, {?}, {?}) WHERE type = 'evt' AND alias LIKE {?}", $infos['short_name'], $short_name, $infos['short_name']."-%"); } elseif ($short_name && !$infos['short_name']) { // if we have a first new short_name create the lists // $globals->xdb->execute("INSERT INTO virtual SET type = 'evt', alias = {?}", $short_name."-participants@".$globals->xnet->evts_domain); $res = $globals->xdb->query("SELECT LAST_INSERT_ID()"); $globals->xdb->execute("INSERT INTO virtual_redirect ( SELECT {?} AS vid, IF(u.nom IS NULL, m.email, CONCAT(a.alias, {?})) AS redirect FROM groupex.evenements_participants AS ep LEFT JOIN groupex.membres AS m ON (ep.uid = m.uid) LEFT JOIN auth_user_md5 AS u ON (u.user_id = ep.uid) LEFT JOIN aliases AS a ON (a.id = ep.uid AND a.type = 'a_vie') WHERE ep.eid = {?} GROUP BY ep.uid)", $res->fetchOneCell(), "@".$globals->mail->domain, $eid); $globals->xdb->execute("INSERT INTO virtual SET type = 'evt', alias = {?}", $short_name."-absents@".$globals->xnet->evts_domain); $res = $globals->xdb->query("SELECT LAST_INSERT_ID()"); $globals->xdb->execute("INSERT INTO virtual_redirect ( SELECT {?} AS vid, IF(u.nom IS NULL, m.email, CONCAT(a.alias, {?})) AS redirect FROM groupex.membres AS m LEFT JOIN groupex.evenements_participants AS ep ON (ep.uid = m.uid) LEFT JOIN auth_user_md5 AS u ON (u.user_id = m.uid) LEFT JOIN aliases AS a ON (a.id = m.uid AND a.type = 'a_vie') WHERE m.asso_id = {?} AND ep.uid IS NULL GROUP BY m.uid)", $res->fetchOneCell(), "@".$globals->mail->domain, $globals->asso('id')); } elseif (!$short_name && $infos['short_name']) { // if we delete the old short name, delete the lists $globals->xdb->execute("DELETE virtual, virtual_redirect FROM virtual LEFT JOIN virtual_redirect USING(vid) WHERE virtual.alias LIKE {?}", $infos['short_name']."-%"); } $evt = array(); $evt['eid'] = $eid; $evt['asso_id'] = $globals->asso('id'); $evt['organisateur_uid'] = Session::get('uid'); $evt['intitule'] = Post::get('intitule'); $evt['paiement_id'] = (Post::get('paiement_id')>0) ? Post::get('paiement_id') : null; $evt['descriptif'] = Post::get('descriptif'); $evt['debut'] = Post::get('deb_Year')."-".Post::get('deb_Month') . "-".Post::get('deb_Day')." ".Post::get('deb_Hour') . ":".Post::get('deb_Minute').":00"; $evt['fin'] = Post::get('fin_Year')."-".Post::get('fin_Month') . "-".Post::get('fin_Day')." ".Post::get('fin_Hour') . ":".Post::get('fin_Minute').":00"; $evt['membres_only'] = Post::get('membres_only'); $evt['advertise'] = Post::get('advertise'); $evt['show_participants'] = Post::get('show_participants'); $evt['noinvite'] = Post::get('noinvite'); if (!$short_name) { $short_name = ''; } $evt['short_name'] = $short_name; $evt['deadline_inscription'] = Post::get('deadline', 'off') == 'on' ? null : (Post::get('inscr_Year')."-".Post::get('inscr_Month') ."-".Post::get('inscr_Day')); // Store the modifications in the database $globals->xdb->execute("REPLACE INTO groupex.evenements SET eid={?}, asso_id={?}, organisateur_uid={?}, intitule={?}, paiement_id = {?}, descriptif = {?}, debut = {?}, fin = {?}, membres_only = {?}, advertise = {?}, show_participants = {?}, short_name = {?}, deadline_inscription = {?}, noinvite = {?}", $evt['eid'], $evt['asso_id'], $evt['organisateur_uid'], $evt['intitule'] , $evt['paiement_id'], $evt['descriptif'], $evt['debut'], $evt['fin'], $evt['membres_only'], $evt['advertise'], $evt['show_participants'], $evt['short_name'], $evt['deadline_inscription'], $evt['noinvite']); // if new event, get its id if (!$eid) { $res = $globals->xdb->query("SELECT LAST_INSERT_ID()"); $eid = $res->fetchOneCell(); $evt['eid'] = $eid; } $nb_moments = 0; $money_defaut = 0; foreach ($moments as $i) { if (Post::get('titre'.$i)) { $nb_moments++; if (!($money_defaut > 0)) $money_defaut = strtr(Post::get('montant'.$i), ',', '.'); $globals->xdb->execute(" REPLACE INTO groupex.evenements_items VALUES ({?}, {?}, {?}, {?}, {?})", $eid, $i, Post::get('titre'.$i), Post::get('details'.$i), strtr(Post::get('montant'.$i), ',', '.')); } else { $globals->xdb->execute("DELETE FROM groupex.evenements_items WHERE eid = {?} AND item_id = {?}", $eid, $i); } } // request for a new payment if (Post::get('paiement_id') == -1 && $money_defaut >= 0) { require_once 'validations.inc.php'; $p = new PayReq(Session::get('uid'), Post::get('intitule')." - ".$globals->asso('nom'), Post::get('site'), $money_defaut, Post::get('confirmation'), 0, 999, $globals->asso('id'), $eid); $p->submit(); } // events with no sub-event: add a sub-event with no name if ($nb_moments == 0) { $globals->xdb->execute("INSERT INTO groupex.evenements_items VALUES ({?}, {?}, '', '', 0)", $eid, 1); } } if (Env::has('sup') && $eid) { // deletes the event $globals->xdb->execute("DELETE FROM groupex.evenements WHERE eid = {?} AND asso_id = {?}", $eid, $globals->asso('id')); // deletes the event items $globals->xdb->execute("DELETE FROM groupex.evenements_items WHERE eid = {?}", $eid); // deletes the event participants $globals->xdb->execute("DELETE FROM groupex.evenements_participants WHERE eid = {?}", $eid); // deletes the event mailing aliases if ($infos['short_name']) { $globals->xdb->execute("DELETE FROM virtual WHERE type = 'evt' AND alias LIKE {?}", $infos['short_name']."-%"); } // delete the requests for payments require_once 'validations.inc.php'; $globals->xdb->execute("DELETE FROM requests WHERE type = 'paiements' AND data LIKE {?}", PayReq::same_event($eid, $globals->asso('id'))); redirect("evenements.php"); } if (!$get_form) { redirect("evenements.php"); } // get a list of all the payment for this asso $res = $globals->xdb->iterator("SELECT id, text FROM {$globals->money->mpay_tprefix}paiements WHERE asso_id = {?}", $globals->asso('id')); $paiements = array(); while ($a = $res->next()) $paiements[$a['id']] = $a['text']; { $page->assign('paiements', $paiements); } // when modifying an old event retreive the old datas if ($eid) { $res = $globals->xdb->query( "SELECT eid, intitule, descriptif, debut, fin, membres_only, advertise, show_participants, paiement_id, short_name, deadline_inscription, noinvite FROM groupex.evenements WHERE eid = {?}", $eid); $evt = $res->fetchOneAssoc(); // find out if there is already a request for a payment for this event require_once 'validations.inc.php'; $res = $globals->xdb->query("SELECT stamp FROM requests WHERE type = 'paiements' AND data LIKE {?}", PayReq::same_event($eid, $globals->asso('id'))); $stamp = $res->fetchOneCell(); if ($stamp) { $evt['paiement_id'] = -2; $evt['paiement_req'] = $stamp; } $page->assign('evt', $evt); // get all the different moments infos $res = $globals->xdb->iterator( "SELECT item_id, titre, details, montant FROM groupex.evenements_items AS ei INNER JOIN groupex.evenements AS e ON(e.eid = ei.eid) WHERE e.eid = {?} ORDER BY item_id", $eid); $items = array(); while ($item = $res->next()) { $items[$item['item_id']] = $item; } $page->assign('items', $items); } } function handler_admin(&$page, $eid = null, $item_id = null) { global $globals; define('NB_PER_PAGE', 25); require_once('xnet/evenements.php'); $evt = get_event_detail($eid, $item_id); // the event doesn't exist or doesn't belong to this assoif (!$evt) if (!$evt) { return PL_NOT_FOUND; } if ($evt['show_participants']) { new_group_page('xnet/groupe/evt-admin.tpl'); } else { new_groupadmin_page('xnet/groupe/evt-admin.tpl'); } $admin = may_update(); // select a member from his mail if ($admin && Env::get('adm') && Env::get('mail')) { if (strpos(Env::get('mail'), '@') === false) { $res = $globals->xdb->query( "SELECT m.uid FROM groupex.membres AS m INNER JOIN aliases AS a ON (a.id = m.uid) WHERE a.alias = {?} AND m.asso_id = {?}", Env::get('mail'), $globals->asso('id')); } else { $res = $globals->xdb->query( "SELECT m.uid FROM groupex.membres AS m WHERE m.email = {?} AND m.asso_id = {?}", Env::get('mail'), $globals->asso('id')); } $member = $res->fetchOneCell(); if (!$member) $page->trig("Membre introuvable"); } // change the price paid by a participant if ($admin && Env::get('adm') == 'prix' && $member) { $globals->xdb->execute("UPDATE groupex.evenements_participants SET paid = IF(paid + {?} > 0, paid + {?}, 0) WHERE uid = {?} AND eid = {?}", strtr(Env::get('montant'), ',', '.'), strtr(Env::get('montant'), ',', '.'), $member, Env::get('eid')); } // change the number of personns coming with a participant if ($admin && Env::get('adm') == 'nbs' && $member) { $res = $globals->xdb->query("SELECT paid FROM groupex.evenements_participants WHERE uid = {?} AND eid = {?}", $member, Env::get('eid')); $paid = $res->fetchOneCell(); $participate = false; foreach ($evt['moments'] as $m) if (Env::has('nb'.$m['item_id'])) { $nb = Env::getInt('nb'.$m['item_id'], 0); if ($nb < 0) $nb = 0; if ($nb) { $participate = true; if (!$paid) $paid = 0; $globals->xdb->execute("REPLACE INTO groupex.evenements_participants VALUES ({?}, {?}, {?}, {?}, {?})", Env::get('eid'), $member, $m['item_id'], $nb, $paid); } else { $globals->xdb->execute("DELETE FROM groupex.evenements_participants WHERE uid = {?} AND eid = {?} AND item_id = {?}", $member, Env::get('eid'), $m['item_id']); } } if ($participate) { subscribe_lists_event(true, $member, $evt['participant_list'], $evt['absent_list']); } else { $res = $globals->xdb->query( "SELECT uid FROM groupex.evenements_participants WHERE uid = {?} AND eid = {?}", $member, $eid); $u = $res->fetchOneCell(); subscribe_lists_event($u, $member, $evt['participant_list'], $evt['absent_list']); } $evt = get_event_detail($eid, $item_id); } $page->assign('admin', $admin); $page->assign('evt', $evt); $page->assign('url_page', Env::get('PHP_SELF')."?eid=".Env::get('eid').(Env::has('item_id')?("&item_id=".Env::getInt('item_id')):'')); $page->assign('tout', !Env::has('item_id')); if (count($evt['moments'])) $page->assign('moments', $evt['moments']); $page->assign('money', $evt['money']); $tri = (Env::get('order') == 'alpha' ? 'promo, nom, prenom' : 'nom, prenom, promo'); $whereitemid = Env::has('item_id')?('AND ep.item_id = '.Env::getInt('item_id', 1)):''; $res = $globals->xdb->iterRow( 'SELECT UPPER(SUBSTRING(IF(u.nom IS NULL,m.nom,IF(u.nom_usage<>"", u.nom_usage, u.nom)), 1, 1)), COUNT(DISTINCT ep.uid) FROM groupex.evenements_participants AS ep INNER JOIN groupex.evenements AS e ON (ep.eid = e.eid) LEFT JOIN groupex.membres AS m ON ( ep.uid = m.uid AND e.asso_id = m.asso_id) LEFT JOIN auth_user_md5 AS u ON ( u.user_id = ep.uid ) WHERE ep.eid = {?} '.$whereitemid.' GROUP BY UPPER(SUBSTRING(IF(u.nom IS NULL,m.nom,u.nom), 1, 1))', Env::get('eid')); $alphabet = array(); $nb_tot = 0; while (list($char, $nb) = $res->next()) { $alphabet[ord($char)] = $char; $nb_tot += $nb; if (Env::has('initiale') && $char == strtoupper(Env::get('initiale'))) { $tot = $nb; } } ksort($alphabet); $page->assign('alphabet', $alphabet); $ofs = Env::getInt('offset'); $tot = Env::get('initiale') ? $tot : $nb_tot; $nbp = intval(($tot-1)/NB_PER_PAGE); $links = array(); if ($ofs) { $links['précédent'] = $ofs-1; } for ($i = 0; $i <= $nbp; $i++) { $links[(string)($i+1)] = $i; } if ($ofs < $nbp) { $links['suivant'] = $ofs+1; } if (count($links)>1) { $page->assign('links', $links); } $ini = Env::has('initiale') ? 'AND IF(u.nom IS NULL,m.nom,IF(u.nom_usage<>"", u.nom_usage, u.nom)) LIKE "'.addslashes(Env::get('initiale')).'%"' : ''; $participants = get_event_participants(Env::get('eid'), Env::get('item_id'), $ini, $tri, "LIMIT ".($ofs*NB_PER_PAGE).", ".NB_PER_PAGE, $evt['money'] && $admin, $evt['paiement_id']); if ($evt['paiement_id']) { $res = $globals->xdb->iterator( "SELECT IF(u.nom_usage<>'', u.nom_usage, u.nom) AS nom, u.prenom, u.promo, a.alias AS email, t.montant FROM {$globals->money->mpay_tprefix}transactions AS t INNER JOIN auth_user_md5 AS u ON(t.uid = u.user_id) INNER JOIN aliases AS a ON (a.id = t.uid AND a.type='a_vie' ) LEFT JOIN groupex.evenements_participants AS ep ON(ep.uid = t.uid AND ep.eid = {?}) WHERE t.ref = {?} AND ep.uid IS NULL", $evt['eid'], $evt['paiement_id']); $page->assign('oublis', $res->total()); $page->assign('oubliinscription', $res); } $page->assign('participants', $participants); } } ?>