1
0
mirror of https://github.com/bitwarden/server synced 2025-12-19 09:43:25 +00:00

[PM-20416]Downgraded paid org cannot upgrade from Free (#5748)

* enable the downgrade of free org

* resolve the free org update issue

Signed-off-by: Cy Okeke <cokeke@bitwarden.com>

* Retain the canceled subscriptionId

Signed-off-by: Cy Okeke <cokeke@bitwarden.com>

* resolve the pr coments

* Refactor the code base on the pr comment

Signed-off-by: Cy Okeke <cokeke@bitwarden.com>

* Resolve the pr comments

Signed-off-by: Cy Okeke <cokeke@bitwarden.com>

* Resolve the pr comment

Signed-off-by: Cy Okeke <cokeke@bitwarden.com>

* Resolve the failing test

Signed-off-by: Cy Okeke <cokeke@bitwarden.com>

* Resolve the repeated condition

Signed-off-by: Cy Okeke <cokeke@bitwarden.com>

* apply the condition suggestion

Signed-off-by: Cy Okeke <cokeke@bitwarden.com>

* Add the missing MaxCollection

---------

Signed-off-by: Cy Okeke <cokeke@bitwarden.com>
This commit is contained in:
cyprain-okeke
2025-06-10 07:50:09 +01:00
committed by GitHub
parent 84e5ea1265
commit fbdd62fadd
2 changed files with 45 additions and 3 deletions

View File

@@ -242,10 +242,32 @@ public class OrganizationsController : Controller
Seats = organization.Seats
};
if (model.PlanType.HasValue)
{
var freePlan = await _pricingClient.GetPlanOrThrow(model.PlanType.Value);
var isDowngradingToFree = organization.PlanType != PlanType.Free && model.PlanType.Value == PlanType.Free;
if (isDowngradingToFree)
{
if (model.Seats.HasValue && model.Seats.Value > freePlan.PasswordManager.MaxSeats)
{
TempData["Error"] = $"Organizations with more than {freePlan.PasswordManager.MaxSeats} seats cannot be downgraded to the Free plan";
return RedirectToAction("Edit", new { id });
}
if (model.MaxCollections > freePlan.PasswordManager.MaxCollections)
{
TempData["Error"] = $"Organizations with more than {freePlan.PasswordManager.MaxCollections} collections cannot be downgraded to the Free plan. Your organization currently has {organization.MaxCollections} collections.";
return RedirectToAction("Edit", new { id });
}
model.MaxStorageGb = null;
model.ExpirationDate = null;
model.Enabled = true;
}
}
UpdateOrganization(organization, model);
var plan = await _pricingClient.GetPlanOrThrow(organization.PlanType);
if (organization.UseSecretsManager && !plan.SupportsSecretsManager)
{
TempData["Error"] = "Plan does not support Secrets Manager";