mirror of
https://github.com/bitwarden/server.git
synced 2025-07-01 08:02:49 -05:00
[AC-2678] Enterprise to Families Sponsorship Bugs (#4118)
* Removed prorationDate as it wasn't used, and wasn't needed * Fixed logic to detect if a subscription was sponsored * Moved OrganizationSponsorshipsController.cs to Billing folder
This commit is contained in:
@ -26,20 +26,17 @@ public interface IPaymentService
|
||||
bool subscribedToSecretsManager,
|
||||
int? newlyPurchasedSecretsManagerSeats,
|
||||
int? newlyPurchasedAdditionalSecretsManagerServiceAccounts,
|
||||
int newlyPurchasedAdditionalStorage,
|
||||
DateTime? prorationDate = null);
|
||||
Task<string> AdjustSeatsAsync(Organization organization, Plan plan, int additionalSeats, DateTime? prorationDate = null);
|
||||
int newlyPurchasedAdditionalStorage);
|
||||
Task<string> AdjustSeatsAsync(Organization organization, Plan plan, int additionalSeats);
|
||||
Task<string> AdjustSeats(
|
||||
Provider provider,
|
||||
Plan plan,
|
||||
int currentlySubscribedSeats,
|
||||
int newlySubscribedSeats,
|
||||
DateTime? prorationDate = null);
|
||||
Task<string> AdjustSmSeatsAsync(Organization organization, Plan plan, int additionalSeats, DateTime? prorationDate = null);
|
||||
Task<string> AdjustStorageAsync(IStorableSubscriber storableSubscriber, int additionalStorage, string storagePlanId, DateTime? prorationDate = null);
|
||||
int newlySubscribedSeats);
|
||||
Task<string> AdjustSmSeatsAsync(Organization organization, Plan plan, int additionalSeats);
|
||||
Task<string> AdjustStorageAsync(IStorableSubscriber storableSubscriber, int additionalStorage, string storagePlanId);
|
||||
|
||||
Task<string> AdjustServiceAccountsAsync(Organization organization, Plan plan, int additionalServiceAccounts,
|
||||
DateTime? prorationDate = null);
|
||||
Task<string> AdjustServiceAccountsAsync(Organization organization, Plan plan, int additionalServiceAccounts);
|
||||
Task CancelSubscriptionAsync(ISubscriber subscriber, bool endOfPeriod = false);
|
||||
Task ReinstateSubscriptionAsync(ISubscriber subscriber);
|
||||
Task<bool> UpdatePaymentMethodAsync(ISubscriber subscriber, PaymentMethodType paymentMethodType,
|
||||
@ -55,7 +52,7 @@ public interface IPaymentService
|
||||
Task UpdateTaxRateAsync(TaxRate taxRate);
|
||||
Task ArchiveTaxRateAsync(TaxRate taxRate);
|
||||
Task<string> AddSecretsManagerToSubscription(Organization org, Plan plan, int additionalSmSeats,
|
||||
int additionalServiceAccount, DateTime? prorationDate = null);
|
||||
int additionalServiceAccount);
|
||||
Task<bool> RisksSubscriptionFailure(Organization organization);
|
||||
Task<bool> HasSecretsManagerStandalone(Organization organization);
|
||||
}
|
||||
|
@ -226,7 +226,10 @@ public class StripePaymentService : IPaymentService
|
||||
}
|
||||
}
|
||||
|
||||
private async Task ChangeOrganizationSponsorship(Organization org, OrganizationSponsorship sponsorship, bool applySponsorship)
|
||||
private async Task ChangeOrganizationSponsorship(
|
||||
Organization org,
|
||||
OrganizationSponsorship sponsorship,
|
||||
bool applySponsorship)
|
||||
{
|
||||
var existingPlan = Utilities.StaticStore.GetPlan(org.PlanType);
|
||||
var sponsoredPlan = sponsorship != null ?
|
||||
@ -234,7 +237,7 @@ public class StripePaymentService : IPaymentService
|
||||
null;
|
||||
var subscriptionUpdate = new SponsorOrganizationSubscriptionUpdate(existingPlan, sponsoredPlan, applySponsorship);
|
||||
|
||||
await FinalizeSubscriptionChangeAsync(org, subscriptionUpdate, DateTime.UtcNow, true);
|
||||
await FinalizeSubscriptionChangeAsync(org, subscriptionUpdate, true);
|
||||
|
||||
var sub = await _stripeAdapter.SubscriptionGetAsync(org.GatewaySubscriptionId);
|
||||
org.ExpirationDate = sub.CurrentPeriodEnd;
|
||||
@ -759,7 +762,7 @@ public class StripePaymentService : IPaymentService
|
||||
}
|
||||
|
||||
private async Task<string> FinalizeSubscriptionChangeAsync(ISubscriber subscriber,
|
||||
SubscriptionUpdate subscriptionUpdate, DateTime? prorationDate, bool invoiceNow = false)
|
||||
SubscriptionUpdate subscriptionUpdate, bool invoiceNow = false)
|
||||
{
|
||||
// remember, when in doubt, throw
|
||||
var subGetOptions = new SubscriptionGetOptions();
|
||||
@ -771,7 +774,6 @@ public class StripePaymentService : IPaymentService
|
||||
throw new GatewayException("Subscription not found.");
|
||||
}
|
||||
|
||||
prorationDate ??= DateTime.UtcNow;
|
||||
var collectionMethod = sub.CollectionMethod;
|
||||
var daysUntilDue = sub.DaysUntilDue;
|
||||
var chargeNow = collectionMethod == "charge_automatically";
|
||||
@ -786,8 +788,7 @@ public class StripePaymentService : IPaymentService
|
||||
? Constants.AlwaysInvoice
|
||||
: Constants.CreateProrations,
|
||||
DaysUntilDue = daysUntilDue ?? 1,
|
||||
CollectionMethod = "send_invoice",
|
||||
ProrationDate = prorationDate,
|
||||
CollectionMethod = "send_invoice"
|
||||
};
|
||||
if (!invoiceNow && isAnnualPlan && isPm5864DollarThresholdEnabled && sub.Status.Trim() != "trialing")
|
||||
{
|
||||
@ -907,9 +908,8 @@ public class StripePaymentService : IPaymentService
|
||||
bool subscribedToSecretsManager,
|
||||
int? newlyPurchasedSecretsManagerSeats,
|
||||
int? newlyPurchasedAdditionalSecretsManagerServiceAccounts,
|
||||
int newlyPurchasedAdditionalStorage,
|
||||
DateTime? prorationDate = null)
|
||||
=> FinalizeSubscriptionChangeAsync(
|
||||
int newlyPurchasedAdditionalStorage) =>
|
||||
FinalizeSubscriptionChangeAsync(
|
||||
organization,
|
||||
new CompleteSubscriptionUpdate(
|
||||
organization,
|
||||
@ -919,41 +919,47 @@ public class StripePaymentService : IPaymentService
|
||||
PurchasedPasswordManagerSeats = newlyPurchasedPasswordManagerSeats,
|
||||
SubscribedToSecretsManager = subscribedToSecretsManager,
|
||||
PurchasedSecretsManagerSeats = newlyPurchasedSecretsManagerSeats,
|
||||
PurchasedAdditionalSecretsManagerServiceAccounts = newlyPurchasedAdditionalSecretsManagerServiceAccounts,
|
||||
PurchasedAdditionalSecretsManagerServiceAccounts =
|
||||
newlyPurchasedAdditionalSecretsManagerServiceAccounts,
|
||||
PurchasedAdditionalStorage = newlyPurchasedAdditionalStorage
|
||||
}),
|
||||
prorationDate, true);
|
||||
}), true);
|
||||
|
||||
public Task<string> AdjustSeatsAsync(Organization organization, StaticStore.Plan plan, int additionalSeats, DateTime? prorationDate = null)
|
||||
{
|
||||
return FinalizeSubscriptionChangeAsync(organization, new SeatSubscriptionUpdate(organization, plan, additionalSeats), prorationDate);
|
||||
}
|
||||
public Task<string> AdjustSeatsAsync(Organization organization, StaticStore.Plan plan, int additionalSeats) =>
|
||||
FinalizeSubscriptionChangeAsync(organization, new SeatSubscriptionUpdate(organization, plan, additionalSeats));
|
||||
|
||||
public Task<string> AdjustSeats(
|
||||
Provider provider,
|
||||
StaticStore.Plan plan,
|
||||
int currentlySubscribedSeats,
|
||||
int newlySubscribedSeats,
|
||||
DateTime? prorationDate = null)
|
||||
int newlySubscribedSeats)
|
||||
=> FinalizeSubscriptionChangeAsync(
|
||||
provider,
|
||||
new ProviderSubscriptionUpdate(plan.Type, currentlySubscribedSeats, newlySubscribedSeats),
|
||||
prorationDate);
|
||||
new ProviderSubscriptionUpdate(
|
||||
plan.Type,
|
||||
currentlySubscribedSeats,
|
||||
newlySubscribedSeats));
|
||||
|
||||
public Task<string> AdjustSmSeatsAsync(Organization organization, StaticStore.Plan plan, int additionalSeats, DateTime? prorationDate = null)
|
||||
{
|
||||
return FinalizeSubscriptionChangeAsync(organization, new SmSeatSubscriptionUpdate(organization, plan, additionalSeats), prorationDate);
|
||||
}
|
||||
public Task<string> AdjustSmSeatsAsync(Organization organization, StaticStore.Plan plan, int additionalSeats) =>
|
||||
FinalizeSubscriptionChangeAsync(
|
||||
organization,
|
||||
new SmSeatSubscriptionUpdate(organization, plan, additionalSeats));
|
||||
|
||||
public Task<string> AdjustServiceAccountsAsync(Organization organization, StaticStore.Plan plan, int additionalServiceAccounts, DateTime? prorationDate = null)
|
||||
{
|
||||
return FinalizeSubscriptionChangeAsync(organization, new ServiceAccountSubscriptionUpdate(organization, plan, additionalServiceAccounts), prorationDate);
|
||||
}
|
||||
public Task<string> AdjustServiceAccountsAsync(
|
||||
Organization organization,
|
||||
StaticStore.Plan plan,
|
||||
int additionalServiceAccounts) =>
|
||||
FinalizeSubscriptionChangeAsync(
|
||||
organization,
|
||||
new ServiceAccountSubscriptionUpdate(organization, plan, additionalServiceAccounts));
|
||||
|
||||
public Task<string> AdjustStorageAsync(IStorableSubscriber storableSubscriber, int additionalStorage,
|
||||
string storagePlanId, DateTime? prorationDate = null)
|
||||
public Task<string> AdjustStorageAsync(
|
||||
IStorableSubscriber storableSubscriber,
|
||||
int additionalStorage,
|
||||
string storagePlanId)
|
||||
{
|
||||
return FinalizeSubscriptionChangeAsync(storableSubscriber, new StorageSubscriptionUpdate(storagePlanId, additionalStorage), prorationDate);
|
||||
return FinalizeSubscriptionChangeAsync(
|
||||
storableSubscriber,
|
||||
new StorageSubscriptionUpdate(storagePlanId, additionalStorage));
|
||||
}
|
||||
|
||||
public async Task CancelAndRecoverChargesAsync(ISubscriber subscriber)
|
||||
@ -1771,13 +1777,15 @@ public class StripePaymentService : IPaymentService
|
||||
}
|
||||
}
|
||||
|
||||
public async Task<string> AddSecretsManagerToSubscription(Organization org, StaticStore.Plan plan, int additionalSmSeats,
|
||||
int additionalServiceAccount, DateTime? prorationDate = null)
|
||||
{
|
||||
return await FinalizeSubscriptionChangeAsync(org,
|
||||
new SecretsManagerSubscribeUpdate(org, plan, additionalSmSeats, additionalServiceAccount), prorationDate,
|
||||
public async Task<string> AddSecretsManagerToSubscription(
|
||||
Organization org,
|
||||
StaticStore.Plan plan,
|
||||
int additionalSmSeats,
|
||||
int additionalServiceAccount) =>
|
||||
await FinalizeSubscriptionChangeAsync(
|
||||
org,
|
||||
new SecretsManagerSubscribeUpdate(org, plan, additionalSmSeats, additionalServiceAccount),
|
||||
true);
|
||||
}
|
||||
|
||||
public async Task<bool> RisksSubscriptionFailure(Organization organization)
|
||||
{
|
||||
|
Reference in New Issue
Block a user