using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using gehGassi.Common; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Localization; using Microsoft.Extensions.Options; namespace gehGassi.Web.Models { /// /// Viewmodel für einen Kunden /// public class CustomerVm { /// /// Id des Kunden /// [Required(ErrorMessage = "Err_Required")] public long Id { get; set; } /// /// Spezial-ID /// public Guid? UniqueId { get; set; } /// /// Typ des Kunden /// [Display(Name = "Customer_TypeId")] public long? TypeId { get; set; } /// /// Branche des Kunden /// [Display(Name = "Customer_BranchId")] public string BranchId { get; set; } /// /// Optional: Liste der Branchen für eine Listung /// [Display(Name = "Customer_BranchesJson", Description = "Customer_BranchesJson_Desc")] public string BranchesJson { get; set; } /// /// Kundennummer /// [Required(ErrorMessage = "Err_Required")] [MaxLength(100, ErrorMessage = "Err_StringLength_Max")] [Display(Name = "Customer_Number")] public string Number { get; set; } /// /// Name des Kunden /// [Required(ErrorMessage = "Err_Required")] [MaxLength(200, ErrorMessage = "Err_StringLength_Max")] [Display(Name = "Customer_Name")] public string Name { get; set; } /// /// Handelt es sich um einen Firmenkunden? /// [Required(ErrorMessage = "Err_Required")] [Display(Name = "Customer_IsCompany")] public bool IsCompany { get; set; } /// /// UID Nummer /// [Remote("IsVatValid", "Common", AdditionalFields = "Address.CountryCode", ErrorMessage = "Err_Vat_Invalid", HttpMethod = "POST")] //[RequiredIf("IsCompany", true, ErrorMessage = "Err_Required")] [MaxLength(50, ErrorMessage = "Err_StringLength_Max")] [Display(Name = "Customer_Vat")] public string Vat { get; set; } /// /// Anrede / Titel /// [MaxLength(50, ErrorMessage = "Err_StringLength_Max")] [Display(Name = "Customer_Title")] public string Title { get; set; } /// /// Optinaler Vorname der Kontaktperson /// [Required(ErrorMessage = "Err_Required")] [MaxLength(100, ErrorMessage = "Err_StringLength_Max")] [Display(Name = "Customer_FirstName")] public string FirstName { get; set; } /// /// Optinaler Nachname der Kontaktperson /// [Required(ErrorMessage = "Err_Required")] [MaxLength(100, ErrorMessage = "Err_StringLength_Max")] [Display(Name = "Customer_LastName")] public string LastName { get; set; } /// /// Kontaktdaten /// public ContactEmailRequiredVm Contact { get; set; } /// /// Adressdaten /// public AddressRequiredVm Address { get; set; } /// /// Anmerkungen /// [MaxLength(1000, ErrorMessage = "Err_StringLength_Max")] [Display(Name = "Customer_Comment")] public string Comment { get; set; } /// /// Sprachen die für einen Kunden verfügbar sind. /// [Required(ErrorMessage = "Err_Required")] [MaxLength(256, ErrorMessage = "Err_StringLength_Max")] [Display(Name = "Customer_Languages", Description = "Customer_Languages_Desc")] public string Languages { get; set; } /// /// Optional - Logo des Unternehmens /// [MaxLength(500, ErrorMessage = "Err_StringLength_Max")] [Display(Name = "Customer_Logo")] public string Logo { get; set; } #region finance /// /// Auf- oder Abschlag für eine Listung in Prozent /// [Required(ErrorMessage = "Err_Required")] [Range(-100.0, 100.0, ErrorMessage = "Err_Range")] [Display(Name = "Customer_MarkupListing", Description = "Customer_Markup_Desc")] public decimal MarkupListing { get; set; } /// /// Auf- oder Abschlag für eine Werbung in Prozent /// [Required(ErrorMessage = "Err_Required")] [Range(-100.0, 100.0, ErrorMessage = "Err_Range")] [Display(Name = "Customer_MarkupAdvertisement", Description = "Customer_Markup_Desc")] public decimal MarkupAdvertisement { get; set; } /// /// Auf- oder Abschlag für eine Pin-Werbung in Prozent /// [Required(ErrorMessage = "Err_Required")] [Range(-100.0, 100.0, ErrorMessage = "Err_Range")] [Display(Name = "Customer_MarkupPin", Description = "Customer_Markup_Desc")] public decimal MarkupPin { get; set; } /// /// Auf- oder Abschlag für eine Banner-Werbung in Prozent /// [Required(ErrorMessage = "Err_Required")] [Range(-100.0, 100.0, ErrorMessage = "Err_Range")] [Display(Name = "Customer_MarkupBanner", Description = "Customer_Markup_Desc")] public decimal MarkupBanner { get; set; } /// /// Zahlen auf Rechnung allgemein möglich? /// [Required(ErrorMessage = "Err_Required")] [Display(Name = "Customer_PaymentOnInvoice", Description = "Customer_PaymentOnInvoice_Desc")] public bool PaymentOnInvoice { get; set; } #endregion #region MangoPay /// /// ID des AppUsers beim Payment-Provider erstellt /// [Display(Name = "Customer_MangopayIdCreated")] public bool MangopayIdCreated { get; set; } /// /// Offizieller Firmenname für MangoPay /// [MaxLength(256, ErrorMessage = "Err_StringLength_Max")] [Display(Name = "Customer_MangopayCompanyName")] public string MangopayCompanyName { get; set; } /// /// Email Adresse für MangoPay /// [MaxLength(255, ErrorMessage = "Err_StringLength_Max")] [EmailAddress(ErrorMessage = "Err_InvalidEmail")] [Display(Name = "Customer_MangopayEmail")] public string MangopayEmail { get; set; } /// /// Adressdaten /// [Display(Name = "Customer_MangopayAddress")] public AddressVm MangopayAddress { get; set; } /// /// Company registration number - Handelsregisternummer /// [MaxLength(50, ErrorMessage = "Err_StringLength_Max")] [Display(Name = "Customer_MangopayRegistrationNumber")] public string MangopayRegistrationNumber { get; set; } /// /// Vorname der Kontaktperson Mangopay /// [MaxLength(100, ErrorMessage = "Err_StringLength_Max")] [Display(Name = "Customer_MangopayContactFirstName")] public string MangopayContactFirstName { get; set; } /// /// Nachname der Kontaktperson Mangopay /// [MaxLength(100, ErrorMessage = "Err_StringLength_Max")] [Display(Name = "Customer_MangopayContactLastName")] public string MangopayContactLastName { get; set; } /// /// Email Adresse der Kontaktperson Mangopay /// [MaxLength(255, ErrorMessage = "Err_StringLength_Max")] [Display(Name = "Customer_MangopayContactEmail")] public string MangopayContactEmail { get; set; } /// /// Geburtsdatum der Kontaktperson Mangopay /// [Display(Name = "Customer_MangopayContactBirthdate")] public DateTimeOffset? MangopayContactBirthdate { get; set; } /// /// Nationalität der Kontaktperson Mangopay ISO2 /// [MaxLength(2, ErrorMessage = "Err_StringLength_Max")] [Display(Name = "Customer_MangopayContactNationality")] public string MangopayContactNationality { get; set; } /// /// Land Hauptwohnsitz ISO2 /// [MaxLength(2, ErrorMessage = "Err_StringLength_Max")] [Display(Name = "Customer_MangopayContactMainResidenceCode")] public string MangopayContactMainResidenceCode { get; set; } /// /// Wurden die Datenschutzbedingungen des Paymentproviders akzeptiert /// [Required(ErrorMessage = "Err_Required")] [Display(Name = "Customer_MangopayTermsAccepted")] public bool MangopayTermsAccepted { get; set; } /// /// Wann wurden die Datenschutzbedingungen des Paymentproviders akzeptiert? /// [Display(Name = "Customer_MangopayTermsAcceptedDate")] public DateTimeOffset? MangopayTermsAcceptedDate { get; set; } #endregion /// /// Datum Erstellung /// [Display(Name = "Common_Created")] public DateTimeOffset Created { get; set; } /// /// Erstellt eine Instanz /// public CustomerVm() { Address = new AddressRequiredVm(); Contact = new ContactEmailRequiredVm(); MangopayAddress = new AddressVm(); } } /// /// Viewmodel für das Bearbeiten & Anlegen eines Kunden /// public class CustomerCrudVm : CustomerVm, IValidatableObject { /// /// Typ des Kunden als Name /// public string TypeName { get; set; } /// /// Branche - Name /// public string BranchName { get; set; } /// /// Land-Name /// public string CountryName { get; set; } /// /// Bundesland-Name /// public string StateName { get; set; } /// /// Land-Name für Mangopay /// public string MangopayCountryName { get; set; } /// /// Bundesland-Name für Mangopay /// public string MangopayStateName { get; set; } /// /// Nationalität-Name für Mangopay /// public string MangopayContactNationalityName { get; set; } /// /// Hauptwohnsitz-Name für Mangopay /// public string MangopayContactMainResidenceCodeName { get; set; } /// /// Stellt fest ob das Model gültig ist. /// /// /// Liste von Fehlermeldungen, wenn Validierungs-Fehler auftreten. /// /// Validierungs-Kontext public IEnumerable Validate(ValidationContext validationContext) { //Prüfen ob eine Zahlungsmöglichkeit aktiviert wurde if (IsCompany && Address != null && !string.IsNullOrWhiteSpace(Address.CountryCode)) { var vatValidationSettings = validationContext.GetService(typeof(IOptions)) as IOptions; if (vatValidationSettings.Value.Countries.Contains(Address.CountryCode.ToUpper())) { if (string.IsNullOrWhiteSpace(Vat)) { var stringLocalizer = validationContext.GetService(typeof(IStringLocalizer)) as IStringLocalizer; yield return new ValidationResult(stringLocalizer["Err_Vat_Missing"], new List { "Vat" }); } } } } } /// /// Viewmodel für einen Kunden Listendarstellung /// public class CustomerListVm { /// /// Id des Kunden /// public long Id { get; set; } /// /// Spezial-ID /// public Guid? UniqueId { get; set; } /// /// Typ des Kunden /// [Display(Name = "Customer_TypeId")] public long? TypeId { get; set; } /// /// Typ des Kunden als Name /// [Display(Name = "Customer_TypeId")] public string TypeName { get; set; } /// /// Branche des Kunden /// [Display(Name = "Customer_BranchId")] public string BranchId { get; set; } /// /// Branche des Kunden als Name /// [Display(Name = "Customer_BranchId")] public string BranchName { get; set; } /// /// Optional: Liste der Branchen für eine Listung /// public string BranchesJson { get; set; } /// /// Kundennummer /// [Display(Name = "Customer_Number")] public string Number { get; set; } /// /// Name des Kunden /// [Display(Name = "Customer_Name", Description = "Customer_Name_Desc")] public string Name { get; set; } /// /// UID Nummer /// [Display(Name = "Customer_Vat")] public string Vat { get; set; } /// /// Land der Adresse /// public string CountryCode { get; set; } /// /// Sprachen die für einen Kunden verfügbar sind. /// [Display(Name = "Customer_Languages")] public string Languages { get; set; } /// /// Optional - Logo des Unternehmens /// [Display(Name = "Customer_Logo")] public string Logo { get; set; } /// /// Zahlen auf Rechnung allgemein möglich? /// [Display(Name = "Customer_PaymentOnInvoice")] public bool PaymentOnInvoice { get; set; } /// /// ID des AppUsers beim Payment-Provider erstellt /// [Display(Name = "Customer_MangopayIdCreated")] public bool MangopayIdCreated { get; set; } /// /// ID des AppUsers beim Payment-Provider /// [Display(Name = "Customer_MangopayPaymentId")] public string MangopayPaymentId { get; set; } /// /// Datum Erstellung /// [Display(Name = "Common_Created")] public DateTimeOffset Created { get; set; } } }