Merge pull request #6030 from monishdeb/4.6
[civicrm-core.git] / CRM / Contribute / Form / UpdateSubscription.php
CommitLineData
6a488035
TO
1<?php
2/*
3 +--------------------------------------------------------------------+
39de6fd5 4 | CiviCRM version 4.6 |
6a488035 5 +--------------------------------------------------------------------+
e7112fa7 6 | Copyright CiviCRM LLC (c) 2004-2015 |
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 +--------------------------------------------------------------------+
d25dd0ee 26 */
6a488035
TO
27
28/**
29 *
30 * @package CRM
e7112fa7 31 * @copyright CiviCRM LLC (c) 2004-2015
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 */
44class 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 /**
fe482240 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 /**
fe482240 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(
317fceb4 152 'size' => 20,
353ffa53 153 ), TRUE,
557b257d 154 'currency', $this->_subscriptionDetails->currency, TRUE
6a488035
TO
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 /**
fe482240 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,
317fceb4 241 2 => $params['installments'],
353ffa53
TO
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) {
317fceb4 318 if ($status) {
6a488035 319 CRM_Utils_System::setUFMessage($status);
317fceb4 320 }
6a488035
TO
321 // keep result as 1, since we not displaying anything on the redirected page anyway
322 return CRM_Utils_System::redirect(CRM_Utils_System::url('civicrm/contribute/subscriptionstatus',
353ffa53 323 "reset=1&task=update&result=1"));
6a488035
TO
324 }
325 }
96025800 326
6a488035 327}