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