コード例 #1
0
        public async Task <InternalTransferPaymentTransactionsDTO> MakeInternalTransferPaymentTransaction(string fromUniqueMasterCitizenNumber,
                                                                                                          string password,
                                                                                                          string toUniqueMasterCitizenNumber,
                                                                                                          decimal amount)
        {
            Wallet fromWallet = await CheckForWallet(fromUniqueMasterCitizenNumber, password);

            Wallet toWallet = await _unitOfWork.WalletRepository
                              .GetFirstWithIncludes(Wallet =>
                                                    Wallet.UniqueMasterCitizenNumber.Value == toUniqueMasterCitizenNumber,
                                                    Wallet => Wallet.PaymentTransactions
                                                    );

            if (toWallet == null)
            {
                throw new ArgumentException($"Wallet with unique master citizen number {toUniqueMasterCitizenNumber} doesn't exist");
            }
            IBankAPI bankAPI       = _bankAPIDeterminator.DeterminateBankAPI(fromWallet.SupportedBank);
            IBankAPI secondBankAPI = _bankAPIDeterminator.DeterminateBankAPI(toWallet.SupportedBank);

            InternalTransferPaymentTransactions paymentTransactions = fromWallet.MakeInternalTransfer(toWallet, amount);

            bool successWithdrawal = await bankAPI.Withdraw(fromUniqueMasterCitizenNumber, fromWallet.PostalIndexNumber, amount);

            if (!successWithdrawal)
            {
                CleanupWallets(fromWallet, toWallet, paymentTransactions);
                throw new BankAPIException("Bank api - failed to withdrawal");
            }
            bool successDeposit = await secondBankAPI.Withdraw(toUniqueMasterCitizenNumber, toWallet.PostalIndexNumber, amount);

            if (!successDeposit)
            {
                CleanupWallets(fromWallet, toWallet, paymentTransactions);
                throw new BankAPIException("Bank api - failed to deposit");
            }
            await _unitOfWork.PaymentTransactionRepository.Insert(paymentTransactions.Deposit);

            await _unitOfWork.PaymentTransactionRepository.Insert(paymentTransactions.Withdrawal);

            if (paymentTransactions.HasFee())
            {
                await _unitOfWork.PaymentTransactionRepository.Insert(paymentTransactions.Fee);
            }
            await _unitOfWork.SaveChangesAsync();

            return(new InternalTransferPaymentTransactionsDTO(paymentTransactions));
        }
コード例 #2
0
        public async Task <DepositPaymentTransactionDTO> MakeDepositPaymentTransaction(string uniqueMasterCitizenNumber,
                                                                                       string password,
                                                                                       decimal amount)
        {
            Wallet wallet = await CheckForWallet(uniqueMasterCitizenNumber, password);

            IBankAPI bankAPI = _bankAPIDeterminator.DeterminateBankAPI(wallet.SupportedBank);
            DepositPaymentTransaction depositPaymentTransaction = wallet.MakeDepositTransaction(amount);

            bool successWithdrawal = await bankAPI.Withdraw(uniqueMasterCitizenNumber, wallet.PostalIndexNumber, amount);

            if (!successWithdrawal)
            {
                wallet.DeletePaymentTransaction(depositPaymentTransaction);
                throw new BankAPIException("Bank api - failed to withdrawal");
            }

            await _unitOfWork.PaymentTransactionRepository.Insert(depositPaymentTransaction);

            await _unitOfWork.SaveChangesAsync();

            return(new DepositPaymentTransactionDTO(depositPaymentTransaction));
        }