4 * Shows list of recurring contributions related to membership.
6 class CRM_Member_Page_RecurringContributions
extends CRM_Core_Page
{
9 * ID of the membership for which we need to see related recurring contributions.
13 private $membershipID = NULL;
16 * ID of the contact owner of the membership.
20 public $contactID = NULL;
23 * Builds list of recurring contributions associated to membership.
27 public function run() {
28 $this->membershipID
= CRM_Utils_Request
::retrieve('membershipID', 'Positive', $this);
29 $this->contactID
= CRM_Utils_Request
::retrieve('cid', 'Positive', $this, TRUE);
31 $this->loadRecurringContributions();
37 * Loads recurring contributions and assigns them to the form, to be used on
40 private function loadRecurringContributions() {
41 $recurringContributions = $this->getRecurContributions($this->membershipID
);
43 if (!empty($recurringContributions)) {
44 $this->assign('recurRows', $recurringContributions);
45 $this->assign('recur', TRUE);
50 * Obtains list of recurring contributions associated to a membership.
52 * @param int $membershipID
56 private function getRecurContributions($membershipID) {
57 $result = civicrm_api3('MembershipPayment', 'get', [
59 'contribution_id.contribution_recur_id.id' => ['IS NOT NULL' => TRUE],
60 'options' => ['limit' => 0],
62 'contribution_id.contribution_recur_id.id',
63 'contribution_id.contribution_recur_id.contact_id',
64 'contribution_id.contribution_recur_id.start_date',
65 'contribution_id.contribution_recur_id.end_date',
66 'contribution_id.contribution_recur_id.next_sched_contribution_date',
67 'contribution_id.contribution_recur_id.amount',
68 'contribution_id.contribution_recur_id.currency',
69 'contribution_id.contribution_recur_id.frequency_unit',
70 'contribution_id.contribution_recur_id.frequency_interval',
71 'contribution_id.contribution_recur_id.installments',
72 'contribution_id.contribution_recur_id.contribution_status_id',
73 'contribution_id.contribution_recur_id.is_test',
74 'contribution_id.contribution_recur_id.payment_processor_id',
76 'membership_id' => $membershipID,
78 $recurringContributions = [];
79 $contributionStatuses = CRM_Contribute_PseudoConstant
::contributionStatus(NULL, 'label');
81 foreach ($result['values'] as $payment) {
82 $recurringContributionID = $payment['contribution_id.contribution_recur_id.id'];
83 $alreadyProcessed = isset($recurringContributions[$recurringContributionID]);
85 if ($alreadyProcessed) {
89 foreach ($payment as $field => $value) {
90 $key = strtr($field, ['contribution_id.contribution_recur_id.' => '']);
91 $recurringContributions[$recurringContributionID][$key] = $value;
94 $contactID = $recurringContributions[$recurringContributionID]['contact_id'];
95 $contributionStatusID = $recurringContributions[$recurringContributionID]['contribution_status_id'];
97 $recurringContributions[$recurringContributionID]['id'] = $recurringContributionID;
98 $recurringContributions[$recurringContributionID]['contactId'] = $contactID;
99 $recurringContributions[$recurringContributionID]['contribution_status'] = $contributionStatuses[$contributionStatusID] ??
NULL;
101 $this->setActionsForRecurringContribution($recurringContributionID, $recurringContributions[$recurringContributionID]);
103 return $recurringContributions;
107 * Calculates and assigns the actions available for given recurring
110 * @param int $recurID
111 * @param array $recurringContribution
113 private function setActionsForRecurringContribution($recurID, &$recurringContribution) {
114 $action = array_sum(array_keys(CRM_Contribute_Page_Tab
::recurLinks($recurID, 'contribution')));
116 // no action allowed if it's not active
117 $recurringContribution['is_active'] = ($recurringContribution['contribution_status_id'] != 3);
119 if ($recurringContribution['is_active']) {
120 $details = CRM_Contribute_BAO_ContributionRecur
::getSubscriptionDetails($recurringContribution['id'], 'recur');
121 $hideUpdate = $details->membership_id
& $details->auto_renew
;
124 $action -= CRM_Core_Action
::UPDATE
;
127 $recurringContribution['action'] = CRM_Core_Action
::formLink(
128 CRM_Contribute_Page_Tab
::recurLinks($recurID, 'contribution'),
131 'cid' => $this->contactID
,
133 'cxt' => 'contribution',
137 'contribution.selector.recurring',