243 lines
6.9 KiB
C#

using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using gehGassi.Domain.Base;
using gehGassi.Domain.Common;
using gehGassi.Domain.Localization;
namespace gehGassi.Domain.Subscriptions
{
/// <summary>
/// Repräsentiert ein Abonnement
/// </summary>
public class Subscription : SyncEntityLocalizable, IAuditable
{
/// <summary>
/// Subscription Code - Produkt ID für Stores
/// </summary>
[Required]
[MaxLength(128)]
public string Code { get; set; }
/// <summary>
/// Dauer des Abonnements
/// </summary>
[Required]
public SubscriptionLength Length { get; set; }
/// <summary>
/// Preis des Abonnements in Euro
/// </summary>
[Required]
public decimal Price { get; set; }
/// <summary>
/// Art des Abonnements - für welchen Benutzer-Typ?
/// </summary>
[Required]
public AppMode AppMode { get; set; }
/// <summary>
/// Name des Abonnements
/// </summary>
[Localized]
[NotMapped]
public string Name
{
get => Get("Name", GetLanguage());
set => Set("Name", GetLanguage(), value);
}
/// <summary>
/// Name - Inhalt
/// </summary>
[Column]
public string NameLocalized { get; set; }
/// <summary>
/// Beschreibung des Abonnements
/// </summary>
[Localized]
[NotMapped]
public string Description
{
get => Get("Description", GetLanguage());
set => Set("Description", GetLanguage(), value);
}
/// <summary>
/// Beschreibung - Inhalt
/// </summary>
[Column]
public string DescriptionLocalized { get; set; }
/// <summary>
/// Ist das Abonnement aktiv?
/// </summary>
[Required]
public bool Enabled { get; set; }
/// <summary>
/// Zeit in Tagen die als Toleranz bei Ablauf akzeptiert wird
/// </summary>
[Required]
public int GracePeriodInDays { get; set; }
/// <summary>
/// Ist das Abonnement ausgeblendet?
/// </summary>
[Required]
public bool Hidden { get; set; }
/// <summary>
/// Optional: the Max registered date of the app user to see this subscription
/// </summary>
public DateTimeOffset? MaxRegisteredDate { get; set; }
/// <summary>
/// Hilfsmethode die die Ablaufzeit des Abonnements berechnet
/// </summary>
/// <returns>Ablaufdatum</returns>
public DateTimeOffset GetExpiration(DateTimeOffset date)
{
switch (Length)
{
case SubscriptionLength.OneWeek:
return date.AddDays(7);
case SubscriptionLength.OneMonth:
return date.AddMonths(1);
case SubscriptionLength.ThreeMonths:
return date.AddMonths(3);
case SubscriptionLength.SixMonths:
return date.AddMonths(6);
case SubscriptionLength.OneYear:
return date.AddYears(1);
default:
return date;
}
}
/// <summary>
/// Hilfsmethode die die Ablaufzeit des Abonnements berechnet und die Tolranzzeit hinzufügt
/// </summary>
/// <param name="date">Datum</param>
/// <returns>Ablaufdatum mit toleranz</returns>
public DateTimeOffset GetExpirationWithGrace(DateTimeOffset date)
{
var expirationDate = GetExpiration(date);
return expirationDate.AddDays(GracePeriodInDays);
}
#region IAuditable
/// <summary>
/// Gibt den eindeutigen Key für die Entität zurück;
/// Hier als String gelöst, weil damit auch kombinierte Schlüssel möglich sind.
/// </summary>
/// <returns>Eindeutiger Key</returns>
public string AuditKey()
{
return Id.ToString();
}
/// <summary>
/// Gibt den Objektnamen bzw. die Tabelle der Entität zurück
/// </summary>
/// <returns>Objektnamen</returns>
public string AuditTable()
{
return "Subscriptions";
}
public AuditableOptions Options()
{
return AuditableOptions.Create | AuditableOptions.Edit | AuditableOptions.Delete;
}
#endregion
}
/// <summary>
/// Repräsentiert ein Abonnement mit Namen aufgleöst
/// </summary>
public class SubscriptionWithNames : SyncEntityLocalizableVw
{
/// <summary>
/// Subscription Code - Produkt ID für Stores
/// </summary>
public string Code { get; set; }
/// <summary>
/// Dauer des Abonnements
/// </summary>
public SubscriptionLength Length { get; set; }
/// <summary>
/// Preis des Abonnements in Euro
/// </summary>
public decimal Price { get; set; }
/// <summary>
/// Art des Abonnements - für welchen Benutzer-Typ?
/// </summary>
public AppMode AppMode { get; set; }
/// <summary>
/// Name des Abonnements
/// </summary>
public string Name { get; set; }
/// <summary>
/// Name - Inhalt
/// </summary>
[Column]
public string NameLocalized { get; set; }
/// <summary>
/// Beschreibung des Abonnements
/// </summary>
public string Description { get; set; }
/// <summary>
/// Beschreibung - Inhalt
/// </summary>
[Column]
public string DescriptionLocalized { get; set; }
/// <summary>
/// Ist das Abonnement aktiv?
/// </summary>
public bool Enabled { get; set; }
/// <summary>
/// Zeit in Tagen die als Toleranz bei Ablauf akzeptiert wird
/// </summary>
public int GracePeriodInDays { get; set; }
/// <summary>
/// Ist das Abonnement ausgeblendet?
/// </summary>
public bool Hidden { get; set; }
/// <summary>
/// Optional: the Max registered date of the app user to see this subscription
/// </summary>
public DateTimeOffset? MaxRegisteredDate { get; set; }
/// <summary>
/// Anzahl der Abonnements insgesamt
/// </summary>
public int SubscriptionCountTotal { get; set; }
/// <summary>
/// Anzahl der aktiven Abonnements
/// </summary>
public int SubscriptionCountActive { get; set; }
/// <summary>
/// Anzahl der inaktiven Abonnements
/// </summary>
public int SubscriptionCountInactive{ get; set; }
}
}