'financial_account_id' => $financialAccountId,
);
CRM_Financial_BAO_FinancialTypeAccount::add($financialAccountParams);
- $taxRates = CRM_Core_PseudoConstant::getTaxRates();
+
$params = array_merge($this->_params, array('contribution_status_id' => 2, 'financial_type_id' => $financialTypeId));
$contribution = $this->callAPISuccess('contribution', 'create', $params);
$contribution1 = $this->callAPISuccess('contribution', 'get', array('id' => $contribution['id'], 'return' => 'tax_amount', 'sequential' => 1));
$this->mut->checkMailLog(array(
'is_recur:::1',
- 'cancelSubscriptionUrl:::http://dummy.com',
+ 'cancelSubscriptionUrl:::'. CIVICRM_UF_BASEURL,
));
$this->mut->stop();
$this->revertTemplateToReservedTemplate();
* Test completing first transaction in a recurring series.
*
* The status should be set to 'in progress' and the next scheduled payment date calculated.
+ *
+ * @dataProvider getScheduledDateData
+ *
+ * @param array $dataSet
+ *
+ * @throws \Exception
*/
- public function testCompleteTransactionSetStatusToInProgress() {
+ public function testCompleteTransactionSetStatusToInProgress($dataSet) {
$paymentProcessorID = $this->paymentProcessorCreate();
- $contributionRecur = $this->callAPISuccess('contribution_recur', 'create', array(
+ $contributionRecur = $this->callAPISuccess('contribution_recur', 'create', array_merge(array(
'contact_id' => $this->_individualId,
- 'installments' => '12',
+ 'installments' => '2',
'frequency_interval' => '1',
'amount' => '500',
'contribution_status_id' => 'Pending',
'currency' => 'USD',
'frequency_unit' => 'month',
'payment_processor_id' => $paymentProcessorID,
- ));
+ ), $dataSet['data']));
$contribution = $this->callAPISuccess('contribution', 'create', array_merge(
$this->_params,
array(
'contribution_recur_id' => $contributionRecur['id'],
'contribution_status_id' => 'Pending',
+ 'receive_date' => $dataSet['receive_date'],
))
);
- $this->callAPISuccess('Contribution', 'completetransaction', array('id' => $contribution));
+ $this->callAPISuccess('Contribution', 'completetransaction', array(
+ 'id' => $contribution,
+ 'receive_date' => $dataSet['receive_date'],
+ ));
$contributionRecur = $this->callAPISuccessGetSingle('ContributionRecur', array(
'id' => $contributionRecur['id'],
'return' => array('next_sched_contribution_date', 'contribution_status_id'),
));
$this->assertEquals(5, $contributionRecur['contribution_status_id']);
- $this->assertEquals(date('Y-m-d 00:00:00', strtotime('+1 month')), $contributionRecur['next_sched_contribution_date']);
+ $this->assertEquals($dataSet['expected'], $contributionRecur['next_sched_contribution_date']);
+ $this->callAPISuccess('Contribution', 'create', array_merge(
+ $this->_params,
+ array(
+ 'contribution_recur_id' => $contributionRecur['id'],
+ 'contribution_status_id' => 'Completed',
+ )
+ ));
+ $contributionRecur = $this->callAPISuccessGetSingle('ContributionRecur', array(
+ 'id' => $contributionRecur['id'],
+ 'return' => array('contribution_status_id'),
+ ));
+ $this->assertEquals(1, $contributionRecur['contribution_status_id']);
+ }
+
+ /**
+ * Get dates for testing.
+ *
+ * @return array
+ */
+ public function getScheduledDateData() {
+ $result = array();
+ $result[]['2016-08-31-1-month'] = array(
+ 'data' => array(
+ 'start_date' => '2016-08-31',
+ 'frequency_interval' => 1,
+ 'frequency_unit' => 'month',
+ ),
+ 'receive_date' => '2016-08-31',
+ 'expected' => '2016-10-01 00:00:00',
+ );
+ $result[]['2012-01-01-1-month'] = array(
+ 'data' => array(
+ 'start_date' => '2012-01-01',
+ 'frequency_interval' => 1,
+ 'frequency_unit' => 'month',
+ ),
+ 'receive_date' => '2012-01-01',
+ 'expected' => '2012-02-01 00:00:00',
+ );
+ $result[]['2012-01-01-1-month'] = array(
+ 'data' => array(
+ 'start_date' => '2012-01-01',
+ 'frequency_interval' => 1,
+ 'frequency_unit' => 'month',
+ ),
+ 'receive_date' => '2012-02-29',
+ 'expected' => '2012-03-29 00:00:00',
+ );
+ return $result;
}
/**
public function testCompleteTransactionWithParticipantRecord() {
$mut = new CiviMailUtils($this, TRUE);
$mut->clearMessages();
- $this->createLoggedInUser();
+ $this->_individualId = $this->createLoggedInUser();
$contributionID = $this->createPendingParticipantContribution();
$this->callAPISuccess('contribution', 'completetransaction', array(
'id' => $contributionID,
'return' => 'participant_status_id',
));
$this->assertEquals(1, $participantStatus);
+
+ //Assert only three activities are created.
+ $activities = CRM_Activity_BAO_Activity::getContactActivity($this->_individualId);
+ $this->assertEquals(3, count($activities));
+ $activityNames = array_count_values(CRM_Utils_Array::collect('activity_name', $activities));
+ // record two activities before and after completing payment for Event registration
+ $this->assertEquals(2, $activityNames['Event Registration']);
+ // update the original 'Contribution' activity created after completing payment
+ $this->assertEquals(1, $activityNames['Contribution']);
+
$mut->checkMailLog(array(
'Annual CiviCRM meet',
'Event',
));
$this->assertEquals(1, $logs['count']);
$this->assertEquals($stateOfGrace, $membership['status_id']);
- $contribution = $this->callAPISuccess('contribution', 'completetransaction', array('id' => $this->_ids['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']);
+ //Assert only three activities are created.
+ $activities = CRM_Activity_BAO_Activity::getContactActivity($this->_ids['contact']);
+ $this->assertEquals(3, count($activities));
+ $activityNames = array_flip(CRM_Utils_Array::collect('activity_name', $activities));
+ $this->assertArrayHasKey('Contribution', $activityNames);
+ $this->assertArrayHasKey('Membership Signup', $activityNames);
+ $this->assertArrayHasKey('Change Membership Status', $activityNames);
$this->cleanUpAfterPriceSets();
}
);
$this->setUpPendingContribution($this->_ids['price_field_value'][0]);
$this->callAPISuccess('membership', 'getsingle', array('id' => $this->_ids['membership']));
+ // Case 1: Assert that Membership Signup Activity is created on Pending to Completed Contribution via backoffice
+ $activity = $this->callAPISuccess('Activity', 'get', array(
+ 'activity_type_id' => 'Membership Signup',
+ 'source_record_id' => $this->_ids['membership'],
+ 'status_id' => 'Scheduled',
+ ));
+ $this->assertEquals(1, $activity['count']);
// change pending contribution to completed
$form = new CRM_Contribute_Form_Contribution();
catch (Civi\Payment\Exception\PaymentProcessorException $e) {
$error = TRUE;
}
+ // Case 2: After successful payment for Pending backoffice there are three activities created
+ // 2.a Update status of existing Scheduled Membership Signup (created in step 1) to Completed
$activity = $this->callAPISuccess('Activity', 'get', array(
- 'activity_type_id' => 'Membership Renewal',
+ 'activity_type_id' => 'Membership Signup',
+ 'source_record_id' => $this->_ids['membership'],
+ 'status_id' => 'Completed',
+ ));
+ $this->assertEquals(1, $activity['count']);
+ // 2.b Contribution activity created to record successful payment
+ $activity = $this->callAPISuccess('Activity', 'get', array(
+ 'activity_type_id' => 'Contribution',
'source_record_id' => $this->_ids['contribution'],
+ 'status_id' => 'Completed',
+ ));
+ $this->assertEquals(1, $activity['count']);
+
+ // 2.c 'Change membership type' activity created to record Membership status change from Grace to Current
+ $activity = $this->callAPISuccess('Activity', 'get', array(
+ 'activity_type_id' => 'Change Membership Status',
+ 'source_record_id' => $this->_ids['membership'],
+ 'status_id' => 'Completed',
));
$this->assertEquals(1, $activity['count']);
+ $this->assertEquals('Status changed from Grace to Current', $activity['values'][$activity['id']]['subject']);
+
+ //Create another pending contribution for renewal
+ $contribution = $this->callAPISuccess('contribution', 'create', array(
+ 'domain_id' => 1,
+ 'contact_id' => $this->_ids['contact'],
+ 'receive_date' => date('Ymd'),
+ 'total_amount' => 20.00,
+ 'financial_type_id' => 1,
+ 'payment_instrument_id' => 'Credit Card',
+ 'non_deductible_amount' => 10.00,
+ 'trxn_id' => 'rdhfi88',
+ 'invoice_id' => 'dofhiewuyr',
+ 'source' => 'SSF',
+ 'contribution_status_id' => 2,
+ 'contribution_page_id' => $this->_ids['contribution_page'],
+ 'api.membership_payment.create' => array('membership_id' => $this->_ids['membership']),
+ ));
+
+ $this->callAPISuccess('line_item', 'create', array(
+ 'entity_id' => $contribution['id'],
+ 'entity_table' => 'civicrm_contribution',
+ 'contribution_id' => $contribution['id'],
+ 'price_field_id' => $this->_ids['price_field'][0],
+ 'qty' => 1,
+ 'unit_price' => 20,
+ 'line_total' => 20,
+ 'financial_type_id' => 1,
+ 'price_field_value_id' => $this->_ids['price_field_value'][0],
+ ));
+
+ //Update it to Failed.
+ $form->_params['id'] = $contribution['id'];
+ $form->_params['contribution_status_id'] = 4;
+ try {
+ $form->testSubmit($form->_params, CRM_Core_Action::UPDATE);
+ }
+ catch (Civi\Payment\Exception\PaymentProcessorException $e) {
+ $error = TRUE;
+ }
+ //Existing membership should not get updated to expired.
+ $membership = $this->callAPISuccess('membership', 'getsingle', array('id' => $this->_ids['membership']));
+ $this->assertNotEquals($membership['status_id'], 4);
}
/**
*
* @param int $priceFieldValueID
*/
- public function setUpPendingContribution($priceFieldValueID) {
+ public function setUpPendingContribution($priceFieldValueID, $contriParams = array()) {
$contactID = $this->individualCreate();
$membership = $this->callAPISuccess('membership', 'create', array(
'contact_id' => $contactID,
'end_date' => 'yesterday',
'join_date' => 'yesterday - 1 year',
));
- $contribution = $this->callAPISuccess('contribution', 'create', array(
+ $contribution = $this->callAPISuccess('contribution', 'create', array_merge(array(
'domain_id' => 1,
'contact_id' => $contactID,
'receive_date' => date('Ymd'),
'financial_type_id' => 1,
'payment_instrument_id' => 'Credit Card',
'non_deductible_amount' => 10.00,
- 'trxn_id' => 'jdhfi88',
- 'invoice_id' => 'djfhiewuyr',
+ 'trxn_id' => 'jdhfi' . rand(1, 100),
+ 'invoice_id' => 'djfhiew' . rand(5, 100),
'source' => 'SSF',
'contribution_status_id' => 2,
'contribution_page_id' => $this->_ids['contribution_page'],
'api.membership_payment.create' => array('membership_id' => $membership['id']),
- ));
+ ), $contriParams));
$this->callAPISuccess('line_item', 'create', array(
'entity_id' => $contribution['id'],
*/
public function createPendingParticipantContribution() {
$event = $this->eventCreate(array('is_email_confirm' => 1, 'confirm_from_email' => 'test@civicrm.org'));
- $participantID = $this->participantCreate(array('event_id' => $event['id'], 'status_id' => 6));
+ $participantID = $this->participantCreate(array('event_id' => $event['id'], 'status_id' => 6, 'contact_id' => $this->_individualId));
$this->_ids['participant'] = $participantID;
- $params = array_merge($this->_params, array('contribution_status_id' => 2, 'financial_type_id' => 'Event Fee'));
+ $params = array_merge($this->_params, array('contact_id' => $this->_individualId, 'contribution_status_id' => 2, 'financial_type_id' => 'Event Fee'));
$contribution = $this->callAPISuccess('contribution', 'create', $params);
$this->callAPISuccess('participant_payment', 'create', array(
'contribution_id' => $contribution['id'],
$this->quickCleanUpFinancialEntities();
}
+ /**
+ * CRM-20008 Tests repeattransaction creates pending membership.
+ */
+ public function testRepeatTransactionPendingMembership() {
+ list($originalContribution, $membership) = $this->setUpAutoRenewMembership();
+ $this->callAPISuccess('membership', 'create', array(
+ 'id' => $membership['id'],
+ 'end_date' => 'yesterday',
+ 'status_id' => 'Expired',
+ ));
+ $repeatedContribution = $this->callAPISuccess('contribution', 'repeattransaction', array(
+ 'contribution_recur_id' => $originalContribution['values'][1]['contribution_recur_id'],
+ 'contribution_status_id' => 'Pending',
+ 'trxn_id' => uniqid(),
+ ));
+ $membershipStatusId = $this->callAPISuccess('membership', 'getvalue', array(
+ 'id' => $membership['id'],
+ 'return' => 'status_id',
+ ));
+
+ // Let's see if the membership payments got created while we're at it.
+ $membershipPayments = $this->callAPISuccess('MembershipPayment', 'get', array(
+ 'memberhip_id' => $membership['id'],
+ ));
+ $this->assertEquals(2, $membershipPayments['count']);
+
+ $this->assertEquals('Expired', CRM_Core_PseudoConstant::getLabel('CRM_Member_BAO_Membership', 'status_id', $membershipStatusId));
+ $this->callAPISuccess('Contribution', 'completetransaction', array('id' => $repeatedContribution['id']));
+ $membership = $this->callAPISuccessGetSingle('membership', array(
+ 'id' => $membership['id'],
+ 'return' => 'status_id, end_date',
+ ));
+ $this->assertEquals('New', CRM_Core_PseudoConstant::getLabel('CRM_Member_BAO_Membership', 'status_id', $membership['status_id']));
+ $this->assertEquals(date('Y-m-d', strtotime('yesterday + 1 month')), $membership['end_date']);
+
+ $this->quickCleanUpFinancialEntities();
+ $this->contactDelete($originalContribution['values'][1]['contact_id']);
+ }
+
/**
* Test sending a mail via the API.
*/
return $contributionPage;
}
+ /**
+ * function to test card_type and pan truncation.
+ */
+ public function testCardTypeAndPanTruncation() {
+ $creditCardTypeIDs = array_flip(CRM_Financial_DAO_FinancialTrxn::buildOptions('card_type_id'));
+ $contactId = $this->individualCreate();
+ $params = array(
+ 'contact_id' => $contactId,
+ 'receive_date' => '2016-01-20',
+ 'total_amount' => 100,
+ 'financial_type_id' => 1,
+ 'payment_instrument' => 'Credit Card',
+ 'card_type_id' => $creditCardTypeIDs['Visa'],
+ 'pan_truncation' => 4567,
+ );
+ $contribution = $this->callAPISuccess('contribution', 'create', $params);
+ $lastFinancialTrxnId = CRM_Core_BAO_FinancialTrxn::getFinancialTrxnId($contribution['id'], 'DESC');
+ $financialTrxn = $this->callAPISuccessGetSingle(
+ 'FinancialTrxn',
+ array(
+ 'id' => $lastFinancialTrxnId['financialTrxnId'],
+ 'return' => array('card_type_id', 'pan_truncation'),
+ )
+ );
+ $this->assertEquals(CRM_Utils_Array::value('card_type_id', $financialTrxn), $creditCardTypeIDs['Visa']);
+ $this->assertEquals(CRM_Utils_Array::value('pan_truncation', $financialTrxn), 4567);
+ $params = array(
+ 'id' => $contribution['id'],
+ 'pan_truncation' => 2345,
+ 'card_type_id' => $creditCardTypeIDs['Amex'],
+ );
+ $contribution = $this->callAPISuccess('contribution', 'create', $params);
+ $financialTrxn = $this->callAPISuccessGetSingle(
+ 'FinancialTrxn',
+ array(
+ 'id' => $lastFinancialTrxnId['financialTrxnId'],
+ 'return' => array('card_type_id', 'pan_truncation'),
+ )
+ );
+ $this->assertEquals(CRM_Utils_Array::value('card_type_id', $financialTrxn), $creditCardTypeIDs['Amex']);
+ $this->assertEquals(CRM_Utils_Array::value('pan_truncation', $financialTrxn), 2345);
+ }
+
}