namespace Zentral.Domain.Entities; /// /// Tipo di abbonamento per un'applicazione /// public enum SubscriptionType { /// Nessun abbonamento attivo None = 0, /// Abbonamento mensile Monthly = 1, /// Abbonamento annuale Annual = 2 } /// /// Rappresenta lo stato di abbonamento/attivazione di un'applicazione. /// Ogni AppSubscription è collegata 1:1 con un'App. /// public class AppSubscription : BaseEntity { /// /// ID dell'applicazione associata /// public int AppId { get; set; } /// /// Se true, l'applicazione è attualmente attiva e accessibile /// public bool IsEnabled { get; set; } /// /// Tipo di abbonamento corrente /// public SubscriptionType SubscriptionType { get; set; } = SubscriptionType.None; /// /// Data di inizio dell'abbonamento corrente /// public DateTime? StartDate { get; set; } /// /// Data di scadenza dell'abbonamento (null = nessuna scadenza, es. licenza perpetua) /// public DateTime? EndDate { get; set; } /// /// Se true, l'abbonamento si rinnova automaticamente alla scadenza /// public bool AutoRenew { get; set; } /// /// Note aggiuntive sull'abbonamento (es. codice ordine, riferimento contratto) /// public string? Notes { get; set; } /// /// Data dell'ultimo rinnovo effettuato /// public DateTime? LastRenewalDate { get; set; } /// /// Prezzo pagato per l'abbonamento corrente (può differire da BasePrice per sconti) /// public decimal? PaidPrice { get; set; } // Navigation property public App App { get; set; } = null!; /// /// Verifica se l'abbonamento è attualmente valido (attivo e non scaduto) /// public bool IsValid() { // Se non c'è data di scadenza, è valido (licenza perpetua o core module) if (!EndDate.HasValue) return true; return EndDate.Value >= DateTime.UtcNow; } /// /// Calcola i giorni rimanenti alla scadenza (null se nessuna scadenza) /// public int? GetDaysRemaining() { if (!EndDate.HasValue) return null; var remaining = (EndDate.Value - DateTime.UtcNow).Days; return remaining < 0 ? 0 : remaining; } /// /// Verifica se l'abbonamento sta per scadere (entro i prossimi N giorni) /// public bool IsExpiringSoon(int daysThreshold = 30) { if (!EndDate.HasValue) return false; var daysRemaining = GetDaysRemaining(); return daysRemaining.HasValue && daysRemaining.Value <= daysThreshold && daysRemaining.Value > 0; } }