_crid = CRM_Utils_Request::retrieve('crid', 'Integer', $this, FALSE); if ($this->_crid) { $this->_paymentProcessor = CRM_Financial_BAO_PaymentProcessor::getProcessorForEntity($this->_crid, 'recur', 'info'); $this->_paymentProcessorObj = CRM_Financial_BAO_PaymentProcessor::getProcessorForEntity($this->_crid, 'recur', 'obj'); $this->_subscriptionDetails = CRM_Contribute_BAO_ContributionRecur::getSubscriptionDetails($this->_crid); } $this->_coid = CRM_Utils_Request::retrieve('coid', 'Integer', $this, FALSE); if ($this->_coid) { $this->_paymentProcessor = CRM_Financial_BAO_PaymentProcessor::getProcessorForEntity($this->_coid, 'contribute', 'info'); $this->_paymentProcessorObj = CRM_Financial_BAO_PaymentProcessor::getProcessorForEntity($this->_coid, 'contribute', 'obj'); $this->_subscriptionDetails = CRM_Contribute_BAO_ContributionRecur::getSubscriptionDetails($this->_coid, 'contribution'); } elseif ($this->_crid) { $this->_coid = CRM_Core_DAO::getFieldValue('CRM_Contribute_DAO_Contribution', $this->_crid, 'id', 'contribution_recur_id'); } if ((!$this->_crid && !$this->_coid) || ($this->_subscriptionDetails == CRM_Core_DAO::$_nullObject) ) { CRM_Core_Error::fatal('Required information missing.'); } if ($this->_subscriptionDetails->membership_id && $this->_subscriptionDetails->auto_renew) { CRM_Core_Error::fatal(ts('You cannot update the subscription.')); } if (!CRM_Core_Permission::check('edit contributions')) { $userChecksum = CRM_Utils_Request::retrieve('cs', 'String', $this, FALSE); if (!CRM_Contact_BAO_Contact_Utils::validChecksum($this->_subscriptionDetails->contact_id, $userChecksum)) { CRM_Core_Error::fatal(ts('You do not have permission to update subscription.')); } $this->_selfService = TRUE; } $this->assign('self_service', $this->_selfService); if (!$this->_paymentProcessorObj->isSupported('changeSubscriptionAmount')) { $userAlert = 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.'); CRM_Core_Session::setStatus($userAlert, ts('Warning'), 'alert'); } $this->assign('isChangeSupported', $this->_paymentProcessorObj->isSupported('changeSubscriptionAmount')); $this->assign('paymentProcessor', $this->_paymentProcessor); $this->assign('frequency_unit', $this->_subscriptionDetails->frequency_unit); $this->assign('frequency_interval', $this->_subscriptionDetails->frequency_interval); if ($this->_subscriptionDetails->contact_id) { list($this->_donorDisplayName, $this->_donorEmail) = CRM_Contact_BAO_Contact::getContactDetails($this->_subscriptionDetails->contact_id); } CRM_Utils_System::setTitle(ts('Update Recurring Contribution')); // handle context redirection CRM_Contribute_BAO_ContributionRecur::setSubscriptionContext(); } /** * Set default values for the form. Note that in edit/view mode * the default values are retrieved from the database * * * @return void */ public function setDefaultValues() { $this->_defaults = array(); $this->_defaults['amount'] = $this->_subscriptionDetails->amount; $this->_defaults['installments'] = $this->_subscriptionDetails->installments; $this->_defaults['is_notify'] = 1; return $this->_defaults; } /** * Actually build the components of the form. * * @return void */ public function buildQuickForm() { // CRM-16398: If current recurring contribution got > 1 lineitems then make amount field readonly $amtAttr = array('size' => 20); $lineItems = CRM_Price_BAO_LineItem::getLineItemsByContributionID($this->_coid); if (count($lineItems) > 1) { $amtAttr += array('readonly' => TRUE); } $this->addMoney('amount', ts('Recurring Contribution Amount'), TRUE, $amtAttr, TRUE, 'currency', $this->_subscriptionDetails->currency, TRUE ); $this->add('text', 'installments', ts('Number of Installments'), array('size' => 20), TRUE); if ($this->_donorEmail) { $this->add('checkbox', 'is_notify', ts('Notify Contributor?')); } $type = 'next'; if ($this->_selfService) { $type = 'submit'; } // define the buttons $this->addButtons(array( array( 'type' => $type, 'name' => ts('Save'), 'isDefault' => TRUE, ), array( 'type' => 'cancel', 'name' => ts('Cancel'), ), ) ); } /** * called after the user submits the form. * * * @return void */ public function postProcess() { // store the submitted values in an array $params = $this->exportValues(); if ($this->_selfService && $this->_donorEmail) { // for self service force notify $params['is_notify'] = 1; } // if this is an update of an existing recurring contribution, pass the ID $params['id'] = $this->_subscriptionDetails->recur_id; $message = ''; $params['subscriptionId'] = $this->_subscriptionDetails->subscription_id; $updateSubscription = TRUE; if ($this->_paymentProcessorObj->isSupported('changeSubscriptionAmount')) { $updateSubscription = $this->_paymentProcessorObj->changeSubscriptionAmount($message, $params); } if (is_a($updateSubscription, 'CRM_Core_Error')) { CRM_Core_Error::displaySessionError($updateSubscription); $status = ts('Could not update the Recurring contribution details'); $msgTitle = ts('Update Error'); $msgType = 'error'; } elseif ($updateSubscription) { // save the changes $result = CRM_Contribute_BAO_ContributionRecur::add($params); $status = ts('Recurring contribution has been updated to: %1, every %2 %3(s) for %4 installments.', array( 1 => CRM_Utils_Money::format($params['amount'], $this->_subscriptionDetails->currency), 2 => $this->_subscriptionDetails->frequency_interval, 3 => $this->_subscriptionDetails->frequency_unit, 4 => $params['installments'], ) ); $msgTitle = ts('Update Success'); $msgType = 'success'; $msg = ts('Recurring Contribution Updated'); $contactID = $this->_subscriptionDetails->contact_id; if ($this->_subscriptionDetails->amount != $params['amount']) { $message .= "
" . ts("Recurring contribution amount has been updated from %1 to %2 for this subscription.", array( 1 => CRM_Utils_Money::format($this->_subscriptionDetails->amount, $this->_subscriptionDetails->currency), 2 => CRM_Utils_Money::format($params['amount'], $this->_subscriptionDetails->currency), )) . ' '; if ($this->_subscriptionDetails->amount < $params['amount']) { $msg = ts('Recurring Contribution Updated - increased installment amount'); } else { $msg = ts('Recurring Contribution Updated - decreased installment amount'); } } if ($this->_subscriptionDetails->installments != $params['installments']) { $message .= "
" . ts("Recurring contribution installments have been updated from %1 to %2 for this subscription.", array( 1 => $this->_subscriptionDetails->installments, 2 => $params['installments'], )) . ' '; } $activityParams = array( 'source_contact_id' => $contactID, 'activity_type_id' => CRM_Core_OptionGroup::getValue('activity_type', 'Update Recurring Contribution', 'name' ), 'subject' => $msg, 'details' => $message, 'activity_date_time' => date('YmdHis'), 'status_id' => CRM_Core_OptionGroup::getValue('activity_status', 'Completed', 'name' ), ); $session = CRM_Core_Session::singleton(); $cid = $session->get('userID'); if ($cid) { $activityParams['target_contact_id'][] = $activityParams['source_contact_id']; $activityParams['source_contact_id'] = $cid; } CRM_Activity_BAO_Activity::create($activityParams); if (!empty($params['is_notify'])) { // send notification if ($this->_subscriptionDetails->contribution_page_id) { CRM_Core_DAO::commonRetrieveAll('CRM_Contribute_DAO_ContributionPage', 'id', $this->_subscriptionDetails->contribution_page_id, $value, array( 'title', 'receipt_from_name', 'receipt_from_email', ) ); $receiptFrom = '"' . CRM_Utils_Array::value('receipt_from_name', $value[$this->_subscriptionDetails->contribution_page_id]) . '" <' . $value[$this->_subscriptionDetails->contribution_page_id]['receipt_from_email'] . '>'; } else { $domainValues = CRM_Core_BAO_Domain::getNameAndEmail(); $receiptFrom = "$domainValues[0] <$domainValues[1]>"; } list($donorDisplayName, $donorEmail) = CRM_Contact_BAO_Contact::getContactDetails($contactID); $tplParams = array( 'recur_frequency_interval' => $this->_subscriptionDetails->frequency_interval, 'recur_frequency_unit' => $this->_subscriptionDetails->frequency_unit, 'amount' => CRM_Utils_Money::format($params['amount']), 'installments' => $params['installments'], ); $tplParams['contact'] = array('display_name' => $donorDisplayName); $tplParams['receipt_from_email'] = $receiptFrom; $sendTemplateParams = array( 'groupName' => 'msg_tpl_workflow_contribution', 'valueName' => 'contribution_recurring_edit', 'contactId' => $contactID, 'tplParams' => $tplParams, 'isTest' => $this->_subscriptionDetails->is_test, 'PDFFilename' => 'receipt.pdf', 'from' => $receiptFrom, 'toName' => $donorDisplayName, 'toEmail' => $donorEmail, ); list($sent) = CRM_Core_BAO_MessageTemplate::sendTemplate($sendTemplateParams); } } $session = CRM_Core_Session::singleton(); $userID = $session->get('userID'); if ($userID && $status) { CRM_Core_Session::setStatus($status, $msgTitle, $msgType); } elseif (!$userID) { if ($status) { CRM_Utils_System::setUFMessage($status); } // keep result as 1, since we not displaying anything on the redirected page anyway return CRM_Utils_System::redirect(CRM_Utils_System::url('civicrm/contribute/subscriptionstatus', "reset=1&task=update&result=1")); } } }