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