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