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