Files
zentral/src/backend/Zentral.Domain/Entities/AppSubscription.cs

106 lines
2.9 KiB
C#

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