Files
Core_Be/Models/CustomerPlan.cs
T
Dhananjaya99 bffc9b1686 first commit
2026-09-28 11:44:26 +05:30

68 lines
3.2 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace Fitness_core_BE.Models
{
public class CustomerPlan
{
[Key]
public Guid CustomerPlanId { get; set; }
public Guid FKClientId { get; set; }
[ForeignKey("FKClientId")]
public virtual Client Client { get; set; }
public string? PlanName { get; set; }
public string? PlanDescription { get; set; }
public decimal PlanPrice { get; set; }
/// <summary>Whether this plan charges a one-time fee when a new subscription starts.</summary>
public bool HasOnboardingFee { get; set; } = false;
/// <summary>One-time amount added to the first invoice/installment.</summary>
public decimal OnboardingFeeAmount { get; set; } = 0m;
/// <summary>Used when DurationMode == "Rolling"; 0 for FixedRange plans.</summary>
public int DurationInDays { get; set; }
/// <summary>"Individual" | "Group" (couple/family — one subscription covers MemberLimit members).</summary>
public string PlanScope { get; set; } = "Individual";
/// <summary>1 for Individual; >= 2 for Group (couple = 2).</summary>
public int MemberLimit { get; set; } = 1;
/// <summary>"Rolling" (DurationInDays from join date) | "FixedRange" (ValidFrom–ValidTo).</summary>
public string DurationMode { get; set; } = "Rolling";
public DateTime? ValidFrom { get; set; }
public DateTime? ValidTo { get; set; }
/// <summary>Owner decides: when true the price splits into InstallmentCount scheduled parts.</summary>
public bool AllowSplitPayments { get; set; } = false;
/// <summary>Number of mostly-equal installments (1 = full payment upfront).</summary>
public int InstallmentCount { get; set; } = 1;
/// <summary>Null = unlimited-access plan (existing gym behavior). A number = this plan
/// grants that many bookable Facility sessions per billing cycle (e.g. "4 pool sessions
/// a month") — enforced by the booking flow, not by this model.</summary>
public int? SessionsPerCycle { get; set; }
/// <summary>"NoRollover" (unused sessions are forfeited when the cycle renews) |
/// "GracePeriod" (unused sessions stay usable for RolloverGraceDays after renewal).
/// Set per package at creation time, per owner's requirement.</summary>
public string SessionRolloverPolicy { get; set; } = "NoRollover";
/// <summary>Days into the new cycle that last cycle's unused sessions remain usable.
/// Only meaningful when SessionRolloverPolicy == "GracePeriod".</summary>
public int RolloverGraceDays { get; set; } = 0;
/// <summary>"Prepaid" (pay before the cycle starts, existing behavior) | "Postpaid"
/// (use first, invoice at cycle end — reuses Client.LockAfterDaysOverdue /
/// OverdueLockJob to suspend access if that invoice goes unpaid past due). Asked once,
/// per package, at creation time per owner's requirement.</summary>
public string BillingTiming { get; set; } = "Prepaid";
public bool IsActive { get; set; } = true;
public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
}
}