/// <param name="contract">A Contract able to navigate to Contract.Customer.ProductCodes.</param> internal IResult Execute(Contract contract, List <SetContractItemParameters> newItems) { if (contract == null) { throw new ArgumentNullException("contract"); } if (newItems == null) { throw new ArgumentNullException("newItems"); } var unitOfWorkHelper = new EFUnitOfWorkHelper(_salesUnitOfWork); var productCodes = (contract.Customer.ProductCodes ?? new CustomerProductCode[0]).ToList(); var matches = (contract.ContractItems ?? new ContractItem[0]).BestMatches(newItems, (c, n) => n.ChileProductKey.Equals(c), (c, n) => n.PackagingProductKey.Equals(c), (c, n) => n.TreatmentKey.Equals(c), (c, n) => n.ContractItemParameters.UseCustomerSpec == c.UseCustomerSpec, (c, n) => n.ContractItemParameters.CustomerCodeOverride == c.CustomerProductCode, (c, n) => n.ContractItemParameters.Quantity == c.Quantity); foreach (var match in matches) { if (match.Item1 != null && match.Item2 != null) { SetContractItem(match.Item1, match.Item2, productCodes); } else if (match.Item1 != null) { _salesUnitOfWork.ContractItemRepository.Remove(match.Item1); } else if (match.Item2 != null) { var nextItemSequence = unitOfWorkHelper.GetNextSequence <ContractItem>(i => i.ContractYear == contract.ContractYear && i.ContractSequence == contract.ContractSequence, i => i.ContractItemSequence); SetContractItem(_salesUnitOfWork.ContractItemRepository.Add(new ContractItem { ContractYear = contract.ContractYear, ContractSequence = contract.ContractSequence, ContractItemSequence = nextItemSequence }), match.Item2, productCodes); } } return(new SuccessResult()); }
internal IResult Execute(SalesOrder order, List <SetSalesOrderItemParameters> newItems) { if (order == null) { throw new ArgumentNullException("order"); } if (newItems == null) { throw new ArgumentNullException("newItems"); } var unitOfWorkHelper = new EFUnitOfWorkHelper(_salesUnitOfWork); var matches = (order.SalesOrderItems ?? new SalesOrderItem[0]).BestMatches(newItems, (c, n) => n.ContractItemKey == null ? c.ContractItem == null : n.ContractItemKey.Equals(c.ContractItem), (c, n) => n.ProductKey.Equals(c.InventoryPickOrderItem), (c, n) => n.PackagingProductKey.Equals(c.InventoryPickOrderItem), (c, n) => n.InventoryTreatmentKey.Equals(c.InventoryPickOrderItem), (c, n) => n.SalesOrderItem.Quantity == c.InventoryPickOrderItem.Quantity, (c, n) => n.SalesOrderItem.CustomerLotCode == c.InventoryPickOrderItem.CustomerLotCode, (c, n) => n.SalesOrderItem.CustomerProductCode == c.InventoryPickOrderItem.CustomerProductCode, (c, n) => n.SalesOrderItem.PriceBase == c.PriceBase, (c, n) => n.SalesOrderItem.PriceFreight == c.PriceFreight, (c, n) => n.SalesOrderItem.PriceTreatment == c.PriceTreatment, (c, n) => n.SalesOrderItem.PriceWarehouse == c.PriceWarehouse, (c, n) => n.SalesOrderItem.PriceRebate == c.PriceRebate); foreach (var match in matches) { if (match.Item1 != null && match.Item2 != null) { SetOrderItem(match.Item1, match.Item2); } else if (match.Item1 != null) { if (match.Item1.PickedItems.Any()) { return(new InvalidResult(UserMessages.CannotRemovePickedCustomerOrderItem)); } _salesUnitOfWork.InventoryPickOrderItemRepository.Remove(match.Item1.InventoryPickOrderItem); _salesUnitOfWork.SalesOrderItemRepository.Remove(match.Item1); } else if (match.Item2 != null) { var nextItemSequence = unitOfWorkHelper.GetNextSequence <SalesOrderItem>(i => i.DateCreated == order.DateCreated && i.Sequence == order.Sequence, i => i.ItemSequence); SetOrderItem(_salesUnitOfWork.SalesOrderItemRepository.Add(new SalesOrderItem { DateCreated = order.DateCreated, Sequence = order.Sequence, ItemSequence = nextItemSequence, InventoryPickOrderItem = new InventoryPickOrderItem { DateCreated = order.DateCreated, OrderSequence = order.Sequence, ItemSequence = nextItemSequence } }), match.Item2); } } return(new SuccessResult()); }
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)); }