diff --git a/src/CivicrmMemberRoles.php b/src/CivicrmMemberRoles.php index c6786c7..8b2b919 100644 --- a/src/CivicrmMemberRoles.php +++ b/src/CivicrmMemberRoles.php @@ -289,13 +289,21 @@ class CivicrmMemberRoles { public function syncContact($cid, AccountInterface $account) { $rules = $this->getRules(); $memberships = $this->getContactMemberships($cid); + $currentStatuses = $this->getCurrentStatusForRules($rules); // CRM-16000 remove inactive memberships if member has both active and // inactive memberships. if (count($memberships) > 1) { - $memberships = array_filter($memberships, function ($item) { - return !in_array($item['status_id'], $this->getInactiveStatusIds()); - }); + foreach ($memberships as $key => $membership) { + // Do not unset if inactive membership status is chosen as an option for synchronization. + $inactiveStatusSync = FALSE; + if (isset($currentStatuses[$membership['membership_type_id']]) && in_array($membership['status_id'], $currentStatuses[$membership['membership_type_id']])) { + $inactiveStatusSync = TRUE; + } + if (in_array($membership['status_id'], $this->getInactiveStatusIds()) && !$inactiveStatusSync) { + unset($memberships[$key]); + } + } } // The inital set of roles assigned to the user. @@ -416,6 +424,24 @@ class CivicrmMemberRoles { return array_unique($roles); } + + /** + * Get rules with current status for each membership types. + * + * @param \Drupal\civicrm_member_roles\Entity\CivicrmMemberRoleRuleInterface[] $rules + * Assignment rules. + * + * @return array + * The rules with current status values. + */ + protected function getCurrentStatusForRules(array $rules) { + $status = []; + foreach ($rules as $rule) { + $status[$rule->getType()] = $rule->getCurrentStatuses(); + } + return $status; + } + /** * Gets roles to expire for a contact's memberships. *