Commit | Line | Data |
---|---|---|
bf6b9888 | 1 | <?php |
2 | ||
3 | /** | |
4 | * Shows list of recurring contributions related to membership. | |
5 | */ | |
6 | class CRM_Member_Page_RecurringContributions extends CRM_Core_Page { | |
7 | ||
8 | /** | |
9 | * ID of the membership for which we need to see related recurring contributions. | |
10 | * | |
11 | * @var int | |
12 | */ | |
13 | private $membershipID = NULL; | |
14 | ||
15 | /** | |
16 | * ID of the contact owner of the membership. | |
17 | * | |
18 | * @var int | |
19 | */ | |
20 | public $contactID = NULL; | |
21 | ||
22 | /** | |
23 | * Builds list of recurring contributions associated to membership. | |
24 | * | |
25 | * @return null | |
26 | */ | |
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); | |
30 | ||
31 | $this->loadRecurringContributions(); | |
32 | ||
33 | return parent::run(); | |
34 | } | |
35 | ||
36 | /** | |
37 | * Loads recurring contributions and assigns them to the form, to be used on | |
38 | * the template. | |
39 | */ | |
40 | private function loadRecurringContributions() { | |
41 | $recurringContributions = $this->getRecurContributions($this->membershipID); | |
42 | ||
43 | if (!empty($recurringContributions)) { | |
44 | $this->assign('recurRows', $recurringContributions); | |
45 | $this->assign('recur', TRUE); | |
46 | } | |
47 | } | |
48 | ||
49 | /** | |
50 | * Obtains list of recurring contributions associated to a membership. | |
51 | * | |
52 | * @param int $membershipID | |
53 | * | |
54 | * @return array | |
55 | */ | |
56 | private function getRecurContributions($membershipID) { | |
be2fb01f | 57 | $result = civicrm_api3('MembershipPayment', 'get', [ |
bf6b9888 | 58 | 'sequential' => 1, |
59 | 'contribution_id.contribution_recur_id.id' => ['IS NOT NULL' => TRUE], | |
60 | 'options' => ['limit' => 0], | |
be2fb01f | 61 | 'return' => [ |
bf6b9888 | 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', | |
be2fb01f | 75 | ], |
bf6b9888 | 76 | 'membership_id' => $membershipID, |
be2fb01f CW |
77 | ]); |
78 | $recurringContributions = []; | |
c3b82060 | 79 | $contributionStatuses = CRM_Contribute_PseudoConstant::contributionStatus(NULL, 'label'); |
bf6b9888 | 80 | |
81 | foreach ($result['values'] as $payment) { | |
82 | $recurringContributionID = $payment['contribution_id.contribution_recur_id.id']; | |
83 | $alreadyProcessed = isset($recurringContributions[$recurringContributionID]); | |
84 | ||
85 | if ($alreadyProcessed) { | |
86 | continue; | |
87 | } | |
88 | ||
89 | foreach ($payment as $field => $value) { | |
be2fb01f | 90 | $key = strtr($field, ['contribution_id.contribution_recur_id.' => '']); |
bf6b9888 | 91 | $recurringContributions[$recurringContributionID][$key] = $value; |
92 | } | |
93 | ||
94 | $contactID = $recurringContributions[$recurringContributionID]['contact_id']; | |
95 | $contributionStatusID = $recurringContributions[$recurringContributionID]['contribution_status_id']; | |
96 | ||
97 | $recurringContributions[$recurringContributionID]['id'] = $recurringContributionID; | |
98 | $recurringContributions[$recurringContributionID]['contactId'] = $contactID; | |
9c1bc317 | 99 | $recurringContributions[$recurringContributionID]['contribution_status'] = $contributionStatuses[$contributionStatusID] ?? NULL; |
bf6b9888 | 100 | |
101 | $this->setActionsForRecurringContribution($recurringContributionID, $recurringContributions[$recurringContributionID]); | |
102 | } | |
103 | return $recurringContributions; | |
104 | } | |
105 | ||
106 | /** | |
107 | * Calculates and assigns the actions available for given recurring | |
108 | * contribution. | |
109 | * | |
110 | * @param int $recurID | |
111 | * @param array $recurringContribution | |
112 | */ | |
113 | private function setActionsForRecurringContribution($recurID, &$recurringContribution) { | |
3d554b59 | 114 | $action = array_sum(array_keys(CRM_Contribute_Page_Tab::recurLinks($recurID, 'contribution'))); |
d0421258 | 115 | |
bf6b9888 | 116 | // no action allowed if it's not active |
117 | $recurringContribution['is_active'] = ($recurringContribution['contribution_status_id'] != 3); | |
d0421258 | 118 | |
bf6b9888 | 119 | if ($recurringContribution['is_active']) { |
120 | $details = CRM_Contribute_BAO_ContributionRecur::getSubscriptionDetails($recurringContribution['id'], 'recur'); | |
121 | $hideUpdate = $details->membership_id & $details->auto_renew; | |
d0421258 CR |
122 | |
123 | if ($hideUpdate) { | |
bf6b9888 | 124 | $action -= CRM_Core_Action::UPDATE; |
125 | } | |
d0421258 | 126 | |
bf6b9888 | 127 | $recurringContribution['action'] = CRM_Core_Action::formLink( |
3d554b59 | 128 | CRM_Contribute_Page_Tab::recurLinks($recurID, 'contribution'), |
bf6b9888 | 129 | $action, |
be2fb01f | 130 | [ |
bf6b9888 | 131 | 'cid' => $this->contactID, |
132 | 'crid' => $recurID, | |
133 | 'cxt' => 'contribution', | |
be2fb01f | 134 | ], |
bf6b9888 | 135 | ts('more'), |
136 | FALSE, | |
137 | 'contribution.selector.recurring', | |
138 | 'Contribution', | |
139 | $recurID | |
140 | ); | |
141 | } | |
142 | } | |
143 | ||
bf6b9888 | 144 | } |