diff --git a/CRM/Admin/Form/Setting/MembershipExtension.php b/CRM/Admin/Form/Setting/MembershipExtension.php index cbbe78e..8f871bf 100644 --- a/CRM/Admin/Form/Setting/MembershipExtension.php +++ b/CRM/Admin/Form/Setting/MembershipExtension.php @@ -110,7 +110,7 @@ public function buildQuickForm( ) { $this->addElement('checkbox', "update_membership_status", - ts("Update membership status and end date")); + ts("Extend membership when contribution is completed")); $this->addElement('checkbox', "hide_auto_renewal", diff --git a/CRM/Membership/PaidByLogic.php b/CRM/Membership/PaidByLogic.php index 78b9eed..5134257 100644 --- a/CRM/Membership/PaidByLogic.php +++ b/CRM/Membership/PaidByLogic.php @@ -31,6 +31,9 @@ class CRM_Membership_PaidByLogic /** stores the pre/post hook records */ protected $monitoring_stack = array(); + /** stores the pre/post hook records for contribution status changed */ + protected $contribution_status_monitoring_stack = array(); + public static function getSingleton() { if (self::$singleton === NULL) { @@ -458,8 +461,13 @@ public function membershipPaymentCreatePOST($contribution_id, $membership_id) { return; } - // Calculate new end date and set this as the new membership end date. + $completed_status = civicrm_api3('OptionValue', 'getvalue', array('name' => 'Completed', 'option_group_id' => 'contribution_status', 'return' => 'value')); $contribution = civicrm_api3('Contribution', 'getsingle', array('id' => $contribution_id)); + if ($contribution['contribution_status_id'] != $completed_status) { + return; // Do not calculate the new end date as the contribution is not yet completed. + } + + // Calculate new end date and set this as the new membership end date. $membership = civicrm_api3('Membership', 'getsingle', array('id' => $membership_id)); $currentEndDate = new DateTime($membership['end_date']); $newDates = CRM_Member_BAO_MembershipType::getRenewalDatesForMembershipType($membership_id, $contribution['receive_date']); @@ -479,4 +487,58 @@ public function membershipPaymentCreatePOST($contribution_id, $membership_id) { civicrm_api3('Membership', 'create', $membershipParams); } } + + /** + * Contribution status monitor function. + * + * Monitor for contribution status changed to completed to update the membership end date. + * + * @param $contribution_id + * @param $params + * @throws Exception only if something's wrong with the pre/post call sequence - shouldn't happen + */ + public function contributionUpdatePRE($contribution_id, $params) { + $settings = CRM_Membership_Settings::getSettings(); + if (!$settings->getSetting('update_membership_status')) { + return; + } + + $completed_status = civicrm_api3('OptionValue', 'getvalue', array('name' => 'Completed', 'option_group_id' => 'contribution_status', 'return' => 'value')); + $contribution = civicrm_api3('Contribution', 'getsingle', array('id' => $contribution_id)); + if ($params['contribution_status_id'] != $completed_status) { + return; + } + if ($params['contribution_status_id'] == $contribution['contribution_status_id']) { + return; + } + + $this->contribution_status_monitoring_stack[$contribution_id] = $contribution; + } + + /** + * Contribution status monitor function. + * + * Monitor for contribution status changed to completed to update the membership end date. + * + * @param $contribution_id + * @param $object + * @throws Exception only if something's wrong with the pre/post call sequence - shouldn't happen + */ + public function contributionUpdatePOST($contribution_id, $object) { + $settings = CRM_Membership_Settings::getSettings(); + if (!$settings->getSetting('update_membership_status')) { + return; + } + + if (!isset($this->contribution_status_monitoring_stack[$contribution_id])) { + return; + } + + $membershipPayments = civicrm_api3('MembershipPayment', 'get', array('contribution_id' => $contribution_id, 'options' => array('limit' => 0))); + foreach($membershipPayments['values'] as $membershipPayment) { + $this->membershipPaymentCreatePOST($contribution_id, $membershipPayment['membership_id']); + } + + unset($this->contribution_status_monitoring_stack[$contribution_id]); + } } \ No newline at end of file diff --git a/membership.php b/membership.php index 94039f5..441e074 100644 --- a/membership.php +++ b/membership.php @@ -156,6 +156,10 @@ function membership_civicrm_pre($op, $objectName, $id, &$params) { $logic->membershipUpdatePre($id, $params); } } + if ($objectName == 'Contribution' && $op == 'edit') { + $logic = CRM_Membership_PaidByLogic::getSingleton(); + $logic->contributionUpdatePRE($id, $params); + } } /** @@ -176,6 +180,10 @@ function membership_civicrm_post($op, $objectName, $objectId, &$objectRef) { $logic = CRM_Membership_PaidByLogic::getSingleton(); $logic->membershipPaymentCreatePOST($objectRef->contribution_id, $objectRef->membership_id); } + if ($objectName == 'Contribution' && $op == 'edit') { + $logic = CRM_Membership_PaidByLogic::getSingleton(); + $logic->contributionUpdatePOST($objectId, $objectRef); + } } diff --git a/templates/CRM/Admin/Form/Setting/MembershipExtension.hlp b/templates/CRM/Admin/Form/Setting/MembershipExtension.hlp index f00d6ad..7b630d6 100644 --- a/templates/CRM/Admin/Form/Setting/MembershipExtension.hlp +++ b/templates/CRM/Admin/Form/Setting/MembershipExtension.hlp @@ -39,7 +39,8 @@ {/htxt} {htxt id='update-membership-status'} -

{ts}As soon as the sepa mandate is debitted the contribution is created and added to the membership. If you check this box the end date and the status of the membership will be updated.{/ts}

+

{ts}Extend the membership as soon as the membership contribution is set to completed.{/ts}

+

{ts}This will calculate the new end date and a new status.{/ts}

{/htxt} {htxt id='id-paid-via-end-status'} diff --git a/templates/CRM/Admin/Form/Setting/MembershipExtension.tpl b/templates/CRM/Admin/Form/Setting/MembershipExtension.tpl index efc5813..38c5062 100644 --- a/templates/CRM/Admin/Form/Setting/MembershipExtension.tpl +++ b/templates/CRM/Admin/Form/Setting/MembershipExtension.tpl @@ -61,10 +61,6 @@ {$form.paid_via_field.label}  {$form.paid_via_field.html} - - {$form.update_membership_status.label}  - {$form.update_membership_status.html} - {$form.paid_via_end_with_status.label}  {$form.paid_via_end_with_status.html} @@ -73,6 +69,10 @@ {$form.hide_auto_renewal.label}  {$form.hide_auto_renewal.html} + + {$form.update_membership_status.label}  + {$form.update_membership_status.html} +