161 lines
6.5 KiB
C#
161 lines
6.5 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
using gehGassi.Common.Extensions;
|
|
using gehGassi.Core.Interfaces;
|
|
using gehGassi.Domain.Common;
|
|
using gehGassi.Domain.Payment;
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
|
namespace gehGassi.Core.Services
|
|
{
|
|
/// <summary>
|
|
/// Service der die Verwaltung von Auszahlungen ermöglicht
|
|
/// </summary>
|
|
public class PayoutService : ServiceBase<Payout>, IPayoutService
|
|
{
|
|
/// <summary>
|
|
/// Erstellt eine Instanz
|
|
/// </summary>
|
|
/// <param name="unitOfWork">Instanz eine IUnitOfWork</param>
|
|
public PayoutService(IUnitOfWork unitOfWork) : base(unitOfWork)
|
|
{
|
|
}
|
|
|
|
/// <summary>
|
|
/// Erstellen einer Auszahlung
|
|
/// </summary>
|
|
/// <returns>Payout</returns>
|
|
public Payout Create()
|
|
{
|
|
var item = new Payout()
|
|
{
|
|
Id = Guid.NewGuid().ToString("N"),
|
|
Created = DateTimeOffset.UtcNow
|
|
};
|
|
return item;
|
|
}
|
|
|
|
/// <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>
|
|
public Payout Create(string appUserId, string mangoPayUserId, string mangoPayId, string walletId, string mangoPayWalletId, string mangoPayBankId, string iban, string bic, long ammount, string currency)
|
|
{
|
|
var item = Create();
|
|
item.AppUserId = appUserId;
|
|
item.MangoPayUserId = mangoPayUserId;
|
|
item.MangoPayId = mangoPayId;
|
|
item.WalletId = walletId;
|
|
item.MangoPayWalletId = mangoPayWalletId;
|
|
item.MangoPayBankId = mangoPayBankId;
|
|
item.Iban = iban;
|
|
item.Bic = bic;
|
|
item.Ammount = ammount;
|
|
item.Currency = currency;
|
|
return item;
|
|
}
|
|
|
|
/// <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>
|
|
public async Task<List<Payout>> GetForSyncAppAsync(string appUserId, DateTimeOffset? lastUpdate)
|
|
{
|
|
var query = Repository.Query(c => c.AppUserId == appUserId);
|
|
|
|
if (lastUpdate.HasValue)
|
|
query = query.Where(c => c.UpdatedAt > lastUpdate);
|
|
|
|
return await query.ToListAsync().ConfigureAwait(false);
|
|
}
|
|
|
|
/// <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>
|
|
public async Task<Payout> GetByMangoPayIdAsync(string mangoPayId)
|
|
{
|
|
var item = await Repository.FirstOrDefaultAsync(c => c.MangoPayId == mangoPayId).ConfigureAwait(false);
|
|
return item;
|
|
}
|
|
|
|
/// <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>
|
|
public async Task<(int total, List<Payout> list)> GetAsync(string appUserId, List<DynamicSortOrder> sortList, int skip, int take)
|
|
{
|
|
var baseQuery = Repository.Query(c => c.AppUserId == appUserId);
|
|
var total = await baseQuery.CountAsync().ConfigureAwait(false);
|
|
|
|
if (sortList.Any())
|
|
{
|
|
var isFirst = true;
|
|
var orderedBaseQuery = baseQuery.SpecialOrderBy(sortList.First().Property, sortList.First().SortDirection); ;
|
|
foreach (var sortOrder in sortList)
|
|
{
|
|
if (isFirst)
|
|
{
|
|
isFirst = false;
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
orderedBaseQuery = orderedBaseQuery.SpecialThenBy(sortOrder.Property, sortOrder.SortDirection);
|
|
}
|
|
}
|
|
var list = await orderedBaseQuery.ToListAsync().ConfigureAwait(false);
|
|
return (total, list);
|
|
}
|
|
else
|
|
{
|
|
var list = await baseQuery.OrderByDescending(c => c.Created).Skip(skip).Take(take).ToListAsync().ConfigureAwait(false);
|
|
return (total, list);
|
|
}
|
|
}
|
|
|
|
/// <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>
|
|
public async Task<Payout> GetLastPayoutAsync(string appUserId)
|
|
{
|
|
var lastPayout = await Repository.Query(c => c.AppUserId == appUserId).OrderByDescending(c => c.Created).FirstOrDefaultAsync();
|
|
return lastPayout;
|
|
}
|
|
|
|
/// <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>
|
|
public async Task<int> CountPayoutsInTimeRangeAsync(string appUserId, DateTimeOffset startDate, DateTimeOffset endDate)
|
|
{
|
|
return await Repository.Query(c => c.AppUserId == appUserId && c.Created >= startDate && c.Created <= endDate).CountAsync().ConfigureAwait(false);
|
|
}
|
|
}
|
|
}
|