using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Globalization; using Newtonsoft.Json; namespace gehGassi.Web.Models { /// /// Viewmodel für eine Bestellung /// public class OrderVm { /// /// Id der Bestellung /// [Required(ErrorMessage = "Err_Required")] public long Id { get; set; } /// /// Spezial-ID /// [Display(Name = "Order_UniqueId")] public Guid UniqueId { get; set; } /// /// Welcher "Kunden-Typ" hat die Bestellung erstellt? /// [Required(ErrorMessage = "Err_Required")] [Display(Name = "Order_OrderSource")] public OrderSourceVm OrderSource { get; set; } #region App-User /// /// Id des App-Users /// [Display(Name = "Order_DogOwnerId")] public string AppUserId { get; set; } /// /// Name des App-Userss (Vor- und Nachname) /// [MaxLength(250, ErrorMessage = "Err_StringLength_Max")] [Display(Name = "Order_DogOwnerName")] public string AppUserName { get; set; } /// /// App-Users - Firma /// [MaxLength(200, ErrorMessage = "Err_StringLength_Max")] [Display(Name = "Order_DogOwnerCompany")] public string AppUserCompany { get; set; } #endregion #region Kunde /// /// Kunde /// [Display(Name = "Order_CustomerId")] public long? CustomerId { get; set; } /// /// Name des Kunden / Vertriebspartners /// [Required(ErrorMessage = "Err_Required")] [MaxLength(200, ErrorMessage = "Err_StringLength_Max")] [Display(Name = "Order_CustomerName")] public string CustomerName { get; set; } #endregion /// /// Bestellnummer /// [Required(ErrorMessage = "Err_Required")] [MaxLength(100, ErrorMessage = "Err_StringLength_Max")] [Display(Name = "Order_Number")] public string Number { get; set; } /// /// Zähler für Bestell-Nummer /// [Required(ErrorMessage = "Err_Required")] [Display(Name = "Order_Counter")] public long Counter { get; set; } /// /// Zwischensumme Netto /// [Required(ErrorMessage = "Err_Required")] [Display(Name = "Order_Subtotal")] public decimal Subtotal { get; set; } /// /// Zwischensumme Brutto /// [Required(ErrorMessage = "Err_Required")] [Display(Name = "Order_SubtotalGross")] public decimal SubtotalGross { get; set; } /// /// Gesamt-Preis Netto /// [Required(ErrorMessage = "Err_Required")] [Display(Name = "Order_Total")] public decimal Total { get; set; } /// /// Gesamt-Preis Brutto /// [Required(ErrorMessage = "Err_Required")] [Display(Name = "Order_TotalGross")] public decimal TotalGross { get; set; } /// /// Versandkosten Netto /// [Required(ErrorMessage = "Err_Required")] [Display(Name = "Order_Shipment")] public decimal Shipment { get; set; } /// /// Versandkosten Brutto /// [Required(ErrorMessage = "Err_Required")] [Display(Name = "Order_ShipmentGross")] public decimal ShipmentGross { get; set; } /// /// Status der Bestellung /// [Required(ErrorMessage = "Err_Required")] [Display(Name = "Order_OrderStatus")] public OrderStatusVm OrderStatus { get; set; } /// /// Zahlungsart /// [Required(ErrorMessage = "Err_Required")] [Display(Name = "Order_PaymentType")] public PaymentTypeVm PaymentType { get; set; } /// /// Zahlungsstatus /// [Required(ErrorMessage = "Err_Required")] [Display(Name = "Order_PaymentStatus")] public PaymentStatusVm PaymentStatus { get; set; } /// /// Versandart /// [Required(ErrorMessage = "Err_Required")] [Display(Name = "Order_ShipmentType")] public ShipmentTypeVm ShipmentType { get; set; } /// /// Versandstatus /// [Required(ErrorMessage = "Err_Required")] [Display(Name = "Order_ShipmentStatus")] public ShipmentStatusVm ShipmentStatus { get; set; } /// /// Versanddatum /// [Display(Name = "Order_ShipmentDate")] public DateTimeOffset? ShipmentDate { get; set; } /// /// Lieferadresse /// [Display(Name = "Order_DeliveryAddress")] public OrderAddressVm DeliveryAddress { get; set; } /// /// REchnungsadresse /// [Display(Name = "Order_BillingAddress")] public OrderAddressVm BillingAddress { get; set; } /// /// Ist die Liefer-Adresse auch die Rechnungsadresse? /// [Required(ErrorMessage = "Err_Required")] [Display(Name = "Order_DeliveryAddressIsBilling")] public bool DeliveryAddressIsBilling { get; set; } /// /// Anmerkungen /// [MaxLength(1000, ErrorMessage = "Err_StringLength_Max")] [Display(Name = "Order_Comment")] public string Comment { get; set; } /// /// Steuerstufen mit Werten als Json /// [Display(Name = "Order_TaxRatesJson")] public string TaxRatesJson { get; set; } /// /// Benutzer-Einstellungen /// [Display(Name = "Order_TaxRates")] 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(ErrorMessage = "Err_Required")] [Display(Name = "Common_Created")] public DateTimeOffset Created { get; set; } /// /// Datum der letzten Änderung /// [Display(Name = "Common_LastUpdate")] public DateTimeOffset? LastUpdate { get; set; } /// /// Wann wurden die AGB akzeptiert /// [Display(Name = "Order_AcceptTermsAndConditionsDate")] public DateTimeOffset? AcceptTermsAndConditionsDate { get; set; } /// /// Wann wurden die Datenschutzbestimmung akzeptiert /// [Display(Name = "Order_AcceptGdprDate")] public DateTimeOffset? AcceptGdprDate { get; set; } /// /// Wurde die Bestellung gelöscht? /// [Required(ErrorMessage = "Err_Required")] [Display(Name = "Common_Deleted")] public bool Deleted { get; set; } #region PayPal & Klarna Info /// /// Datum der Bezahlung via PayPal oder Klarna /// [Display(Name = "Order_PaymentDate")] public DateTimeOffset? PaymentDate { get; set; } /// /// ID der PayPal-Order wenn Zahlung mittels PayPal /// [MaxLength(200, ErrorMessage = "Err_StringLength_Max")] [Display(Name = "Order_PayPalOrderId")] public string PayPalOrderId { get; set; } /// /// ID der Klarna-Order wenn Zahlung mittels Klarna /// [MaxLength(200, ErrorMessage = "Err_StringLength_Max")] [Display(Name = "Order_KlarnaOrderId")] public string KlarnaOrderId { get; set; } /// /// Datum wann die "Alles versendet" Info an Klarna übergeben wurde /// [Display(Name = "Order_KlarnaShipmentSentDate")] public DateTimeOffset? KlarnaShipmentSentDate { get; set; } /// /// Gibt an ob beim Melden des Versands ein Problem aufgetreten ist und diese Bestellung ignoriert werden soll /// [Display(Name = "Order_KlarnaShipmentError")] public bool KlarnaShipmentError { get; set; } /// /// Optional: Infos seitens des PaymentProviders /// [Display(Name = "Order_PaymentInfo")] public string PaymentInfo { get; set; } #endregion /// /// Liste der Artikel /// public List Items { get; set; } /// /// Erstellt eine Instanz /// public OrderVm() { DeliveryAddress = new OrderAddressVm(); BillingAddress = new OrderAddressVm(); Items = new List(); } } /// /// Viewmodel für eine Adresse für eine Bestellung /// public class OrderAddressVm { /// /// Titel /// [MaxLength(100, ErrorMessage = "Err_StringLength_Max")] [Display(Name = "OrderAddress_Title")] public string Title { get; set; } /// /// Vorname /// [MaxLength(100, ErrorMessage = "Err_StringLength_Max")] [Display(Name = "OrderAddress_FirstName")] public string FirstName { get; set; } /// /// Nachname /// [MaxLength(100, ErrorMessage = "Err_StringLength_Max")] [Display(Name = "OrderAddress_LastName")] public string LastName { get; set; } /// /// Company /// [MaxLength(200, ErrorMessage = "Err_StringLength_Max")] [Display(Name = "OrderAddress_Company")] public string Company { get; set; } /// /// UID Nummer /// [MaxLength(50, ErrorMessage = "Err_StringLength_Max")] [Display(Name = "OrderAddress_Vat")] public string Vat { get; set; } /// /// Optionale Adresszeile 1 /// [Required(ErrorMessage = "Err_Required")] [MaxLength(100, ErrorMessage = "Err_StringLength_Max")] [Display(Name = "OrderAddress_AddressLine1")] public string AddressLine1 { get; set; } /// /// Optionale Adresszeile 2 /// [MaxLength(100, ErrorMessage = "Err_StringLength_Max")] [Display(Name = "OrderAddress_AddressLine2")] public string AddressLine2 { get; set; } /// /// Optional: Stadt / Ort /// [Required(ErrorMessage = "Err_Required")] [MaxLength(100, ErrorMessage = "Err_StringLength_Max")] [Display(Name = "OrderAddress_City")] public string City { get; set; } /// /// Optinale PLZ /// [Required(ErrorMessage = "Err_Required")] [MaxLength(20, ErrorMessage = "Err_StringLength_Max")] [Display(Name = "OrderAddress_Zip")] public string Zip { get; set; } /// /// Bundesland / Staat /// [Required(ErrorMessage = "Err_Required")] [MaxLength(25, ErrorMessage = "Err_StringLength_Max")] [Display(Name = "OrderAddress_State")] public string State { get; set; } /// /// ISO2 Ländercode /// [Required(ErrorMessage = "Err_Required")] [MaxLength(2, ErrorMessage = "Err_StringLength_Max")] [Display(Name = "OrderAddress_CountryCode")] public string CountryCode { get; set; } public string GetNameForPayPal() { if (!string.IsNullOrWhiteSpace(Company)) return Company; return $"{FirstName} {LastName}"; } } /// /// Viewmodel für einen Artikel in einer Bestellung /// public class OrderItemVm { /// /// Id des Bestell-Items /// [Required(ErrorMessage = "Err_Required")] public long Id { get; set; } /// /// Id der Bestellung /// [Required(ErrorMessage = "Err_Required")] [Display(Name = "OrderItem_OrderId")] public long OrderId { get; set; } /// /// Id des Artikels /// [Display(Name = "OrderItem_ProductId")] public int? ProductId { get; set; } /// /// Id der Produktkategorie /// [Display(Name = "OrderItem_ProductCategoryId")] public int? ProductCategoryId { get; set; } /// /// Name des Artikels /// [Required(ErrorMessage = "Err_Required")] [MaxLength(200, ErrorMessage = "Err_StringLength_Max")] [Display(Name = "OrderItem_Name")] public string Name { get; set; } /// /// Name des Artikels in Standardsprache /// [Required(ErrorMessage = "Err_Required")] [MaxLength(200, ErrorMessage = "Err_StringLength_Max")] [Display(Name = "OrderItem_NameDefault")] public string NameDefault { get; set; } /// /// Artikelnummer /// [Required(ErrorMessage = "Err_Required")] [MaxLength(100, ErrorMessage = "Err_StringLength_Max")] [Display(Name = "OrderItem_Sku")] public string Sku { get; set; } /// /// Typ /// [Required(ErrorMessage = "Err_Required")] [Display(Name = "OrderItem_ProductType")] public ProductTypeVm ProductType { get; set; } /// /// Id einer Listung, Werbung, Banner, Pin im Draft-Mode /// [MaxLength(128, ErrorMessage = "Err_StringLength_Max")] [Display(Name = "OrderItem_ItemId")] public string ItemId { get; set; } /// /// Id der Zugeordneten Steuer /// [Required(ErrorMessage = "Err_Required")] [Display(Name = "OrderItem_TaxRateId")] public int TaxRateId { get; set; } /// /// Gibt an ob das Produkt von der Steuer ausgenommen ist /// [Required(ErrorMessage = "Err_Required")] [Display(Name = "OrderItem_IsTaxExempt")] public bool IsTaxExempt { get; set; } /// /// Gibt an ob das Produkt versendet werden kann /// [Required(ErrorMessage = "Err_Required")] [Display(Name = "OrderItem_IsShipEnabled")] public bool IsShipEnabled { get; set; } /// /// Gibt an ob das Produkt Versandkostenbefreit ist /// [Required(ErrorMessage = "Err_Required")] [Display(Name = "OrderItem_IsFreeShipping")] public bool IsFreeShipping { get; set; } /// /// Zusatzversandkosten netto /// [Required(ErrorMessage = "Err_Required")] [Display(Name = "OrderItem_AdditionalShippingCharge")] public decimal AdditionalShippingCharge { get; set; } /// /// Stückzahl /// [Required(ErrorMessage = "Err_Required")] [Display(Name = "OrderItem_Quantity")] public int Quantity { get; set; } /// /// Einzel-Preis Netto /// [Required(ErrorMessage = "Err_Required")] [Display(Name = "OrderItem_Price")] public decimal Price { get; set; } /// /// Einzel-Preis Brutto /// [Required(ErrorMessage = "Err_Required")] [Display(Name = "OrderItem_PriceGross")] public decimal PriceGross { get; set; } /// /// Preis des Produktes netto für Produkte die 2 Preise benötigen /// [Required(ErrorMessage = "Err_Required")] [Display(Name = "OrderItem_Price2")] public decimal Price2 { get; set; } /// /// Preis des Produktes brutto für Produkte die 2 Preise benötigen /// [Required(ErrorMessage = "Err_Required")] [Display(Name = "OrderItem_Price2Gross")] public decimal Price2Gross { get; set; } /// /// Gesamt-Preis Netto /// [Required(ErrorMessage = "Err_Required")] [Display(Name = "OrderItem_Total")] public decimal Total { get; set; } /// /// Gesamt-Preis Brutto /// [Required(ErrorMessage = "Err_Required")] [Display(Name = "OrderItem_TotalGross")] public decimal TotalGross { get; set; } /// /// Gets or sets the weight /// [Required(ErrorMessage = "Err_Required")] [Display(Name = "OrderItem_Weight")] public decimal Weight { get; set; } /// /// Gets or sets the length /// [Required(ErrorMessage = "Err_Required")] [Display(Name = "OrderItem_Length")] public decimal Length { get; set; } /// /// Gets or sets the width /// [Required(ErrorMessage = "Err_Required")] [Display(Name = "OrderItem_Width")] public decimal Width { get; set; } /// /// Gets or sets the height /// [Required(ErrorMessage = "Err_Required")] [Display(Name = "OrderItem_Height")] public decimal Height { get; set; } /// /// Datum der Erstellung /// [Required(ErrorMessage = "Err_Required")] [Display(Name = "Common_Created")] public DateTimeOffset Created { get; set; } /// /// Datum der letzten Änderung /// [Display(Name = "Common_LastUpdate")] public DateTimeOffset? LastUpdate { get; set; } /// /// Zusatzinfos zum Produkt wenn Listung, Banner usw. /// public string ProductSpecialInfo { get; set; } } /// /// Viewmodel für eine Bestellung Listendarstellung /// public class OrderListVm { /// /// Id der Bestellung /// public long Id { get; set; } /// /// Spezial-ID /// public Guid UniqueId { get; set; } /// /// Welcher "Kunden-Typ" hat die Bestellung erstellt? /// public OrderSourceVm OrderSource { get; set; } /// /// Welcher "Kunden-Typ" hat die Bestellung erstellt? /// public string OrderSourceText { get; set; } /// /// Name des Bestellers in Abhängigkeit der Bestellquelle /// public string OrderSourceName { get { switch (OrderSource) { case OrderSourceVm.Customer: return CustomerName; case OrderSourceVm.AppUserDogOwner: return AppUserName; case OrderSourceVm.AppUserDogWalker: return AppUserName; case OrderSourceVm.AppUserBoth: return AppUserName; default: throw new ArgumentOutOfRangeException(); } } } #region Hundebesitzer /// /// Id des App-Users /// public string AppUserId { get; set; } /// /// Name des App-Userss (Vor- und Nachname) /// public string AppUserName { get; set; } /// /// App-Users - Firma /// public string AppUserCompany { get; set; } #endregion #region Kunde /// /// Kunde /// public long? CustomerId { get; set; } /// /// Name des Kunden / Vertriebspartners /// public string CustomerName { get; set; } #endregion /// /// Bestellnummer /// public string Number { get; set; } /// /// Zwischensumme Netto /// public decimal Subtotal { get; set; } /// /// Zwischensumme Brutto /// public decimal SubtotalGross { get; set; } /// /// Gesamt-Preis Netto /// public decimal Total { get; set; } /// /// Gesamt-Preis Brutto /// public decimal TotalGross { get; set; } /// /// Versandkosten Netto /// public decimal Shipment { get; set; } /// /// Versandkosten Brutto /// public decimal ShipmentGross { get; set; } /// /// Status der Bestellung /// public OrderStatusVm OrderStatus { get; set; } /// /// Status der Bestellung /// public string OrderStatusText { get; set; } /// /// Zahlungsart /// public PaymentTypeVm PaymentType { get; set; } /// /// Zahlungsart /// public string PaymentTypeText { get; set; } /// /// Zahlungsstatus /// public PaymentStatusVm PaymentStatus { get; set; } /// /// Zahlungsstatus /// public string PaymentStatusText { get; set; } /// /// Versandart /// public ShipmentTypeVm ShipmentType { get; set; } /// /// Versandart /// public string ShipmentTypeText { get; set; } /// /// Versandstatus /// public ShipmentStatusVm ShipmentStatus { get; set; } /// /// Versandstatus /// public string ShipmentStatusText { get; set; } /// /// Versanddatum /// public DateTimeOffset? ShipmentDate { get; set; } /// /// Datum der Erstellung /// public DateTimeOffset Created { get; set; } /// /// Datum der letzten Änderung /// public DateTimeOffset? LastUpdate { get; set; } /// /// Wurde die Bestellung gelöscht? /// public bool Deleted { get; set; } } /// /// Hilfsklasse für das Aktualisieren eines der Status-Felder einer Bestellung /// public class UpdateOrderStatusVm { /// /// Name des Feldes /// [Required(ErrorMessage = "Err_Required")] public string Name { get; set; } /// /// Id der Bestellung - UniqueID!!! /// [Required(ErrorMessage = "Err_Required")] public string PrimaryKey { get; set; } /// /// Wert der gesetzt werden soll. Enum, aber als ZAHL! /// [Required(ErrorMessage = "Err_Required")] public string Value { get; set; } } }