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