Exemple #1
0
        public static void MoveAccount(int AccountId, int NewParentId)
        {
            // Проверка на соответствие проектов:
            int oldProjectId = -1;
            int newProjectId = -1;

            using (IDataReader reader = DBFinance.GetAccount(AccountId))
            {
                reader.Read();
                oldProjectId = (int)reader["ProjectId"];
            }
            using (IDataReader reader = DBFinance.GetAccount(NewParentId))
            {
                reader.Read();
                newProjectId = (int)reader["ProjectId"];
            }
            if (oldProjectId != newProjectId)
            {
                throw new AccessDeniedException();
            }

            // Проверка на права
            if (!Project.CanEditFinances(newProjectId))
            {
                throw new AccessDeniedException();
            }

            // Проверка на дочерние элементы
            bool CanMove = false;

            using (IDataReader reader = DBFinance.GetListAccountsForMove(AccountId))
            {
                while (reader.Read())
                {
                    if ((int)reader["AccountId"] == NewParentId)
                    {
                        CanMove = true;
                        break;
                    }
                }
            }
            if (!CanMove)
            {
                throw new AccessDeniedException();
            }

            // Предварительная работа
            int oldParentId = DBFinance.GetParentAccountId(AccountId);

            // Найдём всех детей (для перенумерации)
            ArrayList children = new ArrayList();

            using (IDataReader reader = DBFinance.GetListChildrenAccounts(AccountId))
            {
                while (reader.Read())
                {
                    children.Add((int)reader["AccountId"]);
                }
            }

            // Обработка
            using (DbTransaction tran = DbTransaction.Begin())
            {
                // Move
                DBFinance.MoveAccount(AccountId, NewParentId);

                // Найдём всех бывших сестёр (для перенумерации)
                ArrayList siblings = new ArrayList();
                using (IDataReader reader = DBFinance.GetListChildrenAccounts(oldParentId))
                {
                    while (reader.Read())
                    {
                        siblings.Add((int)reader["AccountId"]);
                    }
                }

                // Перенумеруем новую ветку
                ProcessRenumber(AccountId, children);

                // Обработаем старую ветку
                if (siblings.Count == 0)
                {
                    DBFinance.UpdateIsSummary(oldParentId, false);
                }
                else
                {
                    ProcessRenumber(oldParentId, siblings);
                }

                // Пересчитаем новую ветку
                RecalculateParentAccounts(AccountId, false);

                // Пересчитаем старую ветку
                RecalculateParentAccounts(oldParentId, true);

                tran.Commit();
            }
        }
Exemple #2
0
 /// <summary>
 /// Reader returns fields:
 ///		AccountId, Title, OutlineLevel, OutlineNumber, IsSummary
 /// </summary>
 public static IDataReader GetListAccountsForMove(int AccountId)
 {
     return(DBFinance.GetListAccountsForMove(AccountId));
 }