using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.Json; using System.Threading.Tasks; using gehGassi.Core.Interfaces; using gehGassi.Domain.Common; using gehGassi.Domain.Payment; namespace gehGassi.Core.Services { /// /// Service der die Verwaltung von Zahlungstransaktionen ermöglicht /// public class PaymentTransactionService : ServiceBase, IPaymentTransactionService { /// /// Erstellt eine Instanz /// /// Instanz eines IUnitOfWork public PaymentTransactionService(IUnitOfWork unitOfWork) : base(unitOfWork) { } /// /// Erstellen einer Zahlungs-Transaktion /// /// Zahlungs-Transaktion public PaymentTransaction Create() { var item = new PaymentTransaction { Created = DateTimeOffset.UtcNow, ErrorMessage = string.Empty, ErrorType = string.Empty, ErrorMessages = string.Empty }; return item; } /// /// Gibt eine Transaktion anhand der MangoPay TransaktionsId zurück. /// Diese muss den entsprechenden TransaktionsTyp und Status haben /// /// Id der Transaktion bei MangoPay /// Typ der Transaktion /// Status der Transaktion /// Transaktion oder null, wenn nicht gefunden public async Task GetAsync(string transactionId, PaymentTransactionType type, PaymentTransactionStatus status) { return await Repository.FirstOrDefaultAsync(c => c.TransactionId == transactionId && c.Type == type && c.Status == status).ConfigureAwait(false); } /// /// 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 /// /// Id der Transaktion bei MangoPay /// Typ der Transaktion /// Transaktion oder null, wenn nicht gefunden public async Task GetAsync(string transactionId, PaymentTransactionType type) { var transactions = await Repository.FindAsync(c => c.TransactionId == transactionId && c.Type == type).ConfigureAwait(false); var transaction = transactions.MaxBy(c => c.Created); return transaction; } /// /// Erstellen einer Zahlungs-Transaktion /// /// Id der Transaktion bei MangoPay /// Typ der Transaktion /// Status der Transaktion /// Id des Walks /// Id des AppUsers der die Zahlung erhält /// Id des Wallets, auf das die Transaktion angewendet wird /// Id des AppUsers der die Zahlung veranlasst /// Id des Wallets, von dem die Transaktion ausgeht /// Betrag in der kleinsten Einheit der Währung /// Zusätzlich vom Guthabenkonto in der kleinsten Einheit der Währung /// Währung ISO 4217 Code /// Art der Zahlung /// Zahlungs-Transaktion public 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) { var item = new PaymentTransaction() { TransactionId = transactionId, Type = type, Status = status, WalkId = walkId, TargetAppUserId = targetAppUserId, TargetWalletId = targetWalletId, SourceAppUserId = sourceAppUserId, SourceWalletId = sourceWalletId, Ammount = ammount, FromCredit = fromCredit, Currency = currency, ErrorMessage = string.Empty, ErrorType = string.Empty, ErrorMessages = string.Empty, Created = DateTimeOffset.UtcNow, PayInType = payInType }; return item; } /// /// Erstellen einer Zahlungs-Transaktion mit Fehlern nach Mangopay /// /// Id der Transaktion bei MangoPay /// Typ der Transaktion /// Status der Transaktion /// Id des Walks /// Id des AppUsers der die Zahlung erhält /// Id des Wallets, auf das die Transaktion angewendet wird /// Id des AppUsers der die Zahlung veranlasst /// Id des Wallets, von dem die Transaktion ausgeht /// Betrag in der kleinsten Einheit der Währung /// Zusätzlich vom Guthabenkonto in der kleinsten Einheit der Währung /// Währung ISO 4217 Code /// Fehlermeldung Mangopay /// Fehlertyp nach Mangopay /// Fehlermledungen nach Mangopay - Zusatzinfo /// Art der Zahlung /// Zahlungs-Transaktion public 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 errorMessages, PayInType? payInType) { var item = new PaymentTransaction() { TransactionId = transactionId, Type = type, Status = status, WalkId = walkId, TargetAppUserId = targetAppUserId, TargetWalletId = targetWalletId, SourceAppUserId = sourceAppUserId, SourceWalletId = sourceWalletId, Ammount = ammount, FromCredit = fromCredit, Currency = currency, ErrorMessage = string.Empty, ErrorType = string.Empty, ErrorMessages = string.Empty, Created = DateTimeOffset.UtcNow, PayInType = payInType }; if (!string.IsNullOrEmpty(errorMessage)) { item.ErrorMessage = errorMessage.Length <= 500 ? errorMessage : errorMessage[..500]; } if (!string.IsNullOrEmpty(errorType)) { item.ErrorType = errorType.Length <= 255 ? errorType : errorType[..255]; } if (errorMessages != null && errorMessages.Any()) { item.ErrorMessages = JsonSerializer.Serialize(errorMessages); if (item.ErrorMessages.Length > 1000) { item.ErrorMessages = item.ErrorMessages[..1000]; } } return item; } } }