646 lines
17 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;
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;
}
}