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