check for discussion process access
authorAndrew Engelbrecht <andrew@fsf.org>
Tue, 25 Apr 2023 16:40:58 +0000 (12:40 -0400)
committerroot <root@login0d.fsf.org>
Tue, 25 Apr 2023 16:40:58 +0000 (12:40 -0400)
docs/fsf-drupal-auth.md
lib/Auth/Source/FSFDrupalAuth.php

index 68aaff441a64e19bcad3d0ebda0da044eafc3700..5db174e8f00297450ef8fc351f9bec9cf4aeb1ac 100644 (file)
@@ -24,6 +24,11 @@ SQL queries in `config/authsources.php` should be something like the following:
         'query_nomination_process_gift_receipt' => "select count(*) as gift_memberships_count from drupal.users a inner join civicrm.civicrm_uf_match b on a.uid=b.uf_id inner join civicrm.civicrm_contact c on b.contact_id=c.id inner join civicrm.civicrm_contribution d on c.id=d.contact_id where a.name = :username and d.contribution_page_id = :gift_redeem_page_id and d.receive_date > :start_date and d.receive_date < :end_date;",
         'query_nomination_process_adhoc' => "select count(*) as is_adhoc_member from drupal.users a inner join civicrm.civicrm_uf_match b on a.uid=b.uf_id inner join civicrm.civicrm_contact c on b.contact_id=c.id inner join civicrm.civicrm_group_contact d on c.id=d.contact_id where a.name=:username and a.status=1 and c.is_deleted=0 and d.group_id = :adhoc_access_group_id and d.status = 'Added' limit 1;",
 
+        'query_discussion_process_donations' => "select d.total_amount as amount, d.receive_date as receive_date, f.membership_type_id as member_type_id from drupal.users a inner join civicrm.civicrm_uf_match b on a.uid=b.uf_id inner join civicrm.civicrm_contact c on b.contact_id=c.id inner join civicrm.civicrm_contribution d on c.id=d.contact_id left join civicrm.civicrm_membership_payment e on d.id=e.contribution_id left join civicrm.civicrm_membership f on e.membership_id=f.id where a.name = :username and d.contribution_status_id = 1 and d.receive_date > :start_date and d.receive_date < :end_date;",
+        'query_discussion_process_gift_receipt' => "select count(*) as gift_memberships_count from drupal.users a inner join civicrm.civicrm_uf_match b on a.uid=b.uf_id inner join civicrm.civicrm_contact c on b.contact_id=c.id inner join civicrm.civicrm_contribution d on c.id=d.contact_id where a.name = :username and d.contribution_page_id = :gift_redeem_page_id and d.receive_date > :start_date and d.receive_date < :end_date;",
+        'query_discussion_process_adhoc' => "select count(*) as is_adhoc_member from drupal.users a inner join civicrm.civicrm_uf_match b on a.uid=b.uf_id inner join civicrm.civicrm_contact c on b.contact_id=c.id inner join civicrm.civicrm_group_contact d on c.id=d.contact_id where a.name=:username and a.status=1 and c.is_deleted=0 and d.group_id = :adhoc_access_group_id and d.status = 'Added' limit 1;",
+
+
         'fsf_org_id' => '739106',
         'gift_redeem_page_id' => '63',
 
@@ -33,6 +38,13 @@ SQL queries in `config/authsources.php` should be something like the following:
         'nomination_process_adhoc_access_group_id' => '1786',
         'membership_monthly_rate' => '10',
         'student_membership_monthly_rate' => '5',
+
+        'discussion_process_active' => 'true',
+        'discussion_process_contrib_start_date' => '2018-01-19',
+        'discussion_process_contrib_end_date' => '2022-10-19',
+        'discussion_process_adhoc_access_group_id' => '1786',
+        'discussion_process_adhoc_no_access_group_id' => '1787',
+        'discussion_donation_amount' => '120',
     ],
 
 ## License
index c3f044505b985d636fd98890ed8d1ed6e82cebaa..74434e90bff0ddf93dc611149701935ac237f41c 100644 (file)
@@ -44,10 +44,15 @@ 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
@@ -62,6 +67,12 @@ class FSFDrupalAuth extends \SimpleSAML\Module\core\Auth\UserPassBase
     private $membership_monthly_rate;
     private $student_membership_monthly_rate;
 
+    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.
      *
@@ -97,7 +108,17 @@ class FSFDrupalAuth extends \SimpleSAML\Module\core\Auth\UserPassBase
                'nomination_process_contrib_end_date',
                'nomination_process_adhoc_access_group_id',
                'membership_monthly_rate',
-               'student_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)) {
@@ -378,6 +399,33 @@ 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
        //
@@ -407,6 +455,42 @@ class FSFDrupalAuth extends \SimpleSAML\Module\core\Auth\UserPassBase
                $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' ) {
+               if ($compare_res($donation_query('query_discussion_process_adhoc', $adhoc_params_no), 1)) {
+                       Logger::debug('fsfdrupalauth:'.$this->authId.
+                               ': 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']
+                   && ($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'];
+               }
+       } else {
+               $attributes['discussion_process'] = ['false'];
+       }
+
         //
         // query on staff
         //