Merge pull request #11407 from cividesk/CRM-21553
[civicrm-core.git] / CRM / Member / Page / RecurringContributions.php
CommitLineData
669fc25e
CR
1<?php\r
2\r
3/**\r
4 * Shows list of recurring contributions related to membership.\r
5 */\r
6class CRM_Member_Page_RecurringContributions extends CRM_Core_Page {\r
7\r
8 /**\r
9 * ID of the membership for which we need to see related recurring contributions.\r
10 *\r
11 * @var int\r
12 */\r
13 private $membershipID = NULL;\r
14\r
15 /**\r
16 * ID of the contact owner of the membership.\r
17 *\r
18 * @var int\r
19 */\r
20 public $contactID = NULL;\r
21\r
22 /**\r
23 * Builds list of recurring contributions associated to membership.\r
24 *\r
25 * @return null\r
26 */\r
27 public function run() {\r
28 $this->membershipID = CRM_Utils_Request::retrieve('membershipID', 'Positive', $this);\r
29 $this->contactID = CRM_Utils_Request::retrieve('cid', 'Positive', $this, TRUE);\r
30\r
31 $this->loadRecurringContributions();\r
32\r
33 return parent::run();\r
34 }\r
35\r
36 /**\r
37 * Loads recurring contributions and assigns them to the form, to be used on\r
38 * the template.\r
39 */\r
40 private function loadRecurringContributions() {\r
41 $recurringContributions = $this->getRecurContributions($this->membershipID);\r
42\r
43 if (!empty($recurringContributions)) {\r
44 $this->assign('recurRows', $recurringContributions);\r
45 $this->assign('recur', TRUE);\r
46 }\r
47 }\r
48\r
49 /**\r
50 * Obtains list of recurring contributions associated to a membership.\r
51 *\r
52 * @param int $membershipID\r
53 *\r
54 * @return array\r
55 */\r
56 private function getRecurContributions($membershipID) {\r
57 $result = civicrm_api3('MembershipPayment', 'get', array(\r
58 'sequential' => 1,\r
59 'contribution_id.contribution_recur_id.id' => ['IS NOT NULL' => TRUE],\r
60 'options' => ['limit' => 0],\r
61 'return' => array(\r
62 'contribution_id.contribution_recur_id.id',\r
63 'contribution_id.contribution_recur_id.contact_id',\r
64 'contribution_id.contribution_recur_id.start_date',\r
65 'contribution_id.contribution_recur_id.end_date',\r
66 'contribution_id.contribution_recur_id.next_sched_contribution_date',\r
67 'contribution_id.contribution_recur_id.amount',\r
68 'contribution_id.contribution_recur_id.currency',\r
69 'contribution_id.contribution_recur_id.frequency_unit',\r
70 'contribution_id.contribution_recur_id.frequency_interval',\r
71 'contribution_id.contribution_recur_id.installments',\r
72 'contribution_id.contribution_recur_id.contribution_status_id',\r
73 'contribution_id.contribution_recur_id.is_test',\r
74 'contribution_id.contribution_recur_id.payment_processor_id',\r
75 ),\r
76 'membership_id' => $membershipID,\r
77 ));\r
78 $recurringContributions = array();\r
79 $contributionStatuses = CRM_Contribute_PseudoConstant::contributionStatus();\r
80\r
81 foreach ($result['values'] as $payment) {\r
82 $recurringContributionID = $payment['contribution_id.contribution_recur_id.id'];\r
83 $alreadyProcessed = isset($recurringContributions[$recurringContributionID]);\r
84\r
85 if ($alreadyProcessed) {\r
86 continue;\r
87 }\r
88\r
89 foreach ($payment as $field => $value) {\r
90 $key = strtr($field, array('contribution_id.contribution_recur_id.' => ''));\r
91 $recurringContributions[$recurringContributionID][$key] = $value;\r
92 }\r
93\r
94 $contactID = $recurringContributions[$recurringContributionID]['contact_id'];\r
95 $contributionStatusID = $recurringContributions[$recurringContributionID]['contribution_status_id'];\r
96\r
97 $recurringContributions[$recurringContributionID]['id'] = $recurringContributionID;\r
98 $recurringContributions[$recurringContributionID]['contactId'] = $contactID;\r
99 $recurringContributions[$recurringContributionID]['contribution_status'] = CRM_Utils_Array::value($contributionStatusID, $contributionStatuses);\r
100\r
101 $this->setActionsForRecurringContribution($recurringContributionID, $recurringContributions[$recurringContributionID]);\r
102 }\r
103 return $recurringContributions;\r
104 }\r
105\r
106 /**\r
107 * Calculates and assigns the actions available for given recurring\r
108 * contribution.\r
109 *\r
110 * @param int $recurID\r
111 * @param array $recurringContribution\r
112 */\r
113 private function setActionsForRecurringContribution($recurID, &$recurringContribution) {\r
114 $action = array_sum(array_keys($this->recurLinks($recurID)));\r
115 // no action allowed if it's not active\r
116 $recurringContribution['is_active'] = ($recurringContribution['contribution_status_id'] != 3);\r
117 if ($recurringContribution['is_active']) {\r
118 $details = CRM_Contribute_BAO_ContributionRecur::getSubscriptionDetails($recurringContribution['id'], 'recur');\r
119 $hideUpdate = $details->membership_id & $details->auto_renew;\r
120 if ($hideUpdate || empty($details->processor_id)) {\r
121 $action -= CRM_Core_Action::UPDATE;\r
122 }\r
123 $recurringContribution['action'] = CRM_Core_Action::formLink(\r
124 $this->recurLinks($recurID),\r
125 $action,\r
126 array(\r
127 'cid' => $this->contactID,\r
128 'crid' => $recurID,\r
129 'cxt' => 'contribution',\r
130 ),\r
131 ts('more'),\r
132 FALSE,\r
133 'contribution.selector.recurring',\r
134 'Contribution',\r
135 $recurID\r
136 );\r
137 }\r
138 }\r
139\r
140 /**\r
141 * This method returns the links that are given for recur search row.\r
142 * currently the links added for each row are:\r
143 * - View\r
144 * - Edit\r
145 * - Cancel\r
146 *\r
147 * @param bool $id\r
148 *\r
149 * @return array\r
150 */\r
151 private function recurLinks($id) {\r
152 return CRM_Contribute_Page_Tab::recurLinks($id, 'contribution');\r
153 }\r
154\r
155}\r