Remove the owner property

This commit is contained in:
Cy Okeke
2026-02-18 16:58:57 +01:00
parent 447370931f
commit d7613365ed
3 changed files with 9 additions and 18 deletions

View File

@@ -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
};
}

View File

@@ -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<bool> ValidateSystemCouponAsync(string stripeCouponId)
private async Task<bool> ValidateCouponAsync(string stripeCouponId)
{
// For system-set organization coupons, validate basic properties:
// - Coupon exists in database

View File

@@ -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;