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 Newtonsoft.Json; namespace gehGassi.Domain.Shop { /// /// Repräsentiert eine Bestellung /// public class Order : IAuditable { /// /// Id der Bestellung /// [Key] [Required] public long Id { get; set; } /// /// Spezial-ID /// public Guid UniqueId { get; set; } /// /// Welcher "Kunden-Typ" hat die Bestellung erstellt? /// [Required] public OrderSource OrderSource { get; set; } #region App-User /// /// Id des App-Users /// public string AppUserId { get; set; } /// /// Name des App-Users (Vor- und Nachname) /// [MaxLength(250)] public string AppUserName { get; set; } /// /// App-User - Firma /// [MaxLength(200)] public string AppUserCompany { get; set; } #endregion #region Kunde /// /// Kunde /// public long? CustomerId { get; set; } /// /// Name des Kunden / Vertriebspartners /// [Required] [MaxLength(200)] public string CustomerName { get; set; } #endregion /// /// Bestellnummer /// [Required] [MaxLength(100)] public string Number { get; set; } /// /// Zähler für Bestell-Nummer /// [Required] public long Counter { get; set; } /// /// Zwischensumme Netto /// [Required] public decimal Subtotal { get; set; } /// /// Zwischensumme Brutto /// [Required] public decimal SubtotalGross { 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; } /// /// Status der Bestellung /// [Required] public OrderStatus OrderStatus { get; set; } /// /// Zahlungsart /// [Required] public PaymentType PaymentType { get; set; } /// /// Zahlungsstatus /// [Required] public PaymentStatus PaymentStatus { get; set; } /// /// Versandart /// [Required] public ShipmentType ShipmentType { get; set; } /// /// Versandstatus /// [Required] public ShipmentStatus ShipmentStatus { get; set; } /// /// Versanddatum /// public DateTimeOffset? ShipmentDate { get; set; } /// /// Lieferadresse /// public OrderAddress DeliveryAddress { get; set; } /// /// REchnungsadresse /// public OrderAddress BillingAddress { get; set; } /// /// Ist die Liefer-Adresse auch die Rechnungsadresse? /// [Required] public bool DeliveryAddressIsBilling { get; set; } /// /// Anmerkungen /// [MaxLength(1000)] public string Comment { get; set; } /// /// Steuerstufen mit Werten als Json /// public string TaxRatesJson { get; set; } /// /// Benutzer-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; } } /// /// Datum der Erstellung /// [Required] public DateTimeOffset Created { get; set; } /// /// Datum der letzten Änderung /// public DateTimeOffset? LastUpdate { get; set; } /// /// Wann wurden die AGB akzeptiert /// public DateTimeOffset? AcceptTermsAndConditionsDate { get; set; } /// /// Wann wurden die Datenschutzbestimmung akzeptiert /// public DateTimeOffset? AcceptGdprDate { get; set; } /// /// Wurde die Bestellung gelöscht? /// [Required] public bool Deleted { get; set; } #region PayPal & Klarna Info /// /// Datum der Bezahlung via PayPal oder Klarna /// public DateTimeOffset? PaymentDate { get; set; } /// /// ID der PayPal-Order wenn Zahlung mittels PayPal /// [MaxLength(200)] public string PayPalOrderId { get; set; } /// /// ID der Klarna-Order wenn Zahlung mittels Klarna /// [MaxLength(200)] public string KlarnaOrderId { get; set; } /// /// Datum wann die "Alles versendet" Info an Klarna übergeben wurde /// public DateTimeOffset? KlarnaShipmentSentDate { get; set; } /// /// Gibt an ob beim Melden des Versands ein Problem aufgetreten ist und diese Bestellung ignoriert werden soll /// public bool KlarnaShipmentError { get; set; } /// /// Optional: Infos seitens des PaymentProviders /// public string PaymentInfo { get; set; } #endregion #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 "Orders"; } public AuditableOptions Options() { return AuditableOptions.Create | AuditableOptions.Edit | AuditableOptions.Delete; } #endregion } /// /// Repräsentiert einen Artikel in einer Bestellung /// public class OrderItem : IAuditable { /// /// Id des Bestell-Items /// [Key] [Required] public long Id { get; set; } /// /// Id der Bestellung /// [Required] public long OrderId { get; set; } /// /// Id des Artikels /// public int? ProductId { get; set; } /// /// Id der Produktkategorie /// public int? ProductCategoryId { get; set; } /// /// Name des Artikels /// [Required] [MaxLength(200)] public string Name { get; set; } /// /// Name des Artikels in Standardsprache /// [Required] [MaxLength(200)] public string NameDefault { get; set; } /// /// Artikelnummer /// [Required] [MaxLength(100)] public string Sku { 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; } /// /// Id der Zugeordneten Steuer /// [Required] public int TaxRateId { get; set; } /// /// Gibt an ob das Produkt von der Steuer ausgenommen ist /// [Required] public bool IsTaxExempt { get; set; } /// /// Gibt an ob das Produkt versendet werden kann /// [Required] public bool IsShipEnabled { get; set; } /// /// Gibt an ob das Produkt Versandkostenbefreit ist /// [Required] public bool IsFreeShipping { get; set; } /// /// Zusatzversandkosten netto /// [Required] public decimal AdditionalShippingCharge { get; set; } /// /// Stückzahl /// [Required] public int Quantity { get; set; } /// /// Einzel-Preis Netto /// [Required] public decimal Price { get; set; } /// /// Einzel-Preis 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; } /// /// Gets or sets the weight /// [Required] public decimal Weight { get; set; } /// /// Gets or sets the length /// [Required] public decimal Length { get; set; } /// /// Gets or sets the width /// [Required] public decimal Width { get; set; } /// /// Gets or sets the height /// [Required] public decimal Height { 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 "OrderItems"; } public AuditableOptions Options() { return AuditableOptions.Create | AuditableOptions.Edit | AuditableOptions.Delete; } #endregion } /// /// Repräsentiert eine Adresse für eine Bestellung /// public class OrderAddress { /// /// Titel /// [MaxLength(100)] public string Title { get; set; } /// /// Vorname /// [MaxLength(100)] public string FirstName { get; set; } /// /// Nachname /// [MaxLength(100)] public string LastName { get; set; } /// /// Company /// [MaxLength(200)] public string Company { get; set; } /// /// UID Nummer /// [MaxLength(50)] public string Vat { get; set; } /// /// Optionale Adresszeile 1 /// [MaxLength(100)] public string AddressLine1 { get; set; } /// /// Optionale Adresszeile 2 /// [MaxLength(100)] public string AddressLine2 { get; set; } /// /// Optional: Stadt / Ort /// [MaxLength(100)] public string City { get; set; } /// /// Optinale PLZ /// [MaxLength(20)] public string Zip { get; set; } /// /// Bundesland / Staat /// [MaxLength(25)] public string State { get; set; } /// /// ISO2 Ländercode /// [Required] [MaxLength(2)] public string CountryCode { get; set; } public string GetNameForPayPal() { if (!string.IsNullOrWhiteSpace(Company)) return Company; return $"{FirstName} {LastName}"; } } /// /// Hilfsklasse für die Abfrage von Bestellungen mit der Anzahl von physischen Produkten /// Wird verwendet um Klarna-Bestellungen die keine physischen Produkte beinhalten auf versendet zu setzen /// public class OrderPhysical { /// /// Id der Bestellung /// public long Id { get; set; } /// /// Spezial-ID /// public Guid UniqueId { get; set; } /// /// Status der Bestellung /// public OrderStatus OrderStatus { get; set; } /// /// Zahlungsart /// public PaymentType PaymentType { get; set; } /// /// Zahlungsstatus /// public PaymentStatus PaymentStatus { get; set; } /// /// Versandart /// public ShipmentType ShipmentType { get; set; } /// /// Versandstatus /// public ShipmentStatus ShipmentStatus { get; set; } /// /// Versanddatum /// public DateTimeOffset? ShipmentDate { get; set; } /// /// Anzahl der physischen Produkte in einer Bestellung /// public int PhysicalCount { get; set; } /// /// Wurde die Bestellung gelöscht? /// public bool Deleted { get; set; } #region PayPal & Klarna Info /// /// Datum der Bezahlung via PayPal oder Klarna /// public DateTimeOffset? PaymentDate { get; set; } /// /// ID der PayPal-Order wenn Zahlung mittels PayPal /// public string PayPalOrderId { get; set; } /// /// ID der Klarna-Order wenn Zahlung mittels Klarna /// public string KlarnaOrderId { get; set; } /// /// Datum wann die "Alles versendet" Info an Klarna übergeben wurde /// public DateTimeOffset? KlarnaShipmentSentDate { get; set; } /// /// Gibt an ob beim Melden des Versands ein Problem aufgetreten ist und diese Bestellung ignoriert werden soll /// public bool KlarnaShipmentError { get; set; } /// /// Optional: Infos seitens des PaymentProviders /// public string PaymentInfo { get; set; } #endregion } }