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