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