593 lines
16 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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