From 85b68a1175053ec7ccbcc2dfac06f4b5bf8b332f Mon Sep 17 00:00:00 2001 From: =?utf8?q?Camilo=20Rodr=C3=ADguez?= Date: Sun, 6 May 2018 21:07:20 -0500 Subject: [PATCH] (dev/core/40) Show List of Contributions On Recurring Contribution View (#11920) * CRM-40: Show List of Contributions On Recurring Contribution View Altered ContributionRecur page so that the list of contributions related to a recurring contribution are shown when viewing said recurring contribution. Implemented by running CRM_Contribute_Form_Search ebedded within the page and including CRM/Contribute/Form/Selector.tpl template within the page's template. Also included ContributionTotals.tpl to show, which I though could be cool. * CRM-40: Don't Use CRM_Contribute_Form_Search to Show Contributions CRM_Contribute_Form_Search class is very hard to read and maintain, which is why it was found better to look for related contributions manually and show them using an ajax datatable. * CRM-40: Fix Failing Test * CRM-40: Show Contribution List Using Ajax Call Added new Page that shows related payments for a given relted contribution in a data table and included the table on recurring contribution's detail view using an ajax call. --- CRM/Contribute/Form/Task.php | 10 +- CRM/Contribute/Form/UpdateSubscription.php | 3 + CRM/Contribute/Page/ContributionRecur.php | 6 +- .../Page/ContributionRecurPayments.php | 221 ++++++++++++++++++ CRM/Contribute/xml/Menu/Contribute.xml | 6 + .../CRM/Contribute/Page/ContributionRecur.tpl | 25 ++ .../Page/ContributionRecurPayments.tpl | 42 ++++ 7 files changed, 308 insertions(+), 5 deletions(-) create mode 100644 CRM/Contribute/Page/ContributionRecurPayments.php create mode 100644 templates/CRM/Contribute/Page/ContributionRecurPayments.tpl diff --git a/CRM/Contribute/Form/Task.php b/CRM/Contribute/Form/Task.php index dbfb3976e2..2964016264 100644 --- a/CRM/Contribute/Form/Task.php +++ b/CRM/Contribute/Form/Task.php @@ -116,10 +116,12 @@ class CRM_Contribute_Form_Task extends CRM_Core_Form { else { $queryParams = $form->get('queryParams'); $isTest = FALSE; - foreach ($queryParams as $fields) { - if ($fields[0] == 'contribution_test') { - $isTest = TRUE; - break; + if (is_array($queryParams)) { + foreach ($queryParams as $fields) { + if ($fields[0] == 'contribution_test') { + $isTest = TRUE; + break; + } } } if (!$isTest) { diff --git a/CRM/Contribute/Form/UpdateSubscription.php b/CRM/Contribute/Form/UpdateSubscription.php index 31907156ec..5f09e5c0fd 100644 --- a/CRM/Contribute/Form/UpdateSubscription.php +++ b/CRM/Contribute/Form/UpdateSubscription.php @@ -87,6 +87,9 @@ class CRM_Contribute_Form_UpdateSubscription extends CRM_Core_Form { catch (CRM_Core_Exception $e) { CRM_Core_Error::statusBounce(ts('There is no valid processor for this subscription so it cannot be edited.')); } + catch (CiviCRM_API3_Exception $e) { + CRM_Core_Error::statusBounce(ts('There is no valid processor for this subscription so it cannot be edited.')); + } $this->_subscriptionDetails = CRM_Contribute_BAO_ContributionRecur::getSubscriptionDetails($this->contributionRecurID); } diff --git a/CRM/Contribute/Page/ContributionRecur.php b/CRM/Contribute/Page/ContributionRecur.php index 84ba834139..dea041f3b6 100644 --- a/CRM/Contribute/Page/ContributionRecur.php +++ b/CRM/Contribute/Page/ContributionRecur.php @@ -39,6 +39,8 @@ class CRM_Contribute_Page_ContributionRecur extends CRM_Core_Page { static $_links = NULL; public $_permission = NULL; public $_contactId = NULL; + public $_id = NULL; + public $_action = NULL; /** * View details of a recurring contribution. @@ -57,7 +59,9 @@ class CRM_Contribute_Page_ContributionRecur extends CRM_Core_Page { CRM_Core_Error::statusBounce('Recurring contribution not found (ID: ' . $this->_id); } - $contributionRecur['payment_processor'] = CRM_Financial_BAO_PaymentProcessor::getPaymentProcessorName($contributionRecur['payment_processor_id']); + $contributionRecur['payment_processor'] = CRM_Financial_BAO_PaymentProcessor::getPaymentProcessorName( + CRM_Utils_Array::value('payment_processor_id', $contributionRecur) + ); $idFields = array('contribution_status_id', 'campaign_id', 'financial_type_id'); foreach ($idFields as $idField) { if (!empty($contributionRecur[$idField])) { diff --git a/CRM/Contribute/Page/ContributionRecurPayments.php b/CRM/Contribute/Page/ContributionRecurPayments.php new file mode 100644 index 0000000000..746e2ecf77 --- /dev/null +++ b/CRM/Contribute/Page/ContributionRecurPayments.php @@ -0,0 +1,221 @@ +id = CRM_Utils_Request::retrieve('id', 'Positive', $this, TRUE); + $this->contactId = CRM_Utils_Request::retrieve('cid', 'Positive', $this, TRUE); + + $this->loadRelatedContributions(); + + return parent::run(); + } + + /** + * Loads contributions associated to the current recurring contribution being + * viewed. + */ + private function loadRelatedContributions() { + $relatedContributions = array(); + + $relatedContributionsResult = civicrm_api3('Contribution', 'get', array( + 'sequential' => 1, + 'contribution_recur_id' => $this->id, + 'contact_id' => $this->contactId, + 'options' => array('limit' => 0), + )); + + foreach ($relatedContributionsResult['values'] as $contribution) { + $this->insertAmountExpandingPaymentsControl($contribution); + $this->fixDateFormats($contribution); + $this->insertStatusLabels($contribution); + $this->insertContributionActions($contribution); + + $relatedContributions[] = $contribution; + } + + if (count($relatedContributions) > 0) { + $this->assign('contributionsCount', count($relatedContributions)); + $this->assign('relatedContributions', json_encode($relatedContributions)); + } + } + + /** + * Inserts a string into the array with the html used to show the expanding + * payments control, which loads when user clicks on the amount. + * + * @param array $contribution + * Reference to the array holding the contribution's data and where the + * control will be inserted into + */ + private function insertAmountExpandingPaymentsControl(&$contribution) { + $amount = CRM_Utils_Money::format($contribution['total_amount'], $contribution['currency']); + + $expandPaymentsUrl = CRM_Utils_System::url('civicrm/payment', + array( + 'view' => 'transaction', + 'component' => 'contribution', + 'action' => 'browse', + 'cid' => $this->contactId, + 'id' => $contribution['contribution_id'], + 'selector' => 1, + ), + FALSE, NULL, TRUE + ); + + $contribution['amount_control'] = ' + +   ' . $amount . ' + + '; + } + + /** + * Fixes date fields present in the given contribution. + * + * @param array $contribution + * Reference to the array holding the contribution's data + */ + private function fixDateFormats(&$contribution) { + $config = CRM_Core_Config::singleton(); + + $contribution['formatted_receive_date'] = CRM_Utils_Date::customFormat($contribution['receive_date'], $config->dateformatDatetime); + $contribution['formatted_thankyou_date'] = CRM_Utils_Date::customFormat($contribution['thankyou_date'], $config->dateformatDatetime); + } + + /** + * Inserts a contribution_status_label key into the array, with the value + * showing the current status plus observations on the current status. + * + * @param array $contribution + * Reference to the array holding the contribution's data and where the new + * position will be inserted + */ + private function insertStatusLabels(&$contribution) { + $contribution['contribution_status_label'] = $contribution['contribution_status']; + + if ($contribution['is_pay_later'] && CRM_Utils_Array::value('contribution_status', $contribution) == 'Pending') { + $contribution['contribution_status_label'] .= ' (' . ts('Pay Later') . ')'; + } + elseif (CRM_Utils_Array::value('contribution_status', $contribution) == 'Pending') { + $contribution['contribution_status_label'] .= ' (' . ts('Incomplete Transaction') . ')'; + } + } + + /** + * Inserts into the given array a string with the 'action' key, holding the + * html to be used to show available actions for the contribution. + * + * @param $contribution + * Reference to the array holding the contribution's data. It is also the + * array where the new 'action' key will be inserted. + */ + private function insertContributionActions(&$contribution) { + $contribution['action'] = CRM_Core_Action::formLink( + $this->buildContributionLinks($contribution), + $this->getContributionPermissionsMask(), + array( + 'id' => $contribution['contribution_id'], + 'cid' => $contribution['contact_id'], + 'cxt' => 'contribution', + ), + ts('more'), + FALSE, + 'contribution.selector.row', + 'Contribution', + $contribution['contribution_id'] + ); + } + + /** + * Builds list of links for authorized actions that can be done on given + * contribution. + * + * @param array $contribution + * + * @return array + */ + private function buildContributionLinks($contribution) { + $links = CRM_Contribute_Selector_Search::links($contribution['contribution_id'], + CRM_Utils_Request::retrieve('action', 'String'), + NULL, + NULL + ); + + $isPayLater = FALSE; + if ($contribution['is_pay_later'] && CRM_Utils_Array::value('contribution_status', $contribution) == 'Pending') { + $isPayLater = TRUE; + + $links[CRM_Core_Action::ADD] = array( + 'name' => ts('Pay with Credit Card'), + 'url' => 'civicrm/contact/view/contribution', + 'qs' => 'reset=1&action=update&id=%%id%%&cid=%%cid%%&context=%%cxt%%&mode=live', + 'title' => ts('Pay with Credit Card'), + ); + } + + if (in_array($contribution['contribution_status'], array('Partially paid', 'Pending refund')) || $isPayLater) { + $buttonName = ts('Record Payment'); + + if ($contribution['contribution_status'] == 'Pending refund') { + $buttonName = ts('Record Refund'); + } + elseif (CRM_Core_Config::isEnabledBackOfficeCreditCardPayments()) { + $links[CRM_Core_Action::BASIC] = array( + 'name' => ts('Submit Credit Card payment'), + 'url' => 'civicrm/payment/add', + 'qs' => 'reset=1&id=%%id%%&cid=%%cid%%&action=add&component=contribution&mode=live', + 'title' => ts('Submit Credit Card payment'), + ); + } + $links[CRM_Core_Action::ADD] = array( + 'name' => $buttonName, + 'url' => 'civicrm/payment', + 'qs' => 'reset=1&id=%%id%%&cid=%%cid%%&action=add&component=contribution', + 'title' => $buttonName, + ); + } + + return $links; + } + + /** + * Builds a mask with allowed contribution related permissions. + * + * @return int + */ + private function getContributionPermissionsMask() { + $permissions = array(CRM_Core_Permission::VIEW); + if (CRM_Core_Permission::check('edit contributions')) { + $permissions[] = CRM_Core_Permission::EDIT; + } + if (CRM_Core_Permission::check('delete in CiviContribute')) { + $permissions[] = CRM_Core_Permission::DELETE; + } + + return CRM_Core_Action::mask($permissions); + } + +} diff --git a/CRM/Contribute/xml/Menu/Contribute.xml b/CRM/Contribute/xml/Menu/Contribute.xml index 66b318e5f3..3b3d94a7b3 100644 --- a/CRM/Contribute/xml/Menu/Contribute.xml +++ b/CRM/Contribute/xml/Menu/Contribute.xml @@ -323,4 +323,10 @@ CRM_Contribute_Page_AJAX::getSoftContributionRows access CiviCRM + + civicrm/contribute/contributionrecur-payments + Recurring Contribution's Payments + CRM_Contribute_Page_ContributionRecurPayments + access CiviContribute + diff --git a/templates/CRM/Contribute/Page/ContributionRecur.tpl b/templates/CRM/Contribute/Page/ContributionRecur.tpl index 3d4368acb9..767e62bff2 100644 --- a/templates/CRM/Contribute/Page/ContributionRecur.tpl +++ b/templates/CRM/Contribute/Page/ContributionRecur.tpl @@ -62,6 +62,31 @@
{ts}Done{/ts}
{/if} + + +
{/if} {if $recurRows} {strip} diff --git a/templates/CRM/Contribute/Page/ContributionRecurPayments.tpl b/templates/CRM/Contribute/Page/ContributionRecurPayments.tpl new file mode 100644 index 0000000000..566a466a42 --- /dev/null +++ b/templates/CRM/Contribute/Page/ContributionRecurPayments.tpl @@ -0,0 +1,42 @@ +{if $contributionsCount > 0} +
+
{ts}Related Contributions{/ts}
+
+ + + + + + + + + + + + +
{ts}Amount{/ts}{ts}Type{/ts}{ts}Source{/ts}{ts}Recieved{/ts}{ts}Thank-you Sent{/ts}{ts}Status{/ts} 
+ +
+
+{else} +
+
+ {ts}No contributions have been recorded for this recurring contribution.{/ts} +
+{/if} -- 2.25.1