From 5963b706690cf8a0ce38feb3728bef6f638d81f8 Mon Sep 17 00:00:00 2001 From: Camilo Rodriguez Date: Thu, 5 Apr 2018 23:32:28 +0000 Subject: [PATCH] CRM-50: Add Separate Sub-tabs for Contributions and Recurring Contributions Changed Contributions Tab template so it uses two sub-tabs within it to show on the first tab, only the contributions table, and on the second tab, just the recurring contributions table. On the Recurring contributions tab, two tables are shown: active recurring contributions vs inactive recurring contributions. Implemented backend logic to load into the page two separate arrays with recurring contributions, the first one with active contributions, the second one with inactive contributions. --- CRM/Contribute/Page/Tab.php | 126 ++++++++++++++++++-------- templates/CRM/Contribute/Page/Tab.tpl | 106 +++++++++++++++------- 2 files changed, 161 insertions(+), 71 deletions(-) diff --git a/CRM/Contribute/Page/Tab.php b/CRM/Contribute/Page/Tab.php index 52026bf133..5e303e23a6 100644 --- a/CRM/Contribute/Page/Tab.php +++ b/CRM/Contribute/Page/Tab.php @@ -43,6 +43,13 @@ class CRM_Contribute_Page_Tab extends CRM_Core_Page { public $_contactId = NULL; public $_crid = NULL; + /** + * Array with statuses that mark a recurring contribution as inactive. + * + * @var array + */ + private $inactiveStatuses = array('Cancelled', 'Chargeback', 'Refunded', 'Completed'); + /** * This method returns the links that are given for recur search row. * currently the links added for each row are: @@ -166,59 +173,106 @@ class CRM_Contribute_Page_Tab extends CRM_Core_Page { * Get all the recurring contribution information and assign to the template */ private function addRecurringContributionsBlock() { + $activeContributions = $this->getActiveRecurringContributions(); + $inactiveRecurringContributions = $this->getInactiveRecurringContributions(); + + if (!empty($activeContributions) || !empty($inactiveRecurringContributions)) { + // assign vars to templates + $this->assign('action', $this->_action); + $this->assign('activeRecurRows', $activeContributions); + $this->assign('inactiveRecurRows', $inactiveRecurringContributions); + $this->assign('recur', TRUE); + } + } + + /** + * Loads active recurring contributions for the current contact and formats + * them to be used on the form. + * + * @return array; + */ + private function getActiveRecurringContributions() { try { $contributionRecurResult = civicrm_api3('ContributionRecur', 'get', array( 'contact_id' => $this->_contactId, + 'contribution_status_id' => array('NOT IN' => $this->inactiveStatuses), 'options' => array('limit' => 0, 'sort' => 'start_date ASC'), )); $recurContributions = CRM_Utils_Array::value('values', $contributionRecurResult); } catch (Exception $e) { - $recurContributions = NULL; + $recurContributions = array(); } - if (!empty($recurContributions)) { - foreach ($recurContributions as $recurId => $recurDetail) { - $action = array_sum(array_keys($this->recurLinks($recurId))); - // no action allowed if it's not active - $recurContributions[$recurId]['is_active'] = (!CRM_Contribute_BAO_Contribution::isContributionStatusNegative($recurDetail['contribution_status_id'])); + return $this->buildRecurringContributionsArray($recurContributions); + } - // Get the name of the payment processor - if (!empty($recurDetail['payment_processor_id'])) { - $recurContributions[$recurId]['payment_processor'] = CRM_Financial_BAO_PaymentProcessor::getPaymentProcessorName($recurDetail['payment_processor_id']); - } - // Get the label for the contribution status - if (!empty($recurDetail['contribution_status_id'])) { - $recurContributions[$recurId]['contribution_status'] = CRM_Core_PseudoConstant::getLabel('CRM_Contribute_BAO_ContributionRecur', 'contribution_status_id', $recurDetail['contribution_status_id']); - } + /** + * Loads inactive recurring contributions for the current contact and formats + * them to be used on the form. + * + * @return array; + */ + private function getInactiveRecurringContributions() { + try { + $contributionRecurResult = civicrm_api3('ContributionRecur', 'get', array( + 'contact_id' => $this->_contactId, + 'contribution_status_id' => array('IN' => $this->inactiveStatuses), + 'options' => array('limit' => 0, 'sort' => 'start_date ASC'), + )); + $recurContributions = CRM_Utils_Array::value('values', $contributionRecurResult); + } + catch (Exception $e) { + $recurContributions = NULL; + } - if ($recurContributions[$recurId]['is_active']) { - $details = CRM_Contribute_BAO_ContributionRecur::getSubscriptionDetails($recurContributions[$recurId]['id'], 'recur'); - $hideUpdate = $details->membership_id & $details->auto_renew; + return $this->buildRecurringContributionsArray($recurContributions); + } - if ($hideUpdate) { - $action -= CRM_Core_Action::UPDATE; - } + /** + * @param $recurContributions + * + * @return mixed + */ + private function buildRecurringContributionsArray($recurContributions) { + foreach ($recurContributions as $recurId => $recurDetail) { + $action = array_sum(array_keys($this->recurLinks($recurId))); + // no action allowed if it's not active + $recurContributions[$recurId]['is_active'] = (!CRM_Contribute_BAO_Contribution::isContributionStatusNegative($recurDetail['contribution_status_id'])); + + // Get the name of the payment processor + if (!empty($recurDetail['payment_processor_id'])) { + $recurContributions[$recurId]['payment_processor'] = CRM_Financial_BAO_PaymentProcessor::getPaymentProcessorName($recurDetail['payment_processor_id']); + } + // Get the label for the contribution status + if (!empty($recurDetail['contribution_status_id'])) { + $recurContributions[$recurId]['contribution_status'] = CRM_Core_PseudoConstant::getLabel('CRM_Contribute_BAO_ContributionRecur', 'contribution_status_id', $recurDetail['contribution_status_id']); + } + + if ($recurContributions[$recurId]['is_active']) { + $details = CRM_Contribute_BAO_ContributionRecur::getSubscriptionDetails($recurContributions[$recurId]['id'], 'recur'); + $hideUpdate = $details->membership_id & $details->auto_renew; - $recurContributions[$recurId]['action'] = CRM_Core_Action::formLink(self::recurLinks($recurId), $action, - array( - 'cid' => $this->_contactId, - 'crid' => $recurId, - 'cxt' => 'contribution', - ), - ts('more'), - FALSE, - 'contribution.selector.recurring', - 'Contribution', - $recurId - ); + if ($hideUpdate) { + $action -= CRM_Core_Action::UPDATE; } + + $recurContributions[$recurId]['action'] = CRM_Core_Action::formLink(self::recurLinks($recurId), $action, + array( + 'cid' => $this->_contactId, + 'crid' => $recurId, + 'cxt' => 'contribution', + ), + ts('more'), + FALSE, + 'contribution.selector.recurring', + 'Contribution', + $recurId + ); } - // assign vars to templates - $this->assign('action', $this->_action); - $this->assign('recurRows', $recurContributions); - $this->assign('recur', TRUE); } + + return $recurContributions; } /** diff --git a/templates/CRM/Contribute/Page/Tab.tpl b/templates/CRM/Contribute/Page/Tab.tpl index cd38ffa634..ffa4a7ea2d 100644 --- a/templates/CRM/Contribute/Page/Tab.tpl +++ b/templates/CRM/Contribute/Page/Tab.tpl @@ -29,55 +29,91 @@ {include file="CRM/Contribute/Form/ContributionView.tpl"} {else}
-
+ +
+ {* Tab management *} + + + +
+
{if $permission EQ 'edit'} {capture assign=newContribURL}{crmURL p="civicrm/contact/view/contribution" q="reset=1&action=add&cid=`$contactId`&context=contribution"}{/capture} {capture assign=link}class="action-item" href="{$newContribURL}"{/capture} {ts 1=$link}Click Record Contribution to record a new contribution received from this contact.{/ts} - {if $newCredit} - {capture assign=newCreditURL}{crmURL p="civicrm/contact/view/contribution" q="reset=1&action=add&cid=`$contactId`&context=contribution&mode=live"}{/capture} - {capture assign=link}class="action-item" href="{$newCreditURL}"{/capture} - {ts 1=$link}Click Submit Credit Card Contribution to process a new contribution on behalf of the contributor using their credit card.{/ts} - {/if} + {if $newCredit} + {capture assign=newCreditURL}{crmURL p="civicrm/contact/view/contribution" q="reset=1&action=add&cid=`$contactId`&context=contribution&mode=live"}{/capture} + {capture assign=link}class="action-item" href="{$newCreditURL}"{/capture} + {ts 1=$link}Click Submit Credit Card Contribution to process a new contribution on behalf of the contributor using their credit card.{/ts} + {/if} {else} - {ts 1=$displayName}Contributions received from %1 since inception.{/ts} + {ts 1=$displayName}Contributions received from %1 since inception.{/ts} {/if} -
+
- {if $action eq 16 and $permission EQ 'edit'} + {if $action eq 16 and $permission EQ 'edit'} -
- {/if} +
+ {/if} - {if $rows} + {if $rows} {include file="CRM/Contribute/Page/ContributionTotals.tpl" mode="view"} -
+
{include file="CRM/Contribute/Form/Selector.tpl"} - {else} + {else}
-
- {ts}No contributions have been recorded from this contact.{/ts} +
+ {ts}No contributions have been recorded from this contact.{/ts}
- {/if} - - {if $recur} -
-

{ts}Recurring Contributions{/ts}

- {include file="CRM/Contribute/Page/ContributionRecur.tpl"} -
- {/if} + {/if} - {if $softCredit} -
-

{ts}Soft credits{/ts} {help id="id-soft_credit"}

- {include file="CRM/Contribute/Page/ContributionSoft.tpl"} -
- {/if} + {if $softCredit} +
+

{ts}Soft credits{/ts} {help id="id-soft_credit"}

+ {include file="CRM/Contribute/Page/ContributionSoft.tpl"} +
+ {/if} +
+
+ {if $recur} +
+

{ts}Active Recurring Contributions{/ts}

+ {include file="CRM/Contribute/Page/ContributionRecur.tpl" recurRows=$activeRecurRows} +
+
+

{ts}Inactive Recurring Contributions{/ts}

+ {include file="CRM/Contribute/Page/ContributionRecur.tpl" recurRows=$inactiveRecurRows} +
+ {/if} +
+
+
{/if} -- 2.25.1