1047 lines
35 KiB
C#
1047 lines
35 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel.DataAnnotations;
|
|
using gehGassi.Domain.Localization;
|
|
using gehGassi.Web.Helper;
|
|
using Microsoft.Extensions.Localization;
|
|
|
|
namespace gehGassi.Web.Models
|
|
{
|
|
/// <summary>
|
|
/// Viewmodel für ein Produkt
|
|
/// </summary>
|
|
public class ProductVm
|
|
{
|
|
/// <summary>
|
|
/// Eindeutige Id
|
|
/// </summary>
|
|
[Required(ErrorMessage = "Err_Required")]
|
|
public int Id { get; set; }
|
|
|
|
/// <summary>
|
|
/// Produkttyp
|
|
/// </summary>
|
|
[Required(ErrorMessage = "Err_Required")]
|
|
[Display(Name = "Product_ProductType", Description = "Product_ProductType_Desc")]
|
|
public ProductTypeVm ProductType { get; set; }
|
|
|
|
/// <summary>
|
|
/// Um welche Art von Listung handelt es sich, wenn das Produkt für Listungen ist
|
|
/// </summary>
|
|
[Display(Name = "Common_ListingType", Description = "Common_ListingType_Desc")]
|
|
public ListingTypeVm ListingType { get; set; }
|
|
|
|
/// <summary>
|
|
/// Id der Rubrik - notwendig wenn Typ Listung!
|
|
/// </summary>
|
|
[Display(Name = "Product_AdvertisementCategoryId")]
|
|
public string AdvertisementCategoryId { get; set; }
|
|
|
|
/// <summary>
|
|
/// Id der Produktkategorie
|
|
/// </summary>
|
|
[Display(Name = "Product_ProductCategoryId")]
|
|
public int? ProductCategoryId { get; set; }
|
|
|
|
/// <summary>
|
|
/// Id der Branche - notwendig wenn Typ Listung!
|
|
/// </summary>
|
|
[Display(Name = "Product_BranchId")]
|
|
public string BranchId { get; set; }
|
|
|
|
/// <summary>
|
|
/// Einstellung wer das Produkt sehen darf
|
|
/// </summary>
|
|
[Required(ErrorMessage = "Err_Required")]
|
|
[Display(Name = "Product_Visibility", Description = "Product_Visibility_Desc")]
|
|
public ShopVisibilityVm Visibility { get; set; }
|
|
|
|
/// <summary>
|
|
/// Art des Preises für die Kalkulation
|
|
/// </summary>
|
|
[Required(ErrorMessage = "Err_Required")]
|
|
[Display(Name = "Product_PriceType", Description = "Product_PriceType_Desc")]
|
|
public PriceTypeVm PriceType { get; set; }
|
|
|
|
/// <summary>
|
|
/// Aliquot Berechnung?
|
|
/// </summary>
|
|
[Required(ErrorMessage = "Err_Required")]
|
|
[Display(Name = "Product_PriceAliquotType", Description = "Product_PriceAliquotType_Desc")]
|
|
public PriceAliquotTypeVm PriceAliquotType { get; set; }
|
|
|
|
/// <summary>
|
|
/// Starttyp bei Zeitbezogenen Produkten
|
|
/// </summary>
|
|
[Required(ErrorMessage = "Err_Required")]
|
|
[Display(Name = "Product_ProductStartType", Description = "Product_ProductStartType_Desc")]
|
|
public ProductStartTypeVm ProductStartType { get; set; }
|
|
|
|
/// <summary>
|
|
/// Wenn Banner, wo plaziert
|
|
/// </summary>
|
|
[Required(ErrorMessage = "Err_Required")]
|
|
[Display(Name = "Product_BannerLocation", Description = "Product_BannerLocation_Desc")]
|
|
public BannerLocationVm BannerLocation { get; set; }
|
|
|
|
/// <summary>
|
|
/// Wenn Banner wie groß?
|
|
/// </summary>
|
|
[Required(ErrorMessage = "Err_Required")]
|
|
[Display(Name = "Product_BannerSize", Description = "Product_BannerSize_Desc")]
|
|
public BannerSizeVm BannerSize { get; set; }
|
|
|
|
/// <summary>
|
|
/// Pin: Radius in KM der bei einem Pin inkludiert ist
|
|
/// </summary>
|
|
[Required(ErrorMessage = "Err_Required")]
|
|
[Range(0.0, 500.0, ErrorMessage = "Err_Range")]
|
|
[Display(Name = "Product_PinRadius", Description = "Product_PinRadius_Desc")]
|
|
public double PinRadius { get; set; }
|
|
|
|
/// <summary>
|
|
/// Pin: Prozent des Preises je zusätzlichen KM als Aufschlag
|
|
/// </summary>
|
|
[Required(ErrorMessage = "Err_Required")]
|
|
[Range(0.0, 100.0, ErrorMessage = "Err_Range")]
|
|
[Display(Name = "Product_PinPercentPerKm", Description = "Product_PinPercentPerKm_Desc")]
|
|
public decimal PinPercentPerKm { get; set; }
|
|
|
|
/// <summary>
|
|
/// Bild für das Produkt - Allgemein
|
|
/// </summary>
|
|
[MaxLength(500, ErrorMessage = "Err_StringLength_Max")]
|
|
[Display(Name = "Product_Image", Description = "Product_Image_Desc")]
|
|
public string Image { get; set; }
|
|
|
|
/// <summary>
|
|
/// Interne Anmerkungen
|
|
/// </summary>
|
|
[Display(Name = "Common_Comment")]
|
|
public string Comment { get; set; }
|
|
|
|
/// <summary>
|
|
/// Artikelnummer
|
|
/// </summary>
|
|
[Required(ErrorMessage = "Err_Required")]
|
|
[MaxLength(100, ErrorMessage = "Err_StringLength_Max")]
|
|
[Display(Name = "Product_Sku", Description = "Product_Sku_Desc")]
|
|
public string Sku { get; set; }
|
|
|
|
/// <summary>
|
|
/// Nummer laut Hersteller
|
|
/// </summary>
|
|
[MaxLength(100, ErrorMessage = "Err_StringLength_Max")]
|
|
[Display(Name = "Product_ManufacturerPartNumber", Description = "Product_ManufacturerPartNumber_Desc")]
|
|
public string ManufacturerPartNumber { get; set; }
|
|
|
|
/// <summary>
|
|
/// Id des Downloads, wenn das Produkt ein Download ist
|
|
/// </summary>
|
|
[Display(Name = "Product_DownloadId", Description = "Product_DownloadId_Desc")]
|
|
public int? DownloadId { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gibt an ob das Produkt versendet werden kann
|
|
/// </summary>
|
|
[Required(ErrorMessage = "Err_Required")]
|
|
[Display(Name = "Product_IsShipEnabled", Description = "Product_IsShipEnabled_Desc")]
|
|
public bool IsShipEnabled { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gibt an ob das Produkt Versandkostenbefreit ist
|
|
/// </summary>
|
|
[Required(ErrorMessage = "Err_Required")]
|
|
[Display(Name = "Product_IsFreeShipping", Description = "Product_IsFreeShipping_Desc")]
|
|
public bool IsFreeShipping { get; set; }
|
|
|
|
/// <summary>
|
|
/// Zusatzversandkosten netto
|
|
/// </summary>
|
|
[Required(ErrorMessage = "Err_Required")]
|
|
[Range(0.0, 100000, ErrorMessage = "Err_Range")]
|
|
[Display(Name = "Product_AdditionalShippingCharge", Description = "Product_AdditionalShippingCharge_Desc")]
|
|
public decimal AdditionalShippingCharge { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gibt an ob das Produkt von der Steuer ausgenommen ist
|
|
/// </summary>
|
|
[Required(ErrorMessage = "Err_Required")]
|
|
[Display(Name = "Product_IsTaxExempt", Description = "Product_IsTaxExempt_Desc")]
|
|
public bool IsTaxExempt { get; set; }
|
|
|
|
/// <summary>
|
|
/// Id der Zugeordneten Steuer
|
|
/// </summary>
|
|
[Required(ErrorMessage = "Err_Required")]
|
|
[Range(1, int.MaxValue, ErrorMessage = "Err_Required")]
|
|
[Display(Name = "Product_TaxRateId", Description = "Product_TaxRateId_Desc")]
|
|
public int TaxRateId { get; set; }
|
|
|
|
/// <summary>
|
|
/// Anzahl der Produkte auf Lager
|
|
/// </summary>
|
|
[Required(ErrorMessage = "Err_Required")]
|
|
[Range(0, 100000000, ErrorMessage = "Err_Range")]
|
|
[Display(Name = "Product_StockQuantity", Description = "Product_StockQuantity_Desc")]
|
|
public int StockQuantity { get; set; }
|
|
|
|
/// <summary>
|
|
/// Soll die Lagerverfügbarkeit angezeigt werden?
|
|
/// </summary>
|
|
[Required(ErrorMessage = "Err_Required")]
|
|
[Display(Name = "Product_DisplayStockAvailability", Description = "Product_DisplayStockAvailability_Desc")]
|
|
public bool DisplayStockAvailability { get; set; }
|
|
|
|
/// <summary>
|
|
/// Soll die Anzahl der Produkte auf Lager angezeigt werden?
|
|
/// </summary>
|
|
[Required(ErrorMessage = "Err_Required")]
|
|
[Display(Name = "Product_DisplayStockQuantity", Description = "Product_DisplayStockQuantity_Desc")]
|
|
public bool DisplayStockQuantity { get; set; }
|
|
|
|
/// <summary>
|
|
/// Ab wie vielen Produkten eine Warnung an den Admin senden?
|
|
/// </summary>
|
|
[Required(ErrorMessage = "Err_Required")]
|
|
[Range(0, 100000000, ErrorMessage = "Err_Range")]
|
|
[Display(Name = "Product_NotifyAdminForQuantityBelow", Description = "Product_NotifyAdminForQuantityBelow_Desc")]
|
|
public int NotifyAdminForQuantityBelow { get; set; }
|
|
|
|
/// <summary>
|
|
/// Wie viele Produkte müssen mindestens bestellt werden?
|
|
/// </summary>
|
|
[Required(ErrorMessage = "Err_Required")]
|
|
[Range(0, 100000000, ErrorMessage = "Err_Range")]
|
|
[Display(Name = "Product_OrderMinimumQuantity", Description = "Product_OrderMinimumQuantity_Desc")]
|
|
public int OrderMinimumQuantity { get; set; }
|
|
|
|
/// <summary>
|
|
/// Wie viele Produkte dürfen maximal bestellt werden?
|
|
/// </summary>
|
|
[Required(ErrorMessage = "Err_Required")]
|
|
[Range(0, 100000000, ErrorMessage = "Err_Range")]
|
|
[Display(Name = "Product_OrderMaximumQuantity", Description = "Product_OrderMaximumQuantity_Desc")]
|
|
public int OrderMaximumQuantity { get; set; }
|
|
|
|
/// <summary>
|
|
/// Preis des Produktes netto
|
|
/// </summary>
|
|
[Required(ErrorMessage = "Err_Required")]
|
|
[Range(0.0, 100000000, ErrorMessage = "Err_Range")]
|
|
[Display(Name = "Product_Price", Description = "Product_Price_Desc")]
|
|
public decimal Price { get; set; }
|
|
|
|
/// <summary>
|
|
/// Alter Preis wenn man eine Aktion setzen möchte
|
|
/// </summary>
|
|
[Required(ErrorMessage = "Err_Required")]
|
|
[Range(0.0, 100000000, ErrorMessage = "Err_Range")]
|
|
[Display(Name = "Product_OldPrice", Description = "Product_OldPrice_Desc")]
|
|
public decimal OldPrice { get; set; }
|
|
|
|
/// <summary>
|
|
/// Preis des Produktes netto für Produkte die 2 Preise benötigen
|
|
/// </summary>
|
|
[Required(ErrorMessage = "Err_Required")]
|
|
[Range(0.0, 100000000, ErrorMessage = "Err_Range")]
|
|
[Display(Name = "Product_Price2", Description = "Product_Price2_Desc")]
|
|
public decimal Price2 { get; set; }
|
|
|
|
/// <summary>
|
|
/// Alter Preis wenn man eine Aktion setzen möchte für Produkte die 2 Preise benötigen
|
|
/// </summary>
|
|
[Required(ErrorMessage = "Err_Required")]
|
|
[Range(0.0, 100000000, ErrorMessage = "Err_Range")]
|
|
[Display(Name = "Product_OldPrice2", Description = "Product_OldPrice2_Desc")]
|
|
public decimal OldPrice2 { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets the weight
|
|
/// </summary>
|
|
[Required(ErrorMessage = "Err_Required")]
|
|
[Range(0.0, 100000, ErrorMessage = "Err_Range")]
|
|
[Display(Name = "Product_Weight", Description = "Product_Weight_Desc")]
|
|
public decimal Weight { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets the length
|
|
/// </summary>
|
|
[Required(ErrorMessage = "Err_Required")]
|
|
[Range(0.0, 100000000, ErrorMessage = "Err_Range")]
|
|
[Display(Name = "Product_Length", Description = "Product_Length_Desc")]
|
|
public decimal Length { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets the width
|
|
/// </summary>
|
|
[Required(ErrorMessage = "Err_Required")]
|
|
[Range(0.0, 100000000, ErrorMessage = "Err_Range")]
|
|
[Display(Name = "Product_Width", Description = "Product_Width_Desc")]
|
|
public decimal Width { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets the height
|
|
/// </summary>
|
|
[Required(ErrorMessage = "Err_Required")]
|
|
[Range(0.0, 100000000, ErrorMessage = "Err_Range")]
|
|
[Display(Name = "Product_Height", Description = "Product_Height_Desc")]
|
|
public decimal Height { get; set; }
|
|
|
|
/// <summary>
|
|
/// Reihenfolge der Darstellung, danach nach Name
|
|
/// </summary>
|
|
[Required(ErrorMessage = "Err_Required")]
|
|
[Display(Name = "Common_DisplayOrder", Description = "Common_DisplayOrder_Desc")]
|
|
public int DisplayOrder { get; set; }
|
|
|
|
/// <summary>
|
|
/// Wurde das Produkt gelöscht
|
|
/// </summary>
|
|
[Required(ErrorMessage = "Err_Required")]
|
|
[Display(Name = "Common_Deleted")]
|
|
public bool Deleted { get; set; }
|
|
|
|
/// <summary>
|
|
/// Datum der Erstellung
|
|
/// </summary>
|
|
[Required(ErrorMessage = "Err_Required")]
|
|
[Display(Name = "Common_Created")]
|
|
public DateTimeOffset Created { get; set; }
|
|
|
|
/// <summary>
|
|
/// Texte mehrsprachig
|
|
/// </summary>
|
|
public List<ProductTextVm> TextVms { get; set; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Viewmodel für das Anlegen und Bearbeiten von Produkten
|
|
/// </summary>
|
|
public class ProductCrudVm : ProductVm, IValidatableObject
|
|
{
|
|
/// <summary>
|
|
/// Name der Produktkategorie
|
|
/// </summary>
|
|
public string ProductCategoryName { get; set; }
|
|
|
|
/// <summary>
|
|
/// Name der Steuerstufe
|
|
/// </summary>
|
|
public string TaxRateName { get; set; }
|
|
|
|
/// <summary>
|
|
/// Name der Branche
|
|
/// </summary>
|
|
public string BranchName { get; set; }
|
|
|
|
/// <summary>
|
|
/// Name der Rubrik
|
|
/// </summary>
|
|
public string AdvertisementCategoryName { get; set; }
|
|
|
|
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
|
|
{
|
|
if (ProductType == ProductTypeVm.Advertisement)
|
|
{
|
|
if (string.IsNullOrEmpty(AdvertisementCategoryId))
|
|
{
|
|
var stringLocalizer = validationContext.GetService(typeof(IStringLocalizer<ProductCrudVm>)) as IStringLocalizer<ProductCrudVm>;
|
|
yield return new ValidationResult(stringLocalizer["Err_AdvertisementCategory_Missing"], new List<string> { "AdvertisementCategoryId" });
|
|
}
|
|
}
|
|
if (ProductType == ProductTypeVm.Listing)
|
|
{
|
|
if (string.IsNullOrEmpty(BranchId))
|
|
{
|
|
var stringLocalizer = validationContext.GetService(typeof(IStringLocalizer<ProductCrudVm>)) as IStringLocalizer<ProductCrudVm>;
|
|
yield return new ValidationResult(stringLocalizer["Err_Branch_Missing"], new List<string> { "BranchId" });
|
|
}
|
|
}
|
|
if (OrderMaximumQuantity < OrderMinimumQuantity)
|
|
{
|
|
var stringLocalizer = validationContext.GetService(typeof(IStringLocalizer<ProductCrudVm>)) as IStringLocalizer<ProductCrudVm>;
|
|
yield return new ValidationResult(stringLocalizer["Err_OrderMaximumQuantity"], new List<string> { "OrderMaximumQuantity" });
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Hilfsklasse für das Erfassen Mehrsprachiger Texte für Produkte.
|
|
/// Wird so gelöst, damit beliebig viele Sprachen verwendet werden können
|
|
/// </summary>
|
|
public class ProductTextVm
|
|
{
|
|
/// <summary>
|
|
/// Id
|
|
/// </summary>
|
|
[Required(ErrorMessage = "Err_Required")]
|
|
public int Id { get; set; }
|
|
|
|
/// <summary>
|
|
/// Srache
|
|
/// </summary>
|
|
[Required(ErrorMessage = "Err_Required")]
|
|
public string Language { get; set; }
|
|
|
|
/// <summary>
|
|
/// Name
|
|
/// </summary>
|
|
//[Required(ErrorMessage = "Err_Required")]
|
|
[RequiredIfDefaultLanguage("Language", ErrorMessage = "Err_Required")]
|
|
[MaxLength(100, ErrorMessage = "Err_StringLength_Max")]
|
|
[Display(Name = "Product_Name", Description = "Product_Name_Desc")]
|
|
public string Name { get; set; }
|
|
|
|
/// <summary>
|
|
/// Beschreibung
|
|
/// </summary>
|
|
[Display(Name = "Product_ShortDescription", Description = "Product_ShortDescription_Desc")]
|
|
[MaxLength(500, ErrorMessage = "Err_StringLength_Max")]
|
|
public string ShortDescription { get; set; }
|
|
|
|
/// <summary>
|
|
/// Beschreibung
|
|
/// </summary>
|
|
[Display(Name = "Product_Description", Description = "Product_Description_Desc")]
|
|
public string Description { get; set; }
|
|
|
|
/// <summary>
|
|
/// Bild für die jeweilige Sprache
|
|
/// </summary>
|
|
[Display(Name = "Product_ImageLanguage", Description = "Product_ImageLanguage_Desc")]
|
|
public string ImageLanguage { get; set; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Viewmodel für ein Produkt Listendarstellung
|
|
/// </summary>
|
|
public class ProductListVm : LocalizableBase
|
|
{
|
|
/// <summary>
|
|
/// Eindeutige Id
|
|
/// </summary>
|
|
public int Id { get; set; }
|
|
|
|
/// <summary>
|
|
/// Produkttyp
|
|
/// </summary>
|
|
public ProductTypeVm ProductType { get; set; }
|
|
|
|
/// <summary>
|
|
/// Produkttyp als Text
|
|
/// </summary>
|
|
public string ProductTypeText { get; set; }
|
|
|
|
/// <summary>
|
|
/// Um welche Art von Listung handelt es sich, wenn das Produkt für Listungen ist
|
|
/// </summary>
|
|
public ListingTypeVm ListingType { get; set; }
|
|
|
|
/// <summary>
|
|
/// Id der Rubrik - notwendig wenn Typ Listung!
|
|
/// </summary>
|
|
public string AdvertisementCategoryId { get; set; }
|
|
|
|
/// <summary>
|
|
/// Name der Rubrik wenn Listing
|
|
/// </summary>
|
|
public string AdvertisementCategoryName { get; set; }
|
|
|
|
/// <summary>
|
|
/// Id der Produktkategorie
|
|
/// </summary>
|
|
public int? ProductCategoryId { get; set; }
|
|
|
|
/// <summary>
|
|
/// Name der Produktkategorie
|
|
/// </summary>
|
|
public string ProductCategoryName { get; set; }
|
|
|
|
/// <summary>
|
|
/// Id der Branche - notwendig wenn Typ Listung!
|
|
/// </summary>
|
|
public string BranchId { get; set; }
|
|
|
|
/// <summary>
|
|
/// Name der Branche
|
|
/// </summary>
|
|
public string BranchName { get; set; }
|
|
|
|
/// <summary>
|
|
/// Einstellung wer das Produkt sehen darf
|
|
/// </summary>
|
|
public ShopVisibilityVm Visibility { get; set; }
|
|
|
|
/// <summary>
|
|
/// Einstellung wer das Produkt sehen darf als Text
|
|
/// </summary>
|
|
public string VisibilityText { get; set; }
|
|
|
|
/// <summary>
|
|
/// Art des Preises für die Kalkulation
|
|
/// </summary>
|
|
public PriceTypeVm PriceType { get; set; }
|
|
|
|
/// <summary>
|
|
/// Art des Preises für die Kalkulation
|
|
/// </summary>
|
|
public string PriceTypeText { get; set; }
|
|
|
|
/// <summary>
|
|
/// Aliquot Berechnung?
|
|
/// </summary>
|
|
public PriceAliquotTypeVm PriceAliquotType { get; set; }
|
|
|
|
/// <summary>
|
|
/// Aliquot Berechnung?
|
|
/// </summary>
|
|
public string PriceAliquotTypeText { get; set; }
|
|
|
|
/// <summary>
|
|
/// Starttyp bei Zeitbezogenen Produkten
|
|
/// </summary>
|
|
public ProductStartTypeVm ProductStartType { get; set; }
|
|
|
|
/// <summary>
|
|
/// Starttyp bei Zeitbezogenen Produkten
|
|
/// </summary>
|
|
public string ProductStartTypeText { get; set; }
|
|
|
|
/// <summary>
|
|
/// Wenn Banner, wo plaziert
|
|
/// </summary>
|
|
public BannerLocationVm BannerLocation { get; set; }
|
|
|
|
/// <summary>
|
|
/// Text für Bannerplatzierung
|
|
/// </summary>
|
|
public string BannerLocationText { get; set; }
|
|
|
|
/// <summary>
|
|
/// Wenn Banner wie groß?
|
|
/// </summary>
|
|
public BannerSizeVm BannerSize { get; set; }
|
|
|
|
/// <summary>
|
|
/// Text für Bannergröße
|
|
/// </summary>
|
|
public string BannerSizeText { get; set; }
|
|
|
|
/// <summary>
|
|
/// Pin: Radius in KM der bei einem Pin inkludiert ist
|
|
/// </summary>
|
|
public double PinRadius { get; set; }
|
|
|
|
/// <summary>
|
|
/// Pin: Prozent des Preises je zusätzlichen KM als Aufschlag
|
|
/// </summary>
|
|
public decimal PinPercentPerKm { get; set; }
|
|
|
|
/// <summary>
|
|
/// Name des Produktes
|
|
/// </summary>
|
|
public string Name
|
|
{
|
|
get => Get("Name", GetLanguage());
|
|
set => Set("Name", GetLanguage(), value);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Name Übersetzungen
|
|
/// </summary>
|
|
public string NameLocalized { get; set; }
|
|
|
|
/// <summary>
|
|
/// Kurzbeschreibung des Produktes
|
|
/// </summary>
|
|
public string ShortDescription
|
|
{
|
|
get => Get("ShortDescription", GetLanguage());
|
|
set => Set("ShortDescription", GetLanguage(), value);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Kurzbeschreibung Übersetzungen
|
|
/// </summary>
|
|
public string ShortDescriptionLocalized { get; set; }
|
|
|
|
/// <summary>
|
|
/// Bild für das Produkt - Allgemein
|
|
/// </summary>
|
|
public string Image { get; set; }
|
|
|
|
/// <summary>
|
|
/// Bild für das Produkt - für die gewählte Sprache
|
|
/// </summary>
|
|
public string ImageLanguage { get; set; }
|
|
|
|
/// <summary>
|
|
/// Artikelnummer
|
|
/// </summary>
|
|
public string Sku { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gibt an ob das Produkt versendet werden kann
|
|
/// </summary>
|
|
public bool IsShipEnabled { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gibt an ob das Produkt Versandkostenbefreit ist
|
|
/// </summary>
|
|
public bool IsFreeShipping { get; set; }
|
|
|
|
/// <summary>
|
|
/// Zusatzversandkosten netto
|
|
/// </summary>
|
|
public decimal AdditionalShippingCharge { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gibt an ob das Produkt von der Steuer ausgenommen ist
|
|
/// </summary>
|
|
public bool IsTaxExempt { get; set; }
|
|
|
|
/// <summary>
|
|
/// Id der Zugeordneten Steuer
|
|
/// </summary>
|
|
public int TaxRateId { get; set; }
|
|
|
|
/// <summary>
|
|
/// Name der Steuerstufe
|
|
/// </summary>
|
|
public string TaxRateName { get; set; }
|
|
|
|
/// <summary>
|
|
/// Anzahl der Produkte auf Lager
|
|
/// </summary>
|
|
public int StockQuantity { get; set; }
|
|
|
|
/// <summary>
|
|
/// Wie viele Produkte müssen mindestens bestellt werden?
|
|
/// </summary>
|
|
public int OrderMinimumQuantity { get; set; }
|
|
|
|
/// <summary>
|
|
/// Wie viele Produkte dürfen maximal bestellt werden?
|
|
/// </summary>
|
|
public int OrderMaximumQuantity { get; set; }
|
|
|
|
/// <summary>
|
|
/// Preis des Produktes netto
|
|
/// </summary>
|
|
public decimal Price { get; set; }
|
|
|
|
/// <summary>
|
|
/// Alter Preis wenn man eine Aktion setzen möchte
|
|
/// </summary>
|
|
public decimal OldPrice { get; set; }
|
|
|
|
/// <summary>
|
|
/// Preis des Produktes netto für Produkte die 2 Preise benötigen
|
|
/// </summary>
|
|
public decimal Price2 { get; set; }
|
|
|
|
/// <summary>
|
|
/// Alter Preis wenn man eine Aktion setzen möchte für Produkte die 2 Preise benötigen
|
|
/// </summary>
|
|
public decimal OldPrice2 { get; set; }
|
|
|
|
/// <summary>
|
|
/// Reihenfolge der Darstellung, danach nach Name
|
|
/// </summary>
|
|
public int DisplayOrder { get; set; }
|
|
|
|
/// <summary>
|
|
/// Anzahl der Ländereinstellungen für dieses Produkt
|
|
/// </summary>
|
|
public int CountrySettingsCount { get; set; }
|
|
|
|
/// <summary>
|
|
/// Wurde das Produkt gelöscht
|
|
/// </summary>
|
|
public bool Deleted { get; set; }
|
|
|
|
/// <summary>
|
|
/// Datum der Erstellung
|
|
/// </summary>
|
|
public DateTimeOffset Created { get; set; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Viewmodel für ein Produkt Listendarstellung um Ländersettings erweitert
|
|
/// </summary>
|
|
public class ProductListCountryVm : ProductListVm
|
|
{
|
|
/// <summary>
|
|
/// ISO2 Land für die Einstellungen
|
|
/// </summary>
|
|
public string CountryIso { get; set; }
|
|
|
|
/// <summary>
|
|
/// Preis des Produktes netto
|
|
/// </summary>
|
|
public decimal PriceCountry { get; set; }
|
|
|
|
/// <summary>
|
|
/// Alter Preis wenn man eine Aktion setzen möchte
|
|
/// </summary>
|
|
public decimal OldPriceCountry { get; set; }
|
|
|
|
/// <summary>
|
|
/// Preis des Produktes netto für Produkte die 2 Preise benötigen
|
|
/// </summary>
|
|
public decimal Price2Country { get; set; }
|
|
|
|
/// <summary>
|
|
/// Alter Preis wenn man eine Aktion setzen möchte für Produkte die 2 Preise benötigen
|
|
/// </summary>
|
|
public decimal OldPrice2Country { get; set; }
|
|
|
|
/// <summary>
|
|
/// Einstellung ob das Produkt in einem Land nicht verfügbar ist
|
|
/// </summary>
|
|
public bool NotAvailable { get; set; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Einstellungen eines Produktes in Bezug auf ein Land
|
|
/// </summary>
|
|
public class ProductCountryVm
|
|
{
|
|
/// <summary>
|
|
/// Eindeutige Id
|
|
/// </summary>
|
|
[Required(ErrorMessage = "Err_Required")]
|
|
public int Id { get; set; }
|
|
|
|
/// <summary>
|
|
/// Id des Produktes
|
|
/// </summary>
|
|
[Required(ErrorMessage = "Err_Required")]
|
|
public int ProductId { get; set; }
|
|
|
|
/// <summary>
|
|
/// ISO2 Land für die Einstellungen
|
|
/// </summary>
|
|
[Required(ErrorMessage = "Err_Required")]
|
|
[MaxLength(100, ErrorMessage = "Err_StringLength_Max")]
|
|
[Display(Name = "Common_Country")]
|
|
public string CountryIso { get; set; }
|
|
|
|
/// <summary>
|
|
/// Preis des Produktes netto
|
|
/// </summary>
|
|
[Required(ErrorMessage = "Err_Required")]
|
|
[Range(0.0, 100000000, ErrorMessage = "Err_Range")]
|
|
[Display(Name = "Product_Price", Description = "Product_Price_Desc")]
|
|
public decimal Price { get; set; }
|
|
|
|
/// <summary>
|
|
/// Alter Preis wenn man eine Aktion setzen möchte
|
|
/// </summary>
|
|
[Required(ErrorMessage = "Err_Required")]
|
|
[Range(0.0, 100000000, ErrorMessage = "Err_Range")]
|
|
[Display(Name = "Product_OldPrice", Description = "Product_OldPrice_Desc")]
|
|
public decimal OldPrice { get; set; }
|
|
|
|
/// <summary>
|
|
/// Preis des Produktes netto für Produkte die 2 Preise benötigen
|
|
/// </summary>
|
|
[Required(ErrorMessage = "Err_Required")]
|
|
[Range(0.0, 100000000, ErrorMessage = "Err_Range")]
|
|
[Display(Name = "Product_Price2", Description = "Product_Price2_Desc")]
|
|
public decimal Price2 { get; set; }
|
|
|
|
/// <summary>
|
|
/// Alter Preis wenn man eine Aktion setzen möchte für Produkte die 2 Preise benötigen
|
|
/// </summary>
|
|
[Required(ErrorMessage = "Err_Required")]
|
|
[Range(0.0, 100000000, ErrorMessage = "Err_Range")]
|
|
[Display(Name = "Product_OldPrice2", Description = "Product_OldPrice2_Desc")]
|
|
public decimal OldPrice2 { get; set; }
|
|
|
|
/// <summary>
|
|
/// Einstellung ob das Produkt in einem Land nicht verfügbar ist
|
|
/// </summary>
|
|
[Required(ErrorMessage = "Err_Required")]
|
|
[Display(Name = "Product_NotAvailable", Description = "Product_NotAvailable_Desc")]
|
|
public bool NotAvailable { get; set; }
|
|
}
|
|
|
|
/// <summary>
|
|
/// Viewmodel für das Anlegen und Bearbeiten einer Produkteinstellung für ein Land
|
|
/// </summary>
|
|
public class ProductCountryCrudVm : ProductCountryVm
|
|
{
|
|
/// <summary>
|
|
/// Name des Landes
|
|
/// </summary>
|
|
public string CountryName { get; set; }
|
|
}
|
|
|
|
public class ProductShopVm : LocalizableBase
|
|
{
|
|
/// <summary>
|
|
/// Eindeutige Id
|
|
/// </summary>
|
|
public int Id { get; set; }
|
|
|
|
/// <summary>
|
|
/// Produkttyp
|
|
/// </summary>
|
|
public ProductTypeVm ProductType { get; set; }
|
|
|
|
/// <summary>
|
|
/// Produkttyp als Text
|
|
/// </summary>
|
|
public string ProductTypeText { get; set; }
|
|
|
|
/// <summary>
|
|
/// Um welche Art von Listung handelt es sich, wenn das Produkt für Listungen ist
|
|
/// </summary>
|
|
public ListingTypeVm ListingType { get; set; }
|
|
|
|
/// <summary>
|
|
/// Id der Rubrik - notwendig wenn Typ Listung!
|
|
/// </summary>
|
|
public string AdvertisementCategoryId { get; set; }
|
|
|
|
/// <summary>
|
|
/// Name der Rubrik wenn Listing
|
|
/// </summary>
|
|
public string AdvertisementCategoryName { get; set; }
|
|
|
|
/// <summary>
|
|
/// Id der Produktkategorie
|
|
/// </summary>
|
|
public int? ProductCategoryId { get; set; }
|
|
|
|
/// <summary>
|
|
/// Name der Produktkategorie
|
|
/// </summary>
|
|
public string ProductCategoryName { get; set; }
|
|
|
|
/// <summary>
|
|
/// Id der Branche - notwendig wenn Typ Listung!
|
|
/// </summary>
|
|
public string BranchId { get; set; }
|
|
|
|
/// <summary>
|
|
/// Name der Branche
|
|
/// </summary>
|
|
public string BranchName { get; set; }
|
|
|
|
/// <summary>
|
|
/// Art des Preises für die Kalkulation
|
|
/// </summary>
|
|
public PriceTypeVm PriceType { get; set; }
|
|
|
|
/// <summary>
|
|
/// Art des Preises für die Kalkulation
|
|
/// </summary>
|
|
public string PriceTypeText { get; set; }
|
|
|
|
/// <summary>
|
|
/// Aliquot Berechnung?
|
|
/// </summary>
|
|
public PriceAliquotTypeVm PriceAliquotType { get; set; }
|
|
|
|
/// <summary>
|
|
/// Aliquot Berechnung?
|
|
/// </summary>
|
|
public string PriceAliquotTypeText { get; set; }
|
|
|
|
/// <summary>
|
|
/// Starttyp bei Zeitbezogenen Produkten
|
|
/// </summary>
|
|
public ProductStartTypeVm ProductStartType { get; set; }
|
|
|
|
/// <summary>
|
|
/// Starttyp bei Zeitbezogenen Produkten
|
|
/// </summary>
|
|
public string ProductStartTypeText { get; set; }
|
|
|
|
/// <summary>
|
|
/// Wenn Banner, wo plaziert
|
|
/// </summary>
|
|
public BannerLocationVm BannerLocation { get; set; }
|
|
|
|
/// <summary>
|
|
/// Text für Bannerplatzierung
|
|
/// </summary>
|
|
public string BannerLocationText { get; set; }
|
|
|
|
/// <summary>
|
|
/// Wenn Banner wie groß?
|
|
/// </summary>
|
|
public BannerSizeVm BannerSize { get; set; }
|
|
|
|
/// <summary>
|
|
/// Text für Bannergröße
|
|
/// </summary>
|
|
public string BannerSizeText { get; set; }
|
|
|
|
/// <summary>
|
|
/// Pin: Radius in KM der bei einem Pin inkludiert ist
|
|
/// </summary>
|
|
public double PinRadius { get; set; }
|
|
|
|
/// <summary>
|
|
/// Pin: Prozent des Preises je zusätzlichen KM als Aufschlag
|
|
/// </summary>
|
|
public decimal PinPercentPerKm { get; set; }
|
|
|
|
/// <summary>
|
|
/// Name des Produktes
|
|
/// </summary>
|
|
public string Name
|
|
{
|
|
get => Get("Name", GetLanguage());
|
|
set => Set("Name", GetLanguage(), value);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Name Übersetzungen
|
|
/// </summary>
|
|
public string NameLocalized { get; set; }
|
|
|
|
/// <summary>
|
|
/// Kurzbeschreibung des Produktes
|
|
/// </summary>
|
|
public string ShortDescription
|
|
{
|
|
get => Get("ShortDescription", GetLanguage());
|
|
set => Set("ShortDescription", GetLanguage(), value);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Kurzbeschreibung Übersetzungen
|
|
/// </summary>
|
|
public string ShortDescriptionLocalized { get; set; }
|
|
|
|
/// <summary>
|
|
/// Beschreibung des Produktes in HTML
|
|
/// </summary>
|
|
public string Description
|
|
{
|
|
get => Get("Description", GetLanguage());
|
|
set => Set("Description", GetLanguage(), value);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Beschreibung des Produktes in HTML Übersetzung
|
|
/// </summary>
|
|
public string DescriptionLocalized { get; set; }
|
|
|
|
/// <summary>
|
|
/// Bild für das Produkt - Allgemein
|
|
/// </summary>
|
|
public string Image { get; set; }
|
|
|
|
/// <summary>
|
|
/// Bild für das Produkt - für die gewählte Sprache
|
|
/// </summary>
|
|
public string ImageLanguage { get; set; }
|
|
|
|
/// <summary>
|
|
/// Artikelnummer
|
|
/// </summary>
|
|
public string Sku { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gibt an ob das Produkt versendet werden kann
|
|
/// </summary>
|
|
public bool IsShipEnabled { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gibt an ob das Produkt Versandkostenbefreit ist
|
|
/// </summary>
|
|
public bool IsFreeShipping { get; set; }
|
|
|
|
/// <summary>
|
|
/// Zusatzversandkosten netto
|
|
/// </summary>
|
|
public decimal AdditionalShippingCharge { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gibt an ob das Produkt von der Steuer ausgenommen ist
|
|
/// </summary>
|
|
public bool IsTaxExempt { get; set; }
|
|
|
|
/// <summary>
|
|
/// Id der Zugeordneten Steuer
|
|
/// </summary>
|
|
public int TaxRateId { get; set; }
|
|
|
|
/// <summary>
|
|
/// Name der Steuerstufe
|
|
/// </summary>
|
|
public string TaxRateName { get; set; }
|
|
|
|
/// <summary>
|
|
/// Anzahl der Produkte auf Lager
|
|
/// </summary>
|
|
public int StockQuantity { get; set; }
|
|
|
|
/// <summary>
|
|
/// Wie viele Produkte müssen mindestens bestellt werden?
|
|
/// </summary>
|
|
public int OrderMinimumQuantity { get; set; }
|
|
|
|
/// <summary>
|
|
/// Wie viele Produkte dürfen maximal bestellt werden?
|
|
/// </summary>
|
|
public int OrderMaximumQuantity { get; set; }
|
|
|
|
/// <summary>
|
|
/// Preis des Produktes netto
|
|
/// </summary>
|
|
public decimal Price { get; set; }
|
|
|
|
/// <summary>
|
|
/// Alter Preis wenn man eine Aktion setzen möchte
|
|
/// </summary>
|
|
public decimal OldPrice { get; set; }
|
|
|
|
/// <summary>
|
|
/// Preis des Produktes brutto
|
|
/// </summary>
|
|
public decimal PriceGross { get; set; }
|
|
|
|
/// <summary>
|
|
/// Alter Preis wenn man eine Aktion setzen möchte brutto
|
|
/// </summary>
|
|
public decimal OldPriceGross { get; set; }
|
|
|
|
/// <summary>
|
|
/// Preis des Produktes netto für Produkte die 2 Preise benötigen
|
|
/// </summary>
|
|
public decimal Price2 { get; set; }
|
|
|
|
/// <summary>
|
|
/// Alter Preis wenn man eine Aktion setzen möchte für Produkte die 2 Preise benötigen
|
|
/// </summary>
|
|
public decimal OldPrice2 { get; set; }
|
|
|
|
/// <summary>
|
|
/// Preis des Produktes netto für Produkte die 2 Preise benötigen brutto
|
|
/// </summary>
|
|
public decimal Price2Gross { get; set; }
|
|
|
|
/// <summary>
|
|
/// Alter Preis wenn man eine Aktion setzen möchte für Produkte die 2 Preise benötigen brutto
|
|
/// </summary>
|
|
public decimal OldPrice2Gross { get; set; }
|
|
|
|
/// <summary>
|
|
/// Angewandte Steuer
|
|
/// </summary>
|
|
public decimal Tax { get; set; }
|
|
|
|
/// <summary>
|
|
/// Reihenfolge der Darstellung, danach nach Name
|
|
/// </summary>
|
|
public int DisplayOrder { get; set; }
|
|
}
|
|
}
|