internal IResult <List <PickedInventoryItem> > Execute(IPickedInventoryKey pickedInventoryKey, IEnumerable <ModifyPickedInventoryItemParameters> items)
        {
            if (pickedInventoryKey == null)
            {
                throw new ArgumentNullException("pickedInventoryKey");
            }
            if (items == null)
            {
                throw new ArgumentNullException("items");
            }

            var newItems = new List <PickedInventoryItem>();

            foreach (var item in items)
            {
                if (item.PickedInventoryItemKey != null)
                {
                    var notPendingResult = _unitOfWorkHelper.EntityHasNoPendingChanges(item.PickedInventoryItemKey, item.PickedInventoryItemKey);
                    if (!notPendingResult.Success)
                    {
                        return(notPendingResult.ConvertTo <List <PickedInventoryItem> >());
                    }

                    var pickedItem = _pickedInventoryUnitOfWork.PickedInventoryItemRepository.FindByKey(item.PickedInventoryItemKey);
                    if (pickedItem == null)
                    {
                        return(new InvalidResult <List <PickedInventoryItem> >(null, string.Format(UserMessages.PickedInventoryItemNotFound, item.PickedInventoryItemKey.KeyValue)));
                    }

                    if (pickedItem.CurrentLocationId != pickedItem.FromLocationId)
                    {
                        return(new InvalidResult <List <PickedInventoryItem> >(null, string.Format(UserMessages.PickedInventoryItemNotInOriginalLocation, new PickedInventoryItemKey(pickedItem).KeyValue)));
                    }

                    pickedItem.Quantity            = item.NewQuantity;
                    pickedItem.CurrentLocationId   = item.CurrentLocationKey.LocationKey_Id;
                    pickedItem.CustomerLotCode     = item.CustomerLotCode;
                    pickedItem.CustomerProductCode = item.CustomerProductCode;

                    if (pickedItem.Quantity < 0)
                    {
                        return(new InvalidResult <List <PickedInventoryItem> >(null, string.Format(UserMessages.QuantityForPickedCannotBeNegative, item.PickedInventoryItemKey.KeyValue)));
                    }

                    if (pickedItem.Quantity == 0)
                    {
                        _pickedInventoryUnitOfWork.PickedInventoryItemRepository.Remove(pickedItem);
                    }
                    else
                    {
                        newItems.Add(pickedItem);
                    }
                }
                else
                {
                    if (item.NewQuantity <= 0)
                    {
                        return(new InvalidResult <List <PickedInventoryItem> >(null, string.Format(UserMessages.QuantityForPickingFromInventoryMustBeGreaterThanZero, item.InventoryKey.KeyValue)));
                    }

                    var newSequence            = _unitOfWorkHelper.GetNextSequence(PickedInventoryItemPredicates.FilterByPickedInventoryKey(pickedInventoryKey), i => i.ItemSequence);
                    var newPickedInventoryItem = new PickedInventoryItem
                    {
                        DateCreated  = pickedInventoryKey.PickedInventoryKey_DateCreated,
                        Sequence     = pickedInventoryKey.PickedInventoryKey_Sequence,
                        ItemSequence = newSequence,

                        LotDateCreated     = item.InventoryKey.LotKey_DateCreated,
                        LotDateSequence    = item.InventoryKey.LotKey_DateSequence,
                        LotTypeId          = item.InventoryKey.LotKey_LotTypeId,
                        PackagingProductId = item.InventoryKey.PackagingProductKey_ProductId,
                        TreatmentId        = item.InventoryKey.InventoryTreatmentKey_Id,
                        ToteKey            = item.InventoryKey.InventoryKey_ToteKey,

                        FromLocationId      = item.InventoryKey.LocationKey_Id,
                        CurrentLocationId   = item.CurrentLocationKey.LocationKey_Id,
                        CustomerLotCode     = item.CustomerLotCode,
                        CustomerProductCode = item.CustomerProductCode,

                        Quantity = item.NewQuantity
                    };
                    newItems.Add(_pickedInventoryUnitOfWork.PickedInventoryItemRepository.Add(newPickedInventoryItem));
                }
            }

            return(new SuccessResult <List <PickedInventoryItem> >(newItems));
        }
        internal IResult Execute(PickedInventoryKey pickedInventoryKey, List <ModifySalesOrderPickedInventoryItemParameters> items)
        {
            if (items == null)
            {
                throw new ArgumentNullException("items");
            }

            foreach (var item in items)
            {
                if (item.SalesOrderPickedItemKey != null)
                {
                    var notPendingResult = new EFUnitOfWorkHelper(_salesUnitOfWork).EntityHasNoPendingChanges(item.SalesOrderPickedItemKey, item.SalesOrderPickedItemKey);
                    if (!notPendingResult.Success)
                    {
                        return(notPendingResult);
                    }

                    var pickedItem = _salesUnitOfWork.SalesOrderPickedItemRepository.FindByKey(item.SalesOrderPickedItemKey);
                    if (pickedItem == null)
                    {
                        return(new InvalidResult(string.Format(UserMessages.SalesOrderPickedItemNotFound, item.SalesOrderPickedItemKey.KeyValue)));
                    }

                    if (pickedItem.PickedInventoryItem.CurrentLocationId != pickedItem.PickedInventoryItem.FromLocationId)
                    {
                        return(new InvalidResult(string.Format(UserMessages.PickedInventoryItemNotInOriginalLocation, new PickedInventoryItemKey(pickedItem).KeyValue)));
                    }

                    pickedItem.PickedInventoryItem.Quantity = item.NewQuantity;
                    pickedItem.OrderItemSequence            = item.SalesOrderItemKey.SalesOrderItemKey_ItemSequence;

                    if (pickedItem.PickedInventoryItem.Quantity < 0)
                    {
                        return(new InvalidResult(string.Format(UserMessages.QuantityForPickedCannotBeNegative, item.PickedInventoryItemKey.KeyValue)));
                    }

                    if (pickedItem.PickedInventoryItem.Quantity == 0)
                    {
                        _salesUnitOfWork.PickedInventoryItemRepository.Remove(pickedItem.PickedInventoryItem);
                        _salesUnitOfWork.SalesOrderPickedItemRepository.Remove(pickedItem);
                    }
                    else
                    {
                        pickedItem.PickedInventoryItem.CustomerLotCode     = item.CustomerLotCode;
                        pickedItem.PickedInventoryItem.CustomerProductCode = item.CustomerProductCode;
                    }
                }
                else
                {
                    if (item.NewQuantity <= 0)
                    {
                        return(new InvalidResult(string.Format(UserMessages.QuantityForPickingFromInventoryMustBeGreaterThanZero, item.InventoryKey.KeyValue)));
                    }

                    var newSequence            = new EFUnitOfWorkHelper(_salesUnitOfWork).GetNextSequence(PickedInventoryItemPredicates.FilterByPickedInventoryKey(pickedInventoryKey), i => i.ItemSequence);
                    var newPickedInventoryItem = new PickedInventoryItem
                    {
                        DateCreated  = pickedInventoryKey.PickedInventoryKey_DateCreated,
                        Sequence     = pickedInventoryKey.PickedInventoryKey_Sequence,
                        ItemSequence = newSequence,

                        LotDateCreated  = item.InventoryKey.LotKey_DateCreated,
                        LotDateSequence = item.InventoryKey.LotKey_DateSequence,
                        LotTypeId       = item.InventoryKey.LotKey_LotTypeId,

                        PackagingProductId = item.InventoryKey.PackagingProductKey_ProductId,
                        FromLocationId     = item.InventoryKey.LocationKey_Id,
                        TreatmentId        = item.InventoryKey.InventoryTreatmentKey_Id,
                        CurrentLocationId  = item.InventoryKey.LocationKey_Id,
                        ToteKey            = item.InventoryKey.InventoryKey_ToteKey,

                        Quantity = item.NewQuantity,

                        CustomerLotCode     = item.CustomerLotCode,
                        CustomerProductCode = item.CustomerProductCode
                    };
                    _salesUnitOfWork.PickedInventoryItemRepository.Add(newPickedInventoryItem);

                    var customerOrderPickedItem = new SalesOrderPickedItem
                    {
                        DateCreated       = pickedInventoryKey.PickedInventoryKey_DateCreated,
                        Sequence          = pickedInventoryKey.PickedInventoryKey_Sequence,
                        ItemSequence      = newSequence,
                        OrderItemSequence = item.SalesOrderItemKey.SalesOrderItemKey_ItemSequence
                    };
                    _salesUnitOfWork.SalesOrderPickedItemRepository.Add(customerOrderPickedItem);
                }
            }

            return(new SuccessResult());
        }