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