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