Ejemplo n.º 1
0
        public static void UpdateTargetAccount(int AccountId, decimal TotalValue, bool PreserveParentValue)
        {
            if (!CanWork(AccountId))
            {
                throw new AccessDeniedException();
            }

            decimal TSub   = 0;
            decimal TTotal = 0;

            using (IDataReader reader = DBFinance.GetAccount(AccountId))
            {
                reader.Read();
                TSub   = (decimal)reader["TSub"];                       // сумма дочерних
                TTotal = (decimal)reader["TTotal"];                     // старый общий итог
            }

            // Новый итог не может быть меньше суммы старых дочерних значений
            if (TotalValue < TSub)
            {
                throw new WrongDataException();
            }

            // Oleg Rylin [5/23/2006]
            // Проверка на то, чтобы не вылезти из родительского диапазона
            // Т.е. разница между тем, что было (TTotal) и тем, что стало (TotalValue),
            // не должна быть больше TCur родителя (parentTCur)
            if (PreserveParentValue)
            {
                decimal parentTCur = 0;
                int     ParentId   = DBFinance.GetParentAccountId(AccountId);
                if (ParentId > 0)
                {
                    using (IDataReader reader = DBFinance.GetAccount(ParentId))
                    {
                        reader.Read();
                        parentTCur = (decimal)reader["TCur"];                                   // настолько можно изменить значение
                    }
                    if (TotalValue - TTotal > parentTCur)
                    {
                        throw new WrongDataException();
                    }
                }
            }

            decimal TCur = TotalValue - TSub;

            using (DbTransaction tran = DbTransaction.Begin())
            {
                DBFinance.UpdateAccountTCur(AccountId, TCur, Security.CurrentUser.UserID);

                if (PreserveParentValue)
                {
                    RecalculateParentAccountWithPreserving(AccountId);
                }
                else
                {
                    RecalculateParentAccounts(AccountId, false);
                }

                tran.Commit();
            }
        }