using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Linq; using System.Text; using System.Text.Json.Serialization; using System.Threading.Tasks; using gehGassiApp.Domain.Base; using gehGassiApp.Domain.Common; using gehGassiApp.Domain.Dogs; namespace gehGassiApp.Domain.Walks { /// /// Öffentliche Anfrage für einen Walk /// public class PublicWalkRequest : SyncEntity { private Address _pickupAddress; private PublicWalkRequestType _requestType; private DateTimeOffset _startDate; private DateTimeOffset _endDate; private bool _exclusive; private decimal _price; private string _info; private DateTimeOffset _expirationDate; private int _dogCount; /// /// Id des App-Users / Hundebesitzers der die Anfrage erstellt hat /// Ist eine AppUserId /// [MaxLength(128)] public string DogOwnerId { get; set; } /// /// Abhol-Adresse /// public Address PickupAddress { get => _pickupAddress; set { _pickupAddress = value; OnPropertyChanged(); } } /// /// Breitengrad der Adresse /// [JsonPropertyName("lat")] public double Lat { get; set; } /// /// Längengrad der Adresse /// [JsonPropertyName("lng")] public double Lng { get; set; } /// /// Welche Art der Anfrage? /// [Required] public PublicWalkRequestType RequestType { get => _requestType; set { _requestType = value; OnPropertyChanged(); } } /// /// Startdatum und Uhrzeit /// [Required] public DateTimeOffset StartDate { get => _startDate; set { _startDate = value; OnPropertyChanged(); } } /// /// Enddatum und Urzeit /// [Required] public DateTimeOffset EndDate { get => _endDate; set { _endDate = value; OnPropertyChanged(); } } /// /// Id des Hundes /// [MaxLength(128)] public string DogId { 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 => _dogCount; set { _dogCount = value; OnPropertyChanged(); } } /// /// Exklusiv buchen? /// [Required] public bool Exclusive { get => _exclusive; set { _exclusive = value; OnPropertyChanged(); } } /// /// Preis den der Besitzer bereit ist zu zahlen /// [Required] public decimal Price { get => _price; set { _price = value; OnPropertyChanged(); } } /// /// Zusatzinfo für den Auftrag /// [MaxLength(500)] public string Info { get => _info; set { _info = value; OnPropertyChanged(); } } /// /// Offen als Ausschreibung bis... Ablaufdatum /// public DateTimeOffset ExpirationDate { get => _expirationDate; set { _expirationDate = value; OnPropertyChanged(); } } /// /// Id des Walkers der den Auftrag erhalten hat /// Ist eine AppUserId /// [MaxLength(128)] public string DogWalkerId { get; set; } /// /// Zuordnung zum angenommenen Angebot /// public string PublicWalkResponseId { get; set; } /// /// Anzahl der Antworten /// public int ResponseCount { get; set; } /// /// Aktueller Status der öffentlichern Anfrage /// public PublicWalkRequestStatus Status { get; set; } /// /// Datum wann ein Angebot angenommen wurde /// public DateTimeOffset? PlacedDate { get; set; } /// /// Abstand zum aktuellen Standort in KM /// [NotMapped] public double Distance { get; set; } /// /// Wann wurde die Anfrage erstellt? /// public DateTimeOffset Created { get; set; } } /// /// Öffentliche Anfrage für einen Walk mit Namen aufgelöst /// public class PublicWalkRequestWithNames : SyncEntityVw { /// /// Id des App-Users / Hundebesitzers der die Anfrage erstellt hat /// Ist eine AppUserId /// public string DogOwnerId { get; set; } /// /// Name des Hundebesitzers /// [NotMapped] public string DogOwnerName { get; set; } /// /// Foto des Hundebesitzers /// [NotMapped] public string DogOwnerPhoto { get; set; } /// /// Abholadresse - Adresszeile 1 /// public string PickupAddress_AddressLine1 { get; set; } /// /// Abholadresse - Adresszeile 2 /// public string PickupAddress_AddressLine2 { get; set; } /// /// Abholadresse - Stadt / Ort /// public string PickupAddress_City { get; set; } /// /// Abholadresse - PLZ /// public string PickupAddress_Zip { get; set; } /// /// Abholadresse - Bundesland / Staat /// public string PickupAddress_State { get; set; } /// /// Abholadresse - ISO2 Ländercode /// public string PickupAddress_CountryCode { get; set; } /// /// Breitengrad der Adresse /// public double Lat { get; set; } /// /// Längengrad der Adresse /// public double Lng { get; set; } /// /// Welche Art der Anfrage? /// public PublicWalkRequestType RequestType { get; set; } /// /// Startdatum und Uhrzeit /// public DateTimeOffset StartDate { get; set; } /// /// Enddatum und Urzeit /// public DateTimeOffset EndDate { get; set; } /// /// Id des Hundes /// public string DogId { get; set; } /// /// Name des Hundes /// public string DogName { get; set; } /// /// Foto des Hundes /// public string DogPhoto { get; set; } /// /// Jsonliste mit Id´s der Hunde die ausgewählt wurden /// public string DogsJson { get; set; } /// /// Liste der Hunde /// [NotMapped] public List Dogs { get; set; } /// /// Anzahl der Hunde /// public int DogCount { get; set; } /// /// Exklusiv buchen? /// public bool Exclusive { get; set; } /// /// Preis den der Besitzer bereit ist zu zahlen /// public decimal Price { get; set; } /// /// Zusatzinfo für den Auftrag /// public string Info { get; set; } /// /// Offen als Ausschreibung bis... Ablaufdatum /// public DateTimeOffset ExpirationDate { get; set; } /// /// Id des Walkers der den Auftrag erhalten hat /// Ist eine AppUserId /// public string DogWalkerId { get; set; } /// /// Zuordnung zum angenommenen Angebot /// public string PublicWalkResponseId { get; set; } /// /// Anzahl der Antworten /// public int ResponseCount { get; set; } /// /// Aktueller Status der öffentlichern Anfrage /// public PublicWalkRequestStatus Status { get; set; } /// /// Datum wann ein Angebot angenommen wurde /// public DateTimeOffset? PlacedDate { get; set; } /// /// Abstand zum aktuellen Standort in KM /// [NotMapped] public double Distance { get; set; } /// /// Gibt an ob ein Dogwalker für eine öffentliche Anfrage ein Angebot abgegeben hat /// [NotMapped] public bool HasResponse { get; set; } /// /// Wann wurde die Anfrage erstellt? /// public DateTimeOffset Created { get; set; } /// /// Gibt an wie viele Hunde zusätzlich gebucht wurden /// [NotMapped] public int DogCountPlus => DogCount - 1; /// /// 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 /// /// Hundebesitzer ist blockiert /// [NotMapped] public bool Blocked { get; set; } /// /// Hundebesitzer ist gesperrt /// [NotMapped] public bool Locked { get; set; } /// /// Hundebesitzer blockiert oder gesperrt? /// [NotMapped] public bool BlockedOrLocked => Blocked || Locked; #endregion } /// /// Repräsentiert eine öffentliche Anfrage mit Namen aufgelöst und dem Antwort-Status eines Dogwalkers /// public class PublicWalkRequestWithNamesAndResponseStatus : SyncEntityVw { /// /// Id des App-Users / Hundebesitzers der die Anfrage erstellt hat /// Ist eine AppUserId /// public string DogOwnerId { get; set; } /// /// Name des Hundebesitzers /// [NotMapped] public string DogOwnerName { get; set; } /// /// Foto des Hundebesitzers /// [NotMapped] public string DogOwnerPhoto { get; set; } /// /// Wurde der Hundebesitzer vom Walker blockiert? /// public bool DogOwnerBlocked { get; set; } /// /// Ist der Hundebesitzer gesperrt? /// public bool DogOwnerLocked { get; set; } /// /// Abholadresse - Adresszeile 1 /// public string PickupAddress_AddressLine1 { get; set; } /// /// Abholadresse - Adresszeile 2 /// public string PickupAddress_AddressLine2 { get; set; } /// /// Abholadresse - Stadt / Ort /// public string PickupAddress_City { get; set; } /// /// Abholadresse - PLZ /// public string PickupAddress_Zip { get; set; } /// /// Abholadresse - Bundesland / Staat /// public string PickupAddress_State { get; set; } /// /// Abholadresse - ISO2 Ländercode /// public string PickupAddress_CountryCode { get; set; } /// /// Breitengrad der Adresse /// public double Lat { get; set; } /// /// Längengrad der Adresse /// public double Lng { get; set; } /// /// Welche Art der Anfrage? /// public PublicWalkRequestType RequestType { get; set; } /// /// Startdatum und Uhrzeit /// public DateTimeOffset StartDate { get; set; } /// /// Enddatum und Urzeit /// public DateTimeOffset EndDate { get; set; } /// /// Id des Hundes /// public string DogId { get; set; } /// /// Name des Hundes /// public string DogName { get; set; } /// /// Foto des Hundes /// public string DogPhoto { get; set; } /// /// Jsonliste mit Id´s der Hunde die ausgewählt wurden /// public string DogsJson { get; set; } /// /// Liste der Hunde /// [NotMapped] public List Dogs { get; set; } /// /// Anzahl der Hunde /// public int DogCount { get; set; } /// /// Exklusiv buchen? /// public bool Exclusive { get; set; } /// /// Preis den der Besitzer bereit ist zu zahlen /// public decimal Price { get; set; } /// /// Zusatzinfo für den Auftrag /// public string Info { get; set; } /// /// Offen als Ausschreibung bis... Ablaufdatum /// public DateTimeOffset ExpirationDate { get; set; } /// /// Id des Walkers der den Auftrag erhalten hat /// Ist eine AppUserId /// public string DogWalkerId { get; set; } /// /// Zuordnung zum angenommenen Angebot /// public string PublicWalkResponseId { get; set; } /// /// Anzahl der Antworten /// public int ResponseCount { get; set; } /// /// Aktueller Status der öffentlichern Anfrage /// public PublicWalkRequestStatus Status { get; set; } /// /// Datum wann ein Angebot angenommen wurde /// public DateTimeOffset? PlacedDate { get; set; } /// /// Abstand zum aktuellen Standort in KM /// [NotMapped] public double Distance { get; set; } /// /// Gibt an ob ein Dogwalker für eine öffentliche Anfrage ein Angebot abgegeben hat /// [NotMapped] public bool HasResponse { get; set; } /// /// Wann wurde die Anfrage erstellt? /// public DateTimeOffset Created { get; set; } /// /// Antwort-Status für einen Dogwalker wenn es schon eine Antwort gibt. Null sonst /// public PublicWalkResponseStatus? ResponseStatus { get; set; } /// /// Gibt an wie viele Hunde zusätzlich gebucht wurden /// [NotMapped] public int DogCountPlus => DogCount - 1; /// /// Hundebesitzer blockiert oder gesperrt? /// [NotMapped] public bool DogOwnerBlockedOrLocked => DogOwnerBlocked || DogOwnerLocked; } }