private void btnCreate_Click(object sender, EventArgs e) { var users = MakeUsersWithNames(); if (users.Count == 0) { MessageBox.Show("Пользователи не созданы (нет записей)"); return; } accountIds.Clear(); var depoPercentiles = tbStartDepo.Text.ToIntArrayUniform(); // каждого занести в БД // для каждого завести кошелек, положить немного денег // завести каждому счет // опционально - завести каждому сигнальный сервис var group = (string)cbGroup.SelectedItem; const int moneyOnWallet = 1250; var currency = tbCurrency.Text; var signalPrice = tbSignalCost.Text.ToDecimalUniformSafe() ?? 1; var timeParts = tbNewAccountOpenTime.Text.Split(new[] { '-' }, StringSplitOptions.RemoveEmptyEntries); var timeStartMin = timeParts[0].Trim(' ').ToDateTimeUniform(); var timeStartMax = timeParts[1].Trim(' ').ToDateTimeUniform(); var minutesBackMax = (int)(timeStartMax - timeStartMin).TotalMinutes; using (var ctx = DatabaseContext.Instance.Make()) foreach (var user in users) { // сам пользователь var usrUnd = LinqToEntity.UndecoratePlatformUser(user); ctx.PLATFORM_USER.Add(usrUnd); ctx.SaveChanges(); var userId = usrUnd.ID; var modelTime = timeStartMax.AddMinutes(-rand.Next(minutesBackMax)); // кошелек var wallet = new WALLET { Balance = moneyOnWallet, Currency = currency, Password = user.Password, User = userId }; ctx.WALLET.Add(wallet); // счет var money = GetRandomDepositSize(depoPercentiles); var roughMoneyPercent = 0.0; if (rand.Next(100) < 20) { roughMoneyPercent = rand.NextDouble() - 0.5; } else if (rand.Next(100) < 30) { roughMoneyPercent = rand.NextDouble() * 100 - 50; } money += (int)(money * roughMoneyPercent / 100); var account = new ACCOUNT { AccountGroup = group, Balance = money, Currency = currency, Status = (int)Account.AccountStatus.Created, TimeCreated = modelTime, ReadonlyPassword = user.Password }; ctx.ACCOUNT.Add(account); ctx.SaveChanges(); accountIds.Add(account.ID); // денежный перевод на счет - начальный баланс ctx.BALANCE_CHANGE.Add(new BALANCE_CHANGE { AccountID = account.ID, Amount = money, ChangeType = (int)BalanceChangeType.Deposit, Description = "Initial deposit", ValueDate = account.TimeCreated }); // пользователь-счет ctx.PLATFORM_USER_ACCOUNT.Add(new PLATFORM_USER_ACCOUNT { Account = account.ID, PlatformUser = userId, RightsMask = (int)AccountRights.Управление }); // сервис торг. сигналов if (cbSignallers.Checked) { ctx.SERVICE.Add(new SERVICE { AccountId = account.ID, Currency = currency, FixedPrice = signalPrice, User = userId, ServiceType = (int)PaidServiceType.Signals, Comment = "Сигналы " + user.Login }); } ctx.SaveChanges(); } }
public AccountRegistrationStatus RegisterAccount(PlatformUser user, string accountCurrency, int startBalance, decimal maxLeverage, string completedPassword, bool autoSignIn) { // проверить заполнение логина-почты-баланса-плеча if (user.Login.Length < PlatformUser.LoginLenMin || user.Login.Length > PlatformUser.LoginLenMax) { return(AccountRegistrationStatus.IncorrectLogin); } if (user.Email.Length < PlatformUser.EmailLenMin || user.Email.Length > PlatformUser.EmailLenMax) { return(AccountRegistrationStatus.IncorrectEmail); } if (!PlatformUser.CheckLoginSpelling(user.Login)) { return(AccountRegistrationStatus.IncorrectLogin); } if (startBalance < Account.MinimumStartDepo || startBalance > Account.MaximumStartDepo) { return(AccountRegistrationStatus.IncorrectBalance); } if (maxLeverage < 0) { maxLeverage = 0; } else if (maxLeverage > Account.MaximumDepoLeverage) { maxLeverage = Account.MaximumDepoLeverage; } long hash; if (!TradingContractDictionary.Instance.GetTickers(out hash).Any(c => c.ActiveBase == accountCurrency || c.ActiveCounter == accountCurrency)) { return(AccountRegistrationStatus.WrongCurrency); } // сгенерировать пароль if (string.IsNullOrEmpty(completedPassword)) { string pwrd; while (true) { pwrd = RandomWordGenerator.Password(new Random().Next(2) + 2); if (pwrd.Length < PlatformUser.PasswordLenMin || pwrd.Length > PlatformUser.PasswordLenMax) { continue; } break; } user.Password = pwrd; } else { user.Password = completedPassword; } user.RegistrationDate = DateTime.Now; Logger.InfoFormat("RegisterAccount (email={0}, login={1}, pwrd={2}{3})", user.Email, user.Login, user.Password, string.IsNullOrEmpty(completedPassword) ? " (auto)" : ""); if (string.IsNullOrEmpty(user.Title)) { user.Title = string.IsNullOrEmpty(user.Name) ? user.Login : user.Name; } user.RoleMask = UserRole.Trader; // попытка создать пользователя и открыть счет using (var ctx = DatabaseContext.Instance.Make()) { try { // проверка дублирования var existUser = ctx.PLATFORM_USER.FirstOrDefault(u => u.Email.Equals(user.Email, StringComparison.OrdinalIgnoreCase)); Logger.InfoFormat("Регистрация пользователя: email {0} занят", user.Email); if (existUser != null) { return(AccountRegistrationStatus.DuplicateEmail); } existUser = ctx.PLATFORM_USER.FirstOrDefault(u => u.Login == user.Login); if (existUser != null) { return(AccountRegistrationStatus.DuplicateLogin); } } catch (Exception ex) { Logger.Error("Ошибка в RegisterAccount(checks)", ex); return(AccountRegistrationStatus.ServerError); } // в рамках одной транзакции создать логин и счет //using (var transaction = ctx.Connection.BeginTransaction()) { DbTransaction transaction; try { if (((IObjectContextAdapter)ctx).ObjectContext.Connection.State != ConnectionState.Open) { ((IObjectContextAdapter)ctx).ObjectContext.Connection.Open(); } Logger.Info("Connection's opened"); transaction = ((IObjectContextAdapter)ctx).ObjectContext.Connection.BeginTransaction(); } catch (Exception ex) { Logger.Error("RegisterAccount - ошибка в ctx.Connection.BeginTransaction", ex); return(AccountRegistrationStatus.ServerError); } try { // добавить пользователя var userBase = LinqToEntity.UndecoratePlatformUser(user); ctx.PLATFORM_USER.Add(userBase); // добавить счет var account = new ACCOUNT { AccountGroup = defaultDemoAccountGroupCode, MaxLeverage = maxLeverage, Balance = startBalance, UsedMargin = 0, Currency = accountCurrency, Description = string.Format("demo account for {0}", user.Login), Status = (int)Account.AccountStatus.Created, TimeCreated = DateTime.Now, }; try { ctx.ACCOUNT.Add(account); // сохранить изменения (добавление пользователя и счета, нужны ID) ctx.SaveChanges(); } catch (Exception ex) { Logger.Error("RegisterAccount - ACCOUNT adding error", ex); return(AccountRegistrationStatus.ServerError); } // добавить кошелек try { var wallet = new WALLET { Balance = 0, Currency = accountCurrency, Password = user.Password, User = userBase.ID }; ctx.WALLET.Add(wallet); } catch (Exception ex) { Logger.Error("RegisterAccount - WALLET adding error", ex); return(AccountRegistrationStatus.ServerError); } // пользователь-счет var userAccount = new PLATFORM_USER_ACCOUNT { PlatformUser = userBase.ID, Account = account.ID, RightsMask = (int)AccountRights.Управление }; ctx.PLATFORM_USER_ACCOUNT.Add(userAccount); // перевод на счет var trans = new BALANCE_CHANGE { ValueDate = DateTime.Now, AccountID = account.ID, Amount = startBalance, ChangeType = (int)BalanceChangeType.Deposit, Description = "initial deposit" }; ctx.BALANCE_CHANGE.Add(trans); // сделать сигнальщиком if (makeNewlyAddedUsersSignallers) { MakeNewlyRegisteredAccountSignaller(ctx, userBase, account); } // сохранить все изменения ctx.SaveChanges(); if (string.IsNullOrEmpty(completedPassword)) { if (!SendEmailOnNewAccount(user, true)) { transaction.Rollback(); return(AccountRegistrationStatus.EmailDeliveryError); } } transaction.Commit(); ((IObjectContextAdapter)ctx).ObjectContext.Connection.Close(); } catch (Exception ex) { Logger.ErrorFormat("Ошибка в RegisterAccount (login={0}, email={1}) : {2}", user.Login, user.Email, ex); transaction.Rollback(); ((IObjectContextAdapter)ctx).ObjectContext.Connection.Close(); return(AccountRegistrationStatus.ServerError); } } // using (transaction ... } return(AccountRegistrationStatus.OK); }