Skip to content

Commit

Permalink
Merge pull request #11956 from MiyaNoctem/CRM-50-sub-tabs-for-contrib…
Browse files Browse the repository at this point in the history
…utions

(dev/core/50) Add Separate Sub-tabs for Contributions and Recurring Contributions
  • Loading branch information
eileenmcnaughton authored Jun 8, 2018
2 parents 3ffaaa3 + a62691e commit d998c61
Show file tree
Hide file tree
Showing 3 changed files with 171 additions and 71 deletions.
17 changes: 17 additions & 0 deletions CRM/Contribute/BAO/ContributionRecur.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,13 @@
*/
class CRM_Contribute_BAO_ContributionRecur extends CRM_Contribute_DAO_ContributionRecur {

/**
* Array with statuses that mark a recurring contribution as inactive.
*
* @var array
*/
private static $inactiveStatuses = array('Cancelled', 'Chargeback', 'Refunded', 'Completed');

/**
* Create recurring contribution.
*
Expand Down Expand Up @@ -938,4 +945,14 @@ public static function calculateRecurLineItems($recurId, $total_amount, $financi
return $lineSets;
}

/**
* Returns array with statuses that are considered to make a recurring
* contribution inacteve.
*
* @return array
*/
public static function getInactiveStatuses() {
return self::$inactiveStatuses;
}

}
119 changes: 83 additions & 36 deletions CRM/Contribute/Page/Tab.php
Original file line number Diff line number Diff line change
Expand Up @@ -166,59 +166,106 @@ public function browse() {
* 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' => CRM_Contribute_BAO_ContributionRecur::getInactiveStatuses()),
'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' => CRM_Contribute_BAO_ContributionRecur::getInactiveStatuses()),
'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']);
}

$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 ($recurContributions[$recurId]['is_active']) {
$details = CRM_Contribute_BAO_ContributionRecur::getSubscriptionDetails($recurContributions[$recurId]['id'], 'recur');
$hideUpdate = $details->membership_id & $details->auto_renew;

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;
}

/**
Expand Down
106 changes: 71 additions & 35 deletions templates/CRM/Contribute/Page/Tab.tpl
Original file line number Diff line number Diff line change
Expand Up @@ -29,55 +29,91 @@
{include file="CRM/Contribute/Form/ContributionView.tpl"}
{else}
<div class="contact-summary-contribute-tab view-content">
<div class="help">

<div id="secondaryTabContainer" class="ui-tabs ui-widget ui-widget-content ui-corner-all">
{* Tab management *}
<script type="text/javascript">
var selectedTab = 'contributions';
{literal}
CRM.$(function($) {
var tabIndex = $('#tab_' + selectedTab).prevAll().length;
$("#secondaryTabContainer").tabs({active: tabIndex});
$(".crm-tab-button").addClass("ui-corner-bottom");
});
{/literal}
</script>
<ul class="ui-tabs-nav ui-corner-all ui-helper-reset ui-helper-clearfix ui-widget-header">
<li id="tab_contributions" class="crm-tab-button ui-corner-all ui-tabs-tab ui-corner-top ui-state-default ui-tab ui-tabs-active ui-state-active">
<a href="#contributions-subtab" title="{ts}Contributions{/ts}">
{ts}Contributions{/ts}
</a>
</li>
<li id="tab_recurring" class="crm-tab-button ui-corner-all ui-tabs-tab ui-corner-top ui-state-default ui-tab">
<a href="#recurring-subtab" title="{ts}Recurring Contributions{/ts}">
{ts}Recurring Contributions{/ts}
</a>
</li>
</ul>
<div id="contributions-subtab" class="ui-tabs-panel ui-widget-content ui-corner-bottom">
<div class="help">
{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 <a %1>Record Contribution</a> 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 <a %1>Submit Credit Card Contribution</a> 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 <a %1>Submit Credit Card Contribution</a> 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}
</div>
</div>
{if $action eq 16 and $permission EQ 'edit'}
{if $action eq 16 and $permission EQ 'edit'}
<div class="action-link">
<a accesskey="N" href="{$newContribURL}" class="button"><span><i class="crm-i fa-plus-circle"></i> {ts}Record Contribution (Check, Cash, EFT ...){/ts}</span></a>
{if $newCredit}
<a accesskey="N" href="{$newCreditURL}" class="button"><span><i class="crm-i fa-credit-card"></i> {ts}Submit Credit Card Contribution{/ts}</span></a>
{/if}
<br /><br />
<a accesskey="N" href="{$newContribURL}" class="button"><span><i class="crm-i fa-plus-circle"></i> {ts}Record Contribution (Check, Cash, EFT ...){/ts}</span></a>
{if $newCredit}
<a accesskey="N" href="{$newCreditURL}" class="button"><span><i class="crm-i fa-credit-card"></i> {ts}Submit Credit Card Contribution{/ts}</span></a>
{/if}
<br /><br />
</div>
<div class='clear'></div>
{/if}
<div class='clear'></div>
{/if}
{if $rows}
{if $rows}
{include file="CRM/Contribute/Page/ContributionTotals.tpl" mode="view"}
<div class='clear'></div>
<div class='clear'></div>
{include file="CRM/Contribute/Form/Selector.tpl"}
{else}
{else}
<div class="messages status no-popup">
<div class="icon inform-icon"></div>
{ts}No contributions have been recorded from this contact.{/ts}
<div class="icon inform-icon"></div>
{ts}No contributions have been recorded from this contact.{/ts}
</div>
{/if}

{if $recur}
<div class="crm-block crm-contact-contribute-recur">
<h3>{ts}Recurring Contributions{/ts}</h3>
{include file="CRM/Contribute/Page/ContributionRecur.tpl"}
</div>
{/if}
{/if}
{if $softCredit}
<div class="crm-block crm-contact-contribute-softcredit">
<h3>{ts}Soft credits{/ts} {help id="id-soft_credit"}</h3>
{include file="CRM/Contribute/Page/ContributionSoft.tpl"}
</div>
{/if}
{if $softCredit}
<div class="crm-block crm-contact-contribute-softcredit">
<h3>{ts}Soft credits{/ts} {help id="id-soft_credit"}</h3>
{include file="CRM/Contribute/Page/ContributionSoft.tpl"}
</div>
{/if}
</div>
<div id="recurring-subtab" class="ui-tabs-panel ui-widget-content ui-corner-bottom">
{if $recur}
<div class="crm-block crm-contact-contribute-recur crm-contact-contribute-recur-active">
<h3>{ts}Active Recurring Contributions{/ts}</h3>
{include file="CRM/Contribute/Page/ContributionRecur.tpl" recurRows=$activeRecurRows}
</div>
<div class="crm-block crm-contact-contribute-recur crm-contact-contribute-recur-inactive">
<h3>{ts}Inactive Recurring Contributions{/ts}</h3>
{include file="CRM/Contribute/Page/ContributionRecur.tpl" recurRows=$inactiveRecurRows}
</div>
{/if}
</div>
<div class="clear"></div>
</div>
</div>
{/if}

0 comments on commit d998c61

Please sign in to comment.