dev/core#927 Add test demonstrating that an extraneous activity is being created & fix
protected static function cancel($memberships, $contributionId, $membershipStatuses, $participant, $oldStatus, $pledgePayment, $pledgeID, $pledgePaymentIDs, $contributionStatusId) {
// @fixme https://lab.civicrm.org/dev/core/issues/927 Cancelling membership etc is not desirable for all use-cases and we should be able to disable it
$participantStatuses = CRM_Event_PseudoConstant::participantStatus();
- if (is_array($memberships)) {
- foreach ($memberships as $membership) {
- $update = TRUE;
- //Update Membership status if there is no other completed contribution associated with the membership.
- $relatedContributions = CRM_Member_BAO_Membership::getMembershipContributionId($membership->id, TRUE);
- foreach ($relatedContributions as $contriId) {
- if ($contriId == $contributionId) {
- continue;
- }
- $statusId = CRM_Core_DAO::getFieldValue('CRM_Contribute_BAO_Contribution', $contriId, 'contribution_status_id');
- if (CRM_Core_PseudoConstant::getName('CRM_Contribute_BAO_Contribution', 'contribution_status_id', $statusId) === 'Completed') {
- $update = FALSE;
- }
- }
- if ($membership && $update) {
- $newStatus = array_search('Cancelled', $membershipStatuses);
-
- // Create activity
- $allStatus = CRM_Member_BAO_Membership::buildOptions('status_id', 'get');
- $activityParam = [
- 'subject' => "Status changed from {$allStatus[$membership->status_id]} to {$allStatus[$newStatus]}",
- 'source_contact_id' => CRM_Core_Session::singleton()->get('userID'),
- 'target_contact_id' => $membership->contact_id,
- 'source_record_id' => $membership->id,
- 'activity_type_id' => 'Change Membership Status',
- 'status_id' => 'Completed',
- 'priority_id' => 'Normal',
- 'activity_date_time' => 'now',
- ];
-
- $membership->status_id = $newStatus;
- $membership->is_override = TRUE;
- $membership->status_override_end_date = 'null';
- $membership->save();
- civicrm_api3('activity', 'create', $activityParam);
- }
- }
- }
-
if ($participant) {
$updatedStatusId = array_search('Cancelled', $participantStatuses);
CRM_Event_BAO_Participant::updateParticipantStatus($participant->id, $oldStatus, $updatedStatusId, TRUE);
return;
}
foreach ($connectedMemberships as $membershipID) {
- civicrm_api3('Membership', 'create', ['status_id' => 'Cancelled', 'id' => $membershipID, 'is_override' => 1]);
+ civicrm_api3('Membership', 'create', ['status_id' => 'Cancelled', 'id' => $membershipID, 'is_override' => 1, 'status_override_end_date' => 'null']);
}
}
<?php
+use Civi\Api4\Activity;
+use Civi\Api4\Contribution;
use Civi\Test\Api3TestTrait;
use Civi\Test\CiviEnvBuilder;
use Civi\Test\HeadlessInterface;
use Civi\Api4\PriceField;
use Civi\Api4\Participant;
use PHPUnit\Framework\TestCase;
+use Civi\Test\ContactTestTrait;
/**
* FIXME - Add test description.
class CancelTest extends TestCase implements HeadlessInterface, HookInterface, TransactionalInterface {
use Api3TestTrait;
+ use ContactTestTrait;
/**
* Created ids.
$this->assertEquals('', $afterPledge['pledge_total_paid']);
}
+ /**
+ * Test cancelling a contribution with a membership on the contribution edit
+ * form.
+ *
+ * @throws \API_Exception
+ * @throws \CRM_Core_Exception
+ * @throws \CiviCRM_API3_Exception
+ */
+ public function testCancelFromContributionForm(): void {
+ $this->createContact();
+ $this->createMembershipType();
+ $this->createMembershipOrder();
+ $this->createLoggedInUser();
+ $formValues = [
+ 'id' => $this->ids['Contribution'][0],
+ 'contact_id' => $this->ids['contact'][0],
+ 'contribution_status_id' => CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'contribution_status_id', 'Cancelled'),
+ ];
+ $form = new CRM_Contribute_Form_Contribution();
+ $_SERVER['REQUEST_METHOD'] = 'GET';
+ $form->controller = new CRM_Core_Controller();
+ $form->controller->setStateMachine(new CRM_Core_StateMachine($form->controller));
+ $form->testSubmit($formValues, CRM_Core_Action::UPDATE);
+
+ $contribution = Contribution::get()
+ ->addWhere('id', '=', $this->ids['Contribution'][0])
+ ->addSelect('contribution_status_id:name')
+ ->execute()->first();
+ $this->assertEquals('Cancelled', $contribution['contribution_status_id:name']);
+ $membership = $this->callAPISuccessGetSingle('Membership', []);
+ $this->assertEquals('Cancelled', CRM_Core_PseudoConstant::getName('CRM_Member_BAO_Membership', 'status_id', $membership['status_id']));
+ $activity = Activity::get()
+ ->addSelect('subject', 'source_record_id', 'status_id')
+ ->addWhere('activity_type_id:name', '=', 'Change Membership Status')
+ ->execute();
+ $this->assertCount(1, $activity);
+ $this->assertEquals('Status changed from Pending to Cancelled', $activity->first()['subject']);
+ }
+
/**
* Create an event and an order for a participant in that event.
*
*/
class CRM_Member_Form_MembershipTest extends CiviUnitTestCase {
+ use CRMTraits_Financial_OrderTrait;
+
protected $_individualId;
protected $_contribution;
protected $_financialTypeId = 1;
* @throws \CRM_Core_Exception
* @throws \CiviCRM_API3_Exception
*/
- public function testContributionFormStatusUpdate() {
+ public function testContributionFormStatusUpdate(): void {
- $this->_individualId = $this->createLoggedInUser();
- $membershipId = $this->contactMembershipCreate([
- 'contact_id' => $this->_individualId,
- 'membership_type_id' => $this->membershipTypeAnnualFixedID,
- 'status_id' => 'New',
- ]);
+ $this->_contactID = $this->createLoggedInUser();
+ $this->createContributionAndMembershipOrder();
$params = [
'total_amount' => 50,
'financial_type_id' => 2,
- 'contact_id' => $this->_individualId,
+ 'contact_id' => $this->_contactID,
'payment_instrument_id' => CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'payment_instrument_id', 'Check'),
'contribution_status_id' => CRM_Core_PseudoConstant::getKey('CRM_Contribute_BAO_Contribution', 'contribution_status_id', 'Cancelled'),
];
- $contriParams = [
- 'membership_id' => $membershipId,
- 'total_amount' => 50,
- 'financial_type_id' => 2,
- 'contact_id' => $this->_individualId,
- ];
- $contribution = CRM_Member_BAO_Membership::recordMembershipContribution($contriParams);
-
//Update Contribution to Cancelled.
$form = new CRM_Contribute_Form_Contribution();
- $form->_id = $params['id'] = $contribution->id;
+ $form->_id = $params['id'] = $this->ids['Contribution'][0];
$form->_mode = NULL;
$form->_contactID = $this->_individualId;
$form->testSubmit($params, CRM_Core_Action::UPDATE);
- $membership = $this->callAPISuccessGetSingle('Membership', ['contact_id' => $this->_individualId]);
+ $membership = $this->callAPISuccessGetSingle('Membership', ['contact_id' => $this->_contactID]);
//Assert membership status overrides when the contribution cancelled.
- $this->assertEquals($membership['is_override'], TRUE);
+ $this->assertEquals(TRUE, $membership['is_override']);
$this->assertEquals($membership['status_id'], $this->callAPISuccessGetValue('MembershipStatus', [
'return' => 'id',
'name' => 'Cancelled',
*
* @throws \CRM_Core_Exception
*/
- protected function createContributionAndMembershipOrder() {
+ protected function createContributionAndMembershipOrder(): void {
$this->ids['membership_type'][0] = $this->membershipTypeCreate();
$orderID = $this->callAPISuccess('Order', 'create', [
'financial_type_id' => 'Donation',
'contact_id' => $this->_contactID,
'membership_type_id' => 'General',
'source' => 'Payment',
+ // This is necessary because Membership_BAO otherwise ignores the
+ // pending status. I do have a fix but it's held up behind other pending-review PRs
+ // so this should be temporary until we get the membership PRs flowing.
+ 'skipStatusCal' => TRUE,
],
'line_item' => $this->getMembershipLineItem(),
],
/**
* Test Activity creation on cancellation of membership contribution.
+ *
+ * @throws \CRM_Core_Exception
+ * @throws \CiviCRM_API3_Exception
*/
- public function testActivityForCancelledContribution() {
+ public function testActivityForCancelledContribution(): void {
$contactId = $this->createLoggedInUser();
- $membershipID = $this->contactMembershipCreate($this->_params);
-
- $ContributionCreate = $this->callAPISuccess('Contribution', 'create', [
- 'financial_type_id' => 'Member Dues',
- 'total_amount' => 100,
- 'contact_id' => $this->_params['contact_id'],
- ]);
- $this->callAPISuccess('MembershipPayment', 'create', [
- 'sequential' => 1,
- 'contribution_id' => $ContributionCreate['id'],
- 'membership_id' => $membershipID,
- ]);
+ $this->createContributionAndMembershipOrder();
+ $membershipID = $this->callAPISuccessGetValue('MembershipPayment', ['return' => 'id']);
$form = new CRM_Contribute_Form_Contribution();
- $form->_id = $ContributionCreate['id'];
+ $form->_id = $this->ids['Contribution'][0];
$form->testSubmit([
'total_amount' => 100,
'financial_type_id' => 1,
$this->callAPISuccessGetSingle('Activity', [
'activity_type_id' => 'Membership Signup',
'source_record_id' => $membershipID,
- 'subject' => 'General - Payment - Status: test status',
+ 'subject' => 'General - Payment - Status: Pending',
]);
$this->callAPISuccessGetSingle('Activity', [
'activity_type_id' => 'Change Membership Status',