495 lines
15 KiB
C#
495 lines
15 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel.DataAnnotations;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using gehGassi.Domain.Common;
|
|
|
|
namespace gehGassi.Domain.Customers
|
|
{
|
|
/// <summary>
|
|
/// Repräsentiert einen Kunden
|
|
/// </summary>
|
|
public class Customer : IAuditable
|
|
{
|
|
/// <summary>
|
|
/// Id des Kunden
|
|
/// </summary>
|
|
[Key]
|
|
[Required]
|
|
public long Id { get; set; }
|
|
|
|
/// <summary>
|
|
/// Spezial-ID
|
|
/// </summary>
|
|
public Guid? UniqueId { get; set; }
|
|
|
|
/// <summary>
|
|
/// Typ des Kunden
|
|
/// </summary>
|
|
public long? TypeId { get; set; }
|
|
|
|
/// <summary>
|
|
/// Branche
|
|
/// </summary>
|
|
[MaxLength(128)]
|
|
public string BranchId { get; set; }
|
|
|
|
/// <summary>
|
|
/// Optional: Liste der Branchen für eine Listung
|
|
/// </summary>
|
|
public string BranchesJson { get; set; }
|
|
|
|
/// <summary>
|
|
/// Kundennummer
|
|
/// </summary>
|
|
[Required]
|
|
[MaxLength(100)]
|
|
public string Number { get; set; }
|
|
|
|
/// <summary>
|
|
/// Name des Kunden
|
|
/// </summary>
|
|
[Required]
|
|
[MaxLength(200)]
|
|
public string Name { get; set; }
|
|
|
|
/// <summary>
|
|
/// Handelt es sich um einen Firmenkunden?
|
|
/// </summary>
|
|
[Required]
|
|
public bool IsCompany { get; set; }
|
|
|
|
/// <summary>
|
|
/// UID Nummer
|
|
/// </summary>
|
|
[MaxLength(50)]
|
|
public string Vat { get; set; }
|
|
|
|
/// <summary>
|
|
/// Anrede / titel
|
|
/// </summary>
|
|
[MaxLength(50)]
|
|
public string Title { get; set; }
|
|
|
|
/// <summary>
|
|
/// Optinaler Vorname der Kontaktperson
|
|
/// </summary>
|
|
[MaxLength(100)]
|
|
public string FirstName { get; set; }
|
|
|
|
/// <summary>
|
|
/// Optinaler Nachname der Kontaktperson
|
|
/// </summary>
|
|
[MaxLength(100)]
|
|
public string LastName { get; set; }
|
|
|
|
/// <summary>
|
|
/// Kontaktdaten
|
|
/// </summary>
|
|
public Contact Contact { get; set; }
|
|
|
|
/// <summary>
|
|
/// Adressdaten
|
|
/// </summary>
|
|
public Address Address { get; set; }
|
|
|
|
/// <summary>
|
|
/// Anmerkungen
|
|
/// </summary>
|
|
[MaxLength(1000)]
|
|
public string Comment { get; set; }
|
|
|
|
/// <summary>
|
|
/// Sprachen die für einen Kunden verfügbar sind.
|
|
/// </summary>
|
|
[Required]
|
|
[MaxLength(256)]
|
|
public string Languages { get; set; }
|
|
|
|
/// <summary>
|
|
/// Optional - Logo des Unternehmens
|
|
/// </summary>
|
|
[MaxLength(500)]
|
|
public string Logo { get; set; }
|
|
|
|
#region finance
|
|
|
|
/// <summary>
|
|
/// Auf- oder Abschlag für eine Listung in Prozent
|
|
/// </summary>
|
|
public decimal MarkupListing { get; set; }
|
|
|
|
/// <summary>
|
|
/// Auf- oder Abschlag für eine Werbung in Prozent
|
|
/// </summary>
|
|
public decimal MarkupAdvertisement { get; set; }
|
|
|
|
/// <summary>
|
|
/// Auf- oder Abschlag für eine Pin-Werbung in Prozent
|
|
/// </summary>
|
|
public decimal MarkupPin { get; set; }
|
|
|
|
/// <summary>
|
|
/// Auf- oder Abschlag für eine Banner-Werbung in Prozent
|
|
/// </summary>
|
|
public decimal MarkupBanner { get; set; }
|
|
|
|
/// <summary>
|
|
/// Zahlen auf Rechnung allgemein möglich?
|
|
/// </summary>
|
|
[Required]
|
|
public bool PaymentOnInvoice { get; set; }
|
|
|
|
#endregion
|
|
|
|
/// <summary>
|
|
/// Datum der Erstellung
|
|
/// </summary>
|
|
public DateTimeOffset Created { get; set; }
|
|
|
|
#region MangoPay
|
|
|
|
/// <summary>
|
|
/// ID des AppUsers beim Payment-Provider erstellt
|
|
/// </summary>
|
|
public bool MangopayIdCreated { get; set; }
|
|
|
|
/// <summary>
|
|
/// ID des AppUsers beim Payment-Provider
|
|
/// </summary>
|
|
[MaxLength(255)]
|
|
public string MangopayPaymentId { get; set; }
|
|
|
|
/// <summary>
|
|
/// Offizieller Firmenname für MangoPay
|
|
/// </summary>
|
|
[MaxLength(256)]
|
|
public string MangopayCompanyName { get; set; }
|
|
|
|
/// <summary>
|
|
/// Email für Mangopay
|
|
/// </summary>
|
|
[MaxLength(255)]
|
|
public string MangopayEmail { get; set; }
|
|
|
|
/// <summary>
|
|
/// Adressdaten
|
|
/// </summary>
|
|
public Address MangopayAddress { get; set; }
|
|
|
|
/// <summary>
|
|
/// Company registration number - Handelsregisternummer
|
|
/// </summary>
|
|
[MaxLength(50)]
|
|
public string MangopayRegistrationNumber { get; set; }
|
|
|
|
/// <summary>
|
|
/// Vorname der Kontaktperson Mangopay
|
|
/// </summary>
|
|
[MaxLength(100)]
|
|
public string MangopayContactFirstName { get; set; }
|
|
|
|
/// <summary>
|
|
/// Nachname der Kontaktperson Mangopay
|
|
/// </summary>
|
|
[MaxLength(100)]
|
|
public string MangopayContactLastName { get; set; }
|
|
|
|
/// <summary>
|
|
/// Email Adresse der Kontaktperson Mangopay
|
|
/// </summary>
|
|
[MaxLength(255)]
|
|
public string MangopayContactEmail { get; set; }
|
|
|
|
/// <summary>
|
|
/// Geburtsdatum der Kontaktperson Mangopay
|
|
/// </summary>
|
|
public DateTimeOffset? MangopayContactBirthdate { get; set; }
|
|
|
|
/// <summary>
|
|
/// Nationalität der Kontaktperson Mangopay ISO2
|
|
/// </summary>
|
|
[MaxLength(2)]
|
|
public string MangopayContactNationality { get; set; }
|
|
|
|
/// <summary>
|
|
/// Land Hauptwohnsitz ISO2
|
|
/// </summary>
|
|
[MaxLength(2)]
|
|
public string MangopayContactMainResidenceCode { get; set; }
|
|
|
|
/// <summary>
|
|
/// Wurden die Datenschutzbedingungen des Paymentproviders akzeptiert
|
|
/// </summary>
|
|
[Required]
|
|
public bool MangopayTermsAccepted { get; set; }
|
|
|
|
/// <summary>
|
|
/// Wann wurden die Datenschutzbedingungen des Paymentproviders akzeptiert?
|
|
/// </summary>
|
|
public DateTimeOffset? MangopayTermsAcceptedDate { get; set; }
|
|
|
|
#endregion
|
|
|
|
/// <summary>
|
|
/// Gibt zurück ob der Kunde alle notwendigen Informationen für den PaymentProvider beinhaltet
|
|
/// </summary>
|
|
/// <returns>true wenn alle notwendigen Daten vorhanden sind, false sonst</returns>
|
|
public bool HasDataForMangopay()
|
|
{
|
|
if (string.IsNullOrWhiteSpace(MangopayCompanyName))
|
|
return false;
|
|
if (string.IsNullOrWhiteSpace(MangopayEmail))
|
|
return false;
|
|
if (MangopayAddress == null)
|
|
return false;
|
|
if (string.IsNullOrWhiteSpace(MangopayAddress.AddressLine1))
|
|
return false;
|
|
if (string.IsNullOrWhiteSpace(MangopayAddress.Zip))
|
|
return false;
|
|
if (string.IsNullOrWhiteSpace(MangopayAddress.City))
|
|
return false;
|
|
if (string.IsNullOrWhiteSpace(MangopayAddress.CountryCode))
|
|
return false;
|
|
if (string.IsNullOrWhiteSpace(MangopayRegistrationNumber))
|
|
return false;
|
|
if (string.IsNullOrWhiteSpace(MangopayContactFirstName))
|
|
return false;
|
|
if (string.IsNullOrWhiteSpace(MangopayContactLastName))
|
|
return false;
|
|
if (string.IsNullOrWhiteSpace(MangopayContactEmail))
|
|
return false;
|
|
if (string.IsNullOrWhiteSpace(MangopayContactNationality))
|
|
return false;
|
|
if (string.IsNullOrWhiteSpace(MangopayContactMainResidenceCode))
|
|
return false;
|
|
if (!MangopayContactBirthdate.HasValue)
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gibt zurück ob es an den Daten für Mangopay Änderungen gab
|
|
/// </summary>
|
|
/// <param name="companyName">Firmenname</param>
|
|
/// <param name="email">Email der Firma</param>
|
|
/// <param name="addressLine1">Strasse</param>
|
|
/// <param name="zip">PLZ</param>
|
|
/// <param name="ciy">Ort</param>
|
|
/// <param name="countryCode">Land</param>
|
|
/// <param name="registrationNumber">Registrierungsnummer</param>
|
|
/// <param name="firstName">Vorname</param>
|
|
/// <param name="lastName">Nachname</param>
|
|
/// <param name="contactEmail">Email Kontaktperson</param>
|
|
/// <param name="birthDate">Geburtsdatum</param>
|
|
/// <param name="nationality">Nationalität</param>
|
|
/// <param name="residence">Hauptwohnsitz</param>
|
|
/// <param name="termsAccepted">AGB akzeptiert</param>
|
|
/// <returns>true wenn Änderungen vorhanden sind, false sonst</returns>
|
|
public bool HasChangesForMangopay(string companyName, string email, string addressLine1, string zip, string ciy, string countryCode,
|
|
string registrationNumber, string firstName, string lastName, string contactEmail, DateTimeOffset? birthDate, string nationality, string residence, bool termsAccepted)
|
|
{
|
|
if(MangopayCompanyName != companyName)
|
|
return true;
|
|
if (MangopayEmail != email)
|
|
return true;
|
|
if(MangopayAddress?.AddressLine1 != addressLine1)
|
|
return true;
|
|
if(MangopayAddress?.Zip != zip)
|
|
return true;
|
|
if(MangopayAddress?.City != ciy)
|
|
return true;
|
|
if(MangopayAddress?.CountryCode != countryCode)
|
|
return true;
|
|
if(MangopayRegistrationNumber != registrationNumber)
|
|
return true;
|
|
if(MangopayContactFirstName != firstName)
|
|
return true;
|
|
if(MangopayContactLastName != lastName)
|
|
return true;
|
|
if(MangopayContactEmail != contactEmail)
|
|
return true;
|
|
if(MangopayContactBirthdate != birthDate)
|
|
return true;
|
|
if(MangopayContactNationality != nationality)
|
|
return true;
|
|
if(MangopayContactMainResidenceCode != residence)
|
|
return true;
|
|
if(MangopayTermsAccepted != termsAccepted)
|
|
return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
#region IAuditable
|
|
/// <summary>
|
|
/// 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.
|
|
/// </summary>
|
|
/// <returns>Eindeutiger Key</returns>
|
|
public string AuditKey()
|
|
{
|
|
return Id.ToString();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gibt den Objektnamen bzw. die Tabelle der Entität zurück
|
|
/// </summary>
|
|
/// <returns>Objektnamen</returns>
|
|
public string AuditTable()
|
|
{
|
|
return "Customers";
|
|
}
|
|
|
|
public AuditableOptions Options()
|
|
{
|
|
return AuditableOptions.Create | AuditableOptions.Edit | AuditableOptions.Delete;
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
|
|
/// <summary>
|
|
/// Repräsentiert einen Kunden mit aufgelösten Namen für View
|
|
/// </summary>
|
|
public class CustomerWithNames
|
|
{
|
|
/// <summary>
|
|
/// Id des Kunden
|
|
/// </summary>
|
|
public long Id { get; set; }
|
|
|
|
/// <summary>
|
|
/// Spezial-ID
|
|
/// </summary>
|
|
public Guid? UniqueId { get; set; }
|
|
|
|
/// <summary>
|
|
/// Typ des Kunden
|
|
/// </summary>
|
|
public long? TypeId { get; set; }
|
|
|
|
/// <summary>
|
|
/// Name des Kunden-Typen
|
|
/// </summary>
|
|
public string TypeName { get; set; }
|
|
|
|
/// <summary>
|
|
/// Branche
|
|
/// </summary>
|
|
public string BranchId { get; set; }
|
|
|
|
/// <summary>
|
|
/// Name der Branche
|
|
/// </summary>
|
|
public string BranchName { get; set; }
|
|
|
|
/// <summary>
|
|
/// Optional: Liste der Branchen für eine Listung
|
|
/// </summary>
|
|
public string BranchesJson { get; set; }
|
|
|
|
/// <summary>
|
|
/// Kundennummer
|
|
/// </summary>
|
|
public string Number { get; set; }
|
|
|
|
/// <summary>
|
|
/// Name des Kunden
|
|
/// </summary>
|
|
public string Name { get; set; }
|
|
|
|
/// <summary>
|
|
/// Handelt es sich um einen Firmenkunden?
|
|
/// </summary>
|
|
public bool IsCompany { get; set; }
|
|
|
|
/// <summary>
|
|
/// UID Nummer
|
|
/// </summary>
|
|
public string Vat { get; set; }
|
|
|
|
/// <summary>
|
|
/// Anrede / titel
|
|
/// </summary>
|
|
public string Title { get; set; }
|
|
|
|
/// <summary>
|
|
/// Optinaler Vorname der Kontaktperson
|
|
/// </summary>
|
|
public string FirstName { get; set; }
|
|
|
|
/// <summary>
|
|
/// Optinaler Nachname der Kontaktperson
|
|
/// </summary>
|
|
public string LastName { get; set; }
|
|
|
|
/// <summary>
|
|
/// Land der Adresse
|
|
/// </summary>
|
|
public string CountryCode { get; set; }
|
|
|
|
/// <summary>
|
|
/// Anmerkungen
|
|
/// </summary>
|
|
public string Comment { get; set; }
|
|
|
|
/// <summary>
|
|
/// Sprachen die für einen Kunden verfügbar sind.
|
|
/// </summary>
|
|
public string Languages { get; set; }
|
|
|
|
/// <summary>
|
|
/// Optional - Logo des Unternehmens
|
|
/// </summary>
|
|
public string Logo { get; set; }
|
|
|
|
#region finance
|
|
|
|
/// <summary>
|
|
/// Auf- oder Abschlag für eine Listung in Prozent
|
|
/// </summary>
|
|
public decimal MarkupListing { get; set; }
|
|
|
|
/// <summary>
|
|
/// Auf- oder Abschlag für eine Werbung in Prozent
|
|
/// </summary>
|
|
public decimal MarkupAdvertisement { get; set; }
|
|
|
|
/// <summary>
|
|
/// Auf- oder Abschlag für eine Pin-Werbung in Prozent
|
|
/// </summary>
|
|
public decimal MarkupPin { get; set; }
|
|
|
|
/// <summary>
|
|
/// Auf- oder Abschlag für eine Banner-Werbung in Prozent
|
|
/// </summary>
|
|
public decimal MarkupBanner { get; set; }
|
|
|
|
/// <summary>
|
|
/// Zahlen auf Rechnung allgemein möglich?
|
|
/// </summary>
|
|
public bool PaymentOnInvoice { get; set; }
|
|
|
|
#endregion
|
|
|
|
/// <summary>
|
|
/// ID des AppUsers beim Payment-Provider erstellt
|
|
/// </summary>
|
|
public bool MangopayIdCreated { get; set; }
|
|
|
|
/// <summary>
|
|
/// ID des AppUsers beim Payment-Provider
|
|
/// </summary>
|
|
public string MangopayPaymentId { get; set; }
|
|
|
|
/// <summary>
|
|
/// Datum der Erstellung
|
|
/// </summary>
|
|
public DateTimeOffset Created { get; set; }
|
|
}
|
|
}
|