/// <summary>
        ///  Зачисление средств в T# кошелёк пользователя
        /// </summary>
        /// <param name="walletId">всегда должен быть только один, иначе один платёж в платёжной системе увеличит средства нескольких пользователей</param>
        /// <param name="currency"></param>
        /// <param name="amount"></param>
        /// <param name="data"></param>
        public bool DepositOnWallet(int walletId, string currency, decimal amount, DateTime data)
        {
            try
            {
                var userPaymentSysId = DbProcessing.GetUserPaymentSysId(walletId);
                if (!userPaymentSysId.HasValue)
                {
                    return(false);
                }

                var wallet = DbProcessing.GetWalletById(walletId);
                if (wallet == null)
                {
                    return(false);
                }

                var additionalAmount = amount;
                if (wallet.Currency != currency) // Нужно конвертировать средства в валюту T# кошелька
                {
                    var convertAmount = PaymentProcessor.ConvertPaySysCurrencyToWalletCurrency(wallet.Currency, currency, (double)amount);
                    if (!convertAmount.HasValue)
                    {
                        var message = string.Format(
                            "Не удалось произвести зачисление на TradeSharp кошелёк {0} средств в размере {1} {2}. \r\n" +
                            "Причина: не удалось сконвертировать валюту перевода {2} в валюту целевого TradeSharp кошелька {3}. \r\n" +
                            "Будет произведена попытка провести платёж как 'Неопознанный'. Администратор базы данных должен вручную зачислить \r\n" +
                            "средства на этот кошелёк, внеся изменения в таблицы WALLET и PAYMENT_SYSTEM_TRANSFER.",
                            wallet.User, amount.ToStringUniformMoneyFormat(), currency, wallet.Currency);

                        Logger.Error(message);
                        return(false);
                    }
                    additionalAmount = convertAmount.Value;
                }

                // Сохраняем всё в базу данных
                return(DbProcessing.DepositOnWallet(wallet, additionalAmount, data, userPaymentSysId.Value));
            }
            catch (Exception ex)
            {
                Logger.Error("DepositOnWallet - ошибка при зачислении средств на кошелёк", ex);
                return(false);
            }
        }
Exemplo n.º 2
0
        public Wallet ChangeCurrency(int walletId, string walletCurrency, bool recalculationBalance,
                                     out WalletError error)
        {
            try
            {
                using (var ctx = DatabaseContext.Instance.Make())
                {
                    var wallet = ctx.WALLET.FirstOrDefault(x => x.User == walletId);
                    if (wallet == null)
                    {
                        Logger.InfoFormat("не найден кошек для пользователя с Id = {0}", walletId);
                        error = WalletError.InvalidData;
                        return(null);
                    }

                    var oldWalletCurrency = wallet.Currency;
                    if (oldWalletCurrency != walletCurrency)
                    {
                        wallet.Currency = walletCurrency;
                        Logger.InfoFormat("валюта кошека {0} изменена с {1} на {2}",
                                          walletId, oldWalletCurrency, walletCurrency);
                    }

                    if (recalculationBalance)
                    {
                        #region

                        Logger.InfoFormat("пересчёт баланса кошелька {0} {1} в новую валюту {2}...",
                                          walletId, oldWalletCurrency, walletCurrency);

                        var oldBalans = wallet.Balance;
                        var newValue  = PaymentProcessor.ConvertPaySysCurrencyToWalletCurrency(walletCurrency,
                                                                                               oldWalletCurrency,
                                                                                               (double)oldBalans);

                        if (newValue != null)
                        {
                            newValue       = Math.Round(newValue.Value, 2);
                            wallet.Balance = (decimal)newValue;
                            Logger.InfoFormat("баланса кошелька {0} изменён с {1} на {2}", walletId, oldBalans,
                                              wallet.Balance);
                        }
                        else
                        {
                            Logger.ErrorFormat("не удалось пересчитать балланс кошелька {0} в новой валюте {1}",
                                               walletId, walletCurrency);
                            error = WalletError.CurrencyExchangeFailed;
                            return(LinqToEntity.DecorateWallet(wallet));
                        }

                        #endregion
                    }

                    Logger.Info("Сохраняем изменения...");
                    ctx.SaveChanges();
                    error = WalletError.OK;
                    Logger.Info("изменения сохранены");
                    return(LinqToEntity.DecorateWallet(wallet));
                }
            }
            catch (Exception ex)
            {
                Logger.Error("ChangeCurrency()", ex);
                error = WalletError.CommonError;
                return(null);
            }
        }