3 +--------------------------------------------------------------------+
4 | CiviCRM version 4.3 |
5 +--------------------------------------------------------------------+
6 | Copyright CiviCRM LLC (c) 2004-2013 |
7 +--------------------------------------------------------------------+
8 | This file is a part of CiviCRM. |
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. |
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. |
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 +--------------------------------------------------------------------+
31 * @copyright CiviCRM LLC (c) 2004-2013
37 * This class generates form components for processing a ontribution
40 class CRM_Contribute_Form_ContributionBase
extends CRM_Core_Form
{
43 * the id of the contribution page that we are proceessing
51 * the mode that we are in
59 * the contact id related to a membership
64 public $_membershipContactID;
67 * the values for the contribution db object
75 * the paymentProcessor attributes for this page
80 public $_paymentProcessor;
81 public $_paymentObject = NULL;
84 * The membership block for this page
89 public $_membershipBlock = NULL;
92 * the default values for the form
100 * The params submitted by the form and computed by the app
108 * The fields involved in this contribution page
116 * The billing location id for this contribiution page
124 * Cache the amount to make things easier
158 * the Membership ID for membership renewal
163 public $_membershipId;
166 * Price Set ID, if the new price set method is used
174 * Array of fields for the price set
184 * Function to set variables up before form is built
189 public function preProcess() {
190 $config = CRM_Core_Config
::singleton();
191 $session = CRM_Core_Session
::singleton();
193 // current contribution page id
194 $this->_id
= CRM_Utils_Request
::retrieve('id', 'Positive', $this);
196 $pastContributionID = $session->get('pastContributionID');
197 if (!$pastContributionID) {
198 CRM_Core_Error
::fatal(ts('We can\'t load the requested web page due to an incomplete link. This can be caused by using your browser\'s Back button or by using an incomplete or invalid link.'));
201 CRM_Core_Error
::fatal(ts('An error occurred during form submission. This page requires form data to be submitted for processing and no form data was submitted or processed. We are sorry for any inconvience. Please click <a href=\'%1\'>here</a> to visit the contribution page and re-start the contribution process.', array(1 => CRM_Utils_System
::url('civicrm/contribute/transact', 'reset=1&id=' . $pastContributionID))));
205 $session->set('pastContributionID', $this->_id
);
208 $this->_userID
= $session->get('userID');
210 if ($this->_userID
) {
211 $this->_mid
= CRM_Utils_Request
::retrieve('mid', 'Positive', $this);
213 $membership = new CRM_Member_DAO_Membership();
214 $membership->id
= $this->_mid
;
216 if ($membership->find(TRUE)) {
217 $this->_defaultMemTypeId
= $membership->membership_type_id
;
218 if ($membership->contact_id
!= $this->_userID
) {
219 $employers = CRM_Contact_BAO_Relationship
::getPermissionedEmployer($this->_userID
);
220 if (array_key_exists($membership->contact_id
, $employers)) {
221 $this->_membershipContactID
= $membership->contact_id
;
222 $this->assign('membershipContactID', $this->_membershipContactID
);
223 $this->assign('membershipContactName', $employers[$this->_membershipContactID
]['name']);
226 CRM_Core_Session
::setStatus(ts("Oops. The membership you're trying to renew appears to be invalid. Contact your site administrator if you need assistance. If you continue, you will be issued a new membership."), ts('Membership Invalid'), 'alert');
231 CRM_Core_Session
::setStatus(ts("Oops. The membership you're trying to renew appears to be invalid. Contact your site administrator if you need assistance. If you continue, you will be issued a new membership."), ts('Membership Invalid'), 'alert');
237 // we do not want to display recently viewed items, so turn off
238 $this->assign('displayRecent', FALSE);
239 // Contribution page values are cleared from session, so can't use normal Printer Friendly view.
240 // Use Browser Print instead.
241 $this->assign('browserPrint', TRUE);
244 $this->_action
= CRM_Utils_Request
::retrieve('action', 'String', $this, FALSE, 'add');
245 $this->assign('action', $this->_action
);
248 $this->_mode
= ($this->_action
== 1024) ?
'test' : 'live';
250 $this->_values
= $this->get('values');
251 $this->_fields
= $this->get('fields');
252 $this->_bltID
= $this->get('bltID');
253 $this->_paymentProcessor
= $this->get('paymentProcessor');
254 $this->_priceSetId
= $this->get('priceSetId');
255 $this->_priceSet
= $this->get('priceSet');
257 if (!$this->_values
) {
258 // get all the values from the dao object
259 $this->_values
= array();
260 $this->_fields
= array();
262 CRM_Contribute_BAO_ContributionPage
::setValues($this->_id
, $this->_values
);
264 // check if form is active
265 if (!CRM_Utils_Array
::value('is_active', $this->_values
)) {
266 // form is inactive, die a fatal death
267 CRM_Core_Error
::fatal(ts('The page you requested is currently unavailable.'));
270 // also check for billing informatin
271 // get the billing location type
272 $locationTypes = CRM_Core_PseudoConstant
::locationType();
273 // CRM-8108 remove ts around Billing location type
274 //$this->_bltID = array_search( ts('Billing'), $locationTypes );
275 $this->_bltID
= array_search('Billing', $locationTypes);
276 if (!$this->_bltID
) {
277 CRM_Core_Error
::fatal(ts('Please set a location type of %1', array(1 => 'Billing')));
279 $this->set('bltID', $this->_bltID
);
281 // check for is_monetary status
282 $isMonetary = CRM_Utils_Array
::value('is_monetary', $this->_values
);
283 $isPayLater = CRM_Utils_Array
::value('is_pay_later', $this->_values
);
285 //FIXME: to support multiple payment processors
287 (!$isPayLater || CRM_Utils_Array
::value('payment_processor', $this->_values
))
289 $ppID = CRM_Utils_Array
::value('payment_processor', $this->_values
);
291 CRM_Core_Error
::fatal(ts('A payment processor must be selected for this contribution page (contact the site administrator for assistance).'));
294 $ppIds = explode(CRM_Core_DAO
::VALUE_SEPARATOR
, $ppID);
295 $this->_paymentProcessors
= CRM_Financial_BAO_PaymentProcessor
::getPayments($ppIds, $this->_mode
);
297 $this->set('paymentProcessors', $this->_paymentProcessors
);
299 //set default payment processor
300 if (!empty($this->_paymentProcessors
) && empty($this->_paymentProcessor
)) {
301 foreach ($this->_paymentProcessors
as $ppId => $values) {
302 if ($values['is_default'] == 1 ||
(count($this->_paymentProcessors
) == 1)) {
303 $defaultProcessorId = $ppId;
309 if (isset($defaultProcessorId)) {
310 $this->_paymentProcessor
= CRM_Financial_BAO_PaymentProcessor
::getPayment($defaultProcessorId, $this->_mode
);
311 $this->assign_by_ref('paymentProcessor', $this->_paymentProcessor
);
314 if (!CRM_Utils_System
::isNull($this->_paymentProcessors
)) {
315 foreach ($this->_paymentProcessors
as $eachPaymentProcessor) {
316 // check selected payment processor is active
317 if (empty($eachPaymentProcessor)) {
318 CRM_Core_Error
::fatal(ts('A payment processor configured for this page might be disabled (contact the site administrator for assistance).'));
321 // ensure that processor has a valid config
322 $this->_paymentObject
= &CRM_Core_Payment
::singleton($this->_mode
, $eachPaymentProcessor, $this);
323 $error = $this->_paymentObject
->checkConfig();
324 if (!empty($error)) {
325 CRM_Core_Error
::fatal($error);
333 CRM_Price_BAO_Set
::initSet($this, $this->_id
, 'civicrm_contribution_page');
335 // this avoids getting E_NOTICE errors in php
336 $setNullFields = array(
337 'amount_block_is_active',
338 'honor_block_is_active',
339 'is_allow_other_amount',
342 foreach ($setNullFields as $f) {
343 if (!isset($this->_values
[$f])) {
344 $this->_values
[$f] = NULL;
348 //check if Membership Block is enabled, if Membership Fields are included in profile
349 //get membership section for this contribution page
350 $this->_membershipBlock
= CRM_Member_BAO_Membership
::getMembershipBlock($this->_id
);
351 $this->set('membershipBlock', $this->_membershipBlock
);
353 if ($this->_values
['custom_pre_id']) {
354 $preProfileType = CRM_Core_BAO_UFField
::getProfileType($this->_values
['custom_pre_id']);
357 if ($this->_values
['custom_post_id']) {
358 $postProfileType = CRM_Core_BAO_UFField
::getProfileType($this->_values
['custom_post_id']);
361 if (((isset($postProfileType) && $postProfileType == 'Membership') ||
362 (isset($preProfileType) && $preProfileType == 'Membership')
364 !$this->_membershipBlock
['is_active']
366 CRM_Core_Error
::fatal(ts('This page includes a Profile with Membership fields - but the Membership Block is NOT enabled. Please notify the site administrator.'));
369 $pledgeBlock = CRM_Pledge_BAO_PledgeBlock
::getPledgeBlock($this->_id
);
372 $this->_values
['pledge_block_id'] = CRM_Utils_Array
::value('id', $pledgeBlock);
373 $this->_values
['max_reminders'] = CRM_Utils_Array
::value('max_reminders', $pledgeBlock);
374 $this->_values
['initial_reminder_day'] = CRM_Utils_Array
::value('initial_reminder_day', $pledgeBlock);
375 $this->_values
['additional_reminder_day'] = CRM_Utils_Array
::value('additional_reminder_day', $pledgeBlock);
377 //set pledge id in values
378 $pledgeId = CRM_Utils_Request
::retrieve('pledgeId', 'Positive', $this);
380 //authenticate pledge user for pledge payment.
382 $this->_values
['pledge_id'] = $pledgeId;
384 //lets override w/ pledge campaign.
385 $this->_values
['campaign_id'] = CRM_Core_DAO
::getFieldValue('CRM_Pledge_DAO_Pledge',
389 self
::authenticatePledgeUser();
392 $this->set('values', $this->_values
);
393 $this->set('fields', $this->_fields
);
397 $pcpId = CRM_Utils_Request
::retrieve('pcpId', 'Positive', $this);
399 $pcp = CRM_PCP_BAO_PCP
::handlePcp($pcpId, 'contribute', $this->_values
);
400 $this->_pcpId
= $pcp['pcpId'];
401 $this->_pcpBlock
= $pcp['pcpBlock'];
402 $this->_pcpInfo
= $pcp['pcpInfo'];
405 // Link (button) for users to create their own Personal Campaign page
406 if ($linkText = CRM_PCP_BAO_PCP
::getPcpBlockStatus($this->_id
, 'contribute')) {
407 $linkTextUrl = CRM_Utils_System
::url('civicrm/contribute/campaign',
408 "action=add&reset=1&pageId={$this->_id}&component=contribute",
411 $this->assign('linkTextUrl', $linkTextUrl);
412 $this->assign('linkText', $linkText);
415 //set pledge block if block id is set
416 if (CRM_Utils_Array
::value('pledge_block_id', $this->_values
)) {
417 $this->assign('pledgeBlock', TRUE);
420 // check if one of the (amount , membership) bloks is active or not
421 $this->_membershipBlock
= $this->get('membershipBlock');
423 if (!$this->_values
['amount_block_is_active'] &&
424 !$this->_membershipBlock
['is_active'] &&
427 CRM_Core_Error
::fatal(ts('The requested online contribution page is missing a required Contribution Amount section or Membership section or Price Set. Please check with the site administrator for assistance.'));
430 if ($this->_values
['amount_block_is_active']) {
431 $this->set('amount_block_is_active', $this->_values
['amount_block_is_active']);
434 $this->_contributeMode
= $this->get('contributeMode');
435 $this->assign('contributeMode', $this->_contributeMode
);
437 //assigning is_monetary and is_email_receipt to template
438 $this->assign('is_monetary', $this->_values
['is_monetary']);
439 $this->assign('is_email_receipt', $this->_values
['is_email_receipt']);
440 $this->assign('bltID', $this->_bltID
);
442 //assign cancelSubscription URL to templates
443 $this->assign('cancelSubscriptionUrl',
444 CRM_Utils_Array
::value('cancelSubscriptionUrl', $this->_values
)
447 // assigning title to template in case someone wants to use it, also setting CMS page title
449 $this->assign('title', $this->_pcpInfo
['title']);
450 CRM_Utils_System
::setTitle($this->_pcpInfo
['title']);
453 $this->assign('title', $this->_values
['title']);
454 CRM_Utils_System
::setTitle($this->_values
['title']);
456 $this->_defaults
= array();
458 $this->_amount
= $this->get('amount');
461 $config = CRM_Core_Config
::singleton();
462 $config->defaultCurrency
= CRM_Utils_Array
::value('currency',
464 $config->defaultCurrency
467 //lets allow user to override campaign.
468 $campID = CRM_Utils_Request
::retrieve('campID', 'Positive', $this);
469 if ($campID && CRM_Core_DAO
::getFieldValue('CRM_Campaign_DAO_Campaign', $campID)) {
470 $this->_values
['campaign_id'] = $campID;
473 //do check for cancel recurring and clean db, CRM-7696
474 if (CRM_Utils_Request
::retrieve('cancel', 'Boolean', CRM_Core_DAO
::$_nullObject)) {
475 self
::cancelRecurring();
480 * set the default values
485 function setDefaultValues() {
486 return $this->_defaults
;
490 * assign the minimal set of variables to the template
495 function assignToTemplate() {
496 $name = CRM_Utils_Array
::value('billing_first_name', $this->_params
);
497 if (CRM_Utils_Array
::value('billing_middle_name', $this->_params
)) {
498 $name .= " {$this->_params['billing_middle_name']}";
500 $name .= ' ' . CRM_Utils_Array
::value('billing_last_name', $this->_params
);
502 $this->assign('billingName', $name);
503 $this->set('name', $name);
505 $this->assign('paymentProcessor', $this->_paymentProcessor
);
507 'amount', 'currencyID',
508 'credit_card_type', 'trxn_id', 'amount_level',
511 $config = CRM_Core_Config
::singleton();
512 if (isset($this->_values
['is_recur']) &&
513 $this->_paymentProcessor
['is_recur']
515 $this->assign('is_recur_enabled', 1);
516 $vars = array_merge($vars, array(
517 'is_recur', 'frequency_interval', 'frequency_unit',
522 if (in_array('CiviPledge', $config->enableComponents
) &&
523 CRM_Utils_Array
::value('is_pledge', $this->_params
) == 1
525 $this->assign('pledge_enabled', 1);
527 $vars = array_merge($vars, array(
529 'pledge_frequency_interval',
530 'pledge_frequency_unit',
531 'pledge_installments',
535 if (isset($this->_params
['amount_other']) ||
isset($this->_params
['selectMembership'])) {
536 $this->_params
['amount_level'] = '';
539 foreach ($vars as $v) {
540 if (CRM_Utils_Array
::value($v, $this->_params
)) {
541 if ($v == 'frequency_unit' ||
$v == 'pledge_frequency_unit') {
542 $frequencyUnits = CRM_Core_OptionGroup
::values('recur_frequency_units');
543 if (array_key_exists($this->_params
[$v], $frequencyUnits)) {
544 $this->_params
[$v] = $frequencyUnits[$this->_params
[$v]];
547 $this->assign($v, $this->_params
[$v]);
551 // assign the address formatted up for display
552 $addressParts = array(
553 "street_address-{$this->_bltID}",
554 "city-{$this->_bltID}",
555 "postal_code-{$this->_bltID}",
556 "state_province-{$this->_bltID}",
557 "country-{$this->_bltID}",
560 $addressFields = array();
561 foreach ($addressParts as $part) {
562 list($n, $id) = explode('-', $part);
563 $addressFields[$n] = CRM_Utils_Array
::value('billing_' . $part, $this->_params
);
566 $this->assign('address', CRM_Utils_Address
::format($addressFields));
568 if (CRM_Utils_Array
::value('hidden_onbehalf_profile', $this->_params
)) {
569 $this->assign('onBehalfName', $this->_params
['organization_name']);
570 $locTypeId = array_keys($this->_params
['onbehalf_location']['email']);
571 $this->assign('onBehalfEmail', $this->_params
['onbehalf_location']['email'][$locTypeId[0]]['email']);
575 $assignCCInfo = FALSE;
576 if ($this->_amount
> 0.0) {
577 $assignCCInfo = TRUE;
579 elseif (CRM_Utils_array
::value('selectMembership', $this->_params
)) {
580 $memFee = CRM_Core_DAO
::getFieldValue('CRM_Member_DAO_MembershipType', $this->_params
['selectMembership'], 'minimum_fee');
582 $assignCCInfo = TRUE;
586 if ($this->_contributeMode
== 'direct' && $assignCCInfo) {
587 if ($this->_paymentProcessor
['payment_type'] & CRM_Core_Payment
::PAYMENT_TYPE_DIRECT_DEBIT
) {
588 $this->assign('payment_type', $this->_paymentProcessor
['payment_type']);
589 $this->assign('account_holder', $this->_params
['account_holder']);
590 $this->assign('bank_identification_number', $this->_params
['bank_identification_number']);
591 $this->assign('bank_name', $this->_params
['bank_name']);
592 $this->assign('bank_account_number', $this->_params
['bank_account_number']);
595 $date = CRM_Utils_Date
::format(CRM_Utils_array
::value('credit_card_exp_date', $this->_params
));
596 $date = CRM_Utils_Date
::mysqlToIso($date);
597 $this->assign('credit_card_exp_date', $date);
598 $this->assign('credit_card_number',
599 CRM_Utils_System
::mungeCreditCard(CRM_Utils_array
::value('credit_card_number', $this->_params
))
604 $this->assign('email',
605 $this->controller
->exportValue('Main', "email-{$this->_bltID}")
608 // also assign the receipt_text
609 if (isset($this->_values
['receipt_text'])) {
610 $this->assign('receipt_text', $this->_values
['receipt_text']);
615 * Function to add the custom fields
620 function buildCustom($id, $name, $viewOnly = FALSE, $onBehalf = FALSE, $fieldTypes = NULL) {
621 $stateCountryMap = array();
624 $contactID = $this->_userID
;
626 // we don't allow conflicting fields to be
627 // configured via profile - CRM 2100
628 $fieldsToIgnore = array(
634 'non_deductible_amount' => 1,
637 'contribution_status_id' => 1,
638 'payment_instrument' => 1,
640 'financial_type' => 1,
644 if ($contactID && CRM_Core_BAO_UFGroup
::filterUFGroups($id, $contactID)) {
645 $fields = CRM_Core_BAO_UFGroup
::getFields($id, FALSE, CRM_Core_Action
::ADD
, NULL, NULL, FALSE,
646 NULL, FALSE, NULL, CRM_Core_Permission
::CREATE
, NULL
650 $fields = CRM_Core_BAO_UFGroup
::getFields($id, FALSE, CRM_Core_Action
::ADD
, NULL, NULL, FALSE,
651 NULL, FALSE, NULL, CRM_Core_Permission
::CREATE
, NULL
656 // unset any email-* fields since we already collect it, CRM-2888
657 foreach (array_keys($fields) as $fieldName) {
658 if (substr($fieldName, 0, 6) == 'email-') {
659 unset($fields[$fieldName]);
663 if (array_intersect_key($fields, $fieldsToIgnore)) {
664 $fields = array_diff_key($fields, $fieldsToIgnore);
665 CRM_Core_Session
::setStatus(ts('Some of the profile fields cannot be configured for this page.'), ts('Warning'), 'alert');
668 $fields = array_diff_assoc($fields, $this->_fields
);
670 CRM_Core_BAO_Address
::checkContactSharedAddressFields($fields, $contactID);
672 foreach ($fields as $key => $field) {
674 isset($field['data_type']) &&
675 $field['data_type'] == 'File' ||
($viewOnly && $field['name'] == 'image_URL')
677 // ignore file upload fields
681 list($prefixName, $index) = CRM_Utils_System
::explode('-', $key, 2);
682 if ($prefixName == 'state_province' ||
$prefixName == 'country' ||
$prefixName == 'county') {
683 if (!array_key_exists($index, $stateCountryMap)) {
684 $stateCountryMap[$index] = array();
686 $stateCountryMap[$index][$prefixName] = $key;
690 if (!empty($fieldTypes) && in_array($field['field_type'], $fieldTypes)) {
691 CRM_Core_BAO_UFGroup
::buildProfile(
694 CRM_Profile_Form
::MODE_CREATE
,
698 $this->_fields
['onbehalf'][$key] = $field;
701 unset($fields[$key]);
705 CRM_Core_BAO_UFGroup
::buildProfile(
708 CRM_Profile_Form
::MODE_CREATE
,
712 $this->_fields
[$key] = $field;
714 if ($field['add_captcha']) {
719 $this->assign($name, $fields);
721 CRM_Core_BAO_Address
::addStateCountryMap($stateCountryMap);
723 if ($addCaptcha && !$viewOnly) {
724 $captcha = CRM_Utils_ReCAPTCHA
::singleton();
725 $captcha->add($this);
726 $this->assign('isCaptcha', TRUE);
732 function checkTemplateFileExists($suffix = NULL) {
734 $templateFile = "CRM/Contribute/Form/Contribution/{$this->_id}/{$this->_name}.{$suffix}tpl";
735 $template = CRM_Core_Form
::getTemplate();
736 if ($template->template_exists($templateFile)) {
737 return $templateFile;
743 function getTemplateFileName() {
744 $fileName = $this->checkTemplateFileExists();
745 return $fileName ?
$fileName : parent
::getTemplateFileName();
748 function overrideExtraTemplateFileName() {
749 $fileName = $this->checkTemplateFileExists('extra.');
750 return $fileName ?
$fileName : parent
::overrideExtraTemplateFileName();
754 * Function to authenticate pledge user during online payment.
760 public function authenticatePledgeUser() {
761 //get the userChecksum and contact id
762 $userChecksum = CRM_Utils_Request
::retrieve('cs', 'String', $this);
763 $contactID = CRM_Utils_Request
::retrieve('cid', 'Positive', $this);
765 //get pledge status and contact id
766 $pledgeValues = array();
767 $pledgeParams = array('id' => $this->_values
['pledge_id']);
768 $returnProperties = array('contact_id', 'status_id');
769 CRM_Core_DAO
::commonRetrieve('CRM_Pledge_DAO_Pledge', $pledgeParams, $pledgeValues, $returnProperties);
772 $allStatus = CRM_Contribute_PseudoConstant
::contributionStatus(NULL, 'name');
773 $validStatus = array(array_search('Pending', $allStatus),
774 array_search('In Progress', $allStatus),
775 array_search('Overdue', $allStatus),
779 if ($this->_userID
&&
780 $this->_userID
== $pledgeValues['contact_id']
782 //check for authenticated user.
785 elseif ($userChecksum && $pledgeValues['contact_id']) {
786 //check for anonymous user.
787 $validUser = CRM_Contact_BAO_Contact_Utils
::validChecksum($pledgeValues['contact_id'], $userChecksum);
789 //make sure cid is same as pledge contact id
790 if ($validUser && ($pledgeValues['contact_id'] != $contactID)) {
796 CRM_Core_Error
::fatal(ts("Oops. It looks like you have an incorrect or incomplete link (URL). Please make sure you've copied the entire link, and try again. Contact the site administrator if this error persists."));
799 //check for valid pledge status.
800 if (!in_array($pledgeValues['status_id'], $validStatus)) {
801 CRM_Core_Error
::fatal(ts('Oops. You cannot make a payment for this pledge - pledge status is %1.', array(1 => CRM_Utils_Array
::value($pledgeValues['status_id'], $allStatus))));
806 * In case user cancel recurring contribution,
807 * When we get the control back from payment gate way
808 * lets delete the recurring and related contribution.
811 public function cancelRecurring() {
812 $isCancel = CRM_Utils_Request
::retrieve('cancel', 'Boolean', CRM_Core_DAO
::$_nullObject);
814 $isRecur = CRM_Utils_Request
::retrieve('isRecur', 'Boolean', CRM_Core_DAO
::$_nullObject);
815 $recurId = CRM_Utils_Request
::retrieve('recurId', 'Positive', CRM_Core_DAO
::$_nullObject);
816 //clean db for recurring contribution.
817 if ($isRecur && $recurId) {
818 CRM_Contribute_BAO_ContributionRecur
::deleteRecurContribution($recurId);
820 $contribId = CRM_Utils_Request
::retrieve('contribId', 'Positive', CRM_Core_DAO
::$_nullObject);
822 CRM_Contribute_BAO_Contribution
::deleteContribution($contribId);