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