Browse Source

Remove the owner property

pull/6994/head
Cy Okeke 1 month ago
parent
commit
d7613365ed
No known key found for this signature in database
GPG Key ID: 88B341B55C84B45C
  1. 9
      src/Core/Billing/Organizations/Models/OrganizationSale.cs
  2. 14
      src/Core/Billing/Organizations/Services/OrganizationBillingService.cs
  3. 4
      test/Core.Test/Billing/Services/OrganizationBillingServiceTests.cs

9
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;
using Bit.Core.Billing.Models.Sales; using Bit.Core.Billing.Models.Sales;
using Bit.Core.Billing.Tax.Models; using Bit.Core.Billing.Tax.Models;
using Bit.Core.Entities;
using Bit.Core.Models.Business; using Bit.Core.Models.Business;
namespace Bit.Core.Billing.Organizations.Models; namespace Bit.Core.Billing.Organizations.Models;
@ -15,19 +14,16 @@ public class OrganizationSale
public void Deconstruct( public void Deconstruct(
out Organization organization, out Organization organization,
out CustomerSetup? customerSetup, out CustomerSetup? customerSetup,
out SubscriptionSetup subscriptionSetup, out SubscriptionSetup subscriptionSetup)
out User? owner)
{ {
organization = Organization; organization = Organization;
customerSetup = CustomerSetup; customerSetup = CustomerSetup;
subscriptionSetup = SubscriptionSetup; subscriptionSetup = SubscriptionSetup;
owner = Owner;
} }
public required Organization Organization { get; init; } public required Organization Organization { get; init; }
public CustomerSetup? CustomerSetup { get; init; } public CustomerSetup? CustomerSetup { get; init; }
public required SubscriptionSetup SubscriptionSetup { get; init; } public required SubscriptionSetup SubscriptionSetup { get; init; }
public User? Owner { get; init; }
public static OrganizationSale From( public static OrganizationSale From(
Organization organization, Organization organization,
@ -44,8 +40,7 @@ public class OrganizationSale
{ {
Organization = organization, Organization = organization,
CustomerSetup = customerSetup, CustomerSetup = customerSetup,
SubscriptionSetup = subscriptionSetup, SubscriptionSetup = subscriptionSetup
Owner = signup.Owner
}; };
} }

14
src/Core/Billing/Organizations/Services/OrganizationBillingService.cs

@ -36,23 +36,19 @@ public class OrganizationBillingService(
IStripeAdapter stripeAdapter, IStripeAdapter stripeAdapter,
ISubscriberService subscriberService, ISubscriberService subscriberService,
ISubscriptionDiscountRepository subscriptionDiscountRepository, ISubscriptionDiscountRepository subscriptionDiscountRepository,
ISubscriptionDiscountService subscriptionDiscountService,
ITaxService taxService) : IOrganizationBillingService ITaxService taxService) : IOrganizationBillingService
{ {
public async Task Finalize(OrganizationSale sale) 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. // 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; string? validatedCoupon = null;
if (!string.IsNullOrWhiteSpace(customerSetup?.Coupon)) if (!string.IsNullOrWhiteSpace(customerSetup?.Coupon))
{ {
// If owner exists, do full validation including user eligibility var isValid = await ValidateCouponAsync(customerSetup.Coupon.Trim());
// 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());
if (isValid) 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: // For system-set organization coupons, validate basic properties:
// - Coupon exists in database // - Coupon exists in database

4
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.Constants;
using Bit.Core.Billing.Enums; using Bit.Core.Billing.Enums;
using Bit.Core.Billing.Models.Sales; 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.Payment.Queries;
using Bit.Core.Billing.Pricing; using Bit.Core.Billing.Pricing;
using Bit.Core.Billing.Services; using Bit.Core.Billing.Services;
using Bit.Core.Entities;
using Bit.Core.Repositories; using Bit.Core.Repositories;
using Bit.Core.Test.Billing.Mocks; using Bit.Core.Test.Billing.Mocks;
using Bit.Test.Common.AutoFixture; using Bit.Test.Common.AutoFixture;
@ -15,6 +14,7 @@ using Bit.Test.Common.AutoFixture.Attributes;
using NSubstitute; using NSubstitute;
using Stripe; using Stripe;
using Xunit; using Xunit;
using User = Bit.Core.Entities.User;
namespace Bit.Core.Test.Billing.Services; namespace Bit.Core.Test.Billing.Services;

Loading…
Cancel
Save