From 794d92caa131a7e779b3f13cae158e026a2c263b Mon Sep 17 00:00:00 2001 From: Andrew Engelbrecht Date: Tue, 25 Apr 2023 12:40:58 -0400 Subject: [PATCH] check for discussion process access --- docs/fsf-drupal-auth.md | 12 +++++ lib/Auth/Source/FSFDrupalAuth.php | 86 ++++++++++++++++++++++++++++++- 2 files changed, 97 insertions(+), 1 deletion(-) diff --git a/docs/fsf-drupal-auth.md b/docs/fsf-drupal-auth.md index 68aaff4..5db174e 100644 --- a/docs/fsf-drupal-auth.md +++ b/docs/fsf-drupal-auth.md @@ -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 diff --git a/lib/Auth/Source/FSFDrupalAuth.php b/lib/Auth/Source/FSFDrupalAuth.php index c3f0445..74434e9 100644 --- a/lib/Auth/Source/FSFDrupalAuth.php +++ b/lib/Auth/Source/FSFDrupalAuth.php @@ -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 // -- 2.25.1