diff --git a/src/Core/Billing/Organizations/Models/OrganizationSale.cs b/src/Core/Billing/Organizations/Models/OrganizationSale.cs index 16479028ee..a984d5fe71 100644 --- a/src/Core/Billing/Organizations/Models/OrganizationSale.cs +++ b/src/Core/Billing/Organizations/Models/OrganizationSale.cs @@ -3,7 +3,6 @@ using Bit.Core.Billing.Constants; using Bit.Core.Billing.Models; using Bit.Core.Billing.Models.Sales; using Bit.Core.Billing.Tax.Models; -using Bit.Core.Entities; using Bit.Core.Models.Business; namespace Bit.Core.Billing.Organizations.Models; @@ -15,19 +14,16 @@ public class OrganizationSale public void Deconstruct( out Organization organization, out CustomerSetup? customerSetup, - out SubscriptionSetup subscriptionSetup, - out User? owner) + out SubscriptionSetup subscriptionSetup) { organization = Organization; customerSetup = CustomerSetup; subscriptionSetup = SubscriptionSetup; - owner = Owner; } public required Organization Organization { get; init; } public CustomerSetup? CustomerSetup { get; init; } public required SubscriptionSetup SubscriptionSetup { get; init; } - public User? Owner { get; init; } public static OrganizationSale From( Organization organization, @@ -44,8 +40,7 @@ public class OrganizationSale { Organization = organization, CustomerSetup = customerSetup, - SubscriptionSetup = subscriptionSetup, - Owner = signup.Owner + SubscriptionSetup = subscriptionSetup }; } diff --git a/src/Core/Billing/Organizations/Services/OrganizationBillingService.cs b/src/Core/Billing/Organizations/Services/OrganizationBillingService.cs index 3c73b3fbe8..477f67e12a 100644 --- a/src/Core/Billing/Organizations/Services/OrganizationBillingService.cs +++ b/src/Core/Billing/Organizations/Services/OrganizationBillingService.cs @@ -36,23 +36,19 @@ public class OrganizationBillingService( IStripeAdapter stripeAdapter, ISubscriberService subscriberService, ISubscriptionDiscountRepository subscriptionDiscountRepository, - ISubscriptionDiscountService subscriptionDiscountService, ITaxService taxService) : IOrganizationBillingService { public async Task Finalize(OrganizationSale sale) { - var (organization, customerSetup, subscriptionSetup, owner) = sale; + var (organization, customerSetup, subscriptionSetup) = sale; // Validate coupon and only apply if valid. If invalid, proceed without the discount. - // Validation happens before purchase to ensure order of operations. + // For system-set coupons, we perform basic validation (exists, date range, audience type) + // without user-specific eligibility checks. string? validatedCoupon = null; if (!string.IsNullOrWhiteSpace(customerSetup?.Coupon)) { - // If owner exists, do full validation including user eligibility - // If owner is null, validate basic coupon properties only (system-set coupons) - var isValid = owner != null - ? await subscriptionDiscountService.ValidateDiscountForUserAsync(owner, customerSetup.Coupon.Trim(), DiscountAudienceType.UserHasNoPreviousSubscriptions) - : await ValidateSystemCouponAsync(customerSetup.Coupon.Trim()); + var isValid = await ValidateCouponAsync(customerSetup.Coupon.Trim()); if (isValid) { @@ -558,7 +554,7 @@ public class OrganizationBillingService( } } - private async Task ValidateSystemCouponAsync(string stripeCouponId) + private async Task ValidateCouponAsync(string stripeCouponId) { // For system-set organization coupons, validate basic properties: // - Coupon exists in database diff --git a/test/Core.Test/Billing/Services/OrganizationBillingServiceTests.cs b/test/Core.Test/Billing/Services/OrganizationBillingServiceTests.cs index 31c75f4ece..86c1a74c0d 100644 --- a/test/Core.Test/Billing/Services/OrganizationBillingServiceTests.cs +++ b/test/Core.Test/Billing/Services/OrganizationBillingServiceTests.cs @@ -1,4 +1,4 @@ -using Bit.Core.AdminConsole.Entities; +using Bit.Core.AdminConsole.Entities; using Bit.Core.Billing.Constants; using Bit.Core.Billing.Enums; using Bit.Core.Billing.Models.Sales; @@ -7,7 +7,6 @@ using Bit.Core.Billing.Organizations.Services; using Bit.Core.Billing.Payment.Queries; using Bit.Core.Billing.Pricing; using Bit.Core.Billing.Services; -using Bit.Core.Entities; using Bit.Core.Repositories; using Bit.Core.Test.Billing.Mocks; using Bit.Test.Common.AutoFixture; @@ -15,6 +14,7 @@ using Bit.Test.Common.AutoFixture.Attributes; using NSubstitute; using Stripe; using Xunit; +using User = Bit.Core.Entities.User; namespace Bit.Core.Test.Billing.Services;