mirror of
https://github.com/bitwarden/browser
synced 2025-12-12 14:23:32 +00:00
Remove consolidated billing feature flag (#11969)
This commit is contained in:
@@ -55,10 +55,6 @@ export class OrganizationLayoutComponent implements OnInit, OnDestroy {
|
|||||||
|
|
||||||
private _destroy = new Subject<void>();
|
private _destroy = new Subject<void>();
|
||||||
|
|
||||||
protected consolidatedBillingEnabled$ = this.configService.getFeatureFlag$(
|
|
||||||
FeatureFlag.EnableConsolidatedBilling,
|
|
||||||
);
|
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private route: ActivatedRoute,
|
private route: ActivatedRoute,
|
||||||
private organizationService: OrganizationService,
|
private organizationService: OrganizationService,
|
||||||
@@ -101,14 +97,9 @@ export class OrganizationLayoutComponent implements OnInit, OnDestroy {
|
|||||||
switchMap((organization) => this.providerService.get$(organization.providerId)),
|
switchMap((organization) => this.providerService.get$(organization.providerId)),
|
||||||
);
|
);
|
||||||
|
|
||||||
this.organizationIsUnmanaged$ = combineLatest([
|
this.organizationIsUnmanaged$ = combineLatest([this.organization$, provider$]).pipe(
|
||||||
this.consolidatedBillingEnabled$,
|
|
||||||
this.organization$,
|
|
||||||
provider$,
|
|
||||||
]).pipe(
|
|
||||||
map(
|
map(
|
||||||
([consolidatedBillingEnabled, organization, provider]) =>
|
([organization, provider]) =>
|
||||||
!consolidatedBillingEnabled ||
|
|
||||||
!organization.hasProvider ||
|
!organization.hasProvider ||
|
||||||
!provider ||
|
!provider ||
|
||||||
provider.providerStatus !== ProviderStatusType.Billable,
|
provider.providerStatus !== ProviderStatusType.Billable,
|
||||||
|
|||||||
@@ -4,22 +4,11 @@ import { ActivatedRouteSnapshot, CanActivateFn } from "@angular/router";
|
|||||||
import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction";
|
import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction";
|
||||||
import { ProviderService } from "@bitwarden/common/admin-console/abstractions/provider.service";
|
import { ProviderService } from "@bitwarden/common/admin-console/abstractions/provider.service";
|
||||||
import { ProviderStatusType } from "@bitwarden/common/admin-console/enums";
|
import { ProviderStatusType } from "@bitwarden/common/admin-console/enums";
|
||||||
import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum";
|
|
||||||
import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service";
|
|
||||||
|
|
||||||
export const organizationIsUnmanaged: CanActivateFn = async (route: ActivatedRouteSnapshot) => {
|
export const organizationIsUnmanaged: CanActivateFn = async (route: ActivatedRouteSnapshot) => {
|
||||||
const configService = inject(ConfigService);
|
|
||||||
const organizationService = inject(OrganizationService);
|
const organizationService = inject(OrganizationService);
|
||||||
const providerService = inject(ProviderService);
|
const providerService = inject(ProviderService);
|
||||||
|
|
||||||
const consolidatedBillingEnabled = await configService.getFeatureFlag(
|
|
||||||
FeatureFlag.EnableConsolidatedBilling,
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!consolidatedBillingEnabled) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
const organization = await organizationService.get(route.params.organizationId);
|
const organization = await organizationService.get(route.params.organizationId);
|
||||||
|
|
||||||
if (!organization.hasProvider) {
|
if (!organization.hasProvider) {
|
||||||
|
|||||||
@@ -60,10 +60,6 @@ export class OrganizationSubscriptionCloudComponent implements OnInit, OnDestroy
|
|||||||
protected readonly subscriptionHiddenIcon = SubscriptionHiddenIcon;
|
protected readonly subscriptionHiddenIcon = SubscriptionHiddenIcon;
|
||||||
protected readonly teamsStarter = ProductTierType.TeamsStarter;
|
protected readonly teamsStarter = ProductTierType.TeamsStarter;
|
||||||
|
|
||||||
protected enableConsolidatedBilling$ = this.configService.getFeatureFlag$(
|
|
||||||
FeatureFlag.EnableConsolidatedBilling,
|
|
||||||
);
|
|
||||||
|
|
||||||
protected enableUpgradePasswordManagerSub$ = this.configService.getFeatureFlag$(
|
protected enableUpgradePasswordManagerSub$ = this.configService.getFeatureFlag$(
|
||||||
FeatureFlag.EnableUpgradePasswordManagerSub,
|
FeatureFlag.EnableUpgradePasswordManagerSub,
|
||||||
);
|
);
|
||||||
@@ -124,8 +120,6 @@ export class OrganizationSubscriptionCloudComponent implements OnInit, OnDestroy
|
|||||||
this.locale = await firstValueFrom(this.i18nService.locale$);
|
this.locale = await firstValueFrom(this.i18nService.locale$);
|
||||||
this.userOrg = await this.organizationService.get(this.organizationId);
|
this.userOrg = await this.organizationService.get(this.organizationId);
|
||||||
|
|
||||||
const consolidatedBillingEnabled = await firstValueFrom(this.enableConsolidatedBilling$);
|
|
||||||
|
|
||||||
const isIndependentOrganizationOwner = !this.userOrg.hasProvider && this.userOrg.isOwner;
|
const isIndependentOrganizationOwner = !this.userOrg.hasProvider && this.userOrg.isOwner;
|
||||||
const isResoldOrganizationOwner = this.userOrg.hasReseller && this.userOrg.isOwner;
|
const isResoldOrganizationOwner = this.userOrg.hasReseller && this.userOrg.isOwner;
|
||||||
const isMSPUser = this.userOrg.hasProvider && this.userOrg.isProviderUser;
|
const isMSPUser = this.userOrg.hasProvider && this.userOrg.isProviderUser;
|
||||||
@@ -135,7 +129,7 @@ export class OrganizationSubscriptionCloudComponent implements OnInit, OnDestroy
|
|||||||
);
|
);
|
||||||
|
|
||||||
this.organizationIsManagedByConsolidatedBillingMSP =
|
this.organizationIsManagedByConsolidatedBillingMSP =
|
||||||
consolidatedBillingEnabled && this.userOrg.hasProvider && metadata.isManaged;
|
this.userOrg.hasProvider && metadata.isManaged;
|
||||||
|
|
||||||
this.showSubscription =
|
this.showSubscription =
|
||||||
isIndependentOrganizationOwner ||
|
isIndependentOrganizationOwner ||
|
||||||
|
|||||||
@@ -8,11 +8,9 @@ import { SearchService } from "@bitwarden/common/abstractions/search.service";
|
|||||||
import { OrganizationApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/organization/organization-api.service.abstraction";
|
import { OrganizationApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/organization/organization-api.service.abstraction";
|
||||||
import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction";
|
import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction";
|
||||||
import { ProviderService } from "@bitwarden/common/admin-console/abstractions/provider.service";
|
import { ProviderService } from "@bitwarden/common/admin-console/abstractions/provider.service";
|
||||||
import { ProviderUserType } from "@bitwarden/common/admin-console/enums";
|
import { ProviderStatusType, ProviderUserType } from "@bitwarden/common/admin-console/enums";
|
||||||
import { Organization } from "@bitwarden/common/admin-console/models/domain/organization";
|
import { Organization } from "@bitwarden/common/admin-console/models/domain/organization";
|
||||||
import { hasConsolidatedBilling } from "@bitwarden/common/billing/abstractions/provider-billing.service.abstraction";
|
|
||||||
import { PlanType } from "@bitwarden/common/billing/enums";
|
import { PlanType } from "@bitwarden/common/billing/enums";
|
||||||
import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service";
|
|
||||||
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
|
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
|
||||||
import { ValidationService } from "@bitwarden/common/platform/abstractions/validation.service";
|
import { ValidationService } from "@bitwarden/common/platform/abstractions/validation.service";
|
||||||
import { DialogService, ToastService } from "@bitwarden/components";
|
import { DialogService, ToastService } from "@bitwarden/components";
|
||||||
@@ -46,7 +44,6 @@ export class ClientsComponent extends BaseClientsComponent implements OnInit, On
|
|||||||
private apiService: ApiService,
|
private apiService: ApiService,
|
||||||
private organizationService: OrganizationService,
|
private organizationService: OrganizationService,
|
||||||
private organizationApiService: OrganizationApiServiceAbstraction,
|
private organizationApiService: OrganizationApiServiceAbstraction,
|
||||||
private configService: ConfigService,
|
|
||||||
activatedRoute: ActivatedRoute,
|
activatedRoute: ActivatedRoute,
|
||||||
dialogService: DialogService,
|
dialogService: DialogService,
|
||||||
i18nService: I18nService,
|
i18nService: I18nService,
|
||||||
@@ -72,9 +69,9 @@ export class ClientsComponent extends BaseClientsComponent implements OnInit, On
|
|||||||
switchMap((params) => {
|
switchMap((params) => {
|
||||||
this.providerId = params.providerId;
|
this.providerId = params.providerId;
|
||||||
return this.providerService.get$(this.providerId).pipe(
|
return this.providerService.get$(this.providerId).pipe(
|
||||||
hasConsolidatedBilling(this.configService),
|
map((provider) => provider?.providerStatus === ProviderStatusType.Billable),
|
||||||
map((hasConsolidatedBilling) => {
|
map((isBillable) => {
|
||||||
if (hasConsolidatedBilling) {
|
if (isBillable) {
|
||||||
return from(
|
return from(
|
||||||
this.router.navigate(["../manage-client-organizations"], {
|
this.router.navigate(["../manage-client-organizations"], {
|
||||||
relativeTo: this.activatedRoute,
|
relativeTo: this.activatedRoute,
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
<bit-nav-item
|
<bit-nav-item
|
||||||
icon="bwi-bank"
|
icon="bwi-bank"
|
||||||
[text]="'clients' | i18n"
|
[text]="'clients' | i18n"
|
||||||
[route]="(hasConsolidatedBilling$ | async) ? 'manage-client-organizations' : 'clients'"
|
[route]="(isBillable | async) ? 'manage-client-organizations' : 'clients'"
|
||||||
></bit-nav-item>
|
></bit-nav-item>
|
||||||
<bit-nav-group
|
<bit-nav-group
|
||||||
icon="bwi-sliders"
|
icon="bwi-sliders"
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
import { CommonModule } from "@angular/common";
|
import { CommonModule } from "@angular/common";
|
||||||
import { Component, OnDestroy, OnInit } from "@angular/core";
|
import { Component, OnDestroy, OnInit } from "@angular/core";
|
||||||
import { ActivatedRoute, RouterModule } from "@angular/router";
|
import { ActivatedRoute, RouterModule } from "@angular/router";
|
||||||
import { switchMap, Observable, Subject, combineLatest, map } from "rxjs";
|
import { combineLatest, map, Observable, Subject, switchMap } from "rxjs";
|
||||||
import { takeUntil } from "rxjs/operators";
|
import { takeUntil } from "rxjs/operators";
|
||||||
|
|
||||||
import { JslibModule } from "@bitwarden/angular/jslib.module";
|
import { JslibModule } from "@bitwarden/angular/jslib.module";
|
||||||
import { ProviderService } from "@bitwarden/common/admin-console/abstractions/provider.service";
|
import { ProviderService } from "@bitwarden/common/admin-console/abstractions/provider.service";
|
||||||
|
import { ProviderStatusType } from "@bitwarden/common/admin-console/enums";
|
||||||
import { Provider } from "@bitwarden/common/admin-console/models/domain/provider";
|
import { Provider } from "@bitwarden/common/admin-console/models/domain/provider";
|
||||||
import { hasConsolidatedBilling } from "@bitwarden/common/billing/abstractions/provider-billing.service.abstraction";
|
|
||||||
import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum";
|
import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum";
|
||||||
import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service";
|
import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service";
|
||||||
import { BannerModule, IconModule, LinkModule } from "@bitwarden/components";
|
import { BannerModule, IconModule, LinkModule } from "@bitwarden/components";
|
||||||
@@ -36,7 +36,7 @@ export class ProvidersLayoutComponent implements OnInit, OnDestroy {
|
|||||||
private destroy$ = new Subject<void>();
|
private destroy$ = new Subject<void>();
|
||||||
protected provider$: Observable<Provider>;
|
protected provider$: Observable<Provider>;
|
||||||
|
|
||||||
protected hasConsolidatedBilling$: Observable<boolean>;
|
protected isBillable: Observable<boolean>;
|
||||||
protected canAccessBilling$: Observable<boolean>;
|
protected canAccessBilling$: Observable<boolean>;
|
||||||
|
|
||||||
protected showProviderClientVaultPrivacyWarningBanner$ = this.configService.getFeatureFlag$(
|
protected showProviderClientVaultPrivacyWarningBanner$ = this.configService.getFeatureFlag$(
|
||||||
@@ -58,12 +58,12 @@ export class ProvidersLayoutComponent implements OnInit, OnDestroy {
|
|||||||
takeUntil(this.destroy$),
|
takeUntil(this.destroy$),
|
||||||
);
|
);
|
||||||
|
|
||||||
this.hasConsolidatedBilling$ = this.provider$.pipe(
|
this.isBillable = this.provider$.pipe(
|
||||||
hasConsolidatedBilling(this.configService),
|
map((provider) => provider?.providerStatus === ProviderStatusType.Billable),
|
||||||
takeUntil(this.destroy$),
|
takeUntil(this.destroy$),
|
||||||
);
|
);
|
||||||
|
|
||||||
this.canAccessBilling$ = combineLatest([this.hasConsolidatedBilling$, this.provider$]).pipe(
|
this.canAccessBilling$ = combineLatest([this.isBillable, this.provider$]).pipe(
|
||||||
map(
|
map(
|
||||||
([hasConsolidatedBilling, provider]) => hasConsolidatedBilling && provider.isProviderAdmin,
|
([hasConsolidatedBilling, provider]) => hasConsolidatedBilling && provider.isProviderAdmin,
|
||||||
),
|
),
|
||||||
|
|||||||
@@ -24,13 +24,11 @@
|
|||||||
<bit-form-field>
|
<bit-form-field>
|
||||||
<bit-label>{{ "billingEmail" | i18n }}</bit-label>
|
<bit-label>{{ "billingEmail" | i18n }}</bit-label>
|
||||||
<input type="email" bitInput formControlName="billingEmail" />
|
<input type="email" bitInput formControlName="billingEmail" />
|
||||||
<bit-hint *ngIf="enableConsolidatedBilling$ | async">{{
|
<bit-hint>{{ "providerBillingEmailHint" | i18n }}</bit-hint>
|
||||||
"providerBillingEmailHint" | i18n
|
|
||||||
}}</bit-hint>
|
|
||||||
</bit-form-field>
|
</bit-form-field>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<app-manage-tax-information *ngIf="enableConsolidatedBilling$ | async" />
|
<app-manage-tax-information />
|
||||||
<button bitButton bitFormButton buttonType="primary" type="submit">
|
<button bitButton bitFormButton buttonType="primary" type="submit">
|
||||||
{{ "submit" | i18n }}
|
{{ "submit" | i18n }}
|
||||||
</button>
|
</button>
|
||||||
|
|||||||
@@ -1,14 +1,13 @@
|
|||||||
import { Component, OnDestroy, OnInit, ViewChild } from "@angular/core";
|
import { Component, OnDestroy, OnInit, ViewChild } from "@angular/core";
|
||||||
import { FormBuilder, Validators } from "@angular/forms";
|
import { FormBuilder, Validators } from "@angular/forms";
|
||||||
import { ActivatedRoute, Router } from "@angular/router";
|
import { ActivatedRoute, Router } from "@angular/router";
|
||||||
import { firstValueFrom, Subject, switchMap } from "rxjs";
|
import { Subject, switchMap } from "rxjs";
|
||||||
import { first, takeUntil } from "rxjs/operators";
|
import { first, takeUntil } from "rxjs/operators";
|
||||||
|
|
||||||
import { ManageTaxInformationComponent } from "@bitwarden/angular/billing/components";
|
import { ManageTaxInformationComponent } from "@bitwarden/angular/billing/components";
|
||||||
import { ProviderApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/provider/provider-api.service.abstraction";
|
import { ProviderApiServiceAbstraction } from "@bitwarden/common/admin-console/abstractions/provider/provider-api.service.abstraction";
|
||||||
import { ProviderSetupRequest } from "@bitwarden/common/admin-console/models/request/provider/provider-setup.request";
|
import { ProviderSetupRequest } from "@bitwarden/common/admin-console/models/request/provider/provider-setup.request";
|
||||||
import { ExpandedTaxInfoUpdateRequest } from "@bitwarden/common/billing/models/request/expanded-tax-info-update.request";
|
import { ExpandedTaxInfoUpdateRequest } from "@bitwarden/common/billing/models/request/expanded-tax-info-update.request";
|
||||||
import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum";
|
|
||||||
import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service";
|
import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service";
|
||||||
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
|
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
|
||||||
import { ValidationService } from "@bitwarden/common/platform/abstractions/validation.service";
|
import { ValidationService } from "@bitwarden/common/platform/abstractions/validation.service";
|
||||||
@@ -34,10 +33,6 @@ export class SetupComponent implements OnInit, OnDestroy {
|
|||||||
billingEmail: ["", [Validators.required, Validators.email]],
|
billingEmail: ["", [Validators.required, Validators.email]],
|
||||||
});
|
});
|
||||||
|
|
||||||
protected enableConsolidatedBilling$ = this.configService.getFeatureFlag$(
|
|
||||||
FeatureFlag.EnableConsolidatedBilling,
|
|
||||||
);
|
|
||||||
|
|
||||||
private destroy$ = new Subject<void>();
|
private destroy$ = new Subject<void>();
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
@@ -112,13 +107,9 @@ export class SetupComponent implements OnInit, OnDestroy {
|
|||||||
|
|
||||||
submit = async () => {
|
submit = async () => {
|
||||||
try {
|
try {
|
||||||
const consolidatedBillingEnabled = await firstValueFrom(this.enableConsolidatedBilling$);
|
|
||||||
|
|
||||||
this.formGroup.markAllAsTouched();
|
this.formGroup.markAllAsTouched();
|
||||||
|
|
||||||
const formIsValid = consolidatedBillingEnabled
|
const formIsValid = this.formGroup.valid && this.manageTaxInformationComponent.touch();
|
||||||
? this.formGroup.valid && this.manageTaxInformationComponent.touch()
|
|
||||||
: this.formGroup.valid;
|
|
||||||
|
|
||||||
if (!formIsValid) {
|
if (!formIsValid) {
|
||||||
return;
|
return;
|
||||||
@@ -133,19 +124,18 @@ export class SetupComponent implements OnInit, OnDestroy {
|
|||||||
request.token = this.token;
|
request.token = this.token;
|
||||||
request.key = key;
|
request.key = key;
|
||||||
|
|
||||||
if (consolidatedBillingEnabled) {
|
request.taxInfo = new ExpandedTaxInfoUpdateRequest();
|
||||||
request.taxInfo = new ExpandedTaxInfoUpdateRequest();
|
const taxInformation = this.manageTaxInformationComponent.getTaxInformation();
|
||||||
const taxInformation = this.manageTaxInformationComponent.getTaxInformation();
|
|
||||||
|
|
||||||
request.taxInfo.country = taxInformation.country;
|
request.taxInfo.country = taxInformation.country;
|
||||||
request.taxInfo.postalCode = taxInformation.postalCode;
|
request.taxInfo.postalCode = taxInformation.postalCode;
|
||||||
if (taxInformation.includeTaxId) {
|
|
||||||
request.taxInfo.taxId = taxInformation.taxId;
|
if (taxInformation.includeTaxId) {
|
||||||
request.taxInfo.line1 = taxInformation.line1;
|
request.taxInfo.taxId = taxInformation.taxId;
|
||||||
request.taxInfo.line2 = taxInformation.line2;
|
request.taxInfo.line1 = taxInformation.line1;
|
||||||
request.taxInfo.city = taxInformation.city;
|
request.taxInfo.line2 = taxInformation.line2;
|
||||||
request.taxInfo.state = taxInformation.state;
|
request.taxInfo.city = taxInformation.city;
|
||||||
}
|
request.taxInfo.state = taxInformation.state;
|
||||||
}
|
}
|
||||||
|
|
||||||
const provider = await this.providerApiService.postProviderSetup(this.providerId, request);
|
const provider = await this.providerApiService.postProviderSetup(this.providerId, request);
|
||||||
|
|||||||
@@ -6,13 +6,11 @@ import { switchMap } from "rxjs/operators";
|
|||||||
|
|
||||||
import { SearchService } from "@bitwarden/common/abstractions/search.service";
|
import { SearchService } from "@bitwarden/common/abstractions/search.service";
|
||||||
import { ProviderService } from "@bitwarden/common/admin-console/abstractions/provider.service";
|
import { ProviderService } from "@bitwarden/common/admin-console/abstractions/provider.service";
|
||||||
import { ProviderUserType } from "@bitwarden/common/admin-console/enums";
|
import { ProviderStatusType, ProviderUserType } from "@bitwarden/common/admin-console/enums";
|
||||||
import { Provider } from "@bitwarden/common/admin-console/models/domain/provider";
|
import { Provider } from "@bitwarden/common/admin-console/models/domain/provider";
|
||||||
import { ProviderOrganizationOrganizationDetailsResponse } from "@bitwarden/common/admin-console/models/response/provider/provider-organization.response";
|
import { ProviderOrganizationOrganizationDetailsResponse } from "@bitwarden/common/admin-console/models/response/provider/provider-organization.response";
|
||||||
import { BillingApiServiceAbstraction as BillingApiService } from "@bitwarden/common/billing/abstractions/billing-api.service.abstraction";
|
import { BillingApiServiceAbstraction as BillingApiService } from "@bitwarden/common/billing/abstractions/billing-api.service.abstraction";
|
||||||
import { hasConsolidatedBilling } from "@bitwarden/common/billing/abstractions/provider-billing.service.abstraction";
|
|
||||||
import { PlanResponse } from "@bitwarden/common/billing/models/response/plan.response";
|
import { PlanResponse } from "@bitwarden/common/billing/models/response/plan.response";
|
||||||
import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service";
|
|
||||||
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
|
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
|
||||||
import { ValidationService } from "@bitwarden/common/platform/abstractions/validation.service";
|
import { ValidationService } from "@bitwarden/common/platform/abstractions/validation.service";
|
||||||
import { DialogService, ToastService } from "@bitwarden/components";
|
import { DialogService, ToastService } from "@bitwarden/components";
|
||||||
@@ -47,7 +45,6 @@ export class ManageClientsComponent extends BaseClientsComponent {
|
|||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private billingApiService: BillingApiService,
|
private billingApiService: BillingApiService,
|
||||||
private configService: ConfigService,
|
|
||||||
private providerService: ProviderService,
|
private providerService: ProviderService,
|
||||||
private router: Router,
|
private router: Router,
|
||||||
activatedRoute: ActivatedRoute,
|
activatedRoute: ActivatedRoute,
|
||||||
@@ -73,9 +70,9 @@ export class ManageClientsComponent extends BaseClientsComponent {
|
|||||||
switchMap((params) => {
|
switchMap((params) => {
|
||||||
this.providerId = params.providerId;
|
this.providerId = params.providerId;
|
||||||
return this.providerService.get$(this.providerId).pipe(
|
return this.providerService.get$(this.providerId).pipe(
|
||||||
hasConsolidatedBilling(this.configService),
|
map((provider) => provider?.providerStatus === ProviderStatusType.Billable),
|
||||||
map((hasConsolidatedBilling) => {
|
map((isBillable) => {
|
||||||
if (!hasConsolidatedBilling) {
|
if (!isBillable) {
|
||||||
return from(
|
return from(
|
||||||
this.router.navigate(["../clients"], {
|
this.router.navigate(["../clients"], {
|
||||||
relativeTo: this.activatedRoute,
|
relativeTo: this.activatedRoute,
|
||||||
|
|||||||
@@ -4,24 +4,13 @@ import { firstValueFrom } from "rxjs";
|
|||||||
|
|
||||||
import { ProviderService } from "@bitwarden/common/admin-console/abstractions/provider.service";
|
import { ProviderService } from "@bitwarden/common/admin-console/abstractions/provider.service";
|
||||||
import { ProviderStatusType } from "@bitwarden/common/admin-console/enums";
|
import { ProviderStatusType } from "@bitwarden/common/admin-console/enums";
|
||||||
import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum";
|
|
||||||
import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service";
|
|
||||||
|
|
||||||
export const hasConsolidatedBilling: CanActivateFn = async (route: ActivatedRouteSnapshot) => {
|
export const hasConsolidatedBilling: CanActivateFn = async (route: ActivatedRouteSnapshot) => {
|
||||||
const configService = inject(ConfigService);
|
|
||||||
const providerService = inject(ProviderService);
|
const providerService = inject(ProviderService);
|
||||||
|
|
||||||
const provider = await firstValueFrom(providerService.get$(route.params.providerId));
|
const provider = await firstValueFrom(providerService.get$(route.params.providerId));
|
||||||
|
|
||||||
const consolidatedBillingEnabled = await configService.getFeatureFlag(
|
if (!provider || provider.providerStatus !== ProviderStatusType.Billable) {
|
||||||
FeatureFlag.EnableConsolidatedBilling,
|
|
||||||
);
|
|
||||||
|
|
||||||
if (
|
|
||||||
!consolidatedBillingEnabled ||
|
|
||||||
!provider ||
|
|
||||||
provider.providerStatus !== ProviderStatusType.Billable
|
|
||||||
) {
|
|
||||||
return createUrlTreeFromSnapshot(route, ["/providers", route.params.providerId]);
|
return createUrlTreeFromSnapshot(route, ["/providers", route.params.providerId]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
export * from "./account/billing-account-profile-state.service";
|
export * from "./account/billing-account-profile-state.service";
|
||||||
export * from "./billing-api.service.abstraction";
|
export * from "./billing-api.service.abstraction";
|
||||||
export * from "./organization-billing.service";
|
export * from "./organization-billing.service";
|
||||||
export * from "./provider-billing.service.abstraction";
|
|
||||||
|
|||||||
@@ -1,23 +0,0 @@
|
|||||||
import { map, Observable, OperatorFunction, switchMap } from "rxjs";
|
|
||||||
|
|
||||||
import { ProviderStatusType } from "@bitwarden/common/admin-console/enums";
|
|
||||||
import { Provider } from "@bitwarden/common/admin-console/models/domain/provider";
|
|
||||||
import { FeatureFlag } from "@bitwarden/common/enums/feature-flag.enum";
|
|
||||||
import { ConfigService } from "@bitwarden/common/platform/abstractions/config/config.service";
|
|
||||||
|
|
||||||
type MaybeProvider = Provider | undefined;
|
|
||||||
|
|
||||||
export const hasConsolidatedBilling = (
|
|
||||||
configService: ConfigService,
|
|
||||||
): OperatorFunction<MaybeProvider, boolean> =>
|
|
||||||
switchMap<MaybeProvider, Observable<boolean>>((provider) =>
|
|
||||||
configService
|
|
||||||
.getFeatureFlag$(FeatureFlag.EnableConsolidatedBilling)
|
|
||||||
.pipe(
|
|
||||||
map((consolidatedBillingEnabled) =>
|
|
||||||
provider
|
|
||||||
? provider.providerStatus === ProviderStatusType.Billable && consolidatedBillingEnabled
|
|
||||||
: false,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
@@ -7,7 +7,6 @@ export enum FeatureFlag {
|
|||||||
BrowserFilelessImport = "browser-fileless-import",
|
BrowserFilelessImport = "browser-fileless-import",
|
||||||
ItemShare = "item-share",
|
ItemShare = "item-share",
|
||||||
GeneratorToolsModernization = "generator-tools-modernization",
|
GeneratorToolsModernization = "generator-tools-modernization",
|
||||||
EnableConsolidatedBilling = "enable-consolidated-billing",
|
|
||||||
AC1795_UpdatedSubscriptionStatusSection = "AC-1795_updated-subscription-status-section",
|
AC1795_UpdatedSubscriptionStatusSection = "AC-1795_updated-subscription-status-section",
|
||||||
ExtensionRefresh = "extension-refresh",
|
ExtensionRefresh = "extension-refresh",
|
||||||
PersistPopupView = "persist-popup-view",
|
PersistPopupView = "persist-popup-view",
|
||||||
@@ -59,7 +58,6 @@ export const DefaultFeatureFlagValue = {
|
|||||||
[FeatureFlag.BrowserFilelessImport]: FALSE,
|
[FeatureFlag.BrowserFilelessImport]: FALSE,
|
||||||
[FeatureFlag.ItemShare]: FALSE,
|
[FeatureFlag.ItemShare]: FALSE,
|
||||||
[FeatureFlag.GeneratorToolsModernization]: FALSE,
|
[FeatureFlag.GeneratorToolsModernization]: FALSE,
|
||||||
[FeatureFlag.EnableConsolidatedBilling]: FALSE,
|
|
||||||
[FeatureFlag.AC1795_UpdatedSubscriptionStatusSection]: FALSE,
|
[FeatureFlag.AC1795_UpdatedSubscriptionStatusSection]: FALSE,
|
||||||
[FeatureFlag.ExtensionRefresh]: FALSE,
|
[FeatureFlag.ExtensionRefresh]: FALSE,
|
||||||
[FeatureFlag.PersistPopupView]: FALSE,
|
[FeatureFlag.PersistPopupView]: FALSE,
|
||||||
|
|||||||
Reference in New Issue
Block a user