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); }
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); }
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); }
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); } }
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)); }
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)); }
/// <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); } }
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); }