Commit | Line | Data |
---|---|---|
6a488035 TO |
1 | <?php |
2 | /* | |
3 | +--------------------------------------------------------------------+ | |
39de6fd5 | 4 | | CiviCRM version 4.6 | |
6a488035 | 5 | +--------------------------------------------------------------------+ |
06b69b18 | 6 | | Copyright CiviCRM LLC (c) 2004-2014 | |
6a488035 TO |
7 | +--------------------------------------------------------------------+ |
8 | | This file is a part of CiviCRM. | | |
9 | | | | |
10 | | CiviCRM is free software; you can copy, modify, and distribute it | | |
11 | | under the terms of the GNU Affero General Public License | | |
12 | | Version 3, 19 November 2007 and the CiviCRM Licensing Exception. | | |
13 | | | | |
14 | | CiviCRM is distributed in the hope that it will be useful, but | | |
15 | | WITHOUT ANY WARRANTY; without even the implied warranty of | | |
16 | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | | |
17 | | See the GNU Affero General Public License for more details. | | |
18 | | | | |
19 | | You should have received a copy of the GNU Affero General Public | | |
20 | | License and the CiviCRM Licensing Exception along | | |
21 | | with this program; if not, contact CiviCRM LLC | | |
22 | | at info[AT]civicrm[DOT]org. If you have questions about the | | |
23 | | GNU Affero General Public License or the licensing of CiviCRM, | | |
24 | | see the CiviCRM license FAQ at http://civicrm.org/licensing | | |
25 | +--------------------------------------------------------------------+ | |
26 | */ | |
27 | ||
28 | /** | |
29 | * | |
30 | * @package CRM | |
06b69b18 | 31 | * @copyright CiviCRM LLC (c) 2004-2014 |
6a488035 TO |
32 | * $Id$ |
33 | * | |
34 | */ | |
35 | ||
36 | /** | |
37 | * This class generates form components generic to recurring contributions | |
38 | * | |
39 | * It delegates the work to lower level subclasses and integrates the changes | |
40 | * back in. It also uses a lot of functionality with the CRM API's, so any change | |
41 | * made here could potentially affect the API etc. Be careful, be aware, use unit tests. | |
42 | * | |
43 | */ | |
44 | class CRM_Contribute_Form_UpdateSubscription extends CRM_Core_Form { | |
45 | ||
46 | /** | |
47 | * The recurring contribution id, used when editing the recurring contribution | |
48 | * | |
49 | * @var int | |
50 | */ | |
51 | protected $_crid = NULL; | |
52 | ||
53 | protected $_coid = NULL; | |
54 | ||
55 | protected $_subscriptionDetails = NULL; | |
56 | ||
57 | protected $_selfService = FALSE; | |
58 | ||
59 | public $_paymentProcessor = NULL; | |
60 | ||
61 | public $_paymentProcessorObj = NULL; | |
62 | ||
63 | /** | |
100fef9d | 64 | * The id of the contact associated with this recurring contribution |
6a488035 TO |
65 | * |
66 | * @var int | |
6a488035 | 67 | */ |
430ae6dd TO |
68 | public $_contactID; |
69 | ||
00be9182 | 70 | public function preProcess() { |
6a488035 TO |
71 | |
72 | $this->_crid = CRM_Utils_Request::retrieve('crid', 'Integer', $this, FALSE); | |
73 | if ($this->_crid) { | |
74 | $this->_paymentProcessor = CRM_Financial_BAO_PaymentProcessor::getProcessorForEntity($this->_crid, 'recur', 'info'); | |
75 | $this->_paymentProcessorObj = CRM_Financial_BAO_PaymentProcessor::getProcessorForEntity($this->_crid, 'recur', 'obj'); | |
76 | $this->_subscriptionDetails = CRM_Contribute_BAO_ContributionRecur::getSubscriptionDetails($this->_crid); | |
77 | } | |
78 | ||
79 | $this->_coid = CRM_Utils_Request::retrieve('coid', 'Integer', $this, FALSE); | |
80 | if ($this->_coid) { | |
81 | $this->_paymentProcessor = CRM_Financial_BAO_PaymentProcessor::getProcessorForEntity($this->_coid, 'contribute', 'info'); | |
82 | $this->_paymentProcessorObj = CRM_Financial_BAO_PaymentProcessor::getProcessorForEntity($this->_coid, 'contribute', 'obj'); | |
83 | $this->_subscriptionDetails = CRM_Contribute_BAO_ContributionRecur::getSubscriptionDetails($this->_coid, 'contribution'); | |
84 | } | |
85 | ||
86 | if ((!$this->_crid && !$this->_coid) || | |
87 | ($this->_subscriptionDetails == CRM_Core_DAO::$_nullObject) | |
88 | ) { | |
89 | CRM_Core_Error::fatal('Required information missing.'); | |
90 | } | |
91 | ||
92 | if ($this->_subscriptionDetails->membership_id && $this->_subscriptionDetails->auto_renew) { | |
93 | CRM_Core_Error::fatal(ts('You cannot update the subscription.')); | |
94 | } | |
95 | ||
96 | if (!CRM_Core_Permission::check('edit contributions')) { | |
97 | $userChecksum = CRM_Utils_Request::retrieve('cs', 'String', $this, FALSE); | |
98 | if (!CRM_Contact_BAO_Contact_Utils::validChecksum($this->_subscriptionDetails->contact_id, $userChecksum)) { | |
99 | CRM_Core_Error::fatal(ts('You do not have permission to update subscription.')); | |
100 | } | |
101 | $this->_selfService = TRUE; | |
102 | } | |
103 | $this->assign('self_service', $this->_selfService); | |
104 | ||
105 | if (!$this->_paymentProcessorObj->isSupported('changeSubscriptionAmount')) { | |
106 | $userAlert = "<span class='font-red'>" . ts('Updates made using this form will change the recurring contribution information stored in your CiviCRM database, but will NOT be sent to the payment processor. You must enter the same changes using the payment processor web site.', | |
353ffa53 | 107 | array(1 => $this->_paymentProcessorObj->_processorName)) . '</span>'; |
6a488035 TO |
108 | CRM_Core_Session::setStatus($userAlert, ts('Warning'), 'alert'); |
109 | } | |
110 | ||
111 | $this->assign('isChangeSupported', $this->_paymentProcessorObj->isSupported('changeSubscriptionAmount')); | |
112 | $this->assign('paymentProcessor', $this->_paymentProcessor); | |
113 | $this->assign('frequency_unit', $this->_subscriptionDetails->frequency_unit); | |
114 | $this->assign('frequency_interval', $this->_subscriptionDetails->frequency_interval); | |
115 | ||
116 | if ($this->_subscriptionDetails->contact_id) { | |
117 | list($this->_donorDisplayName, $this->_donorEmail) = CRM_Contact_BAO_Contact::getContactDetails($this->_subscriptionDetails->contact_id); | |
118 | } | |
119 | ||
120 | CRM_Utils_System::setTitle(ts('Update Recurring Contribution')); | |
121 | ||
122 | // handle context redirection | |
123 | CRM_Contribute_BAO_ContributionRecur::setSubscriptionContext(); | |
124 | } | |
125 | ||
126 | /** | |
c490a46a | 127 | * Set default values for the form. Note that in edit/view mode |
6a488035 TO |
128 | * the default values are retrieved from the database |
129 | * | |
6a488035 | 130 | * |
355ba699 | 131 | * @return void |
6a488035 | 132 | */ |
00be9182 | 133 | public function setDefaultValues() { |
6a488035 TO |
134 | |
135 | $this->_defaults = array(); | |
136 | $this->_defaults['amount'] = $this->_subscriptionDetails->amount; | |
137 | $this->_defaults['installments'] = $this->_subscriptionDetails->installments; | |
138 | $this->_defaults['is_notify'] = 1; | |
139 | ||
140 | return $this->_defaults; | |
141 | } | |
142 | ||
143 | /** | |
100fef9d | 144 | * Actually build the components of the form |
6a488035 | 145 | * |
355ba699 | 146 | * @return void |
6a488035 TO |
147 | */ |
148 | public function buildQuickForm() { | |
149 | // define the fields | |
150 | $this->addMoney('amount', ts('Recurring Contribution Amount'), TRUE, | |
151 | array( | |
353ffa53 TO |
152 | 'size' => 20 |
153 | ), TRUE, | |
6a488035 TO |
154 | 'currency', NULL, TRUE |
155 | ); | |
156 | ||
157 | $this->add('text', 'installments', ts('Number of Installments'), array('size' => 20), TRUE); | |
158 | ||
159 | if ($this->_donorEmail) { | |
160 | $this->add('checkbox', 'is_notify', ts('Notify Contributor?')); | |
161 | } | |
162 | ||
163 | $type = 'next'; | |
481a74f4 | 164 | if ($this->_selfService) { |
6a488035 TO |
165 | $type = 'submit'; |
166 | } | |
167 | ||
168 | // define the buttons | |
169 | $this->addButtons(array( | |
170 | array( | |
171 | 'type' => $type, | |
172 | 'name' => ts('Save'), | |
173 | 'isDefault' => TRUE, | |
174 | ), | |
175 | array( | |
176 | 'type' => 'cancel', | |
177 | 'name' => ts('Cancel'), | |
178 | ), | |
179 | ) | |
180 | ); | |
181 | } | |
182 | ||
183 | /** | |
dc195289 | 184 | * called after the user submits the form |
6a488035 | 185 | * |
6a488035 | 186 | * |
355ba699 | 187 | * @return void |
6a488035 TO |
188 | */ |
189 | public function postProcess() { | |
190 | // store the submitted values in an array | |
191 | $params = $this->exportValues(); | |
192 | ||
193 | if ($this->_selfService && $this->_donorEmail) { | |
194 | // for self service force notify | |
195 | $params['is_notify'] = 1; | |
196 | } | |
197 | ||
198 | // if this is an update of an existing recurring contribution, pass the ID | |
199 | $params['id'] = $this->_subscriptionDetails->recur_id; | |
200 | $message = ''; | |
201 | ||
202 | $params['subscriptionId'] = $this->_subscriptionDetails->subscription_id; | |
4eeb9a5b | 203 | $updateSubscription = TRUE; |
6a488035 | 204 | if ($this->_paymentProcessorObj->isSupported('changeSubscriptionAmount')) { |
353ffa53 | 205 | $updateSubscription = $this->_paymentProcessorObj->changeSubscriptionAmount($message, $params); |
6a488035 TO |
206 | } |
207 | if (is_a($updateSubscription, 'CRM_Core_Error')) { | |
353ffa53 TO |
208 | CRM_Core_Error::displaySessionError($updateSubscription); |
209 | $status = ts('Could not update the Recurring contribution details'); | |
210 | $msgTitle = ts('Update Error'); | |
211 | $msgType = 'error'; | |
6a488035 TO |
212 | } |
213 | elseif ($updateSubscription) { | |
353ffa53 TO |
214 | // save the changes |
215 | $result = CRM_Contribute_BAO_ContributionRecur::add($params); | |
216 | $status = ts('Recurring contribution has been updated to: %1, every %2 %3(s) for %4 installments.', | |
217 | array( | |
218 | 1 => CRM_Utils_Money::format($params['amount'], $this->_subscriptionDetails->currency), | |
219 | 2 => $this->_subscriptionDetails->frequency_interval, | |
220 | 3 => $this->_subscriptionDetails->frequency_unit, | |
221 | 4 => $params['installments'], | |
222 | ) | |
223 | ); | |
224 | ||
225 | $msgTitle = ts('Update Success'); | |
226 | $msgType = 'success'; | |
227 | ||
228 | $contactID = $this->_subscriptionDetails->contact_id; | |
229 | ||
230 | if ($this->_subscriptionDetails->amount != $params['amount']) { | |
231 | $message .= "<br /> " . ts("Recurring contribution amount has been updated from %1 to %2 for this subscription.", | |
232 | array( | |
233 | 1 => CRM_Utils_Money::format($this->_subscriptionDetails->amount, $this->_subscriptionDetails->currency), | |
234 | 2 => CRM_Utils_Money::format($params['amount'], $this->_subscriptionDetails->currency), | |
235 | )) . ' '; | |
236 | } | |
6a488035 | 237 | |
353ffa53 TO |
238 | if ($this->_subscriptionDetails->installments != $params['installments']) { |
239 | $message .= "<br /> " . ts("Recurring contribution installments have been updated from %1 to %2 for this subscription.", array( | |
240 | 1 => $this->_subscriptionDetails->installments, | |
241 | 2 => $params['installments'] | |
242 | )) . ' '; | |
243 | } | |
6a488035 | 244 | |
353ffa53 TO |
245 | $activityParams = array( |
246 | 'source_contact_id' => $contactID, | |
247 | 'activity_type_id' => CRM_Core_OptionGroup::getValue('activity_type', | |
248 | 'Update Recurring Contribution', | |
249 | 'name' | |
250 | ), | |
251 | 'subject' => ts('Recurring Contribution Updated'), | |
252 | 'details' => $message, | |
253 | 'activity_date_time' => date('YmdHis'), | |
254 | 'status_id' => CRM_Core_OptionGroup::getValue('activity_status', | |
255 | 'Completed', | |
256 | 'name' | |
257 | ), | |
258 | ); | |
259 | $session = CRM_Core_Session::singleton(); | |
260 | $cid = $session->get('userID'); | |
6a488035 | 261 | |
353ffa53 TO |
262 | if ($cid) { |
263 | $activityParams['target_contact_id'][] = $activityParams['source_contact_id']; | |
264 | $activityParams['source_contact_id'] = $cid; | |
265 | } | |
266 | CRM_Activity_BAO_Activity::create($activityParams); | |
267 | ||
268 | if (!empty($params['is_notify'])) { | |
269 | // send notification | |
270 | if ($this->_subscriptionDetails->contribution_page_id) { | |
271 | CRM_Core_DAO::commonRetrieveAll('CRM_Contribute_DAO_ContributionPage', 'id', | |
272 | $this->_subscriptionDetails->contribution_page_id, $value, array( | |
273 | 'title', | |
274 | 'receipt_from_name', | |
275 | 'receipt_from_email', | |
276 | ) | |
6a488035 | 277 | ); |
353ffa53 TO |
278 | $receiptFrom = '"' . CRM_Utils_Array::value('receipt_from_name', $value[$this->_subscriptionDetails->contribution_page_id]) . '" <' . $value[$this->_subscriptionDetails->contribution_page_id]['receipt_from_email'] . '>'; |
279 | } | |
280 | else { | |
281 | $domainValues = CRM_Core_BAO_Domain::getNameAndEmail(); | |
282 | $receiptFrom = "$domainValues[0] <$domainValues[1]>"; | |
6a488035 | 283 | } |
353ffa53 TO |
284 | |
285 | list($donorDisplayName, $donorEmail) = CRM_Contact_BAO_Contact::getContactDetails($contactID); | |
286 | ||
287 | $tplParams = array( | |
288 | 'recur_frequency_interval' => $this->_subscriptionDetails->frequency_interval, | |
289 | 'recur_frequency_unit' => $this->_subscriptionDetails->frequency_unit, | |
290 | 'amount' => CRM_Utils_Money::format($params['amount']), | |
291 | 'installments' => $params['installments'], | |
292 | ); | |
293 | ||
294 | $tplParams['contact'] = array('display_name' => $donorDisplayName); | |
295 | $tplParams['receipt_from_email'] = $receiptFrom; | |
296 | ||
297 | $sendTemplateParams = array( | |
298 | 'groupName' => 'msg_tpl_workflow_contribution', | |
299 | 'valueName' => 'contribution_recurring_edit', | |
300 | 'contactId' => $contactID, | |
301 | 'tplParams' => $tplParams, | |
302 | 'isTest' => $this->_subscriptionDetails->is_test, | |
303 | 'PDFFilename' => 'receipt.pdf', | |
304 | 'from' => $receiptFrom, | |
305 | 'toName' => $donorDisplayName, | |
306 | 'toEmail' => $donorEmail, | |
307 | ); | |
308 | list($sent) = CRM_Core_BAO_MessageTemplate::sendTemplate($sendTemplateParams); | |
6a488035 | 309 | } |
353ffa53 | 310 | } |
6a488035 TO |
311 | |
312 | $session = CRM_Core_Session::singleton(); | |
353ffa53 | 313 | $userID = $session->get('userID'); |
481a74f4 | 314 | if ($userID && $status) { |
6a488035 | 315 | CRM_Core_Session::setStatus($status, $msgTitle, $msgType); |
0db6c3e1 | 316 | } |
4c9b6178 | 317 | elseif (!$userID) { |
6a488035 TO |
318 | if ($status) |
319 | CRM_Utils_System::setUFMessage($status); | |
320 | // keep result as 1, since we not displaying anything on the redirected page anyway | |
321 | return CRM_Utils_System::redirect(CRM_Utils_System::url('civicrm/contribute/subscriptionstatus', | |
353ffa53 | 322 | "reset=1&task=update&result=1")); |
6a488035 TO |
323 | } |
324 | } | |
325 | } |