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