public void GivenPickList_WhenActualQuantityPickedIsLess_ThenShipmentItemQuantityIsAdjusted() { var store = this.Session.Extent <Store>().First; store.IsImmediatelyPicked = false; var mechelen = new CityBuilder(this.Session).WithName("Mechelen").Build(); var mechelenAddress = new PostalAddressBuilder(this.Session).WithGeographicBoundary(mechelen).WithAddress1("Haverwerf 15").Build(); var shipToMechelen = new PartyContactMechanismBuilder(this.Session) .WithContactMechanism(mechelenAddress) .WithContactPurpose(new ContactMechanismPurposes(this.Session).ShippingAddress) .WithUseAsDefault(true) .Build(); var supplier = new OrganisationBuilder(this.Session).WithName("supplier").Build(); var customer = new PersonBuilder(this.Session).WithLastName("person1").WithPartyContactMechanism(shipToMechelen).Build(); new CustomerRelationshipBuilder(this.Session).WithFromDate(DateTime.UtcNow).WithCustomer(customer).Build(); new SupplierRelationshipBuilder(this.Session) .WithSupplier(supplier) .WithFromDate(DateTime.UtcNow) .Build(); var good1 = new NonUnifiedGoods(this.Session).FindBy(M.Good.Name, "good1"); var good2 = new NonUnifiedGoods(this.Session).FindBy(M.Good.Name, "good2"); new SupplierOfferingBuilder(this.Session) .WithPart(good1.Part) .WithSupplier(supplier) .WithFromDate(DateTime.UtcNow) .WithUnitOfMeasure(new UnitsOfMeasure(this.Session).Piece) .WithPrice(7) .WithCurrency(new Currencies(this.Session).FindBy(M.Currency.IsoCode, "EUR")) .Build(); new SupplierOfferingBuilder(this.Session) .WithPart(good2.Part) .WithSupplier(supplier) .WithFromDate(DateTime.UtcNow) .WithUnitOfMeasure(new UnitsOfMeasure(this.Session).Piece) .WithPrice(7) .WithCurrency(new Currencies(this.Session).FindBy(M.Currency.IsoCode, "EUR")) .Build(); this.Session.Derive(); new InventoryItemTransactionBuilder(this.Session).WithQuantity(100).WithReason(new InventoryTransactionReasons(this.Session).Unknown).WithPart(good1.Part).Build(); new InventoryItemTransactionBuilder(this.Session).WithQuantity(100).WithReason(new InventoryTransactionReasons(this.Session).Unknown).WithPart(good2.Part).Build(); this.Session.Derive(); var order = new SalesOrderBuilder(this.Session) .WithBillToCustomer(customer) .WithShipToCustomer(customer) .Build(); var item1 = new SalesOrderItemBuilder(this.Session).WithProduct(good1).WithQuantityOrdered(1).WithActualUnitPrice(15).Build(); var item2 = new SalesOrderItemBuilder(this.Session).WithProduct(good1).WithQuantityOrdered(2).WithActualUnitPrice(15).Build(); var item3 = new SalesOrderItemBuilder(this.Session).WithProduct(good2).WithQuantityOrdered(5).WithActualUnitPrice(15).Build(); order.AddSalesOrderItem(item1); order.AddSalesOrderItem(item2); order.AddSalesOrderItem(item3); this.Session.Derive(); order.Confirm(); this.Session.Derive(); var pickList = good1.Part.InventoryItemsWherePart[0].PickListItemsWhereInventoryItem[0].PickListWherePickListItem; pickList.Picker = new People(this.Session).FindBy(M.Person.LastName, "orderProcessor"); //// item3: only 4 out of 5 are actually picked PickListItem adjustedPicklistItem = null; foreach (PickListItem pickListItem in pickList.PickListItems) { if (pickListItem.RequestedQuantity == 5) { adjustedPicklistItem = pickListItem; } } var itemIssuance = adjustedPicklistItem.ItemIssuancesWherePickListItem[0]; var shipmentItem = adjustedPicklistItem.ItemIssuancesWherePickListItem[0].ShipmentItem; Assert.Equal(5, itemIssuance.Quantity); Assert.Equal(5, shipmentItem.Quantity); adjustedPicklistItem.ActualQuantity = 4; pickList.SetPicked(); this.Session.Derive(); Assert.Equal(4, itemIssuance.Quantity); Assert.Equal(4, shipmentItem.Quantity); }
private void CreatePickList(IDerivation derivation) { if (this.ExistShipToParty) { var pendingPickList = this.PendingPickList; if (pendingPickList != null) { foreach (PickListItem pickListItem in pendingPickList.PickListItems) { foreach (ItemIssuance itemIssuance in pickListItem.ItemIssuancesWherePickListItem) { itemIssuance.Delete(); } pendingPickList.RemovePickListItem(pickListItem); pickListItem.Delete(); } } foreach (ShipmentItem shipmentItem in this.ShipmentItems) { var quantityIssued = 0M; foreach (ItemIssuance itemIssuance in shipmentItem.ItemIssuancesWhereShipmentItem) { quantityIssued += itemIssuance.Quantity; } if (!shipmentItem.ExistItemIssuancesWhereShipmentItem || shipmentItem.Quantity > quantityIssued) { var salesOrderItem = shipmentItem.OrderShipmentsWhereShipmentItem[0].OrderItem as SalesOrderItem; if (this.PendingPickList == null) { pendingPickList = new PickListBuilder(this.Strategy.Session).WithShipToParty(this.ShipToParty).Build(); } PickListItem pickListItem = null; foreach (PickListItem item in pendingPickList.PickListItems) { if (salesOrderItem != null && item.InventoryItem.Equals(salesOrderItem.ReservedFromNonSerialisedInventoryItem)) { pickListItem = item; break; } } if (pickListItem != null) { pickListItem.RequestedQuantity += shipmentItem.Quantity; var itemIssuances = pickListItem.ItemIssuancesWherePickListItem; itemIssuances.Filter.AddEquals(M.ItemIssuance.ShipmentItem, shipmentItem); itemIssuances.First.Quantity = shipmentItem.Quantity; } else { var quantity = shipmentItem.Quantity - quantityIssued; pickListItem = new PickListItemBuilder(this.Strategy.Session) .WithInventoryItem(salesOrderItem.ReservedFromNonSerialisedInventoryItem) .WithRequestedQuantity(quantity) .WithActualQuantity(quantity) .Build(); if (salesOrderItem.ExistReservedFromNonSerialisedInventoryItem) { pickListItem.InventoryItem = salesOrderItem.ReservedFromNonSerialisedInventoryItem; } if (salesOrderItem.ExistReservedFromSerialisedInventoryItem) { pickListItem.InventoryItem = salesOrderItem.ReservedFromSerialisedInventoryItem; } if (salesOrderItem.ExistSerialisedItem) { salesOrderItem.ReservedFromSerialisedInventoryItem.SerialisedItem.AvailableForSale = false; if (salesOrderItem.ExistNewSerialisedItemState) { salesOrderItem.ReservedFromSerialisedInventoryItem.SerialisedItem.SerialisedItemState = salesOrderItem.NewSerialisedItemState; } if (salesOrderItem.NewSerialisedItemState.Equals( new SerialisedItemStates(this.strategy.Session).Sold)) { salesOrderItem.SerialisedItem.OwnedBy = this.ShipToParty; } } new ItemIssuanceBuilder(this.Strategy.Session) .WithInventoryItem(pickListItem.InventoryItem) .WithShipmentItem(shipmentItem) .WithQuantity(quantity) .WithPickListItem(pickListItem) .Build(); } pendingPickList.AddPickListItem(pickListItem); } } if (pendingPickList != null) { pendingPickList.OnDerive(x => x.WithDerivation(derivation)); } } }
public void GivenPickList_WhenActualQuantityPickedIsLess_ThenShipmentItemQuantityIsAdjusted() { var store = this.Session.Extent <Store>().First; store.IsImmediatelyPicked = false; var mechelen = new CityBuilder(this.Session).WithName("Mechelen").Build(); var mechelenAddress = new PostalAddressBuilder(this.Session).WithPostalAddressBoundary(mechelen) .WithAddress1("Haverwerf 15").Build(); var shipToMechelen = new PartyContactMechanismBuilder(this.Session) .WithContactMechanism(mechelenAddress) .WithContactPurpose(new ContactMechanismPurposes(this.Session).ShippingAddress) .WithUseAsDefault(true) .Build(); var supplier = new OrganisationBuilder(this.Session).WithName("supplier").Build(); var customer = new PersonBuilder(this.Session).WithLastName("person1") .WithPartyContactMechanism(shipToMechelen).Build(); new CustomerRelationshipBuilder(this.Session).WithFromDate(this.Session.Now()).WithCustomer(customer) .Build(); new SupplierRelationshipBuilder(this.Session) .WithSupplier(supplier) .WithFromDate(this.Session.Now()) .Build(); var good1 = new NonUnifiedGoods(this.Session).FindBy(M.Good.Name, "good1"); var good2 = new NonUnifiedGoods(this.Session).FindBy(M.Good.Name, "good2"); new SupplierOfferingBuilder(this.Session) .WithPart(good1.Part) .WithSupplier(supplier) .WithFromDate(this.Session.Now()) .WithUnitOfMeasure(new UnitsOfMeasure(this.Session).Piece) .WithPrice(7) .WithCurrency(new Currencies(this.Session).FindBy(M.Currency.IsoCode, "EUR")) .Build(); new SupplierOfferingBuilder(this.Session) .WithPart(good2.Part) .WithSupplier(supplier) .WithFromDate(this.Session.Now()) .WithUnitOfMeasure(new UnitsOfMeasure(this.Session).Piece) .WithPrice(7) .WithCurrency(new Currencies(this.Session).FindBy(M.Currency.IsoCode, "EUR")) .Build(); this.Session.Derive(); new InventoryItemTransactionBuilder(this.Session).WithQuantity(100) .WithReason(new InventoryTransactionReasons(this.Session).Unknown).WithPart(good1.Part).Build(); new InventoryItemTransactionBuilder(this.Session).WithQuantity(100) .WithReason(new InventoryTransactionReasons(this.Session).Unknown).WithPart(good2.Part).Build(); this.Session.Derive(); var order = new SalesOrderBuilder(this.Session) .WithBillToCustomer(customer) .WithShipToCustomer(customer) .Build(); var item1 = new SalesOrderItemBuilder(this.Session).WithProduct(good1).WithQuantityOrdered(1).WithAssignedUnitPrice(15).Build(); var item2 = new SalesOrderItemBuilder(this.Session).WithProduct(good1).WithQuantityOrdered(2).WithAssignedUnitPrice(15).Build(); var item3 = new SalesOrderItemBuilder(this.Session).WithProduct(good2).WithQuantityOrdered(5).WithAssignedUnitPrice(15).Build(); order.AddSalesOrderItem(item1); order.AddSalesOrderItem(item2); order.AddSalesOrderItem(item3); this.Session.Derive(); order.SetReadyForPosting(); this.Session.Derive(); order.Post(); this.Session.Derive(); order.Accept(); this.Session.Derive(); var shipment = (CustomerShipment)mechelenAddress.ShipmentsWhereShipToAddress[0]; shipment.Pick(); this.Session.Derive(); var pickList = good1.Part.InventoryItemsWherePart[0].PickListItemsWhereInventoryItem[0].PickListWherePickListItem; pickList.Picker = this.OrderProcessor; //// item3: only 4 out of 5 are actually picked PickListItem adjustedPicklistItem = null; foreach (PickListItem pickListItem in pickList.PickListItems) { if (pickListItem.Quantity == 5) { adjustedPicklistItem = pickListItem; } } var itemIssuance = adjustedPicklistItem.ItemIssuancesWherePickListItem[0]; var shipmentItem = adjustedPicklistItem.ItemIssuancesWherePickListItem[0].ShipmentItem; Assert.Equal(2, shipment.ShipmentItems.Count); Assert.Equal(5, itemIssuance.Quantity); Assert.Equal(5, shipmentItem.Quantity); Assert.Equal(5, item3.QuantityPendingShipment); adjustedPicklistItem.QuantityPicked = 4; pickList.SetPicked(); this.Session.Derive(); // When SalesOrder is derived 1 quantity is requested for shipping (because inventory is available and quantity ordered (5) is greater then quantity pending shipment (4) // A new shipment item is created with quantity 1 and QuantityPendingShipment remains 5 Assert.Equal(4, itemIssuance.Quantity); Assert.Equal(4, shipmentItem.Quantity); Assert.Equal(3, shipment.ShipmentItems.Count); Assert.Equal(1, shipment.ShipmentItems.Last().Quantity); Assert.Equal(5, item3.QuantityPendingShipment); }