Ejemplo n.º 1
0
        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();
                }
        }
Ejemplo n.º 2
0
        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);
        }