using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Globalization; using System.Linq; using System.Text; using System.Threading.Tasks; using gehGassi.Domain.Common; using gehGassi.Domain.Users; using Newtonsoft.Json; namespace gehGassi.Domain.Shop { /// /// Repräsentiert einen Warenkorb /// public class Cart : IAuditable { /// /// Id des Warenkorbs /// [Key] [Required] public long Id { get; set; } /// /// Welcher "Kunden-Typ" hat die Bestellung erstellt? /// [Required] public OrderSource OrderSource { get; set; } /// /// Id des App-Users /// public string AppUserId { get; set; } /// /// Kunde /// public long? CustomerId { get; set; } /// /// Gesamt-Preis Netto /// [Required] public decimal Total { get; set; } /// /// Gesamt-Preis Brutto /// [Required] public decimal TotalGross { get; set; } /// /// Versandkosten Netto /// [Required] public decimal Shipment { get; set; } /// /// Versandkosten Brutto /// [Required] public decimal ShipmentGross { get; set; } /// /// Steuerstufen mit Werten als Json /// public string TaxRatesJson { get; set; } /// /// Steuer-Einstellungen /// [NotMapped] public Dictionary TaxRates { get { if (string.IsNullOrWhiteSpace(TaxRatesJson)) return new Dictionary(); var taxRates = JsonConvert.DeserializeObject>(TaxRatesJson, new JsonSerializerSettings(){Culture = CultureInfo.CurrentCulture}); return taxRates; } set { var settings = JsonConvert.SerializeObject(value, new JsonSerializerSettings(){Culture = CultureInfo.InvariantCulture }); TaxRatesJson = settings; } } /// /// Rechnungsland ISO2 /// [Required] [MaxLength(2)] public string BillingCountryCode { get; set; } /// /// Lieferland ISO2 /// [Required] [MaxLength(2)] public string DeliveryCountryCode { get; set; } /// /// Datum der Erstellung /// [Required] public DateTimeOffset Created { get; set; } /// /// Datum der letzten Änderung /// public DateTimeOffset? LastUpdate { get; set; } #region IAuditable /// /// 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. /// /// Eindeutiger Key public string AuditKey() { return Id.ToString(); } /// /// Gibt den Objektnamen bzw. die Tabelle der Entität zurück /// /// Objektnamen public string AuditTable() { return "Carts"; } public AuditableOptions Options() { return AuditableOptions.Create | AuditableOptions.Edit | AuditableOptions.Delete; } #endregion } /// /// Repräsentiert einen Warenkorb - Liste /// public class CartWithNames { /// /// Id des Warenkorbs /// public long Id { get; set; } /// /// Welcher "Kunden-Typ" hat die Bestellung erstellt? /// public OrderSource OrderSource { get; set; } /// /// Id des App-Users /// public string AppUserId { get; set; } /// /// Name des App-Users /// public string AppUserName { get; set; } /// /// Kunde /// public long? CustomerId { get; set; } /// /// Name des Kunden /// public string CustomerName { get; set; } /// /// Gesamt-Preis Netto /// [Required] public decimal Total { get; set; } /// /// Gesamt-Preis Brutto /// [Required] public decimal TotalGross { get; set; } /// /// Versandkosten Netto /// [Required] public decimal Shipment { get; set; } /// /// Versandkosten Brutto /// [Required] public decimal ShipmentGross { get; set; } /// /// Steuerstufen mit Werten als Json /// public string TaxRatesJson { get; set; } /// /// Steuer-Einstellungen /// [NotMapped] public Dictionary TaxRates { get { if (string.IsNullOrWhiteSpace(TaxRatesJson)) return new Dictionary(); var taxRates = JsonConvert.DeserializeObject>(TaxRatesJson, new JsonSerializerSettings() { Culture = CultureInfo.CurrentCulture }); return taxRates; } set { var settings = JsonConvert.SerializeObject(value, new JsonSerializerSettings() { Culture = CultureInfo.InvariantCulture }); TaxRatesJson = settings; } } /// /// Rechnungsland ISO2 /// public string BillingCountryCode { get; set; } /// /// Lieferland ISO2 /// public string DeliveryCountryCode { get; set; } /// /// Datum der Erstellung /// public DateTimeOffset Created { get; set; } /// /// Datum der letzten Änderung /// public DateTimeOffset? LastUpdate { get; set; } /// /// Anzahl der Artikel im Warenkorb. /// Achtung: Summe der Quantity aller Artikel! /// public int ItemCount { get; set; } } /// /// Repräsentiert einen Artikel im Warenkorb /// public class CartItem : IAuditable { /// /// Id des Warenkorb-Items /// [Key] [Required] public long Id { get; set; } /// /// Id des Warenkorbs /// [Required] public long CartId { get; set; } /// /// Id des Artikels /// [Required] public int ProductId { get; set; } /// /// Typ /// [Required] public ProductType ProductType { get; set; } /// /// Id einer Listung, Werbung, Banner, Pin im Draft-Mode /// [MaxLength(128)] public string ItemId { get; set; } /// /// Stückzahl /// [Required] public int Quantity { get; set; } /// /// Preis des Produktes netto /// [Required] public decimal Price { get; set; } /// /// Preis des Produktes brutto /// [Required] public decimal PriceGross { get; set; } /// /// Preis des Produktes netto für Produkte die 2 Preise benötigen /// [Required] public decimal Price2 { get; set; } /// /// Preis des Produktes brutto für Produkte die 2 Preise benötigen /// [Required] public decimal Price2Gross { get; set; } /// /// Gesamt-Preis Netto /// [Required] public decimal Total { get; set; } /// /// Gesamt-Preis Brutto /// [Required] public decimal TotalGross { get; set; } /// /// Angewandte Steuer - also z.B. 10%, 20% /// [Required] public decimal TaxRate { get; set; } /// /// Errechneter Steuerbetrag - mit Berücksichtigung der Stückzahl /// [Required] public decimal TaxRateValue { get; set; } /// /// Datum der Erstellung /// [Required] public DateTimeOffset Created { get; set; } /// /// Datum der letzten Änderung /// public DateTimeOffset? LastUpdate { get; set; } #region IAuditable /// /// 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. /// /// Eindeutiger Key public string AuditKey() { return Id.ToString(); } /// /// Gibt den Objektnamen bzw. die Tabelle der Entität zurück /// /// Objektnamen public string AuditTable() { return "CartItems"; } public AuditableOptions Options() { return AuditableOptions.Create | AuditableOptions.Edit | AuditableOptions.Delete; } #endregion } /// /// Repräsentiert einen Artikel im Warenkorb - Liste /// public class CartItemWithNames { /// /// Id des Warenkorb-Items /// public long Id { get; set; } /// /// Id des Warenkorbs /// public long CartId { get; set; } /// /// Id des Artikels /// public int ProductId { get; set; } /// /// Name des Produktes /// public string ProductName { get; set; } /// /// Artikelnummer des Produktes /// public string ProductSku { get; set; } /// /// Bild des Produktes - entweder basierend auf Sprache oder das allgemeine Bild /// public string ProductImage { get; set; } /// /// Typ /// public ProductType ProductType { get; set; } /// /// Stückzahl /// public int Quantity { get; set; } /// /// Preis des Produktes netto /// public decimal Price { get; set; } /// /// Preis des Produktes brutto /// public decimal PriceGross { get; set; } /// /// Preis des Produktes netto für Produkte die 2 Preise benötigen /// public decimal Price2 { get; set; } /// /// Preis des Produktes brutto für Produkte die 2 Preise benötigen /// public decimal Price2Gross { get; set; } /// /// Gesamt-Preis Netto /// public decimal Total { get; set; } /// /// Gesamt-Preis Brutto /// public decimal TotalGross { get; set; } /// /// Angewandte Steuer - also z.B. 10%, 20% /// public decimal TaxRate { get; set; } /// /// Errechneter Steuerbetrag - mit Berücksichtigung der Stückzahl /// public decimal TaxRateValue { get; set; } /// /// Wie viele Produkte müssen mindestens bestellt werden? /// public int OrderMinimumQuantity { get; set; } /// /// Wie viele Produkte dürfen maximal bestellt werden? /// public int OrderMaximumQuantity { get; set; } /// /// Datum der Erstellung /// public DateTimeOffset Created { get; set; } /// /// Datum der letzten Änderung /// public DateTimeOffset? LastUpdate { get; set; } } }