using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Text; using System.Threading.Tasks; using gehGassi.Domain.Base; using gehGassi.Domain.Common; using gehGassi.Domain.Ratings; using NetTopologySuite.Geometries; namespace gehGassi.Domain.Dogs { /// /// Repräsentiert einen App-User /// public class AppUser : SyncEntity, IAuditable { /// /// Art des App-Users /// [Required] public AppUserType Type { get; set; } /// /// Nummer des App-Users /// [Required] [MaxLength(100)] public string Number { get; set; } /// /// Anrede / titel /// [MaxLength(50)] public string Title { get; set; } /// /// Vorname /// [Required] [MaxLength(150)] public string FirstName { get; set; } /// /// Nachname /// [Required] [MaxLength(150)] public string LastName { get; set; } /// /// Geschlecht /// [Required] public Sex Sex { get; set; } /// /// Optional - Geburtstag /// public DateTimeOffset? BirthDate { get; set; } /// /// Optional - Foto des Benutzers /// [MaxLength(500)] public string Photo { get; set; } /// /// Kontaktdaten /// public ContactMin Contact { get; set; } /// /// Adressdaten /// public Address Address { get; set; } /// /// Geo-Koordinaten /// public Point Location { get; set; } /// /// Socialmedia Daten /// public SocialMedia SocialMedia { get; set; } /// /// Interne Anmerkungen /// [MaxLength(1000)] public string Comment { get; set; } /// /// Rating-Statistiken für den Hundebesitzer /// public RatingStatistics RatingStatistics { get; set; } /// /// Ratingstatistiken wenn auch oder nur Walker /// public RatingStatistics RatingStatisticsWalker { get; set; } /// /// Gesperrt /// [Required] public bool Locked { get; set; } /// /// Grund für die Sperrung /// [MaxLength(1000)] public string LockedReason { get; set; } /// /// Gesperrt bis /// public DateTimeOffset? LockedUntil { get; set; } /// /// Wie oft wurde der Benutzer gesperrt /// public int LockedCount { get; set; } /// /// Wurden die AGB akzeptiert /// [Required] public bool TermsAccepted { get; set; } /// /// Wann wurden die AGB akzeptiert? /// public DateTimeOffset? TermsAcceptedDate { get; set; } /// /// Wurden die Datenschutzbedingungen akzeptiert /// [Required] public bool PrivacyAccepted { get; set; } /// /// Wann wurden die Datenschutzbedingungen akzeptiert? /// public DateTimeOffset? PrivacyAcceptedDate { get; set; } #region Erweiterungen Mangopay /// /// Wurden die Datenschutzbedingungen des Paymentproviders akzeptiert /// [Required] public bool PaymentTermsAccepted { get; set; } /// /// Wann wurden die Datenschutzbedingungen des Paymentproviders akzeptiert? /// public DateTimeOffset? PaymentTermsAcceptedDate { get; set; } /// /// Nationalität ISO-2 /// [MaxLength(2)] public string NationalityCode { get; set; } /// /// Land Hauptwohnsitz ISO-2 /// [MaxLength(2)] public string MainResidenceCode { get; set; } /// /// ID des AppUsers beim Payment-Provider /// [MaxLength(255)] public string PaymentId { get; set; } /// /// Gibt an ob der Benutzer den KYC-Prozess durchlaufen hat /// [Required] public bool KycPassed { get; set; } /// /// Wann wurde der KYC-Prozess erfolgreich durchlaufen? /// public DateTimeOffset? KycPassedDate { get; set; } /// /// ID der Bank-Verbindung beim Payment-Provider /// [MaxLength(255)] public string BankId { get; set; } #endregion /// /// Gibt an ob es sich um einen verifizierten Benutzer handelt /// [Required] public bool Verified { get; set; } /// /// Wann wurde die Verification erfolgreich durchlaufen? /// public DateTimeOffset? VerifiedDate { get; set; } /// /// Gibt an ob für den Benutzer eine automatische Auszahlung erfolgen soll /// Das kann z.B. Wöchentlich sein. TODO: Besprechen wie das erfolgen soll /// [Required] public bool AutoPayout { get; set; } /// /// Wurde der Benutzer anonymisiert? /// [Required] public bool Anonymized { get; set; } /// /// Wann wurde der Benutzer anonymisiert? /// public DateTimeOffset? AnonymizedDate { get; set; } /// /// Datum der Erstellung /// public DateTimeOffset Created { get; set; } #region IAuditable /// /// 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. /// /// Eindeutiger Key public string AuditKey() { return Id.ToString(); } /// /// Gibt den Objektnamen bzw. die Tabelle der Entität zurück /// /// Objektnamen public string AuditTable() { return "AppUsers"; } public AuditableOptions Options() { return AuditableOptions.Create | AuditableOptions.Edit | AuditableOptions.Delete; } #endregion } }