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