1
0
mirror of https://github.com/bitwarden/server.git synced 2025-07-10 04:14:41 -05:00

[PM-18028] Enabling automatic tax for customers without country or with manual tax rates set (#5376)

This commit is contained in:
Jonas Hendrickx
2025-02-20 16:01:48 +01:00
committed by GitHub
parent 9f4aa1ab2b
commit 4bef2357d5
8 changed files with 155 additions and 35 deletions

View File

@ -177,7 +177,7 @@ public class StripePaymentService : IPaymentService
customer = await _stripeAdapter.CustomerCreateAsync(customerCreateOptions);
subCreateOptions.AddExpand("latest_invoice.payment_intent");
subCreateOptions.Customer = customer.Id;
subCreateOptions.AutomaticTax = new SubscriptionAutomaticTaxOptions { Enabled = true };
subCreateOptions.EnableAutomaticTax(customer);
subscription = await _stripeAdapter.SubscriptionCreateAsync(subCreateOptions);
if (subscription.Status == "incomplete" && subscription.LatestInvoice?.PaymentIntent != null)
@ -358,10 +358,9 @@ public class StripePaymentService : IPaymentService
customer = await _stripeAdapter.CustomerUpdateAsync(org.GatewayCustomerId, customerUpdateOptions);
}
var subCreateOptions = new OrganizationUpgradeSubscriptionOptions(customer.Id, org, plan, upgrade)
{
AutomaticTax = new SubscriptionAutomaticTaxOptions { Enabled = true }
};
var subCreateOptions = new OrganizationUpgradeSubscriptionOptions(customer.Id, org, plan, upgrade);
subCreateOptions.EnableAutomaticTax(customer);
var (stripePaymentMethod, paymentMethodType) = IdentifyPaymentMethod(customer, subCreateOptions);
@ -520,10 +519,6 @@ public class StripePaymentService : IPaymentService
var customerCreateOptions = new CustomerCreateOptions
{
Tax = new CustomerTaxOptions
{
ValidateLocation = StripeConstants.ValidateTaxLocationTiming.Immediately
},
Description = user.Name,
Email = user.Email,
Metadata = stripeCustomerMetadata,
@ -561,7 +556,6 @@ public class StripePaymentService : IPaymentService
var subCreateOptions = new SubscriptionCreateOptions
{
AutomaticTax = new SubscriptionAutomaticTaxOptions { Enabled = true },
Customer = customer.Id,
Items = [],
Metadata = new Dictionary<string, string>
@ -581,10 +575,12 @@ public class StripePaymentService : IPaymentService
subCreateOptions.Items.Add(new SubscriptionItemOptions
{
Plan = StoragePlanId,
Quantity = additionalStorageGb,
Quantity = additionalStorageGb
});
}
subCreateOptions.EnableAutomaticTax(customer);
var subscription = await ChargeForNewSubscriptionAsync(user, customer, createdStripeCustomer,
stripePaymentMethod, paymentMethodType, subCreateOptions, braintreeCustomer);
@ -622,7 +618,10 @@ public class StripePaymentService : IPaymentService
SubscriptionItems = ToInvoiceSubscriptionItemOptions(subCreateOptions.Items)
});
previewInvoice.AutomaticTax = new InvoiceAutomaticTax { Enabled = true };
if (customer.HasTaxLocationVerified())
{
previewInvoice.AutomaticTax = new InvoiceAutomaticTax { Enabled = true };
}
if (previewInvoice.AmountDue > 0)
{
@ -680,12 +679,10 @@ public class StripePaymentService : IPaymentService
Customer = customer.Id,
SubscriptionItems = ToInvoiceSubscriptionItemOptions(subCreateOptions.Items),
SubscriptionDefaultTaxRates = subCreateOptions.DefaultTaxRates,
AutomaticTax = new InvoiceAutomaticTaxOptions
{
Enabled = true
}
};
upcomingInvoiceOptions.EnableAutomaticTax(customer, null);
var previewInvoice = await _stripeAdapter.InvoiceUpcomingAsync(upcomingInvoiceOptions);
if (previewInvoice.AmountDue > 0)
@ -804,11 +801,7 @@ public class StripePaymentService : IPaymentService
Items = updatedItemOptions,
ProrationBehavior = invoiceNow ? Constants.AlwaysInvoice : Constants.CreateProrations,
DaysUntilDue = daysUntilDue ?? 1,
CollectionMethod = "send_invoice",
AutomaticTax = new SubscriptionAutomaticTaxOptions
{
Enabled = true
}
CollectionMethod = "send_invoice"
};
if (!invoiceNow && isAnnualPlan && sub.Status.Trim() != "trialing")
{
@ -816,6 +809,8 @@ public class StripePaymentService : IPaymentService
new SubscriptionPendingInvoiceItemIntervalOptions { Interval = "month" };
}
subUpdateOptions.EnableAutomaticTax(sub.Customer, sub);
if (!subscriptionUpdate.UpdateNeeded(sub))
{
// No need to update subscription, quantity matches
@ -1500,11 +1495,13 @@ public class StripePaymentService : IPaymentService
if (!string.IsNullOrEmpty(subscriber.GatewaySubscriptionId) &&
customer.Subscriptions.Any(sub =>
sub.Id == subscriber.GatewaySubscriptionId &&
!sub.AutomaticTax.Enabled))
!sub.AutomaticTax.Enabled) &&
customer.HasTaxLocationVerified())
{
var subscriptionUpdateOptions = new SubscriptionUpdateOptions
{
AutomaticTax = new SubscriptionAutomaticTaxOptions { Enabled = true }
AutomaticTax = new SubscriptionAutomaticTaxOptions { Enabled = true },
DefaultTaxRates = []
};
_ = await _stripeAdapter.SubscriptionUpdateAsync(