public IEnumerable<IResult> Save()
        {
            this.RemoveAllErrors();
            if (InventoryItem.Id > 0)
            {
                GetIsLockValidRequest getIsLockValidRequest = new GetIsLockValidRequest(ModelNamesEnum.Inventory, this.InventoryItem.Id.ToString());
                yield return getIsLockValidRequest;
                if (getIsLockValidRequest.Error != null)
                {
                    yield return new HandleExceptionResult(getIsLockValidRequest.Error);
                    BusyOff();
                    yield break;
                }
                if (!getIsLockValidRequest.Result)
                {
                    WindowManager.Value.Alert("Unable to continue", "The Record lock has expired.");
                    BusyOff();
                    yield break;
                }
            }

            InventoryAssistantState validatingState;

            BusyOn("Validating Inventory Item...");

            validatingState = InventoryAssistantState.General;
            if (!ValidateGeneral()) {
                this.state = validatingState;
                BusyOff();
                yield break;
            }

            validatingState = InventoryAssistantState.Notes;
            if (AssistantNoteMode == (int)AssistantViewMode.DataEntry)
            {
                if (ValidateNote())
                {
                    NoteSave();
                }
                else
                {
                    NotifyOfPropertyChange(() => ViewModelErrorsString);
                    if (this.State != validatingState)
                        this.State = validatingState;
                    BusyOff();
                    yield break;
                }
            }

            BusyOn("Saving Inventory Item...");

            // Build Save Object
            this.InventoryItem.Notes.Reset(this.Notes);

            //Save Order
            SaveInventoryItemRequest saveInventoryItemRequest = new SaveInventoryItemRequest(this.InventoryItem);
            yield return saveInventoryItemRequest;
            if (saveInventoryItemRequest.Error != null)
            {
                yield return new HandleExceptionResult(saveInventoryItemRequest.Error);
                BusyOff();
                yield break;
            }

            if (this.InventoryItem.Id == null)
                this.InventoryItem.Id = saveInventoryItemRequest.Result;

            GetInventoryItemRequest getInventoryItemRequest = new GetInventoryItemRequest((int)this.InventoryItem.Id);
            yield return getInventoryItemRequest;
            if (getInventoryItemRequest.Error != null)
            {
                yield return new HandleExceptionResult(getInventoryItemRequest.Error);
                BusyOff();
                yield break;
            }
            Events.Value.Publish(new EventModifiedInventory() { InventoryItem = getInventoryItemRequest.Result.Clone() });

            IsDirty = false;
            BusyOff();
            base.Close();
        }
        public IEnumerable<IResult> Save()
        {
            if (IsLocked()) {
                BusyOn("Validating Lock...");
                GetIsLockValidRequest getIsLockValidRequest = new GetIsLockValidRequest(ModelNamesEnum.User, this.User.UserId.ToString());
                yield return getIsLockValidRequest;
                if (getIsLockValidRequest.Error != null) {
                    yield return new HandleExceptionResult(getIsLockValidRequest.Error);
                    BusyOff();
                    yield break;
                }
                if (!getIsLockValidRequest.Result) {
                    WindowManager.Value.Alert("Unable to continue", "The Record lock has expired.");
                    BusyOff();
                    yield break;
                }
            }

            BusyOn("Validating User...");
            UserAssistantState validatingState = UserAssistantState.General;
            if (!ValidateGeneral()) {
                this.state = validatingState;
                BusyOff();
                yield break;
            }

            BusyOn("Saving User...");

            //Build Save Object
            //this.User.Role = selectedRole;
            //this.User.RoleId = this.selectedRole.Id;
            //if (!string.IsNullOrWhiteSpace(User.Signature.Signature)) {
            //    if (User.SignatureId == Guid.Empty) {
            //        User.Signature.SignatureId = Guid.NewGuid();
            //        User.SignatureId = User.Signature.SignatureId;
            //    }
            //}

            // If adding user record, hash password that was created
            if (!IsEditMode || ChangePassword)
                User.Password = Security.GetSha2Hash(this.Password.ToString().Trim(), this.User.Username.ToString().Trim());

            // If user record is an admin, create admin key hash
            if (this.User.AdministratorYN)
                this.User.AdministratorKey = Security.GetSha2Hash(User.Username, Session.SessionInfo.Instance.CurrentUser.BaseKey);

            //Save
            SaveUserRequest saveUserRequest = new SaveUserRequest(this.User);
            yield return saveUserRequest;
            if (saveUserRequest.Error != null) {
                yield return new HandleExceptionResult(saveUserRequest.Error);
                BusyOff();
                yield break;
            }

            if (AssistantMode == ViewMode.Add) {
                if (this.User.UserId == null)
                    this.User.UserId = saveUserRequest.Result;
                // Clear All Related Data
                this.User.Signature = new UserSignature();
                // Load any additional data
                this.User.Department = Lib.ListService.Instance.Departments.Where(x => x.DepartmentId == this.User.DepartmentId).SingleOrDefault();
            }

            this.User.IsDirty = false;
            this.User.IsTrackChange = false;
            this.User.OriginalObject = null;
            Events.Value.Publish(new EventModifiedUser() { User = this.User });
            IsDirty = false;
            BusyOff();
            base.Close();
        }
        public IEnumerable<IResult> Save()
        {
            this.RemoveAllErrors();
            if (this.CatalogItem.Pk > 0) {
                var reqLock = new GetIsLockValidRequest(ModelNamesEnum.Catalog, this.CatalogItem.Pk.ToString());
                yield return reqLock;

                if (reqLock.Error != null) {
                    yield return HandleExceptionResult.Display(reqLock.Error);
                    BusyOff();
                    yield break;
                }
                if (!reqLock.Result) {
                    WindowManager.Value.Alert("Unable to continue", "The Record lock has expired.");
                    BusyOff();
                    yield break;
                }
            }

            BusyOn("Validating Catalog Item...");

            if (AssistantCatalogItemPriorityMode == (int)AssistantViewMode.DataEntry) {
                CatalogItemPrioritySave();
            }

            var validatingState = CatalogAssistantState.General;
            if (!ValidateGeneral()) {
                AddError("Form", "Catalog Items Section - Last Save Attempt - Errors exist on form");
                NotifyOfPropertyChange(() => ViewModelErrorsString);
                this.State = validatingState;
                BusyOff();
                yield break;
            }

            NotifyOfPropertyChange(() => ViewModelErrorsString);

            BusyOn("Saving Catalog Item...");

            // Build Domain Object

            //Save CatalogItem
            var reqSave = new SaveCatalogItemRequest(this.CatalogItem);
            yield return reqSave;

            if (reqSave.Error != null) {
                yield return HandleExceptionResult.Display(reqSave.Error);
                BusyOff();
                yield break;
            }

            if (AssistantMode == ViewMode.Add) {
                this.CatalogItem.CatalogId = reqSave.Result;
                // Clear All Related Data to force reloaded on main screen
                // Load any additional data
            }
            this.CatalogItem.IsDirty = false;
            this.CatalogItem.IsTrackChange = false;
            this.CatalogItem.OriginalObject = null;
            Events.Value.Publish(new EventLoadCatalogItems());
            IsDirty = false;
            BusyOff();
            base.Close();
        }