carnet/panel is back.
[platal.git] / classes / userfilter.php
index 0f592c9..a2e616e 100644 (file)
@@ -292,6 +292,40 @@ class UFC_Registered implements UserFilterCondition
     }
 }
 
+class UFC_ProfileUpdated implements UserFilterCondition
+{
+    private $comparison;
+    private $date;
+
+    public function __construct($comparison = null, $date = null)
+    {
+        $this->comparison = $comparison;
+        $this->date = $date;
+    }
+
+    public function buildCondition(UserFilter &$uf)
+    {
+        return 'p.last_change ' . $this->comparison . XDB::format(' {?}', date('Y-m-d H:i:s', $this->date));
+    }
+}
+
+class UFC_Birthday implements UserFilterCondition
+{
+    private $comparison;
+    private $date;
+
+    public function __construct($comparison = null, $date = null)
+    {
+        $this->comparison = $comparison;
+        $this->date = $date;
+    }
+
+    public function buildCondition(UserFilter &$uf)
+    {
+        return 'p.next_birthday ' . $this->comparison . XDB::format(' {?}', date('Y-m-d', $this->date));
+    }
+}
+
 class UFC_Sex implements UserFilterCondition
 {
     private $sex;
@@ -397,29 +431,74 @@ class UFC_EmailList implements UserFilterCondition
     }
 }
 
-class UFC_Contact implements UserFilterCondition
+abstract class UFC_UserRelated implements UserFilterCondition
 {
-    private $uid;
-    public function __construct($uid = null)
-    {
-        if (is_null($uid)) {
-            $this->uid = S::i('uid');
-        } else if ($uid instanceof PlUser) {
-            $this->uid = $uid->id();
-        } else if (ctype_digit($uid)) {
-            $this->uid = (int)$uid;
+    protected $user;
+    public function __construct(PlUser &$user)
+    {
+        $this->user =& $user;
+    }
+}
+
+class UFC_Contact extends UFC_UserRelated
+{
+    public function buildCondition(UserFilter &$uf)
+    {
+        $sub = $uf->addContactFilter($this->user->id());
+        return 'c' . $sub . '.contact IS NOT NULL';
+    }
+}
+
+class UFC_WatchRegistration extends UFC_UserRelated
+{
+    public function buildCondition(UserFilter &$uf)
+    {
+        if (!$this->user->watch('registration')) {
+            return UserFilterCondition::COND_FALSE;
+        }
+        $uids = $this->user->watchUsers();
+        if (count($uids) == 0) {
+            return UserFilterCondition::COND_FALSE;
         } else {
-            Platal::page()->kill("Invalid contact type");
+            return '$UID IN (' . implode(', ', $uids) . ')';
         }
     }
+}
+
+class UFC_WatchPromo extends UFC_UserRelated
+{
+    private $grade;
+    public function __construct(PlUser &$user, $grade = UserFilter::GRADE_ING)
+    {
+        parent::__construct($user);
+        $this->grade = $grade;
+    }
 
     public function buildCondition(UserFilter &$uf)
     {
-        $sub = $uf->addContactFilter($this->uid);
-        return 'c' . $sub . '.contact IS NOT NULL';
+        $promos = $this->user->watchPromos();
+        if (count($promos) == 0) {
+            return UserFilterCondition::COND_FALSE;
+        } else {
+            $sube = $uf->addEducationFilter(true, $this->grade);
+            $field = 'pe' . $sube . '.' . UserFilter::promoYear($this->grade);
+            return $field . ' IN (' . implode(', ', $promos) . ')';
+        }
+    }
+}
+
+class UFC_WatchContact extends UFC_Contact
+{
+    public function buildCondition(UserFilter &$uf)
+    {
+        if (!$this->user->watchContacts()) {
+            return UserFilterCondition::COND_FALSE;
+        }
+        return parent::buildCondition($uf);
     }
 }
 
+
 /******************
  * ORDERS
  ******************/
@@ -427,6 +506,10 @@ class UFC_Contact implements UserFilterCondition
 abstract class UserFilterOrder
 {
     protected $desc = false;
+    public function __construct($desc = false)
+    {
+        $this->desc = $desc;
+    }
 
     public function buildSort(UserFilter &$uf)
     {
@@ -451,8 +534,8 @@ class UFO_Promo extends UserFilterOrder
 
     public function __construct($grade = null, $desc = false)
     {
+        parent::__construct($desc);
         $this->grade = $grade;
-        $this->desc  = $desc;
     }
 
     protected function getSortTokens(UserFilter &$uf)
@@ -475,10 +558,10 @@ class UFO_Name extends UserFilterOrder
 
     public function __construct($type, $variant = null, $particle = false, $desc = false)
     {
+        parent::__construct($desc);
         $this->type = $type;
         $this->variant = $variant;
         $this->particle = $particle;
-        $this->desc = $desc;
     }
 
     protected function getSortTokens(UserFilter &$uf)
@@ -499,17 +582,37 @@ class UFO_Name extends UserFilterOrder
 
 class UFO_Registration extends UserFilterOrder
 {
-    public function __construct($desc = false)
+    protected function getSortTokens(UserFilter &$uf)
     {
-        $this->desc = $desc;
+        return 'a.registration_date';
     }
+}
 
+class UFO_Birthday extends UserFilterOrder
+{
     protected function getSortTokens(UserFilter &$uf)
     {
-        return 'a.registration_date';
+        return 'p.next_birthday';
     }
 }
 
+class UFO_ProfileUpdate extends UserFilterOrder
+{
+    protected function getSortTokens(UserFilter &$uf)
+    {
+        return 'p.last_change';
+    }
+}
+
+class UFO_Death extends UserFilterOrder
+{
+    protected function getSortTokens(UserFilter &$uf)
+    {
+        return 'p.deathdate';
+    }
+}
+
+
 /***********************************
   *********************************
           USER FILTER CLASS
@@ -676,9 +779,8 @@ class UserFilter
     {
         if (is_null($this->lastcount)) {
             $this->buildQuery();
-            return (int)XDB::fetchOneCell('SELECT  COUNT(*)
-                                          ' . $this->query . '
-                                         GROUP BY  a.uid');
+            return (int)XDB::fetchOneCell('SELECT  COUNT(DISTINCT a.uid)
+                                          ' . $this->query);
         } else {
             return $this->lastcount;
         }
@@ -1003,6 +1105,61 @@ class UserFilter
         }
         return $joins;
     }
+
+
+    /** CARNET
+     */
+    private $wn = array();
+    public function addWatchRegistrationFilter($uid = null)
+    {
+        return $this->register_optional($this->wn, is_null($uid) ? null : 'user_' . $uid);
+    }
+
+    private $wp = array();
+    public function addWatchPromoFilter($uid = null)
+    {
+        return $this->register_optional($this->wp, is_null($uid) ? null : 'user_' . $uid);
+    }
+
+    private $w = array();
+    public function addWatchFilter($uid = null)
+    {
+        return $this->register_optional($this->w, is_null($uid) ? null : 'user_' . $uid);
+    }
+
+    private function watchJoins()
+    {
+        $joins = array();
+        foreach ($this->w as $sub=>$key) {
+            if (is_null($key)) {
+                $joins['w' . $sub] = array('left', 'watch');
+            } else {
+                $joins['w' . $sub] = array('left', 'watch', XDB::format('$ME.uid = {?}', substr($key, 5)));
+            }
+        }
+        foreach ($this->wn as $sub=>$key) {
+            if (is_null($key)) {
+                $joins['wn' . $sub] = array('left', 'watch_nonins', '$ME.ni_id = $UID');
+            } else {
+                $joins['wn' . $sub] = array('left', 'watch_nonins', XDB::format('$ME.uid = {?} AND $ME.ni_id = $UID', substr($key, 5)));
+            }
+        }
+        foreach ($this->wn as $sub=>$key) {
+            if (is_null($key)) {
+                $joins['wn' . $sub] = array('left', 'watch_nonins', '$ME.ni_id = $UID');
+            } else {
+                $joins['wn' . $sub] = array('left', 'watch_nonins', XDB::format('$ME.uid = {?} AND $ME.ni_id = $UID', substr($key, 5)));
+            }
+        }
+        foreach ($this->wp as $sub=>$key) {
+            if (is_null($key)) {
+                $joins['wp' . $sub] = array('left', 'watch_promo');
+            } else {
+                $joins['wp' . $sub] = array('left', 'watch_promo', XDB::format('$ME.uid = {?}', substr($key, 5)));
+            }
+        }
+        return $joins;
+    }
 }