using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Diagnostics.SymbolStore; using System.Linq; using System.Text; using System.Threading.Tasks; using gehGassi.Domain.Common; using gehGassi.Domain.Payment; using Microsoft.VisualBasic.CompilerServices; using Newtonsoft.Json.Converters; namespace gehGassi.Core.Interfaces { /// /// Schnittstellenbeschreibung für einen Service der die Kommunikation mit MangoPay ermöglicht /// public interface IMangoPayService { /// /// ruft eine Test-Funktion auf /// /// Task Task TestAsync(); /// /// Erstellen eines Mangopay-Benutzers für einen App-User. /// /// Id des AppUsers /// Soll das Commit unterdrückt werden? /// MangoPayResult mit der ID des Mangopay-Users Task> CreateOwnerAsync(string appUserId, bool suppressCommit); /// /// Aktualisieren eines Mangopay-Benutzers für einen App-User /// /// Id des AppUsers /// true wenn erfolgreich, false sonst Task> UpdateOwnerAsync(string appUserId); /// /// Prüfen ob ein MangoPay-Benutzer existiert /// /// Id des Mangopay-Benutzers /// true wenn existent, false sonst Task> OwnerExistsAsync(string mangoPayUserId); /// /// Erstellt ein Wallet für einen AppUser mit einem bestimmten Typ. /// Wenn das Wallet schon existiert, wird es zurückgegeben. /// /// Id des AppUsers /// Typ des Wallets /// Wallet Task> CreateWalletAsync(string appUserId, WalletType walletType); /// /// Aktualisiert den Kontostand eines Wallets und gibt diesen zurück /// /// Id des AppUsers /// Typ des Wallets /// Wallet mit neuem Kontostand Task> GetWalletBalanceAsync(string appUserId, WalletType walletType); /// /// Aktualisiert den Kontostand eines Wallets und gibt diesen zurück /// /// Id des Wallets bei MangoPay /// Kontostand Task> GetWalletBalanceAsync(string walletId); /// /// Prüfen ob ein MangoPay-Wallet existiert /// /// Id des Mangopay-Wallets /// true wenn existent, false sonst Task> WalletExistsAsync(string walletId); /// /// Erstellt ein Bankkonto für einen AppUser /// /// Id des Benutzers bei MangoPay /// Name des Inhabers des Bankkontos /// Adresse des Inhabers des Bankkontos /// Iban des Bankkontos /// BIC des Bankkontos /// MangoPayResult mit der ID des Bankkontos Task> CreateBankAccountAsync(string mangoPayUserId, string ownerName, Address address, string iban, string bic); /// /// Gibt ein Bankkonto für einen App-User zurück /// /// Id des App-Users /// Id des Benutzers bei MangoPay /// Id des Bankkontos bei MangoPay /// MangoPayResult mit Bankkonto oder null, wenn keines gefunden Task> GetBankAccountAsync(string appUserId, string mangoPayUserId, string bankAccountId); /// /// Deaktiveren eines Bankkontos für einen App-User /// /// Id des Benutzers bei MangoPay /// Id des Bankkontos bei MangoPay /// true wenn erfolgreich, false sonst Task> DeactivateBankAccountAsync(string mangoPayUserId, string bankAccountId); /// /// Transferieren von Geld vom Guthaben-Konto zum Transaktions-Konto /// /// Id des App-Users /// Betrag der transferiert werden soll /// Tag der zum Transfer abgelegt werden soll /// true wenn erfolgreich, false sonst Task> TransferMoneyFromCreditToFeeAccountAsync(string appUserId, long ammount, string tag); /// /// Transferieren von Geld vom Transaktions-Konto zum Guthaben-Konto /// /// Id des App-Users /// Betrag der transferiert werden soll /// Tag der zum Transfer abgelegt werden soll /// true wenn erfolgreich, false sonst Task> TransferMoneyFromFeeToCreditAccountAsync(string appUserId, long ammount, string tag); /// /// Transferieren von Geld von einem Wallet zu einem anderen /// /// Quell-App-UserId /// Ziel-App-UserId /// Id des Walks /// Betrag der transferiert werden soll /// Gebühren an gehGassi /// Tag der zum Transfer abgelegt werden soll /// true wenn erfolgreich, false sonst Task> TransferMoneyAsync(string sourceAppUserId, string targetAppUserId, string walkId, long ammount, long fees, string tag); /// /// Transferiert Geld von einem Wallet zu einem anderen /// /// Id des Mangopayusers der zahlt /// Quellwallet Id /// Id des Mangopayusers der die Zahlung erhält /// Zielwallet Id /// Id des Walks - oder leer /// Betrag /// Optinal: Gebühren an gehGassi /// Tag der zum Transfer abgelegt werden soll /// Optional: Quell-App-UserId /// Optional: Ziel-App-UserId /// true wenn erfolgreich, false sonst Task> TransferMoneyAsync(string sourceMangopayUserId, string sourceWalletId, string targetMangopayUserId, string targetWalletId, string walkId, long ammount, long fees, string tag, string sourceAppUserId = "", string targetAppUserId = ""); /// /// Erstellen einer Kreditkarten-Einzahlung /// /// Id des App-Users /// Id des Walks /// Betrag der eingezahlt werden soll /// Gebühren die an gehgassi abgeführt werden /// Betrag der zusätzlich vom Guthabenkonto genommen werden muss /// Tag der zur Einzahlung abgelegt werden soll /// Return-Url für MangoPay /// MangopayResult mit einem string der eine ReturnUrl beinhaltet die die App öffnen muss Task> CreatePayInCardAsync(string appUserId, string walkId, long ammount, long fees, long fromCredit, string tag, string returnUrl); /// /// Erstellen einer Maestro-Einzahlung /// /// Id des App-Users /// Id des Walks /// Betrag der eingezahlt werden soll /// Gebühren die an gehgassi abgeführt werden /// Betrag der zusätzlich vom Guthabenkonto genommen werden muss /// Tag der zur Einzahlung abgelegt werden soll /// Return-Url für MangoPay /// MangopayResult mit einem string der eine ReturnUrl beinhaltet die die App öffnen muss Task> CreatePayInMaestroAsync(string appUserId, string walkId, long ammount, long fees, long fromCredit, string tag, string returnUrl); /// /// Erstellen einer Klarna-Einzahlung /// /// Id des App-Users /// Id des Walks /// Betrag der eingezahlt werden soll /// Gebühren die an gehgassi abgeführt werden /// Betrag der zusätzlich vom Guthabenkonto genommen werden muss /// Tag der zur Einzahlung abgelegt werden soll /// Return-Url für MangoPay /// MangopayResult mit einem string der eine ReturnUrl beinhaltet die die App öffnen muss Task> CreatePayInKlarnaAsync(string appUserId, string walkId, long ammount, long fees, long fromCredit, string tag, string returnUrl); /// /// Erstellen einer PayPal-Einzahlung /// /// Id des App-Users /// Id des Walks /// Betrag der eingezahlt werden soll /// Gebühren die an gehgassi abgeführt werden /// Betrag der zusätzlich vom Guthabenkonto genommen werden muss /// Tag der zur Einzahlung abgelegt werden soll /// Return-Url für MangoPay /// MangopayResult mit einem string der eine ReturnUrl beinhaltet die die App öffnen muss Task> CreatePayInPayPalAsync(string appUserId, string walkId, long ammount, long fees, long fromCredit, string tag, string returnUrl); /// /// Gibt eine Transaktion bei Mangopay zurück. /// Kann zum Prüfen des Status einer Transaktion verwendet werden. /// /// Id der Transaktion bei MangoPay /// MangoPayResult mit Transaktion Task> GetTransactionAsync(string mangoPayTransactionId); /// /// Erstellen eines Kyc-Dokuments /// /// Id des Users bei MangoPay /// Typ des Dokumentes /// Liste von Dateien als byte-Array /// MangoPayResult mit der ID des Dokumentes Task> CreateKycDocumentAsync(string mangoPayUserId, IdentityDocumentType type, List files); /// /// Gibt ein Kyc-Dokument zurück /// /// Id des Dokumentes bei MangoPay /// Kyc-Dokument Task> GetKycDocumentAsync(string documentId); /// /// Gibt eine Auszahlung zurück /// /// Id der Auszalhung /// MangoPayResult mit Auszahlung oder null, wenn nicht vorhanden Task> GetPayoutAsync(string payoutId); /// /// Erstellen einer Auszahlung /// /// Id des Users bei Mangopay /// Id des Wallets bei MangoPay /// Id der Bankverbindung bei MangoPay /// Summe die Ausgezahlt werden soll in der kleinsten Einheit /// TAG mit Referenz auf gehgassi /// MangoPayResult mit erstellter Auszahlung Task> CreatePayoutAsync(string mangoPayUserId, string mangoPayWalletId, string mangoPayBankId, long ammount, string tag); /// /// Gibt Infos zu einer Rückzahlung zurück /// /// Id der Rückzahlung /// MangoPayResult Task> GetRefundAsync(string refundId); /// /// Erstellen eines Legal-Mangopay-Benutzers für einen Kunden /// /// Id des Kunden /// Soll das Commit unterdrückt werden? /// MangoPayResult mit der ID des Mangopay-Users Task> CreateLegalOwnerAsync(long customerId, bool suppressCommit); /// /// Aktualisieren eines Mangopay-Benutzers für einen Kunden /// /// Id des Kunden /// true wenn erfolgreich, false sonst Task> UpdateLegalOwnerAsync(long customerId); /// /// Prüfen ob ein MangoPay-Benutzer für einen Kunden existiert /// /// Id des Mangopay-Benutzers des Kunden /// true wenn existent, false sonst Task> LegalOwnerExistsAsync(string mangoPayUserId); /// /// Erstellt ein Wallet für einen Kunden mit einem bestimmten Typ. /// /// Unique Id des Kunden /// Typ des Wallets /// Beschreibung /// Wallet Task> CreateWalletForCustomerAsync(string customerUniqueId, WalletType walletType, string description); } /// /// Ergebnis einer MangoPay-Operation /// public class MangoPayResult { /// /// Anfrage erfolgreich /// public bool Success { get; set; } /// /// Wenn nicht erfolgreich, Fehlermeldung /// public string ErrorMessage { get; set; } /// /// Wenn nicht erfolgreich, Fehlertyp /// public string ErrorType { get; set; } /// /// Wenn nicht erfolgreich, Fehlermeldungen /// public Dictionary ErrorMessages { get; set; } /// /// Rückgabe-Wert /// public T Value { get; set; } /// /// Erstellt eine Instanz /// public MangoPayResult() { Success = false; ErrorMessage = string.Empty; ErrorType = MangoPayErrorCodes.Err_None; ErrorMessages = new Dictionary(); Value = default(T); } } /// /// Fehlercodes bei MangoPay Operationen /// public static class MangoPayErrorCodes { public const string Err_None = "Err_None"; public const string Err_Unknown = "Err_Unknown"; public const string Err_AppUser_NotFound = "Err_AppUser_NotFound"; public const string Err_User_NotFound = "Err_User_NotFound"; public const string Err_User_Create_Exists = "Err_User_Create_Exists"; public const string Err_User_BirthDate = "Err_User_BirthDate"; public const string Err_User_Nationality = "Err_User_Nationality"; public const string Err_User_MainResidence = "Err_User_MainResidence"; public const string Err_User_Update_NotExists = "Err_User_Update_NotExists"; public const string Err_Wallet_NotExists = "Err_Wallet_NotExists"; public const string Err_Transfer_NotEnoughMoney = "Err_Transfer_NotEnoughMoney"; public const string Err_PayIn_Failed = "Err_PayIn_Failed"; public const string Err_Kyc_PageFailed = "Err_Kyc_PageFailed"; public const string Err_Kyc_DocumentFailed = "Err_Kyc_DocumentFailed"; public const string Err_PayOut_Failed = "Err_PayOut_Failed"; public const string Err_Refund_Failed = "Err_Refund_Failed"; public const string Err_Customer_DataMissing = "Err_Customer_DataMissing"; public const string Err_Customer_NotFound = "Err_Customer_NotFound"; } /// /// Repräsentiert eine Transaktion bei Mangopay /// public class MangoPayTransaction { /// /// Transaktions-ID /// public string TransactionId { get; set; } /// /// Id des Benutzers bei MangoPay der die Transaktion veranlasst hat /// public string AuthorId { get; set; } /// /// Id des Benutzers bei MangoPay der die Transaktion erhalten hat /// public string CreditedUserId { get; set; } /// /// Betrag der dem Benutzer abgezogen wurde, der die Transaktion veranlasst hat /// public long AmmountDebited { get; set; } /// /// Betrag der dem Benutzer gutgeschrieben wurde, der die Transaktion erhalten hat /// public long AmmountCredited { get; set; } /// /// Betrag der als Gebühr abgezogen wurde /// public long Fees { get; set; } /// /// Status der Transaktion /// public PaymentTransactionStatus Status { get; set; } /// /// Ergebniscode der Transaktion /// public string ResultCode { get; set; } /// /// Ergebnismeldung der Transaktion /// public string ResultMessage { get; set; } /// /// Datum der Ausführung /// public DateTimeOffset? ExecutionDate { get; set; } /// /// Transaktions-Typ /// public MangoPayTransactionType TransactionType { get; set; } /// /// Id des Wallets bei Mangopay das die Gutschrift erhalten hat /// public string CreditedWalletId { get; set; } /// /// Id des Wallets bei Mangopay das die Belastung erhalten hat /// public string DebitedWalletId { get; set; } /// /// Typ der Einzahlung /// public PayInType PayInType { get; set; } } /// /// Repräsentiert ein KYC-Dokument bei MangoPay /// public class MangoPayKycDocument { /// /// Id des Dokumentes /// public string DocumentId { get; set; } /// /// ID des MangoPay-Users /// public string UserId { get; set; } /// /// ID des Kyc-Dokuments /// public IdentityDocumentType Type { get; set; } /// /// Status des Kyc-Dokuments /// public IdentityDocumentStatus Status { get; set; } /// /// Typ der Ablehnung /// public string RefusedReasonType { get; set; } /// /// Meldung der Ablehnung /// public string RefusedReasonMessage { get; set; } /// /// Liste von Detail-Codes wenn ein Dokument abgelehnt wurde /// public List Flags { get; set; } /// /// Datum der Bearbeitung /// public DateTimeOffset? ProcessedDate { get; set; } } /// /// Repräsentiert eine Auszahlung bei Mangopay /// public class MangoPayPayout { /// /// Id der Auszahlung /// public string PayoutId { get; set; } /// /// ID des MangoPay-Users /// public string UserId { get; set; } /// /// Datum der Auführung /// public DateTimeOffset? ExecutionDate { get; set; } /// /// Result code. /// public string ResultCode { get; set; } /// /// The pre-authorization result message explaining the result code. /// public string ResultMessage { get; set; } /// /// Status der Transaktion /// public PaymentTransactionStatus Status { get; set; } } /// /// Repräsentiert eine Rückzahlung bei Mangopay /// public class MangoPayRefund { /// /// ID der Rücküberweisung /// public string RefundId { get; set; } /// /// ID der originalen Transaktion (Id der Auszahlungs-Transaktion) /// public string OriginalTransactionId { get; set; } /// /// Typ Grund für Rückzahlung /// [MaxLength(255)] public string RefundReasonType { get; set; } /// /// Beschreibung Grund Rückzahlung /// [MaxLength(255)] public string RefundReasonMessage { get; set; } /// /// Status der Transaktion /// public PaymentTransactionStatus Status { get; set; } } }