}
/**
- * Returns the membership types for a particular contact
- * who has lifetime membership without end date.
+ * Returns the membership types for a contact, optionally filtering to lifetime memberships only.
*
* @param int $contactID
* @param bool $isTest
*
* @return array
*/
- public static function getAllContactMembership($contactID, $isTest = FALSE, $onlyLifeTime = FALSE) {
+ public static function getAllContactMembership($contactID, $isTest = FALSE, $onlyLifeTime = FALSE) : array {
$contactMembershipType = [];
if (!$contactID) {
return $contactMembershipType;
}
- $dao = new CRM_Member_DAO_Membership();
- $dao->contact_id = $contactID;
- $pendingStatusId = array_search('Pending', CRM_Member_PseudoConstant::membershipStatus());
- $dao->whereAdd("status_id != $pendingStatusId");
-
- if ($isTest) {
- $dao->is_test = $isTest;
- }
- else {
- $dao->whereAdd('is_test IS NULL OR is_test = 0');
- }
+ $membershipQuery = \Civi\Api4\Membership::get(FALSE)
+ ->addWhere('contact_id', '=', $contactID)
+ ->addWhere('status_id:name', '<>', 'Pending')
+ ->addWhere('is_test', '=', $isTest)
+ //CRM-4297
+ ->addOrderBy('end_date', 'DESC');
if ($onlyLifeTime) {
- $dao->whereAdd('end_date IS NULL');
+ // membership#14 - use duration_unit for calculating lifetime, not join/end date.
+ $membershipQuery->addWhere('membership_type_id.duration_unit', '=', 'lifetime');
}
-
- $dao->find();
- while ($dao->fetch()) {
- $membership = [];
- CRM_Core_DAO::storeValues($dao, $membership);
- $contactMembershipType[$dao->membership_type_id] = $membership;
+ $memberships = $membershipQuery->execute();
+ foreach ($memberships as $membership) {
+ $contactMembershipType[$membership['membership_type_id']] = $membership;
}
return $contactMembershipType;
}
$this->contactDelete($contactId);
}
+ public function testGetAllContactMembership() {
+ $lifetimeTypeId = $this->membershipTypeCreate([
+ 'name' => 'Lifetime',
+ 'duration_unit' => 'lifetime',
+ ]);
+
+ // Contact 1 tests the "lifetimeOnly" code path.
+ $contactId = $this->individualCreate();
+
+ $pendingStatusId = array_search('Pending', CRM_Member_PseudoConstant::membershipStatus());
+ $cancelledStatusId = array_search('Cancelled', CRM_Member_PseudoConstant::membershipStatus());
+ $currentStatusId = array_search('Current', CRM_Member_PseudoConstant::membershipStatus());
+ $params = [
+ 'contact_id' => $contactId,
+ 'membership_type_id' => $this->_membershipTypeID,
+ 'source' => 'Payment',
+ 'is_override' => 1,
+ 'status_id' => $pendingStatusId,
+ ];
+
+ CRM_Member_BAO_Membership::create($params);
+ $membershipId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id', 'contact_id', 'Database check for created membership.');
+ $memberships = CRM_Member_BAO_Membership::getAllContactMembership($contactId, FALSE, TRUE);
+ $this->assertEmpty($memberships, 'Verify pending membership is NOT retrieved.');
+ $this->membershipDelete($membershipId);
+
+ $params['status_id'] = $cancelledStatusId;
+ CRM_Member_BAO_Membership::create($params);
+ $membershipId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id', 'contact_id', 'Database check for created membership.');
+ $memberships = CRM_Member_BAO_Membership::getAllContactMembership($contactId, FALSE, TRUE);
+ $this->assertEmpty($memberships, 'Verify cancelled membership is NOT retrieved.');
+ $this->membershipDelete($membershipId);
+
+ // Lifetime membership.
+ $params['status_id'] = $currentStatusId;
+ $params['membership_type_id'] = $lifetimeTypeId;
+ CRM_Member_BAO_Membership::create($params);
+ $membershipId = $this->assertDBNotNull('CRM_Member_BAO_Membership', $contactId, 'id', 'contact_id', 'Database check for created membership.');
+ $memberships = CRM_Member_BAO_Membership::getAllContactMembership($contactId, FALSE, TRUE);
+ $this->assertEquals($membershipId, $memberships[$lifetimeTypeId]['id'], 'Verify current (lifetime) membership IS retrieved.');
+ $this->membershipDelete($membershipId);
+
+ $this->contactDelete($contactId);
+ }
+
/**
* Get the contribution.
* page id from the membership record