From 5f11bbcc5e5008cc8bb6353feb28b87e02e50459 Mon Sep 17 00:00:00 2001 From: Eileen McNaughton Date: Fri, 28 Mar 2014 16:58:49 +1300 Subject: [PATCH] CRM-14399 add alterCalculatedMembershipStatus hook Conflicts: api/v3/MembershipStatus.php --- CRM/Contribute/BAO/Contribution.php | 4 +++- CRM/Core/Payment/BaseIPN.php | 4 +++- CRM/Member/BAO/Membership.php | 11 ++++++++--- CRM/Member/BAO/MembershipStatus.php | 22 +++++++++++++++++++--- CRM/Member/Form/Membership.php | 4 +++- CRM/Member/Import/Parser/Membership.php | 8 ++++++-- CRM/Utils/Hook.php | 20 ++++++++++++++++++++ api/v3/MembershipStatus.php | 24 +++++++++++------------- 8 files changed, 73 insertions(+), 24 deletions(-) diff --git a/CRM/Contribute/BAO/Contribution.php b/CRM/Contribute/BAO/Contribution.php index d19728a1a9..df23ad7439 100644 --- a/CRM/Contribute/BAO/Contribution.php +++ b/CRM/Contribute/BAO/Contribution.php @@ -1548,7 +1548,9 @@ LEFT JOIN civicrm_contribution contribution ON ( componentPayment.contribution_ $dates['end_date'], $dates['join_date'], 'today', - TRUE + TRUE, + $membership->membership_type_id, + (array) $membership ); $formattedParams = array( diff --git a/CRM/Core/Payment/BaseIPN.php b/CRM/Core/Payment/BaseIPN.php index 43221ba1f1..1ad0d37b20 100644 --- a/CRM/Core/Payment/BaseIPN.php +++ b/CRM/Core/Payment/BaseIPN.php @@ -398,7 +398,9 @@ LIMIT 1;"; $dates['end_date'], $dates['join_date'], 'today', - TRUE + TRUE, + $membership->membership_type_id, + (array) $membership ); $formatedParams = array('status_id' => CRM_Utils_Array::value('id', $calcStatus, 2), diff --git a/CRM/Member/BAO/Membership.php b/CRM/Member/BAO/Membership.php index 308fa479c9..8a9d5b41bc 100644 --- a/CRM/Member/BAO/Membership.php +++ b/CRM/Member/BAO/Membership.php @@ -247,7 +247,7 @@ class CRM_Member_BAO_Membership extends CRM_Member_DAO_Membership { } $calcStatus = CRM_Member_BAO_MembershipStatus::getMembershipStatusByDate($start_date, $end_date, $join_date, - 'today', $excludeIsAdmin + 'today', $excludeIsAdmin, CRM_Utils_Array::value('membership_type_id', $params), $params ); if (empty($calcStatus)) { // Redirect the form in case of error @@ -1717,7 +1717,10 @@ AND civicrm_membership.is_test = %2"; CRM_Utils_Date::customFormat($dates['join_date'], $statusFormat ), - 'today', TRUE + 'today', + TRUE, + $membershipTypeID, + $memParams ); $updateStatusId = CRM_Utils_Array::value('id', $status); } @@ -1814,7 +1817,9 @@ AND civicrm_membership.is_test = %2"; CRM_Utils_Array::value('end_date', $currentMembership), CRM_Utils_Array::value('join_date', $currentMembership), $today, - TRUE + TRUE, + $currentMembership['membership_type_id'], + $currentMembership ); if (empty($status) || diff --git a/CRM/Member/BAO/MembershipStatus.php b/CRM/Member/BAO/MembershipStatus.php index 23e1d8c983..81c0fd0b2c 100644 --- a/CRM/Member/BAO/MembershipStatus.php +++ b/CRM/Member/BAO/MembershipStatus.php @@ -207,14 +207,17 @@ class CRM_Member_BAO_MembershipStatus extends CRM_Member_DAO_MembershipStatus { * @param date $joinDate join date of the member whose membership status is to be calculated. * @param date $statusDate status date of the member whose membership status is to be calculated. * @param boolean $excludeIsAdmin exclude the statuses those having is_admin = 1 + * @param integer $membershipType membership type id - passed to the hook + * @param array $membership membership params as available to calling function - passed to the hook * * @return * @static */ static function getMembershipStatusByDate($startDate, $endDate, $joinDate, - $statusDate = 'today', $excludeIsAdmin = FALSE + $statusDate = 'today', $excludeIsAdmin = FALSE, $membershipTypeID, $membership = array() ) { $membershipDetails = array(); + if (!$statusDate || $statusDate == 'today') { $statusDate = getDate(); $statusDate = date('Ymd', @@ -332,13 +335,26 @@ class CRM_Member_BAO_MembershipStatus extends CRM_Member_DAO_MembershipStatus { // returns FIRST status record for which status_date is in range. if ($membershipDetails) { - $membershipStatus->free(); - return $membershipDetails; + break; } } //end fetch $membershipStatus->free(); + + //we bundle the arguments into an array as we can't pass 8 variables to the hook otherwise + // the membership array might contain the pre-altered settings so we don't want to merge this + $arguments = array( + 'start_date' => $startDate, + 'end_date' => $endDate, + 'join_date' => $joinDate, + 'status_date' => $statusDate, + 'exclude_is_admin' => $endDate, + 'membership_type_id' => $membershipTypeID, + 'start_event' => $startEvent, + 'end_event' => $endEvent, + ); + CRM_Utils_Hook::alterCalculatedMembershipStatus($membershipDetails, $arguments, $membership); return $membershipDetails; } diff --git a/CRM/Member/Form/Membership.php b/CRM/Member/Form/Membership.php index f1addf4bec..8e733b948e 100644 --- a/CRM/Member/Form/Membership.php +++ b/CRM/Member/Form/Membership.php @@ -1010,7 +1010,9 @@ WHERE id IN ( ' . implode(' , ', array_keys($membershipType)) . ' )'; $endDate, $joinDate, 'today', - TRUE + TRUE, + $memType, + $params ); if (empty($calcStatus)) { $url = CRM_Utils_System::url('civicrm/admin/member/membershipStatus', 'reset=1&action=browse'); diff --git a/CRM/Member/Import/Parser/Membership.php b/CRM/Member/Import/Parser/Membership.php index 3da7dbed75..34db6049b4 100644 --- a/CRM/Member/Import/Parser/Membership.php +++ b/CRM/Member/Import/Parser/Membership.php @@ -441,7 +441,9 @@ class CRM_Member_Import_Parser_Membership extends CRM_Member_Import_Parser { $endDate, $joinDate, 'today', - $excludeIsAdmin + $excludeIsAdmin, + $formatted['membership_type_id'], + $formatted ); if (empty($formatted['status_id'])) { @@ -529,7 +531,9 @@ class CRM_Member_Import_Parser_Membership extends CRM_Member_Import_Parser { $endDate, $joinDate, 'today', - $excludeIsAdmin + $excludeIsAdmin, + $formatted['membership_type_id'], + $formatted ); if (empty($formatted['status_id'])) { $formatted['status_id'] = CRM_Utils_Array::value('id', $calcStatus); diff --git a/CRM/Utils/Hook.php b/CRM/Utils/Hook.php index df7b9216ad..08bf044643 100644 --- a/CRM/Utils/Hook.php +++ b/CRM/Utils/Hook.php @@ -801,6 +801,26 @@ abstract class CRM_Utils_Hook { ); } + /** + * This hook is called when membership status is being calculated + * + * @param array $membershipStatus membership status details as determined - alter if required + * @param array $arguments arguments passed in to calculate date + * - 'start_date' + * - 'end_date' + * - 'status_date' + * - 'join_date' + * - 'exclude_is_admin' + * - 'membership_type_id' + * @param array $membership membership details from the calling function + */ + static function alterCalculatedMembershipStatus(&$membershipStatus, $arguments, $membership) { + return self::singleton()->invoke(3, $membershipStatus, $arguments, + $membership, self::$_nullObject, self::$_nullObject, + 'civicrm_alterCalculatedMembershipStatus' + ); + } + /** * This hook is called when rendering the Manage Case screen * diff --git a/api/v3/MembershipStatus.php b/api/v3/MembershipStatus.php index b9eb9d1161..c44dc6639a 100644 --- a/api/v3/MembershipStatus.php +++ b/api/v3/MembershipStatus.php @@ -149,35 +149,33 @@ function civicrm_api3_membership_status_delete($params) { * @public */ function civicrm_api3_membership_status_calc($membershipParams) { - if (!($membershipID = CRM_Utils_Array::value('membership_id', $membershipParams))) { - return civicrm_api3_create_error('membershipParams do not contain membership_id'); + throw new API_Exception('membershipParams do not contain membership_id'); } + if(empty($membershipParams['id'])) { + //for consistency lets make sure id is set as this will get passed to hooks downstream + $membershipParams['id'] = $membershipID; + } $query = " -SELECT start_date, end_date, join_date +SELECT start_date, end_date, join_date, membership_type_id FROM civicrm_membership WHERE id = %1 "; $params = array(1 => array($membershipID, 'Integer')); - $dao = &CRM_Core_DAO::executeQuery($query, $params); + $dao = CRM_Core_DAO::executeQuery($query, $params); if ($dao->fetch()) { - // Take the is_admin column in MembershipStatus into consideration when requested - if (empty($membershipParams['ignore_admin_only'])) { - $result = &CRM_Member_BAO_MembershipStatus::getMembershipStatusByDate($dao->start_date, $dao->end_date, $dao->join_date, 'today', TRUE); - } - else { - $result = &CRM_Member_BAO_MembershipStatus::getMembershipStatusByDate($dao->start_date, $dao->end_date, $dao->join_date); - } - + $membershipTypeID = empty($membershipParams['membership_type_id']) ? $dao->membership_type_id : $membershipParams['membership_type_id']; + $result = CRM_Member_BAO_MembershipStatus::getMembershipStatusByDate($dao->start_date, $dao->end_date, $dao->join_date, 'today', CRM_Utils_Array::value('ignore_admin_only', $membershipParams), $membershipTypeID, $membershipParams); //make is error zero only when valid status found. if (!empty($result['id'])) { $result['is_error'] = 0; } } else { - $result = civicrm_api3_create_error('did not find a membership record'); + $dao->free(); + throw new API_Exception('did not find a membership record'); } $dao->free(); return $result; -- 2.25.1