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