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