819 lines
25 KiB
C#

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