Improve (and fix) {profile} smarty plugin.
[platal.git] / include / newsletter.inc.php
index 17a4bf5..a51aeae 100644 (file)
@@ -46,6 +46,7 @@ class NewsLetter
     const GROUP_XORG = 'Polytechnique.org';
     const GROUP_AX = 'AX';
     const GROUP_EP = 'Ecole';
+    const GROUP_FX = 'FX';
 
     // Searches on mutiple fields
     const SEARCH_ALL = 'all';
@@ -105,15 +106,13 @@ class NewsLetter
     /** Retrieve all newsletters
      * @return An array of $id => NewsLetter objects
      */
-    public static function getAll()
+    public static function getAll($sort = 'id', $order = 'ASC')
     {
-        $res = XDB::query('SELECT  id
-                             FROM  newsletters');
-        $nls = array();
-        foreach ($res->fetchColumn() as $id) {
-            $nls[$id] = new NewsLetter($id);
-        }
-        return $nls;
+        $res = XDB::fetchAllAssoc('SELECT  n.id, g.nom AS group_name, n.name, n.custom_css, n.criteria, g.diminutif AS group_link
+                                     FROM  newsletters AS n
+                               INNER JOIN  groups      AS g ON (n.group_id = g.id)
+                                 ORDER BY  ' . $sort . ' ' . $order);
+        return $res;
     }
 
     // }}}
@@ -400,25 +399,32 @@ class NewsLetter
     /** Get the count of subscribers to the NL.
      * @return Number of subscribers.
      */
-    public function subscriberCount()
+    public function subscriberCount($lost = null, $sex = null, $grade = null, $first_promo = null, $last_promo = null)
     {
-        return XDB::fetchOneCell('SELECT  COUNT(uid)
-                                    FROM  newsletter_ins
-                                   WHERE  nlid = {?}', $this->id);
+        $cond = new PFC_And(new UFC_NLSubscribed($this->id));
+        if (!is_null($sex)) {
+            $cond->addChild(new UFC_Sex($sex));
+        }
+        if (!is_null($grade)) {
+            $cond->addChild(new UFC_Promo('>=', $grade, $first_promo));
+            $cond->addChild(new UFC_Promo('<=', $grade, $last_promo));
+        }
+        if (!($lost === null)) {
+            if ($lost === true) {
+                $cond->addChild(new PFC_Not(new UFC_HasEmailRedirect()));
+            } else {
+                $cond->addChild(new UFC_HasEmailRedirect());
+            }
+        }
+        $uf = new UserFilter($cond);
+        return $uf->getTotalCount();
     }
 
     /** Get the count of subscribers with non valid redirection.
      */
-    public function lostSubscriberCount()
-    {
-        return XDB::fetchOneCell('SELECT  COUNT(DISTINCT(n.uid))
-                                    FROM  newsletter_ins         AS n
-                              INNER JOIN  accounts               AS a ON (n.uid = a.uid)
-                              INNER JOIN  account_types          AS t ON (t.type = a.type)
-                               LEFT JOIN  email_redirect_account AS r ON (r.uid = a.uid AND r.flags = \'active\' AND r.broken_level < 3
-                                                                          AND r.type != \'imap\' AND r.type != \'homonym\')
-                                   WHERE  n.nlid = {?} AND r.redirect IS NULL AND a.state = \'active\' AND FIND_IN_SET(\'mail\', t.perms)',
-                                 $this->id);
+    public function lostSubscriberCount($sex = null)
+    {
+        return $this->subscriberCount(true, $sex);
     }
 
     /** Get the number of subscribers to the NL whose last received mailing was $last.
@@ -546,6 +552,8 @@ class NewsLetter
             return 'ax';
         case self::GROUP_EP:
             return 'epletter';
+        case self::GROUP_FX:
+            return 'fxletter';
         default:
             // Don't display groups NLs on X.org
             assert(!$enforce_xnet);
@@ -570,12 +578,51 @@ class NewsLetter
             return 'ax/admin';
         case self::GROUP_EP:
             return 'epletter/admin';
+        case self::GROUP_FX:
+            return 'fxletter/admin';
         default:
             // Don't display groups NLs on X.org
             assert(!$enforce_xnet);
         }
     }
 
+    /** Get the prefix to use for all 'stat' pages of this NL.
+     */
+    public function statPrefix($enforce_xnet = true, $with_group = true)
+    {
+        if (!empty($GLOBALS['IS_XNET_SITE'])) {
+            if ($with_group) {
+                return $this->group . '/stat/nl';
+            } else {
+                return 'stat/nl';
+            }
+        }
+        switch ($this->group) {
+        case self::GROUP_XORG:
+            return 'stat/newsletter';
+        case self::GROUP_AX:
+            return 'ax/stat';
+        case self::GROUP_EP:
+            return 'epletter/stat';
+        case self::GROUP_FX:
+            return 'fxletter/stat';
+        default:
+            // Don't display groups NLs on X.org
+            assert(!$enforce_xnet);
+        }
+    }
+
+    /** Get links for nl pages.
+     */
+    public function adminLinks()
+    {
+        return array(
+            'index' => array('link' => $this->prefix(), 'title' => 'Archives'),
+            'admin' => array('link' => $this->adminPrefix(), 'title' => 'Administrer'),
+            'stats' => array('link' => $this->statPrefix(), 'title' => 'Statistiques')
+        );
+    }
+
     /** Hack used to remove "admin" links on X.org page on X.net
      * The 'admin' links are enabled for all pages, except for X.org when accessing NL through X.net
      */
@@ -602,6 +649,7 @@ class NewsLetter
           case self::GROUP_XORG:
           case self::GROUP_AX:
           case self::GROUP_EP:
+          case self::GROUP_FX:
             return false;
           default:
             return true;
@@ -1231,7 +1279,7 @@ class NLIssue
                        $this->id);
 
         $ufc = new PFC_And($this->getRecipientsUFC(), new UFC_NLSubscribed($this->nl->id, $this->id), new UFC_HasValidEmail());
-        $uf = new UserFilter($ufc, array(new UFO_IsAdmin(), new UFO_Uid()));
+        $uf = new UserFilter($ufc, array(new UFO_IsAdmin(true), new UFO_Uid()));
         $limit = new PlLimit(self::BATCH_SIZE);
         $global_sent = array();