Skip to content

Commit

Permalink
[PM-15808]Show suspended org modals for orgs in 'unpaid' & 'canceled'…
Browse files Browse the repository at this point in the history
… status (#5228)

* Recreate changes on the closed pr

Signed-off-by: Cy Okeke <[email protected]>

* Remove unused references

Signed-off-by: Cy Okeke <[email protected]>

---------

Signed-off-by: Cy Okeke <[email protected]>
  • Loading branch information
cyprain-okeke authored Jan 7, 2025
1 parent 61a8726 commit eeb1be1
Show file tree
Hide file tree
Showing 5 changed files with 54 additions and 4 deletions.
38 changes: 37 additions & 1 deletion src/Api/Billing/Controllers/OrganizationBillingController.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
#nullable enable
using Bit.Api.AdminConsole.Models.Request.Organizations;
using Bit.Api.Billing.Models.Requests;
using Bit.Api.Billing.Models.Responses;
using Bit.Core;
using Bit.Core.Billing.Models.Sales;
using Bit.Core.Billing.Services;
using Bit.Core.Context;
using Bit.Core.Repositories;
Expand All @@ -21,7 +23,8 @@ public class OrganizationBillingController(
IOrganizationRepository organizationRepository,
IPaymentService paymentService,
ISubscriberService subscriberService,
IPaymentHistoryService paymentHistoryService) : BaseBillingController
IPaymentHistoryService paymentHistoryService,
IUserService userService) : BaseBillingController
{
[HttpGet("metadata")]
public async Task<IResult> GetMetadataAsync([FromRoute] Guid organizationId)
Expand Down Expand Up @@ -278,4 +281,37 @@ public async Task<IResult> UpdateTaxInformationAsync(

return TypedResults.Ok();
}

[HttpPost("restart-subscription")]
public async Task<IResult> RestartSubscriptionAsync([FromRoute] Guid organizationId,
[FromBody] OrganizationCreateRequestModel model)
{
var user = await userService.GetUserByPrincipalAsync(User);
if (user == null)
{
throw new UnauthorizedAccessException();
}

if (!featureService.IsEnabled(FeatureFlagKeys.AC2476_DeprecateStripeSourcesAPI))
{
return Error.NotFound();
}

if (!await currentContext.EditPaymentMethods(organizationId))
{
return Error.Unauthorized();
}

var organization = await organizationRepository.GetByIdAsync(organizationId);

if (organization == null)
{
return Error.NotFound();
}
var organizationSignup = model.ToOrganizationSignup(user);
var sale = OrganizationSale.From(organization, organizationSignup);
await organizationBillingService.Finalize(sale);

return TypedResults.Ok();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ public record OrganizationMetadataResponse(
bool IsSubscriptionUnpaid,
bool HasSubscription,
bool HasOpenInvoice,
bool IsSubscriptionCanceled,
DateTime? InvoiceDueDate,
DateTime? InvoiceCreatedDate,
DateTime? SubPeriodEndDate)
Expand All @@ -21,6 +22,7 @@ public static OrganizationMetadataResponse From(OrganizationMetadata metadata)
metadata.IsSubscriptionUnpaid,
metadata.HasSubscription,
metadata.HasOpenInvoice,
metadata.IsSubscriptionCanceled,
metadata.InvoiceDueDate,
metadata.InvoiceCreatedDate,
metadata.SubPeriodEndDate);
Expand Down
1 change: 1 addition & 0 deletions src/Core/Billing/Models/OrganizationMetadata.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ public record OrganizationMetadata(
bool IsSubscriptionUnpaid,
bool HasSubscription,
bool HasOpenInvoice,
bool IsSubscriptionCanceled,
DateTime? InvoiceDueDate,
DateTime? InvoiceCreatedDate,
DateTime? SubPeriodEndDate);
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ public async Task Finalize(OrganizationSale sale)
if (string.IsNullOrWhiteSpace(organization.GatewaySubscriptionId))
{
return new OrganizationMetadata(isEligibleForSelfHost, isManaged, false,
false, false, false, null, null, null);
false, false, false, false, null, null, null);
}

var customer = await subscriberService.GetCustomer(organization,
Expand All @@ -79,6 +79,7 @@ public async Task Finalize(OrganizationSale sale)

var isOnSecretsManagerStandalone = IsOnSecretsManagerStandalone(organization, customer, subscription);
var isSubscriptionUnpaid = IsSubscriptionUnpaid(subscription);
var isSubscriptionCanceled = IsSubscriptionCanceled(subscription);
var hasSubscription = true;
var openInvoice = await HasOpenInvoiceAsync(subscription);
var hasOpenInvoice = openInvoice.HasOpenInvoice;
Expand All @@ -87,7 +88,7 @@ public async Task Finalize(OrganizationSale sale)
var subPeriodEndDate = subscription?.CurrentPeriodEnd;

return new OrganizationMetadata(isEligibleForSelfHost, isManaged, isOnSecretsManagerStandalone,
isSubscriptionUnpaid, hasSubscription, hasOpenInvoice, invoiceDueDate, invoiceCreatedDate, subPeriodEndDate);
isSubscriptionUnpaid, hasSubscription, hasOpenInvoice, isSubscriptionCanceled, invoiceDueDate, invoiceCreatedDate, subPeriodEndDate);
}

public async Task UpdatePaymentMethod(
Expand Down Expand Up @@ -437,5 +438,15 @@ private static bool IsSubscriptionUnpaid(Subscription subscription)
? (true, invoice.Created, invoice.DueDate)
: (false, null, null);
}

private static bool IsSubscriptionCanceled(Subscription subscription)
{
if (subscription == null)
{
return false;
}

return subscription.Status == "canceled";
}
#endregion
}
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ public async Task GetMetadataAsync_OK(
{
sutProvider.GetDependency<ICurrentContext>().OrganizationUser(organizationId).Returns(true);
sutProvider.GetDependency<IOrganizationBillingService>().GetMetadata(organizationId)
.Returns(new OrganizationMetadata(true, true, true, true, true, true, null, null, null));
.Returns(new OrganizationMetadata(true, true, true, true, true, true, true, null, null, null));

var result = await sutProvider.Sut.GetMetadataAsync(organizationId);

Expand Down

0 comments on commit eeb1be1

Please sign in to comment.