Skip to content

Commit

Permalink
Fix self-service recurring link on dashboard
Browse files Browse the repository at this point in the history
This picks up on two of the issues that were blocking on
civicrm#18787 and
civicrm#18196
(but does not solve all of them). It

1) adds the basis for unit test cover and
2) separates the function for retrieving links
for self-service from back office user.

I think there is still some jumbling together of these concepts but
as long as we are careful to extend the tests as we extend the logic...

This fixes what I suspect is an oldish regression whereby the cancel link
for paypal std users was wrong
  • Loading branch information
eileenmcnaughton committed May 3, 2021
1 parent 472a3ec commit 099d6fe
Show file tree
Hide file tree
Showing 5 changed files with 86 additions and 6 deletions.
71 changes: 71 additions & 0 deletions CRM/Contribute/Page/Tab.php
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,77 @@ public static function recurLinks(int $recurID, $context = 'contribution') {
return $links;
}

/**
* Get the recur links to return for self service.
*
* These are the links to present to a logged in user wishing
* to service their own
*
* @param int $recurID
*
* @return array|array[]
* @throws \CRM_Core_Exception
* @throws \CiviCRM_API3_Exception
*/
public static function selfServiceRecurLinks(int $recurID): array {
$paymentProcessorObj = Civi\Payment\System::singleton()->getById(CRM_Contribute_BAO_ContributionRecur::getPaymentProcessorID($recurID));
if ($paymentProcessorObj->supports('cancelRecurring')
&& $paymentProcessorObj->subscriptionURL($recurID, 'recur', 'cancel')
) {
$links[CRM_Core_Action::DISABLE] = [
'url' => $paymentProcessorObj->subscriptionURL($recurID, 'recur', 'cancel'),
'name' => ts('Cancel'),
'title' => ts('Cancel'),
];
}

if ($paymentProcessorObj->supports('UpdateSubscriptionBillingInfo')
&& $paymentProcessorObj->subscriptionURL($recurID, 'recur', 'billing')
) {
$links[CRM_Core_Action::RENEW] = [
'name' => ts('Change Billing Details'),
'title' => ts('Change Billing Details'),
'url' => $paymentProcessorObj->subscriptionURL($recurID, 'recur', 'billing'),
];
}

if (($paymentProcessorObj->supports('ChangeSubscriptionAmount')
|| $paymentProcessorObj->supports('EditRecurringContribution'))
&& $paymentProcessorObj->subscriptionURL($recurID, 'recur', 'update')
) {
$links[CRM_Core_Action::UPDATE] = [
'name' => ts('Edit'),
'title' => ts('Edit Recurring Payment'),
'url' => $paymentProcessorObj->subscriptionURL($recurID, 'recur', 'update'),
];
}
return $links;
}

/**
* Get recurring links appropriate to viewing a user dashboard.
*
* A contact should be able to see links appropriate to them (e.g
* payment processor cancel page) if viewing their own dashboard and
* links appropriate to the contact they are viewing, if they have
* permission, if viewing another user.
*
* @param int $recurID
* @param int $contactID
*
* @return array|array[]
* @throws \CRM_Core_Exception
* @throws \CiviCRM_API3_Exception
*/
public static function dashboardRecurLinks(int $recurID, int $contactID): array {
$links = [];
if ($contactID && $contactID === CRM_Core_Session::getLoggedInContactID()) {
$links = self::selfServiceRecurLinks($recurID);
}
$links += self::recurLinks($recurID);
return $links;
}

/**
* called when action is browse.
*
Expand Down
4 changes: 2 additions & 2 deletions CRM/Contribute/Page/UserDashboard.php
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ public function listContribution() {
$values['recur_status'] = $recurStatus[$values['contribution_status_id']];
$recurRow[$values['id']] = $values;

$action = array_sum(array_keys(CRM_Contribute_Page_Tab::recurLinks((int) $recur->id, 'dashboard')));
$action = array_sum(array_keys(CRM_Contribute_Page_Tab::dashboardRecurLinks((int) $recur->id, (int) $recur->contact_id)));

$details = CRM_Contribute_BAO_ContributionRecur::getSubscriptionDetails($recur->id, 'recur');
$hideUpdate = $details->membership_id & $details->auto_renew;
Expand All @@ -107,7 +107,7 @@ public function listContribution() {
$action -= CRM_Core_Action::UPDATE;
}

$recurRow[$values['id']]['action'] = CRM_Core_Action::formLink(CRM_Contribute_Page_Tab::recurLinks((int) $recur->id, 'dashboard'),
$recurRow[$values['id']]['action'] = CRM_Core_Action::formLink(CRM_Contribute_Page_Tab::dashboardRecurLinks((int) $recur->id, (int) $this->_contactId),
$action, [
'cid' => $this->_contactId,
'crid' => $values['id'],
Expand Down
2 changes: 1 addition & 1 deletion CRM/Core/Session.php
Original file line number Diff line number Diff line change
Expand Up @@ -563,7 +563,7 @@ public static function getLoggedInContactID() {
if (!is_numeric($session->get('userID'))) {
return NULL;
}
return $session->get('userID');
return (int) $session->get('userID');
}

/**
Expand Down
2 changes: 1 addition & 1 deletion CRM/Member/Page/RecurringContributions.php
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ private function setActionsForRecurringContribution(int $recurID, &$recurringCon
}

$recurringContribution['action'] = CRM_Core_Action::formLink(
CRM_Contribute_Page_Tab::recurLinks($recurID, 'contribution'),
CRM_Contribute_Page_Tab::recurLinks($recurID),
$action,
[
'cid' => $this->contactID,
Expand Down
13 changes: 11 additions & 2 deletions tests/phpunit/CRM/Contribute/Page/TabTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -60,10 +60,10 @@ public function testLinksPaypalStandard(): void {

$page = new CRM_Contribute_Page_UserDashboard();
$page->run();
$expected = '<span><a href="/index.php?q=civicrm/contact/view/contributionrecur&amp;reset=1&amp;id=1&amp;cid=3&amp;context=contribution" class="action-item crm-hover-button" title=\'View Recurring Payment\' >View</a><a href="/index.php?q=civicrm/contribute/updaterecur&amp;reset=1&amp;action=update&amp;crid=1&amp;cid=3&amp;context=contribution" class="action-item crm-hover-button" title=\'Edit Recurring Payment\' >Edit</a></span><span class=\'btn-slide crm-hover-button\'>more<ul class=\'panel\'><li><a href="/index.php?q=civicrm/contribute/unsubscribe&amp;reset=1&amp;crid=1&amp;cid=3&amp;context=contribution" class="action-item crm-hover-button" title=\'Cancel\' >Cancel</a></li><li><a href="/index.php?q=civicrm/contribute/updatebilling&amp;reset=1&amp;crid=1&amp;cid=3&amp;context=contribution" class="action-item crm-hover-button" title=\'Change Billing Details\' >Change Billing Details</a></li></ul></span>';
$expected = '<span><a href="https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_subscr-find&alias=sunil._1183377782_biz_api1.webaccess.co.in" class="action-item crm-hover-button" title=\'Cancel\' >Cancel</a><a href="" class="action-item crm-hover-button" title=\'Change Billing Details\' >Change Billing Details</a></span><span class=\'btn-slide crm-hover-button\'>more<ul class=\'panel\'><li><a href="" class="action-item crm-hover-button" title=\'Edit Recurring Payment\' >Edit</a></li><li><a href="/index.php?q=civicrm/contact/view/contributionrecur&amp;reset=1&amp;id=1&amp;cid=3&amp;context=contribution" class="action-item crm-hover-button" title=\'View Recurring Payment\' >View</a></li></ul></span>';
$this->assertEquals(
$expected,
$this->getActionHtml()
$this->getDashboardActionHtml()
);
}

Expand Down Expand Up @@ -115,5 +115,14 @@ protected function getActionHtml(): string {
return CRM_Core_Smarty::singleton()
->get_template_vars()['activeRecurRows'][1]['action'];
}
/**
* Get the html assigned as actions.
*
* @return string
*/
protected function getDashboardActionHtml(): string {
return CRM_Core_Smarty::singleton()
->get_template_vars()['recurRows'][1]['action'];
}

}

0 comments on commit 099d6fe

Please sign in to comment.