From e00c8cc4573c95fdef1c6a12f00d11452142d0ad Mon Sep 17 00:00:00 2001 From: Jonas Hendrickx Date: Mon, 24 Mar 2025 10:52:22 +0000 Subject: [PATCH] [PM-19431] Organization plan change upgrade path not applying correct automatic tax flag --- src/Core/Billing/Services/IAutomaticTaxFactory.cs | 3 +++ .../AutomaticTax/AutomaticTaxFactory.cs | 15 +++++++++------ .../BusinessUseAutomaticTaxStrategy.cs | 13 ++++++++++++- .../PersonalUseAutomaticTaxStrategy.cs | 12 +++++++++++- src/Core/Constants.cs | 1 + .../Implementations/StripePaymentService.cs | 2 +- 6 files changed, 37 insertions(+), 9 deletions(-) diff --git a/src/Core/Billing/Services/IAutomaticTaxFactory.cs b/src/Core/Billing/Services/IAutomaticTaxFactory.cs index 3c853ac0d6..c52a8f2671 100644 --- a/src/Core/Billing/Services/IAutomaticTaxFactory.cs +++ b/src/Core/Billing/Services/IAutomaticTaxFactory.cs @@ -2,6 +2,9 @@ namespace Bit.Core.Billing.Services; +/// +/// Responsible for defining the correct automatic tax strategy for either personal use of business use. +/// public interface IAutomaticTaxFactory { Task CreateAsync(AutomaticTaxFactoryParameters parameters); diff --git a/src/Core/Billing/Services/Implementations/AutomaticTax/AutomaticTaxFactory.cs b/src/Core/Billing/Services/Implementations/AutomaticTax/AutomaticTaxFactory.cs index 2751a158c3..ed0d3babe4 100644 --- a/src/Core/Billing/Services/Implementations/AutomaticTax/AutomaticTaxFactory.cs +++ b/src/Core/Billing/Services/Implementations/AutomaticTax/AutomaticTaxFactory.cs @@ -3,10 +3,13 @@ using Bit.Core.Billing.Enums; using Bit.Core.Billing.Pricing; using Bit.Core.Billing.Services.Contracts; using Bit.Core.Entities; +using Bit.Core.Services; namespace Bit.Core.Billing.Services.Implementations.AutomaticTax; -public class AutomaticTaxFactory(IPricingClient pricingClient) : IAutomaticTaxFactory +public class AutomaticTaxFactory( + IFeatureService featureService, + IPricingClient pricingClient) : IAutomaticTaxFactory { public const string BusinessUse = "business-use"; public const string PersonalUse = "personal-use"; @@ -24,15 +27,15 @@ public class AutomaticTaxFactory(IPricingClient pricingClient) : IAutomaticTaxFa { if (parameters.Subscriber is User) { - return new PersonalUseAutomaticTaxStrategy(); + return new PersonalUseAutomaticTaxStrategy(featureService); } if (parameters.PlanType.HasValue) { var plan = await pricingClient.GetPlanOrThrow(parameters.PlanType.Value); return plan.CanBeUsedByBusiness - ? new BusinessUseAutomaticTaxStrategy() - : new PersonalUseAutomaticTaxStrategy(); + ? new BusinessUseAutomaticTaxStrategy(featureService) + : new PersonalUseAutomaticTaxStrategy(featureService); } var personalUsePlans = await _personalUsePlansTask.Value; @@ -40,9 +43,9 @@ public class AutomaticTaxFactory(IPricingClient pricingClient) : IAutomaticTaxFa if (personalUsePlans.Any(x => plans.Any(y => y.PasswordManager.StripePlanId == x))) { - return new PersonalUseAutomaticTaxStrategy(); + return new PersonalUseAutomaticTaxStrategy(featureService); } - return new BusinessUseAutomaticTaxStrategy(); + return new BusinessUseAutomaticTaxStrategy(featureService); } } diff --git a/src/Core/Billing/Services/Implementations/AutomaticTax/BusinessUseAutomaticTaxStrategy.cs b/src/Core/Billing/Services/Implementations/AutomaticTax/BusinessUseAutomaticTaxStrategy.cs index 84b3328921..9f516bff77 100644 --- a/src/Core/Billing/Services/Implementations/AutomaticTax/BusinessUseAutomaticTaxStrategy.cs +++ b/src/Core/Billing/Services/Implementations/AutomaticTax/BusinessUseAutomaticTaxStrategy.cs @@ -1,13 +1,19 @@ #nullable enable using Bit.Core.Billing.Extensions; +using Bit.Core.Services; using Stripe; namespace Bit.Core.Billing.Services.Implementations.AutomaticTax; -public class BusinessUseAutomaticTaxStrategy : IAutomaticTaxStrategy +public class BusinessUseAutomaticTaxStrategy(IFeatureService featureService) : IAutomaticTaxStrategy { public SubscriptionUpdateOptions? GetUpdateOptions(Subscription subscription) { + if (!featureService.IsEnabled(FeatureFlagKeys.PM19422_AllowAutomaticTaxUpdates)) + { + return null; + } + var shouldBeEnabled = ShouldBeEnabled(subscription.Customer); if (subscription.AutomaticTax.Enabled == shouldBeEnabled) { @@ -36,6 +42,11 @@ public class BusinessUseAutomaticTaxStrategy : IAutomaticTaxStrategy public void SetUpdateOptions(SubscriptionUpdateOptions options, Subscription subscription) { + if (!featureService.IsEnabled(FeatureFlagKeys.PM19422_AllowAutomaticTaxUpdates)) + { + return; + } + var shouldBeEnabled = ShouldBeEnabled(subscription.Customer); if (subscription.AutomaticTax.Enabled == shouldBeEnabled) diff --git a/src/Core/Billing/Services/Implementations/AutomaticTax/PersonalUseAutomaticTaxStrategy.cs b/src/Core/Billing/Services/Implementations/AutomaticTax/PersonalUseAutomaticTaxStrategy.cs index 5532b61097..7b1b021910 100644 --- a/src/Core/Billing/Services/Implementations/AutomaticTax/PersonalUseAutomaticTaxStrategy.cs +++ b/src/Core/Billing/Services/Implementations/AutomaticTax/PersonalUseAutomaticTaxStrategy.cs @@ -1,10 +1,11 @@ #nullable enable using Bit.Core.Billing.Extensions; +using Bit.Core.Services; using Stripe; namespace Bit.Core.Billing.Services.Implementations.AutomaticTax; -public class PersonalUseAutomaticTaxStrategy : IAutomaticTaxStrategy +public class PersonalUseAutomaticTaxStrategy(IFeatureService featureService) : IAutomaticTaxStrategy { public void SetCreateOptions(SubscriptionCreateOptions options, Customer customer) { @@ -16,6 +17,10 @@ public class PersonalUseAutomaticTaxStrategy : IAutomaticTaxStrategy public void SetUpdateOptions(SubscriptionUpdateOptions options, Subscription subscription) { + if (!featureService.IsEnabled(FeatureFlagKeys.PM19422_AllowAutomaticTaxUpdates)) + { + return; + } options.AutomaticTax = new SubscriptionAutomaticTaxOptions { Enabled = ShouldBeEnabled(subscription.Customer) @@ -25,6 +30,11 @@ public class PersonalUseAutomaticTaxStrategy : IAutomaticTaxStrategy public SubscriptionUpdateOptions? GetUpdateOptions(Subscription subscription) { + if (!featureService.IsEnabled(FeatureFlagKeys.PM19422_AllowAutomaticTaxUpdates)) + { + return null; + } + if (subscription.AutomaticTax.Enabled == ShouldBeEnabled(subscription.Customer)) { return null; diff --git a/src/Core/Constants.cs b/src/Core/Constants.cs index 6edecc3e4f..b07324c49b 100644 --- a/src/Core/Constants.cs +++ b/src/Core/Constants.cs @@ -175,6 +175,7 @@ public static class FeatureFlagKeys public const string WebPush = "web-push"; public const string AndroidImportLoginsFlow = "import-logins-flow"; public const string PM19147_AutomaticTaxImprovements = "pm-19147-automatic-tax-improvements"; + public const string PM19422_AllowAutomaticTaxUpdates = "pm-19422-allow-automatic-tax-updates"; public const string PM12276Breadcrumbing = "pm-12276-breadcrumbing-for-business-features"; public const string PM18794_ProviderPaymentMethod = "pm-18794-provider-payment-method"; public const string PM3553_MobileSimpleLoginSelfHostAlias = "simple-login-self-host-alias"; diff --git a/src/Core/Services/Implementations/StripePaymentService.cs b/src/Core/Services/Implementations/StripePaymentService.cs index a90343fd10..192e9136f6 100644 --- a/src/Core/Services/Implementations/StripePaymentService.cs +++ b/src/Core/Services/Implementations/StripePaymentService.cs @@ -130,7 +130,7 @@ public class StripePaymentService : IPaymentService if (_featureService.IsEnabled(FeatureFlagKeys.PM19147_AutomaticTaxImprovements)) { - var automaticTaxParameters = new AutomaticTaxFactoryParameters(subscriber, sub.Items.Select(x => x.Price.Id)); + var automaticTaxParameters = new AutomaticTaxFactoryParameters(subscriber, updatedItemOptions.Select(x => x.Price)); var automaticTaxStrategy = await _automaticTaxFactory.CreateAsync(automaticTaxParameters); automaticTaxStrategy.SetUpdateOptions(subUpdateOptions, sub); }