416 lines
11 KiB
C#
416 lines
11 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.ComponentModel.DataAnnotations;
|
|
using System.Linq;
|
|
using System.Net;
|
|
using System.Text;
|
|
using System.Text.Json.Serialization;
|
|
using System.Threading.Tasks;
|
|
using CommunityToolkit.Mvvm.ComponentModel;
|
|
using gehGassiApp.Domain.Base;
|
|
using gehGassiApp.Domain.Common;
|
|
|
|
namespace gehGassiApp.Domain.Users
|
|
{
|
|
/// <summary>
|
|
/// Repräsentiert einen App-User.
|
|
/// Ist verbunden mit USER
|
|
/// </summary>
|
|
public class AppUser : SyncEntity
|
|
{
|
|
private string _photo;
|
|
private AppUserType _type;
|
|
private string _title;
|
|
private string _firstName;
|
|
private string _lastName;
|
|
private Sex _sex;
|
|
private DateTimeOffset? _birthDate;
|
|
private ContactMin _contact;
|
|
private Address _address;
|
|
private SocialMedia _socialMedia;
|
|
private RatingStatistics _ratingStatistics;
|
|
private RatingStatistics _ratingStatisticsWalker;
|
|
private bool _autoPayout;
|
|
|
|
/// <summary>
|
|
/// Art des App-Users
|
|
/// </summary>
|
|
[Required]
|
|
[JsonPropertyName("type")]
|
|
public AppUserType Type
|
|
{
|
|
get => _type;
|
|
set
|
|
{
|
|
_type = value;
|
|
OnPropertyChanged(nameof(Type));
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Anrede / titel
|
|
/// </summary>
|
|
[MaxLength(50)]
|
|
[JsonPropertyName("title")]
|
|
public string Title
|
|
{
|
|
get => _title;
|
|
set
|
|
{
|
|
_title = value;
|
|
OnPropertyChanged(nameof(Title));
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Vorname
|
|
/// </summary>
|
|
[Required]
|
|
[MaxLength(150)]
|
|
[JsonPropertyName("firstName")]
|
|
public string FirstName
|
|
{
|
|
get => _firstName;
|
|
set
|
|
{
|
|
_firstName = value;
|
|
OnPropertyChanged(nameof(FirstName));
|
|
OnPropertyChanged(nameof(Initials));
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Nachname
|
|
/// </summary>
|
|
[Required]
|
|
[MaxLength(150)]
|
|
[JsonPropertyName("lastName")]
|
|
public string LastName
|
|
{
|
|
get => _lastName;
|
|
set
|
|
{
|
|
_lastName = value;
|
|
OnPropertyChanged(nameof(LastName));
|
|
OnPropertyChanged(nameof(Initials));
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Geschlecht
|
|
/// </summary>
|
|
[Required]
|
|
[JsonPropertyName("sex")]
|
|
public Sex Sex
|
|
{
|
|
get => _sex;
|
|
set
|
|
{
|
|
_sex = value;
|
|
OnPropertyChanged(nameof(Sex));
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Optional - Geburtstag
|
|
/// </summary>
|
|
[JsonPropertyName("birthDate")]
|
|
public DateTimeOffset? BirthDate
|
|
{
|
|
get => _birthDate;
|
|
set
|
|
{
|
|
_birthDate = value;
|
|
OnPropertyChanged(nameof(BirthDate));
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Optional - Foto des Benutzers
|
|
/// </summary>
|
|
[MaxLength(500)]
|
|
[JsonPropertyName("photo")]
|
|
public string Photo
|
|
{
|
|
get
|
|
{
|
|
if(string.IsNullOrWhiteSpace(_photo))
|
|
return string.Empty;
|
|
|
|
if (!_photo.ToLower().StartsWith("http"))
|
|
{
|
|
if(!File.Exists(_photo))
|
|
return Path.Combine(FileSystem.AppDataDirectory, Path.GetFileName(_photo) ?? string.Empty);
|
|
}
|
|
|
|
return _photo;
|
|
}
|
|
set
|
|
{
|
|
_photo = value;
|
|
OnPropertyChanged(nameof(Photo));
|
|
OnPropertyChanged(nameof(ProfileNotFinished));
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Kontaktdaten
|
|
/// </summary>
|
|
[JsonPropertyName("contact")]
|
|
public ContactMin Contact
|
|
{
|
|
get => _contact;
|
|
set
|
|
{
|
|
_contact = value;
|
|
OnPropertyChanged(nameof(Contact));
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Adressdaten
|
|
/// </summary>
|
|
[JsonPropertyName("address")]
|
|
public Address Address
|
|
{
|
|
get => _address;
|
|
set
|
|
{
|
|
_address = value;
|
|
OnPropertyChanged(nameof(Address));
|
|
OnPropertyChanged(nameof(ProfileNotFinished));
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Breitengrad der Adresse
|
|
/// </summary>
|
|
[JsonPropertyName("lat")]
|
|
public double Lat { get; set; }
|
|
|
|
/// <summary>
|
|
/// Längengrad der Adresse
|
|
/// </summary>
|
|
[JsonPropertyName("lng")]
|
|
public double Lng { get; set; }
|
|
|
|
/// <summary>
|
|
/// Socialmedia Daten
|
|
/// </summary>
|
|
[JsonPropertyName("socialMedia")]
|
|
public SocialMedia SocialMedia
|
|
{
|
|
get => _socialMedia;
|
|
set
|
|
{
|
|
_socialMedia = value;
|
|
OnPropertyChanged(nameof(SocialMedia));
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Rating-Statistiken für den Hundebesitzer
|
|
/// </summary>
|
|
[JsonPropertyName("ratingStatistics")]
|
|
public RatingStatistics RatingStatistics
|
|
{
|
|
get => _ratingStatistics;
|
|
set
|
|
{
|
|
_ratingStatistics = value;
|
|
OnPropertyChanged();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Ratingstatistiken wenn auch oder nur Walker
|
|
/// </summary>
|
|
[JsonPropertyName("ratingStatisticsWalker")]
|
|
public RatingStatistics RatingStatisticsWalker
|
|
{
|
|
get => _ratingStatisticsWalker;
|
|
set
|
|
{
|
|
_ratingStatisticsWalker = value;
|
|
OnPropertyChanged();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Gesperrt
|
|
/// </summary>
|
|
[Required]
|
|
[JsonPropertyName("locked")]
|
|
public bool Locked { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gesperrt bis
|
|
/// </summary>
|
|
[JsonPropertyName("lockedUntil")]
|
|
public DateTimeOffset? LockedUntil { get; set; }
|
|
|
|
/// <summary>
|
|
/// Wurden die AGB akzeptiert
|
|
/// </summary>
|
|
[Required]
|
|
[JsonPropertyName("termsAccepted")]
|
|
public bool TermsAccepted { get; set; }
|
|
|
|
/// <summary>
|
|
/// Wann wurden die AGB akzeptiert?
|
|
/// </summary>
|
|
[JsonPropertyName("termsAcceptedDate")]
|
|
public DateTimeOffset? TermsAcceptedDate { get; set; }
|
|
|
|
/// <summary>
|
|
/// Wurden die Datenschutzbedingungen akzeptiert
|
|
/// </summary>
|
|
[Required]
|
|
[JsonPropertyName("privacyAccepted")]
|
|
public bool PrivacyAccepted { get; set; }
|
|
|
|
/// <summary>
|
|
/// Wann wurden die Datenschutzbedingungen akzeptiert?
|
|
/// </summary>
|
|
[JsonPropertyName("privacyAcceptedDate")]
|
|
public DateTimeOffset? PrivacyAcceptedDate { get; set; }
|
|
|
|
/// <summary>
|
|
/// Wurden die Datenschutzbedingungen des Paymentproviders akzeptiert
|
|
/// </summary>
|
|
[Required]
|
|
[JsonPropertyName("paymentTermsAccepted")]
|
|
public bool PaymentTermsAccepted { get; set; }
|
|
|
|
/// <summary>
|
|
/// Wann wurden die Datenschutzbedingungen des Paymentproviders akzeptiert?
|
|
/// </summary>
|
|
[JsonPropertyName("paymentTermsAcceptedDate")]
|
|
public DateTimeOffset? PaymentTermsAcceptedDate { get; set; }
|
|
|
|
/// <summary>
|
|
/// Nationalität ISO-2
|
|
/// </summary>
|
|
[MaxLength(2)]
|
|
[JsonPropertyName("nationalityCode")]
|
|
public string NationalityCode { get; set; }
|
|
|
|
/// <summary>
|
|
/// Land Hauptwohnsitz ISO-2
|
|
/// </summary>
|
|
[MaxLength(2)]
|
|
[JsonPropertyName("mainResidenceCode")]
|
|
public string MainResidenceCode { get; set; }
|
|
|
|
/// <summary>
|
|
/// ID des AppUsers beim Payment-Provider
|
|
/// </summary>
|
|
[MaxLength(255)]
|
|
[JsonPropertyName("paymentId")]
|
|
public string PaymentId { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gibt an ob der Benutzer den KYC-Prozess durchlaufen hat
|
|
/// </summary>
|
|
[Required]
|
|
[JsonPropertyName("kycPassed")]
|
|
public bool KycPassed { get; set; }
|
|
|
|
/// <summary>
|
|
/// Wann wurde der KYC-Prozess erfolgreich durchlaufen?
|
|
/// </summary>
|
|
[JsonPropertyName("kycPassedDate")]
|
|
public DateTimeOffset? KycPassedDate { get; set; }
|
|
|
|
/// <summary>
|
|
/// ID der aktuellen Bankverbindung bei MangoPay
|
|
/// </summary>
|
|
[MaxLength(255)]
|
|
[JsonPropertyName("bankId")]
|
|
public string BankId { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gibt an ob es sich um einen verifizierten Benutzer handelt
|
|
/// </summary>
|
|
[Required]
|
|
[JsonPropertyName("verified")]
|
|
public bool Verified { get; set; }
|
|
|
|
/// <summary>
|
|
/// Wann wurde die Verification erfolgreich durchlaufen?
|
|
/// </summary>
|
|
[JsonPropertyName("verifiedDate")]
|
|
public DateTimeOffset? VerifiedDate { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gibt an ob für den Benutzer eine automatische Auszahlung erfolgen soll
|
|
/// Das kann z.B. Wöchentlich sein.
|
|
/// </summary>
|
|
[Required]
|
|
[JsonPropertyName("autoPayout")]
|
|
public bool AutoPayout
|
|
{
|
|
get => _autoPayout;
|
|
set
|
|
{
|
|
_autoPayout = value;
|
|
OnPropertyChanged();
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Datum der Erstellung
|
|
/// </summary>
|
|
[JsonPropertyName("created")]
|
|
public DateTimeOffset Created { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gibt die Initialien zurück
|
|
/// </summary>
|
|
public string Initials
|
|
{
|
|
get
|
|
{
|
|
if (!string.IsNullOrWhiteSpace(FirstName) && !string.IsNullOrWhiteSpace(LastName))
|
|
return $"{FirstName.Substring(0, 1)}{LastName.Substring(0, 1)}";
|
|
else if (!string.IsNullOrWhiteSpace(FirstName) && FirstName.Length >= 2 && string.IsNullOrWhiteSpace(LastName))
|
|
return $"{FirstName.Substring(0, 2)}";
|
|
else if (string.IsNullOrWhiteSpace(FirstName) && string.IsNullOrWhiteSpace(LastName) && LastName.Length >= 2)
|
|
return $"{LastName.Substring(0, 2)}";
|
|
else
|
|
return "??";
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Voller Name
|
|
/// </summary>
|
|
public string FullName => $"{FirstName} {LastName}";
|
|
|
|
/// <summary>
|
|
/// Gibt an ob der Benutzer das Profile noch nicht abgeschlossen hat
|
|
/// </summary>
|
|
public bool ProfileNotFinished {
|
|
get
|
|
{
|
|
//Prüfen ob im Profil noch Daten fehlen
|
|
var notFinished = false;
|
|
|
|
if(string.IsNullOrWhiteSpace(Photo))
|
|
notFinished = true;
|
|
else if(string.IsNullOrWhiteSpace(Address.AddressLine1))
|
|
notFinished = true;
|
|
else if (string.IsNullOrWhiteSpace(Address.Zip))
|
|
notFinished = true;
|
|
else if (string.IsNullOrWhiteSpace(Address.City))
|
|
notFinished = true;
|
|
|
|
//TODO: hier noch Verbindung zu Walker-Profil
|
|
|
|
|
|
return notFinished;
|
|
}
|
|
}
|
|
}
|
|
}
|