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

            decimal ESub   = 0;
            decimal ETotal = 0;

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

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

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

            decimal ECur = TotalValue - ESub;

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

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

                tran.Commit();
            }
        }