return NULL;
}
+ // retrieve existing activity based on source_record_id and activity_type
+ if (empty($params['id'])) {
+ $params['id'] = CRM_Utils_Array::value('id', civicrm_api3('Activity', 'Get', array(
+ 'source_record_id' => $activity->id,
+ 'activity_type_id' => $activityType,
+ )));
+ }
+
$date = CRM_Utils_Date::isoToMysql($activity->receive_date);
$activityType = $component = 'Contribution';
}
if (empty($contribution->contact_id)) {
$contribution->find(TRUE);
}
- CRM_Activity_BAO_Activity::addActivity($contribution, 'Offline');
+ CRM_Activity_BAO_Activity::addActivity($contribution, 'Contribution');
// do not add to recent items for import, CRM-4399
if (empty($params['skipRecentView'])) {
}
if ($currentMembership) {
+ $oldStatus = $currentMembership['status_id'];
CRM_Member_BAO_Membership::fixMembershipStatusBeforeRenew($currentMembership, NULL);
$dates = CRM_Member_BAO_MembershipType::getRenewalDatesForMembershipType($membership->id, NULL, NULL, $numterms);
$dates['join_date'] = CRM_Utils_Date::customFormat($currentMembership['join_date'], $format);
//update related Memberships.
CRM_Member_BAO_Membership::updateRelatedMemberships($membership->id, $formattedParams);
- //CRM-19678: No Membership Renewal Activity is created when a Pay Later is set to Completed
- CRM_Activity_BAO_Activity::addActivity($membership, 'Membership Renewal', $membership->contact_id);
+ foreach (array('Membership Signup', 'Membership Renewal') as $activityType) {
+ $scheduledActivityID = CRM_Utils_Array::value('id',
+ civicrm_api3('Activity', 'Get',
+ array(
+ 'source_record_id' => $membership->id,
+ 'activity_type_id' => $activityType,
+ 'status_id' => 'Scheduled',
+ )
+ )
+ );
+ // 1. Update Schedule Membership Signup/Renwal activity to completed on successful payment of pending membership
+ // 2. OR Create renewal activity scheduled if its membership renewal will be paid later
+ if ($scheduledActivityID) {
+ CRM_Activity_BAO_Activity::addActivity($membership, $activityType, $membership->contact_id, array('id' => $scheduledActivityID));
+ break;
+ }
+ }
+
+ // track membership status change if any
+ if (!empty($oldStatus) && $membership->status_id != $oldStatus) {
+ $allStatus = CRM_Member_BAO_Membership::buildOptions('status_id', 'get');
+ CRM_Activity_BAO_Activity::addActivity($membership,
+ 'Change Membership Status',
+ NULL,
+ array(
+ 'subject' => "Status changed from {$allStatus[$oldStatus]} to {$allStatus[$membership->status_id]}",
+ 'source_contact_id' => $membershipLog['modified_id'],
+ 'priority_id' => 2,
+ )
+ );
+ }
$updateResult['membership_end_date'] = CRM_Utils_Date::customFormat($dates['end_date'],
'%B %E%f, %Y'
// reset the group contact cache since smart groups might be affected due to this
CRM_Contact_BAO_GroupContactCache::opportunisticCacheFlush();
+ $activityParams = array();
+ $allStatus = CRM_Member_BAO_Membership::buildOptions('status_id', 'get');
+ if (!empty($params['is_pay_later']) ||
+ in_array($allStatus[$membership->status_id], array('Pending', 'Grace'))
+ ) {
+ $activityParams['status_id'] = CRM_Core_OptionGroup::getValue('activity_status', 'Scheduled', 'name');
+ }
+
$targetContactID = $membership->contact_id;
if (!empty($params['is_for_organization'])) {
$targetContactID = CRM_Utils_Array::value('userId', $ids);
}
if ($id) {
if ($membership->status_id != $oldStatus) {
- $allStatus = CRM_Member_BAO_Membership::buildOptions('status_id', 'get');
CRM_Activity_BAO_Activity::addActivity($membership,
'Change Membership Status',
NULL,
)
);
}
- // via Contribution.completeOrder membership.create is called again to ensure correct data has been
- // copied to the related membership. but there is a sideffect of this new membership workflow as a
- // 'Membership Renewal' Activity is created. We can avoid this on basis of is_override=FALSE condition
- if (CRM_Utils_Array::value('is_override', $params) != 'null') {
- CRM_Activity_BAO_Activity::addActivity($membership, 'Membership Renewal', $targetContactID);
+
+ foreach (array('Membership Signup', 'Membership Renewal') as $activityType) {
+ $activityParams['id'] = CRM_Utils_Array::value('id',
+ civicrm_api3('Activity', 'Get',
+ array(
+ 'source_record_id' => $membership->id,
+ 'activity_type_id' => $activityType,
+ 'status_id' => 'Scheduled',
+ )
+ )
+ );
+ // 1. Update Schedule Membership Signup/Renwal activity to completed on successful payment of pending membership
+ // 2. OR Create renewal activity scheduled if its membership renewal will be paid later
+ if (!empty($activityParams['id']) || $activityType == 'Membership Renewal') {
+ CRM_Activity_BAO_Activity::addActivity($membership, $activityType, $targetContactID, $activityParams);
+ break;
+ }
}
+
CRM_Utils_Hook::post('edit', 'Membership', $membership->id, $membership);
}
else {
- CRM_Activity_BAO_Activity::addActivity($membership, 'Membership Signup', $targetContactID);
+ CRM_Activity_BAO_Activity::addActivity($membership, 'Membership Signup', $targetContactID, $activityParams);
CRM_Utils_Hook::post('create', 'Membership', $membership->id, $membership);
}
}
//avoid pending membership as current membership: CRM-3027
- $statusIds[] = array_search('Pending', CRM_Member_PseudoConstant::membershipStatus());
+ $statusIds = array(array_search('Pending', CRM_Member_PseudoConstant::membershipStatus()));
if (!$membershipId) {
// CRM-15475
$statusIds[] = array_search(
'join_date' => $currentMembership['join_date'],
'membership_type_id' => $membershipTypeID,
'max_related' => !empty($membershipTypeDetails['max_related']) ? $membershipTypeDetails['max_related'] : NULL,
+ 'is_pay_later' => $isPayLater,
);
if ($contributionRecurID) {
$memParams['contribution_recur_id'] = $contributionRecurID;
);
$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 (Pay later) 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 1: Assert that Membership Renewal Activity is created on Pending (Pay later) to Completed Contribution via backoffice
- $activity = $this->callAPISuccess('Activity', 'get', array(
- 'activity_type_id' => 'Membership Renewal',
- 'source_record_id' => $this->_ids['contribution'],
- ));
- $this->assertEquals(1, $activity['count']);
-
- // Case 2: Assert that Membership Signup Activity is created on Pending (Pay later) Contribution on current membership
- $this->setUpPendingContribution($this->_ids['price_field_value'][0], array('trxn_id' => 'xoa12', 'invoice_id' => '12mv'));
+ // Case 2: After successful payment for Pending (Pay later) 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 Signup',
- 'source_record_id' => $this->_ids['contribution'],
+ 'source_record_id' => $this->_ids['membership'],
+ 'status_id' => 'Completed',
));
$this->assertEquals(1, $activity['count']);
- // Case 3: Assert that no Membership Renewal Activity is created on Pending (Pay later) Contribution on current membership
+ // 2.b Contribution activity created to record successful payment
$activity = $this->callAPISuccess('Activity', 'get', array(
- 'activity_type_id' => 'Membership Renewal',
+ 'activity_type_id' => 'Contribution',
'source_record_id' => $this->_ids['contribution'],
+ 'status_id' => 'Completed',
));
- $this->assertEquals(0, $activity['count']);
-
- //Case 4 (CRM-19600): Assert that Membership Renewal Activity is created via online contribution
- $this->callAPISuccess('contribution', 'completetransaction', array('id' => $this->_ids['contribution']));
+ $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' => 'Membership Renewal',
- 'source_record_id' => $this->_ids['contribution'],
+ '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']);
}
/**