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