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