using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Linq; using System.Text; using System.Threading.Tasks; using gehGassi.Domain.Advertisements; using gehGassi.Domain.Common; using gehGassi.Domain.Localization; namespace gehGassi.Domain.Shop { /// /// Repräsentiert ein Produkt für den Shop. /// Es gibt spezielle Produkte die für Buchungen notwendig sind /// public class Product : LocalizableBase, IAuditable { /// /// Eindeutige Id /// [Key] public int Id { get; set; } /// /// Produkttyp /// [Required] public ProductType ProductType { get; set; } /// /// Um welche Art von Listung handelt es sich, wenn das Produkt für Listungen ist /// public ListingType ListingType { get; set; } /// /// Id der Rubrik - notwendig wenn Typ Werbung! /// [MaxLength(128)] public string AdvertisementCategoryId { get; set; } /// /// Id der Produktkategorie /// public int? ProductCategoryId { get; set; } /// /// Id der Branche - notwendig wenn Typ Listung! /// [MaxLength(128)] public string BranchId { get; set; } /// /// Einstellung wer das Produkt sehen darf /// [Required] public ShopVisibility Visibility { get; set; } /// /// Art des Preises für die Kalkulation /// [Required] public PriceType PriceType { get; set; } /// /// Aliquot Berechnung? /// [Required] public PriceAliquotType PriceAliquotType { get; set; } /// /// Starttyp bei Zeitbezogenen Produkten /// [Required] public ProductStartType ProductStartType { get; set; } /// /// Wenn Banner, wo plaziert /// [Required] public BannerLocation BannerLocation { get; set; } /// /// Wenn Banner wie groß? /// [Required] public BannerSize BannerSize { get; set; } /// /// Pin: Radius in KM der bei einem Pin inkludiert ist /// [Required] public double PinRadius { get; set; } /// /// Pin: Prozent des Preises je zusätzlichen KM als Aufschlag /// [Required] public decimal PinPercentPerKm { get; set; } /// /// Name des Produktes /// [Localized] [NotMapped] public string Name { get => Get("Name", GetLanguage()); set => Set("Name", GetLanguage(), value); } /// /// Name - Inhalt /// Max-Length / 100 im Viewmodel /// [Column] public string NameLocalized { get; set; } /// /// Kurzbeschreibung /// [Localized] [NotMapped] public string ShortDescription { get => Get("ShortDescription", GetLanguage()); set => Set("ShortDescription", GetLanguage(), value); } /// /// Kurzbeschreibung /// public string ShortDescriptionLocalized { get; set; } /// /// Beschreigun des Produktes HTML /// [Localized] [NotMapped] public string Description { get => Get("Description", GetLanguage()); set => Set("Description", GetLanguage(), value); } /// /// Kurzbeschreibung /// public string DescriptionLocalized { get; set; } /// /// Bild des Produktes für eine Sprache /// [Localized] [NotMapped] public string ImageLanguage { get => Get("ImageLanguage", GetLanguage()); set => Set("ImageLanguage", GetLanguage(), value); } /// /// Bild der Rubrik für eine Sprache - Dateiname /// [Column] public string ImageLanguageLocalized { get; set; } /// /// Bild für das Produkt - Allgemein /// [MaxLength(500)] public string Image { get; set; } /// /// Interne Anmerkungen /// public string Comment { get; set; } /// /// Artikelnummer /// [Required] [MaxLength(100)] public string Sku { get; set; } /// /// Nummer laut Hersteller /// [MaxLength(100)] public string ManufacturerPartNumber { get; set; } /// /// Id des Downloads, wenn das Produkt ein Download ist /// public int? DownloadId { get; set; } /// /// Gibt an ob das Produkt versendet werden kann /// [Required] public bool IsShipEnabled { get; set; } /// /// Gibt an ob das Produkt Versandkostenbefreit ist /// [Required] public bool IsFreeShipping { get; set; } /// /// Zusatzversandkosten netto /// [Required] public decimal AdditionalShippingCharge { get; set; } /// /// Gibt an ob das Produkt von der Steuer ausgenommen ist /// [Required] public bool IsTaxExempt { get; set; } /// /// Id der Zugeordneten Steuer /// [Required] public int TaxRateId { get; set; } /// /// Anzahl der Produkte auf Lager /// [Required] public int StockQuantity { get; set; } /// /// Soll die Lagerverfügbarkeit angezeigt werden? /// [Required] public bool DisplayStockAvailability { get; set; } /// /// Soll die Anzahl der Produkte auf Lager angezeigt werden? /// [Required] public bool DisplayStockQuantity { get; set; } /// /// Ab wie vielen Produkten eine Warnung an den Admin senden? /// [Required] public int NotifyAdminForQuantityBelow { get; set; } /// /// Wie viele Produkte müssen mindestens bestellt werden? /// [Required] public int OrderMinimumQuantity { get; set; } /// /// Wie viele Produkte dürfen maximal bestellt werden? /// [Required] public int OrderMaximumQuantity { get; set; } /// /// Preis des Produktes netto /// [Required] public decimal Price { get; set; } /// /// Alter Preis wenn man eine Aktion setzen möchte /// [Required] public decimal OldPrice { get; set; } /// /// Preis des Produktes netto für Produkte die 2 Preise benötigen /// [Required] public decimal Price2 { get; set; } /// /// Alter Preis wenn man eine Aktion setzen möchte für Produkte die 2 Preise benötigen /// [Required] public decimal OldPrice2 { get; set; } /// /// Gets or sets the weight /// [Required] public decimal Weight { get; set; } /// /// Gets or sets the length /// [Required] public decimal Length { get; set; } /// /// Gets or sets the width /// [Required] public decimal Width { get; set; } /// /// Gets or sets the height /// [Required] public decimal Height { get; set; } /// /// Reihenfolge der Darstellung, danach nach Name /// [Required] public int DisplayOrder { get; set; } /// /// Wurde das Produkt gelöscht /// [Required] public bool Deleted { get; set; } /// /// Datum der Erstellung /// [Required] public DateTimeOffset Created { get; set; } /// /// Prüft ob ein Produkt für eine Bestellquelle - also einen Benutzertyp - verfügbar ist /// /// Quelle der Bestellung /// true wenn verfügbar, false sonst public bool AvailableFor(OrderSource orderSource) { if(Deleted || Visibility == ShopVisibility.None) return false; switch (Visibility) { case ShopVisibility.Customers when orderSource == OrderSource.Customer: case ShopVisibility.AppUserDogOwner when orderSource is OrderSource.AppUserDogOwner or OrderSource.AppUserBoth: case ShopVisibility.AppUserDogWalker when orderSource is OrderSource.AppUserDogWalker or OrderSource.AppUserBoth: case ShopVisibility.All when orderSource is OrderSource.Customer or OrderSource.AppUserDogOwner or OrderSource.AppUserDogWalker or OrderSource.AppUserBoth: return true; case ShopVisibility.None: default: return false; } } #region IAuditable /// /// Gibt den eindeutigen Key für die Entität zurück; /// Hier als String gelöst, weil damit auch kombinierte Schlüssel möglich sind. /// /// Eindeutiger Key public string AuditKey() { return Id.ToString(); } /// /// Gibt den Objektnamen bzw. die Tabelle der Entität zurück /// /// Objektnamen public string AuditTable() { return "Products"; } public AuditableOptions Options() { return AuditableOptions.Create | AuditableOptions.Edit | AuditableOptions.Delete; } #endregion } /// /// Repräsentiert ein Produkt für den Shop - Listendarstellung. /// Es gibt spezielle Produkte die für Buchungen notwendig sind /// public class ProductWithNames { /// /// Eindeutige Id /// public int Id { get; set; } /// /// Produkttyp /// public ProductType ProductType { get; set; } /// /// Um welche Art von Listung handelt es sich, wenn das Produkt für Listungen ist /// public ListingType ListingType { get; set; } /// /// Id der Rubrik - notwendig wenn Typ Listung! /// public string AdvertisementCategoryId { get; set; } /// /// Rubrik Name - notwendig wenn Typ Listung! /// public string AdvertisementCategoryName { get; set; } /// /// Id der Produktkategorie /// public int? ProductCategoryId { get; set; } /// /// Name der Produktkategorie /// public string ProductCategoryName { get; set; } /// /// Id der Branche - notwendig wenn Typ Listung! /// [MaxLength(128)] public string BranchId { get; set; } /// /// Name der Branche /// public string BranchName { get; set; } /// /// Einstellung wer das Produkt sehen darf /// public ShopVisibility Visibility { get; set; } /// /// Art des Preises für die Kalkulation /// public PriceType PriceType { get; set; } /// /// Aliquot Berechnung? /// public PriceAliquotType PriceAliquotType { get; set; } /// /// Starttyp bei Zeitbezogenen Produkten /// public ProductStartType ProductStartType { get; set; } /// /// Wenn Banner, wo plaziert /// public BannerLocation BannerLocation { get; set; } /// /// Wenn Banner wie groß? /// public BannerSize BannerSize { get; set; } /// /// Pin: Radius in KM der bei einem Pin inkludiert ist /// public double PinRadius { get; set; } /// /// Pin: Prozent des Preises je zusätzlichen KM als Aufschlag /// public decimal PinPercentPerKm { get; set; } /// /// Name des Produktes /// public string Name { get; set; } /// /// Name Übersetzungen /// public string NameLocalized { get; set; } /// /// Kurzbeschreibung /// public string ShortDescription { get; set; } /// /// Kurzbeschreibung Übersetzungen /// public string ShortDescriptionLocalized { get; set; } /// /// Beschreibung des Produktes HTML /// public string Description { get; set; } /// /// Beschreibung des Produktes HTML Übersetzungen /// public string DescriptionLocalized { get; set; } /// /// Bild des Produktes für eine Sprache /// public string ImageLanguage { get; set; } /// /// Bild des Produktes für eine Sprache Übersetzungen /// public string ImageLanguageLocalized { get; set; } /// /// Bild für das Produkt - Allgemein /// public string Image { get; set; } /// /// Interne Anmerkungen /// public string Comment { get; set; } /// /// Artikelnummer /// public string Sku { get; set; } /// /// Nummer laut Hersteller /// public string ManufacturerPartNumber { get; set; } /// /// Id des Downloads, wenn das Produkt ein Download ist /// public int? DownloadId { get; set; } /// /// Gibt an ob das Produkt versendet werden kann /// public bool IsShipEnabled { get; set; } /// /// Gibt an ob das Produkt Versandkostenbefreit ist /// public bool IsFreeShipping { get; set; } /// /// Zusatzversandkosten netto /// public decimal AdditionalShippingCharge { get; set; } /// /// Gibt an ob das Produkt von der Steuer ausgenommen ist /// public bool IsTaxExempt { get; set; } /// /// Id der Zugeordneten Steuer /// public int TaxRateId { get; set; } /// /// Name der Steuerstufe /// public string TaxRateName { get; set; } /// /// Anzahl der Produkte auf Lager /// public int StockQuantity { get; set; } /// /// Soll die Lagerverfügbarkeit angezeigt werden? /// public bool DisplayStockAvailability { get; set; } /// /// Soll die Anzahl der Produkte auf Lager angezeigt werden? /// public bool DisplayStockQuantity { get; set; } /// /// Ab wie vielen Produkten eine Warnung an den Admin senden? /// public int NotifyAdminForQuantityBelow { get; set; } /// /// Wie viele Produkte müssen mindestens bestellt werden? /// public int OrderMinimumQuantity { get; set; } /// /// Wie viele Produkte dürfen maximal bestellt werden? /// public int OrderMaximumQuantity { get; set; } /// /// Preis des Produktes netto /// public decimal Price { get; set; } /// /// Alter Preis wenn man eine Aktion setzen möchte /// public decimal OldPrice { get; set; } /// /// Preis des Produktes netto für Produkte die 2 Preise benötigen /// public decimal Price2 { get; set; } /// /// Alter Preis wenn man eine Aktion setzen möchte für Produkte die 2 Preise benötigen /// public decimal OldPrice2 { get; set; } /// /// Gets or sets the weight /// public decimal Weight { get; set; } /// /// Gets or sets the length /// public decimal Length { get; set; } /// /// Gets or sets the width /// public decimal Width { get; set; } /// /// Gets or sets the height /// public decimal Height { get; set; } /// /// Reihenfolge der Darstellung, danach nach Name /// public int DisplayOrder { get; set; } /// /// Wurde das Produkt gelöscht /// public bool Deleted { get; set; } /// /// Anzahl der Ländereinstellungen für dieses Produkt /// public int CountrySettingsCount { get; set; } /// /// Datum der Erstellung /// public DateTimeOffset Created { get; set; } } /// /// Repräsentiert ein Produkt für den Shop - Listendarstellung mit Ländereinstellungen für ein Land /// public class ProductWithNamesCountry { /// /// Eindeutige Id /// public int Id { get; set; } /// /// Produkttyp /// public ProductType ProductType { get; set; } /// /// Um welche Art von Listung handelt es sich, wenn das Produkt für Listungen ist /// public ListingType ListingType { get; set; } /// /// Id der Rubrik - notwendig wenn Typ Listung! /// public string AdvertisementCategoryId { get; set; } /// /// Rubrik Name - notwendig wenn Typ Listung! /// public string AdvertisementCategoryName { get; set; } /// /// Id der Produktkategorie /// public int? ProductCategoryId { get; set; } /// /// Name der Produktkategorie /// public string ProductCategoryName { get; set; } /// /// Id der Branche - notwendig wenn Typ Listung! /// [MaxLength(128)] public string BranchId { get; set; } /// /// Name der Branche /// public string BranchName { get; set; } /// /// Einstellung wer das Produkt sehen darf /// public ShopVisibility Visibility { get; set; } /// /// Art des Preises für die Kalkulation /// public PriceType PriceType { get; set; } /// /// Aliquot Berechnung? /// public PriceAliquotType PriceAliquotType { get; set; } /// /// Starttyp bei Zeitbezogenen Produkten /// public ProductStartType ProductStartType { get; set; } /// /// Wenn Banner, wo plaziert /// public BannerLocation BannerLocation { get; set; } /// /// Wenn Banner wie groß? /// public BannerSize BannerSize { get; set; } /// /// Pin: Radius in KM der bei einem Pin inkludiert ist /// public double PinRadius { get; set; } /// /// Pin: Prozent des Preises je zusätzlichen KM als Aufschlag /// public decimal PinPercentPerKm { get; set; } /// /// Name des Produktes /// public string Name { get; set; } /// /// Name Übersetzungen /// public string NameLocalized { get; set; } /// /// Kurzbeschreibung /// public string ShortDescription { get; set; } /// /// Kurzbeschreibung Übersetzungen /// public string ShortDescriptionLocalized { get; set; } /// /// Beschreibung des Produktes HTML /// public string Description { get; set; } /// /// Beschreibung des Produktes HTML Übersetzungen /// public string DescriptionLocalized { get; set; } /// /// Bild des Produktes für eine Sprache /// public string ImageLanguage { get; set; } /// /// Bild des Produktes für eine Sprache Übersetzungen /// public string ImageLanguageLocalized { get; set; } /// /// Bild für das Produkt - Allgemein /// public string Image { get; set; } /// /// Interne Anmerkungen /// public string Comment { get; set; } /// /// Artikelnummer /// public string Sku { get; set; } /// /// Nummer laut Hersteller /// public string ManufacturerPartNumber { get; set; } /// /// Id des Downloads, wenn das Produkt ein Download ist /// public int? DownloadId { get; set; } /// /// Gibt an ob das Produkt versendet werden kann /// public bool IsShipEnabled { get; set; } /// /// Gibt an ob das Produkt Versandkostenbefreit ist /// public bool IsFreeShipping { get; set; } /// /// Zusatzversandkosten netto /// public decimal AdditionalShippingCharge { get; set; } /// /// Gibt an ob das Produkt von der Steuer ausgenommen ist /// public bool IsTaxExempt { get; set; } /// /// Id der Zugeordneten Steuer /// public int TaxRateId { get; set; } /// /// Name der Steuerstufe /// public string TaxRateName { get; set; } /// /// Anzahl der Produkte auf Lager /// public int StockQuantity { get; set; } /// /// Soll die Lagerverfügbarkeit angezeigt werden? /// public bool DisplayStockAvailability { get; set; } /// /// Soll die Anzahl der Produkte auf Lager angezeigt werden? /// public bool DisplayStockQuantity { get; set; } /// /// Ab wie vielen Produkten eine Warnung an den Admin senden? /// public int NotifyAdminForQuantityBelow { get; set; } /// /// Wie viele Produkte müssen mindestens bestellt werden? /// public int OrderMinimumQuantity { get; set; } /// /// Wie viele Produkte dürfen maximal bestellt werden? /// public int OrderMaximumQuantity { get; set; } /// /// Preis des Produktes netto /// public decimal Price { get; set; } /// /// Alter Preis wenn man eine Aktion setzen möchte /// public decimal OldPrice { get; set; } /// /// Preis des Produktes netto für Produkte die 2 Preise benötigen /// public decimal Price2 { get; set; } /// /// Alter Preis wenn man eine Aktion setzen möchte für Produkte die 2 Preise benötigen /// public decimal OldPrice2 { get; set; } /// /// Gets or sets the weight /// public decimal Weight { get; set; } /// /// Gets or sets the length /// public decimal Length { get; set; } /// /// Gets or sets the width /// public decimal Width { get; set; } /// /// Gets or sets the height /// public decimal Height { get; set; } /// /// Reihenfolge der Darstellung, danach nach Name /// public int DisplayOrder { get; set; } /// /// Wurde das Produkt gelöscht /// public bool Deleted { get; set; } /// /// Anzahl der Ländereinstellungen für dieses Produkt /// public int CountrySettingsCount { get; set; } /// /// Datum der Erstellung /// public DateTimeOffset Created { get; set; } /// /// ISO2 Land für die Einstellungen /// public string CountryIso { get; set; } /// /// Preis des Produktes netto /// public decimal PriceCountry { get; set; } /// /// Alter Preis wenn man eine Aktion setzen möchte /// public decimal OldPriceCountry { get; set; } /// /// Preis des Produktes netto für Produkte die 2 Preise benötigen /// public decimal Price2Country { get; set; } /// /// Alter Preis wenn man eine Aktion setzen möchte für Produkte die 2 Preise benötigen /// public decimal OldPrice2Country { get; set; } /// /// Einstellung ob das Produkt in einem Land nicht verfügbar ist /// public bool NotAvailable { get; set; } } /// /// Einstellungen eines Produktes in Bezug auf ein Land /// public class ProductCountry : IAuditable { /// /// Eindeutige Id /// [Key] public int Id { get; set; } /// /// Id des Produktes /// [Required] public int ProductId { get; set; } /// /// ISO2 Land für die Einstellungen /// [Required] [MaxLength(2)] public string CountryIso { get; set; } /// /// Preis des Produktes netto /// [Required] public decimal Price { get; set; } /// /// Alter Preis wenn man eine Aktion setzen möchte /// [Required] public decimal OldPrice { get; set; } /// /// Preis des Produktes netto für Produkte die 2 Preise benötigen /// [Required] public decimal Price2 { get; set; } /// /// Alter Preis wenn man eine Aktion setzen möchte für Produkte die 2 Preise benötigen /// [Required] public decimal OldPrice2 { get; set; } /// /// Einstellung ob das Produkt in einem Land nicht verfügbar ist /// [Required] public bool NotAvailable { get; set; } #region IAuditable /// /// Gibt den eindeutigen Key für die Entität zurück; /// Hier als String gelöst, weil damit auch kombinierte Schlüssel möglich sind. /// /// Eindeutiger Key public string AuditKey() { return Id.ToString(); } /// /// Gibt den Objektnamen bzw. die Tabelle der Entität zurück /// /// Objektnamen public string AuditTable() { return "ProductCountries"; } public AuditableOptions Options() { return AuditableOptions.Create | AuditableOptions.Edit | AuditableOptions.Delete; } #endregion } }