Exemple #1
0
        void ProcessOrderChain(BrokerOrder order)
        {
            // check wallet has been updated
            var time = _walletProvider.LastBlockchainWalletUpdate(order.AssetSend);

            if (time < DateTimeOffset.Now.AddMinutes(-(_apiSettings.Broker.TimeLimitGracePeriod / 2)))
            {
                _logger.LogWarning($"Not processing broker order ({order.Token}) as the wallet ({order.AssetSend}) was not updated since {time}");
                return;
            }

            // get broker user
            var brokerUser = _userManager.FindByNameAsync(_apiSettings.Broker.BrokerTag).GetAwaiter().GetResult();

            if (brokerUser == null)
            {
                _logger.LogError("Failed to find broker user");
                return;
            }

            // get order user
            var user = _userManager.FindByIdAsync(order.ApplicationUserId).GetAwaiter().GetResult();

            if (user == null)
            {
                _logger.LogError($"Failed to find order user ('{order.ApplicationUserId}')");
                return;
            }

            if (order.Status == BrokerOrderStatus.Ready.ToString() || order.Status == BrokerOrderStatus.Incomming.ToString())
            {
                CheckTxs(brokerUser, user, order);
            }
            else if (order.Status == BrokerOrderStatus.Confirmed.ToString())
            {
                if (FiatWithdrawToCustomer(brokerUser, order))
                {
                    order.Status = BrokerOrderStatus.PayoutWait.ToString();
                    _context.BrokerOrders.Update(order);
                    _logger.LogError($"Sent fiat for order ('{order.Token}')");
                }
                else
                {
                    _logger.LogError($"failed to send fiat for order ({order.Token})");
                }
            }
            else if (order.Status == BrokerOrderStatus.PayoutWait.ToString())
            {
                var bow = _context.BrokerOrderFiatWithdrawals.SingleOrDefault(o => o.BrokerOrderId == order.Id);
                if (bow == null)
                {
                    _logger.LogWarning($"broker order withdrawal not found ({order.Token})");
                    return;
                }

                // check fiat withdrawal is completed
                var wallet = _walletProvider.GetFiat(order.AssetReceive);
                var fiatTx = wallet.GetTx(bow.DepositCode);
                if (fiatTx != null && fiatTx.BankTx != null)
                {
                    order.Status = BrokerOrderStatus.Sent.ToString();
                    _context.BrokerOrders.Update(order);
                    _logger.LogInformation($"Payout confirmed for order {order.Token}");

                    // send email
                    var sendWallet    = _walletProvider.GetChain(order.AssetSend);
                    var receiveWallet = _walletProvider.GetFiat(order.AssetReceive);
                    _emailSender.SendEmailBrokerSentOutgoingFunds(user.Email, order.AssetSend, sendWallet.AmountToString(order.AmountSend), order.AssetReceive,
                                                                  receiveWallet.AmountToString(order.AmountReceive), order.InvoiceId).GetAwaiter().GetResult();
                    _logger.LogInformation($"Sent email to {user.Email}");
                }
            }
        }