458 lines
15 KiB
C#

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