using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace Fitness_core_BE.Models { public class CustomerSubscription { [Key] public Guid SubscriptionId { get; set; } public Guid FKCustomerPlanId { get; set; } [ForeignKey("FKCustomerPlanId")] public virtual CustomerPlan CustomerPlan { get; set; } // Tenant-bucket entity: this FK holds a TenantCustomerLinkId (not the central // Customer.CusId directly) -- see Models/TenantCustomerLink.cs. public Guid FKCustomerId { get; set; } [ForeignKey("FKCustomerId")] public virtual TenantCustomerLink TenantCustomerLink { get; set; } public DateTime OnboardDate { get; set; } = DateTime.UtcNow; // Set once, at creation, and never touched again -- see RenewalDate for the field that // actually reflects the subscription's current cycle end / renewal-eligibility date. public DateTime? ExpiryDate { get; set; } // Advances on every approved renewal cycle; every "is this due/expiring/current" query, // filter, sort or status display should read this instead of ExpiryDate. public DateTime? RenewalDate { get; set; } public bool IsActive { get; set; } = true; public DateTime CreatedAt { get; set; } = DateTime.UtcNow; // Set together at assignment time; "was a discount given" is DiscountValue.HasValue. public string? DiscountType { get; set; } // "Percentage" | "Flat" public decimal? DiscountValue { get; set; } /// Member has consented to auto-deduct renewals from FKAutoChargeCardId. public bool AutoChargeEnabled { get; set; } = false; public Guid? FKAutoChargeCardId { get; set; } [ForeignKey("FKAutoChargeCardId")] public virtual CustomerCards? AutoChargeCard { get; set; } // Session-count tracking for CustomerPlan.SessionsPerCycle plans (null for unlimited // gym-access plans). SessionsUsedThisCycle resets on renewal; SessionsCarriedOver holds // unused sessions brought forward when CustomerPlan.SessionRolloverPolicy == "GracePeriod" // and is cleared once RolloverGraceDays elapses. Booking creation increments // SessionsUsedThisCycle instead of duplicating this counter per facility. public int SessionsUsedThisCycle { get; set; } = 0; public int SessionsCarriedOver { get; set; } = 0; // Set at renewal approval time when CustomerPlan.SessionRolloverPolicy == "GracePeriod" // (now + RolloverGraceDays); null when there's nothing carried over. Booking creation // treats SessionsCarriedOver as spent/expired once this passes, even though the column // itself isn't zeroed until the next renewal -- see BookingService.CreateMemberBooking. public DateTime? SessionsCarriedOverExpiresAt { get; set; } public virtual ICollection SubscriptionMembers { get; set; } public virtual ICollection SubscriptionInstallments { get; set; } } }