4735 lines
227 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.Linq;
using System.Threading.Tasks;
using Fido2NetLib;
using gehGassi.Domain.Advertisements;
using gehGassi.Domain.Coins;
using gehGassi.Domain.Common;
using gehGassi.Domain.Customers;
using gehGassi.Domain.Devices;
using gehGassi.Domain.Dogs;
using gehGassi.Domain.Favourites;
using gehGassi.Domain.Feedback;
using gehGassi.Domain.Messages;
using gehGassi.Domain.News;
using gehGassi.Domain.Pages;
using gehGassi.Domain.Payment;
using gehGassi.Domain.Ratings;
using gehGassi.Domain.Reporting;
using gehGassi.Domain.Shop;
using gehGassi.Domain.Subscriptions;
using gehGassi.Domain.Users;
using gehGassi.Domain.Vouchers;
using gehGassi.Domain.Walks;
using gehGassi.Dto.Common;
using gehGassi.Dto.DogWalkers;
using NetTopologySuite.Geometries;
namespace gehGassi.Core.Interfaces
{
/// <summary>
/// Schnittstellenbeschreibung für einen Service der die Verwaltung von Benutzern realisiert
/// </summary>
public interface IUserService : IService<ApplicationUser>
{
/// <summary>
/// Prüft ob ein Benutzername noch verfügbar ist.
/// </summary>
/// <param name="userName">Zu prüfender Benutzername</param>
/// <param name="id">Id die ignoriert werden soll</param>
/// <returns>true wenn verfügbar, false sonst</returns>
Task<bool> IsUsernameAvailableAsync(string userName, string id = "");
/// <summary>
/// Gibt einen Benutzer anhand des Benutzernamens zurück
/// </summary>
/// <param name="userName">Benutzername</param>
/// <returns>ApplicationUser oder null, wenn nicht gefunden</returns>
Task<ApplicationUser> GetByUsernameAsync(string userName);
/// <summary>
/// Gibt eine gefilterte Liste von Benutzer zurück
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener Benutzer</returns>
IQueryable<ApplicationUser> Filter(string filter);
/// <summary>
/// Erstellen eines Benutzers
/// </summary>
/// <returns>Benutzer</returns>
ApplicationUser Create();
/// <summary>
/// Gibt eine gefilterte Liste von Benutzern mit Namen zurück
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener Benutzer</returns>
IQueryable<ApplicationUserWithNames> FilterWithNames(string filter);
/// <summary>
/// Gibt eine gefilterte Liste von Benutzern mit Namen zurück
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <param name="customerId">Id des Kunden</param>
/// <returns>List betroffener Benutzer</returns>
IQueryable<ApplicationUserWithNames> FilterWithNamesCustomer(string filter, long customerId);
/// <summary>
/// Zurücksetzen des Kunden auf null
/// </summary>
/// <param name="customerId">Id des Kunden</param>
/// <returns>Task</returns>
Task ResetCustomerAsync(long customerId);
/// <summary>
/// Zurücksetzen des App-Users auf null
/// </summary>
/// <param name="appUserId">Id des App-Users</param>
/// <returns>Task</returns>
Task ResetAppUserAsync(string appUserId);
/// <summary>
/// Gibt einen Benutzer anhand der App-UserId zurück
/// </summary>
/// <param name="appUserId">App-UserId</param>
/// <returns>ApplicationUser oder null, wenn nicht gefunden</returns>
Task<ApplicationUser> GetByAppUserAsync(string appUserId);
}
/// <summary>
/// Schnittstellenbeschreibung für einen Service der die Verwaltung von Fido-Credentials realisiert
/// </summary>
public interface IFidoService : IService<FidoStoredCredential>
{
/// <summary>
/// Gibt eine gefilterte Liste von Fido-Credentials zurück
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener Fido-Credentials</returns>
IQueryable<FidoStoredCredential> Filter(string filter);
/// <summary>
/// Gibt eine gefilterte Liste von Fido-Credentials für einen Benutzer zurück
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <param name="username">Benutzername</param>
/// <returns>List betroffener Fido-Credentials</returns>
IQueryable<FidoStoredCredential> Filter(string filter, string username);
/// <summary>
/// Erstellen eines Fido-Credentials
/// </summary>
/// <returns>Fido-Credential</returns>
FidoStoredCredential Create();
/// <summary>
/// Gibt alle Credentials für einen Benutzer zurück
/// </summary>
/// <param name="username">Benutzername</param>
/// <returns>Liste Credentials</returns>
Task<List<FidoStoredCredential>> GetCredentialsAsync(string username);
/// <summary>
/// Gibt eine Liste aller Benutzer zurück die über eine CredentialId verfügen
/// </summary>
/// <param name="credentialId">CredentialId</param>
/// <returns>Liste Fido2 User</returns>
Task<List<Fido2User>> GetUsersByCredentialIdAsync(byte[] credentialId);
/// <summary>
/// Gibt zurück ob ein Benutzer über Fido credentials verfügt
/// </summary>
/// <param name="username">Benutzername</param>
/// <returns>true wenn ja, false sonst</returns>
Task<bool> HasFidoCredentialsAsync(string username);
/// <summary>
/// Gibt ein Credential zurück
/// </summary>
/// <param name="id">CredentialId</param>
/// <returns>FidoStoredCredential</returns>
Task<FidoStoredCredential> GetByIdAsync(byte[] id);
/// <summary>
/// Gibt eine Liste von Credentials anhand des userHandles zurück
/// </summary>
/// <param name="userHandle">Userhandle</param>
/// <returns>Liste Credentials</returns>
Task<List<FidoStoredCredential>> GetCredentialsByUserHandleAsync(byte[] userHandle);
/// <summary>
/// Aktualisieren des Counters
/// </summary>
/// <param name="credentialId"></param>
/// <param name="counter"></param>
/// <returns>Task</returns>
Task UpdateCounterAsync(byte[] credentialId, uint counter);
}
/// <summary>
/// Schnittstellenbeschreibung für einen Service der EU-UID-Nummern auf deren Gültigkeit prüft
/// </summary>
public interface IVatValidationService
{
/// <summary>
/// Prüft eine UID-Nummer auf deren Gültigkeit
/// </summary>
/// <param name="vat">UID-Nummer</param>
/// <param name="countryIso2">ISO-2 Code des Landes</param>
/// <returns>true wenn erfolgreich, false sonst</returns>
Task<bool> IsValidAsync(string vat, string countryIso2);
}
/// <summary>
/// Schnittstellenbeschreibung für einen Service der die Verwaltung von Audits realisiert
/// </summary>
public interface IAuditService : IService<Audit>
{
/// <summary>
/// Gibt eine gefilterte Liste von audits zurück
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener Kunden</returns>
IQueryable<Audit> Filter(string filter);
/// <summary>
/// Gibt eine Liste von Audits zurück
/// </summary>
/// <param name="key">Key des Objektes</param>
/// <param name="table">Typ des Objektes (Table)</param>
/// <returns>Liste von audits</returns>
Task<List<Audit>> GetListAsync(string key, string table);
/// <summary>
/// Gibt eine Liste von Audits zurück
/// </summary>
/// <param name="key">Key des Objektes</param>
/// <param name="table">Typ des Objektes (Table)</param>
/// <param name="action">
/// Durchgeführte Aktion</param>
/// <returns>Liste von audits</returns>
Task<List<Audit>> GetListAsync(string key, string table, AuditAction action);
/// <summary>
/// Gibt einen Audit-Eintrag zurück
/// </summary>
/// <param name="key">Key des Objektes</param>
/// <param name="table">Typ des Objektes (Table)</param>
/// <param name="action">
/// Durchgeführte Aktion</param>
/// <returns></returns>
Task<Audit> GetAsync(string key, string table, AuditAction action);
/// <summary>
/// Gibt eine gefilterte Liste von audits zurück
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener Kunden</returns>
IQueryable<AuditWithNames> FilterWithNames(string filter);
/// <summary>
/// Gibt eine Liste von Audits zurück
/// </summary>
/// <param name="key">Key des Objektes</param>
/// <param name="table">Typ des Objektes (Table)</param>
/// <returns>Liste von audits</returns>
Task<List<AuditWithNames>> GetListWithNamesAsync(string key, string table);
/// <summary>
/// Gibt eine Liste von Audits zurück
/// </summary>
/// <param name="key">Key des Objektes</param>
/// <param name="table">Typ des Objektes (Table)</param>
/// <param name="action">
/// Durchgeführte Aktion</param>
/// <returns>Liste von audits</returns>
Task<List<AuditWithNames>> GetListWithNamesAsync(string key, string table, AuditAction action);
/// <summary>
/// Gibt einen Audit-Eintrag zurück
/// </summary>
/// <param name="key">Key des Objektes</param>
/// <param name="table">Typ des Objektes (Table)</param>
/// <param name="action">
/// Durchgeführte Aktion</param>
/// <returns></returns>
Task<AuditWithNames> GetWithNamesAsync(string key, string table, AuditAction action);
/// <summary>
/// Löschen von Audit-Einträgen
/// </summary>
/// <param name="key">Key des Objektes</param>
/// <param name="table">Typ des Objektes (Table)</param>
/// <returns>Anzahl gelöschte Daten</returns>
Task<int> DeleteAsync(string key, string table);
/// <summary>
/// Anonymisieren von Audit-Einträgen
/// </summary>
/// <param name="key">Key des Objektes</param>
/// <param name="table">Typ des Objektes (Table)</param>
/// <returns>Anzahl anonymisierte Daten</returns>
Task<int> AnonymizeAsync(string key, string table);
/// <summary>
/// Loggen des Zugriffs eines Users auf einen Datensatz
/// </summary>
/// <param name="key">Key des Objektes</param>
/// <param name="table">Typ des Objektes (Table)</param>
/// <param name="userName">Benutzer der den Zugriff durchgeführt hat</param>
/// <returns>Task</returns>
Task LogAccessAsync(string key, string table, string userName);
}
/// <summary>
/// Schnittstellenbeschreibung für einen Service der die Verwaltung von Kunden-Typen realisiert
/// </summary>
public interface ICustomerTypeService : IService<CustomerType>
{
/// <summary>
/// Gibt eine gefilterte Liste von Kunden-Typen zurück
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener Kunden-Typen</returns>
IQueryable<CustomerType> Filter(string filter);
/// <summary>
/// Erstellen eines Kunden-Typen
/// </summary>
/// <returns>Kunden-Type</returns>
CustomerType Create();
/// <summary>
/// Gibt eine gefilterte Liste von Kunden-Typen zurück. Sucht nur im Namen
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener Kunden-Typen</returns>
Task<List<CustomerType>> SearchAsync(string filter);
/// <summary>
/// Gibt ein Kunden-Typen zurück
/// </summary>
/// <param name="uniqueId">UniqueId des Kunden-Typen</param>
/// <returns>Betroffener Kunden-Typ</returns>
Task<CustomerType> GetByUniqueIdAsync(Guid uniqueId);
}
/// <summary>
/// Schnittstellenbeschreibung für einen Service der die Verwaltung von Kunden realisiert
/// </summary>
public interface ICustomerService : IService<Customer>
{
/// <summary>
/// Gibt eine gefilterte Liste von Kunden zurück
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener Kunden</returns>
IQueryable<Customer> Filter(string filter);
/// <summary>
/// Erstellen eines Kunden
/// </summary>
/// <returns>Kunde</returns>
Customer Create();
/// <summary>
/// Gibt eine gefilterte Liste von Kunden zurück. Sucht nur im Namen
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener Kunden</returns>
Task<List<Customer>> SearchAsync(string filter);
/// <summary>
/// Gibt eine gefilterte Liste von Kunden zurück die ein Mangopay Konto haben. Sucht nur im Namen
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener Kunden</returns>
Task<List<Customer>> SearchWithMangopayAccountAsync(string filter);
/// <summary>
/// Gibt ein Kunden zurück
/// </summary>
/// <param name="uniqueId">UniqueId des Kunden</param>
/// <returns>Betroffener Kunde</returns>
Task<Customer> GetByUniqueIdAsync(Guid uniqueId);
/// <summary>
/// Gibt eine gefilterte Liste von Kunden mit Namen zurück
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <returns>List betroffener Kunden</returns>
IQueryable<CustomerWithNames> FilterWithNames(string filter, string language, string fallback);
/// <summary>
/// Gibt die nächste freie Nummer für einen Kunden zurück
/// </summary>
/// <returns>Kunden-Nummer</returns>
string GetNextNumber();
/// <summary>
/// Zurücksetzen des Kunden-Typs auf null
/// </summary>
/// <param name="typeId">Id des Kunden-Typs</param>
/// <returns>Anzahl zurückgesetzte Kunden</returns>
Task<int> ResetTypeAsync(long typeId);
/// <summary>
/// Zurücksetzen der Branche auf null
/// </summary>
/// <param name="branchId">Id der Branche</param>
/// <returns>Anzahl zurückgesetzte Kunden</returns>
Task<int> ResetBranchAsync(string branchId);
/// <summary>
/// Zurücksetzen der Branchen-Listungen
/// </summary>
/// <param name="branchId">Id der Branche</param>
/// <returns>Anzahl zurückgesetzte Kunden</returns>
Task<int> ResetBranchListingsAsync(string branchId);
}
/// <summary>
/// Schnittstellenbeschreibung für einen Service der die Verwaltung von App-Usern realisiert
/// </summary>
public interface IAppUserService : IService<AppUser>
{
/// <summary>
/// Gibt eine gefilterte Liste von App-Usern zurück
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <param name="includeDeleted">Sollen gelöschte inkludiert werden?</param>
/// <returns>List betroffener App-User</returns>
IQueryable<AppUser> Filter(string filter, bool includeDeleted);
/// <summary>
/// Erstellen eines App-Users
/// </summary>
/// <returns>App-User</returns>
AppUser Create();
/// <summary>
/// Gibt eine gefilterte Liste von App-Usern zurück. Sucht nur im Namen
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <param name="includeDeleted">Sollen gelöschte inkludiert werden?</param>
/// <returns>List betroffener App-User</returns>
Task<List<AppUser>> SearchAsync(string filter, bool includeDeleted);
/// <summary>
/// Gibt die nächste freie Nummer für einen App-User zurück
/// </summary>
/// <returns>App-User-Nummer</returns>
string GetNextNumber();
/// <summary>
/// Gibt die Anzahl von App-UserN im System zurück
/// </summary>
/// <param name="includeDeleted">Sollen gelöschte inkludiert werden?</param>
/// <returns>Anzahl App-User</returns>
Task<int> CountAsync(bool includeDeleted);
/// <summary>
/// Gibt die Anzahl der AppUser im System zurück welche einem Typ entsprechen
/// </summary>
/// <param name="includeDeleted">Sollen gelöschte inkludiert werden?</param>
/// <param name="type">Typ der gesucht wird</param>
/// <param name="lastUpdate">Optional: wenn angegeben, dann muss das Datum des letzten Updates größer oder gleich dem lastUpdate Datum sein</param>
/// <returns>Anzahl AppUser</returns>
Task<int> CountAsync(bool includeDeleted, AppUserType type, DateTimeOffset? lastUpdate);
/// <summary>
/// Entsperren von gesperrten App-Usern deren LockedUntil-Datum erreicht wurde.
/// </summary>
/// <returns>Anzahl entsperrte App-User</returns>
Task<int> AutoUnlockAsync();
/// <summary>
/// Gibt eine Liste von App-Usern zurück, die für die automatische Auszahlung in Frage kommen
/// </summary>
/// <returns>List App-User</returns>
Task<List<AppUser>> GetForAutoPayoutAsync();
/// <summary>
/// Gibt zurück ob ein App-User gesperrt ist
/// </summary>
/// <param name="appUserId">Id des App-Users</param>
/// <returns>true wenn gesperrt, false sonst</returns>
Task<bool> IsLockedAsync(string appUserId);
/// <summary>
/// Gibt eine List von AppUsern zurück
/// </summary>
/// <param name="skip">skip</param>
/// <param name="take">take</param>
/// <param name="type">Typ der gesucht wird</param>
/// <param name="lastUpdate">Optional: wenn angegeben, dann muss das Datum des letzten Updates größer oder gleich dem lastUpdate Datum sein</param>
/// <param name="includeDeleted">Sollen gelöschte inkludiert werden?</param>
/// <returns>Liste AppUser</returns>
Task<List<AppUser>> GetAllAsync(int skip, int take, AppUserType type, DateTimeOffset? lastUpdate, bool includeDeleted);
#region Profil
/// <summary>
/// Erstellt ein DogWalker Profil wenn es noch nicht existiert
/// </summary>
/// <param name="id">Id des App-Users</param>
/// <returns>DogWalker Propfil</returns>
Task<DogWalkerProfile> CreateWalkerProfileIfNotExistsAsync(string id);
/// <summary>
/// Gibt ein Walker-Profil für einen App-User zurück
/// </summary>
/// <param name="id">Id des App-Users</param>
/// <returns>DogWalker Propfil</returns>
Task<DogWalkerProfile> GetWalkerProfileAsync(string id);
/// <summary>
/// Löschen eines Walker-Profils für einen App-User
/// </summary>
/// <param name="id">Id des App-Users</param>
/// <returns>DogWalker Propfil</returns>
Task RemoveWalkerProfileAsync(string id);
#endregion
#region DogWalkers
/// <summary>
/// Gibt eine Liste Dogwalkern zurück - sortiert nach Distanz
/// </summary>
/// <param name="ignoreId">Id des App-Users der ignoriert werden soll, falls ein DogOwner auch Walker ist</param>
/// <param name="lat">Optional: Breitengrad</param>
/// <param name="lng">Optional: Längengrad</param>
/// <param name="take">Wie viele sollen max gewählt werden?</param>
/// <returns>Liste passender Dogwalker</returns>
Task<List<DogWalker>> GetWalkersForAppAsync(string ignoreId, double lat, double lng, int take);
/// <summary>
/// Gibt einen Dogwalker zurück
/// </summary>
/// <param name="dogWalkerId">Id des DogWalkers</param>
/// <returns>DogWalker oder null wenn nicht gefunden</returns>
Task<DogWalker> GetWalkerAsync(string dogWalkerId);
/// <summary>
/// Gibt eine Liste von Dogwalkern zurück
/// </summary>
/// <param name="query">Abfrage-Objekt für Dogwalker - Beinhaltet alle Filter und auch Paging</param>
/// <returns>Liste gefudene Walks</returns>
Task<(int total, List<DogWalker> list)> GetWalkersAsync(DogWalkerQueryDto query);
/// <summary>
/// Gibt eine Liste von Dogwalkern zurück welche über eine Adresse verfügen und deren Standort vom angegebenen Standort nicht weiter als der definierte Radius entfernt sind
/// </summary>
/// <param name="ignoreId">Id des Walkers der ignoriert werden soll, falls der hundebesitzer auch Walker ist</param>
/// <param name="location">Location für die Abholung des Hundes - darf nicht weiter als definierter Radius entfernt sein</param>
/// <returns>Liste gefundene Walker</returns>
Task<List<DogWalker>> GetWalkersForNotificationAsync(string ignoreId, Point location);
#endregion
#region Systemnachrichten
/// <summary>
/// Abfrage des App-Users für eine Systemnachricht
/// </summary>
/// <param name="query">Abfrageparameter</param>
/// <returns>Liste der App-User</returns>
Task<List<AppUser>> GetForSystemMessageAsync(SystemMessageAppUserQuery query);
/// <summary>
/// Gibt zurück wie viele App-User für eine Systemnachricht gefunden werden
/// </summary>
/// <param name="query">Abfrageparameter</param>
/// <returns>Anzahl der App-User</returns>
Task<int> CountForSystemMessageAsync(SystemMessageAppUserQuery query);
#endregion
#region Blocks
/// <summary>
/// Erstellen einer Blockierung eines App-Users
/// </summary>
/// <returns>AppUserBlock</returns>
AppUserBlock CreateBlock();
/// <summary>
/// Hinzufügen eines Blocks eine App-Users
/// </summary>
/// <param name="block">AppUserBlock</param>
void AddBlock(AppUserBlock block);
/// <summary>
/// Blockiert einen App-User für einen anderen, wenn noch kein Block existiert
/// </summary>
/// <param name="blockingAppUserId">Id des App-Users der die Blockierung vornimmt</param>
/// <param name="blockedAppUserId">Id des App-Users der blockiert wird</param>
/// <param name="createdBy">Von wem erstellt?</param>
/// <param name="blockUntil">Optional: Bis wann soll der App-User blockiert werden?</param>
/// <param name="reportId">Optional: Verweis auf eine Meldung</param>
/// <returns>Erstellte oder existierende Blockierung</returns>
Task<AppUserBlock> BlockAppUserAsync(string blockingAppUserId, string blockedAppUserId, string createdBy, DateTimeOffset? blockUntil = null, long? reportId = null);
/// <summary>
/// Aufheben der Blockierung eines App-Users durch einen anderen, wenn vorhanden
/// </summary>
/// <param name="blockingAppUserId">Id des App-Users der die Blockierung vornimmt</param>
/// <param name="blockedAppUserId">Id des App-Users der blockiert wird</param>
/// <returns>true wenn erfolgreich, false sonst</returns>
Task<bool> UnblockAppUserAsync(string blockingAppUserId, string blockedAppUserId);
/// <summary>
/// Löschen einer Blockierung
/// </summary>
/// <param name="block">AppUserBlock</param>
void RemoveBlock(AppUserBlock block);
/// <summary>
/// Löschen einer Blockierung
/// </summary>
/// <param name="id">Id der Blockierung</param>
Task RemoveBlockByIdAsync(long id);
/// <summary>
/// Entfernen von Blocks eines App-Users der blockiert hat
/// </summary>
/// <param name="id">Id des AppUsers der blockiert hat</param>
/// <returns>Task</returns>
Task RemoveBlocksByBlockingUserAsync(string id);
/// <summary>
/// Entfernen von Blocks eines App-Users der blockiert wurde
/// </summary>
/// <param name="id">Id des AppUsers der blockiert wurde</param>
/// <returns>Task</returns>
Task RemoveBlocksByBlockedUserAsync(string id);
/// <summary>
/// Löschen von abgelaufenen Blockierungen, welche ein Ablaufdatum haben
/// </summary>
/// <param name="date">Datum das erreicht werden muss</param>
/// <returns>Anzahl gelösche Blockierungen</returns>
Task<int> RemoveExpiredBlocksAsync(DateTimeOffset date);
/// <summary>
/// Gibt zurück ob ein App-User von einem anderen blockiert wurde
/// </summary>
/// <param name="blockingAppUserId">Id des App-Users der blockiert hat</param>
/// <param name="blockedAppUserId">Id des App-Users der blockiert wurde</param>
/// <returns>true wenn blockiert, false sonst</returns>
Task<bool> IsBlockedAsync(string blockingAppUserId, string blockedAppUserId);
#endregion
/// <summary>
/// Gibt eine Liste von blockierten App-Usern für einen App-User zurück
/// </summary>
/// <param name="query">Abfrageparameter</param>
/// <returns>Liste von gesperrten App-Usern</returns>
Task<(int total, List<AppUserBlockWithNames> list)> GetBlockedAppUsersAsync(BlockedQueryDto query);
/// <summary>
/// Gibt eine Liste von AppUsern zurück welche als geöscht markiert sind
/// </summary>
/// <returns>Liste AppUser</returns>
Task<List<AppUser>> GetDeletedAsync();
/// <summary>
/// Gibt eine Liste von AppUsern zurück deren Location nicht valide ist
/// </summary>
/// <returns>Liste AppUser</returns>
Task<List<AppUser>> GetWithInvalidLocationAsync();
}
/// <summary>
/// Schnittstellenbeschreibung für einen Service der die Verwaltung von Rubriken realisiert
/// </summary>
public interface IAdvertisementCategoryService : IService<AdvertisementCategory>
{
/// <summary>
/// Gibt eine gefilterte Liste von Rubriken zurück
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener Rubriken</returns>
IQueryable<AdvertisementCategory> Filter(string filter);
/// <summary>
/// Erstellen einer Rubrik
/// </summary>
/// <returns>Kunde</returns>
AdvertisementCategory Create();
/// <summary>
/// Gibt eine gefilterte Liste von Rubriken zurück. Sucht nur im Titel
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener Rubriken</returns>
Task<List<AdvertisementCategory>> SearchAsync(string filter);
/// <summary>
/// Gibt eine gefilterte Liste von Rubriken mit Namen zurück in einer gewählten Sprache
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <param name="includeDeleted">Sollen gelöschte inkludiert werden?</param>
/// <returns>Liste betroffener Rubriken</returns>
IQueryable<AdvertisementCategoryWithNames> FilterWithNames(string filter, string language, string fallback, bool includeDeleted);
/// <summary>
/// Gibt eine Liste von Kategorien zurück die Online sind
/// </summary>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <returns>Liste betroffener Rubriken</returns>
Task<List<AdvertisementCategoryWithNames>> GetOnlineWithNamesAsync(string language, string fallback);
}
/// <summary>
/// Schnittstellenbeschreibung für einen Service der die Verwaltung von Versandkosten ermöglicht
/// </summary>
public interface IShipmentCostService : IService<ShipmentCost>
{
/// <summary>
/// Gibt eine gefilterte Liste von Versandkosten zurück
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener Versandkosten</returns>
IQueryable<ShipmentCost> Filter(string filter);
/// <summary>
/// Erstellen von Versandkosten
/// </summary>
/// <returns>Versandkosten</returns>
ShipmentCost Create();
/// <summary>
/// Gibt eine gefilterte Liste von Versandkosten zurück. Sucht nur im Land
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener Versandkosten</returns>
Task<List<ShipmentCost>> SearchAsync(string filter);
/// <summary>
/// Berechnen der Versandkosten
/// </summary>
/// <param name="targetCountry">Zielland</param>
/// <param name="weight">Gewicht</param>
/// <param name="subtotal">Zwischensumme netto</param>
/// <param name="additionalShipmentCosts">Summe der zusätzlichen Versandkosten je Produkt aber in Summe</param>
/// <returns>Versandkosten netto</returns>
Task<decimal> CalculateShipmentAsync(string targetCountry, decimal weight, decimal subtotal, decimal additionalShipmentCosts);
}
/// <summary>
/// Schnittstellenbeschreibung für einen Service der die Verwaltung von Steuern realisiert
/// </summary>
public interface ITaxRateService : IService<TaxRate>
{
/// <summary>
/// Gibt eine gefilterte Liste von Steuern zurück
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener Steuern</returns>
IQueryable<TaxRate> Filter(string filter);
/// <summary>
/// Erstellen einer Steuer
/// </summary>
/// <returns>Steuer</returns>
TaxRate Create();
/// <summary>
/// Gibt eine gefilterte Liste von Steuern zurück. Sucht nur im Titel
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener Hundeausführern</returns>
Task<List<TaxRate>> SearchAsync(string filter);
/// <summary>
/// Gibt eine gefilterte Liste von Steuern mit Namen zurück in einer gewählten Sprache
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache falls keine Übersetzung vorhanden</param>
/// <returns>Liste betroffener Steuern</returns>
IQueryable<TaxRateWithNames> FilterWithNames(string filter, string language, string fallback);
/// <summary>
/// Prüft ob für ein Land schon eine Steuer mit einem Wert existiert
/// </summary>
/// <param name="countryIso">Land ISO2</param>
/// <param name="value">Steuer-Wert</param>
/// <returns>true wenn existiert, false sonst</returns>
Task<bool> ExistsAsync(string countryIso, decimal value);
/// <summary>
/// Zurücksetzen wird für Versandkosten verwendet
/// </summary>
/// <param name="excludeId">Id die ausgenommen werden soll</param>
/// <returns>Task</returns>
Task ResetShipmentAsync(int excludeId);
/// <summary>
/// Gibt den Steuersatz für Versandkosten zurück
/// </summary>
/// <returns>Versandkosten-Steuersatz in Prozent</returns>
Task<decimal> GetForShipmentAsync();
/// <summary>
/// Berechnen eines Brutto-Wertes für einen Preis
/// </summary>
/// <param name="value">Preis netto</param>
/// <param name="taxRateId">Id der Steuerstufe</param>
/// <param name="sourceCountry">QuellLand des Shops</param>
/// <param name="targetCountry">Zielland</param>
/// <returns>Brutto-Wert</returns>
Task<TaxGrossResult> CalculateGrossAsync(decimal value, int taxRateId, string sourceCountry, string targetCountry);
/// <summary>
/// Berechnen eines Brutto-Wertes für Versandkosten
/// </summary>
/// <param name="value">Preis netto</param>
/// <param name="sourceCountry">QuellLand des Shops</param>
/// <param name="targetCountry">Zielland</param>
/// <returns>Brutto-Wert</returns>
Task<TaxGrossResult> CalculateShipmentGrossAsync(decimal value, string sourceCountry, string targetCountry);
}
/// <summary>
/// Schnittstellenbeschreibung für einen Service der die Verwaltung von Produktkategorien realisiert
/// </summary>
public interface IProductCategoryService : IService<ProductCategory>
{
/// <summary>
/// Gibt eine gefilterte Liste von Produktkategorien zurück
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener Produktkategorien</returns>
IQueryable<ProductCategory> Filter(string filter);
/// <summary>
/// Erstellen einer Produktkategorie
/// </summary>
/// <returns>Produktkategorie</returns>
ProductCategory Create();
/// <summary>
/// Gibt eine gefilterte Liste von Produktkategorien mit Namen zurück in einer gewählten Sprache
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <param name="includeDeleted">Sollen gelöschte inkludiert werden?</param>
/// <returns>Liste betroffener Produktkategorien</returns>
IQueryable<ProductCategoryWithNames> FilterWithNames(string filter, string language, string fallback, bool includeDeleted);
/// <summary>
/// Gibt eine gefilterte Liste von Produktkategorien mit Namen zurück in einer gewählten Sprache
/// </summary>
/// <param name="parentId">Id des PArents oder null wenn root</param>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <param name="includeDeleted">Sollen gelöschte inkludiert werden?</param>
/// <returns>Liste betroffener Produktkategorien</returns>
IQueryable<ProductCategoryWithNames> FilterWithNames(int? parentId, string filter, string language, string fallback, bool includeDeleted);
/// <summary>
/// Erstellen eines Kategorie-Baums
/// </summary>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <param name="excludeId">ID die ausgeschlossen werden soll, wenn es um die Auswahl eines Parents geht</param>
/// <param name="includeDeleted">Sollen gelöschte Kategorien inkludiert werden?</param>
/// <returns>Kategorie-Baum</returns>
Task<List<ProductCategoryWithNamesTree>> GetTreeAsync(string language, string fallback, int excludeId = -1, bool includeDeleted = false);
/// <summary>
/// Erstellen eines Kategorie-Baums für Kunden
/// </summary>
/// <param name="orderSource">Quelle - für wen holen?</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <param name="excludeId">ID die ausgeschlossen werden soll, wenn es um die Auswahl eines Parents geht</param>
/// <param name="includeDeleted">Sollen gelöschte Kategorien inkludiert werden?</param>
/// <returns>Kategorie-Baum</returns>
Task<List<ProductCategoryWithNamesTree>> GetTreeAsync(OrderSource orderSource, string language, string fallback, int excludeId = -1, bool includeDeleted = false);
/// <summary>
/// Setzen einer neuen ParentId für Kateorien
/// </summary>
/// <param name="oldId">Alte Id welche ersetzt werden soll</param>
/// <param name="newId">Neue Id die gesetzt werden soll. Kann auch NULL sein, was bedeutet, dass root gesetzt werden soll</param>
/// <returns></returns>
Task<int> ResetParentAsync(int oldId, int? newId);
/// <summary>
/// Gibt zurück ob eine Kategorie Kinder hat
/// </summary>
/// <param name="id">Id der Kategorie</param>
/// <returns>true wenn ja, false sonst</returns>
Task<bool> HasChildrenAsync(int id);
}
/// <summary>
/// Schnittstellenbeschreibung für einen Service der die Verwaltung von Artikeln / Produkten ermöglicht
/// </summary>
public interface IProductService : IService<Product>
{
/// <summary>
/// Erstellen eines Produktes
/// </summary>
/// <returns>Produkt</returns>
Product Create();
/// <summary>
/// Gibt eine gefilterte Liste von Produkten mit Namen zurück in einer gewählten Sprache
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <param name="includeDeleted">Sollen gelöschte inkludiert werden?</param>
/// <returns>Liste betroffener Produkte</returns>
IQueryable<ProductWithNames> FilterWithNames(string filter, string language, string fallback, bool includeDeleted);
/// <summary>
/// Prüft ob für einen Listungstypen und eine Branche schon ein Produkt existiert
/// </summary>
/// <param name="listingType">Listungstyp</param>
/// <param name="branchId">Branche</param>
/// <returns>true wenn existiert, false sonst</returns>
Task<bool> CheckListingExistsAsync(ListingType listingType, string branchId);
/// <summary>
/// Prüft ob für einen Listungstypen und eine Branche schon ein Produkt existiert
/// </summary>
/// <param name="listingType">Listungstyp</param>
/// <param name="branchId">Branche</param>
/// <param name="priceType">Preistyp</param>
/// <returns>true wenn existiert, false sonst</returns>
Task<bool> CheckListingExistsAsync(ListingType listingType, string branchId, PriceType priceType);
/// <summary>
/// Prüft ob für eine Rubrik schon ein Produkt für Werbung existiert
/// </summary>
/// <param name="advertisementCategoryId">Rubrik</param>
/// <returns>true wenn existiert, false sonst</returns>
Task<bool> CheckAdvertisementExistsAsync(string advertisementCategoryId);
/// <summary>
/// Gibt zurück wie viele nicht gelöschte Produkte eine Rubrik verwenden
/// </summary>
/// <param name="advertisementCategoryId">Id der Rubrik</param>
/// <returns>Anzahl der Produkte die eine Rubrik verwenden</returns>
Task<int> CountByAdvertisementCategoryAsync(string advertisementCategoryId);
/// <summary>
/// Setzt für Produkte die Rubrik zurück
/// </summary>
/// <param name="advertisementCategoryId">Id der Rubrik</param>
/// <param name="deletedOnly">true wenn nur gelöschte Produkte zurückgesetzt werden sollen</param>
/// <returns>Anzahl Produkte zurückgesetzt</returns>
Task<int> ResetAdvertisementCategoryAsync(string advertisementCategoryId, bool deletedOnly);
/// <summary>
/// Setzt für Produkte die Produktkategorie zurück
/// </summary>
/// <param name="categoryId">Id der Produktkategorie</param>
/// <param name="deletedOnly">true wenn nur gelöschte Produkte zurückgesetzt werden sollen</param>
/// <returns>Anzahl Produkte zurückgesetzt</returns>
Task<int> ResetProductCategoryAsync(int categoryId, bool deletedOnly);
/// <summary>
/// Gibt zurück wie viele Produkte eine Steuergruppe verwenden
/// </summary>
/// <param name="taxRateId">Id der Steuergruppe</param>
/// <returns>Anzahl der Produkte die eine Steuergruppe verwenden</returns>
Task<int> CountByTaxRateAsync(int taxRateId);
/// <summary>
/// Gibt eine gefilterte Liste von Produkteinstellungen für Länder zurück
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <param name="productId">Id des Produktes</param>
/// <returns>Liste betroffener Produkteinstellungen</returns>
IQueryable<ProductCountry> FilterCountry(string filter, int productId);
/// <summary>
/// Gibt eine Produkteinstellung für ein Land zurück
/// </summary>
/// <param name="id">Id der Einstellung</param>
/// <returns>Produkteinstellung oder null, wenn nicht gefunden</returns>
Task<ProductCountry> GetCountryAsync(int id);
/// <summary>
/// Gibt eine Produkteinstellung für ein Land zurück
/// </summary>
/// <param name="productId">Id des Produktes</param>
/// <param name="countryIso">Land ISO2</param>
/// <returns>Produkteinstellung oder null, wenn nicht gefunden</returns>
Task<ProductCountry> GetCountryAsync(int productId, string countryIso);
/// <summary>
/// Erstellen einer Produkteinstellung für ein Land
/// </summary>
/// <param name="productId">Id des Produktes</param>
/// <param name="countryIso">ISO2 Land</param>
/// <returns>Produkteinstellung</returns>
ProductCountry CreateCountry(int productId, string countryIso);
/// <summary>
/// Hinzufügen einer Produkteinstellung für ein Land
/// </summary>
/// <param name="productCountry">Produkteinstellung</param>
void AddCountry(ProductCountry productCountry);
/// <summary>
/// Löschen einer Produkteinstellung für ein Land
/// </summary>
/// <param name="productCountry">Produkteinstellung</param>
void RemoveCountry(ProductCountry productCountry);
/// <summary>
/// Gibt eine Liste von Produkten vom Typ Listung zurück
/// </summary>
/// <param name="orderSource">Für welchen Typen? Kunde, Hundebesitzer, Hundeausführer</param>
/// <param name="countryIso">Land</param>
/// <param name="allowedBranches">Branchen des Kunden</param>
/// <param name="language">Sprache</param>
/// <param name="fallback">Facllback Sprache</param>
/// <param name="includeDeleted">Sollen gelöschte inkludiert werden?</param>
/// <returns>Liste von Produkten</returns>
Task<List<ProductWithNamesCountry>> GetListingProductsAsync(OrderSource orderSource, string countryIso, string allowedBranches, string language, string fallback, bool includeDeleted);
/// <summary>
/// Gibt eine Liste von Produkten vom Typ Listung zurück
/// </summary>
/// <param name="orderSource">Für welchen Typen? Kunde, Hundebesitzer, Hundeausführer</param>
/// <param name="countryIso">Land</param>
/// <param name="allowedBranches">Branchen des Kunden</param>
/// <param name="categories">Gewählte Produktkategorien</param>
/// <param name="filter">Filtertext für Name</param>
/// <param name="language">Sprache</param>
/// <param name="fallback">Facllback Sprache</param>
/// <param name="includeDeleted">Sollen gelöschte inkludiert werden?</param>
/// <returns>Liste von Produkten</returns>
Task<List<ProductWithNamesCountry>> GetListingProductsAsync(OrderSource orderSource, string countryIso, string allowedBranches, List<int> categories, string filter, string language, string fallback, bool includeDeleted);
/// <summary>
/// Gibt eine Liste von Produkten vom Typ Werbung zurück
/// </summary>
/// <param name="orderSource">Für welchen Typen? Kunde, Hundebesitzer, Hundeausführer</param>
/// <param name="countryIso">Land</param>
/// <param name="language">Sprache</param>
/// <param name="fallback">Facllback Sprache</param>
/// <param name="includeDeleted">Sollen gelöschte inkludiert werden?</param>
/// <returns>Liste von Produkte</returns>
Task<List<ProductWithNamesCountry>> GetAdvertisementProductsAsync(OrderSource orderSource, string countryIso, string language, string fallback, bool includeDeleted);
/// <summary>
/// Gibt eine Liste von Produkten vom Typ Werbung zurück
/// </summary>
/// <param name="orderSource">Für welchen Typen? Kunde, Hundebesitzer, Hundeausführer</param>
/// <param name="countryIso">Land</param>
/// <param name="categories">Gewählte Produktkategorien</param>
/// <param name="filter">Filtertext für Name</param>
/// <param name="language">Sprache</param>
/// <param name="fallback">Facllback Sprache</param>
/// <param name="includeDeleted">Sollen gelöschte inkludiert werden?</param>
/// <returns>Liste von Produkte</returns>
Task<List<ProductWithNamesCountry>> GetAdvertisementProductsAsync(OrderSource orderSource, string countryIso, List<int> categories, string filter, string language, string fallback, bool includeDeleted);
/// <summary>
/// Gibt eine Liste von Produkten vom Typ Banner zurück
/// </summary>
/// <param name="orderSource">Für welchen Typen? Kunde, Hundebesitzer, Hundeausführer</param>
/// <param name="countryIso">Land</param>
/// <param name="language">Sprache</param>
/// <param name="fallback">Facllback Sprache</param>
/// <param name="includeDeleted">Sollen gelöschte inkludiert werden?</param>
/// <returns>Liste von Produkte</returns>
Task<List<ProductWithNamesCountry>> GetBannerProductsAsync(OrderSource orderSource, string countryIso, string language, string fallback, bool includeDeleted);
/// <summary>
/// Gibt eine Liste von Produkten vom Typ Banner zurück
/// </summary>
/// <param name="orderSource">Für welchen Typen? Kunde, Hundebesitzer, Hundeausführer</param>
/// <param name="countryIso">Land</param>
/// <param name="categories">Gewählte Produktkategorien</param>
/// <param name="filter">Filtertext für Name</param>
/// <param name="language">Sprache</param>
/// <param name="fallback">Facllback Sprache</param>
/// <param name="includeDeleted">Sollen gelöschte inkludiert werden?</param>
/// <returns>Liste von Produkte</returns>
Task<List<ProductWithNamesCountry>> GetBannerProductsAsync(OrderSource orderSource, string countryIso, List<int> categories, string filter, string language, string fallback, bool includeDeleted);
/// <summary>
/// Gibt eine Liste von Produkten vom Typ Pin zurück
/// </summary>
/// <param name="orderSource">Für welchen Typen? Kunde, Hundebesitzer, Hundeausführer</param>
/// <param name="countryIso">Land</param>
/// <param name="language">Sprache</param>
/// <param name="fallback">Facllback Sprache</param>
/// <param name="includeDeleted">Sollen gelöschte inkludiert werden?</param>
/// <returns>Liste von Produkte</returns>
Task<List<ProductWithNamesCountry>> GetPinProductsAsync(OrderSource orderSource, string countryIso, string language, string fallback, bool includeDeleted);
/// <summary>
/// Gibt eine Liste von Produkten vom Typ Pin zurück
/// </summary>
/// <param name="orderSource">Für welchen Typen? Kunde, Hundebesitzer, Hundeausführer</param>
/// <param name="countryIso">Land</param>
/// <param name="categories">Gewählte Produktkategorien</param>
/// <param name="filter">Filtertext für Name</param>
/// <param name="language">Sprache</param>
/// <param name="fallback">Facllback Sprache</param>
/// <param name="includeDeleted">Sollen gelöschte inkludiert werden?</param>
/// <returns>Liste von Produkte</returns>
Task<List<ProductWithNamesCountry>> GetPinProductsAsync(OrderSource orderSource, string countryIso, List<int> categories, string filter, string language, string fallback, bool includeDeleted);
/// <summary>
/// Gibt ein Produkt mit Daten für Land und Sprache erweitert zurück.
/// Es wird geprüft ob der kunde auch Zugriff auf das Produkt hat.
/// </summary>
/// <param name="productId">Id des Produktes</param>
/// <param name="orderSource">Für welchen Typen? Kunde, Hundebesitzer, Hundeausführer</param>
/// <param name="countryIso">Land</param>
/// <param name="language">Sprache</param>
/// <param name="fallback">Facllback Sprache</param>
/// <param name="includeDeleted">Sollen gelöschte inkludiert werden?</param>
/// <returns>Produkt</returns>
Task<ProductWithNamesCountry> GetWithNamesCountryAsync(int productId, OrderSource orderSource, string countryIso, string language, string fallback, bool includeDeleted);
}
/// <summary>
/// Schnittstellenbeschreibung für einen Service der die Verwaltung von Warenkörben realisiert
/// </summary>
public interface ICartService : IService<Cart>
{
/// <summary>
/// Gibt eine gefilterte Liste von Warenkörben zurück
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <param name="language">Gewünschte Prache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <returns>List betroffener Warenkörbe</returns>
IQueryable<CartWithNames> Filter(string filter, string language, string fallback);
/// <summary>
/// Erstellen eines Warenkorbes
/// </summary>
/// <param name="billingCountry">Rechnungsland</param>
/// <param name="deliveryCountry">Lieferland</param>
/// <returns>Warenkorb</returns>
Cart Create(string billingCountry, string deliveryCountry);
/// <summary>
/// Erstellen eines Warenkorbes für einen Kunden
/// </summary>
/// <param name="customerId">Id des Kunden</param>
/// <param name="billingCountry">Rechnungsland</param>
/// <param name="deliveryCountry">Lieferland</param>
/// <returns>Warenkorb</returns>
Cart CreateForCustomer(long customerId, string billingCountry, string deliveryCountry);
/// <summary>
/// Erstellen eines Warenkorbes für einen App-User
/// </summary>
/// <param name="appUserId">Id des App-Users</param>
/// <param name="orderSource">Quelle</param>
/// <param name="billingCountry">Rechnungsland</param>
/// <param name="deliveryCountry">Lieferland</param>
/// <returns>Warenkorb</returns>
Cart CreateForAppUser(string appUserId, OrderSource orderSource, string billingCountry, string deliveryCountry);
/// <summary>
/// Gibt einen Warenkorb für einen Kunden zurück oder legt einen an
/// </summary>
/// <param name="customerId">Id des Kunden</param>
/// <param name="billingCountry">Rechnungsland</param>
/// <param name="deliveryCountry">Lieferland</param>
/// <param name="userName">Benutzer der den Warenkorb anlegt</param>
/// <returns>Warenkorb</returns>
Task<Cart> GetOrCreateCustomerAsync(long customerId, string billingCountry, string deliveryCountry, string userName);
/// <summary>
/// Gibt einen Warenkorb für einen App-User zurück oder legt einen an
/// </summary>
/// <param name="appUserId">Id des Hundebesitzers</param>
/// <param name="orderSource">Quelle</param>
/// <param name="billingCountry">Rechnungsland</param>
/// <param name="deliveryCountry">Lieferland</param>
/// <param name="userName">Benutzer der den Warenkorb anlegt</param>
/// <returns>Warenkorb</returns>
Task<Cart> GetOrCreateAppUserAsync(string appUserId, OrderSource orderSource, string billingCountry, string deliveryCountry, string userName);
/// <summary>
/// Gibt einen Warenkorb für einen Kunden zurück
/// </summary>
/// <param name="customerId">Id des Kunden</param>
/// <returns>Warenkorb oder null, wenn nicht gefunden</returns>
Task<Cart> GetByCustomerAsync(long customerId);
/// <summary>
/// Gibt einen Warenkorb für einen App-Users zurück
/// </summary>
/// <param name="appUserId">Id des App-Users</param>
/// <returns>Warenkorb oder null, wenn nicht gefunden</returns>
Task<Cart> GetByAppUserAsync(string appUserId);
/// <summary>
/// Gibt einen Warenkorb für einen Kunden zurück
/// </summary>
/// <param name="customerId">Id des Kunden</param>
/// <param name="language">Gewünschte Prache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <returns>Warenkorb oder null, wenn nicht gefunden</returns>
Task<CartWithNames> GetByCustomerWithNamesAsync(long customerId, string language, string fallback);
/// <summary>
/// Gibt einen Warenkorb für einen App-User zurück
/// </summary>
/// <param name="appUserId">Id des App-Users</param>
/// <param name="language">Gewünschte Prache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <returns>Warenkorb oder null, wenn nicht gefunden</returns>
Task<CartWithNames> GetByAppUserWithNamesAsync(string appUserId, string language, string fallback);
/// <summary>
/// Anlegen eines Artikels für den Warenkorb
/// </summary>
/// <returns>Warenkorb Artikel</returns>
CartItem CreateItem();
/// <summary>
/// Hinzufügen eines Artikels zum Warenkorb
/// </summary>
/// <param name="item">Artikel</param>
void AddItem(CartItem item);
/// <summary>
/// Gibt einen Artikel im Warenkorb zurück
/// </summary>
/// <param name="cartId">Id des Warenkorbs</param>
/// <param name="productId">Id des Artikels</param>
/// <returns>Artikel im Warenkorb oder null, wenn nicht gefunden</returns>
Task<CartItem> GetItemAsync(long cartId, int productId);
/// <summary>
/// Gibt einen Artikel im Warenkorb zurück
/// </summary>
/// <param name="cartItemId">Id des Artikels im Warenkorbs</param>
/// <returns>Artikel im Warenkorb oder null, wenn nicht gefunden</returns>
Task<CartItem> GetItemAsync(long cartItemId);
/// <summary>
/// Gibt eine Liste von Artikel im Warenkorb zurück
/// </summary>
/// <param name="cartId">Id des Warenkorbs</param>
/// <returns>Liste der Artikel im Warenkorb</returns>
Task<List<CartItem>> GetItemsAsync(long cartId);
/// <summary>
/// Gibt eine Liste von Artikel im Warenkorb zurück
/// </summary>
/// <param name="cartId">Id des Warenkorbs</param>
/// <param name="language">Gewünschte Prache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <returns>Liste der Artikel im Warenkorb</returns>
Task<List<CartItemWithNames>> GetItemsWithNamesAsync(long cartId, string language, string fallback);
/// <summary>
/// Aktualisieren oder Anlegen eines Artikels im Warenkorb.
/// Achtung: Es wird keine Berechnung durchgeführt. Dazu den Warenkorb neu berechnen lassen!
/// </summary>
/// <param name="cartId">Id des Warenkorbs</param>
/// <param name="productId">Id des Artikels</param>
/// <param name="quantity">Stückzahl</param>
/// <param name="userName">Benutzer der den Warenkorb anlegt</param>
/// <returns>Warenkorb Artikel oder null, wenn Fehler</returns>
Task<CartItem> UpdateOrCreateItemAsync(long cartId, int productId, int quantity, string userName);
/// <summary>
/// Berechnen eines Warenkorbes
/// </summary>
/// <param name="cartId">Id des Warenkorbes</param>
/// <param name="orderSource">Quelle dser Bestellung - Typ des Benutzers</param>
/// <param name="targetCountry">Zielland für Versandkostenberechnung</param>
/// <param name="userName">Benutzer der die Kalkulation anstösst</param>
/// <returns>Berechneter Warenkorb</returns>
Task<Cart> CalculateAsync(long cartId, OrderSource orderSource, string targetCountry, string userName);
/// <summary>
/// Leeren des Warenkorbs
/// </summary>
/// <param name="cartId">Id des Warenkorbes</param>
/// <param name="removeEntity">Wenn true, werden Entitäten wie Listings, Banner, Werbungen und Pins gelöscht, wenn false werden die Cart- und CartItem Id´s auf null gesetzt</param>
/// <param name="userName">Benutzer der die Aktion anstösst</param>
/// <returns>true wenn erfolgreich, false sonst</returns>
Task<bool> ClearAsync(long cartId, bool removeEntity, string userName);
/// <summary>
/// Löschen eines Artikels aus dem Warenkorb nach ArtikelId
/// </summary>
/// <param name="cartItemId">Id des Artikels</param>
/// <returns>Task</returns>
Task DeleteCartItemAsync(long cartItemId);
/// <summary>
/// Löschen eines Artikels aus dem Warenkorb nach ProduktId
/// </summary>
/// <param name="productId">Id des Produktes</param>
/// <returns>Task</returns>
Task DeleteCartItemByProductAsync(int productId);
/// <summary>
/// Löschen eines Warenkorbs nach Kunden
/// </summary>
/// <param name="customerId">Id des Kunden</param>
/// <returns>Task</returns>
Task DeleteByCustomerAsync(long customerId);
/// <summary>
/// Löschen eines Warenkorbs nach App-User
/// </summary>
/// <param name="appUserId">Id des Hundebesitzers</param>
/// <returns>Task</returns>
Task DeleteByAppUserAsync(string appUserId);
}
/// <summary>
/// Schnittstellenbeschreibung für einen Service der die Verwaltung Shop-Einstellungen realisiert
/// </summary>
public interface IShopSettingsService : IService<ShopSettings>
{
/// <summary>
/// Gibt die aktuellen Shop-Einstellungen zurück
/// </summary>
/// <returns>ShopSettings</returns>
Task<ShopSettings> GetAsync();
}
/// <summary>
/// Schnittstellenbeschreibung für einen Service der die Verwaltung von Branchen realisiert
/// </summary>
public interface IBranchService : IService<Branch>
{
/// <summary>
/// Gibt eine gefilterte Liste von Branchen zurück
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener Branchen</returns>
IQueryable<Branch> Filter(string filter);
/// <summary>
/// Erstellen einer Branche
/// </summary>
/// <returns>Branche</returns>
Branch Create();
/// <summary>
/// Gibt eine gefilterte Liste von Branchen zurück.
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener Branchen</returns>
Task<List<Branch>> SearchAsync(string filter);
/// <summary>
/// Gibt eine gefilterte Liste von Branchen mit Namen zurück in einer gewählten Sprache
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <param name="includeDeleted">Sollen gelöschte inkludiert werden?</param>
/// <returns>Liste betroffener Branchen</returns>
IQueryable<BranchWithNames> FilterWithNames(string filter, string language, string fallback, bool includeDeleted);
/// <summary>
/// Gibt eine gefilterte Liste von Branchen mit Namen zurück in einer gewählten Sprache welche für eine Listung aktiviert sind
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <param name="includeDeleted">Sollen gelöschte inkludiert werden?</param>
/// <returns>Liste betroffener Branchen</returns>
IQueryable<BranchWithNames> FilterWithNamesListings(string filter, string language, string fallback, bool includeDeleted);
/// <summary>
/// Gibt eine Liste von Branchen in einer gewählten Sprache zurück, welche online sind
/// </summary>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <returns>Liste von Branchen</returns>
Task<List<BranchWithNames>> GetOnlineAsync(string language, string fallback);
}
/// <summary>
/// Schnittstellenbeschreibung für einen Service der die Verwaltung von Listings realisiert
/// </summary>
public interface IListingService : IService<Listing>
{
/// <summary>
/// Gibt eine gefilterte Liste von Listings zurück
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener Listings</returns>
IQueryable<Listing> Filter(string filter);
/// <summary>
/// Erstellen einer Listung
/// </summary>
/// <returns>Listung</returns>
Listing Create();
/// <summary>
/// Gibt eine gefilterte Liste von Listings zurück.
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener Listings</returns>
Task<List<Listing>> SearchAsync(string filter);
/// <summary>
/// Gibt eine gefilterte Liste von Listings mit Namen zurück in einer gewählten Sprache
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <param name="includeDeleted">Sollen gelöschte inkludiert werden?</param>
/// <param name="excludeDraft">Sollen Entitäten im Draft-Status (Cart) ausgeblendet werden?</param>
/// <returns>Liste betroffener Listings</returns>
IQueryable<ListingWithNames> FilterWithNames(string filter, string language, string fallback, bool includeDeleted, bool excludeDraft);
/// <summary>
/// Gibt eine gefilterte Liste von Listings mit Namen für Kunden zurück in einer gewählten Sprache
/// </summary>
/// <param name="customerId">Id des Kunden</param>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <param name="includeDeleted">Sollen gelöschte inkludiert werden?</param>
/// <param name="excludeDraft">Sollen Entitäten im Draft-Status (Cart) ausgeblendet werden?</param>
/// <returns>Liste betroffener Listings</returns>
IQueryable<ListingWithNames> FilterWithNamesCustomer(long customerId, string filter, string language, string fallback, bool includeDeleted, bool excludeDraft);
/// <summary>
/// Löschen von Listungen basierend auf einer Branche
/// </summary>
/// <param name="branchId">Id der Branche</param>
/// <param name="forceDelete">Wenn true, dann wirklich löschen, auf gelöscht setzen sonst</param>
/// <returns>Task</returns>
Task DeleteByBranchAsync(string branchId, bool forceDelete);
/// <summary>
/// Prüfen der Verfügbarkeit einer Listung für eine Buchung
/// </summary>
/// <param name="customerId">Id des Kunden</param>
/// <param name="branchId">Id der Branche</param>
/// <param name="listingType">Listungs-Typ</param>
/// <param name="startDate">Startdatum</param>
/// <param name="endDate">Enddatum</param>
/// <param name="countryIso">ISO2 des Landes</param>
/// <param name="ignoreId">Id die ignoriert werden soll</param>
/// <returns>ListingValidationResult</returns>
Task<ListingValidationResult> IsAvailableAsync(long customerId, string branchId, ListingType listingType, DateTimeOffset startDate, DateTimeOffset endDate, string countryIso, string ignoreId);
/// <summary>
/// Gibt die Anzahl von Listungen zurück
/// </summary>
/// <param name="includeDeleted">Sollen gelöschte inkludiert werden?</param>
/// <param name="excludeDraft">Sollen Entitäten im Draft-Status (Cart) ausgeblendet werden?</param>
/// <returns>Anzahl Listungen</returns>
Task<int> CountAsync(bool includeDeleted, bool excludeDraft);
/// <summary>
/// Gibt die Anzahl von Listungen in einem Status zurück
/// </summary>
/// <param name="status">Gesuchter Status</param>
/// <param name="includeDeleted">Sollen gelöschte inkludiert werden?</param>
/// <returns>Anzahl Listungen</returns>
Task<int> CountAsync(ListingStatus status, bool includeDeleted);
/// <summary>
/// Prüft ob sich eine Listung bereits im Warenkorb befindet.
/// Listungen mit bestimmten Parametern dürfen nur einmal vorkommen
/// </summary>
/// <param name="cartId">Id des Warenkorb</param>
/// <param name="customerId">Id des Kunden</param>
/// <param name="branchId">Id der Branche</param>
/// <param name="listingType">Listungs-Typ</param>
/// <param name="startDate">Startdatum</param>
/// <param name="endDate">Enddatum</param>
/// <param name="countryIso">ISO2 des Landes</param>
/// <param name="ignoreId">Id die ignoriert werden soll</param>
/// <returns>True wenn die Listung gefunden wurde, false sonst</returns>
Task<bool> CheckListingInCartAsync(long cartId, long customerId, string branchId, ListingType listingType, DateTimeOffset startDate, DateTimeOffset endDate, string countryIso, string ignoreId);
/// <summary>
/// Gibt eine Listung für einen Artikel im Warenkorb zurück
/// </summary>
/// <param name="cartItemId">Id des Artikels im Warenkorb</param>
/// <returns>Listing oder null, wenn nicht gefunden</returns>
Task<Listing> GetByCartItemAsync(long cartItemId);
/// <summary>
/// Gibt eine Listung für einen Artikel in einer Bestellung zurück
/// </summary>
/// <param name="orderItemId">Id des Artikels in der Bestellung</param>
/// <returns>Listing oder null, wenn nicht gefunden</returns>
Task<Listing> GetByOrderItemAsync(long orderItemId);
/// <summary>
/// Setzen des Status von Listungen nach Bestellung
/// </summary>
/// <param name="orderId">Id der Bestellung</param>
/// <param name="status">Zu setzender Status</param>
/// <param name="reservedDate">Datum das für die Reservierung gesetzt werden soll</param>
/// <returns>Anzahl betroffener Listungen</returns>
Task<int> SetStatusByOrderAsync(long orderId, ListingStatus status, DateTimeOffset? reservedDate);
/// <summary>
/// Setzen des Bezahlstatus von Listingen nach Bestellung
/// </summary>
/// <param name="orderId">Id der Bestellung</param>
/// <param name="status">Zu setzender Status</param>
/// <returns>Anzahl betroffener Listungen</returns>
Task<int> SetPaymentStatusByOrderAsync(long orderId, PaymentStatus status);
/// <summary>
/// Zurücksetzen von Reservierungen wenn eine Zeit erreicht ist
/// </summary>
/// <param name="reservedDate">Obere Grenze der Reservierung</param>
/// <returns>Anzahl betroffener Listungen</returns>
Task<int> ResetReservedAsync(DateTimeOffset reservedDate);
/// <summary>
/// Gibt eine Liste von Listungen zurück für die Anzeige der Partner in der Nähe
/// </summary>
/// <param name="country">Land</param>
/// <param name="state">Bundesland</param>
/// <param name="lat">Optional: Breitengrad</param>
/// <param name="lng">Optional: Längengrad</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <param name="skip">Datensätze auslassen</param>
/// <param name="take">Datensätze nehmen</param>
/// <returns>Liste passender Listungen</returns>
Task<(int total, List<ListingWithNames> list)> GetNearForAppAsync(string country, string state, double lat, double lng, string language, string fallback, int skip, int take);
/// <summary>
/// Gibt eine Liste von Listungen zurück für eine Branche zurück.
/// Die Sortierung erfolgt nach Listungstyp und dann nach Distanz
/// </summary>
/// <param name="branchId">Id der Branche</param>
/// <param name="filter">Optional: Filter für Name und/oder Ort</param>
/// <param name="listingCountry">Optional: Listings-Land</param>
/// <param name="country">Land</param>
/// <param name="state">Bundesland</param>
/// <param name="lat">Optional: Breitengrad</param>
/// <param name="lng">Optional: Längengrad</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <param name="skip">Datensätze auslassen</param>
/// <param name="take">Datensätze nehmen</param>
/// <returns>Liste passender Listungen</returns>
Task<(int total, List<ListingWithNames> list)> GetByBranchForAppAsync(string branchId, string filter, string listingCountry, string country, string state, double lat, double lng, string language, string fallback, int skip, int take);
/// <summary>
/// Gibt eine Listung in einer gewünschten Sprache zurück
/// </summary>
/// <param name="id">Id der Listung</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <returns>Gefundene Werbung, null sonst</returns>
Task<ListingWithNames> GetRunningWithNamesAsync(string id, string language, string fallback);
/// <summary>
/// Starten von gebuchten Listungen wenn diese das Start-Datum erreicht haben
/// </summary>
/// <returns>Anzahl gestartete Listungen</returns>
Task<int> StartBookedAsnyc();
/// <summary>
/// Stoppen von abgelaufenen Listungen wenn diese das Enddatum erreicht haben
/// </summary>
/// <returns>Anzahl gestoppte Listungen</returns>
Task<int> StopRunningAsync();
}
/// <summary>
/// Schnittstellenbeschreibung für einen Service der die Verwaltung von Werbungen realisiert
/// </summary>
public interface IAdvertisementService : IService<Advertisement>
{
/// <summary>
/// Gibt eine gefilterte Liste von Werbungen zurück
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener Werbungen</returns>
IQueryable<Advertisement> Filter(string filter);
/// <summary>
/// Erstellen einer Werbung
/// </summary>
/// <returns>Listung</returns>
Advertisement Create();
/// <summary>
/// Gibt eine gefilterte Liste von Werbungen zurück.
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener Werbungen</returns>
Task<List<Advertisement>> SearchAsync(string filter);
/// <summary>
/// Gibt eine gefilterte Liste von Werbungen mit Namen zurück in einer gewählten Sprache
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <param name="includeDeleted">Sollen gelöschte inkludiert werden?</param>
/// <param name="excludeDraft">Sollen Entitäten im Draft-Status (Cart) ausgeblendet werden?</param>
/// <returns>Liste betroffener Werbungen</returns>
IQueryable<AdvertisementWithNames> FilterWithNames(string filter, string language, string fallback, bool includeDeleted, bool excludeDraft);
/// <summary>
/// Gibt eine gefilterte Liste von Werbungen mit Namen für Kunden zurück in einer gewählten Sprache
/// </summary>
/// <param name="customerId">Id des Kunden</param>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <param name="includeDeleted">Sollen gelöschte inkludiert werden?</param>
/// <param name="excludeDraft">Sollen Entitäten im Draft-Status (Cart) ausgeblendet werden?</param>
/// <returns>Liste betroffener Werbungen</returns>
IQueryable<AdvertisementWithNames> FilterWithNamesCustomer(long customerId, string filter, string language, string fallback, bool includeDeleted, bool excludeDraft);
/// <summary>
/// Löschen von Werbungen basierend auf einer Rubrik
/// </summary>
/// <param name="categoryId">Id der Rubrik</param>
/// <param name="forceDelete">Wenn true, dann wirklich löschen, auf gelöscht setzen sonst</param>
/// <returns>Task</returns>
Task DeleteByCategoryAsync(string categoryId, bool forceDelete);
/// <summary>
/// Gibt die Anzahl von Werbungen zurück
/// </summary>
/// <param name="includeDeleted">Sollen gelöschte inkludiert werden?</param>
/// <param name="excludeDraft">Sollen Entitäten im Draft-Status (Cart) ausgeblendet werden?</param>
/// <returns>Anzahl Werbungen</returns>
Task<int> CountAsync(bool includeDeleted, bool excludeDraft);
/// <summary>
/// Gibt die Anzahl von Werbungen in einem Status zurück
/// </summary>
/// <param name="status">Gesuchter Status</param>
/// <param name="includeDeleted">Sollen gelöschte inkludiert werden?</param>
/// <returns>Anzahl Werbungen</returns>
Task<int> CountAsync(AdvertisementStatus status, bool includeDeleted);
/// <summary>
/// Gibt eine Werbung für einen Artikel im Warenkorb zurück
/// </summary>
/// <param name="cartItemId">Id des Artikels im Warenkorb</param>
/// <returns>Werbung oder null, wenn nicht gefunden</returns>
Task<Advertisement> GetByCartItemAsync(long cartItemId);
/// <summary>
/// Gibt eine Werbung für einen Artikel in einer Bestellung zurück
/// </summary>
/// <param name="orderItemId">Id des Artikels in der Bestellung</param>
/// <returns>Werbung oder null, wenn nicht gefunden</returns>
Task<Advertisement> GetByOrderItemAsync(long orderItemId);
/// <summary>
/// Setzen des Status von Werbungen nach Bestellung
/// </summary>
/// <param name="orderId">Id der Bestellung</param>
/// <param name="status">Zu setzender Status</param>
/// <returns>Anzahl betroffener Werbungen</returns>
Task<int> SetStatusByOrderAsync(long orderId, AdvertisementStatus status);
/// <summary>
/// Setzen des Bezahlstatus von Werbungen nach Bestellung
/// </summary>
/// <param name="orderId">Id der Bestellung</param>
/// <param name="status">Zu setzender Status</param>
/// <returns>Anzahl betroffener Werbungen</returns>
Task<int> SetPaymentStatusByOrderAsync(long orderId, PaymentStatus status);
/// <summary>
/// Gibt eine Liste von Werbungen zurück für die Anzeige der Werbungen die bald enden und in der Nähe sind
/// </summary>
/// <param name="country">Land</param>
/// <param name="state">Bundesland</param>
/// <param name="lat">Optional: Breitengrad</param>
/// <param name="lng">Optional: Längengrad</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <param name="skip">Datensätze auslassen</param>
/// <param name="take">Datensätze nehmen</param>
/// <returns>Liste passender Listungen</returns>
Task<(int total, List<AdvertisementWithNames> list)> GetNearEndForAppAsync(string country, string state, double lat, double lng, string language, string fallback, int skip, int take);
/// <summary>
/// Gibt eine Liste von Werbungen je Kategorie zurück
/// </summary>
/// <param name="categoryId">Id der Kategorie</param>
/// <param name="country">Land</param>
/// <param name="state">Bundesland</param>
/// <param name="lat">Optional: Breitengrad</param>
/// <param name="lng">Optional: Längengrad</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <param name="skip">Datensätze auslassen</param>
/// <param name="take">Datensätze nehmen</param>
/// <returns>Liste passender Listungen</returns>
Task<(int total, List<AdvertisementWithNames> list)> GetByCategoryForAppAsync(string categoryId, string country, string state, double lat, double lng, string language, string fallback, int skip, int take);
/// <summary>
/// Gibt eine Werbung in einer gewünschten Sprache zurück
/// </summary>
/// <param name="id">Id der Werbung</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <returns>Gefundene Werbung, null sonst</returns>
Task<AdvertisementWithNames> GetRunningWithNamesAsync(string id, string language, string fallback);
/// <summary>
/// Starten von gebuchten Werbungen wenn diese das Start-Datum erreicht haben
/// </summary>
/// <returns>Anzahl gestartete Werbungen</returns>
Task<int> StartBookedAsnyc();
/// <summary>
/// Stoppen von abgelaufenen Werbungen wenn diese das Enddatum erreicht haben
/// </summary>
/// <returns>Anzahl gestoppte Werbungen</returns>
Task<int> StopRunningAsync();
}
/// <summary>
/// Schnittstellenbeschreibung für einen Service der die Verwaltung von Bannern realisiert
/// </summary>
public interface IBannerService : IService<Banner>
{
/// <summary>
/// Gibt eine gefilterte Liste von Bannern zurück
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener Banner</returns>
IQueryable<Banner> Filter(string filter);
/// <summary>
/// Erstellen eines Banners
/// </summary>
/// <returns>Banner</returns>
Banner Create();
/// <summary>
/// Gibt eine gefilterte Liste von Bannern zurück.
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener Banner</returns>
Task<List<Banner>> SearchAsync(string filter);
/// <summary>
/// Gibt eine gefilterte Liste von Bannern mit Namen zurück in einer gewählten Sprache
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <param name="includeDeleted">Sollen gelöschte inkludiert werden?</param>
/// <param name="excludeDraft">Sollen Entitäten im Draft-Status (Cart) ausgeblendet werden?</param>
/// <returns>Liste betroffener Banner</returns>
IQueryable<BannerWithNames> FilterWithNames(string filter, string language, string fallback, bool includeDeleted, bool excludeDraft);
/// <summary>
/// Gibt eine gefilterte Liste von Bannern mit Namen für Kunden zurück in einer gewählten Sprache
/// </summary>
/// <param name="customerId">Id des Kunden</param>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <param name="includeDeleted">Sollen gelöschte inkludiert werden?</param>
/// <param name="excludeDraft">Sollen Entitäten im Draft-Status (Cart) ausgeblendet werden?</param>
/// <returns>Liste betroffener Banner</returns>
IQueryable<BannerWithNames> FilterWithNamesCustomer(long customerId, string filter, string language, string fallback, bool includeDeleted, bool excludeDraft);
/// <summary>
/// Gibt die Anzahl von Bannern zurück
/// </summary>
/// <param name="includeDeleted">Sollen gelöschte inkludiert werden?</param>
/// <param name="excludeDraft">Sollen Entitäten im Draft-Status (Cart) ausgeblendet werden?</param>
/// <returns>Anzahl Banner</returns>
Task<int> CountAsync(bool includeDeleted, bool excludeDraft);
/// <summary>
/// Gibt die Anzahl von Bannern in einem Status zurück
/// </summary>
/// <param name="status">Gesuchter Status</param>
/// <param name="includeDeleted">Sollen gelöschte inkludiert werden?</param>
/// <returns>Anzahl Banner</returns>
Task<int> CountAsync(BannerStatus status, bool includeDeleted);
/// <summary>
/// Gibt einen Banner für einen Artikel im Warenkorb zurück
/// </summary>
/// <param name="cartItemId">Id des Artikels im Warenkorb</param>
/// <returns>Banner oder null, wenn nicht gefunden</returns>
Task<Banner> GetByCartItemAsync(long cartItemId);
/// <summary>
/// Gibt einen Banner für einen Artikel in einer Bestellung zurück
/// </summary>
/// <param name="orderItemId">Id des Artikels in der Bestellung</param>
/// <returns>Banner oder null, wenn nicht gefunden</returns>
Task<Banner> GetByOrderItemAsync(long orderItemId);
/// <summary>
/// Setzen des Status von Bannern nach Bestellung
/// </summary>
/// <param name="orderId">Id der Bestellung</param>
/// <param name="status">Zu setzender Status</param>
/// <returns>Anzahl betroffener Banner</returns>
Task<int> SetStatusByOrderAsync(long orderId, BannerStatus status);
/// <summary>
/// Setzen des Bezahlstatus von Bannern nach Bestellung
/// </summary>
/// <param name="orderId">Id der Bestellung</param>
/// <param name="status">Zu setzender Status</param>
/// <returns>Anzahl betroffener Banner</returns>
Task<int> SetPaymentStatusByOrderAsync(long orderId, PaymentStatus status);
/// <summary>
/// Gibt einen Banner für eine Platzierung zurück
/// </summary>
/// <param name="bannerLocation">Platzierung des Banners</param>
/// <param name="currentBannerId">Optional: Id des Banners der gerade angezeigt wird</param>
/// <param name="country">Land</param>
/// <param name="state">Bundesland</param>
/// <param name="lat">Optional: Breitengrad</param>
/// <param name="lng">Optional: Längengrad</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <returns>Zufälliger Banner wenn gefunden, null sonst</returns>
Task<BannerWithNames> GetBannerForLocationAsync(BannerLocation bannerLocation, string currentBannerId, string country, string state, double lat, double lng, string language, string fallback);
/// <summary>
/// Fügt eine Anzahl von Views zu einem Banner hinzu und beendet die Laufzeit wenn die Budgetgrenze erreicht wurde
/// </summary>
/// <param name="id">Id des Banners</param>
/// <param name="viewCount">Anzahl Views</param>
/// <param name="appMode">AppMode</param>
/// <param name="language">Sprache</param>
/// <param name="country">Land</param>
/// <param name="state">Bundesland</param>
/// <returns>Anzahl Views gesamt</returns>
Task<int> AddViewsAsync(string id, int viewCount, AppMode appMode, string language, string country, string state);
/// <summary>
/// Fügt eine Anzahl von Klicks zu einem Banner hinzu und beendet die Laufzeit wenn die Budgetgrenze erreicht wurde
/// </summary>
/// <param name="id">Id des Banners</param>
/// <param name="clickCount">Anzahl Klicks</param>
/// <param name="appMode">AppMode</param>
/// <param name="language">Sprache</param>
/// <param name="country">Land</param>
/// <param name="state">Bundesland</param>
/// <returns>Anzahl Klicks gesamt</returns>
Task<int> AddClicksAsync(string id, int clickCount, AppMode appMode, string language, string country, string state);
/// <summary>
/// Hinzufügen einer Statstik für einen Banner
/// </summary>
/// <param name="id">Id des Banners</param>
/// <param name="appMode">AppMode</param>
/// <param name="type">Klick oder View</param>
/// <param name="value">Anzahl Klicks oder Views</param>
/// <param name="language">Sprache</param>
/// <param name="country">Land</param>
/// <param name="state">Bundesland</param>
/// <returns>Task</returns>
void AddStatistic(string id, AppMode appMode, BannerStatisticType type, int value, string language, string country, string state);
/// <summary>
/// Starten von gebuchten Bannern wenn diese das Start-Datum erreicht haben
/// </summary>
/// <returns>Anzahl gestartete Banner</returns>
Task<int> StartBookedAsnyc();
/// <summary>
/// Stoppen von abgelaufenen Bannern wenn diese das Enddatum erreicht haben
/// </summary>
/// <returns>Anzahl gestoppte Banner</returns>
Task<int> StopRunningAsync();
}
/// <summary>
/// Schnittstellenbeschreibung für einen Service der die Verwaltung von Pins realisiert
/// </summary>
public interface IPinService : IService<Pin>
{
/// <summary>
/// Gibt eine gefilterte Liste von Pins zurück
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener Pins</returns>
IQueryable<Pin> Filter(string filter);
/// <summary>
/// Erstellen eines Pins
/// </summary>
/// <returns>Pin</returns>
Pin Create();
/// <summary>
/// Gibt eine gefilterte Liste von Pins zurück.
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener Pins</returns>
Task<List<Pin>> SearchAsync(string filter);
/// <summary>
/// Gibt eine gefilterte Liste von Pins mit Namen zurück in einer gewählten Sprache
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <param name="includeDeleted">Sollen gelöschte inkludiert werden?</param>
/// <param name="excludeDraft">Sollen Entitäten im Draft-Status (Cart) ausgeblendet werden?</param>
/// <returns>Liste betroffener Pins</returns>
IQueryable<PinWithNames> FilterWithNames(string filter, string language, string fallback, bool includeDeleted, bool excludeDraft);
/// <summary>
/// Gibt eine gefilterte Liste von Pins mit Namen für Kunden zurück in einer gewählten Sprache
/// </summary>
/// <param name="customerId">Id des Kunden</param>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <param name="includeDeleted">Sollen gelöschte inkludiert werden?</param>
/// <param name="excludeDraft">Sollen Entitäten im Draft-Status (Cart) ausgeblendet werden?</param>
/// <returns>Liste betroffener Pins</returns>
IQueryable<PinWithNames> FilterWithNamesCustomer(long customerId, string filter, string language, string fallback, bool includeDeleted, bool excludeDraft);
/// <summary>
/// Zurücksetzen der Zuordnung zu einer Listung
/// </summary>
/// <param name="listingId">Id der Listung</param>
/// <returns>Task</returns>
Task<int> ResetListingAsync(string listingId);
/// <summary>
/// Stornieren eines Pins basierend auf einer Listung
/// </summary>
/// <param name="listingId">Id der Listung</param>
/// <returns>Task</returns>
Task<int> CancelByListingAsync(string listingId);
/// <summary>
/// Gibt die Anzahl von Pins zurück
/// </summary>
/// <param name="includeDeleted">Sollen gelöschte inkludiert werden?</param>
/// <param name="excludeDraft">Sollen Entitäten im Draft-Status (Cart) ausgeblendet werden?</param>
/// <returns>Anzahl Pins</returns>
Task<int> CountAsync(bool includeDeleted, bool excludeDraft);
/// <summary>
/// Gibt die Anzahl von Pins in einem Status zurück
/// </summary>
/// <param name="status">Gesuchter Status</param>
/// <param name="includeDeleted">Sollen gelöschte inkludiert werden?</param>
/// <returns>Anzahl Pins</returns>
Task<int> CountAsync(PinStatus status, bool includeDeleted);
/// <summary>
/// Gibt einen Pin für einen Artikel im Warenkorb zurück
/// </summary>
/// <param name="cartItemId">Id des Artikels im Warenkorb</param>
/// <returns>Pin oder null, wenn nicht gefunden</returns>
Task<Pin> GetByCartItemAsync(long cartItemId);
/// <summary>
/// Gibt einen Pin für einen Artikel in einer Bestellung zurück
/// </summary>
/// <param name="orderItemId">Id des Artikels in der Bestellung</param>
/// <returns>Pin oder null, wenn nicht gefunden</returns>
Task<Pin> GetByOrderItemAsync(long orderItemId);
/// <summary>
/// Setzen des Status von Pins nach Bestellung
/// </summary>
/// <param name="orderId">Id der Bestellung</param>
/// <param name="status">Zu setzender Status</param>
/// <returns>Anzahl betroffener Pins</returns>
Task<int> SetStatusByOrderAsync(long orderId, PinStatus status);
/// <summary>
/// Setzen des Bezahlstatus von Pins nach Bestellung
/// </summary>
/// <param name="orderId">Id der Bestellung</param>
/// <param name="status">Zu setzender Status</param>
/// <returns>Anzahl betroffener Pins</returns>
Task<int> SetPaymentStatusByOrderAsync(long orderId, PaymentStatus status);
/// <summary>
/// Starten von gebuchten Pins wenn diese das Start-Datum erreicht haben
/// </summary>
/// <returns>Anzahl gestartete Pins</returns>
Task<int> StartBookedAsnyc();
/// <summary>
/// Stoppen von abgelaufenen Pins wenn diese das Enddatum erreicht haben
/// </summary>
/// <returns>Anzahl gestoppte Pins</returns>
Task<int> StopRunningAsync();
}
/// <summary>
/// Schnittstellenbeschreibung für einen Service der die Verwaltung von Bestellungen realisiert
/// </summary>
public interface IOrderService : IService<Order>
{
/// <summary>
/// Gibt eine gefilterte Liste von Bestellungen zurück
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <param name="includeDeleted">Gelöschte Daten inkludieren</param>
/// <returns>List betroffener Bestellungen</returns>
IQueryable<Order> Filter(string filter, bool includeDeleted);
/// <summary>
/// Gibt eine gefilterte Liste von Bestellungen für einen Kunden zurück
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <param name="customerId">Id des Kunden</param>
/// <param name="includeDeleted">Gelöschte Daten inkludieren</param>
/// <returns>List betroffener Bestellungen</returns>
IQueryable<Order> FilterByCustomer(string filter, long customerId, bool includeDeleted);
/// <summary>
/// Gibt eine gefilterte Liste von Bestellungen für einen App-User zurück
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <param name="appUserId">Id des Hundebesitzers</param>
/// <param name="includeDeleted">Gelöschte Daten inkludieren</param>
/// <returns>List betroffener Bestellungen</returns>
IQueryable<Order> FilterByAppUser(string filter, string appUserId, bool includeDeleted);
/// <summary>
/// Erstellen einer Bestellung
/// </summary>
/// <returns>Bestellung</returns>
Order Create();
/// <summary>
/// Erstellen einer Bestellung
/// </summary>
/// <param name="cart">Warenkorb</param>
/// <param name="cartItems">Artikel im Warenkorb</param>
/// <param name="paymentType">Zahlungsart</param>
/// <param name="paymentStatus">Status der Zahlung</param>
/// <param name="shipmentType">Art der Zustellung</param>
/// <param name="shipmentStatus">Versandstatus</param>
/// <param name="deliveryAddress">Lieferadresse</param>
/// <param name="billingAddress">Rechnungsadresse</param>
/// <param name="deliveryAddressIsBilling">Lieferadresse ist auch Rechnungsadresse</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <param name="userName">Benutzer der die Bestellung anlegt</param>
/// <returns>Bestellung</returns>
Task<Order> CreateAsync(Cart cart, List<CartItem> cartItems, PaymentType paymentType, PaymentStatus paymentStatus, ShipmentType shipmentType, ShipmentStatus shipmentStatus,
OrderAddress deliveryAddress, OrderAddress billingAddress, bool deliveryAddressIsBilling, string language, string fallback, string userName);
/// <summary>
/// Aktualisieren einer Bestellung
/// </summary>
/// <param name="orderId">Id der Bestellung die aktualisiert werden soll</param>
/// <param name="cart">Warenkorb</param>
/// <param name="cartItems">Artikel im Warenkorb</param>
/// <param name="paymentType">Zahlungsart</param>
/// <param name="paymentStatus">Status der Zahlung</param>
/// <param name="shipmentType">Art der Zustellung</param>
/// <param name="shipmentStatus">Versandstatus</param>
/// <param name="deliveryAddress">Lieferadresse</param>
/// <param name="billingAddress">Rechnungsadresse</param>
/// <param name="deliveryAddressIsBilling">Lieferadresse ist auch Rechnungsadresse</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <param name="userName">Benutzer der die Bestellung anlegt</param>
/// <returns>Bestellung</returns>
Task<Order> UpdateAsync(long orderId, Cart cart, List<CartItem> cartItems, PaymentType paymentType, PaymentStatus paymentStatus, ShipmentType shipmentType, ShipmentStatus shipmentStatus,
OrderAddress deliveryAddress, OrderAddress billingAddress, bool deliveryAddressIsBilling, string language, string fallback, string userName);
/// <summary>
/// Anlegen eines Artikels für eine Bestellung
/// </summary>
/// <returns>Bestellung Artikel</returns>
OrderItem CreateItem();
/// <summary>
/// Gibt einen Artikel in einer Bestellung zurück
/// </summary>
/// <param name="orderId">Id der Bestellung</param>
/// <param name="productId">Id des Artikels</param>
/// <returns>Artikel in der Bestellung oder null, wenn nicht gefunden</returns>
Task<OrderItem> GetItemAsync(long orderId, int productId);
/// <summary>
/// Gibt eine Liste von Artikel in der Bestellung zurück
/// </summary>
/// <param name="orderId">Id der Bestellung</param>
/// <returns>Liste der Artikel in der Bestellung</returns>
Task<List<OrderItem>> GetItemsAsync(long orderId);
/// <summary>
/// Gibt den nächsten freien Bestell-spezifischen Zähler zurück
/// </summary>
/// <returns>Nächste freie Nummer</returns>
Task<long> GetNextCounterAsync();
/// <summary>
/// Gibt die nächste freie Nummer für eine Bestellung als Bestellnummer zurück
/// </summary>
/// <returns>EndKunden-Nummer</returns>
Task<string> GetNextNumberAsync();
/// <summary>
/// Löschen einer Bestellung
/// </summary>
/// <param name="id">Id der Bestellung</param>
/// <param name="softDelete">Softdelete anwenden - Daten werden auf gelöscht gesetzt</param>
/// <returns>Task</returns>
Task DeleteAsync(long id, bool softDelete);
/// <summary>
/// Löschen aller Bestellungen die einem Kunden zugeordnet sind
/// </summary>
/// <param name="customerId">Id des Kunden</param>
/// <param name="softDelete">Softdelete anwenden - Daten werden auf gelöscht gesetzt</param>
/// <returns>Task</returns>
Task DeleteByCustomerAsync(long customerId, bool softDelete);
/// <summary>
/// Löschen aller Bestellungen die einem App-User zugeordnet sind
/// </summary>
/// <param name="appUserId">Id des AppUsers</param>
/// <param name="softDelete">Softdelete anwenden - Daten werden auf gelöscht gesetzt</param>
/// <returns>Task</returns>
Task DeleteByAppUserAsync(string appUserId, bool softDelete);
/// <summary>
/// Gibt die Anzahl aller Bestellungen im System zurück
/// </summary>
/// <param name="includeDeleted">Gelöschte Daten inkludieren</param>
/// <returns>Anzahl Bestellungen</returns>
Task<int> CountOrdersAsync(bool includeDeleted);
/// <summary>
/// Gibt die Anzahl der Bestellungen in einem bestimmten Status zurück
/// </summary>
/// <param name="status">Gesuchter Status</param>
/// <param name="includeDeleted">Gelöschte Daten inkludieren</param>
/// <returns>Anzahl Bestellungen</returns>
Task<int> CountOrdersAsync(OrderStatus status, bool includeDeleted);
/// <summary>
/// Gibt die Anzahl der Bestellungen in einem bestimmten Status für Kunden zurück
/// </summary>
/// <param name="customerId">Id des Kunden</param>
/// <param name="status">Gesuchter Status</param>
/// <param name="includeDeleted">Gelöschte Daten inkludieren</param>
/// <returns>Anzahl Bestellungen</returns>
Task<int> CountOrdersByCustomerAsync(long customerId, OrderStatus status, bool includeDeleted);
/// <summary>
/// Gibt die Anzahl der Bestellungen in einem bestimmten Status für App-User zurück
/// </summary>
/// <param name="appUserId">Id des App-Users</param>
/// <param name="status">Gesuchter Status</param>
/// <param name="includeDeleted">Gelöschte Daten inkludieren</param>
/// <returns>Anzahl Bestellungen</returns>
Task<int> CountOrdersByAppUserAsync(string appUserId, OrderStatus status, bool includeDeleted);
/// <summary>
/// Setzt die ItemId für einen Artikel einer Bestellung auf null, wenn der Artikel gelöscht wird
/// </summary>
/// <param name="productId">Id des Artikels</param>
/// <returns>Task</returns>
Task ResetProductForOrderItemAsync(int productId);
/// <summary>
/// Gibt eine Bestellung anhand der PayPal-ID zurück
/// </summary>
/// <param name="payPalId">PayPal Id der Bestellung</param>
/// <returns>Order oder null, wenn nicht gefunden</returns>
Task<Order> GetByPayPalIdAsync(string payPalId);
/// <summary>
/// Gibt eine Bestellung anhand der Unique-ID zurück
/// </summary>
/// <param name="uniqueId">Unique Id der Bestellung</param>
/// <returns>Order oder null, wenn nicht gefunden</returns>
Task<Order> GetByUniqueIdAsync(Guid uniqueId);
/// <summary>
/// Gibt eine Bestellung anhand Bestellnummer zurück
/// </summary>
/// <param name="orderNumber">Bestellnummer</param>
/// <returns>Order oder null, wenn nicht gefunden</returns>
Task<Order> GetByOrderNumberAsync(string orderNumber);
/// <summary>
/// Setzt den "Versendet" Status für Bestellungen die via Klarna bezahlt wurden und welche keine physischen Produkte beinhalten!
/// </summary>
/// <returns>Task</returns>
Task SetShipmentForKlarnaDigitalOnlyAsync();
/// <summary>
/// Gibt eine Liste aller Klarna-Bestellungen zurück, für welche an Klarna der "versendet" Status gesendet werden soll
/// </summary>
/// <returns>Liste Bestellungen</returns>
Task<List<Order>> GetOrdersKlarnaToShipAsync();
/// <summary>
/// Gibt zurück ob eine Bestellung nur digitale Produkte beinhaltet
/// </summary>
/// <param name="orderId">Id der Bestellung</param>
/// <returns>true wenn nur digital, false sonst</returns>
Task<bool> IsDigitaglOnlyAsync(long orderId);
}
/// <summary>
/// Schnittstellenbeschreibung für einen Service der die Verwaltung von Rechnungen ermöglicht
/// </summary>
public interface IInvoiceService : IService<Invoice>
{
/// <summary>
/// Erstellen einer Rechnung
/// </summary>
/// <returns>Bestellung</returns>
Invoice Create();
/// <summary>
/// Erstellen einer Rechnung
/// </summary>
/// <param name="orderId">Id der Bestellung</param>
/// <returns>Bestellung</returns>
Task<Invoice> CreateAsync(long orderId);
/// <summary>
/// Gibt eine Rechnung basierend auf der Bestellung zurück
/// </summary>
/// <param name="orderId">Id der Bestellung</param>
/// <returns></returns>
Task<Invoice> GetByOrderAsync(long orderId);
/// <summary>
/// Gibt den nächsten freien Rechnungs-spezifischen Zähler zurück
/// </summary>
/// <returns>Nächste freie Nummer</returns>
Task<long> GetNextCounterAsync();
/// <summary>
/// Gibt die nächste freie Nummer für eine Rechnung als Rechnungsnummer zurück
/// </summary>
/// <returns>EndKunden-Nummer</returns>
Task<string> GetNextNumberAsync();
}
/// <summary>
/// Schnittstellenbeschreibung für einen Service der die Verwaltung von Gutschriften ermöglicht
/// </summary>
public interface ICreditNoteService : IService<CreditNote>
{
/// <summary>
/// Erstellen einer Gutschrift
/// </summary>
/// <returns>Gutschrift</returns>
CreditNote Create();
/// <summary>
/// Erstellen einer Gutschrift
/// </summary>
/// <param name="orderId">Id der Bestellung</param>
/// <param name="invoiceNumber">Rechnungsnummer</param>
/// <returns>Gutschrift</returns>
Task<CreditNote> CreateAsync(long orderId, string invoiceNumber);
/// <summary>
/// Gibt eine Gutschrift basierend auf der Bestellung zurück
/// </summary>
/// <param name="orderId">Id der Bestellung</param>
/// <returns>Gutschrift</returns>
Task<CreditNote> GetByOrderAsync(long orderId);
/// <summary>
/// Gibt den nächsten freien Gutschrift-spezifischen Zähler zurück
/// </summary>
/// <returns>Nächste freie Nummer</returns>
Task<long> GetNextCounterAsync();
/// <summary>
/// Gibt die nächste freie Nummer für eine Gutschrift als Gutschriftennummer zurück
/// </summary>
/// <returns>Gutschrift-Nummer</returns>
Task<string> GetNextNumberAsync();
}
/// <summary>
/// Schnittstellenbeschreibung für einen Service der die Verwaltung von Hunderassen realisiert
/// </summary>
public interface IDogRaceService : IService<DogRace>
{
/// <summary>
/// Gibt eine gefilterte Liste von Hunderassen zurück
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener Hunderassen</returns>
IQueryable<DogRace> Filter(string filter);
/// <summary>
/// Erstellen einer Hunderasse
/// </summary>
/// <returns>Hunderasse</returns>
DogRace Create();
/// <summary>
/// Gibt eine gefilterte Liste von Hunderassen zurück.
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener Hunderassen</returns>
Task<List<DogRace>> SearchAsync(string filter);
/// <summary>
/// Gibt eine gefilterte Liste von Hunderassen zurück.
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <returns>List betroffener Hunderassen</returns>
Task<List<DogRaceWithNames>> SearchWithNamesAsync(string filter, string language, string fallback);
/// <summary>
/// Gibt eine gefilterte Liste von Hunderassen mit Namen zurück in einer gewählten Sprache
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <param name="includeDeleted">Sollen gelöschte inkludiert werden?</param>
/// <returns>Liste betroffener Hunderassen</returns>
IQueryable<DogRaceWithNames> FilterWithNames(string filter, string language, string fallback, bool includeDeleted);
/// <summary>
/// Gibt eine Liste von Hunderassen zurück, welche nach dem glieferten Datum geändert wurden.
/// Wird kein Datum angegeben, werden alle zurückgegeben.
/// </summary>
/// <param name="lastUpdate">Letztes Update oder null wenn noch keines</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <returns>Liste von Hunderassen</returns>
Task<List<DogRaceWithNames>> GetForSyncAsync(DateTimeOffset? lastUpdate, string language, string fallback);
/// <summary>
/// Gibt eine Hunderasse mit Namen aufgelöst zurück
/// </summary>
/// <param name="id">Id der Hunderasse</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <returns>Hunderasse oder null, wenn nicht gefunden</returns>
Task<DogRaceWithNames> GetWithNamesAsync(string id, string language, string fallback);
}
/// <summary>
/// Schnittstellenbeschreibung für einen Service der die Verwaltung von Hunden realisiert
/// </summary>
public interface IDogService : IService<Dog>
{
/// <summary>
/// Gibt eine gefilterte Liste von Hunden zurück
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener Hunde</returns>
IQueryable<Dog> Filter(string filter);
/// <summary>
/// Erstellen eines Hunden
/// </summary>
/// <returns>Kunde</returns>
Dog Create();
/// <summary>
/// Gibt eine gefilterte Liste von Hunden zurück. Sucht nur im Namen
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener Hunde</returns>
Task<List<Dog>> SearchAsync(string filter);
/// <summary>
/// Gibt eine gefilterte Liste von Hunden mit Namen zurück
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <returns>List betroffener Hunde</returns>
IQueryable<DogWithNames> FilterWithNames(string filter, string language, string fallback);
/// <summary>
/// Gibt die nächste freie Nummer für einen Hund zurück
/// </summary>
/// <returns>Hunde-Nummer</returns>
Task<string> GetNextNumberAsync();
/// <summary>
/// Zurücksetzen der Rasse auf null
/// </summary>
/// <param name="dogRaceId">Id der Hunderasse</param>
/// <returns>Anzahl zurückgesetzte Hunde</returns>
Task<int> ResetDogRaceAsync(string dogRaceId);
/// <summary>
/// Gibt eine Liste der Hunde eines Benutzers zurück
/// </summary>
/// <param name="appUserId">Id des AppUsers</param>
/// <param name="lastUpdate">Letztes Update</param>
/// <returns>Liste der Hunde</returns>
Task<List<Dog>> GetDogsAsync(string appUserId, DateTimeOffset? lastUpdate);
/// <summary>
/// Gibt einen hunde mit Namen aufgelöst zurück
/// </summary>
/// <param name="dogId">Id des Hundes</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <param name="includeDeleted">Sollen gelöschte auch abgefragt werden - für historische Korrektheit</param>
/// <returns>Hund oder null, wenn nicht gefunden</returns>
Task<DogWithNames> GetWithNamesAsync(string dogId, string language, string fallback, bool includeDeleted);
/// <summary>
/// Gibt alle Hunde mit Namen aufgelöst für einen hundebesitzer zurück
/// </summary>
/// <param name="ownerId">Id des Hundebesitzers</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <returns>Hund oder null, wenn nicht gefunden</returns>
Task<List<DogWithNames>> GetWithNamesOwnerAsync(string ownerId, string language, string fallback);
}
/// <summary>
/// Schnittstellenbeschreibung für einen Service der die Verwaltung von Kategorien für News realisiert
/// </summary>
public interface INewsCategoryService : IService<NewsCategory>
{
/// <summary>
/// Gibt eine gefilterte Liste von Kategorien zurück
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener Kategorien</returns>
IQueryable<NewsCategory> Filter(string filter);
/// <summary>
/// Erstellen einer Kategorie
/// </summary>
/// <returns>Kategorie</returns>
NewsCategory Create();
/// <summary>
/// Gibt eine gefilterte Liste von Kategorien zurück. Sucht nur im Titel
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener Kategorien</returns>
Task<List<NewsCategory>> SearchAsync(string filter);
/// <summary>
/// Gibt eine gefilterte Liste von Kategorien mit Namen zurück in einer gewählten Sprache
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <param name="includeDeleted">Sollen gelöschte inkludiert werden?</param>
/// <returns>Liste betroffener Kategorien</returns>
IQueryable<NewsCategoryWithNames> FilterWithNames(string filter, string language, string fallback, bool includeDeleted);
/// <summary>
/// Gibt eine Liste von Kategorien zurück, welche nach dem glieferten Datum geändert wurden.
/// Wird kein Datum angegeben, werden alle zurückgegeben.
/// Es werden alle Kategorien zurückgegeben - egal ob on- oder offline.
/// </summary>
/// <param name="lastUpdate">Letztes Update oder null wenn noch keines</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <returns>Liste von Kategorien</returns>
Task<List<NewsCategoryWithNames>> GetForSyncAsync(DateTimeOffset? lastUpdate, string language, string fallback);
}
/// <summary>
/// Schnittstellenbeschreibung für einen Service der die Verwaltung von News realisiert
/// </summary>
public interface INewsService : IService<News>
{
/// <summary>
/// Gibt eine gefilterte Liste von News zurück
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener News</returns>
IQueryable<News> Filter(string filter);
/// <summary>
/// Erstellen einer News
/// </summary>
/// <returns>News</returns>
News Create();
/// <summary>
/// Gibt eine gefilterte Liste von News zurück. Sucht nur im Titel
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener News</returns>
Task<List<News>> SearchAsync(string filter);
/// <summary>
/// Gibt eine gefilterte Liste von News mit Namen zurück in einer gewählten Sprache
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <param name="includeDeleted">Sollen gelöschte inkludiert werden?</param>
/// <returns>Liste betroffener News</returns>
IQueryable<NewsWithNames> FilterWithNames(string filter, string language, string fallback, bool includeDeleted);
/// <summary>
/// Gibt eine gefilterte Liste von News mit Namen zurück in einer gewählten Sprache
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <param name="states">Liste nach Bundesländern nach Filter</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <param name="includeDeleted">Sollen gelöschte inkludiert werden?</param>
/// <param name="countries">Liste von Ländern nach Filter</param>
/// <returns>Liste betroffener News</returns>
IQueryable<NewsWithNames> FilterWithNames(string filter, List<string>countries, List<string> states, string language, string fallback, bool includeDeleted);
/// <summary>
/// Gibt eine Liste von News-Meldungen für die App zurück. Es werden nur laufende News berücksichtigt
/// </summary>
/// <param name="visibility">Sichtbar für wen? Wird adaptiert!</param>
/// <param name="categoryId">Gewünschte Kategorie oder leer wenn alle</param>
/// <param name="country">Land</param>
/// <param name="state">Bundesland</param>
/// <param name="lat">Optional: Breitengrad</param>
/// <param name="lng">Optional: Längengrad</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <param name="skip">Datensätze auslassen</param>
/// <param name="take">Datensätze nehmen</param>
/// <returns>Liste passender News</returns>
Task<(int total, List<NewsWithNames> list)> GetForAppAsync(NewsVisibility visibility, string categoryId, string country, string state, double? lat, double? lng, string language, string fallback, int skip, int take);
/// <summary>
/// Gibt eine News mit Sprachen aufgelöst zurück
/// </summary>
/// <param name="newsId">Id der News</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <returns>News mit Namen aufgelöst</returns>
Task<NewsWithNames> GetWithNamesAsync(long newsId, string language, string fallback);
/// <summary>
/// Starten von freigegebenen News wenn diese das Start-Datum erreicht haben
/// </summary>
/// <returns>Anzahl gestartete News</returns>
Task<int> StartApprovedAsnyc();
/// <summary>
/// Stoppen von abgelaufenen News wenn diese das Enddatum erreicht haben
/// </summary>
/// <returns>Anzahl gestoppte News</returns>
Task<int> StopRunningAsync();
}
/// <summary>
/// Schnittstellenbeschreibung für einen Service die Verwaltung von Relationen zwischen AppUsern ermöglicht
/// </summary>
public interface IAppUserRelationService : IService<AppUserRelation>
{
/// <summary>
/// Fügt eine Relation hinzu wenn diese nicht bereits existiert.
/// Dabei werden beide Richtungen geprüft.
/// </summary>
/// <param name="leftId">Id der ersten Entität</param>
/// <param name="rightId">Id der zweiten Entität</param>
/// <param name="userName">Benutzer der die Änderung vorgenommen hat</param>
/// <returns>Neue Relation oder gefundene Relation</returns>
Task<AppUserRelation> AddIfNotExistsAsync(string leftId, string rightId, string userName);
/// <summary>
/// Setzen einer Relation auf gelöscht - einseitig.
/// Für den Initiator wird "gelöscht" gesetzt.
/// Der Initiator wird dabei aber in Left und Right gesucht.
/// </summary>
/// <param name="initiatorId">Id des Initiators</param>
/// <param name="otherId">Id der anderen Entität</param>
/// <param name="userName">Benutzer der die Änderung vorgenommen hat</param>
/// <returns>true wenn auf gelöscht gesetzt, false sonst</returns>
Task<bool> DeleteAsync(string initiatorId, string otherId, string userName);
/// <summary>
/// Gibt eine Liste von Relationszielen zurück, zu welcher der Initiator eine Beziehung hat
/// </summary>
/// <param name="initiatorId">Id des Initiators</param>
/// <param name="includeDeleted">Sollen gelöschte inkludiert werden?</param>
/// <returns>Liste von Relationszielen</returns>
Task<List<AppUserRelationTarget>> GetRelations(string initiatorId, bool includeDeleted = false);
}
/// <summary>
/// Schnittstellenbeschreibung für einen Service der die Verwaltung von Konversationen und Nachrichten realisiert
/// </summary>
public interface IMessageService : IService<Message>
{
/// <summary>
/// Gibt eine Liste der Konversationen eines Benutzers zurück
/// </summary>
/// <param name="senderId">Id des Senders</param>
/// <param name="lastUpdate">Letztes Update</param>
/// <returns>Liste der Konversationen</returns>
Task<List<Conversation>> GetConversationsAsync(string senderId, DateTimeOffset? lastUpdate);
/// <summary>
/// Gibt eine Liste der Konversationen mit Namen aufgelöst eines Benutzers zurück
/// </summary>
/// <param name="senderId">Id des Senders</param>
/// <returns>Liste der Konversationen</returns>
Task<List<ConversationWithNames>> GetConversationsWithNamesAsync(string senderId);
/// <summary>
/// Gibt eine Konversation anhand der Teilnehmer zurück
/// </summary>
/// <param name="senderId">Id des Senders</param>
/// <param name="receiverId">Id des Empfängers</param>
/// <returns>Konversation oder null wenn nicht gefunden</returns>
Task<Conversation> GetConversationAsync(string senderId, string receiverId);
/// <summary>
/// Gibt eine gefilterte Liste von Konversationen mit Namen zurück
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener Konversationen</returns>
IQueryable<ConversationWithNames> FilterConversationsWithNames(string filter);
/// <summary>
/// Hinzufügen einer Konversation
/// </summary>
/// <param name="senderId">Id des Senders</param>
/// <param name="receiverId">Id des Empfängers</param>
/// <param name="userName">Benutzer der die Änderung vornimmt</param>
/// <returns>Konversation</returns>
Task<Conversation> AddConversationAsync(string senderId, string receiverId, string userName);
/// <summary>
/// Hinzufügen einer Konversation
/// </summary>
/// <param name="id">Id des Konversation</param>
/// <param name="senderId">Id des Senders</param>
/// <param name="receiverId">Id des Empfängers</param>
/// <param name="userName">Benutzer der die Änderung vornimmt</param>
/// <returns>Konversation</returns>
Task<Conversation> AddConversationAsync(string id, string senderId, string receiverId, string userName);
/// <summary>
/// Entfernen einer Konversation
/// </summary>
/// <param name="id">Id der Konversation</param>
/// <param name="userName">Benutzer der die Änderung vornimmt</param>
Task<bool> RemoveConversationAsync(string id, string userName);
/// <summary>
/// Entfernen einer Konversation nach AppUser
/// </summary>
/// <param name="appUserId">Id des AppUsers</param>
/// <returns>Anzahl Konversationen</returns>
Task<int> RemoveConversationByAppUserAsync(string appUserId);
/// <summary>
/// Gibt eine Liste noch nicht zugestellter Nachrichten für einen Benutzer zurück.
/// </summary>
/// <param name="senderId">Id des Users - wird als Receiver gesucht</param>
/// <param name="lastUpdate">Letztes Update</param>
/// <returns>Liste nicht erhaltener Nachrichten</returns>
Task<List<Message>> GetMessagesAsync(string senderId, DateTimeOffset? lastUpdate);
/// <summary>
/// Gibt eine Liste noch nicht zugestellter Nachrichten in einer Konversation für einen Benutzer zurück.
/// </summary>
/// <param name="senderId">Id des Users - wird als Receiver gesucht</param>
/// <param name="conversationId">Id der Konversation</param>
/// <param name="lastUpdate">Letztes Update</param>
/// <returns>Liste nicht erhaltener Nachrichten</returns>
Task<List<Message>> GetMessagesAsync(string senderId, string conversationId, DateTimeOffset? lastUpdate);
/// <summary>
/// Berstätigen des Erhaltes von Nachrichten für einen Benutzer. Alle die älter als das UpdateDatum sind werden gelöscht
/// </summary>
/// <param name="senderId">Id des Users - wird als Receiver gesucht</param>
/// <param name="lastUpdate">Letztes Update</param>
/// <param name="userName">Benutzer der die Änderung vornimmt</param>
/// <returns>true wenn erfolgreich, false sonst</returns>
Task<bool> ConfirmMessagesAsync(string senderId, DateTimeOffset lastUpdate, string userName);
/// <summary>
/// Berstätigen des Erhaltes von Nachrichten für eine Konversation für einen Benutzer. Alle die älter als das UpdateDatum sind werden gelöscht
/// </summary>
/// <param name="senderId">Id des Users - wird als Receiver gesucht</param>
/// <param name="conversationId">Id der Konversation</param>
/// <param name="lastUpdate">Letztes Update</param>
/// <param name="userName">Benutzer der die Änderung vornimmt</param>
/// <returns>true wenn erfolgreich, false sonst</returns>
Task<bool> ConfirmMessagesAsync(string senderId, string conversationId, DateTimeOffset lastUpdate, string userName);
/// <summary>
/// Hinzufügen einer Nachricht
/// </summary>
/// <param name="message">Nachricht</param>
/// <param name="userName">Benutzer der die Änderung vornimmt</param>
/// <returns>Angelegte Nachricht</returns>
Task<Message> AddMessageAsync(Message message, string userName);
/// <summary>
/// Neusetzen des UpdatedAt Datums falls sich das foto eines Benutzers geändert hat
/// </summary>
/// <param name="appUserId"></param>
/// <param name="updatedAt"></param>
/// <param name="userName"></param>
/// <returns></returns>
Task<int> SetUpdatedAtAsync(string appUserId, DateTimeOffset updatedAt, string userName);
/// <summary>
/// Gibt die Anzahl der noch nicht gelesenen Nachrichten für einen Benutzer zurück
/// </summary>
/// <param name="receiverId">Id des Empfängers</param>
/// <param name="conversationId">Id der Konversation</param>
/// <returns>Anzahl ungelesene Nachrichten</returns>
Task<int> CountOpenMessagesAsync(string receiverId, string conversationId);
/// <summary>
/// Entfernt Nachrichten die in einem bestimmten Zeitraum nicht gelesen wurden
/// </summary>
/// <param name="olderThanDate">Nachricht muss älter als dieses Datum sein</param>
/// <returns>Anzahl gelöschte Nachrichten</returns>
Task<int> RemoveUnreadMessagesAsync(DateTimeOffset olderThanDate);
/// <summary>
/// Entfernt Nachrichten-Kopien die alter als ein Datum sind
/// </summary>
/// <param name="olderThanDate">Nachricht muss älter als dieses Datum sein</param>
/// <returns>Anzahl gelöschte Nachrichten</returns>
Task<int> RemoveMessageCopiesAsync(DateTimeOffset olderThanDate);
/// <summary>
/// Gibt die Nachrichten-Kopien einer Konversation zurück
/// </summary>
/// <param name="conversationId">Id der Konversation</param>
/// <returns>Liste nicht erhaltener Nachrichten</returns>
Task<List<MessageCopy>> GetMessageCopiesAsync(string conversationId);
}
/// <summary>
/// Schnittstellenbeschreibung für einen Service der die Verwaltung von Inhalts-Seiten ermöglicht
/// </summary>
public interface IPageService : IService<Page>
{
/// <summary>
/// Erstellen einer Seite
/// </summary>
/// <returns></returns>
Page Create();
/// <summary>
/// Gibt eine gefilterte Liste von Seiten zurück in einer gewählten Sprache
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <returns>Liste betroffener Seiten</returns>
IQueryable<PageWithNames> FilterWithNames(string filter, string language, string fallback);
/// <summary>
/// Prüfen ob ein Code noch verfügbar ist
/// </summary>
/// <param name="code">Zu prüfender Code</param>
/// <param name="id">Id die ausgenommen werden soll</param>
/// <returns>true wenn verfügbar, false sonst</returns>
Task<bool> IsCodeAvailableAsync(string code, int id);
/// <summary>
/// Gibt eine Text-Seite in gewünschter Sprache zurück
/// </summary>
/// <param name="code">code der Seite</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <returns>Seite oder null, wenn nicht gefunden</returns>
Task<PageWithNames> GetwithNamesAsync(string code, string language, string fallback);
}
/// <summary>
/// Schnittstellenbeschreibung für einen Service der die Verwaltung von öffentlichen Anfragen ermöglicht
/// </summary>
public interface IPublicWalkRequestService : IService<PublicWalkRequest>
{
/// <summary>
/// Erstellen einer öffentlichen Anfrage
/// </summary>
/// <returns></returns>
PublicWalkRequest Create();
/// <summary>
/// Gibt eine Liste der öffentlichen Anfragen eines Benutzers zurück
/// </summary>
/// <param name="appUserId">Id des AppUsers</param>
/// <param name="lastUpdate">Letztes Update</param>
/// <returns>Liste der öffentlichen Anfragen</returns>
Task<List<PublicWalkRequest>> GetForSyncAppAsync(string appUserId, DateTimeOffset? lastUpdate);
/// <summary>
/// Gibt die anzahl öffentlicher Anfragen eines AppUsers zurück
/// </summary>
/// <param name="appUserId">AppUserId</param>
/// <returns>Anzahl öffentliche Anfragen</returns>
Task<int> CountAsync(string appUserId);
/// <summary>
/// Abfrage der öffentlichen Anfragen eines AppUsers "Latest"
/// </summary>
/// <param name="appUserId">Id des AppUsers</param>
/// <param name="take">Wie viele Datensätze</param>
/// <returns>Liste der öffentlichen Anfragen</returns>
Task<List<PublicWalkRequestWithNames>> GetLatestAsync(string appUserId, int take);
/// <summary>
/// Gibt eine Liste von eigenen öffentlichen Anfragen für die App zurück.
/// </summary>
/// <param name="ignoreId">App-User Id die ignoriert werden soll (dogOwnerId)</param>
/// <param name="dogOwnerId">Optional: Id des AppUsers der die Anfragen erstellt hat</param>
/// <param name="dogWalkerId">Optional: Id des DogWalkers</param>
/// <param name="status">Gesuchert Status. Alle wenn NULL</param>
/// <param name="sortList">Optional: Liste der sortierung</param>
/// <param name="lat">Optional: Breitengrad</param>
/// <param name="lng">Optional: Längengrad</param>
/// <param name="skip">Datensätze auslassen</param>
/// <param name="take">Datensätze nehmen</param>
/// <returns>Liste passender Anfragen</returns>
Task<(int total, List<PublicWalkRequestWithNames> list)> GetAsync(string ignoreId, string dogOwnerId, string dogWalkerId, PublicWalkRequestStatus? status, List<DynamicSortOrder> sortList, double lat, double lng, int skip, int take);
/// <summary>
/// Gibt eine Liste von eigenen öffentlichen Anfragen für die App zurück.
/// </summary>
/// <param name="ignoreId">App-User Id die ignoriert werden soll (dogOwnerId)</param>
/// <param name="dogOwnerId">Optional: Id des AppUsers der die Anfragen erstellt hat</param>
/// <param name="dogWalkerId">Optional: Id des DogWalkers</param>
/// <param name="status">Gesuchert Status. Alle wenn NULL</param>
/// <param name="minPrice">Mindest-Preis</param>
/// <param name="sortList">Optional: Liste der sortierung</param>
/// <param name="lat">Optional: Breitengrad</param>
/// <param name="lng">Optional: Längengrad</param>
/// <param name="skip">Datensätze auslassen</param>
/// <param name="take">Datensätze nehmen</param>
/// <param name="maxRadius">Maximaler Radius</param>
/// <param name="type">Typ der öffentlichen Anfrage, Alle wenn NULL</param>
/// <returns>Liste passender Anfragen</returns>
Task<(int total, List<PublicWalkRequestWithNames> list)> GetAsync(string ignoreId, string dogOwnerId, string dogWalkerId, PublicWalkRequestStatus? status, double maxRadius, PublicWalkRequestType? type, decimal minPrice, List<DynamicSortOrder> sortList, double lat, double lng, int skip, int take);
/// <summary>
/// Gibt eine Liste von eigenen öffentlichen Anfragen für die App zurück. Mit dem Antwort-Status für einen DogWalker
/// </summary>
/// <param name="ignoreId">App-User Id die ignoriert werden soll (dogOwnerId)</param>
/// <param name="dogOwnerId">Optional: Id des AppUsers der die Anfragen erstellt hat</param>
/// <param name="dogWalkerId">Optional: Id des DogWalkers</param>
/// <param name="status">Gesuchert Status. Alle wenn NULL</param>
/// <param name="mustHaveResponse">es muss eine Antwort vorhanden sein</param>
/// <param name="sortList">Optional: Liste der sortierung</param>
/// <param name="lat">Optional: Breitengrad</param>
/// <param name="lng">Optional: Längengrad</param>
/// <param name="includeBlockedAndLocked">Sollten blockierte unnd/oder gesperrte Benutzer in die Liste eingefügt werden?</param>
/// <param name="skip">Datensätze auslassen</param>
/// <param name="take">Datensätze nehmen</param>
/// <param name="targetDogWalkerId">Id des Dogwalkers für welchen die Liste aufbereitet werden soll</param>
/// <param name="responseStatus">Gesuchter Status oder aller wenn null</param>
/// <returns>Liste passender Anfragen</returns>
Task<(int total, List<PublicWalkRequestWithNamesAndResponseStatus> list)> GetWithResponseStatusAsync(string ignoreId, string dogOwnerId, string dogWalkerId, PublicWalkRequestStatus? status, string targetDogWalkerId, PublicWalkResponseStatus? responseStatus, bool mustHaveResponse, List<DynamicSortOrder> sortList, double lat, double lng, bool includeBlockedAndLocked, int skip, int take);
/// <summary>
/// Gibt eine Liste von eigenen öffentlichen Anfragen für die App zurück. Mit dem Antwort-Status für einen DogWalker
/// </summary>
/// <param name="ignoreId">App-User Id die ignoriert werden soll (dogOwnerId)</param>
/// <param name="dogOwnerId">Optional: Id des AppUsers der die Anfragen erstellt hat</param>
/// <param name="dogWalkerId">Optional: Id des DogWalkers</param>
/// <param name="status">Gesuchert Status. Alle wenn null</param>
/// <param name="searchText">Suchtext für Suche in Hundename, OwnerName oder Stadt</param>
/// <param name="sortList">Optional: Liste der sortierung</param>
/// <param name="lat">Optional: Breitengrad</param>
/// <param name="lng">Optional: Längengrad</param>
/// <param name="includeBlockedAndLocked">Sollten blockierte unnd/oder gesperrte Benutzer in die Liste eingefügt werden?</param>
/// <param name="skip">Datensätze auslassen</param>
/// <param name="take">Datensätze nehmen</param>
/// <param name="targetDogWalkerId">Id des Dogwalkers für welchen die Liste aufbereitet werden soll</param>
/// <param name="responseStatus">Gesuchter Status oder alle wenn null</param>
/// <param name="maxRadius">Maximaler Radius</param>
/// <param name="mustHaveResponse">es muss eine Antwort vorhanden sein</param>
/// <param name="type">Typ der öffentlichen Anfrage, oder alle wenn NULL</param>
/// <param name="minPrice">Mindest-Preis</param>
/// <returns>Liste passender Anfragen</returns>
Task<(int total, List<PublicWalkRequestWithNamesAndResponseStatus> list)> GetWithResponseStatusAsync(string ignoreId, string dogOwnerId, string dogWalkerId, PublicWalkRequestStatus? status, string targetDogWalkerId, PublicWalkResponseStatus? responseStatus, double maxRadius, PublicWalkRequestType? type, decimal minPrice, bool mustHaveResponse, string searchText, List<DynamicSortOrder> sortList, double lat, double lng, bool includeBlockedAndLocked, int skip, int take);
/// <summary>
/// Gibt eine öffentliche Ausschreibung mit Namen aufgelöst zurück
/// </summary>
/// <param name="id">ID der Ausschreibung</param>
/// <returns>öffentliche Ausschreibung oder null, wenn nicht gefunden</returns>
Task<PublicWalkRequestWithNames> GetWithNamesAsync(string id);
/// <summary>
/// Setzt öffentliche Anfragen auf abgelaufen, wenn diese nicht angenommen oder storniert wurden
/// </summary>
/// <param name="date">Datum für Prüfung</param>
/// <returns>Anzahl timed out</returns>
Task<int> SetTimedOutAsync(DateTimeOffset date);
/// <summary>
/// Zurücksetzen einer öffentlichen Anfrage
/// </summary>
/// <param name="id">Id der öffentlichen Anfrage</param>
/// <returns>true wenn erfolgreich, false sonst</returns>
Task<bool> ResetAsync(string id);
/// <summary>
/// Gibt eine Liste der offenen Anfragen für einen Hundebesitzer in einem gewählten Status zurück
/// </summary>
/// <param name="dogOwnerId">Id des Hundebesitzers</param>
/// <param name="status">Gesuchter Status</param>
/// <returns></returns>
Task<List<PublicWalkRequest>> GetByStatusAsync(string dogOwnerId, PublicWalkRequestStatus status);
/// <summary>
/// Gibt eine gefilterte Liste von öffentlichen Anfragen zurück
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <param name="includeDeleted">Sollen gelöschte inkludiert werden?</param>
/// <returns>Liste betroffener öffentlicher Anfragen</returns>
IQueryable<PublicWalkRequestWithNames> FilterPublicWalkRequestsWithNames(string filter, bool includeDeleted);
#region Notifications
/// <summary>
/// Erstellt einen Eintrag für die Benachrichtigung einer neuen öffentlichen Anfrage
/// </summary>
/// <param name="publicWalkRequestId">Id der öffentlichen Anfrage</param>
/// <param name="dogOwnerId">Id des Hundebesitzers - AppUserId</param>
/// <param name="pickupAddress">Abholadresse</param>
/// <param name="location">GEO-Koordinaten</param>
/// <returns>PublicWalkRequestNotification</returns>
PublicWalkRequestNotification CreateNotification(string publicWalkRequestId, string dogOwnerId, Address pickupAddress, Point location);
/// <summary>
/// Hinzufügen einer Benachrichtigung
/// </summary>
/// <param name="publicWalkRequestNotification">Benachrichtigungs-Objekt</param>
void AddNotification(PublicWalkRequestNotification publicWalkRequestNotification);
/// <summary>
/// Gibt eine Liste von zu sendenden Benachrichtigungen zurück
/// </summary>
/// <returns>Liste zu sendende Benachrichtigungen</returns>
Task<List<PublicWalkRequestNotification>> GetNotificationsToSendAsync();
/// <summary>
/// Zählt wie viele öffenltiche Anfragen in einem bestimmten Zeitraum durch einen Benutzer erstellt wurden
/// </summary>
/// <param name="startDate">Start-Datum</param>
/// <param name="endDate">End-Datum</param>
/// <param name="dogOwnerId">Id des Hundebesitzers</param>
/// <param name="maxStatus">Max Status der Ausschreibung</param>
/// <returns>Anzahl öffentliche Anfragen</returns>
Task<int> CountByCreationDateAsync(DateTimeOffset startDate, DateTimeOffset endDate, string dogOwnerId, PublicWalkRequestStatus maxStatus);
#endregion
}
/// <summary>
/// Schnittstellenbeschreibung für einen Service der die Verwaltung von Antworten auf öffentlichen Anfragen ermöglicht
/// </summary>
public interface IPublicWalkResponseService : IService<PublicWalkResponse>
{
/// <summary>
/// Erstellen einer Antwort auf eine öffentlichen Anfrage
/// </summary>
/// <returns></returns>
PublicWalkResponse Create(string publicWalkRequestId);
/// <summary>
/// Gibt eine Liste der Antworten auf öffentlichen Anfragen eines Benutzers zurück
/// </summary>
/// <param name="appUserId">Id des AppUsers</param>
/// <param name="lastUpdate">Letztes Update</param>
/// <returns>Liste der Antworten auf öffentlichen Anfragen</returns>
Task<List<PublicWalkResponse>> GetForSyncAppAsync(string appUserId, DateTimeOffset? lastUpdate);
/// <summary>
/// Gibt eine Antwort eines Walkers auf eine öffentliche Anfrage zurück
/// </summary>
/// <param name="appUserId">Id des AppUsers dem die öffentliche Anfrage gehört</param>
/// <param name="publicWalkResponseId">Id der Antwort zur öffentlichen Anfrage</param>
/// <returns>PublicWalkResponse oder null, wenn keine gefunden</returns>
Task<PublicWalkResponseWithNames> GetWithNamesAsync(string appUserId, string publicWalkResponseId);
/// <summary>
/// Gibt eine Antwort eines Walkers auf eine öffentliche Anfrage zurück
/// </summary>
/// <param name="dogWalkerId">Id des Walkers</param>
/// <param name="publicWalkRequestId">Id der öffntlichen Anfrage</param>
/// <returns>PublicWalkResponse oder null, wenn keine gefunden</returns>
Task<PublicWalkResponse> GetForWalkerAsync(string dogWalkerId, string publicWalkRequestId);
/// <summary>
/// Gibt die Anzahl der Antworten auf eine öffentliche Anfrage zurück
/// </summary>
/// <param name="publicWalkRequestId">Id der öffentlichen Anfrage</param>
/// <returns>Anzahl Antworten</returns>
Task<int> CountForPublicWalkRequestAsync(string publicWalkRequestId);
/// <summary>
/// Gibt eine Liste von Antworten zu einer öffentlichen Anfragen für die App zurück.
/// </summary>
/// <param name="appUserId">Id des AppUsers dem die öffentliche Anfrage gehört</param>
/// <param name="publicRequestId">Id der öffentlichen Anfrage</param>
/// <param name="skip">Datensätze auslassen</param>
/// <param name="take">Datensätze nehmen</param>
/// <returns>Liste passender antworten</returns>
Task<(int total, List<PublicWalkResponseWithNames> list)> GetResponsesAsync(string appUserId, string publicRequestId, int skip, int take);
/// <summary>
/// Gibt eine Liste aller Antworten zu einer öffentlichen Anfragen zurück.
/// </summary>
/// <param name="appUserId">Id des AppUsers dem die öffentliche Anfrage gehört</param>
/// <param name="publicRequestId">Id der öffentlichen Anfrage</param>
/// <returns>Liste passender antworten</returns>
Task<List<PublicWalkResponseWithNames>> GetResponsesAsync(string appUserId, string publicRequestId);
/// <summary>
/// Setzen des Closed Status für Angebote die im Warten-Status sind.
/// Wird verwendet wenn ein Angebot angenommen wurde und man nun den anderen Bewerbern mitteilen muss, dass wer anderes genommen wurde
/// </summary>
/// <param name="publicWalkRequestId">Id der öffentlichen Anfrage</param>
/// <returns>Anzahl geännderte Angebote</returns>
Task<int> SetCompletedForWaitingAsync(string publicWalkRequestId);
/// <summary>
/// Setzen des Open Status für Angebote die im Closed-Status oder akzeptiert Status sind.
/// Wird verwendet wenn ein angenommenes Angebot nicht bezahlt wurde und ein Reset der öffentlichen Anfrage durchgeführt wird
/// </summary>
/// <param name="publicWalkRequestId">Id der öffentlichen Anfrage</param>
/// <returns>Anzahl geännderte Angebote</returns>
Task<int> SetOpenForClosedOrAcceptedAsync(string publicWalkRequestId);
/// <summary>
/// Stornieren von Angeobten für offene öffentliche Anfragen wenn ein Benutzer gesperrt wurde
/// </summary>
/// <param name="appUserId">Id des App-Users</param>
/// <returns>Anzahl stornierte Angebote</returns>
Task<int> CancelForLockedAsync(string appUserId);
}
/// <summary>
/// Schnittstellenbeschreibung für einen Service der die Verwaltung von Walks ermöglicht
/// </summary>
public interface IWalkService : IService<Walk>
{
/// <summary>
/// Erstellen eines Walks
/// </summary>
/// <returns>Walk</returns>
Walk Create();
/// <summary>
/// Gibt eine Liste der Walks eines Benutzers zurück. Kann Owner und Walker sein
/// </summary>
/// <param name="appUserId">Id des AppUsers</param>
/// <param name="lastUpdate">Letztes Update</param>
/// <returns>Liste der öffentlichen Anfragen</returns>
Task<List<Walk>> GetForSyncAppAsync(string appUserId, DateTimeOffset? lastUpdate);
/// <summary>
/// Gibt eine gefilterte Liste von Walks zurück
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <param name="includeDeleted">Sollen gelöschte inkludiert werden?</param>
/// <returns>Liste betroffener öffentlicher Anfragen</returns>
IQueryable<WalkWithNames> FilterWithNames(string filter, bool includeDeleted);
/// <summary>
/// Gibt eine Liste von Walks mit Namen aufgelöst zurück
/// </summary>
/// <param name="dogWalkerId">Id des Dogwalkers oder leer wenn nicht für DogWalker</param>
/// <param name="dogOwnerId">Id des DogOwners oder leer wenn nicht für DogOwner</param>
/// <param name="date">Datum ab dem gesucht werden soll oder NULL wenn alle</param>
/// <param name="status">Status des Walks, NULL wenn alle</param>
/// <param name="serviceType">Service Type, NULL wenn alle</param>
/// <param name="paymentStatus">Zahlungsstatus, NULL wenn alle</param>
/// <param name="dogFilter">Optinal: nach HundeID filtern</param>
/// <param name="walkerFilter">Optional: nach Walkername filtern</param>
/// <param name="ownerFilter">Optional: nach Ownername filtern</param>
/// <param name="ignoreCancelled">Stornierte Ignorieren</param>
/// <param name="forNextWalk">Sollen nur Walks für den nächsten Walk selektiert werden? Dann nur Angenommene oder Laufende</param>
/// <param name="ignoreRequested">Sollen Walks die noch eine Anfrage sind, ohne Akzeptiert oder Agelehnt ignorniert werden?</param>
/// <param name="ignoreDeclined">Sollen abgelehnte Walks ignoriert werden?</param>
/// <param name="sortList">Optional: Liste der sortierung</param>
/// <param name="lat">Optional: Breitengrad</param>
/// <param name="lng">Optional: Längengrad</param>
/// <param name="skip">Datensätze auslassen</param>
/// <param name="take">Datensätze nehmen</param>
/// <returns>Liste gefudene Walks</returns>
Task<(int total, List<WalkWithNames> list)> GetWithNamesAsync(string dogWalkerId, string dogOwnerId, DateTimeOffset? date, WalkStatus? status, WalkServiceType? serviceType, PaymentStatus? paymentStatus, string dogFilter, string walkerFilter, string ownerFilter, bool ignoreCancelled, bool forNextWalk, bool ignoreRequested, bool ignoreDeclined, List<DynamicSortOrder> sortList, double lat, double lng, int skip, int take);
/// <summary>
/// Gibt eine Liste von Walks mit Namen aufgelöst zurück für Walker
/// Sonderfall hier ist, dass keine Walks mit einem PaymentStatus unter Authorized zurückgibt
/// </summary>
/// <param name="dogWalkerId">Id des Dogwalkers oder leer wenn nicht für DogWalker</param>
/// <param name="dogOwnerId">Id des DogOwners oder leer wenn nicht für DogOwner</param>
/// <param name="date">Datum ab dem gesucht werden soll oder NULL wenn alle</param>
/// <param name="status">Status des Walks, NULL wenn alle</param>
/// <param name="serviceType">Service Type, NULL wenn alle</param>
/// <param name="paymentStatus">Zahlungsstatus, NULL wenn alle</param>
/// <param name="dogFilter">Optinal: nach HundeID filtern</param>
/// <param name="walkerFilter">Optional: nach Walkername filtern</param>
/// <param name="ownerFilter">Optional: nach Ownername filtern</param>
/// <param name="ignoreCancelled">Stornierte Ignorieren</param>
/// <param name="forNextWalk">Sollen nur Walks für den nächsten Walk selektiert werden? Dann nur Angenommene oder Laufende</param>
/// <param name="ignoreRequested">Sollen Walks die noch eine Anfrage sind, ohne Akzeptiert oder Agelehnt ignorniert werden?</param>
/// <param name="ignoreDeclined">Sollen abgelehnte Walks ignoriert werden?</param>
/// <param name="sortList">Optional: Liste der sortierung</param>
/// <param name="lat">Optional: Breitengrad</param>
/// <param name="lng">Optional: Längengrad</param>
/// <param name="skip">Datensätze auslassen</param>
/// <param name="take">Datensätze nehmen</param>
/// <returns>Liste gefudene Walks</returns>
Task<(int total, List<WalkWithNames> list)> GetWithNamesForWalkerAsync(string dogWalkerId, string dogOwnerId, DateTimeOffset? date, WalkStatus? status, WalkServiceType? serviceType, PaymentStatus? paymentStatus, string dogFilter, string walkerFilter, string ownerFilter, bool ignoreCancelled, bool forNextWalk, bool ignoreRequested, bool ignoreDeclined, List<DynamicSortOrder> sortList, double lat, double lng, int skip, int take);
/// <summary>
/// Gibt eine Liste von Walks mit Namen aufgelöst zurück für Hundebesitzer die anstehen, laufen, nicht abgeschlossen sind, nicht gestartet wurden oder zu bezahlen sind
/// </summary>
/// <param name="dogOwnerId">Id des Hundebesitzers</param>
/// <param name="date">Datum ab dem gesucht werden soll oder NULL wenn alle</param>
/// <param name="skip">Datensätze auslassen</param>
/// <param name="take">Datensätze nehmen</param>
/// <returns>Liste gefudene Walks</returns>
Task<(int total, List<WalkWithNames> list)> GetNextWithNamesForOwnerAsync(string dogOwnerId, DateTimeOffset date, int skip, int take);
/// <summary>
/// Gibt eine Liste von Walks mit Namen aufgelöst zurück für Walker die anstehen, laufen, nicht abgeschlossen sind oder nicht gestartet wurden
/// </summary>
/// <param name="dogWalkerId">Id des Walkers</param>
/// <param name="date">Datum ab dem gesucht werden soll oder NULL wenn alle</param>
/// <param name="skip">Datensätze auslassen</param>
/// <param name="take">Datensätze nehmen</param>
/// <returns>Liste gefudene Walks</returns>
Task<(int total, List<WalkWithNames> list)> GetNextWithNamesForWalkerAsync(string dogWalkerId, DateTimeOffset date, int skip, int take);
/// <summary>
/// Gibt einen Walk mit Namen aufgelöst zurück
/// </summary>
/// <param name="walkId">Id des Walks</param>
/// <returns>Walk oder null, wenn nicht gefunden</returns>
Task<WalkWithNames> GetWalkWithNamesAsync(string walkId);
/// <summary>
/// Zurückgeben einer Liste von Walks die einen bestimmten Status haben
/// </summary>
/// <param name="status">Gesuchter Status</param>
/// <returns>Liste von Walks</returns>
Task<List<Walk>> GetByStatusAsync(WalkStatus status);
/// <summary>
/// Gibt einen Walk zurück der mit einer öffentlichen Anfrage verknüpft ist
/// </summary>
/// <param name="publicWalkRequestId">Id der öffentlichen Anfrage</param>
/// <returns>Walk oder null, wenn nicht gefunden</returns>
Task<Walk> GetWalkByPublicRequestAsync(string publicWalkRequestId);
/// <summary>
/// Prüft ob ein Walk für einen Zeitraum gebucht werden kann.
/// Sittings werden dabei ignoriert!
/// </summary>
/// <param name="dogWalkerId">Id des dogwalkers</param>
/// <param name="start">Startdatum</param>
/// <param name="end">Enddatum</param>
/// <returns>true wenn verfügbar, false sonst</returns>
Task<bool> IsWalkPossibleAsync(string dogWalkerId, DateTimeOffset start, DateTimeOffset end);
/// <summary>
/// Setzt Walks die im Status "Request" sind auf Cancel.
/// Wird verwendet wenn eine FIXE buchung gemacht wird und andere noch auf eine Antwort warten.
/// </summary>
/// <param name="dogWalkerId">Id des dogwalkers</param>
/// <param name="start">Startdatum</param>
/// <param name="end">Enddatum</param>
/// <returns>Anzahl betroffene Walks</returns>
Task<int> CancelWalkRequestsAsync(string dogWalkerId, DateTimeOffset start, DateTimeOffset end);
/// <summary>
/// Walks stornieren welche im Status Request sind und das Startdatum erreicht wurde
/// </summary>
/// <param name="date">Datum für Prüfung</param>
/// <returns>Anzahl timed out</returns>
Task<int> CancelTimedOutAsync(DateTimeOffset date);
/// <summary>
/// Stornieren von Walks die im Zahlungsstatus Pending sind und länger als X Minuten alt sind
/// </summary>
/// <param name="date">Datum für Prüfung</param>
/// <param name="minutes">Ablaufzeit in Minuten</param>
/// <returns>Anzahl storniert</returns>
Task<int> CancelPendingAsync(DateTimeOffset date, int minutes);
/// <summary>
/// Abschliessen eines Walks, falls das vergessen wurde
/// </summary>
/// <param name="date">Datum für Prüfung</param>
/// <param name="minutes">Ablaufzeit in Minuten</param>
/// <returns>Anzahl abgeschlossen</returns>
Task<int> CompleteAutoAsync(DateTimeOffset date, int minutes);
/// <summary>
/// Bestätigen von Walks die im Status Abgeschlossen sind und länger als X Minuten alt sind.
/// Löst die Überweisung von den Kosten für den Walk vom hundebesitzer an den Dogwalker aus.
/// </summary>
/// <param name="date">Datum für Prüfung</param>
/// <param name="minutes">Ablaufzeit in Minuten</param>
/// <returns>Anzahl bestätigt</returns>
Task<int> ConfirmCompletedAsync(DateTimeOffset date, int minutes);
/// <summary>
/// Bestätigen von Walks die im Status Abgeschlossen sind und länger als X Minuten alt sind.
/// Löst die Überweisung von den Kosten für den Walk vom hundebesitzer an den Dogwalker aus.
/// </summary>
/// <param name="date">Datum für Prüfung</param>
/// <param name="minutes">Ablaufzeit in Minuten</param>
/// <returns>Anzahl bestätigt</returns>
Task<int> ConfirmCompletedReminderAsync(DateTimeOffset date, int minutes);
/// <summary>
/// Storniert Liste von Walks, welche für 2 App-User in Beziehung stehen wenn eine Blockierung stattgefunden hat.
/// Wird bidirektional gesucht, da nicht immer sichergestellt ist, dass einer Walker und einer Owner ist.
/// Es werden nur Walks im Status Requested oder Accepted berücksichtigt
/// </summary>
/// <param name="blockingAppUserId">Id des App-Users der blockiert hat</param>
/// <param name="blockedAppUserId">Id des App-Users der blockiert wurde</param>
/// <returns>Anzahl stornierte Walks</returns>
Task<int> CancelWalksForBlockAsync(string blockingAppUserId, string blockedAppUserId);
/// <summary>
/// Stornieren aller Walks eines Benutzers der gesperrt wurde.
/// Wird bidirektional gesucht, da nicht immer sichergestellt ist, dass einer Walker und einer Owner ist.
/// Es werden nur Walks im Status Requested oder Accepted berücksichtigt
/// </summary>
/// <param name="appUserId">Id des App-Users</param>
/// <returns>Anzahl stornierte Walks</returns>
Task<int> CancelWalksForLockedAsync(string appUserId);
/// <summary>
/// Fügt die Verwendung eines Gutscheins zu einem Walk hinzu
/// </summary>
/// <param name="walkId">Id des Walks</param>
/// <param name="voucherId">Id des Gutscheins</param>
/// <param name="ammount">Verwendeter Gutscheinwert</param>
/// <returns>true wenn erfolgreich, false sonst</returns>
Task<bool> AddVoucherToWalk(string walkId, string voucherId, decimal ammount);
/// <summary>
/// Entfernt die Verwendung eines Gutscheins zu einem Walk
/// </summary>
/// <param name="walkId">Id des Walks</param>
/// <param name="voucherId">Id des Gutscheins</param>
/// <returns>true wenn erfolgreich, false sonst</returns>
Task<bool> RemoveVoucherFromWalk(string walkId, string voucherId);
/// <summary>
/// Gibt die Anzahl von Walks für einen Dogwalker mit dem Status Bestätigt in einem bestimmten Zeitraum zurück
/// </summary>
/// <param name="dogWalkerId">Id des DogWalkers</param>
/// <param name="startDate">StartDatum</param>
/// <param name="endDate">Enddatum</param>
/// <returns>Anzahl Walks</returns>
Task<int> CountConfirmedByTimeRangeAsync(string dogWalkerId, DateTimeOffset startDate, DateTimeOffset endDate);
}
/// <summary>
/// Schnittstellenbeschreibug für einen Service der die Verwaltung von Walking-Schedules ermöglicht.
/// Das bedeutet die einstellung an welchen Wochentagen ein Walker zu welchen Zeiten zur Verfügung steht
/// </summary>
public interface IWalkingTimeService : IService<WalkingTime>
{
/// <summary>
/// Erstellt eine Walkingtime Einstellung
/// </summary>
/// <param name="dogWalkerId">Id des Dogwalkers</param>
/// <returns>WalkingTime</returns>
WalkingTime Create(string dogWalkerId);
/// <summary>
/// Gibt eine Liste der Walkintimes eines Benutzers für das Syncing mit der App zurück.
/// </summary>
/// <param name="dogWalkerId">Id des DogWalkers</param>
/// <param name="lastUpdate">Letztes Update</param>
/// <returns>Liste der öffentlichen Anfragen</returns>
Task<List<WalkingTime>> GetForSyncAppAsync(string dogWalkerId, DateTimeOffset? lastUpdate);
/// <summary>
/// Gibt eine Liste der Walkintimes eines Benutzers zurück.
/// </summary>
/// <param name="dogWalkerId">Id des DogWalkers</param>
/// <returns>Liste der öffentlichen Anfragen</returns>
Task<List<WalkingTime>> GetAllAsync(string dogWalkerId);
}
/// <summary>
/// Schnittstellenbeschreibung für einen Service der die Verwaltung von Ratings ermöglicht
/// </summary>
public interface IRatingService : IService<Rating>
{
/// <summary>
/// Erstellen eines Ratings
/// </summary>
/// <returns>Rating</returns>
Rating Create();
/// <summary>
/// Erstellen eines Ratings
/// </summary>
/// <param name="fromId">Id der Rating Quelle</param>
/// <param name="fromType">Typ der Rating Quelle</param>
/// <param name="targetId">Id des Ziels des Ratings</param>
/// <param name="targetType">Typ des Rating Ziels</param>
/// <param name="points">Vergebene Punkte</param>
/// <param name="info">Zusatzinfo zum Rating</param>
/// <returns>Rating</returns>
Rating Create(string fromId, AppUserType fromType, string targetId, RatingTarget targetType, decimal points, string info);
/// <summary>
/// Gibt eine Liste der Ratings eines Benutzers zurück. Kann Owner und Walker sein
/// </summary>
/// <param name="appUserId">Id des AppUsers</param>
/// <param name="lastUpdate">Letztes Update</param>
/// <returns>Liste der öffentlichen Anfragen</returns>
Task<List<Rating>> GetForSyncAppAsync(string appUserId, DateTimeOffset? lastUpdate);
/// <summary>
/// Gibt ein Rating basierend auf Abfragekriterien zurück
/// </summary>
/// <param name="fromId">Id der Rating Quelle</param>
/// <param name="fromType">Typ der Rating Quelle</param>
/// <param name="targetId">Id des Ziels des Ratings</param>
/// <param name="targetType">Typ des Rating Ziels</param>
/// <returns>Rating wenn gefunden, null sonst</returns>
Task<Rating> GetRatingExAsync(string fromId, AppUserType fromType, string targetId, RatingTarget targetType);
/// <summary>
/// Neu berechnen der Ratings-Statistics für ein Ziel
/// </summary>
/// <param name="targetId">Id des Ziels des Ratings</param>
/// <param name="targetType">Typ des Rating Ziels</param>
/// <returns>true wenn erfolgreich, false sonst</returns>
Task<bool> UpdateRatingStatisticsAsync(string targetId, RatingTarget targetType);
/// <summary>
/// Gibt an ob ein Bewerter ein Ziel bereits bewertet hat
/// </summary>
/// <param name="fromId">Id der Rating Quelle</param>
/// <param name="fromType">Typ der Rating Quelle</param>
/// <param name="targetId">Id des Ziels des Ratings</param>
/// <param name="targetType">Typ des Rating Ziels</param>
/// <returns>true wenn bereits bewertet, false sonst</returns>
Task<bool> HasRatedAsync(string fromId, AppUserType fromType, string targetId, RatingTarget targetType);
/// <summary>
/// Gibt zurück ob ein Bewerter ein Ziel bewerten darf.
/// z.B. ein Walker darf einen hund nur bewerten, wenn mindestens ein Walk mit dem hund stattgefunden hat.
/// Ein Owner darf einen Walker nur bewerten, wenn dieser mindestens einen Walk für den Owen gemacht hat usw.
/// </summary>
/// <param name="fromId">Id der Rating Quelle</param>
/// <param name="fromType">Typ der Rating Quelle</param>
/// <param name="targetId">Id des Ziels des Ratings</param>
/// <param name="targetType">Typ des Rating Ziels</param>
/// <returns>true wenn eine Bewertung stattfinden darf, false sonst</returns>
Task<bool> CanRateAsync(string fromId, AppUserType fromType, string targetId, RatingTarget targetType);
/// <summary>
/// Alle Ratings eines AppUsers und für einen AppUser löschen
/// </summary>
/// <param name="appUserId">Id des AppUsers</param>
/// <returns>Liste von Rating-Ziele deren Statistik aktualisiert werden muss</returns>
Task<List<Tuple<string, RatingTarget>>> DeleteAllForAppUserAsync(string appUserId);
/// <summary>
/// Gibt eine Liste von Ratings mit Namen aufgelöst zurück
/// </summary>
/// <param name="fromId">Id der Rating Quelle</param>
/// <param name="fromType">Typ der Rating Quelle</param>
/// <param name="targetId">Id des Ziels des Ratings</param>
/// <param name="targetType">Typ des Rating Ziels</param>
/// <param name="sortList">Optional: Liste der sortierung</param>
/// <param name="skip">Datensätze auslassen</param>
/// <param name="take">Datensätze nehmen</param>
/// <returns>Liste gefudene Walks</returns>
Task<(int total, List<RatingWithNames> list)> GetWithNamesAsync(string fromId, AppUserType? fromType, string targetId, RatingTarget? targetType, List<DynamicSortOrder> sortList, int skip, int take);
/// <summary>
/// Gibt eine Liste von Ratings mit Namen aufgelöst und mit lock und block Info zurück
/// </summary>
/// <param name="blockingAppUserId">Id des Benutzers der abfrägt und für den Blocking geprüft wird</param>
/// <param name="fromId">Id der Rating Quelle</param>
/// <param name="fromType">Typ der Rating Quelle</param>
/// <param name="targetId">Id des Ziels des Ratings</param>
/// <param name="targetType">Typ des Rating Ziels</param>
/// <param name="sortList">Optional: Liste der sortierung</param>
/// <param name="skip">Datensätze auslassen</param>
/// <param name="take">Datensätze nehmen</param>
/// <returns>Liste gefudene Walks</returns>
Task<(int total, List<RatingWithNamesEx> list)> GetWithNamesExAsync(string blockingAppUserId, string fromId, AppUserType? fromType, string targetId, RatingTarget? targetType, List<DynamicSortOrder> sortList, int skip, int take);
/// <summary>
/// Gibt ein Rating mit Namen aufgelöst zurück
/// </summary>
/// <param name="ratingId">Id des Ratings</param>
/// <returns>Rating oder null, wenn nicht gefunden</returns>
Task<RatingWithNames> GetWithNamesAsync(string ratingId);
}
/// <summary>
/// Schnittstellenbeschreibung für einen Service der die Verwaltung von Feedbacks aus der App ermöglicht
/// </summary>
public interface IAppFeedbackService : IService<AppFeedback>
{
/// <summary>
/// Erstellen eines Feedback
/// </summary>
/// <returns>AppFeedback</returns>
AppFeedback Create();
/// <summary>
/// Gibt eine gefilterte Liste von Feedback zurück
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener Feedbacks</returns>
IQueryable<AppFeedback> Filter(string filter);
/// <summary>
/// Gibt die Anzahl von Feedbacks in einem bestimmten Status zurück
/// </summary>
/// <param name="status">Gewünschter Status</param>
/// <returns>Anzahl Feedbacks im Status</returns>
Task<int> CountAsync(AppFeedbackStatus status);
}
/// <summary>
/// Schnittstellenbeschreibung für einen Service der die Verwaltung von Favoriten ermöglicht
/// </summary>
public interface IFavouriteService : IService<Favourite>
{
/// <summary>
/// Erstellen eines Favoriten
/// </summary>
/// <returns>Rating</returns>
Favourite Create();
/// <summary>
/// Erstellen eines Favoriten
/// </summary>
/// <param name="appUserId">Id des AppUsers</param>
/// <param name="key">Id des verknüpften Objekts</param>
/// <param name="table">Typ des verknüpften Objekts</param>
/// <returns>Rating</returns>
Favourite Create(string appUserId, string key, string table);
/// <summary>
/// Gibt eine Liste der Favoriten eines Benutzers zurück. Kann Owner und Walker sein
/// </summary>
/// <param name="appUserId">Id des AppUsers</param>
/// <param name="lastUpdate">Letztes Update</param>
/// <returns>Liste der öffentlichen Anfragen</returns>
Task<List<Favourite>> GetForSyncAppAsync(string appUserId, DateTimeOffset? lastUpdate);
/// <summary>
/// Gibt eine Liste der Favoriten eines Benutzers zurück
/// </summary>
/// <param name="appUserId">Id des AppUsers</param>
/// <returns>Liste der Favoriten</returns>
Task<List<Favourite>> GetForAppUserAsync(string appUserId);
/// <summary>
/// Gibt eine Liste der Favoriten eines Benutzers zurück
/// </summary>
/// <param name="appUserId">Id des AppUsers</param>
/// <param name="table">Typ des Objektes das gesucht wird</param>
/// <returns>Liste der Favoriten</returns>
Task<List<Favourite>> GetForAppUserAsync(string appUserId, string table);
/// <summary>
/// Alle Favoriten eines AppUsers löschen
/// </summary>
/// <param name="appUserId">Id des AppUsers</param>
/// <returns>Anzahl gelöscht</returns>
Task<int> DeleteAllForAppUserAsync(string appUserId);
}
/// <summary>
/// Schnittstellenbeschrigun für einen Service der die Verwaltung von Systemnachrichten ermöglicht
/// </summary>
public interface ISystemMessageService : IService<SystemMessage>
{
/// <summary>
/// Erstellen einer Systemnachrichten
/// </summary>
/// <returns>Systemnachricht</returns>
SystemMessage Create();
/// <summary>
/// Erstellen einer Systemnachrichten
/// </summary>
/// <param name="appUserId">Id des AppUsers</param>
/// <param name="appUserType">Typ des App-Users</param>
/// <param name="key">Id des verknüpften Objekts</param>
/// <param name="table">Typ des verknüpften Objekts</param>
/// <param name="type">Typ der Systemnachricht</param>
/// <returns>Systemnachricht</returns>
SystemMessage Create(string appUserId, AppUserType appUserType, string key, string table, SystemMessageType type);
/// <summary>
/// Gibt eine Liste der Systemnachrichten eines Benutzers zurück
/// </summary>
/// <param name="appUserId">Id des AppUsers</param>
/// <param name="lastUpdate">Letztes Update</param>
/// <returns>Liste der Systemnachricht</returns>
Task<List<SystemMessage>> GetForSyncAppAsync(string appUserId, DateTimeOffset? lastUpdate);
/// <summary>
/// Berstätigen des Erhaltes von SystemNachrichten für einen Benutzer. Alle die älter als das UpdateDatum sind werden gelöscht
/// </summary>
/// <param name="senderId">Id des Users - wird als Receiver gesucht</param>
/// <param name="lastUpdate">Letztes Update</param>
/// <param name="userName">Benutzer der die Änderung vornimmt</param>
/// <returns>true wenn erfolgreich, false sonst</returns>
Task<bool> ConfirmAsync(string senderId, DateTimeOffset lastUpdate, string userName);
/// <summary>
/// Entfernen von Systemnachrichten für einen Benutzer wenn diese in der App schon gesehen wurden
/// </summary>
/// <param name="appUserId">Id des AppUsers</param>
/// <param name="appUserType">Typ des App-Users</param>
/// <param name="key">Id des verknüpften Objekts</param>
/// <param name="table">Typ des verknüpften Objekts</param>
/// <param name="created">Datum - das created Datum der Systemnachricht muss kleiner gleich sein</param>
/// <param name="userName">Benutzer der die Änderung vornimmt</param>
/// <returns>Systemnachricht</returns>
Task<bool> RemoveAsync(string appUserId, AppUserType appUserType, string key, string table, DateTimeOffset? created, string userName);
/// <summary>
/// Hinzufügen eines Systemnachricht
/// </summary>
/// <param name="appUserId">Id des Ziels</param>
/// <param name="appUserType">Typ des App-Users</param>
/// <param name="key">Id des Objekts</param>
/// <param name="table">Objekttyp</param>
/// <param name="type">Nachrichten-Typ</param>
/// <param name="expires">Ablaufdatum</param>
/// <returns>Task</returns>
void Add(string appUserId, AppUserType appUserType, string key, string table, SystemMessageType type, DateTimeOffset expires);
/// <summary>
/// Hinzufügen einer Systemnachricht als Text. Setzt den Typen automatisch
/// </summary>
/// <param name="appUserId">Id des Ziels</param>
/// <param name="appUserType">Typ des App-Users</param>
/// <param name="key">Id des Objekts</param>
/// <param name="expires">Ablaufdatum</param>
/// <param name="message">Nachricht</param>
/// <returns>Task</returns>
void Add(string appUserId, AppUserType appUserType, string key, DateTimeOffset expires, string message);
/// <summary>
/// Löschen abgelaufener Nachrichten
/// </summary>
/// <param name="date">Grenzdatum für Expired</param>
/// <returns>Anzahl gelöschte Nachrichten</returns>
Task<int> RemoveExpiredAsync(DateTimeOffset date);
/// <summary>
/// Alle Systemnachrichten eines AppUsers löschen
/// </summary>
/// <param name="appUserId">Id des AppUsers</param>
/// <returns>Anzahl gelöscht</returns>
Task<int> DeleteAllForAppUserAsync(string appUserId);
#region SystemMessagesToSend
/// <summary>
/// Erstellen einer Systemnachrichten die gesendet werden sollen
/// </summary>
/// <returns>Systemnachricht die gesendet werden soll</returns>
SystemMessageToSend CreateToSend();
/// <summary>
/// Gibt eine gefilterte Liste von Systemnachrichten die gesendet werden sollen
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener Systemnachrichten die gesendet werden sollen</returns>
IQueryable<SystemMessageToSend> FilterSystemMessagesToSend(string filter);
/// <summary>
/// Hinzufügen einer Systemnachricht die gesendet werden soll
/// </summary>
/// <param name="item">SystemMessageToSend</param>
void AddToSend(SystemMessageToSend item);
/// <summary>
/// Löschen einer Systemnachricht die gesendet werden soll
/// </summary>
/// <param name="item">SystemMessageToSend</param>
void RemoveToSend(SystemMessageToSend item);
/// <summary>
/// Gibt eine Systemnachricht die gesendet werden soll zurück
/// </summary>
/// <param name="id">Id der Systemnachricht</param>
/// <returns>SystemMessageToSend oder null, wenn nicht gefunden</returns>
Task<SystemMessageToSend> GetToSendAsync(long id);
/// <summary>
/// Gibt eine Liste von Systemnachrichten die gesendet werden sollen zurück.
/// Bereits gesendete oder Nachrichten die kein Versanddatum haben werden nicht zurückgegeben
/// </summary>
/// <param name="date">Datum das größer als das Versanddatum sein muss</param>
/// <returns>Liste Nachrichten zu senden</returns>
Task<List<SystemMessageToSend>> GetToSendAsync(DateTimeOffset date);
#endregion
}
/// <summary>
/// Schnittstellenbeschreibung für einen Service der die Verwaltung von Devices der App-User ermöglicht
/// </summary>
public interface IDeviceService : IService<Device>
{
/// <summary>
/// Anlegen oder Aktualisieren eines Devices
/// </summary>
/// <param name="appUserId">ID des AppUsers</param>
/// <param name="installationId">eindeutige InstallationsID</param>
/// <param name="platform">Platform (OS)</param>
/// <param name="notificationPlatform">Platform (PNS)</param>
/// <param name="channel">Token des Users</param>
/// <param name="language">Sprache die am Gerät eingestellt ist</param>
/// <param name="suppresCommit">Soll Commit untertrückt werden</param>
/// <returns>Device</returns>
Task<Device> CreateOrUpdateAsync(string appUserId, string installationId, Platform platform, NotificationPlatform notificationPlatform, string channel, string language, bool suppresCommit);
/// <summary>
/// Löschen eines Devices eines Benutzers mit einer InstallationsId
/// </summary>
/// <param name="appUserId"></param>
/// <param name="installationId"></param>
/// <param name="suppresCommit">Soll Commit untertrückt werden</param>
/// <returns></returns>
Task<bool> DeleteAsync(string appUserId, string installationId, bool suppresCommit);
/// <summary>
/// Gibt eine Liste aller Devices eines App-Users zurück
/// </summary>
/// <param name="appUserId">Id des AppUsers</param>
/// <returns>Liste von Devices</returns>
Task<List<Device>> GetAllAsync(string appUserId);
/// <summary>
/// Gibt ein Device für einen App-User zurück
/// </summary>
/// <param name="appUserId">Id des App-Users</param>
/// <param name="installationId">InstallationsId des Devices</param>
/// <returns>Device oder null, wenn nicht gefunden</returns>
Task<Device> GetAsycn(string appUserId, string installationId);
}
/// <summary>
/// Schnittstellenbeschreibung für einen Service der die Verwaltung von Wallets ermöglicht
/// </summary>
public interface IWalletService : IService<Wallet>
{
/// <summary>
/// Erstellen eines Wallets für einen AppUser
/// </summary>
/// <param name="appUserId">Id des AppUsers</param>
/// <param name="walletId">ID des Walltes bei Mangopay</param>
/// <param name="type">Typ des Wallets</param>
/// <param name="ownerId">Id des Payment Owners (PaymentId)</param>
/// <param name="currency">Währung ISO 4217 Code</param>
/// <param name="description">Beschreibung</param>
/// <returns>Wallet</returns>
Wallet Create(string appUserId, string walletId, WalletType type, string ownerId, string currency, string description);
/// <summary>
/// Gibt ein Wallet für einen AppUser mit einem Typ zurück
/// </summary>
/// <param name="appUserId">Id des AppUsers</param>
/// <param name="type">Typ des Wallets</param>
/// <returns>Wallet oder null, wenn nicht gefunden</returns>
Task<Wallet> GetAsync(string appUserId, WalletType type);
/// <summary>
/// Gibt eine Liste aller Wallets eines AppUsers zurück
/// </summary>
/// <param name="appUserId">Id des AppUsers</param>
/// <returns>Liste von Wallets</returns>
Task<List<Wallet>> GetAllAsync(string appUserId);
}
/// <summary>
/// Schnittstellenbeschreibung für einen Service der die Verwaltung von Transaktionsgebühren ermöglichts
/// </summary>
public interface ITransactionFeeService : IService<TransactionFee>
{
/// <summary>
/// Gibt eine gefilterte Liste von Transaktionsgebühren zurück
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener Transaktionsgebühren</returns>
IQueryable<TransactionFee> Filter(string filter);
/// <summary>
/// Erstellen einer Tranksaktionsgebühr
/// </summary>
/// <returns>Tranksaktionsgebühr</returns>
TransactionFee Create();
/// <summary>
/// Prüft ob schon eine Einstellung für einen Typ vorhanden ist
/// </summary>
/// <param name="payInType">Zahlungsmethode</param>
/// <returns>true wenn bereits vorhanden, false sonst</returns>
Task<bool> ExistsAsync(PayInType payInType);
/// <summary>
/// Gibt eine Liste von Transaktionsgebühren zurück, die für die Synchronisation benötigt werden
/// </summary>
/// <param name="lastUpdate">Letztes Update oder null wenn noch keines</param>
/// <returns>Liste von Transaktionsgebühren</returns>
Task<List<TransactionFee>> GetForSyncAsync(DateTimeOffset? lastUpdate);
/// <summary>
/// Gibt eine gefilterte Liste von GehGassi-Gebühren zurück
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener GehGassi-Gebühren</returns>
IQueryable<GehGassiFee> FilterGehGassiFees(string filter);
/// <summary>
/// Erstellen einer GehGassi-Gebühr
/// </summary>
/// <returns>GehGassi-Gebühr</returns>
GehGassiFee CreateGehGassiFee();
/// <summary>
/// Gibt eine GehGassi-Gebühr zurück
/// </summary>
/// <param name="id">Id der Gebühr</param>
/// <returns>Gebühr oder null, wenn nicht gefunden</returns>
Task<GehGassiFee> GetGehGassiFeeAsync(string id);
/// <summary>
/// Prüft ob schon eine Einstellung für einen Startbetrag vorhanden ist
/// </summary>
/// <param name="startAmmount">Startbetrag</param>
/// <param name="ignoreId">ID die ignoriert werden soll</param>
/// <returns>true wenn bereits vorhanden, false sonst</returns>
Task<bool> ExistsGehGassiFeeAsync(decimal startAmmount, string ignoreId);
/// <summary>
/// Hinzufügen einer GehGassi-Gebühr
/// </summary>
/// <param name="gehGassiFee">GehGassi-Gebühr</param>
void AddGehGassiFee(GehGassiFee gehGassiFee);
/// <summary>
/// Löschen einer GehGassi-Gebühr
/// </summary>
/// <param name="gehGassiFee">GehGassi-Gebühr</param>
void RemoveGehGassiFee(GehGassiFee gehGassiFee);
/// <summary>
/// Gibt eine GehGassi-Gebühr zurück die für den Startbetrag gilt
/// </summary>
/// <param name="startAmmount">Start-Betrag</param>
/// <returns>Gebühr oder null, wenn nicht gefunden</returns>
Task<GehGassiFee> GetMinGehGassiFeeAsync(decimal startAmmount);
}
/// <summary>
/// Schnittstellenbeschreibung für einen Service der die Verwaltung von Zahlungstransaktionen ermöglicht
/// </summary>
public interface IPaymentTransactionService : IService<PaymentTransaction>
{
/// <summary>
/// Erstellen einer Zahlungs-Transaktion
/// </summary>
/// <returns>Zahlungs-Transaktion</returns>
PaymentTransaction Create();
/// <summary>
/// Gibt eine Transaktion anhand der MangoPay TransaktionsId zurück.
/// Diese muss den entsprechenden TransaktionsTyp und Status haben
/// </summary>
/// <param name="transactionId">Id der Transaktion bei MangoPay</param>
/// <param name="type">Typ der Transaktion</param>
/// <param name="status">Status der Transaktion</param>
/// <returns>Transaktion oder null, wenn nicht gefunden</returns>
Task<PaymentTransaction> GetAsync(string transactionId, PaymentTransactionType type, PaymentTransactionStatus status);
/// <summary>
/// Gibt eine Transaktion anhand der MangoPay TransaktionsId zurück. Hier wird die zuletzt erstellte Transaktion zurückgegeben.
/// Diese muss den entsprechenden TransaktionsTyp und Status haben
/// </summary>
/// <param name="transactionId">Id der Transaktion bei MangoPay</param>
/// <param name="type">Typ der Transaktion</param>
/// <returns>Transaktion oder null, wenn nicht gefunden</returns>
Task<PaymentTransaction> GetAsync(string transactionId, PaymentTransactionType type);
/// <summary>
/// Erstellen einer Zahlungs-Transaktion
/// </summary>
/// <param name="transactionId">Id der Transaktion bei MangoPay</param>
/// <param name="type">Typ der Transaktion</param>
/// <param name="status">Status der Transaktion</param>
/// <param name="walkId">Id des Walks</param>
/// <param name="targetAppUserId">Id des AppUsers der die Zahlung erhält</param>
/// <param name="targetWalletId">Id des Wallets, auf das die Transaktion angewendet wird</param>
/// <param name="sourceAppUserId">Id des AppUsers der die Zahlung veranlasst</param>
/// <param name="sourceWalletId">Id des Wallets, von dem die Transaktion ausgeht</param>
/// <param name="ammount">Betrag in der kleinsten Einheit der Währung</param>
/// <param name="fromCredit">Zusätzlich vom Guthabenkonto in der kleinsten Einheit der Währung</param>
/// <param name="currency">Währung ISO 4217 Code</param>
/// <param name="payInType">Art der Zahlung</param>
/// <returns>Zahlungs-Transaktion</returns>
PaymentTransaction Create(string transactionId, PaymentTransactionType type, PaymentTransactionStatus status, string walkId, string targetAppUserId, string targetWalletId, string sourceAppUserId, string sourceWalletId, long ammount, long fromCredit, string currency, PayInType? payInType);
/// <summary>
/// Erstellen einer Zahlungs-Transaktion mit Fehlern nach Mangopay
/// </summary>
/// <param name="transactionId">Id der Transaktion bei MangoPay</param>
/// <param name="type">Typ der Transaktion</param>
/// <param name="status">Status der Transaktion</param>
/// <param name="walkId">Id des Walks</param>
/// <param name="targetAppUserId">Id des AppUsers der die Zahlung erhält</param>
/// <param name="targetWalletId">Id des Wallets, auf das die Transaktion angewendet wird</param>
/// <param name="sourceAppUserId">Id des AppUsers der die Zahlung veranlasst</param>
/// <param name="sourceWalletId">Id des Wallets, von dem die Transaktion ausgeht</param>
/// <param name="ammount">Betrag in der kleinsten Einheit der Währung</param>
/// <param name="fromCredit">Zusätzlich vom Guthabenkonto in der kleinsten Einheit der Währung</param>
/// <param name="currency">Währung ISO 4217 Code</param>
/// <param name="errorMessage">Fehlermeldung Mangopay</param>
/// <param name="errorType">Fehlertyp nach Mangopay</param>
/// <param name="errorMessages">Fehlermledungen nach Mangopay - Zusatzinfo</param>
/// <param name="payInType">Art der Zahlung</param>
/// <returns>Zahlungs-Transaktion</returns>
PaymentTransaction Create(string transactionId, PaymentTransactionType type, PaymentTransactionStatus status, string walkId, string targetAppUserId, string targetWalletId, string sourceAppUserId, string sourceWalletId, long ammount, long fromCredit, string currency, string errorMessage, string errorType, Dictionary<string,string> errorMessages, PayInType? payInType);
}
/// <summary>
/// Schnittstellenbeschreibung für einen Service der die Verwaltung von KYC-Dokumenten ermöglicht
/// </summary>
public interface IIdentityDocumentService : IService<IdentityDocument>
{
/// <summary>
/// Erstellen eines KYC-Dokuments
/// </summary>
/// <returns>IdentityDocument</returns>
IdentityDocument Create();
/// <summary>
/// Erstellen eines KYC-Dokuments
/// </summary>
/// <param name="appUserId">Id des App-Users</param>
/// <param name="mangoPayId">Id des KYC-Dokumentes bei MangoPay</param>
/// <param name="mangoPayUserId">Id des Users bei MangoPay</param>
/// <param name="documentType">Typ des Dokumentes</param>
/// <param name="source">Quelle / Dokumentenart</param>
/// <param name="status">Status der Validierung des Dokumentes</param>
/// <param name="pageCount">Anzahl der Seiten</param>
/// <returns>IdentityDocument</returns>
IdentityDocument Create(string appUserId, string mangoPayId, string mangoPayUserId, IdentityDocumentType documentType, IdentityDocumentSource source, IdentityDocumentStatus status, int pageCount);
/// <summary>
/// Gibt ein KYC-Dokument anhand der MangoPayId zurück
/// </summary>
/// <param name="mangoPayId">Id des Dokumentes bei MangoPay</param>
/// <returns>IdentityDocument oder null, wenn nicht gefunden</returns>
Task<IdentityDocument> GetByMangoPayIdAsync(string mangoPayId);
/// <summary>
/// Gibt ein KYC-Dokument zurück, bei welchem die Validierung noch läuft
/// </summary>
/// <param name="appUserId">Id des App-USers</param>
/// <returns>IdentityDocument oder null, wenn keines gefunden</returns>
Task<IdentityDocument> GetValidationInProgressAsync(string appUserId);
/// <summary>
/// Gibt das zuletzt erstellte KYC-Dokument für einen App-User zurück
/// </summary>
/// <param name="appUserId">Id des App-USers</param>
/// <returns>IdentityDocument oder null, wenn keines gefunden</returns>
Task<IdentityDocument> GetLatestAsync(string appUserId);
}
/// <summary>
/// Schnittstellenbeschreibung für einen Service der die Verwaltung von Auszahlungen ermöglicht
/// </summary>
public interface IPayoutService : IService<Payout>
{
/// <summary>
/// Erstellen einer Auszahlung
/// </summary>
/// <returns>Payout</returns>
Payout Create();
/// <summary>
/// Erstellen einer Auszahlung
/// </summary>
/// <param name="appUserId">Id des App-Users</param>
/// <param name="mangoPayUserId">Id des Users bei MangoPay</param>
/// <param name="mangoPayId">Id der Auszahlung bei MangoPay</param>
/// <param name="walletId">Id des Wallets</param>
/// <param name="mangoPayWalletId">Id des Wallets bei MangoPay</param>
/// <param name="mangoPayBankId">Id der Bankverbindung bei mangoPay</param>
/// <param name="iban">Iban letzte 4 Stellen</param>
/// <param name="bic">Bic letzte 4 Stellen oder leer</param>
/// <param name="ammount">Summe die ausgezahlt werden soll in der kleinsten Einheit</param>
/// <param name="currency">Währung ISO 4217 Code</param>
/// <returns>Payout</returns>
Payout Create(string appUserId, string mangoPayUserId, string mangoPayId, string walletId, string mangoPayWalletId, string mangoPayBankId, string iban, string bic, long ammount, string currency);
/// <summary>
/// Gibt eine Liste der Auszahlungen eines Benutzers zurück.
/// </summary>
/// <param name="appUserId">Id des AppUsers</param>
/// <param name="lastUpdate">Letztes Update</param>
/// <returns>Liste der öffentlichen Anfragen</returns>
Task<List<Payout>> GetForSyncAppAsync(string appUserId, DateTimeOffset? lastUpdate);
/// <summary>
/// Gibt eine Auszahlung anhand der MangoPayId zurück
/// </summary>
/// <param name="mangoPayId">Id der Auszahlung bei MangoPay</param>
/// <returns>Payout oder null, wenn nicht gefunden</returns>
Task<Payout> GetByMangoPayIdAsync(string mangoPayId);
/// <summary>
/// Gibt eine Liste von Auszahlungen zurück
/// </summary>
/// <param name="appUserId">Id des App-Users</param>
/// <param name="sortList">Optional: Liste der sortierung</param>
/// <param name="skip">Datensätze auslassen</param>
/// <param name="take">Datensätze nehmen</param>
/// <returns>Liste gefudene Walks</returns>
Task<(int total, List<Payout> list)> GetAsync(string appUserId, List<DynamicSortOrder> sortList, int skip, int take);
/// <summary>
/// Gibt die letzte Auszahlung eines Benutzers zurück
/// </summary>
/// <param name="appUserId">Id des Benutzers</param>
/// <returns>Auszahlung oder null, wenn nicht gefunden</returns>
Task<Payout> GetLastPayoutAsync(string appUserId);
/// <summary>
/// Gibt die Anzahl der Auszahlungen eines Benutzers in einem Zeitrahmen zurück
/// </summary>
/// <param name="appUserId">Id des App-Users</param>
/// <param name="startDate">Startdatum</param>
/// <param name="endDate">Enddatum</param>
/// <returns>Anzahl Auszahlungen</returns>
Task<int> CountPayoutsInTimeRangeAsync(string appUserId, DateTimeOffset startDate, DateTimeOffset endDate);
}
/// <summary>
/// Schnittstellenbeschreibung für einen Service der die Verwaltung von Walk-Beschwerden ermöglicht
/// </summary>
public interface IWalkComplaintService : IService<WalkComplaint>
{
/// <summary>
/// Erstellen einer Walk-Beschwerde
/// </summary>
/// <returns>Walk</returns>
WalkComplaint Create();
/// <summary>
/// Gibt eine gefilterte Liste von Walk-Beschwerden mit Namen zurück in einer gewählten Sprache
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <param name="includeDeleted">Sollen gelöschte inkludiert werden?</param>
/// <returns>Liste betroffener Walk-Beschwerden</returns>
IQueryable<WalkComplaintWithNames> FilterWithNames(string filter, bool includeDeleted);
/// <summary>
/// Gibt eine Walk-Beschwerden mit Namen aufgelöst zurück
/// </summary>
/// <param name="id">Id der Beschwerde</param>
/// <returns>Walk-Beschwerden mit Namen aufgelöst</returns>
Task<WalkComplaintWithNames> GetWithNamesAsync(string id);
/// <summary>
/// Gibt eine Walk-Beschwerden mit Namen aufgelöst zurück
/// </summary>
/// <param name="walkId">Id des Walks</param>
/// <returns>Walk-Beschwerden mit Namen aufgelöst</returns>
Task<WalkComplaintWithNames> GetWithNamesByWalkAsync(string walkId);
/// <summary>
/// Gibt eine Walk-Beschwerden zurück
/// </summary>
/// <param name="walkId">Id des Walks</param>
/// <returns>Walk-Beschwerden</returns>
Task<WalkComplaint> GetByWalkAsync(string walkId);
/// <summary>
/// Gibt die Anzahl der Walk-Beschwerden mit einem bestimmten Status zurück
/// </summary>
/// <param name="status">Gewünschter Status</param>
/// <returns>Anzahl Beschwerden im Status</returns>
Task<int> CountAsync(WalkComplaintStatus status);
}
/// <summary>
/// Schnittstellenbeschreibung für einen Service der Statistiken zur Verfügung stellt
/// </summary>
public interface IStatisticService
{
/// <summary>
/// Gibt zurück wie viele gültige Walks insgesamt vorhanden sind.
/// Das sind alle Walks die nicht folgenden Status haben:
/// - Requested
/// - Declined
/// - Cancelled
/// </summary>
/// <param name="minPaymentStatus">Minimaler Zahlungsstatus, null wenn alle</param>
/// <param name="maxPaymentStatus">Maximaler Zahlungsstatus, null wenn alle</param>
/// <param name="countryIso">Land oder leer wenn alle</param>
/// <returns>Anzahl Walks</returns>
Task<int> CountWalksTotalAsync(PaymentStatus? minPaymentStatus, PaymentStatus? maxPaymentStatus, string countryIso);
/// <summary>
/// Gibt zurück wie viele gültige Walks in einem Zeitraum vorhanden sind.
/// Das sind alle Walks die nicht folgenden Status haben:
/// - Requested
/// - Declined
/// - Cancelled
/// </summary>
/// <param name="minPaymentStatus">Minimaler Zahlungsstatus, null wenn alle</param>
/// <param name="maxPaymentStatus">Maximaler Zahlungsstatus, null wenn alle</param>
/// <param name="start">Startdatum</param>
/// <param name="end">Enddatum</param>
/// <param name="countryIso">Land oder leer wenn alle</param>
/// <returns>Anzahl Walks</returns>
Task<int> CountWalksAsync(PaymentStatus? minPaymentStatus, PaymentStatus? maxPaymentStatus, DateTimeOffset start, DateTimeOffset end, string countryIso);
/// <summary>
/// Gibt die Anzahl von Walks in einem bestimmten Status in einem Zeitraum zurück
/// </summary>
/// <param name="status">Status der gesucht wird, null wenn alle</param>
/// <param name="minPaymentStatus">Minimaler Zahlungsstatus, null wenn alle</param>
/// <param name="maxPaymentStatus">Maximaler Zahlungsstatus, null wenn alle</param>
/// <param name="start">Startdatum</param>
/// <param name="end">Enddatum</param>
/// <param name="countryIso">Land oder leer wenn alle</param>
/// <returns>Anzahl Walks</returns>
Task<int> CountWalkByStatusAsync(WalkStatus? status, PaymentStatus? minPaymentStatus, PaymentStatus? maxPaymentStatus, DateTimeOffset start, DateTimeOffset end, string countryIso);
}
/// <summary>
/// Schnittstellenbeschreibung für einen Service der die Verwaltung von App-User-Reports ermöglicht
/// </summary>
public interface IAppUserReportService : IService<AppUserReport>
{
/// <summary>
/// Erstellen einer Meldung
/// </summary>
/// <returns>AppFeedback</returns>
AppUserReport Create();
/// <summary>
/// Gibt eine gefilterte Liste von Meldungen zurück
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener Feedbacks</returns>
IQueryable<AppUserReport> Filter(string filter);
/// <summary>
/// Gibt eine gefilterte Liste von Meldungen zurück
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener Feedbacks</returns>
IQueryable<AppUserReportWithNames> FilterWithNames(string filter);
/// <summary>
/// Gibt die Anzahl von Meldungen in einem bestimmten Status zurück
/// </summary>
/// <param name="status">Gesuchter Status</param>
/// <returns>Anzahl Meldungen im Status</returns>
Task<int> CountAsync(AppUserReportStatus status);
/// <summary>
/// Gibt eine Meldung mit Namen aufgelöst zurück
/// </summary>
/// <param name="id">Id der Meldung</param>
/// <returns>AppUserReportWithNames oder null, wenn nicht gefunden</returns>
Task<AppUserReportWithNames> GetWithNamesAsync(long id);
/// <summary>
/// Gibt zurück wie viele Meldungen ein App-User erstellt hat
/// </summary>
/// <param name="appUserId">Id des App-Users</param>
/// <returns>Anzahl Meldungen</returns>
Task<int> CountReportingAsync(string appUserId);
/// <summary>
/// Gibt zurück wie viele Meldungen für ein App-User erstellt wurden
/// </summary>
/// <param name="appUserId">Id des App-Users</param>
/// <returns>Anzahl Meldungen erstellt</returns>
Task<int> CountReportedAsync(string appUserId);
/// <summary>
/// Löscht alle Meldungen and denen ein AppUser beteiligt ist
/// </summary>
/// <param name="appUserId">Id des App-Users</param>
/// <returns>Anzahl Meldungen gelöscht</returns>
Task<int> DeleteAllForAppUserAsync(string appUserId);
}
/// <summary>
/// Schnittstellenbeschreibung für einen Service der die Verwaltung von FAQs realisiert
/// </summary>
public interface IFaqService : IService<Faq>
{
/// <summary>
/// Gibt eine gefilterte Liste von FAQs zurück
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener FAQs</returns>
IQueryable<Faq> Filter(string filter);
/// <summary>
/// Erstellen einer FAQ
/// </summary>
/// <returns>Faq</returns>
Faq Create();
/// <summary>
/// Gibt eine gefilterte Liste von FAQs zurück. Sucht nur im Titel
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener FAQs</returns>
Task<List<Faq>> SearchAsync(string filter);
/// <summary>
/// Gibt eine gefilterte Liste von FAQs mit Namen zurück in einer gewählten Sprache
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <param name="includeDeleted">Sollen gelöschte inkludiert werden?</param>
/// <returns>Liste betroffener FAQs</returns>
IQueryable<FaqWithNames> FilterWithNames(string filter, string language, string fallback, bool includeDeleted);
/// <summary>
/// Gibt eine Liste von FAQs zurück, welche nach dem glieferten Datum geändert wurden.
/// Wird kein Datum angegeben, werden alle zurückgegeben.
/// Es werden alle Kategorien zurückgegeben - egal ob on- oder offline.
/// </summary>
/// <param name="lastUpdate">Letztes Update oder null wenn noch keines</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <returns>Liste von FAQs</returns>
Task<List<FaqWithNames>> GetForSyncAsync(DateTimeOffset? lastUpdate, string language, string fallback);
/// <summary>
/// Erstellt das FAQ-Html für die Integration in die FAQ-Seite.
/// Es werden alle FAQs genommen, welche Online sind und nicht gelöscht wurden
/// </summary>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <param name="type">Typ</param>
/// <returns>string - HTML</returns>
Task<string> GenerateHtmlForPageAsync(string language, string fallback, FaqType type);
/// <summary>
/// Gibt eine Liste aller FAQ mit einem speziellen Typ zurück
/// </summary>
/// <param name="type">Typ</param>
/// <returns>Liste FAQ</returns>
Task<List<Faq>> GetAllAsync(FaqType type);
}
/// <summary>
/// Schnittstellenbeschreibung für einen Service der die Verwaltung von Coin-Konten, Transaktionen und Monats- und Jahresstatistiken realisiert
/// </summary>
public interface ICoinsService : IService<CoinsAccount>
{
/// <summary>
/// Gibt einen Coin-Account zurück oder erstellt einen neuen wenn noch nicht vorhanden
/// </summary>
/// <param name="appUserId">Id des AppUsers</param>
/// <param name="appUserType">Typ des AppUsers</param>
/// <returns>CoinAccount</returns>
Task<CoinsAccount> GetOrCreateAsync(string appUserId, AppUserType appUserType);
/// <summary>
/// Einzahlen einer Coins-Summe auf das passende Konto eines AppUsers
/// </summary>
/// <param name="appUserId">Id des AppUsers</param>
/// <param name="appUserType">Typ des AppUsers</param>
/// <param name="ammount">Coins-Betrag der eingezahlt werden soll</param>
/// <param name="walkId">Optional: Id des Walks auf den sich die Transaktion bezieht</param>
/// <returns>Transaktion</returns>
Task<CoinsTransaction> DepositAsync(string appUserId, AppUserType appUserType, decimal ammount, string walkId);
/// <summary>
/// Abbuchen einer Coins-Summe von dem passenden Konto eines AppUsers
/// </summary>
/// <param name="appUserId">Id des AppUsers</param>
/// <param name="appUserType">Typ des AppUsers</param>
/// <param name="ammount">Coins-Betrag der eingezahlt werden soll</param>
/// <returns>CoinsTransaction</returns>
Task<CoinsTransaction> WithdrawAsync(string appUserId, AppUserType appUserType, decimal ammount);
/// <summary>
/// Gibt den Coins-Stand eines AppUsers für einen Monat zurück
/// </summary>
/// <param name="appUserId">Id des AppUsers</param>
/// <param name="appUserType">Typ des AppUsers</param>
/// <param name="date">Datum</param>
/// <returns>CoinsPerMonth</returns>
Task<CoinsPerMonth> GetOrCreateCoinsPerMonthAsync(string appUserId, AppUserType appUserType, DateTimeOffset date);
/// <summary>
/// Gibt den Coins-Stand eines AppUsers für ein Jahr zurück
/// </summary>
/// <param name="appUserId">Id des AppUsers</param>
/// <param name="appUserType">Typ des AppUsers</param>
/// <param name="date">Datum</param>
/// <returns>CoinsPerYear</returns>
Task<CoinsPerYear> GetOrCreateCoinsPerYearAsync(string appUserId, AppUserType appUserType, DateTimeOffset date);
/// <summary>
/// Gibt die Top X der Coins je Monat für ein Jahr und Monat zurück.
/// Sortiert nach Coins absteigend und bei Gleichstand nach LastUpdate aufsteigend
/// </summary>
/// <param name="count">Anzalh Datensätze</param>
/// <param name="appUserType">Typ des AppUsers</param>
/// <param name="year">Jahr</param>
/// <param name="month">Monat</param>
/// <param name="minBalance">Mindest-Wert der erreicht werden musste</param>
/// <returns>Liste CoinsPerMonthWithNames</returns>
Task<List<CoinsPerMonthWithNames>> GetMonthlyTopAsync(int count, AppUserType appUserType, int year, int month, decimal minBalance);
/// <summary>
/// Gibt die Top X der Coins je Jahr zurück.
/// Sortiert nach Coins absteigend und bei Gleichstand nach LastUpdate aufsteigend
/// </summary>
/// <param name="count">Anzalh Datensätze</param>
/// <param name="appUserType">Typ des AppUsers</param>
/// <param name="year">Jahr</param>
/// <param name="minBalance">Mindest-Wert der erreicht werden musste</param>
/// <returns>Liste CoinsPerMonthWithNames</returns>
Task<List<CoinsPerYearWithNames>> GetYearlyTopAsync(int count, AppUserType appUserType, int year, decimal minBalance);
}
/// <summary>
/// Schnittstellenbeschreibung für einen Service der die Verwaltung von Appversionen realisiert
/// </summary>
public interface IAppVersionService : IService<AppVersion>
{
/// <summary>
/// Gibt eine gefilterte Liste von Appversionen zurück
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener AppVersionen</returns>
IQueryable<AppVersion> Filter(string filter);
/// <summary>
/// Erstellen einer Appversion
/// </summary>
/// <returns>Listung</returns>
AppVersion Create();
/// <summary>
/// Gibt eine gefilterte Liste von Appversionen zurück.
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener Appversionen</returns>
Task<List<AppVersion>> SearchAsync(string filter);
/// <summary>
/// Gibt eine gefilterte Liste von Appversionen mit Namen zurück in einer gewählten Sprache
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <returns>Liste betroffener Appversionen</returns>
IQueryable<AppVersionWithNames> FilterWithNames(string filter, string language, string fallback);
/// <summary>
/// Gibt zurück ob eine Versionsnummer für eine Plattform bereits existiert
/// </summary>
/// <param name="platform">Plattform</param>
/// <param name="version">Versionsnummer die geprüft werden soll</param>
/// <param name="ignoreId">ID die ignoriert werden soll</param>
/// <returns>true wenn eine existiert, false sonst</returns>
Task<bool> VersionExistsAsync(Platform platform, string version, int ignoreId);
/// <summary>
/// Gibt zurück ob eine Plattform eine aktuelle Version hat
/// </summary>
/// <param name="platform">Plattform</param>
/// <param name="ignoreId">ID die ignoriert werden soll</param>
/// <returns>true wenn eine existiert, false sonst</returns>
Task<bool> HasCurrentAsync(Platform platform, int ignoreId);
/// <summary>
/// Zurücksetzen der aktuellen Version einer Plattform. Es kann nur einen geben :)
/// </summary>
/// <param name="platform">Plattform</param>
/// <param name="userName">Benutzer der die Änderung vornimmt</param>
/// <returns>Task</returns>
Task ResetCurrentAsync(Platform platform, string userName);
/// <summary>
/// Gibt die aktuelle Version einer Plattform zurück
/// </summary>
/// <param name="platform">Plattform</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <returns>Aktuelle Version oder null, wenn keine vorhanden</returns>
Task<AppVersionWithNames> GetCurrentwithNamesAsync(Platform platform, string language, string fallback);
}
/// <summary>
/// Schnittstellenbeschreibung für einen Service der die Verwaltung von Gutschein Kampagnen realisiert
/// </summary>
public interface IVoucherCampaignService : IService<VoucherCampaign>
{
/// <summary>
/// Gibt eine gefilterte Liste von Gutschein-Kampagnen zurück
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener Gutschein-Kampagnen</returns>
IQueryable<VoucherCampaign> Filter(string filter);
/// <summary>
/// Erstellen einer Gutschein-Kampagne
/// </summary>
/// <returns>Gutschein-Kampagne</returns>
VoucherCampaign Create();
/// <summary>
/// Gibt eine gefilterte Liste von Gutschein-Kampagnen zurück.
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener Gutschein-Kampagnen</returns>
Task<List<VoucherCampaign>> SearchAsync(string filter);
/// <summary>
/// Gibt eine gefilterte Liste von Gutschein-Kampagnen mit Namen zurück in einer gewählten Sprache
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <param name="includeDeleted">Sollen gelöschte inkludiert werden?</param>
/// <param name="excludeDraft">Sollen Entitäten im Draft-Status (Cart) ausgeblendet werden?</param>
/// <returns>Liste betroffener Gutschein-Kampagnen</returns>
IQueryable<VoucherCampaignWithNames> FilterWithNames(string filter, string language, string fallback, bool includeDeleted, bool excludeDraft);
/// <summary>
/// Gibt eine gefilterte Liste von Gutschein-Kampagnen mit Namen für Kunden zurück in einer gewählten Sprache
/// </summary>
/// <param name="customerId">Id des Kunden</param>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <param name="includeDeleted">Sollen gelöschte inkludiert werden?</param>
/// <param name="excludeDraft">Sollen Entitäten im Draft-Status (Cart) ausgeblendet werden?</param>
/// <returns>Liste betroffener Gutschein-Kampagnen</returns>
IQueryable<VoucherCampaignWithNames> FilterWithNamesCustomer(long customerId, string filter, string language, string fallback, bool includeDeleted, bool excludeDraft);
/// <summary>
/// Gibt die Anzahl von Gutschein-Kampagnen zurück
/// </summary>
/// <param name="includeDeleted">Sollen gelöschte inkludiert werden?</param>
/// <param name="excludeDraft">Sollen Entitäten im Draft-Status (Cart) ausgeblendet werden?</param>
/// <returns>Anzahl Gutschein-Kampagnen</returns>
Task<int> CountAsync(bool includeDeleted, bool excludeDraft);
/// <summary>
/// Gibt die Anzahl von Gutschein-Kampagnen in einem Status zurück
/// </summary>
/// <param name="status">Gesuchter Status</param>
/// <param name="includeDeleted">Sollen gelöschte inkludiert werden?</param>
/// <returns>Anzahl Gutschein-Kampagnen</returns>
Task<int> CountAsync(VoucherCampaignStatus status, bool includeDeleted);
/// <summary>
/// Gibt eine Gutschein-Kampagne für einen Artikel im Warenkorb zurück
/// </summary>
/// <param name="cartItemId">Id des Artikels im Warenkorb</param>
/// <returns>Gutschein-Kampagne oder null, wenn nicht gefunden</returns>
Task<VoucherCampaign> GetByCartItemAsync(long cartItemId);
/// <summary>
/// Gibt einen Gutschein-Kampagne für einen Artikel in einer Bestellung zurück
/// </summary>
/// <param name="orderItemId">Id des Artikels in der Bestellung</param>
/// <returns>Gutschein-Kampagne oder null, wenn nicht gefunden</returns>
Task<VoucherCampaign> GetByOrderItemAsync(long orderItemId);
/// <summary>
/// Setzen des Status von Gutschein-Kampagnen nach Bestellung
/// </summary>
/// <param name="orderId">Id der Bestellung</param>
/// <param name="status">Zu setzender Status</param>
/// <returns>Anzahl betroffener Gutschein-Kampagnen</returns>
Task<int> SetStatusByOrderAsync(long orderId, VoucherCampaignStatus status);
/// <summary>
/// Setzen des Bezahlstatus von Gutschein-Kampagnen nach Bestellung
/// </summary>
/// <param name="orderId">Id der Bestellung</param>
/// <param name="status">Zu setzender Status</param>
/// <returns>Anzahl betroffener Gutschein-Kampagnen</returns>
Task<int> SetPaymentStatusByOrderAsync(long orderId, PaymentStatus status);
/// <summary>
/// Starten von gebuchten Gutschein-Kampagnen wenn diese das Start-Datum erreicht haben
/// </summary>
/// <returns>Anzahl gestartete Gutschein-Kampagnen</returns>
Task<int> StartBookedAsnyc();
/// <summary>
/// Stoppen von abgelaufenen Gutschein-Kampagnen wenn diese das Enddatum erreicht haben
/// </summary>
/// <returns>Anzahl gestoppte Gutschein-Kampagnen</returns>
Task<int> StopRunningAsync();
/// <summary>
/// Erstellen von Gutscheinen für eine Gutschein-Kampagne
/// </summary>
/// <param name="voucherCampaignId">Id der Kampagne</param>
/// <param name="userName">Der Benutzer der die Gutscheine angelegt hat</param>
/// <returns>Anzahl der erstellten Gutscheine</returns>
Task<int> CreateVouchersForCampaign(string voucherCampaignId, string userName);
/// <summary>
/// Prüft ob ein Präfix für eine Gutschein-Kampagne verfügbar ist
/// </summary>
/// <param name="prefix">Präfix der geprüft werden soll</param>
/// <param name="voucherCampaignId">Id der Kampagne die ignoriert werden soll</param>
/// <returns>true wenn verfügbar, false sonst</returns>
Task<bool> IsPrefixAvailableAsync(string prefix, string voucherCampaignId);
/// <summary>
/// Aktualisiert den Gutschein-Betrag für alle noch nicht eingelösten oder deaktivierten Gutscheine einer Kampagne
/// </summary>
/// <param name="voucherCampaignId">Id der Kampagne</param>
/// <param name="voucherAmmount">Wert der gesetzt werden soll</param>
/// <returns>Anzahl Gutscheine die betroffen sind</returns>
Task<int> UpdateVoucherAmmountAsync(string voucherCampaignId, decimal voucherAmmount);
/// <summary>
/// Löschen der Gutscheine und deren Verwendung für eine Kampagne
/// </summary>
/// <param name="voucherCampaignId">Id der Kampagne</param>
/// <returns>Anzahl gelöscht</returns>
Task<int> RemoveVouchersAsync(string voucherCampaignId);
/// <summary>
/// Gibt eine Liste von Gutscheinen für eine Kampagne zurück
/// </summary>
/// <param name="voucherCampaignId">Id der Kampagne</param>
/// <returns>Liste Gutscheine</returns>
Task<List<Voucher>> GetVouchersForCampaignAsync(string voucherCampaignId);
/// <summary>
/// Prüft ob ein manueller Gutscheincode für einen Benutzer gültig ist und eingesetzt werden kann
/// </summary>
/// <param name="code">Code</param>
/// <param name="appUserId">Id des AppUsers</param>
/// <returns>Validierungs-Ergebnis</returns>
Task<VoucherValidationResult> ValidateVoucherCodeAsync(string code, string appUserId);
/// <summary>
/// Gibt einen Gutschein anhand des Codes zurück
/// </summary>
/// <param name="code">Code des Gutscheins</param>
/// <returns>Gutschein oder null, wenn nicht gefunden</returns>
Task<Voucher> GetVoucherByCodeAsync(string code);
/// <summary>
/// Gibt einen Gutschein anhand des QR-Codes zurück
/// </summary>
/// <param name="qrCode">QR-Code des Gutscheins</param>
/// <returns>Gutschein oder null, wenn nicht gefunden</returns>
Task<Voucher> GetVoucherByQrCodeAsync(string qrCode);
/// <summary>
/// Reserviert einen Gutschein für einen Benutzer und einen Walk
/// </summary>
/// <param name="voucherId">Id des Vouchers</param>
/// <param name="appUserId">Id des AppUsers</param>
/// <param name="walkId">Id des Walks</param>
/// <param name="voucherAmmount">Wert des Gutscheins</param>
/// <param name="voucherAmmountUsed">Wert der verbraucht wurde. Kann kleiner Gutscheinwert sein</param>
/// <returns>VoucherUsage</returns>
Task<VoucherUsage> ReserveVoucherAsync(string voucherId, string? appUserId, string? walkId, decimal voucherAmmount, decimal voucherAmmountUsed);
/// <summary>
/// Löschen der Verwendung eines Gutscheins
/// </summary>
/// <param name="voucherUsage">VoucherUsage</param>
void RemoveUsage(VoucherUsage voucherUsage);
/// <summary>
/// Gibt die Verwendung eines Gutscheins zurück
/// </summary>
/// <param name="voucherId">Id des Gutscheins</param>
/// <param name="appUserId">Id des AppUsers</param>
/// <param name="walkId">Id des Walks</param>
/// <returns>VoucherUsage oder null, wenn nicht gefunden</returns>
Task<VoucherUsage> GetUsageAsync(string voucherId, string? appUserId, string? walkId);
/// <summary>
/// Gibt einen Gutschein zurück
/// </summary>
/// <param name="voucherId">Id des Gutscheins</param>
/// <returns>Voucher oder null, wenn nicht gefunden</returns>
Task<Voucher> GetVoucherAsync(string voucherId);
/// <summary>
/// Löschen von Voucher-Usages für einen AppUser
/// </summary>
/// <param name="appUserId">Id des AppUsers</param>
/// <returns>Anzahl gelöscht</returns>
Task<int> RemoveVoucherUsageForAppUserAsync(string appUserId);
}
/// <summary>
/// Schnittstellenbeschreibung für einen Service der die Verwaltung von Abonnements realisiert
/// </summary>
public interface ISubscriptionService : IService<Subscription>
{
/// <summary>
/// Gibt eine gefilterte Liste von Abonnements zurück
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener Abonnements</returns>
IQueryable<Subscription> Filter(string filter);
/// <summary>
/// Erstellen eines Abonnements
/// </summary>
/// <returns>Abonnement</returns>
Subscription Create();
/// <summary>
/// Gibt eine gefilterte Liste von Abonnements zurück.
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <returns>List betroffener Abonnements</returns>
Task<List<Subscription>> SearchAsync(string filter);
/// <summary>
/// Gibt eine gefilterte Liste von Abonnements mit Namen zurück in einer gewählten Sprache
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <param name="includeDeleted">Sollen gelöschte inkludiert werden?</param>
/// <returns>Liste betroffener Abonnements</returns>
IQueryable<SubscriptionWithNames> FilterWithNames(string filter, string language, string fallback, bool includeDeleted);
/// <summary>
/// Gibt eine Liste von Abonnements zurück, welche dem gesuchten AppMode entsprechend und aktiv sind
/// </summary>
/// <param name="appMode">Gesuchter App mode</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <returns>Liste Abonnements</returns>
Task<List<SubscriptionWithNames>> GetAllAsync(AppMode appMode, string language, string fallback);
/// <summary>
/// Gibt eine gefilterte Liste von Abonnements mit Namen zurück in einer gewählten Sprache
/// </summary>
/// <param name="filter">Filterbegriff der in bestimmten Feldern gesucht wird</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <returns>Liste betroffener Abonnements</returns>
IQueryable<AppUserSubscriptionWithNames> FilterAppUserSubscritionsWithNames(string filter, string language, string fallback);
/// <summary>
/// Gibt eine Liste von Abonnements zurück, welche ein App-User abonniert hat
/// </summary>
/// <param name="appUserId">App user id</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <returns>Liste betroffener Abonnement-Buchungen</returns>
Task<List<AppUserSubscriptionWithNames>> GetAllAppUserSubscriptionsAsync(string appUserId, string language, string fallback);
/// <summary>
/// Gibt eine Liste von Abonnements zurück, welche ein App-User abonniert hat die gültig und aktiv sind
/// </summary>
/// <param name="appUserId">App user id</param>
/// <param name="language">Gewünschte Sprache</param>
/// <param name="fallback">Fallback Sprache</param>
/// <returns>Liste betroffener Abonnement-Buchungen</returns>
Task<List<AppUserSubscriptionWithNames>> GetAllAppUserSubscriptionsValidAsync(string appUserId, string language, string fallback);
/// <summary>
/// Gibt eine Abonnementbuchung mit Namen zurück
/// </summary>
/// <param name="id">Id der Buchung</param>
/// <param name="language"></param>
/// <param name="fallback"></param>
/// <returns>AppUserSubscriptionWithNames</returns>
Task<AppUserSubscriptionWithNames> GetAppUserSubscriptionAsync(long id, string language, string fallback);
/// <summary>
/// Erstellen eines Abonnements für einen App-User
/// </summary>
/// <returns>Abonnement</returns>
AppUserSubscription CreateAppUserSubscription();
/// <summary>
/// Gibt ein App-User-Abonnement zurück
/// </summary>
/// <param name="id">AppUserSubcription id</param>
/// <returns>AppUserSubscription</returns>
Task<AppUserSubscription> GetAppUserSubscriptionAsync(long id);
/// <summary>
/// Gibt ein App-User-Abonnement zurück
/// </summary>
/// <param name="appUserId">App user id</param>
/// <param name="subscriptionId">Abo-Id</param>
/// <returns>AppUserSubscription oder null, wenn nicht gefunden</returns>
Task<AppUserSubscription> GetAppUserSubscriptionAsync(string appUserId, string subscriptionId);
/// <summary>
/// Fügt eine Entität zum Repository hinzu
/// </summary>
/// <param name="entity">Entität</param>
void AddAppUserSubscription(AppUserSubscription entity);
/// <summary>
/// Entfernt eine Entität aus dem Repository
/// </summary>
/// <param name="entity">Zu entfernende Entität</param>
void RemoveAppUserSubscription(AppUserSubscription entity);
/// <summary>
/// Prüft ob ein App-User ein Abonnement hat für einen AppMode das noch gültig ist
/// </summary>
/// <param name="appUserId">App user id</param>
/// <param name="appMode">AppMode</param>
/// <returns>true wenn ja, false else</returns>
Task<bool> AppUserHasActiveBookingAsync(string appUserId, AppMode appMode);
/// <summary>
/// Setzt Abo-Buchungen die abgelaufen sind auf ungültig
/// </summary>
/// <returns></returns>
Task<int> InvalidateExipredAppUserSubscriptionsAsync(DateTimeOffset date);
}
#region Helper
/// <summary>
/// Repräsentiert ein Validierungsergebnis für die Prüfung ob eine Listung möglich ist
/// </summary>
public class ListingValidationResult
{
/// <summary>
/// Validierung erfolgreich oder nicht?
/// </summary>
public bool Valid { get; set; }
/// <summary>
/// Wie viele Listungen für die Branche, den Listungstyp und den gewählten Zeitraum liegen vor
/// </summary>
public int Booked { get; set; }
/// <summary>
/// Wie viele Reservierungen liegen vor?
/// </summary>
public int Reserved { get; set; }
/// <summary>
/// Fehlercode, wenn nicht valide
/// </summary>
public ListingValidationError ErrorCode { get; set; }
}
/// <summary>
/// Validierungsfehler für die Prüfung ob eine Listung durchgeführt werden kann
/// </summary>
public enum ListingValidationError
{
/// <summary>
/// Kein FEhler
/// </summary>
None = 0,
/// <summary>
/// Listung nicht möglich da Kapazitäten verbraucht
/// </summary>
NoSlotsAvailable = 1,
/// <summary>
/// Vom Kunden bereits gebucht
/// </summary>
AlreadyBooked = 10
}
/// <summary>
/// Ergebnis einer Steuerberechnung
/// </summary>
public class TaxGrossResult
{
/// <summary>
/// Berechneter Wert
/// </summary>
public decimal Value { get; set; }
/// <summary>
/// Steuerstufe - z.B. 10% oder 20%
/// </summary>
public decimal TaxRate { get; set; }
/// <summary>
/// Wert für die Steuerstufe
/// </summary>
public decimal TaxValue { get; set; }
}
#endregion
}