using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
using gehGassiApp.Domain.Base;
using gehGassiApp.Domain.Common;
using gehGassiApp.Domain.Dogs;
namespace gehGassiApp.Domain.Walks
{
///
/// Repräsentiert einen Walk
///
public class Walk : SyncEntity
{
///
/// Art der Walk Anfrage
///
[Required]
public WalkType Type { get; set; }
///
/// Welche Art von Service soll durchgeführt werden
///
[Required]
public WalkServiceType ServiceType { get; set; }
///
/// Id des Walkers
///
[MaxLength(128)]
public string DogWalkerId { get; set; }
///
/// Id des Hundebesitzers
///
[MaxLength(128)]
public string DogOwnerId { get; set; }
///
/// Id der öffentlichen Anfrage, wenn über diese erstellt
///
[MaxLength(128)]
public string PublicWalkRequestId { get; set; }
///
/// Jsonliste mit Id´s der Hunde die ausgewählt wurden
///
public string DogsJson { get; set; }
///
/// Anzahl der Hunde
///
[Required]
public int DogCount { get; set; }
///
/// Startdatum des Walks mit Urhrzeit
///
[Required]
public DateTimeOffset Start { get; set; }
///
/// Enddatum des Walks mit Uhrzeit
///
[Required]
public DateTimeOffset End { get; set; }
///
/// Wo soll der Hunde abgeholt werden
///
public Address PickupAddress { get; set; }
///
/// Breitengrad der Abhol-Adresse
///
public double PickupAddressLat { get; set; }
///
/// Längengrad der Abhol-Adresse
///
public double PickupAddressLng { get; set; }
///
/// Wo soll der Hunde zurückgegeben werden werden
///
public Address ReturnAddress { get; set; }
///
/// Breitengrad der Rückgabe-Adresse
///
public double ReturnAddressLat { get; set; }
///
/// Längengrad der Rückgabe-Adresse
///
public double ReturnAddressLng { get; set; }
///
/// Preis für den Walk / Das Sitting. Wird gesetzt und kann entweder fix sein (öffentliche Anfrage) oder errechnet
///
public decimal Price { get; set; }
///
/// Zusatzinfo für den Walk. Z.B. bei Susi klingeln
///
[MaxLength(500)]
public string Info { get; set; }
///
/// Status eines Walks
///
[Required]
public WalkStatus Status { get; set; }
///
/// Wann wurde der Walk / Sitting gestartet?
///
public DateTimeOffset? Started { get; set; }
///
/// Wann wurde der Walk / Sitting beendet?
///
public DateTimeOffset? Completed { get; set; }
///
/// Wann wurde der Walk / Sitting bestätigt?
///
public DateTimeOffset? Confirmed { get; set; }
///
/// Wann wurde der Walk / Sitting reklamiert?
///
public DateTimeOffset? Complained { get; set; }
///
/// Optional: Grund für die Reklamation
///
[MaxLength(500)]
public string ComplainReason { get; set; }
#region Status Infos
///
/// Optional: Grund für die Ablehnung
///
[MaxLength(500)]
public string DeclinedReason { get; set; }
///
/// Optional: Grund für die Stornierung
///
[MaxLength(500)]
public string CancelledReason { get; set; }
///
/// Wer hat eine Stornierung durchgeführt
///
[Required]
public CancellationSource CancelledBy { get; set; }
///
/// Anmerkungen vom Walker nach dem Abschluss
///
[MaxLength(500)]
public string CompletedInfo { get; set; }
///
/// Kotabsatz?
///
[Required]
public bool Defactation { get; set; }
#endregion
///
/// Zahlungsstatus des Walks
///
[Required]
public PaymentStatus PaymentStatus { get; set; }
///
/// Datum der Erstellung des Walks
///
[Required]
public DateTimeOffset Created { get; set; }
}
///
/// Repräsentiert einen Walk mit Namen aufgelöst - View
///
public class WalkWithNames : SyncEntityVw
{
private string _cancelledReason;
private string _completedInfo;
private bool _defactation;
private string _declinedReason;
private string _complainReason;
///
/// Art der Walk Anfrage
///
public WalkType Type { get; set; }
///
/// Welche Art von Service soll durchgeführt werden
///
public WalkServiceType ServiceType { get; set; }
///
/// Id des Walkers
///
public string DogWalkerId { get; set; }
///
/// Name des DogWalkers
///
public string DogWalkerName { get; set; }
///
/// Foto des Dogwalkers
///
public string DogWalkerPhoto { get; set; }
///
/// Walker gesperrt
///
[NotMapped]
public bool DogWalkerLocked { get; set; }
///
/// Walker blockiert
///
[NotMapped]
public bool DogWalkerBlocked { get; set; }
///
/// Blockiert oder gesperrt
///
[NotMapped]
public bool DogWalkerBlockedOrLocked => DogWalkerBlocked || DogWalkerLocked;
///
/// Id des Hundebesitzers
///
public string DogOwnerId { get; set; }
///
/// Name des Hundebesitzers
///
public string DogOwnerName { get; set; }
///
/// Foto des Hundebesitzers
///
public string DogOwnerPhoto { get; set; }
///
/// Hundebesitzer gesperrt
///
public bool DogOwnerLocked { get; set; }
///
/// Hundebesitzer blockiert
///
public bool DogOwnerBlocked { get; set; }
///
/// Blockiert oder gesperrt
///
[NotMapped]
public bool DogOwnerBlockedOrLocked => DogOwnerBlocked || DogOwnerLocked;
///
/// Id der öffentlichen Anfrage, wenn über diese erstellt
///
public string PublicWalkRequestId { get; set; }
///
/// Liste der Hunde
///
public List Dogs { get; set; }
///
/// Anzahl der Hunde
///
public int DogCount { get; set; }
///
/// Startdatum des Walks mit Urhrzeit
///
public DateTimeOffset Start { get; set; }
///
/// Enddatum des Walks mit Uhrzeit
///
public DateTimeOffset End { get; set; }
///
/// Wo soll der Hunde abgeholt werden
///
public Address PickupAddress { get; set; }
///
/// Breitengrad der Abhol-Adresse
///
public double PickupAddressLat { get; set; }
///
/// Längengrad der Abhol-Adresse
///
public double PickupAddressLng { get; set; }
///
/// Wo soll der Hunde zurückgegeben werden werden
///
public Address ReturnAddress { get; set; }
///
/// Breitengrad der Rückgabe-Adresse
///
public double ReturnAddressLat { get; set; }
///
/// Längengrad der Rückgabe-Adresse
///
public double ReturnAddressLng { get; set; }
///
/// Preis für den Walk / Das Sitting. Wird gesetzt und kann entweder fix sein (öffentliche Anfrage) oder errechnet
///
public decimal Price { get; set; }
///
/// Zusatzinfo für den Walk. Z.B. bei Susi klingeln
///
public string Info { get; set; }
///
/// Status eines Walks
///
public WalkStatus Status { get; set; }
///
/// Wann wurde der Walk / Sitting gestartet?
///
public DateTimeOffset? Started { get; set; }
///
/// Wann wurde der Walk / Sitting beendet?
///
public DateTimeOffset? Completed { get; set; }
///
/// Wann wurde der Walk / Sitting bestätigt?
///
public DateTimeOffset? Confirmed { get; set; }
///
/// Wann wurde der Walk / Sitting reklamiert?
///
public DateTimeOffset? Complained { get; set; }
///
/// Optional: Grund für die Reklamation
///
public string ComplainReason
{
get => _complainReason;
set
{
_complainReason = value;
OnPropertyChanged();
}
}
#region Status Infos
///
/// Optional: Grund für die Ablehnung
///
public string DeclinedReason
{
get => _declinedReason;
set
{
_declinedReason = value;
OnPropertyChanged();
}
}
///
/// Optional: Grund für die Stornierung
///
public string CancelledReason
{
get => _cancelledReason;
set
{
_cancelledReason = value;
OnPropertyChanged();
}
}
///
/// Wer hat eine Stornierung durchgeführt
///
public CancellationSource CancelledBy { get; set; }
///
/// Anmerkungen vom Walker nach dem Abschluss
///
public string CompletedInfo
{
get => _completedInfo;
set
{
_completedInfo = value;
OnPropertyChanged();
}
}
///
/// Kotabsatz?
///
public bool Defactation
{
get => _defactation;
set
{
_defactation = value;
OnPropertyChanged();
}
}
#endregion
///
/// Zahlungsstatus des Walks
///
public PaymentStatus PaymentStatus { get; set; }
///
/// Id des Gutscheins der verwendet wurde, wenn einer verwendet wurde
///
public string? VoucherId { get; set; }
///
/// Wert des Gutscheins - real verwendeter Wert
///
public decimal VoucherAmmount { get; set; }
///
/// Datum der Erstellung des Walks
///
public DateTimeOffset Created { get; set; }
///
/// Abstand Abholadresse zum aktuellen Standort in KM
///
[NotMapped]
public double DistancePickup { get; set; }
///
/// Abstand Rückgabeadresse zum aktuellen Standort in KM
///
[NotMapped]
public double DistanceReturn { get; set; }
///
/// Gibt zurück welche der Distanzen angezeigt werden soll.
/// Hängt vom Status des Walks ab
///
[NotMapped]
public double DistanceNextWalk {
get
{
if (Status >= WalkStatus.Started || Start < DateTimeOffset.UtcNow)
return DistanceReturn;
return DistancePickup;
}
}
///
/// Gibt an wie viele Hunde zusätzlich gebucht wurden
///
[NotMapped]
public int DogCountPlus => DogCount - 1;
public bool ToPay
{
get
{
return PaymentStatus == PaymentStatus.Pending && Status < WalkStatus.Declined;
}
}
public bool ToConfirm
{
get
{
return PaymentStatus == PaymentStatus.Authorized && Status == WalkStatus.Completed;
}
}
public string DogName
{
get
{
return Dogs.First().Name;
}
}
public string DogNames
{
get
{
return string.Join(", ", Dogs.Select(c => c.Name));
}
}
public string DogPhoto
{
get
{
return Dogs.First().Photo;
}
}
///
/// Vorname + Nachname erster Buchstabe + Punkt, oder nur Vorname wenn kein Nachname
///
[NotMapped]
public string DogWalkerFullNameShort
{
get
{
if (!string.IsNullOrWhiteSpace(DogWalkerName))
{
var parts = DogWalkerName.Split(" ");
var firstName = parts[0];
var lastName = string.Empty;
if (parts.Length > 1)
lastName = parts[1];
return string.IsNullOrWhiteSpace(lastName) ? firstName : $"{firstName} {lastName[..1]}.";
}
return string.Empty;
}
}
///
/// Vorname + Nachname erster Buchstabe + Punkt, oder nur Vorname wenn kein Nachname
///
[NotMapped]
public string DogOwnerFullNameShort
{
get
{
if (!string.IsNullOrWhiteSpace(DogOwnerName))
{
var parts = DogOwnerName.Split(" ");
var firstName = parts[0];
var lastName = string.Empty;
if (parts.Length > 1)
lastName = parts[1];
return string.IsNullOrWhiteSpace(lastName) ? firstName : $"{firstName} {lastName[..1]}.";
}
return string.Empty;
}
}
#region Erweiterung Blockier- und Sperrinfo
///
/// Blockiert
///
[NotMapped]
public bool Blocked { get; set; }
///
/// Gesperrt
///
[NotMapped]
public bool Locked { get; set; }
///
/// Blockiert oder gesperrt
///
[NotMapped]
public bool BlockedOrLocked => Blocked || Locked;
#endregion
}
}