public PaymentSystemTransfer GetTransferById(int id)
        {
            PaymentSystemTransfer result;

            try
            {
                using (var ctx = DatabaseContext.Instance.Make())
                {
                    var ps = (from x in ctx.PAYMENT_SYSTEM_TRANSFER
                              where x.Id == id
                              select new { transfer = x,
                                           paySys = x.USER_PAYMENT_SYSTEM != null ? (PaymentSystem)x.USER_PAYMENT_SYSTEM.SystemPayment : PaymentSystem.Unknown,
                                           wallet = x.USER_PAYMENT_SYSTEM != null ? ctx.WALLET.FirstOrDefault(w => w.User == x.USER_PAYMENT_SYSTEM.UserId) : null }).Single();


                    result        = LinqToEntity.DecoratePaymentSystemTransfer(ps.transfer);
                    result.Wallet = ps.wallet != null?LinqToEntity.DecorateWallet(ps.wallet) : new Wallet();

                    result.PaymentSys = ps.paySys;
                }
            }
            catch (Exception ex)
            {
                Logger.Error("GetUnknownTransfers()", ex);
                return(null);
            }
            return(result);
        }
Exemple #2
0
        public Wallet GetUserWallet(ProtectedOperationContext secCtx, string userLogin)
        {
            // запрос разрешен?
            if (!UserSessionStorage.Instance.PermitUserOperation(secCtx, false, false))
            {
                return(null);
            }

            // получить кошелек пользователя и вернуть его
            try
            {
                using (var ctx = DatabaseContext.Instance.Make())
                {
                    var queryWallet = from us in ctx.PLATFORM_USER where us.Login == userLogin select us.WALLET;

                    foreach (var walInf in queryWallet)
                    {
                        var wallet = LinqToEntity.DecorateWallet(walInf);
                        return(wallet);
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.ErrorFormat("GetUserWallet({0}) - exception: {1}", userLogin, ex);
            }

            return(null);
        }
        public PaymentTransferModel GetTransfers()
        {
            var result = new PaymentTransferModel();

            try
            {
                using (var ctx = DatabaseContext.Instance.Make())
                {
                    var ps = (from x in ctx.PAYMENT_SYSTEM_TRANSFER
                              where x.Transfer == null
                              select new { transfer = x,
                                           paySys = x.USER_PAYMENT_SYSTEM != null ? (PaymentSystem)x.USER_PAYMENT_SYSTEM.SystemPayment : PaymentSystem.Unknown,
                                           wallet = x.USER_PAYMENT_SYSTEM != null ? ctx.WALLET.FirstOrDefault(w => w.User == x.USER_PAYMENT_SYSTEM.UserId) : null }).ToList();

                    foreach (var p in ps)
                    {
                        var decorP = LinqToEntity.DecoratePaymentSystemTransfer(p.transfer);
                        decorP.PaymentSys = p.paySys;
                        if (p.wallet != null)
                        {
                            decorP.Wallet = LinqToEntity.DecorateWallet(p.wallet);
                        }

                        result.UndefinedPaymentTransfer.Add(decorP);
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Error("GetUnknownTransfers()", ex);
                return(null);
            }
            return(result);
        }
Exemple #4
0
        public Wallet UpdateBalance(int walletId, decimal transferVolume, bool deposit, out WalletError error)
        {
            try
            {
                using (var ctx = DatabaseContext.Instance.Make())
                {
                    var wallet = ctx.WALLET.FirstOrDefault(x => x.User == walletId);
                    if (wallet == null)
                    {
                        Logger.InfoFormat("не найден кошек {0}", walletId);
                        error = WalletError.InvalidData;
                        return(null);
                    }

                    if (transferVolume <= 0)
                    {
                        Logger.Info("объём зачисляемых средств должен быть больше нуля}");
                        error = WalletError.InvalidData;
                        return(LinqToEntity.DecorateWallet(wallet));
                    }
                    var currentAmount    = deposit ? transferVolume : -transferVolume;
                    var oldWalletBalance = wallet.Balance;
                    wallet.Balance += currentAmount;


                    Logger.InfoFormat("средства на кошеке {0} изменены с {1} на {2}",
                                      walletId, oldWalletBalance, wallet.Balance);

                    var newTransfer = new TRANSFER
                    {
                        Amount        = currentAmount,
                        TargetAmount  = currentAmount,
                        User          = walletId,
                        Comment       = "Изменение администратором средств кошелька № " + walletId,
                        ValueDate     = DateTime.Now,
                        BalanceChange = null,
                    };
                    ctx.TRANSFER.Add(newTransfer);

                    Logger.Info("Сохраняем изменения...");
                    ctx.SaveChanges();
                    error = WalletError.OK;
                    return(LinqToEntity.DecorateWallet(wallet));
                }
            }
            catch (Exception ex)
            {
                Logger.Error("UpdateUserWallet()", ex);
                error = WalletError.CommonError;
                return(null);
            }
        }
        public Wallet GetUserWalletSubscriptionAndLastPaymentsInner(
            string userLogin, int maxPaymentsQuery,
            out int paymentsTotalCount,
            out List <Subscription> subscriptions,
            out List <Transfer> transfers, out WalletError error)
        {
            subscriptions      = null;
            transfers          = null;
            paymentsTotalCount = 0;
            error = WalletError.ServerError;

            // получить кошелек пользователя и вернуть его
            Wallet wallet = null;

            try
            {
                using (var ctx = DatabaseContext.Instance.Make())
                {
                    // получить пользователя
                    var user = ctx.PLATFORM_USER.FirstOrDefault(u => u.Login == userLogin);
                    if (user == null)
                    {
                        error = WalletError.AuthenticationError;
                        return(null);
                    }

                    // получить кошелек
                    var walletBase = ctx.WALLET.FirstOrDefault(w => w.User == user.ID);
                    if (walletBase == null)
                    {
                        error = WalletError.ServerError;
                        return(null);
                    }
                    wallet        = LinqToEntity.DecorateWallet(walletBase);
                    subscriptions = new List <Subscription>();
                    transfers     = new List <Transfer>();

                    // получить подписки пользователя
                    subscriptions =
                        (from subs in ctx.SUBSCRIPTION
                         join srv in ctx.SERVICE on subs.Service equals srv.ID
                         where subs.User == user.ID
                         select new TradeSharp.Contract.Entity.Subscription
                    {
                        User = subs.User,
                        RenewAuto = subs.RenewAuto,
                        Service = subs.Service,
                        TimeEnd = subs.TimeEnd,
                        TimeStarted = subs.TimeStarted,
                        PaidService = new PaidService
                        {
                            User = srv.User,
                            AccountId = srv.AccountId,
                            Currency = srv.Currency,
                            Comment = srv.Comment,
                            ServiceType = (PaidServiceType)srv.ServiceType,
                            Id = srv.ID,
                            FixedPrice = srv.FixedPrice
                        }
                    }).ToList();

                    // получить последние платежи по кошельку
                    paymentsTotalCount = ctx.TRANSFER.Count(t => t.User == user.ID);
                    transfers          = (from trans in ctx.TRANSFER where trans.User == user.ID select trans).Take(maxPaymentsQuery).ToList().Select(
                        LinqToEntity.DecorateTransfer).ToList();
                    error = WalletError.OK;
                }
            }
            catch (Exception ex)
            {
                Logger.ErrorFormat("GetUserWalletSubscriptionAndLastPayments({0}) - exception: {1}", userLogin, ex);
            }

            return(wallet);
        }
Exemple #6
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);
            }
        }
Exemple #7
0
        private static Wallet PutMoneyOnUserOwnedAccount(int accountId, decimal amountInSrcCurrency, out WalletError error,
                                                         WALLET wallet, ACCOUNT account, TradeSharpConnection ctx,
                                                         PLATFORM_USER user)
        {
            // достаточно ли денег в кошельке?
            if (amountInSrcCurrency > wallet.Balance)
            {
                error = WalletError.InsufficientFunds;
                return(null);
            }

            // перевести объем в валюту счета
            var amount = amountInSrcCurrency;

            if (account.Currency != wallet.Currency)
            {
                // найти котировку и перевести
                string errorString;
                var    amountTarget = DalSpot.Instance.ConvertSourceCurrencyToTargetCurrency(account.Currency,
                                                                                             wallet.Currency, (double)amount,
                                                                                             QuoteStorage.Instance.ReceiveAllData(),
                                                                                             out errorString);
                if (!amountTarget.HasValue)
                {
                    Logger.ErrorFormat("DepositOrWithdraw({0} {1}): {2}",
                                       amountInSrcCurrency, account.Currency + "/" + wallet.Currency,
                                       errorString);
                    error = WalletError.CurrencyExchangeFailed;
                    return(null);
                }
                amount = amountTarget.Value;
            }

            // списать с кошелька и пополнить счет
            wallet.Balance  -= amountInSrcCurrency;
            account.Balance += amount;
            var dateOper      = DateTime.Now;
            var balanceChange = ctx.BALANCE_CHANGE.Add(new BALANCE_CHANGE
            {
                AccountID   = accountId,
                Amount      = amount,
                ChangeType  = (int)BalanceChangeType.Deposit,
                ValueDate   = dateOper,
                Description = "Пополнение с кошелька №" + wallet.User
            });

            try
            {
                ctx.SaveChanges();
            }
            catch (Exception ex)
            {
                Logger.Error("DepositOrWithdraw() - error saving balance change", ex);
                error = WalletError.ServerError;
                return(null);
            }

            var balanceChangeId = balanceChange.ID;

            ctx.TRANSFER.Add(new TRANSFER
            {
                Amount        = -amountInSrcCurrency,
                TargetAmount  = -amountInSrcCurrency,
                User          = user.ID,
                Comment       = "Т. счет №" + account.ID,
                ValueDate     = dateOper,
                BalanceChange = balanceChangeId,
            });

            try
            {
                ctx.SaveChanges();
            }
            //catch (System.Data.Entity.Infrastructure.DbUpdateConcurrencyException)
            //{
            //}
            catch (Exception ex)
            {
                Logger.Error("DepositOrWithdraw() - error saving transfer for user " + user.ID +
                             ", balance change Id: " + balanceChangeId + ", user: " + user.ID, ex);
                error = WalletError.ServerError;
                return(null);
            }
            error = WalletError.OK;
            return(LinqToEntity.DecorateWallet(wallet));
        }
Exemple #8
0
        private Wallet GetMoneyFromUserOwnedAccount(int accountId, decimal amountInSrcCurrency, out WalletError error,
                                                    ACCOUNT account, WALLET wallet, TradeSharpConnection ctx, PLATFORM_USER user)
        {
            var amountWallet = amountInSrcCurrency;

            if (account.Currency != wallet.Currency)
            {
                // найти котировку и перевести
                string errorString;
                var    amountTarget = DalSpot.Instance.ConvertSourceCurrencyToTargetCurrency(wallet.Currency,
                                                                                             account.Currency,
                                                                                             (double)amountWallet,
                                                                                             QuoteStorage.Instance.ReceiveAllData(),
                                                                                             out errorString);
                if (!amountTarget.HasValue)
                {
                    Logger.ErrorFormat("DepositOrWithdraw({0} {1}): {2} (withdraw)",
                                       amountInSrcCurrency, account.Currency + "/" + wallet.Currency,
                                       errorString);
                    error = WalletError.CurrencyExchangeFailed;
                    return(null);
                }
                amountWallet = amountTarget.Value;
            }

            // достаточно ли средств на счете?
            // проверить средства / зарезервированное марж. обеспечение
            decimal equity, usedMargin;

            if (!GetAccountEquityAndUsedMargin(account, out equity, out usedMargin))
            {
                error = WalletError.ServerError;
                return(null);
            }
            if (equity - usedMargin < amountInSrcCurrency)
            {
                error = WalletError.ServerError;
                return(null);
            }

            // списать со счета в пользу кошелька
            wallet.Balance  += amountInSrcCurrency;
            account.Balance -= amountInSrcCurrency;
            var date = DateTime.Now;
            var bc   = ctx.BALANCE_CHANGE.Add(new BALANCE_CHANGE
            {
                AccountID   = accountId,
                Amount      = amountInSrcCurrency,
                ChangeType  = (int)BalanceChangeType.Withdrawal,
                ValueDate   = date,
                Description = "Списание на кошелек №" + wallet.User
            });

            ctx.SaveChanges();
            ctx.TRANSFER.Add(new TRANSFER
            {
                Amount        = amountWallet,
                TargetAmount  = amountWallet,
                User          = user.ID,
                Comment       = "Вывод средств со счета №" + account.ID,
                ValueDate     = date,
                BalanceChange = bc.ID,
            });

            ctx.SaveChanges();
            error = WalletError.OK;
            return(LinqToEntity.DecorateWallet(wallet));
        }
Exemple #9
0
        /// <summary>
        /// просто пополнить счет, вывести оттуда долю или пополнить ПАММ-пай
        /// </summary>
        private Wallet DepositOrWithdraw(ProtectedOperationContext secCtx,
                                         bool putOnAccount,
                                         string userLogin, int accountId, decimal amountInSrcCurrency, out WalletError error)
        {
            var operationParams = string.Format("DepositOrWithdraw(log={0}, acc={1}, amt={2})",
                                                userLogin, accountId, amountInSrcCurrency.ToStringUniformMoneyFormat());

            if (!UserSessionStorage.Instance.PermitUserOperation(secCtx, false, false))
            {
                Logger.Error(operationParams + ": InsufficientRights");
                error = WalletError.InsufficientRights;
                return(null);
            }

            if (amountInSrcCurrency <= 0)
            {
                Logger.Error(operationParams + ": amountInSrcCurrency <= 0");
                error = WalletError.InvalidData;
                return(null);
            }

            // перевести деньги на счет / со счета на кошелек
            try
            {
                using (var ctx = DatabaseContext.Instance.Make())
                {
                    // счет
                    var account = ctx.ACCOUNT.FirstOrDefault(a => a.ID == accountId);
                    if (account == null)
                    {
                        Logger.Error(operationParams + ": account is not found");
                        error = WalletError.InvalidData;
                        return(null);
                    }

                    // пользователь и кошелек
                    var user = ctx.PLATFORM_USER.FirstOrDefault(u => u.Login == userLogin);
                    if (user == null)
                    {
                        Logger.Error(operationParams + ": user is not found");
                        error = WalletError.InvalidData;
                        return(null);
                    }
                    var wallet = ctx.WALLET.FirstOrDefault(w => w.User == user.ID);
                    if (wallet == null)
                    {
                        Logger.Error(operationParams + ": wallet is not found");
                        error = WalletError.InvalidData;
                        return(null);
                    }

                    // это - ПАММ-счет или обычный счет?
                    var userShare = GetAccountSharePercent(ctx, accountId, user.ID);
                    if (userShare < 100M)
                    {
                        var status = new WalletManager4Pamm(secCtx, userLogin, accountId).InvestOrWithdrawFromPamm(
                            amountInSrcCurrency,
                            !putOnAccount, false, ctx);
                        error = status == RequestStatus.OK ? WalletError.OK : WalletError.InvalidData;
                        if (error != WalletError.OK)
                        {
                            Logger.Error(operationParams + ": InvestOrWithdrawFromPamm - " + status);
                        }

                        return(LinqToEntity.DecorateWallet(wallet));
                    }

                    // деньги - в кошелек
                    if (putOnAccount)
                    {
                        return(PutMoneyOnUserOwnedAccount(accountId, amountInSrcCurrency, out error, wallet, account, ctx, user));
                    }

                    // перевести со счета в кошелек
                    return(GetMoneyFromUserOwnedAccount(accountId, amountInSrcCurrency, out error, account, wallet, ctx, user));
                }
            }
            catch (Exception ex)
            {
                Logger.ErrorFormat("Ошибка в TransferToTradingAccount({0}): {1}", accountId, ex);
                error = WalletError.ServerError;
                return(null);
            }
        }
Exemple #10
0
        public RequestStatus GetUserOwnAndSharedAccounts(string login,
                                                         ProtectedOperationContext secCtx,
                                                         out List <AccountShared> accounts)
        {
            accounts = new List <AccountShared>();
            if (!UserSessionStorage.Instance.PermitUserOperation(secCtx, false, true))
            {
                return(RequestStatus.Unauthorized);
            }

            try
            {
                Wallet userWallet;
                using (var ctx = DatabaseContext.Instance.Make())
                {
                    // получить собственные реальные! счета пользователя
                    var ownAccounts = (from ac in ctx.ACCOUNT
                                       join gr in ctx.ACCOUNT_GROUP on ac.AccountGroup equals gr.Code
                                       join pa in ctx.PLATFORM_USER_ACCOUNT on ac.ID equals pa.Account
                                       join u in ctx.PLATFORM_USER on pa.PlatformUser equals u.ID
                                       where u.Login == login && gr.IsReal
                                       select ac).ToList()
                                      .Select(a => new AccountShared(LinqToEntity.DecorateAccount(a), true)
                    {
                        SharePercent = 100
                    })
                                      .ToList();
                    // получить те счета, в которых у запросившего есть доля
                    var shares = (from sh in ctx.ACCOUNT_SHARE
                                  join u in ctx.PLATFORM_USER on sh.ShareOwner equals u.ID
                                  join ac in ctx.ACCOUNT on sh.Account equals ac.ID
                                  join gr in ctx.ACCOUNT_GROUP on ac.AccountGroup equals gr.Code
                                  where u.Login == login && gr.IsReal
                                  select new AccountShared
                    {
                        Account = new Account
                        {
                            ID = ac.ID,
                            Group = ac.AccountGroup,
                            Currency = ac.Currency,
                            Balance = ac.Balance
                        },
                        SharePercent = sh.Share
                    }).ToList();
                    // склеить оба списка
                    ownAccounts.ForEach(a =>
                    {
                        var sharedAccount = shares.FirstOrDefault(s => s.Account.ID == a.Account.ID);
                        if (sharedAccount != null)
                        {
                            a.SharePercent = sharedAccount.SharePercent;
                        }
                    });
                    accounts = ownAccounts.Union(shares, AccountShared.ComparerOnId.Instance).ToList();
                    if (accounts.Count == 0)
                    {
                        return(RequestStatus.OK);
                    }

                    userWallet = LinqToEntity.DecorateWallet((from w in ctx.WALLET
                                                              join u in ctx.PLATFORM_USER on w.User equals u.ID
                                                              where u.Login == login
                                                              select w).First());
                }

                // посчитать профит (equity) для счетов
                foreach (var account in accounts)
                {
                    var equity = profitCalculator.CalculateAccountEquity(account.Account.ID, account.Account.Balance,
                                                                         account.Account.Currency, TradeSharp.Contract.Util.BL.QuoteStorage.Instance.ReceiveAllData(), this);
                    account.Account.Equity   = equity;
                    account.ShareMoney       = account.Account.Equity * account.SharePercent / 100M;
                    account.ShareMoneyWallet = account.ShareMoney;

                    // посчитать долю в валюте кошелька
                    if (account.Currency == userWallet.Currency)
                    {
                        continue;
                    }
                    string errorString;
                    var    shareWallet = DalSpot.Instance.ConvertSourceCurrencyToTargetCurrency(userWallet.Currency, account.Currency,
                                                                                                (double)account.ShareMoney,
                                                                                                TradeSharp.Contract.Util.BL.QuoteStorage.Instance.ReceiveAllData(), out errorString);
                    account.ShareMoneyWallet = shareWallet ?? account.ShareMoney;
                    if (errorString != null)
                    {
                        Logger.ErrorFormat("GetUserOwnAndSharedAccounts({0}) - перевод средств из {1} в {2}: {3}",
                                           login, account.Currency, userWallet.Currency, errorString);
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Error("Ошибка в GetUserOwnAndSharedAccounts", ex);
                return(RequestStatus.ServerError);
            }
            return(RequestStatus.OK);
        }