+--------------------------------------------------------------------+
| CiviCRM version 4.7 |
+--------------------------------------------------------------------+
- | Copyright CiviCRM LLC (c) 2004-2016 |
+ | Copyright CiviCRM LLC (c) 2004-2017 |
+--------------------------------------------------------------------+
| This file is a part of CiviCRM. |
| |
'contribution_id' => $this->_contribution['id'],
);
- $contribution = $this->callAPIAndDocument('contribution', 'get', $params, __FUNCTION__, __FILE__);
+ $contributions = $this->callAPIAndDocument('contribution', 'get', $params, __FUNCTION__, __FILE__);
$financialParams['id'] = $this->_financialTypeId;
$default = NULL;
CRM_Financial_BAO_FinancialType::retrieve($financialParams, $default);
- $this->assertEquals(1, $contribution['count']);
- $this->assertEquals($contribution['values'][$contribution['id']]['contact_id'], $this->_individualId);
+ $this->assertEquals(1, $contributions['count']);
+ $contribution = $contributions['values'][$contributions['id']];
+ $this->assertEquals($contribution['contact_id'], $this->_individualId);
// Note there was an assertion converting financial_type_id to 'Donation' which wasn't working.
// Passing back a string rather than an id seems like an error/cruft.
// If it is to be introduced we should discuss.
- $this->assertEquals($contribution['values'][$contribution['id']]['financial_type_id'], 1);
- $this->assertEquals($contribution['values'][$contribution['id']]['total_amount'], 100.00);
- $this->assertEquals($contribution['values'][$contribution['id']]['non_deductible_amount'], 10.00);
- $this->assertEquals($contribution['values'][$contribution['id']]['fee_amount'], 5.00);
- $this->assertEquals($contribution['values'][$contribution['id']]['net_amount'], 95.00);
- $this->assertEquals($contribution['values'][$contribution['id']]['trxn_id'], 23456);
- $this->assertEquals($contribution['values'][$contribution['id']]['invoice_id'], 78910);
- $this->assertEquals($contribution['values'][$contribution['id']]['contribution_source'], 'SSF');
- $this->assertEquals($contribution['values'][$contribution['id']]['contribution_status'], 'Completed');
+ $this->assertEquals($contribution['financial_type_id'], 1);
+ $this->assertEquals($contribution['total_amount'], 100.00);
+ $this->assertEquals($contribution['non_deductible_amount'], 10.00);
+ $this->assertEquals($contribution['fee_amount'], 5.00);
+ $this->assertEquals($contribution['net_amount'], 95.00);
+ $this->assertEquals($contribution['trxn_id'], 23456);
+ $this->assertEquals($contribution['invoice_id'], 78910);
+ $this->assertEquals($contribution['contribution_source'], 'SSF');
+ $this->assertEquals($contribution['contribution_status'], 'Completed');
// Create a second contribution - we are testing that 'id' gets the right contribution id (not the contact id).
$p['trxn_id'] = '3847';
$p['invoice_id'] = '3847';
$this->callAPISuccessGetSingle('Contribution', array('is_test' => 1));
}
+ /**
+ * Test the 'return' param works for all fields.
+ */
+ public function testGetContributionReturnFunctionality() {
+ $params = $this->_params;
+ $params['check_number'] = 'bouncer';
+ $params['payment_instrument_id'] = 'Check';
+ $params['cancel_date'] = 'yesterday';
+ $params['receipt_date'] = 'yesterday';
+ $params['thankyou_date'] = 'yesterday';
+ $params['revenue_recognition_date'] = 'yesterday';
+ $params['amount_level'] = 'Unreasonable';
+ $params['cancel_reason'] = 'You lose sucker';
+ $params['creditnote_id'] = 'sudo rm -rf';
+ $params['tax_amount'] = '1';
+ $address = $this->callAPISuccess('Address', 'create', array(
+ 'street_address' => 'Knockturn Alley',
+ 'contact_id' => $this->_individualId,
+ 'location_type_id' => 'Home',
+ ));
+ $params['address_id'] = $address['id'];
+ $contributionPage = $this->contributionPageCreate();
+ $params['contribution_page_id'] = $contributionPage['id'];
+ $contributionRecur = $this->callAPISuccess('ContributionRecur', 'create', array(
+ 'contact_id' => $this->_individualId,
+ 'frequency_interval' => 1,
+ 'amount' => 5,
+ ));
+ $params['contribution_recur_id'] = $contributionRecur['id'];
+
+ $params['campaign_id'] = $this->campaignCreate();
+
+ $contributionID = $this->contributionCreate($params);
+ $contribution = $this->callAPISuccessGetSingle('Contribution', array('id' => $contributionID));
+ $this->assertEquals('bouncer', $contribution['check_number']);
+ $this->assertEquals('bouncer', $contribution['contribution_check_number']);
+
+ $fields = CRM_Contribute_BAO_Contribution::fields();
+ // Re-add these 2 to the fields to check. They were locked in but the metadata changed so we
+ // need to specify them.
+ $fields['address_id'] = $fields['contribution_address_id'];
+ $fields['check_number'] = $fields['contribution_check_number'];
+
+ $fieldsLockedIn = array(
+ 'contribution_id', 'contribution_contact_id', 'financial_type_id', 'contribution_page_id',
+ 'payment_instrument_id', 'receive_date', 'non_deductible_amount', 'total_amount',
+ 'fee_amount', 'net_amount', 'trxn_id', 'invoice_id', 'currency', 'cancel_date', 'cancel_reason',
+ 'receipt_date', 'thankyou_date', 'contribution_source', 'amount_level', 'contribution_recur_id',
+ 'is_test', 'is_pay_later', 'contribution_status_id', 'address_id', 'check_number', 'contribution_campaign_id',
+ 'creditnote_id', 'tax_amount', 'revenue_recognition_date', 'decoy',
+ );
+ $missingFields = array_diff($fieldsLockedIn, array_keys($fields));
+ // If any of the locked in fields disappear from the $fields array we need to make sure it is still
+ // covered as the test contract now guarantees them in the return array.
+ $this->assertEquals($missingFields, array(29 => 'decoy'), 'A field which was covered by the test contract has changed.');
+ foreach ($fields as $fieldName => $fieldSpec) {
+ $contribution = $this->callAPISuccessGetSingle('Contribution', array('id' => $contributionID, 'return' => $fieldName));
+ $returnField = $fieldName;
+ if ($returnField == 'contribution_contact_id') {
+ $returnField = 'contact_id';
+ }
+ $this->assertTrue((!empty($contribution[$returnField]) || $contribution[$returnField] === "0"), $returnField);
+ }
+ }
+
/**
* We need to ensure previous tested behaviour still works as part of the api contract.
*/
$params = array(
'contribution_id' => $this->_contribution['id'],
);
- $contribution = $this->callAPIAndDocument('contribution', 'get', $params, __FUNCTION__, __FILE__);
+ $contribution = $this->callAPISuccess('contribution', 'get', $params);
$financialParams['id'] = $this->_financialTypeId;
$default = NULL;
CRM_Financial_BAO_FinancialType::retrieve($financialParams, $default);
'contribution_status_id' => 1,
);
- $contribution = $this->callAPIAndDocument('contribution', 'create', $params, __FUNCTION__, __FILE__);
+ $contribution = $this->callAPISuccess('contribution', 'create', $params);
$this->assertEquals($contribution['values'][$contribution['id']]['contact_id'], $this->_individualId);
$this->assertEquals($contribution['values'][$contribution['id']]['total_amount'], 100.00);
$this->assertEquals($contribution['values'][$contribution['id']]['financial_type_id'], 1);
// 2);
}
+ /**
+ * Check the credit note retrieval is case insensitive.
+ */
+ public function testGetCreditNoteCaseInsensitive() {
+ $this->contributionCreate(array('contact_id' => $this->_individualId));
+ $this->contributionCreate(array('creditnote_id' => 'cN1234', 'contact_id' => $this->_individualId, 'invoice_id' => rand(), 'trxn_id' => rand()));
+ $contribution = $this->callAPISuccess('Contribution', 'getsingle', array('creditnote_id' => 'CN1234'));
+ $this->assertEquals($contribution['creditnote_id'], 'cN1234');
+ }
+
/**
* Test retrieval by total_amount works.
*
'contribution_status_id' => 1,
);
- $contribution = $this->callAPIAndDocument('contribution', 'create', $params, __FUNCTION__, __FILE__);
+ $contribution = $this->callAPISuccess('contribution', 'create', $params);
$this->assertEquals($contribution['values'][$contribution['id']]['contact_id'], $this->_individualId);
$this->assertEquals($contribution['values'][$contribution['id']]['total_amount'], 100.00);
$this->assertEquals($contribution['values'][$contribution['id']]['fee_amount'], 50.00);
);
- $contribution = $this->callAPIAndDocument('contribution', 'create', $params, __FUNCTION__, __FILE__);
+ $contribution = $this->callAPISuccess('contribution', 'create', $params);
$this->assertEquals($contribution['values'][$contribution['id']]['contact_id'], $this->_individualId);
$this->assertEquals($contribution['values'][$contribution['id']]['total_amount'], 100.00);
$this->assertEquals($contribution['values'][$contribution['id']]['financial_type_id'], 1);
'contribution_status_id' => 2,
);
- $contribution = $this->callAPIAndDocument('contribution', 'create', $params, __FUNCTION__, __FILE__);
+ $contribution = $this->callAPISuccess('contribution', 'create', $params);
$this->assertEquals($contribution['values'][$contribution['id']]['contact_id'], $this->_individualId);
$this->assertEquals($contribution['values'][$contribution['id']]['total_amount'], 100.00);
$this->assertEquals($contribution['values'][$contribution['id']]['financial_type_id'], 1);
$newParams = array_merge($contribParams, array(
'id' => $contribution['id'],
'contribution_status_id' => 3,
+ 'cancel_date' => '2012-02-02 09:00',
)
);
+ //Check if trxn_date is same as cancel_date.
+ $checkTrxnDate = array(
+ 'trxn_date' => '2012-02-02 09:00:00',
+ );
$contribution = $this->callAPISuccess('contribution', 'create', $newParams);
- $this->_checkFinancialTrxn($contribution, 'cancelPending');
+ $this->_checkFinancialTrxn($contribution, 'cancelPending', NULL, $checkTrxnDate);
$this->_checkFinancialItem($contribution['id'], 'cancelPending');
}
'non_deductible_amount' => 10.00,
'net_amount' => 100.00,
'contribution_status_id' => 1,
- 'note' => 'Donating for Nobel Cause',
+ 'note' => 'Donating for Noble Cause',
);
'contribution_id' => $contribution['id'],
);
- $contribution = $this->callAPISuccess('contribution', 'get', $new_params);
-
- $this->assertEquals($contribution['values'][$contributionID]['contact_id'], $this->_individualId);
- $this->assertEquals($contribution['values'][$contributionID]['total_amount'], 110.00);
- $this->assertEquals($contribution['values'][$contributionID]['financial_type_id'], $this->_financialTypeId);
- $this->assertEquals($contribution['values'][$contributionID]['instrument_id'], $old_payment_instrument);
- $this->assertEquals($contribution['values'][$contributionID]['non_deductible_amount'], 10.00);
- $this->assertEquals($contribution['values'][$contributionID]['fee_amount'], $old_fee_amount);
- $this->assertEquals($contribution['values'][$contributionID]['net_amount'], 100.00);
- $this->assertEquals($contribution['values'][$contributionID]['trxn_id'], $old_trxn_id);
- $this->assertEquals($contribution['values'][$contributionID]['invoice_id'], $old_invoice_id);
- $this->assertEquals($contribution['values'][$contributionID]['contribution_source'], $old_source);
- $this->assertEquals($contribution['values'][$contributionID]['contribution_status'], 'Completed');
+ $contribution = $this->callAPISuccessGetSingle('contribution', $new_params);
+
+ $this->assertEquals($contribution['contact_id'], $this->_individualId);
+ $this->assertEquals($contribution['total_amount'], 110.00);
+ $this->assertEquals($contribution['financial_type_id'], $this->_financialTypeId);
+ $this->assertEquals($contribution['financial_type'], 'Donation');
+ $this->assertEquals($contribution['instrument_id'], $old_payment_instrument);
+ $this->assertEquals($contribution['non_deductible_amount'], 10.00);
+ $this->assertEquals($contribution['fee_amount'], $old_fee_amount);
+ $this->assertEquals($contribution['net_amount'], 100.00);
+ $this->assertEquals($contribution['trxn_id'], $old_trxn_id);
+ $this->assertEquals($contribution['invoice_id'], $old_invoice_id);
+ $this->assertEquals($contribution['contribution_source'], $old_source);
+ $this->assertEquals($contribution['contribution_status'], 'Completed');
$params = array(
'contribution_id' => $contributionID,
$this->assertAPISuccess($result);
}
- ///////////////// civicrm_contribution_delete methods
-
/**
* Attempt (but fail) to delete a contribution without parameters.
*/
$this->revertTemplateToReservedTemplate();
}
-
/**
* Test to check whether contact billing address is used when no contribution address
*/
$this->quickCleanUpFinancialEntities();
}
+ /**
+ * CRM-19873 Test repattransaction if contribution_recur_id is a test.
+ */
+ public function testRepeatTransactionTestRecurId() {
+ $contributionRecur = $this->callAPISuccess('contribution_recur', 'create', array(
+ 'contact_id' => $this->_individualId,
+ 'frequency_interval' => '1',
+ 'amount' => '1.00',
+ 'contribution_status_id' => 1,
+ 'start_date' => '2017-01-01 00:00:00',
+ 'currency' => 'USD',
+ 'frequency_unit' => 'month',
+ 'payment_processor_id' => $this->paymentProcessorID,
+ 'is_test' => 1,
+ ));
+ $this->callAPISuccess('contribution', 'create', array_merge(
+ $this->_params,
+ array(
+ 'contribution_recur_id' => $contributionRecur['id'],
+ 'is_test' => 1,
+ ))
+ );
+
+ $repeatedContribution = $this->callAPISuccess('contribution', 'repeattransaction', array(
+ 'contribution_recur_id' => $contributionRecur['id'],
+ 'contribution_status_id' => 'Completed',
+ 'trxn_id' => uniqid(),
+ ));
+
+ $this->assertEquals($contributionRecur['values'][1]['is_test'], $repeatedContribution['values'][2]['is_test']);
+ $this->quickCleanUpFinancialEntities();
+ }
+
/**
* CRM-16397 test appropriate action if total amount has changed for single line items.
*/
));
$this->assertEquals(1, $logs['count']);
$this->assertEquals($stateOfGrace, $membership['status_id']);
- $this->callAPISuccess('contribution', 'completetransaction', array('id' => $this->_ids['contribution']));
+ $contribution = $this->callAPISuccess('contribution', 'completetransaction', array('id' => $this->_ids['contribution']));
$membership = $this->callAPISuccess('membership', 'getsingle', array('id' => $this->_ids['membership']));
$this->assertEquals(date('Y-m-d', strtotime('yesterday + 1 year')), $membership['end_date']);
$this->callAPISuccessGetSingle('LineItem', array(
$logs = $this->callAPISuccess('MembershipLog', 'get', array(
'membership_id' => $this->_ids['membership'],
));
+ //CRM-19600: Ensure that 'Membership Renewal' activity is created after successful membership regsitration
+ $activity = $this->callAPISuccess('Activity', 'get', array(
+ 'activity_type_id' => 'Membership Renewal',
+ 'source_record_id' => $contribution['id'],
+ ));
+ $this->assertEquals(1, $activity['count']);
$this->assertEquals(2, $logs['count']);
$this->assertNotEquals($stateOfGrace, $logs['values'][2]['status_id']);
$this->cleanUpAfterPriceSets();
}
+ /**
+ * Test if renewal activity is create after changing Pending contribution to Completed via offline
+ */
+ public function testPendingToCompleteContribution() {
+ $contributionPage = $this->createPriceSetWithPage('membership');
+ $stateOfGrace = $this->callAPISuccess('MembershipStatus', 'getvalue', array(
+ 'name' => 'Grace',
+ 'return' => 'id')
+ );
+ $this->setUpPendingContribution($this->_ids['price_field_value'][0]);
+ $this->callAPISuccess('membership', 'getsingle', array('id' => $this->_ids['membership']));
+
+ // change pending contribution to completed
+ $form = new CRM_Contribute_Form_Contribution();
+ $error = FALSE;
+ $form->_params = array(
+ 'id' => $this->_ids['contribution'],
+ 'total_amount' => 20,
+ 'net_amount' => 20,
+ 'fee_amount' => 0,
+ 'financial_type_id' => 1,
+ 'receive_date' => '04/21/2015',
+ 'receive_date_time' => '11:27PM',
+ 'contact_id' => $this->_individualId,
+ 'contribution_status_id' => 1,
+ 'billing_middle_name' => '',
+ 'billing_last_name' => 'Adams',
+ 'billing_street_address-5' => '790L Lincoln St S',
+ 'billing_city-5' => 'Maryknoll',
+ 'billing_state_province_id-5' => 1031,
+ 'billing_postal_code-5' => 10545,
+ 'billing_country_id-5' => 1228,
+ 'frequency_interval' => 1,
+ 'frequency_unit' => 'month',
+ 'installments' => '',
+ 'hidden_AdditionalDetail' => 1,
+ 'hidden_Premium' => 1,
+ 'from_email_address' => '"civi45" <civi45@civicrm.com>',
+ 'receipt_date' => '',
+ 'receipt_date_time' => '',
+ 'payment_processor_id' => $this->paymentProcessorID,
+ 'currency' => 'USD',
+ 'contribution_page_id' => $this->_ids['contribution_page'],
+ 'contribution_mode' => 'membership',
+ 'source' => 'Membership Signup and Renewal',
+ );
+ try {
+ $form->testSubmit($form->_params, CRM_Core_Action::UPDATE);
+ }
+ catch (Civi\Payment\Exception\PaymentProcessorException $e) {
+ $error = TRUE;
+ }
+ $activity = $this->callAPISuccess('Activity', 'get', array(
+ 'activity_type_id' => 'Membership Renewal',
+ 'source_record_id' => $this->_ids['contribution'],
+ ));
+ $this->assertEquals(1, $activity['count']);
+ }
+
/**
* Test membership is renewed when transaction completed.
*/
$this->contactDelete($this->_ids['contact']);
}
-
- /**
- * Create price set with contribution test for test setup.
- *
- * This could be merged with 4.5 function setup in api_v3_ContributionPageTest::setUpContributionPage
- * on parent class at some point (fn is not in 4.4).
- *
- * @param $entity
- * @param array $params
- */
- public function createPriceSetWithPage($entity, $params = array()) {
- $membershipTypeID = $this->membershipTypeCreate();
- $contributionPageResult = $this->callAPISuccess('contribution_page', 'create', array(
- 'title' => "Test Contribution Page",
- 'financial_type_id' => 1,
- 'currency' => 'NZD',
- 'goal_amount' => 50,
- 'is_pay_later' => 1,
- 'is_monetary' => TRUE,
- 'is_email_receipt' => FALSE,
- ));
- $priceSet = $this->callAPISuccess('price_set', 'create', array(
- 'is_quick_config' => 0,
- 'extends' => 'CiviMember',
- 'financial_type_id' => 1,
- 'title' => 'my Page',
- ));
- $priceSetID = $priceSet['id'];
-
- CRM_Price_BAO_PriceSet::addTo('civicrm_contribution_page', $contributionPageResult['id'], $priceSetID);
- $priceField = $this->callAPISuccess('price_field', 'create', array(
- 'price_set_id' => $priceSetID,
- 'label' => 'Goat Breed',
- 'html_type' => 'Radio',
- ));
- $priceFieldValue = $this->callAPISuccess('price_field_value', 'create', array(
- 'price_set_id' => $priceSetID,
- 'price_field_id' => $priceField['id'],
- 'label' => 'Long Haired Goat',
- 'amount' => 20,
- 'financial_type_id' => 'Donation',
- 'membership_type_id' => $membershipTypeID,
- 'membership_num_terms' => 1,
- )
- );
- $this->_ids['price_field_value'] = array($priceFieldValue['id']);
- $priceFieldValue = $this->callAPISuccess('price_field_value', 'create', array(
- 'price_set_id' => $priceSetID,
- 'price_field_id' => $priceField['id'],
- 'label' => 'Shoe-eating Goat',
- 'amount' => 10,
- 'financial_type_id' => 'Donation',
- 'membership_type_id' => $membershipTypeID,
- 'membership_num_terms' => 2,
- )
- );
- $this->_ids['price_field_value'][] = $priceFieldValue['id'];
- $this->_ids['price_set'] = $priceSetID;
- $this->_ids['contribution_page'] = $contributionPageResult['id'];
- $this->_ids['price_field'] = array($priceField['id']);
-
- $this->_ids['membership_type'] = $membershipTypeID;
- }
-
/**
* Set up a pending transaction with a specific price field id.
*
'domain_id' => 1,
'contact_id' => $contactID,
'receive_date' => date('Ymd'),
- 'total_amount' => 100.00,
+ 'total_amount' => 20.00,
'financial_type_id' => 1,
'payment_instrument_id' => 'Credit Card',
'non_deductible_amount' => 10.00,