flattened conditionals (for simpler logic)
[fsfdrupalauth.git] / lib / Auth / Source / FSFDrupalAuth.php
index 21b1e7fb629dadeb30124bc25e791b7a361c600c..90586123a4c8b402080badcc30b78fe4fffd03cf 100644 (file)
@@ -44,21 +44,34 @@ class FSFDrupalAuth extends \SimpleSAML\Module\core\Auth\UserPassBase
     private $query_main;
     private $query_membership;
     private $query_staff;
+
     private $query_nomination_process_donations;
     private $query_nomination_process_gift_receipt;
     private $query_nomination_process_adhoc;
 
+    private $query_discussion_process_donations;
+    private $query_discussion_process_gift_receipt;
+    private $query_discussion_process_adhoc;
+
     /**
      * SQL query parameters, or variables that help determine which attributes
      * someone has
      */
     private $fsf_org_id;
+    private $gift_redeem_page_id;
+
+    private $nomination_process_active;
     private $nomination_process_contrib_start_date;
     private $nomination_process_contrib_end_date;
-    private $gift_redeem_page_id;
+    private $nomination_process_adhoc_access_group_id;
     private $membership_monthly_rate;
     private $student_membership_monthly_rate;
-    private $adhoc_access_group_id;
+
+    private $discussion_process_active;
+    private $discussion_process_contrib_start_date;
+    private $discussion_process_contrib_end_date;
+    private $discussion_process_adhoc_access_group_id;
+    private $discussion_process_adhoc_no_access_group_id;
 
     /**
      * Constructor for this authentication source.
@@ -75,15 +88,37 @@ class FSFDrupalAuth extends \SimpleSAML\Module\core\Auth\UserPassBase
         parent::__construct($info, $config);
 
         // Make sure that all required parameters are present.
-       foreach (['dsn', 'username', 'password', 'query_main',
-               'query_membership', 'query_staff',
+       foreach (['dsn',
+               'username',
+               'password',
+
+               'query_main',
+               'query_membership',
+               'query_staff',
+
                'query_nomination_process_donations',
                'query_nomination_process_gift_receipt',
-               'query_nomination_process_adhoc', 'gift_redeem_page_id',
-               'fsf_org_id', 'membership_monthly_rate',
-               'student_membership_monthly_rate',
+               'query_nomination_process_adhoc',
+
+               'fsf_org_id',
+               'gift_redeem_page_id',
+
+               'nomination_process_active',
                'nomination_process_contrib_start_date',
-               'nomination_process_contrib_end_date', 'adhoc_access_group_id']
+               'nomination_process_contrib_end_date',
+               'nomination_process_adhoc_access_group_id',
+               'membership_monthly_rate',
+               'student_membership_monthly_rate',
+
+               'query_discussion_process_donations',
+               'query_discussion_process_gift_receipt',
+               'query_discussion_process_adhoc',
+
+               'discussion_process_active',
+               'discussion_process_contrib_start_date',
+               'discussion_process_contrib_end_date',
+               'discussion_process_adhoc_access_group_id',
+               'discussion_process_adhoc_no_access_group_id',]
                as $param) {
 
             if (!array_key_exists($param, $config)) {
@@ -286,12 +321,9 @@ class FSFDrupalAuth extends \SimpleSAML\Module\core\Auth\UserPassBase
         }
 
         //
-        // query for access to board nomination process
+        // helper functions for access to board nomination / discussion process
         //
 
-       $start_date = $this->nomination_process_contrib_start_date;
-       $end_date   = $this->nomination_process_contrib_end_date;
-
        /**
          * @param string $query_name  Name of query in authsources
          * @param array $extra_params  Associative array of parameters to include in query
@@ -323,7 +355,7 @@ class FSFDrupalAuth extends \SimpleSAML\Module\core\Auth\UserPassBase
        // the time window with a single donation. this approximates whether
        // the person was, or would have been, a member during the configured
        // time window.
-       $analyze_history = function ($selective_donations_history)
+       $nomination_process_analyze_history = function ($selective_donations_history)
            use ($start_date, $end_date) {
 
                $eligible = false;
@@ -367,22 +399,105 @@ class FSFDrupalAuth extends \SimpleSAML\Module\core\Auth\UserPassBase
                return false;
        };
 
+       $discussion_process_analyze_history = function ($selective_donations_history)
+           use ($start_date, $end_date) {
+
+               $eligible = false;
+               $total = 0;
+
+               $start_date_obj = new \DateTime($start_date);
+               $end_date_obj = new \DateTime($end_date);
+
+               foreach ($selective_donations_history as $row) {
+
+                       $amount = intval($row['amount']);
+                       $member_type_id = $row['member_type_id'];
+                       $receive_date_obj = new \DateTime($row['receive_date']);
+
+                       if (($receive_date_obj > $start_date_obj) && ($receive_date < $end_date_obj)) {
+                               $total += $amount;
+                       }
+               }
+
+               if ($total >= 120) {
+                       return true;
+               } else {
+                       return false;
+               }
+       };
+
+       //
+       // nomination form participation specific checks
+       //
+
+       $start_date = $this->nomination_process_contrib_start_date;
+       $end_date   = $this->nomination_process_contrib_end_date;
+
        $donation_params    = ['start_date' => $start_date, 'end_date' => $end_date];
        $gift_member_params = ['start_date' => $start_date, 'end_date' => $end_date, 'gift_redeem_page_id' => intval($this->gift_redeem_page_id)];
-       $adhoc_params       = ['adhoc_access_group_id' => intval($this->adhoc_access_group_id)];
+       $adhoc_params       = ['adhoc_access_group_id' => intval($this->nomination_process_adhoc_access_group_id)];
 
-       if (($analyze_history($donation_query('query_nomination_process_donations', $donation_params))
-               || $compare_res($donation_query('query_nomination_process_gift_receipt', $gift_member_params), 1)
-            ) && ($attributes['is_member'] == ['true'])
-             || $compare_res($donation_query('query_nomination_process_adhoc', $adhoc_params), 1)) {
+       if ($this->nomination_process_active != 'true' ) {
+               $attributes['nomination_process'] = ['false'];
 
+       } elseif ($compare_res($donation_query('query_nomination_process_adhoc', $adhoc_params), 1)) {
                $attributes['nomination_process'] = ['true'];
+
+       } elseif ($attributes['is_member'] != ['true']) {
+               Logger::debug('fsfdrupalauth:'.$this->authId.
+                       ': Not a member / comparable donor during window for board process.');
+               $attributes['nomination_process'] = ['false'];
+
+       } elseif ($nomination_process_analyze_history($donation_query('query_nomination_process_donations', $donation_params))
+               || $compare_res($donation_query('query_nomination_process_gift_receipt', $gift_member_params), 1)) {
+
+               $attributes['nomination_process'] = ['true'];
+
        } else {
                Logger::debug('fsfdrupalauth:'.$this->authId.
                        ': Not a member / comparable donor during window for board process.');
                $attributes['nomination_process'] = ['false'];
        }
 
+       //
+       // discussion form participation specific checks
+       //
+
+       $start_date = $this->discussion_process_contrib_start_date;
+       $end_date   = $this->discussion_process_contrib_end_date;
+
+       $donation_params    = ['start_date' => $start_date, 'end_date' => $end_date];
+       $gift_member_params = ['start_date' => $start_date, 'end_date' => $end_date, 'gift_redeem_page_id' => intval($this->gift_redeem_page_id)];
+       $adhoc_params       = ['adhoc_access_group_id' => intval($this->discussion_process_adhoc_access_group_id)];
+       $adhoc_params_no    = ['adhoc_access_group_id' => intval($this->discussion_process_adhoc_no_access_group_id)];
+
+       if ($this->discussion_process_active != 'true' ) {
+               $attributes['discussion_process'] = ['false'];
+
+       } elseif ($compare_res($donation_query('query_discussion_process_adhoc', $adhoc_params_no), 1)) {
+               Logger::debug('fsfdrupalauth:'.$this->authId.
+                       ': Nominee not eligible for board nominee discussion process.');
+               $attributes['discussion_process'] = ['false'];
+
+       } elseif ($compare_res($donation_query('query_discussion_process_adhoc', $adhoc_params), 1)) {
+               $attributes['discussion_process'] = ['true'];
+
+       } elseif ($attributes['is_member'] != ['true']) {
+               Logger::debug('fsfdrupalauth:'.$this->authId.
+                       ': Not eligible for board nominee discussion process.');
+               $attributes['discussion_process'] = ['false'];
+
+       } elseif ($discussion_process_analyze_history($donation_query('query_discussion_process_donations', $donation_params))
+               || $compare_res($donation_query('query_discussion_process_gift_receipt', $gift_member_params), 1)) {
+
+               $attributes['discussion_process'] = ['true'];
+
+       } else {
+               Logger::debug('fsfdrupalauth:'.$this->authId.
+                       ': Not eligible for board nominee discussion process.');
+               $attributes['discussion_process'] = ['false'];
+       }
+
         //
         // query on staff
         //
@@ -405,9 +520,9 @@ class FSFDrupalAuth extends \SimpleSAML\Module\core\Auth\UserPassBase
                 }
                 $value = (string) $value;
 
-                if ($value === $username) {
+                if (strtolower($value) === strtolower($username)) {
                     // they are staff
-                    $attributes[$key] = ['true'];
+                    $attributes['is_fsf_staff'] = ['true'];
                     break;
                 }
             }