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