Esempio n. 1
0
        public virtual void ChangeState(States newState)
        {
            if (newState == State)
            {
                return;
            }

            string exceptionMessage = $"Некорректная операция. Не предусмотрена смена статуса с {State} на {newState}";

            switch (newState)
            {
            //Подана
            case States.Submited:
                if (State == States.New || State == States.OnClarification)
                {
                    State = newState;
                }
                else
                {
                    throw new InvalidOperationException(exceptionMessage);
                }
                break;

            //На уточнении
            case States.OnClarification:
                if (State == States.Agreed ||
                    State == States.GivenForTake ||
                    State == States.Canceled ||
                    State == States.PartiallyClosed)
                {
                    State = newState;
                }
                else
                {
                    throw new InvalidOperationException(exceptionMessage);
                }
                break;

            //Согласована
            case States.Agreed:
                if (State == States.Submited)
                {
                    State = newState;
                }
                else
                {
                    throw new InvalidOperationException(exceptionMessage);
                }
                break;

            //Передана на выдачу
            case States.GivenForTake:
                if (State == States.Agreed)
                {
                    State = newState;
                }
                else
                {
                    throw new InvalidOperationException(exceptionMessage);
                }
                break;

            case States.Canceled:
                if (State == States.Submited ||
                    State == States.New ||
                    State == States.OnClarification ||
                    State == States.GivenForTake ||
                    State == States.Agreed)
                {
                    State = newState;
                }
                else
                {
                    throw new InvalidOperationException(exceptionMessage);
                }
                break;

            case States.Closed:
                State = Sums.All(x => x.Sum == x.ObservableExpenses.Sum(e => e.Money)) ? newState : States.PartiallyClosed;
                break;

            case States.PartiallyClosed:
                break;

            default:
                throw new NotImplementedException($"Не реализовано изменение статуса для {newState}");
            }
        }