using System; using System.Collections.Generic; using System.Threading.Tasks; using gehGassi.Core.Interfaces; using gehGassi.Domain.Common; using gehGassi.Domain.Dogs; using gehGassi.Domain.Payment; using MangoPay.SDK; using MangoPay.SDK.Core; using MangoPay.SDK.Core.Enumerations; using MangoPay.SDK.Entities; using MangoPay.SDK.Entities.POST; using MangoPay.SDK.Entities.PUT; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Microsoft.Graph.Models; using Address = MangoPay.SDK.Entities.Address; using CardType = gehGassi.Domain.Common.CardType; namespace gehGassi.External.Services { /// /// Service der die Kommunikation mit MangoPay ermöglicht /// public class MangoPayService : IMangoPayService { private readonly ILogger _logger; private readonly IWalletService _walletService; private readonly IAppUserService _appUserService; private readonly IUserService _userService; private readonly IPaymentTransactionService _paymentTransactionService; private readonly ICustomerService _customerService; private readonly IWalkService _walkService; private readonly MangoPayApi _api; /// /// Erstellt eine Instanz /// /// Instanz von MangoPayOptions /// Instanz eines ILogger /// Instanz eines IWalletService /// Instanz eines IAppUserService /// Instanz eines IUserService /// Instanz eines IPaymentTransactionService /// Instanz eines ICustomerService /// Instanz eines IWalkService public MangoPayService(IOptions mangoPayOptions, ILogger logger, IWalletService walletService, IAppUserService appUserService, IUserService userService, IPaymentTransactionService paymentTransactionService, ICustomerService customerService, IWalkService walkService) { _logger = logger; _walletService = walletService; _appUserService = appUserService; _userService = userService; _paymentTransactionService = paymentTransactionService; _customerService = customerService; _walkService = walkService; _api = new MangoPayApi { Config = { ClientId = mangoPayOptions.Value.ClientId, ClientPassword = mangoPayOptions.Value.ApiKey, BaseUrl = mangoPayOptions.Value.BaseUrl } }; } /// /// ruft eine Test-Funktion auf /// /// Task public async Task TestAsync() { //florian@fm2.at UserId = "160864861", WalletId = "160911719" //var createResult = await _api.Users.CreateOwnerAsync(new UserNaturalOwnerPostDTO() //{ // FirstName = "Flo", // LastName = "Joe", // Email = "florian@fm2.at", // Address = new Address() // { // AddressLine1 = "Wolfsbauchweg 2", // AddressLine2 = string.Empty, // City = "Hall in Tirol", // Country = CountryIso.AT, // PostalCode = "6060", // Region = "Tirol" // }, // Birthday = new DateTime(1973, 12, 21, 0, 0, 0, DateTimeKind.Utc), // Nationality = CountryIso.AT, // CountryOfResidence = CountryIso.AT, // TermsAndConditionsAccepted = true, // UserCategory = UserCategory.PAYER //}, Guid.NewGuid().ToString()); //var id = createResult.Id; //var updateResult = await _api.Users.UpdateNaturalAsync(new UserNaturalPutDTO() //{ // Email = "florian@fm2.at", // UserCategory = UserCategory.OWNER, // Birthday = new DateTime(1973, 12, 21, 0, 0, 0, DateTimeKind.Utc), // CountryOfResidence = CountryIso.AT, // Nationality = CountryIso.AT //}, "160864861"); //var users = await _api.Users.GetAllAsync(); //var payoutResult = await _api.PayOuts.CreateBankWireAsync(new PayOutBankWirePostDTO("xxx", "yyy", new Money() { Amount = 100, Currency = CurrencyIso.EUR }, new Money() { Amount = 0, Currency = CurrencyIso.EUR },"xxx", "", PayoutModeRequested.STANDARD)); //payoutResult. //var x = await _api.Refunds.GetAsync("xxx"); //var x = await _api.Kyc.GetAsync("ddd"); //x.RefusedReasonType //var user = await _api.Users.GetAsync("160864861"); //var wallteCreateResult = await _api.Wallets.CreateAsync(new WalletPostDTO(new List { "160864861" }, "Flos Wallet", CurrencyIso.EUR)); //var walletId = wallteCreateResult.Id; //var cardRegistrationResult = await _api.CardRegistrations.CreateAsync(new CardRegistrationPostDTO("160864861", CurrencyIso.EUR, (MangoPay.SDK.Core.Enumerations.CardType)CardType.CB_VISA_MASTERCARD)); //var dict = new Dictionary(); //dict.Add("Content-Type", "application/x-www-form-urlencoded"); //dict.Add("accessKeyRef", cardRegistrationResult.AccessKey); //dict.Add("data", cardRegistrationResult.PreregistrationData); //dict.Add("cardNumber", "4970107111111119"); //dict.Add("cardExpirationDate", "1225"); //dict.Add("cardCvx", "111"); //// Execute post method //var httpClient = new HttpClient(); //using (var response = await httpClient.PostAsync(cardRegistrationResult.CardRegistrationURL, new FormUrlEncodedContent(dict))) //{ // if (response.IsSuccessStatusCode) // { // var responseString = await response.Content.ReadAsStringAsync(); // var updateResult = await _api.CardRegistrations.UpdateAsync(new CardRegistrationPutDTO() { RegistrationData = responseString }, cardRegistrationResult.Id); // var card = await _api.Cards.GetAsync(updateResult.CardId); // var muhu = card.Id; // } //} //var cardEx = await _api.Cards.GetAsync("164009448"); //var browserInfo = new BrowserInfo //{ // AcceptHeader = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8", // ColorDepth = 24, // JavaEnabled = true, // Language = "de-AT", // ScreenHeight = 900, // ScreenWidth = 1440, // TimeZoneOffset = "0", // UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36" //}; //var payInDto = new PayInCardDirectPostDTO(cardEx.UserId, cardEx.UserId, new Money() { Amount = 100, Currency = CurrencyIso.EUR }, new Money() { Amount = 1, Currency = CurrencyIso.EUR }, "160911719", "https://www.orf.at", cardEx.Id, "gehgassi", null, browserInfo); //payInDto.IpAddress = "127.0.0.1"; //var payinDirectResult = await _api.PayIns.CreateCardDirectAsync(payInDto); var muh = "kuh"; } /// /// 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 public async Task> CreateOwnerAsync(string appUserId, bool suppressCommit) { var result = new MangoPayResult(); var appUser = await _appUserService.GetAsync(appUserId); if (appUser != null) { if (!string.IsNullOrWhiteSpace(appUser.PaymentId)) { result.ErrorType = MangoPayErrorCodes.Err_User_Create_Exists; return result; } if (!appUser.BirthDate.HasValue) { result.ErrorType = MangoPayErrorCodes.Err_User_BirthDate; return result; } if (string.IsNullOrWhiteSpace(appUser.NationalityCode)) { result.ErrorType = MangoPayErrorCodes.Err_User_Nationality; return result; } if (string.IsNullOrWhiteSpace(appUser.MainResidenceCode)) { result.ErrorType = MangoPayErrorCodes.Err_User_MainResidence; return result; } var user = await _userService.GetByAppUserAsync(appUser.Id); if (user != null) { var request = new UserNaturalOwnerPostDTO() { FirstName = appUser.FirstName, LastName = appUser.LastName, Email = user.Email, Birthday = new DateTime(appUser.BirthDate.Value.Year, appUser.BirthDate.Value.Month, appUser.BirthDate.Value.Day, 0, 0, 0, DateTimeKind.Utc), Nationality = (CountryIso)Enum.Parse(typeof(CountryIso), appUser.NationalityCode), CountryOfResidence = (CountryIso)Enum.Parse(typeof(CountryIso), appUser.MainResidenceCode), TermsAndConditionsAccepted = appUser.PaymentTermsAccepted, UserCategory = UserCategory.OWNER }; if (appUser.Address != null && appUser.Address.ValidForPaymentProvider()) { var address = new Address() { AddressLine1 = appUser.Address.AddressLine1, AddressLine2 = appUser.Address.AddressLine2, City = appUser.Address.City, Country = (CountryIso)Enum.Parse(typeof(CountryIso), appUser.Address.CountryCode), PostalCode = appUser.Address.Zip, Region = appUser.Address.State }; request.Address = address; } try { var response = await _api.Users.CreateOwnerAsync(request); if (response != null) { appUser.PaymentId = response.Id; if (!suppressCommit) { appUser.UpdatedAt = DateTimeOffset.UtcNow; await _appUserService.CommitAsync("System"); } result.Success = true; result.Value = response.Id; } } catch (ResponseException ex) { result.ErrorMessage = ex.ResponseError.Message; result.ErrorType = ex.ResponseError.Type; result.ErrorMessages = ex.ResponseError.errors; } catch (Exception ex) { result.ErrorMessage = ex.Message; result.ErrorType = MangoPayErrorCodes.Err_Unknown; } } else { result.ErrorType = MangoPayErrorCodes.Err_User_NotFound; } } else { result.ErrorType = MangoPayErrorCodes.Err_AppUser_NotFound; } return result; } /// /// Aktualisieren eines Mangopay-Benutzers für einen App-User /// /// Id des AppUsers /// true wenn erfolgreich, false sonst public async Task> UpdateOwnerAsync(string appUserId) { var result = new MangoPayResult { Value = false }; var appUser = await _appUserService.GetAsync(appUserId); if (appUser != null) { if (string.IsNullOrWhiteSpace(appUser.PaymentId)) { result.ErrorType = MangoPayErrorCodes.Err_User_Update_NotExists; return result; } if (!appUser.BirthDate.HasValue) { result.ErrorType = MangoPayErrorCodes.Err_User_BirthDate; return result; } if (string.IsNullOrWhiteSpace(appUser.NationalityCode)) { result.ErrorType = MangoPayErrorCodes.Err_User_Nationality; return result; } if (string.IsNullOrWhiteSpace(appUser.MainResidenceCode)) { result.ErrorType = MangoPayErrorCodes.Err_User_MainResidence; return result; } var user = await _userService.GetByAppUserAsync(appUser.Id); if (user != null) { var request = new UserNaturalPutDTO() { FirstName = appUser.FirstName, LastName = appUser.LastName, Email = user.Email, Birthday = new DateTime(appUser.BirthDate.Value.Year, appUser.BirthDate.Value.Month, appUser.BirthDate.Value.Day, 0, 0, 0, DateTimeKind.Utc), Nationality = (CountryIso)Enum.Parse(typeof(CountryIso), appUser.NationalityCode), CountryOfResidence = (CountryIso)Enum.Parse(typeof(CountryIso), appUser.MainResidenceCode), TermsAndConditionsAccepted = appUser.PaymentTermsAccepted, UserCategory = UserCategory.OWNER }; if (appUser.Address != null && appUser.Address.ValidForPaymentProvider()) { var address = new Address() { AddressLine1 = appUser.Address.AddressLine1, AddressLine2 = appUser.Address.AddressLine2, City = appUser.Address.City, Country = (CountryIso)Enum.Parse(typeof(CountryIso), appUser.Address.CountryCode), PostalCode = appUser.Address.Zip, Region = appUser.Address.State }; request.Address = address; } try { var response = await _api.Users.UpdateNaturalAsync(request, appUser.PaymentId); if (response != null) { result.Success = true; result.Value = true; } } catch (ResponseException ex) { result.ErrorMessage = ex.ResponseError.Message; result.ErrorType = ex.ResponseError.Type; result.ErrorMessages = ex.ResponseError.errors; } catch (Exception ex) { result.ErrorMessage = ex.Message; result.ErrorType = MangoPayErrorCodes.Err_Unknown; } } else { result.ErrorType = MangoPayErrorCodes.Err_User_NotFound; } } else { result.ErrorType = MangoPayErrorCodes.Err_AppUser_NotFound; } return result; } /// /// Prüfen ob ein MangoPay-Benutzer existiert /// /// Id des Mangopay-Benutzers /// true wenn existent, false sonst public async Task> OwnerExistsAsync(string mangoPayUserId) { var result = new MangoPayResult { Value = false }; if (!string.IsNullOrWhiteSpace(mangoPayUserId)) { try { var response = await _api.Users.GetNaturalAsync(mangoPayUserId); if (response != null) { result.Success = true; result.Value = true; } } catch (ResponseException ex) { result.ErrorMessage = ex.ResponseError.Message; result.ErrorType = ex.ResponseError.Type; result.ErrorMessages = ex.ResponseError.errors; } catch (Exception ex) { result.ErrorMessage = ex.Message; result.ErrorType = MangoPayErrorCodes.Err_Unknown; } } else { result.ErrorType = MangoPayErrorCodes.Err_User_NotFound; } return result; } /// /// 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 public async Task> CreateWalletAsync(string appUserId, WalletType walletType) { var result = new MangoPayResult(); var appUser = await _appUserService.GetAsync(appUserId); if (appUser != null) { //Prüfen ob es bereits ein Wallet von diesem Typ für den AppUser gibt var existing = await _walletService.GetAsync(appUser.Id, walletType); if (existing == null) { //Zuerst versuchen das Wallet bei MangoPay anzulegen... //Wallet noch nicht vorhanden, also anlegen var request = new WalletPostDTO(new List() { appUser.PaymentId }, walletType.ToString(), CurrencyIso.EUR); try { var response = await _api.Wallets.CreateAsync(request); if (response != null) { var wallet = _walletService.Create(appUser.Id, response.Id, walletType, appUser.PaymentId, "EUR", walletType.ToString()); wallet.Balance = response.Balance.Amount; wallet.UpdatedAt = DateTimeOffset.UtcNow; _walletService.Add(wallet); await _walletService.CommitAsync("System"); result.Success = true; result.Value = wallet; } } catch (ResponseException ex) { result.ErrorMessage = ex.ResponseError.Message; result.ErrorType = ex.ResponseError.Type; result.ErrorMessages = ex.ResponseError.errors; } catch (Exception ex) { result.ErrorMessage = ex.Message; result.ErrorType = MangoPayErrorCodes.Err_Unknown; } } else { result.Success = true; result.Value = existing; } } else { result.ErrorType = MangoPayErrorCodes.Err_AppUser_NotFound; } return result; } /// /// Aktualisiert den Kontostand eines Wallets und gibt diesen zurück /// /// Id des AppUsers /// Typ des Wallets /// Wallet mit neuem Kontostand public async Task> GetWalletBalanceAsync(string appUserId, WalletType walletType) { var result = new MangoPayResult() { Value = null }; var appUser = await _appUserService.GetAsync(appUserId); if (appUser != null) { //Prüfen ob es bereits ein Wallet von diesem Typ für den AppUser gibt var wallet = await _walletService.GetAsync(appUser.Id, walletType); if (wallet != null) { try { var response = await _api.Wallets.GetAsync(wallet.WalletId); if (response != null) { wallet.Balance = response.Balance.Amount; wallet.UpdatedAt = DateTimeOffset.UtcNow; await _walletService.CommitAsync("System"); result.Success = true; result.Value = wallet; } } catch (ResponseException ex) { result.ErrorMessage = ex.ResponseError.Message; result.ErrorType = ex.ResponseError.Type; result.ErrorMessages = ex.ResponseError.errors; } catch (Exception ex) { result.ErrorMessage = ex.Message; result.ErrorType = MangoPayErrorCodes.Err_Unknown; } } else { result.ErrorType = MangoPayErrorCodes.Err_Wallet_NotExists; result.Value = null; } } else { result.ErrorType = MangoPayErrorCodes.Err_AppUser_NotFound; } return result; } /// /// Aktualisiert den Kontostand eines Wallets und gibt diesen zurück /// /// Id des Wallets bei MangoPay /// Kontostand public async Task> GetWalletBalanceAsync(string walletId) { var result = new MangoPayResult(); try { var response = await _api.Wallets.GetAsync(walletId); if (response != null) { result.Success = true; result.Value = response.Balance.Amount; } } catch (ResponseException ex) { result.ErrorMessage = ex.ResponseError.Message; result.ErrorType = ex.ResponseError.Type; result.ErrorMessages = ex.ResponseError.errors; } catch (Exception ex) { result.ErrorMessage = ex.Message; result.ErrorType = MangoPayErrorCodes.Err_Unknown; } return result; } /// /// Prüfen ob ein MangoPay-Wallet existiert /// /// Id des Mangopay-Wallets /// true wenn existent, false sonst public async Task> WalletExistsAsync(string walletId) { var result = new MangoPayResult { Value = false }; if (!string.IsNullOrWhiteSpace(walletId)) { try { var response = await _api.Wallets.GetAsync(walletId); if (response != null) { result.Success = true; result.Value = true; } } catch (ResponseException ex) { result.ErrorMessage = ex.ResponseError.Message; result.ErrorType = ex.ResponseError.Type; result.ErrorMessages = ex.ResponseError.errors; } catch (Exception ex) { result.ErrorMessage = ex.Message; result.ErrorType = MangoPayErrorCodes.Err_Unknown; } } else { result.ErrorType = MangoPayErrorCodes.Err_Wallet_NotExists; } return result; } /// /// 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 public async Task> CreateBankAccountAsync(string mangoPayUserId, string ownerName, Domain.Common.Address address, string iban, string bic) { var result = new MangoPayResult { Value = string.Empty }; if (!string.IsNullOrWhiteSpace(mangoPayUserId)) { try { var addressDto = new Address() { AddressLine1 = address.AddressLine1, AddressLine2 = address.AddressLine2, City = address.City, PostalCode = address.Zip, Country = (CountryIso)Enum.Parse(typeof(CountryIso), address.CountryCode), Region = address.State }; var request = new BankAccountIbanPostDTO(ownerName, addressDto, iban) { BIC = bic, Type = BankAccountType.IBAN, UserId = mangoPayUserId }; var response = await _api.Users.CreateBankAccountIbanAsync(mangoPayUserId, request); if (response != null) { result.Success = true; result.Value = response.Id; } } catch (ResponseException ex) { result.ErrorMessage = ex.ResponseError.Message; result.ErrorType = ex.ResponseError.Type; result.ErrorMessages = ex.ResponseError.errors; } catch (Exception ex) { result.ErrorMessage = ex.Message; result.ErrorType = MangoPayErrorCodes.Err_Unknown; } } else { result.ErrorType = MangoPayErrorCodes.Err_User_NotFound; } return result; } /// /// 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 public async Task> GetBankAccountAsync(string appUserId, string mangoPayUserId, string bankAccountId) { var result = new MangoPayResult { Value = null }; try { var response = await _api.Users.GetBankAccountIbanAsync(mangoPayUserId, bankAccountId); if (response != null) { result.Success = true; var bankAccount = new BankAccount { AppUserId = appUserId, PaymentId = mangoPayUserId, BankId = response.Id, OwnerName = response.OwnerName, Iban = response.IBAN, Bic = response.BIC, Address = new Domain.Common.Address() { AddressLine1 = response.OwnerAddress.AddressLine1, AddressLine2 = response.OwnerAddress.AddressLine2, City = response.OwnerAddress.City, Zip = response.OwnerAddress.PostalCode, CountryCode = response.OwnerAddress.Country.ToString(), State = response.OwnerAddress.Region } }; result.Value = bankAccount; } } catch (ResponseException ex) { result.ErrorMessage = ex.ResponseError.Message; result.ErrorType = ex.ResponseError.Type; result.ErrorMessages = ex.ResponseError.errors; } catch (Exception ex) { result.ErrorMessage = ex.Message; result.ErrorType = MangoPayErrorCodes.Err_Unknown; } return result; } /// /// Deaktiveren eines Bankkontos für einen App-User /// /// Id des Benutzers bei MangoPay /// Id des Bankkontos bei MangoPay /// true wenn erfolgreich, false sonst public async Task> DeactivateBankAccountAsync(string mangoPayUserId, string bankAccountId) { var result = new MangoPayResult { Value = false }; try { var putDto = new DisactivateBankAccountPutDTO() { Active = false }; var response = await _api.Users.UpdateBankAccountAsync(mangoPayUserId, putDto, bankAccountId); if (response != null) { result.Success = true; result.Value = response.Active == false; } } catch (ResponseException ex) { result.ErrorMessage = ex.ResponseError.Message; result.ErrorType = ex.ResponseError.Type; result.ErrorMessages = ex.ResponseError.errors; } catch (Exception ex) { result.ErrorMessage = ex.Message; result.ErrorType = MangoPayErrorCodes.Err_Unknown; } return result; } /// /// 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 public async Task> TransferMoneyFromCreditToFeeAccountAsync(string appUserId, long ammount, string tag) { var result = new MangoPayResult(); var appUser = await _appUserService.GetAsync(appUserId); if (appUser != null) { var creditsWalletResult = await GetWalletBalanceAsync(appUserId, WalletType.Credits); var feesWalletResult = await GetWalletBalanceAsync(appUserId, WalletType.Fees); if (creditsWalletResult.Success && feesWalletResult.Success) { var creditsWallet = creditsWalletResult.Value; var feesWallet = feesWalletResult.Value; if (creditsWallet.Balance >= ammount) { //Die Summe ist gedeckt. Transferieren try { var transferDto = new TransferPostDTO(appUser.PaymentId, appUser.PaymentId, new Money() { Amount = ammount, Currency = CurrencyIso.EUR }, new Money() { Amount = 0, Currency = CurrencyIso.EUR }, creditsWallet.WalletId, feesWallet.WalletId); transferDto.Tag = tag; var transferResponse = await _api.Transfers.CreateAsync(transferDto); if (transferResponse != null) { result.Success = true; result.Value = true; } } catch (ResponseException ex) { result.ErrorMessage = ex.ResponseError.Message; result.ErrorType = ex.ResponseError.Type; result.ErrorMessages = ex.ResponseError.errors; } catch (Exception ex) { result.ErrorMessage = ex.Message; result.ErrorType = MangoPayErrorCodes.Err_Unknown; } } else { result.ErrorType = MangoPayErrorCodes.Err_Transfer_NotEnoughMoney; } } else { result.ErrorMessage = creditsWalletResult.ErrorMessage; result.ErrorType = creditsWalletResult.ErrorType; result.ErrorMessages = creditsWalletResult.ErrorMessages; } } else { result.ErrorType = MangoPayErrorCodes.Err_AppUser_NotFound; } return result; } /// /// 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 public async Task> TransferMoneyFromFeeToCreditAccountAsync(string appUserId, long ammount, string tag) { var result = new MangoPayResult(); var appUser = await _appUserService.GetAsync(appUserId); if (appUser != null) { var creditsWalletResult = await GetWalletBalanceAsync(appUserId, WalletType.Credits); var feesWalletResult = await GetWalletBalanceAsync(appUserId, WalletType.Fees); if (creditsWalletResult.Success && feesWalletResult.Success) { var creditsWallet = creditsWalletResult.Value; var feesWallet = feesWalletResult.Value; if (feesWallet.Balance >= ammount) { //Die Summe ist gedeckt. Transferieren try { var transferDto = new TransferPostDTO(appUser.PaymentId, appUser.PaymentId, new Money() { Amount = ammount, Currency = CurrencyIso.EUR }, new Money() { Amount = 0, Currency = CurrencyIso.EUR }, feesWallet.WalletId, creditsWallet.WalletId); transferDto.Tag = tag; var transferResponse = await _api.Transfers.CreateAsync(transferDto); if (transferResponse != null) { result.Success = true; result.Value = true; } } catch (ResponseException ex) { result.ErrorMessage = ex.ResponseError.Message; result.ErrorType = ex.ResponseError.Type; result.ErrorMessages = ex.ResponseError.errors; } catch (Exception ex) { result.ErrorMessage = ex.Message; result.ErrorType = MangoPayErrorCodes.Err_Unknown; } } else { result.ErrorType = MangoPayErrorCodes.Err_Transfer_NotEnoughMoney; } } else { result.ErrorMessage = creditsWalletResult.ErrorMessage; result.ErrorType = creditsWalletResult.ErrorType; result.ErrorMessages = creditsWalletResult.ErrorMessages; } } else { result.ErrorType = MangoPayErrorCodes.Err_AppUser_NotFound; } return result; } /// /// 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 public async Task> TransferMoneyAsync(string sourceAppUserId, string targetAppUserId, string walkId, long ammount, long fees, string tag) { var result = new MangoPayResult(); var sourceAppUser = await _appUserService.GetAsync(sourceAppUserId); var targetAppUser = await _appUserService.GetAsync(targetAppUserId); if (sourceAppUser != null && targetAppUser != null) { var sourceWallet = await _walletService.GetAsync(sourceAppUserId, WalletType.Fees); var targetWallet = await _walletService.GetAsync(targetAppUserId, WalletType.Credits); if (sourceWallet != null && targetWallet != null) { try { var transferDto = new TransferPostDTO(sourceAppUser.PaymentId, targetAppUser.PaymentId, new Money() { Amount = ammount, Currency = CurrencyIso.EUR }, new Money() { Amount = fees, Currency = CurrencyIso.EUR }, sourceWallet.WalletId, targetWallet.WalletId); transferDto.Tag = tag; var transferResponse = await _api.Transfers.CreateAsync(transferDto); if (transferResponse != null) { result.Success = true; result.Value = true; var paymentTransaction = _paymentTransactionService.Create(transferResponse.Id, PaymentTransactionType.Pay, PaymentTransactionStatus.SUCCEEDED, walkId, targetAppUser.Id, targetWallet.Id, sourceAppUser.Id, sourceWallet.Id, ammount - fees, 0, CurrencyIso.EUR.ToString(), null); _paymentTransactionService.Add(paymentTransaction); await _paymentTransactionService.CommitAsync("System"); } } catch (ResponseException ex) { result.ErrorMessage = ex.ResponseError.Message; result.ErrorType = ex.ResponseError.Type; result.ErrorMessages = ex.ResponseError.errors; } catch (Exception ex) { result.ErrorMessage = ex.Message; result.ErrorType = MangoPayErrorCodes.Err_Unknown; } } else { result.ErrorType = MangoPayErrorCodes.Err_Wallet_NotExists; } } else { result.ErrorType = MangoPayErrorCodes.Err_AppUser_NotFound; } return result; } /// /// 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 public async Task> TransferMoneyAsync(string sourceMangopayUserId, string sourceWalletId, string targetMangopayUserId, string targetWalletId, string walkId, long ammount, long fees, string tag, string sourceAppUserId = "", string targetAppUserId = "") { var result = new MangoPayResult(); var sourceWallet = await _walletService.GetAsync(sourceWalletId); var targetWallet = await _walletService.GetAsync(targetWalletId); if (sourceWallet != null && targetWallet != null) { try { var transferDto = new TransferPostDTO(sourceMangopayUserId, targetMangopayUserId, new Money() { Amount = ammount, Currency = CurrencyIso.EUR }, new Money() { Amount = fees, Currency = CurrencyIso.EUR }, sourceWallet.WalletId, targetWallet.WalletId); transferDto.Tag = tag; var transferResponse = await _api.Transfers.CreateAsync(transferDto); if (transferResponse != null) { result.Success = true; result.Value = true; var paymentTransaction = _paymentTransactionService.Create(transferResponse.Id, PaymentTransactionType.Pay, PaymentTransactionStatus.SUCCEEDED, walkId, targetAppUserId, targetWallet.Id, sourceAppUserId, sourceWallet.Id, ammount - fees, 0, CurrencyIso.EUR.ToString(), null); _paymentTransactionService.Add(paymentTransaction); await _paymentTransactionService.CommitAsync("System"); } } catch (ResponseException ex) { result.ErrorMessage = ex.ResponseError.Message; result.ErrorType = ex.ResponseError.Type; result.ErrorMessages = ex.ResponseError.errors; } catch (Exception ex) { result.ErrorMessage = ex.Message; result.ErrorType = MangoPayErrorCodes.Err_Unknown; } } return result; } /// /// 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 public async Task> CreatePayInCardAsync(string appUserId, string walkId, long ammount, long fees, long fromCredit, string tag, string returnUrl) { var result = new MangoPayResult(); var appUser = await _appUserService.GetAsync(appUserId); if (appUser != null) { var wallet = await _walletService.GetAsync(appUserId, WalletType.Fees); if (wallet != null) { try { var payInDto = new PayInCardWebPostDTO(appUser.PaymentId, new Money() { Amount = ammount, Currency = CurrencyIso.EUR }, new Money() { Amount = fees, Currency = CurrencyIso.EUR }, wallet.WalletId, returnUrl, CultureCode.DE, (MangoPay.SDK.Core.Enumerations.CardType)CardType.CB_VISA_MASTERCARD, "gehgassi") { Tag = tag, SecureMode = SecureMode.FORCE }; var payInResult = await _api.PayIns.CreateCardWebAsync(payInDto); if (payInResult != null) { if (payInResult.Status == TransactionStatus.CREATED) { result.Success = true; result.Value = payInResult.RedirectURL; var paymentTransaction = _paymentTransactionService.Create(payInResult.Id, PaymentTransactionType.PayIn, PaymentTransactionStatus.CREATED, walkId, appUserId, wallet.Id, string.Empty, string.Empty, ammount - fees, fromCredit, CurrencyIso.EUR.ToString(), PayInType.CB_VISA_MASTERCARD); _paymentTransactionService.Add(paymentTransaction); await _paymentTransactionService.CommitAsync("System"); } else { result.Success = false; result.ErrorType = MangoPayErrorCodes.Err_PayIn_Failed; } } else { result.ErrorType = MangoPayErrorCodes.Err_PayIn_Failed; } } catch (ResponseException ex) { result.ErrorMessage = ex.ResponseError.Message; result.ErrorType = ex.ResponseError.Type; result.ErrorMessages = ex.ResponseError.errors; } catch (Exception ex) { result.ErrorMessage = ex.Message; result.ErrorType = MangoPayErrorCodes.Err_Unknown; } } else { result.ErrorType = MangoPayErrorCodes.Err_Wallet_NotExists; } } else { result.ErrorType = MangoPayErrorCodes.Err_AppUser_NotFound; } return result; } /// /// 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 public async Task> CreatePayInMaestroAsync(string appUserId, string walkId, long ammount, long fees, long fromCredit, string tag, string returnUrl) { var result = new MangoPayResult(); var appUser = await _appUserService.GetAsync(appUserId); if (appUser != null) { var wallet = await _walletService.GetAsync(appUserId, WalletType.Fees); if (wallet != null) { try { var payInDto = new PayInCardWebPostDTO(appUser.PaymentId, new Money() { Amount = ammount, Currency = CurrencyIso.EUR }, new Money() { Amount = fees, Currency = CurrencyIso.EUR }, wallet.WalletId, returnUrl, CultureCode.DE, (MangoPay.SDK.Core.Enumerations.CardType)CardType.MAESTRO, "gehgassi") { Tag = tag, SecureMode = SecureMode.FORCE }; var payInResult = await _api.PayIns.CreateCardWebAsync(payInDto); if (payInResult != null) { if (payInResult.Status == TransactionStatus.CREATED) { result.Success = true; result.Value = payInResult.RedirectURL; var paymentTransaction = _paymentTransactionService.Create(payInResult.Id, PaymentTransactionType.PayIn, PaymentTransactionStatus.CREATED, walkId, appUserId, wallet.Id, string.Empty, string.Empty, ammount - fees, fromCredit, CurrencyIso.EUR.ToString(), PayInType.MAESTRO); _paymentTransactionService.Add(paymentTransaction); await _paymentTransactionService.CommitAsync("System"); } else { result.Success = false; result.ErrorType = MangoPayErrorCodes.Err_PayIn_Failed; } } else { result.ErrorType = MangoPayErrorCodes.Err_PayIn_Failed; } } catch (ResponseException ex) { result.ErrorMessage = ex.ResponseError.Message; result.ErrorType = ex.ResponseError.Type; result.ErrorMessages = ex.ResponseError.errors; } catch (Exception ex) { result.ErrorMessage = ex.Message; result.ErrorType = MangoPayErrorCodes.Err_Unknown; } } else { result.ErrorType = MangoPayErrorCodes.Err_Wallet_NotExists; } } else { result.ErrorType = MangoPayErrorCodes.Err_AppUser_NotFound; } return result; } /// /// 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 public async Task> CreatePayInKlarnaAsync(string appUserId, string walkId, long ammount, long fees, long fromCredit, string tag, string returnUrl) { var result = new MangoPayResult(); var appUser = await _appUserService.GetAsync(appUserId); if (appUser != null) { var wallet = await _walletService.GetAsync(appUserId, WalletType.Fees); if (wallet != null) { try { var payInDto = new PayInDirectDebitPostDTO(appUser.PaymentId, new Money() { Amount = ammount, Currency = CurrencyIso.EUR }, new Money() { Amount = fees, Currency = CurrencyIso.EUR }, wallet.WalletId, returnUrl, CultureCode.DE, DirectDebitType.SOFORT) { Tag = tag }; var payInResult = await _api.PayIns.CreateDirectDebitAsync(payInDto); if (payInResult != null) { if (payInResult.Status == TransactionStatus.CREATED) { result.Success = true; result.Value = payInResult.RedirectURL; var paymentTransaction = _paymentTransactionService.Create(payInResult.Id, PaymentTransactionType.PayIn, PaymentTransactionStatus.CREATED, walkId, appUserId, wallet.Id, string.Empty, string.Empty, ammount - fees, fromCredit, CurrencyIso.EUR.ToString(), PayInType.KLARNA); _paymentTransactionService.Add(paymentTransaction); await _paymentTransactionService.CommitAsync("System"); } else { result.Success = false; result.ErrorType = MangoPayErrorCodes.Err_PayIn_Failed; } } else { result.ErrorType = MangoPayErrorCodes.Err_PayIn_Failed; } } catch (ResponseException ex) { result.ErrorMessage = ex.ResponseError.Message; result.ErrorType = ex.ResponseError.Type; result.ErrorMessages = ex.ResponseError.errors; } catch (Exception ex) { result.ErrorMessage = ex.Message; result.ErrorType = MangoPayErrorCodes.Err_Unknown; } } else { result.ErrorType = MangoPayErrorCodes.Err_Wallet_NotExists; } } else { result.ErrorType = MangoPayErrorCodes.Err_AppUser_NotFound; } return result; } /// /// 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 public async Task> CreatePayInPayPalAsync(string appUserId, string walkId, long ammount, long fees, long fromCredit, string tag, string returnUrl) { var result = new MangoPayResult(); var appUser = await _appUserService.GetAsync(appUserId); if (appUser != null) { var wallet = await _walletService.GetAsync(appUserId, WalletType.Fees); if (wallet != null) { var walk = await _walkService.GetWalkWithNamesAsync(walkId); if (walk != null) { try { var lineItem = new LineItem { Name = $"gehgassi {walk.ServiceType} - {walk.Start:g}", Quantity = 1, UnitAmount = ammount, TaxAmount = 0, Description = "gehgassi GmbH" }; var payInDto = new PayInPayPalWebPostDTO(appUser.PaymentId, new Money() { Amount = ammount, Currency = CurrencyIso.EUR }, new Money() { Amount = fees, Currency = CurrencyIso.EUR }, wallet.WalletId, returnUrl, [lineItem], null, "gehgassi", CultureCode.DE, ShippingPreference.NO_SHIPPING, tag, null); var payInResult = await _api.PayIns.CreatePayPalWebAsync(payInDto); if (payInResult != null) { if (payInResult.Status == TransactionStatus.CREATED) { result.Success = true; result.Value = payInResult.RedirectURL; var paymentTransaction = _paymentTransactionService.Create(payInResult.Id, PaymentTransactionType.PayIn, PaymentTransactionStatus.CREATED, walkId, appUserId, wallet.Id, string.Empty, string.Empty, ammount - fees, fromCredit, CurrencyIso.EUR.ToString(), PayInType.PAYPAL); _paymentTransactionService.Add(paymentTransaction); await _paymentTransactionService.CommitAsync("System"); } else { result.Success = false; result.ErrorType = MangoPayErrorCodes.Err_PayIn_Failed; } } else { result.ErrorType = MangoPayErrorCodes.Err_PayIn_Failed; } } catch (ResponseException ex) { result.ErrorMessage = ex.ResponseError.Message; result.ErrorType = ex.ResponseError.Type; result.ErrorMessages = ex.ResponseError.errors; } catch (Exception ex) { result.ErrorMessage = ex.Message; result.ErrorType = MangoPayErrorCodes.Err_Unknown; } } else { result.ErrorType = MangoPayErrorCodes.Err_AppUser_NotFound; } } else { result.ErrorType = MangoPayErrorCodes.Err_Wallet_NotExists; } } else { result.ErrorType = MangoPayErrorCodes.Err_AppUser_NotFound; } return result; } /// /// 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 public async Task> GetTransactionAsync(string mangoPayTransactionId) { var result = new MangoPayResult() { Value = null }; try { var transactionResult = await _api.PayIns.GetAsync(mangoPayTransactionId); if (transactionResult != null) { var transaction = new MangoPayTransaction { TransactionId = transactionResult.Id, AuthorId = transactionResult.AuthorId, CreditedUserId = transactionResult.CreditedUserId, CreditedWalletId = transactionResult.CreditedWalletId, AmmountCredited = transactionResult.CreditedFunds.Amount, AmmountDebited = transactionResult.DebitedFunds.Amount, Fees = transactionResult.Fees.Amount, Status = (PaymentTransactionStatus)transactionResult.Status, ResultCode = transactionResult.ResultCode, ResultMessage = transactionResult.ResultMessage }; if (transactionResult.ExecutionDate.HasValue) transaction.ExecutionDate = transactionResult.ExecutionDate.Value.ToUniversalTime(); else transaction.ExecutionDate = null; transaction.TransactionType = (MangoPayTransactionType)transactionResult.PaymentType; transaction.CreditedWalletId = transactionResult.CreditedWalletId; transaction.DebitedWalletId = transactionResult.DebitedWalletId; transaction.PayInType = (PayInType)transactionResult.PaymentType; result.Success = true; result.Value = transaction; } } catch (ResponseException ex) { result.ErrorMessage = ex.ResponseError.Message; result.ErrorType = ex.ResponseError.Type; result.ErrorMessages = ex.ResponseError.errors; } catch (Exception ex) { result.ErrorMessage = ex.Message; result.ErrorType = MangoPayErrorCodes.Err_Unknown; } return result; } /// /// Erstellen eines Kyc-Dokuments /// /// Id des Users bei MangoPay /// Typ des Dokumentes /// Liste von Dateien als byte-Array /// MangoPayResult mit der ID des Dokumentes public async Task> CreateKycDocumentAsync(string mangoPayUserId, IdentityDocumentType type, List files) { var result = new MangoPayResult() { Value = string.Empty }; try { //Erstellen eines Kyc-Dokuments var createKycDocumentResult = await _api.Users.CreateKycDocumentAsync(mangoPayUserId, (KycDocumentType)type); if (createKycDocumentResult != null && createKycDocumentResult.Status == KycStatus.CREATED) { var documentId = createKycDocumentResult.Id; var pagesSuccess = true; foreach (var file in files) { if (pagesSuccess) { try { await _api.Users.CreateKycPageAsync(mangoPayUserId, documentId, file); } catch (Exception ex) { pagesSuccess = false; result.ErrorMessage = ex.Message; result.ErrorType = MangoPayErrorCodes.Err_Kyc_PageFailed; } } } if (pagesSuccess) { var updateKycDocumentResult = await _api.Users.UpdateKycDocumentAsync(mangoPayUserId, new KycDocumentPutDTO() { Status = KycStatus.VALIDATION_ASKED }, documentId); if (updateKycDocumentResult != null && updateKycDocumentResult.Status == KycStatus.VALIDATION_ASKED) { result.Success = true; result.Value = documentId; } else { result.ErrorType = MangoPayErrorCodes.Err_Kyc_DocumentFailed; } } } } catch (ResponseException ex) { result.ErrorMessage = ex.ResponseError.Message; result.ErrorType = ex.ResponseError.Type; result.ErrorMessages = ex.ResponseError.errors; } catch (Exception ex) { result.ErrorMessage = ex.Message; result.ErrorType = MangoPayErrorCodes.Err_Unknown; } return result; } /// /// Gibt ein Kyc-Dokument zurück /// /// Id des Dokumentes bei MangoPay /// Kyc-Dokument public async Task> GetKycDocumentAsync(string documentId) { var result = new MangoPayResult() { Value = null }; try { var getDocumentResult = await _api.Kyc.GetAsync(documentId); if (getDocumentResult != null) { var document = new MangoPayKycDocument(); document.DocumentId = getDocumentResult.Id; document.UserId = getDocumentResult.UserId; document.Type = (IdentityDocumentType)getDocumentResult.Type; document.Status = (IdentityDocumentStatus)getDocumentResult.Status; document.RefusedReasonType = getDocumentResult.RefusedReasonType; document.RefusedReasonMessage = getDocumentResult.RefusedReasonMessage; if(getDocumentResult.ProcessedDate.HasValue) document.ProcessedDate = getDocumentResult.ProcessedDate.Value.ToUniversalTime(); else document.ProcessedDate = null; document.Flags = getDocumentResult.Flags; result.Success = true; result.Value = document; } } catch (ResponseException ex) { result.ErrorMessage = ex.ResponseError.Message; result.ErrorType = ex.ResponseError.Type; result.ErrorMessages = ex.ResponseError.errors; } catch (Exception ex) { result.ErrorMessage = ex.Message; result.ErrorType = MangoPayErrorCodes.Err_Unknown; } return result; } /// /// Gibt eine Auszahlung zurück /// /// Id der Auszalhung /// MangoPayResult mit Auszahlung oder null, wenn nicht vorhanden public async Task> GetPayoutAsync(string payoutId) { var result = new MangoPayResult() { Value = null }; try { var getPayoutResult = await _api.PayOuts.GetAsync(payoutId); if (getPayoutResult != null) { var payout = new MangoPayPayout(); payout.PayoutId = getPayoutResult.Id; payout.UserId = getPayoutResult.CreditedUserId; payout.Status = (PaymentTransactionStatus)getPayoutResult.Status; payout.ResultCode = getPayoutResult.ResultCode; payout.ResultMessage = getPayoutResult.ResultMessage; if (getPayoutResult.ExecutionDate.HasValue) payout.ExecutionDate = getPayoutResult.ExecutionDate.Value.ToUniversalTime(); else payout.ExecutionDate = null; result.Success = true; result.Value = payout; } } catch (ResponseException ex) { result.ErrorMessage = ex.ResponseError.Message; result.ErrorType = ex.ResponseError.Type; result.ErrorMessages = ex.ResponseError.errors; } catch (Exception ex) { result.ErrorMessage = ex.Message; result.ErrorType = MangoPayErrorCodes.Err_Unknown; } return result; } /// /// 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 public async Task> CreatePayoutAsync(string mangoPayUserId, string mangoPayWalletId, string mangoPayBankId, long ammount, string tag) { var result = new MangoPayResult(); try { var payOutDto = new PayOutBankWirePostDTO(mangoPayUserId, mangoPayWalletId, new Money() { Amount = ammount, Currency = CurrencyIso.EUR }, new Money() { Amount = 0, Currency = CurrencyIso.EUR }, mangoPayBankId, "gehgassi", PayoutModeRequested.STANDARD) { Tag = tag }; var payOutResult = await _api.PayOuts.CreateBankWireAsync(payOutDto); if (payOutResult != null) { var payout = new MangoPayPayout(); payout.PayoutId = payOutResult.Id; payout.UserId = payOutResult.CreditedUserId; payout.Status = (PaymentTransactionStatus)payOutResult.Status; payout.ResultCode = payOutResult.ResultCode; payout.ResultMessage = payOutResult.ResultMessage; if (payOutResult.ExecutionDate.HasValue) payout.ExecutionDate = payOutResult.ExecutionDate.Value.ToUniversalTime(); else payout.ExecutionDate = null; result.Success = true; result.Value = payout; } else { result.ErrorType = MangoPayErrorCodes.Err_PayOut_Failed; } } catch (ResponseException ex) { result.ErrorMessage = ex.ResponseError.Message; result.ErrorType = ex.ResponseError.Type; result.ErrorMessages = ex.ResponseError.errors; } catch (Exception ex) { result.ErrorMessage = ex.Message; result.ErrorType = MangoPayErrorCodes.Err_Unknown; } return result; } /// /// Gibt Infos zu einer Rückzahlung zurück /// /// Id der Rückzahlung /// MangoPayResult public async Task> GetRefundAsync(string refundId) { var result = new MangoPayResult(); try { var refundResult = await _api.Refunds.GetAsync(refundId); if (refundResult != null) { if (refundResult.Status == TransactionStatus.SUCCEEDED) { var refund = new MangoPayRefund(); refund.RefundId = refundResult.Id; refund.OriginalTransactionId = refundResult.InitialTransactionId; refund.RefundReasonType = refundResult.RefundReason.RefundReasonType; refund.RefundReasonMessage = refundResult.RefundReason.RefundReasonMessage; refund.Status = (PaymentTransactionStatus)refundResult.Status; result.Success = true; result.Value = refund; } else { result.Success = false; result.ErrorType = MangoPayErrorCodes.Err_Refund_Failed; } } else { result.ErrorType = MangoPayErrorCodes.Err_Refund_Failed; } } catch (ResponseException ex) { result.ErrorMessage = ex.ResponseError.Message; result.ErrorType = ex.ResponseError.Type; result.ErrorMessages = ex.ResponseError.errors; } catch (Exception ex) { result.ErrorMessage = ex.Message; result.ErrorType = MangoPayErrorCodes.Err_Unknown; } return result; } /// /// 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 public async Task> CreateLegalOwnerAsync(long customerId, bool suppressCommit) { var result = new MangoPayResult(); var customer = await _customerService.GetAsync(customerId); if (customer != null) { var hasMangopayData = customer.HasDataForMangopay(); if (!hasMangopayData) { result.ErrorType = MangoPayErrorCodes.Err_Customer_DataMissing; return result; } var request = new UserLegalOwnerPostDTO() { HeadquartersAddress = new Address() { AddressLine1 = customer.Address.AddressLine1, AddressLine2 = customer.Address.AddressLine2, City = customer.Address.City, Country = (CountryIso)Enum.Parse(typeof(CountryIso), customer.Address.CountryCode), PostalCode = customer.Address.Zip, Region = customer.Address.State }, Name = customer.MangopayCompanyName, LegalPersonType = LegalPersonType.ORGANIZATION, LegalRepresentativeFirstName = customer.MangopayContactFirstName, LegalRepresentativeLastName = customer.MangopayContactLastName, LegalRepresentativeEmail = customer.MangopayContactEmail, LegalRepresentativeBirthday = new DateTime(customer.MangopayContactBirthdate.Value.Year, customer.MangopayContactBirthdate.Value.Month, customer.MangopayContactBirthdate.Value.Day, 0, 0, 0, DateTimeKind.Utc), LegalRepresentativeNationality = (CountryIso)Enum.Parse(typeof(CountryIso), customer.MangopayContactNationality), LegalRepresentativeCountryOfResidence = (CountryIso)Enum.Parse(typeof(CountryIso), customer.MangopayContactMainResidenceCode), CompanyNumber = customer.MangopayRegistrationNumber, Email = customer.MangopayEmail, TermsAndConditionsAccepted = customer.MangopayTermsAccepted, UserCategory = UserCategory.OWNER }; try { var response = await _api.Users.CreateOwnerAsync(request); if (response != null) { customer.MangopayPaymentId = response.Id; customer.MangopayIdCreated = true; if (!suppressCommit) { await _appUserService.CommitAsync("System"); } result.Success = true; result.Value = response.Id; } } catch (ResponseException ex) { result.ErrorMessage = ex.ResponseError.Message; result.ErrorType = ex.ResponseError.Type; result.ErrorMessages = ex.ResponseError.errors; } catch (Exception ex) { result.ErrorMessage = ex.Message; result.ErrorType = MangoPayErrorCodes.Err_Unknown; } } else { result.ErrorType = MangoPayErrorCodes.Err_AppUser_NotFound; } return result; } /// /// Aktualisieren eines Mangopay-Benutzers für einen Kunden /// /// Id des Kunden /// true wenn erfolgreich, false sonst public async Task> UpdateLegalOwnerAsync(long customerId) { var result = new MangoPayResult { Value = false }; var customer = await _customerService.GetAsync(customerId); if (customer != null) { var hasMangopayData = customer.HasDataForMangopay(); if (!hasMangopayData) { result.ErrorType = MangoPayErrorCodes.Err_Customer_DataMissing; return result; } var request = new UserLegalPutDTO() { HeadquartersAddress = new Address() { AddressLine1 = customer.Address.AddressLine1, AddressLine2 = customer.Address.AddressLine2, City = customer.Address.City, Country = (CountryIso)Enum.Parse(typeof(CountryIso), customer.Address.CountryCode), PostalCode = customer.Address.Zip, Region = customer.Address.State }, Name = customer.MangopayCompanyName, LegalPersonType = LegalPersonType.ORGANIZATION, LegalRepresentativeFirstName = customer.MangopayContactFirstName, LegalRepresentativeLastName = customer.MangopayContactLastName, LegalRepresentativeEmail = customer.MangopayContactEmail, LegalRepresentativeBirthday = new DateTime(customer.MangopayContactBirthdate.Value.Year, customer.MangopayContactBirthdate.Value.Month, customer.MangopayContactBirthdate.Value.Day, 0, 0, 0, DateTimeKind.Utc), LegalRepresentativeNationality = (CountryIso)Enum.Parse(typeof(CountryIso), customer.MangopayContactNationality), LegalRepresentativeCountryOfResidence = (CountryIso)Enum.Parse(typeof(CountryIso), customer.MangopayContactMainResidenceCode), CompanyNumber = customer.MangopayRegistrationNumber, Email = customer.MangopayEmail, TermsAndConditionsAccepted = customer.MangopayTermsAccepted, UserCategory = UserCategory.OWNER }; try { var response = await _api.Users.UpdateLegalAsync(request, customer.MangopayPaymentId); if (response != null) { result.Success = true; result.Value = true; } } catch (ResponseException ex) { result.ErrorMessage = ex.ResponseError.Message; result.ErrorType = ex.ResponseError.Type; result.ErrorMessages = ex.ResponseError.errors; } catch (Exception ex) { result.ErrorMessage = ex.Message; result.ErrorType = MangoPayErrorCodes.Err_Unknown; } } else { result.ErrorType = MangoPayErrorCodes.Err_AppUser_NotFound; } return result; } /// /// Prüfen ob ein MangoPay-Benutzer für einen Kunden existiert /// /// Id des Mangopay-Benutzers des Kunden /// true wenn existent, false sonst public async Task> LegalOwnerExistsAsync(string mangoPayUserId) { var result = new MangoPayResult { Value = false }; if (!string.IsNullOrWhiteSpace(mangoPayUserId)) { try { var response = await _api.Users.GetLegalAsync(mangoPayUserId); if (response != null) { result.Success = true; result.Value = true; } } catch (ResponseException ex) { result.ErrorMessage = ex.ResponseError.Message; result.ErrorType = ex.ResponseError.Type; result.ErrorMessages = ex.ResponseError.errors; } catch (Exception ex) { result.ErrorMessage = ex.Message; result.ErrorType = MangoPayErrorCodes.Err_Unknown; } } else { result.ErrorType = MangoPayErrorCodes.Err_User_NotFound; } return result; } /// /// Erstellt ein Wallet für einen Kunden mit einem bestimmten Typ. /// /// Unique Id des Kunden /// Typ des Wallets /// Beschreibung /// Wallet public async Task> CreateWalletForCustomerAsync(string customerUniqueId, WalletType walletType, string description) { var result = new MangoPayResult(); var customer = await _customerService.GetByUniqueIdAsync(Guid.Parse(customerUniqueId)); if (customer != null) { //Zuerst versuchen das Wallet bei MangoPay anzulegen... //Wallet noch nicht vorhanden, also anlegen var request = new WalletPostDTO(new List() { customer.MangopayPaymentId },description, CurrencyIso.EUR); try { var response = await _api.Wallets.CreateAsync(request); if (response != null) { var wallet = _walletService.Create(customerUniqueId, response.Id, walletType, customer.MangopayPaymentId, "EUR", description); wallet.Balance = response.Balance.Amount; wallet.UpdatedAt = DateTimeOffset.UtcNow; _walletService.Add(wallet); await _walletService.CommitAsync("System"); result.Success = true; result.Value = wallet; } } catch (ResponseException ex) { result.ErrorMessage = ex.ResponseError.Message; result.ErrorType = ex.ResponseError.Type; result.ErrorMessages = ex.ResponseError.errors; } catch (Exception ex) { result.ErrorMessage = ex.Message; result.ErrorType = MangoPayErrorCodes.Err_Unknown; } } else { result.ErrorType = MangoPayErrorCodes.Err_Customer_NotFound; } return result; } } }