From 7b94d6ab2b35ba65f294454daa6de7901be81015 Mon Sep 17 00:00:00 2001 From: Alex Morask <144709477+amorask-bitwarden@users.noreply.github.com> Date: Wed, 1 Oct 2025 10:28:47 -0500 Subject: [PATCH] [PM-18717] Fix multiple organization situation for Free Families Policy sponsorship (#16611) * Resolve multiple org situation * Fix multi org policy mismatch issue --- .../services/free-families-policy.service.ts | 35 ++++++------------- 1 file changed, 11 insertions(+), 24 deletions(-) diff --git a/apps/web/src/app/billing/services/free-families-policy.service.ts b/apps/web/src/app/billing/services/free-families-policy.service.ts index 7a8e3804b2c..52041936e50 100644 --- a/apps/web/src/app/billing/services/free-families-policy.service.ts +++ b/apps/web/src/app/billing/services/free-families-policy.service.ts @@ -19,12 +19,6 @@ interface EnterpriseOrgStatus { @Injectable({ providedIn: "root" }) export class FreeFamiliesPolicyService { - protected enterpriseOrgStatus: EnterpriseOrgStatus = { - isFreeFamilyPolicyEnabled: false, - belongToOneEnterpriseOrgs: false, - belongToMultipleEnterpriseOrgs: false, - }; - constructor( private policyService: PolicyService, private organizationService: OrganizationService, @@ -104,9 +98,11 @@ export class FreeFamiliesPolicyService { if (!orgStatus) { return false; } - const { belongToOneEnterpriseOrgs, isFreeFamilyPolicyEnabled } = orgStatus; + const { isFreeFamilyPolicyEnabled } = orgStatus; const hasSponsorshipOrgs = organizations.some((org) => org.canManageSponsorships); - return hasSponsorshipOrgs && !(belongToOneEnterpriseOrgs && isFreeFamilyPolicyEnabled); + + // Hide if ANY organization has the policy enabled + return hasSponsorshipOrgs && !isFreeFamilyPolicyEnabled; } checkEnterpriseOrganizationsAndFetchPolicy(): Observable { @@ -122,16 +118,12 @@ export class FreeFamiliesPolicyService { const { belongToOneEnterpriseOrgs, belongToMultipleEnterpriseOrgs } = this.evaluateEnterpriseOrganizations(organizations); - if (!belongToOneEnterpriseOrgs) { - return of({ - isFreeFamilyPolicyEnabled: false, - belongToOneEnterpriseOrgs, - belongToMultipleEnterpriseOrgs, - }); - } + // Get all enterprise organization IDs + const enterpriseOrgIds = organizations + .filter((org) => org.canManageSponsorships) + .map((org) => org.id); - const organizationId = this.getOrganizationIdForOneEnterprise(organizations); - if (!organizationId) { + if (enterpriseOrgIds.length === 0) { return of({ isFreeFamilyPolicyEnabled: false, belongToOneEnterpriseOrgs, @@ -145,8 +137,8 @@ export class FreeFamiliesPolicyService { this.policyService.policiesByType$(PolicyType.FreeFamiliesSponsorshipPolicy, userId), ), map((policies) => ({ - isFreeFamilyPolicyEnabled: policies.some( - (policy) => policy.organizationId === organizationId && policy.enabled, + isFreeFamilyPolicyEnabled: enterpriseOrgIds.every((orgId) => + policies.some((policy) => policy.organizationId === orgId && policy.enabled), ), belongToOneEnterpriseOrgs, belongToMultipleEnterpriseOrgs, @@ -166,9 +158,4 @@ export class FreeFamiliesPolicyService { belongToMultipleEnterpriseOrgs: count > 1, }; } - - private getOrganizationIdForOneEnterprise(organizations: any[]): string | null { - const enterpriseOrganizations = organizations.filter((org) => org.canManageSponsorships); - return enterpriseOrganizations.length === 1 ? enterpriseOrganizations[0].id : null; - } }