Unsubscribes user from groupNL when unsubscribing from group.
[platal.git] / modules / xnetgrp.php
index 4fccb1b..0a40bae 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /***************************************************************************
- *  Copyright (C) 2003-2011 Polytechnique.org                              *
+ *  Copyright (C) 2003-2014 Polytechnique.org                              *
  *  http://opensource.polytechnique.org/                                   *
  *                                                                         *
  *  This program is free software; you can redistribute it and/or modify   *
@@ -31,13 +31,14 @@ class XnetGrpModule extends PLModule
             '%grp/site'            => $this->make_hook('site',                  AUTH_PUBLIC),
             '%grp/edit'            => $this->make_hook('edit',                  AUTH_PASSWD, 'groupadmin'),
             '%grp/mail'            => $this->make_hook('mail',                  AUTH_PASSWD, 'groupadmin'),
-            '%grp/forum'           => $this->make_hook('forum',                 AUTH_PASSWD, 'groupmember'),
+            '%grp/forum'           => $this->make_hook('forum',                 AUTH_PASSWD, 'groupannu'),
             '%grp/former_users'    => $this->make_hook('former_users',          AUTH_PASSWD, 'admin'),
             '%grp/annuaire'        => $this->make_hook('annuaire',              AUTH_PASSWD, 'groupannu'),
             '%grp/annuaire/vcard'  => $this->make_hook('vcard',                 AUTH_PASSWD, 'groupmember:groupannu'),
             '%grp/annuaire/csv'    => $this->make_hook('csv',                   AUTH_PASSWD, 'groupmember:groupannu'),
             '%grp/directory/sync'  => $this->make_hook('directory_sync',        AUTH_PASSWD, 'groupadmin'),
             '%grp/directory/unact' => $this->make_hook('non_active',            AUTH_PASSWD, 'groupadmin'),
+            '%grp/directory/awact' => $this->make_hook('awaiting_active',       AUTH_PASSWD, 'groupadmin'),
             '%grp/trombi'          => $this->make_hook('trombi',                AUTH_PASSWD, 'groupannu'),
             '%grp/geoloc'          => $this->make_hook('geoloc',                AUTH_PASSWD, 'groupannu'),
             '%grp/subscribe'       => $this->make_hook('subscribe',             AUTH_PASSWD, 'groups'),
@@ -244,6 +245,7 @@ class XnetGrpModule extends PLModule
                     $page->assign('pub', Post::v('pub'));
                     $page->assign('notif_unsub', Post::i('notif_unsub'));
                     $page->assign('descr', Post::t('descr'));
+                    $page->assign('disable_mails', Post::b('disable_mails'));
                     $page->assign('error', $error);
                     return;
                 }
@@ -260,7 +262,7 @@ class XnetGrpModule extends PLModule
                              descr={?}, site={?}, mail={?}, resp={?},
                              forum={?}, mail_domain={?}, ax={?}, axDate = {?}, pub={?},
                              sub_url={?}, inscriptible={?}, unsub_url={?},
-                             flags = {?}, welcome_msg = {?}
+                             flags = {?}, welcome_msg = {?}, disable_mails = {?}
                       WHERE  id={?}",
                       Post::v('nom'), Post::v('diminutif'),
                       Post::v('cat'), (Post::i('dom') == 0) ? null : Post::i('dom'),
@@ -270,6 +272,7 @@ class XnetGrpModule extends PLModule
                       Post::has('ax'), $axDate, Post::v('pub'),
                       Post::v('sub_url'), Post::v('inscriptible'),
                       Post::v('unsub_url'), $flags, Post::t('welcome_msg'),
+                      Post::b('disable_mails'),
                       $globals->asso('id'));
                 if (Post::v('mail_domain')) {
                     XDB::execute('INSERT IGNORE INTO  email_virtual_domains (name)
@@ -346,11 +349,15 @@ class XnetGrpModule extends PLModule
         $page->assign('pub', $globals->asso('pub'));
         $page->assign('notif_unsub', $globals->asso('notif_unsub'));
         $page->assign('notify_all', $globals->asso('notify_all'));
+        $page->assign('disable_mails', $globals->asso('disable_mails'));
     }
 
     function handler_mail($page)
     {
         global $globals;
+        if ($globals->asso('disable_mails')) {
+            return PL_FORBIDDEN;
+        }
 
         $page->changeTpl('xnetgrp/mail.tpl');
         $mmlist = new MMList(S::user(), $globals->asso('mail_domain'));
@@ -453,12 +460,25 @@ class XnetGrpModule extends PLModule
             $filename = $globals->asso('diminutif') . '.csv';
         }
         $users = $globals->asso()->getMembersFilter(null, new UFO_Name())->getUsers();
+        $admin = may_update();
         pl_cached_content_headers('text/x-csv', 'iso-8859-1', 1);
 
-        echo utf8_decode("Nom;Prénom;Sexe;Promotion;Commentaire\n");
+        echo utf8_decode("Nom;Prénom;Sexe;Promotion;Commentaire");
+        if ($admin) {
+            echo utf8_decode(";Société;Poste\n");
+        } else {
+            echo utf8_decode("\n");
+        }
         foreach ($users as $user) {
             $line = $user->lastName() . ';' . $user->firstName() . ';' . ($user->isFemale() ? 'F' : 'M')
-                  . ';' . $user->promo() . ';' . strtr($user->group_comm, ';', ',');
+                . ';' . $user->promo() . ';' . strtr($user->group_comm, ';', ',');
+            if ($admin) {
+                if ($user->hasProfile()) {
+                    $line .= ';' . $user->profile()->getMainJob()->company->name . ';' . $user->profile()->getMainJob()->description;
+                } else {
+                    $line .= ';;';
+                }
+            }
             echo utf8_decode($line) . "\n";
         }
         exit();
@@ -478,8 +498,8 @@ class XnetGrpModule extends PLModule
             $users = array_keys(Env::v('add_users'));
             $former_users = XDB::fetchColumn('SELECT  uid
                                                 FROM  group_former_members
-                                               WHERE  remember = TRUE AND uid IN {?}',
-                                             $users);
+                                               WHERE  remember = TRUE AND asso_id = {?} AND uid IN {?}',
+                                             $globals->asso('id'), $users);
             $new_users = array_diff($users, $former_users);
 
             foreach ($former_users as $uid) {
@@ -494,10 +514,8 @@ class XnetGrpModule extends PLModule
 
             $data = array();
             foreach ($new_users as $uid) {
-                $data[] = XDB::format('({?}, {?})', $globals->asso('id'), $uid);
+                Group::subscribe($globals->asso('id'), $uid);
             }
-            XDB::rawExecute('INSERT INTO  group_members (asso_id, uid)
-                                  VALUES  ' . implode(',', $data));
         }
 
         if (Env::has('add_nonusers')) {
@@ -532,9 +550,7 @@ class XnetGrpModule extends PLModule
                                    VALUES  ({?}, {?}, {?}, {?}, {?}, {?}, {?}, {?}, \'xnet\', \'disabled\')',
                              $hruid, $display_name, $full_name, $directory_name, $sort_name, $firstname, $lastname, $email);
                 $uid = XDB::insertId();
-                XDB::execute('INSERT INTO  group_members (asso_id, uid)
-                                   VALUES  ({?}, {?})',
-                             $globals->asso('id'), $uid);
+                Group::subscribe($globals->asso('id'), $uid);
             }
         }
 
@@ -631,6 +647,70 @@ class XnetGrpModule extends PLModule
         $page->assign('users', $users);
     }
 
+    private function again($uid)
+    {
+        $data = XDB::fetchOneAssoc('SELECT  hash, group_name, sender_name, email
+                                      FROM  register_pending_xnet
+                                     WHERE  uid = {?}',
+                                   $uid);
+        XDB::execute('UPDATE  register_pending_xnet
+                         SET  last_date = NOW()
+                       WHERE  uid = {?}',
+                     $uid);
+
+        $mailer = new PlMailer('xnet/account.mail.tpl');
+        $mailer->addCc('validation+xnet_account@polytechnique.org');
+        $mailer->setTo($data['email']);
+        $mailer->assign('hash', $data['hash']);
+        $mailer->assign('email', $data['email']);
+        $mailer->assign('group', $data['group_name']);
+        $mailer->assign('sender_name', $data['sender_name']);
+        $mailer->assign('again', true);
+        $mailer->assign('baseurl', Platal::globals()->xnet->xorg_baseurl);
+        $mailer->send();
+    }
+
+    function handler_awaiting_active($page)
+    {
+        global $globals;
+        $page->changeTpl('xnetgrp/awaiting_active.tpl');
+
+        XDB::execute('DELETE FROM  register_pending_xnet
+                            WHERE  DATE_SUB(NOW(), INTERVAL 1 MONTH) > date');
+
+        $uids = XDB::fetchColumn('SELECT  g.uid
+                                    FROM  group_members         AS g
+                              INNER JOIN  accounts              AS a ON (a.uid = g.uid)
+                              INNER JOIN  register_pending_xnet AS p ON (p.uid = g.uid)
+                                   WHERE  a.uid = g.uid AND g.asso_id = {?} AND a.type = \'xnet\' AND a.state = \'pending\'',
+                                 $globals->asso('id'));
+
+        if (Post::has('again')) {
+            S::assert_xsrf_token();
+
+            $uids_to_again = array_intersect(array_keys(Post::v('again')), $uids);
+            foreach ($uids_to_again as $uid) {
+                $this->again($uid);
+            }
+            $page->trigSuccess('Relances effectuées avec succès.');
+        }
+
+        if ($uids) {
+            $registration_date = XDB::fetchAllAssoc('uid', 'SELECT  uid, date
+                                                              FROM  register_pending_xnet
+                                                             WHERE  uid IN {?}', $uids);
+            $last_date = XDB::fetchAllAssoc('uid', 'SELECT  uid, last_date
+                                                      FROM  register_pending_xnet
+                                                     WHERE  uid IN {?}', $uids);
+
+            $users = User::getBulkUsersWithUIDs($uids);
+            $page->assign('users', $users);
+            $page->assign('registration_date', $registration_date);
+            $page->assign('last_date', $last_date);
+        }
+
+    }
+
     private function removeSubscriptionRequest($uid)
     {
         global $globals;
@@ -645,7 +725,7 @@ class XnetGrpModule extends PLModule
         $this->removeSubscriptionRequest($user->id());
         Group::subscribe($globals->asso('id'), $user->id());
 
-        if (XDB::affectedRows() == 1) {
+        if (XDB::affectedRows() == 1 && $user->forlifeEmail()) {
             $mailer = new PlMailer();
             $mailer->addTo($user->forlifeEmail());
             $mailer->setFrom('"' . S::user()->fullName() . '" <' . S::user()->forlifeEmail() . '>');
@@ -708,12 +788,14 @@ class XnetGrpModule extends PLModule
                 S::assert_xsrf_token();
 
                 $this->removeSubscriptionRequest($user->id());
-                $mailer = new PlMailer();
-                $mailer->addTo($user->forlifeEmail());
-                $mailer->setFrom('"' . S::user()->fullName() . '" <' . S::user()->forlifeEmail() . '>');
-                $mailer->setSubject('['.$globals->asso('nom').'] Demande d\'inscription annulée');
-                $mailer->setTxtBody(Env::v('motif'));
-                $mailer->send();
+                if ($user->forlifeEmail()) {
+                    $mailer = new PlMailer();
+                    $mailer->addTo($user->forlifeEmail());
+                    $mailer->setFrom('"' . S::user()->fullName() . '" <' . S::user()->forlifeEmail() . '>');
+                    $mailer->setSubject('['.$globals->asso('nom').'] Demande d\'inscription annulée');
+                    $mailer->setTxtBody(Env::v('motif'));
+                    $mailer->send();
+                }
                 $page->killSuccess("La demande de {$user->fullName()} a bien été refusée.");
             } else {
                 $page->assign('show_form', true);
@@ -747,9 +829,13 @@ class XnetGrpModule extends PLModule
                          S::i('uid'), $globals->asso('id'));
             $admins = $globals->asso()->iterToNotify();
             $admin = $admins->next();
-            $to = $admin->bestEmail();
-            while ($admin = $admins->next()) {
-                $to .= ', ' . $admin->bestEmail();
+            if (!is_null($admin)) {
+                $to = $admin->bestEmail();
+                while ($admin = $admins->next()) {
+                    $to .= ', ' . $admin->bestEmail();
+                }
+            } else {
+                $to = '';
             }
 
             $append = "\n"
@@ -995,6 +1081,28 @@ class XnetGrpModule extends PLModule
 
             Group::subscribe($globals->asso('id'), $user->id());
             $this->removeSubscriptionRequest($user->id());
+            if ($user->isActive() && $user->bestEmail()) {
+                $mailer = new PlMailer('xnetgrp/forced-subscription.mail.tpl');
+                $mailer->addTo($user->bestEmail());
+                $mailer->assign('group', $globals->asso('nom'));
+                $mailer->assign('anim', S::user()->fullname());
+                $mailer->assign('diminutif', $globals->asso('diminutif'));
+                $mailer->send();
+            }
+
+            // Check if the group has more than 1000 members, if so, disable the "send mail" function.
+            $full_count = XDB::fetchOneCell('SELECT COUNT(*)
+                                               FROM group_members
+                                              WHERE asso_id = {?}',
+                                $globals->asso('id'));
+            if ($full_count > 999) {
+                XDB::execute(
+                    "UPDATE groups
+                    SET disable_mails = 1
+                    WHERE id = {?}",
+                    $globals->asso('id')); 
+            }
+            
             if ($suggest_account_activation) {
                 pl_redirect('member/suggest/' . $user->login() . '/' . $email . '/' . $globals->asso('nom'));
             } else {
@@ -1114,6 +1222,11 @@ class XnetGrpModule extends PLModule
             $mailer->send();
         }
 
+        $nl = Newsletter::forGroup($globals->asso('shortname'));
+        if (!is_null($nl)) {
+            $nl->unsubscribe(null, S::i('uid'));
+        }
+
         $domain = $globals->asso('mail_domain');
         if (!$domain) {
             return true;
@@ -1333,21 +1446,7 @@ class XnetGrpModule extends PLModule
                     $page->trigSuccess('Le compte va bientôt être activé.');
                 }
                 if (Post::b('again')) {
-                    $data = XDB::fetchOneAssoc('SELECT  hash, group_name, sender_name, email
-                                                  FROM  register_pending_xnet
-                                                 WHERE  uid = {?}',
-                                               $user->id());
-
-                    $mailer = new PlMailer('xnet/account.mail.tpl');
-                    $mailer->addCc('validation+xnet_account@polytechnique.org');
-                    $mailer->setTo($data['email']);
-                    $mailer->assign('hash', $data['hash']);
-                    $mailer->assign('email', $data['email']);
-                    $mailer->assign('group', $data['group_name']);
-                    $mailer->assign('sender_name', $data['sender_name']);
-                    $mailer->assign('again', true);
-                    $mailer->assign('baseurl', Platal::globals()->xnet->xorg_baseurl);
-                    $mailer->send();
+                    $this->again($user->id());
                     $page->trigSuccess('Relance effectuée avec succès.');
                 }
             }
@@ -1685,5 +1784,5 @@ class XnetGrpModule extends PLModule
     }
 }
 
-// vim:set et sw=4 sts=4 sws=4 foldmethod=marker enc=utf-8:
+// vim:set et sw=4 sts=4 sws=4 foldmethod=marker fenc=utf-8:
 ?>