public void GivenOrderItemWithOrderedWithFeature_WhenDeriving_ThenOrderedWithFeatureOrderItemMustBeForProductFeature() { this.InstantiateObjects(this.DatabaseSession); var salesOrder = new SalesOrderBuilder(this.DatabaseSession) .WithTakenByInternalOrganisation(this.internalOrganisation) .WithShipToAddress(this.shipToContactMechanismMechelen) .WithBillToCustomer(this.billToCustomer) .Build(); var productOrderItem = new SalesOrderItemBuilder(this.DatabaseSession) .WithProduct(this.good) .WithQuantityOrdered(3) .WithActualUnitPrice(5) .Build(); var productFeatureOrderItem = new SalesOrderItemBuilder(this.DatabaseSession) .WithProductFeature(this.feature1) .WithQuantityOrdered(3) .WithActualUnitPrice(5) .Build(); productOrderItem.AddOrderedWithFeature(productFeatureOrderItem); salesOrder.AddSalesOrderItem(productOrderItem); salesOrder.AddSalesOrderItem(productFeatureOrderItem); Assert.IsFalse(this.DatabaseSession.Derive().HasErrors); productFeatureOrderItem.RemoveProductFeature(); productFeatureOrderItem.Product = this.good; Assert.IsTrue(this.DatabaseSession.Derive().HasErrors); }
public void GivenPickList_WhenPicked_ThenInventoryIsAdjustedAndOrderItemsQuantityPickedIsSet() { 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) .WithCurrency(new Currencies(this.Session).FindBy(M.Currency.IsoCode, "EUR")) .WithPrice(7) .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 good1Inventory = (NonSerialisedInventoryItem)good1.Part.InventoryItemsWherePart.First; var good2Inventory = (NonSerialisedInventoryItem)good2.Part.InventoryItemsWherePart.First; var colorWhite = new ColourBuilder(this.Session) .WithName("white") .Build(); var extraLarge = new SizeBuilder(this.Session) .WithName("Extra large") .Build(); var order = new SalesOrderBuilder(this.Session) .WithBillToCustomer(customer) .WithShipToCustomer(customer) .WithVatRegime(new VatRegimes(this.Session).Export) .Build(); var item1 = new SalesOrderItemBuilder(this.Session).WithProduct(good1).WithQuantityOrdered(1).WithActualUnitPrice(15).Build(); var item2 = new SalesOrderItemBuilder(this.Session).WithInvoiceItemType(new InvoiceItemTypes(this.Session).ProductFeatureItem).WithProductFeature(colorWhite).WithQuantityOrdered(1).WithActualUnitPrice(15).Build(); var item3 = new SalesOrderItemBuilder(this.Session).WithInvoiceItemType(new InvoiceItemTypes(this.Session).ProductFeatureItem).WithProductFeature(extraLarge).WithQuantityOrdered(1).WithActualUnitPrice(15).Build(); item1.AddOrderedWithFeature(item2); item1.AddOrderedWithFeature(item3); var item4 = new SalesOrderItemBuilder(this.Session).WithProduct(good1).WithQuantityOrdered(2).WithActualUnitPrice(15).Build(); var item5 = new SalesOrderItemBuilder(this.Session).WithProduct(good2).WithQuantityOrdered(5).WithActualUnitPrice(15).Build(); order.AddSalesOrderItem(item1); order.AddSalesOrderItem(item2); order.AddSalesOrderItem(item3); order.AddSalesOrderItem(item4); order.AddSalesOrderItem(item5); this.Session.Derive(); order.Confirm(); this.Session.Derive(); var shipment = (CustomerShipment)mechelenAddress.ShipmentsWhereShipToAddress[0]; var pickList = good1.Part.InventoryItemsWherePart[0].PickListItemsWhereInventoryItem[0].PickListWherePickListItem; pickList.Picker = new People(this.Session).FindBy(M.Person.LastName, "orderProcessor"); //// item5: only 4 out of 5 are actually picked foreach (PickListItem pickListItem in pickList.PickListItems) { if (pickListItem.RequestedQuantity == 5) { pickListItem.ActualQuantity = 4; } } pickList.SetPicked(); this.Session.Derive(); //// all orderitems have same physical finished good, so there is only one picklist item. Assert.Equal(1, item1.QuantityPicked); Assert.Equal(0, item1.QuantityReserved); Assert.Equal(0, item1.QuantityRequestsShipping); Assert.Equal(2, item4.QuantityPicked); Assert.Equal(0, item4.QuantityReserved); Assert.Equal(0, item4.QuantityRequestsShipping); Assert.Equal(4, item5.QuantityPicked); Assert.Equal(1, item5.QuantityReserved); Assert.Equal(0, item5.QuantityRequestsShipping); Assert.Equal(97, good1Inventory.QuantityOnHand); Assert.Equal(0, good1Inventory.QuantityCommittedOut); Assert.Equal(96, good2Inventory.QuantityOnHand); Assert.Equal(1, good2Inventory.QuantityCommittedOut); }
public void GivenPickList_WhenPicked_ThenInventoryIsAdjustedAndOrderItemsQuantityPickedIsSet() { var mechelen = new CityBuilder(this.DatabaseSession).WithName("Mechelen").Build(); var mechelenAddress = new PostalAddressBuilder(this.DatabaseSession).WithGeographicBoundary(mechelen).WithAddress1("Haverwerf 15").Build(); var shipToMechelen = new PartyContactMechanismBuilder(this.DatabaseSession) .WithContactMechanism(mechelenAddress) .WithContactPurpose(new ContactMechanismPurposes(this.DatabaseSession).ShippingAddress) .WithUseAsDefault(true) .Build(); var supplier = new OrganisationBuilder(this.DatabaseSession).WithName("supplier").Build(); var customer = new PersonBuilder(this.DatabaseSession).WithLastName("person1").WithPartyContactMechanism(shipToMechelen).Build(); var internalOrganisation = new InternalOrganisations(this.DatabaseSession).FindBy(InternalOrganisations.Meta.Name, "internalOrganisation"); new CustomerRelationshipBuilder(this.DatabaseSession).WithFromDate(DateTime.UtcNow).WithCustomer(customer).WithInternalOrganisation(internalOrganisation).Build(); new SupplierRelationshipBuilder(this.DatabaseSession) .WithInternalOrganisation(new InternalOrganisations(this.DatabaseSession).FindBy(InternalOrganisations.Meta.Name, "internalOrganisation")) .WithSupplier(supplier) .WithFromDate(DateTime.UtcNow) .Build(); var vatRate21 = new VatRateBuilder(this.DatabaseSession).WithRate(21).Build(); var good1 = new GoodBuilder(this.DatabaseSession) .WithSku("10101") .WithVatRate(vatRate21) .WithName("good1") .WithInventoryItemKind(new InventoryItemKinds(this.DatabaseSession).NonSerialized) .WithUnitOfMeasure(new UnitsOfMeasure(this.DatabaseSession).Piece) .Build(); var good2 = new GoodBuilder(this.DatabaseSession) .WithSku("10102") .WithVatRate(vatRate21) .WithName("good2") .WithInventoryItemKind(new InventoryItemKinds(this.DatabaseSession).NonSerialized) .WithUnitOfMeasure(new UnitsOfMeasure(this.DatabaseSession).Piece) .Build(); var good1PurchasePrice = new ProductPurchasePriceBuilder(this.DatabaseSession) .WithCurrency(new Currencies(this.DatabaseSession).FindBy(Currencies.Meta.IsoCode, "EUR")) .WithFromDate(DateTime.UtcNow) .WithPrice(7) .WithUnitOfMeasure(new UnitsOfMeasure(this.DatabaseSession).Piece) .Build(); var good2PurchasePrice = new ProductPurchasePriceBuilder(this.DatabaseSession) .WithCurrency(new Currencies(this.DatabaseSession).FindBy(Currencies.Meta.IsoCode, "EUR")) .WithFromDate(DateTime.UtcNow) .WithPrice(7) .WithUnitOfMeasure(new UnitsOfMeasure(this.DatabaseSession).Piece) .Build(); new SupplierOfferingBuilder(this.DatabaseSession) .WithProduct(good1) .WithProductPurchasePrice(good1PurchasePrice) .WithSupplier(supplier) .WithFromDate(DateTime.UtcNow) .Build(); new SupplierOfferingBuilder(this.DatabaseSession) .WithProduct(good2) .WithProductPurchasePrice(good2PurchasePrice) .WithSupplier(supplier) .WithFromDate(DateTime.UtcNow) .Build(); this.DatabaseSession.Derive(true); var good1Inventory = (NonSerializedInventoryItem)good1.InventoryItemsWhereGood[0]; good1Inventory.AddInventoryItemVariance(new InventoryItemVarianceBuilder(this.DatabaseSession).WithQuantity(100).WithReason(new VarianceReasons(this.DatabaseSession).Unknown).Build()); this.DatabaseSession.Derive(true); var good2Inventory = (NonSerializedInventoryItem)good2.InventoryItemsWhereGood[0]; good2Inventory.AddInventoryItemVariance(new InventoryItemVarianceBuilder(this.DatabaseSession).WithQuantity(100).WithReason(new VarianceReasons(this.DatabaseSession).Unknown).Build()); this.DatabaseSession.Derive(true); var colorWhite = new ColourBuilder(this.DatabaseSession) .WithName("white") .WithLocalisedName(new LocalisedTextBuilder(this.DatabaseSession) .WithText("white") .WithLocale(Singleton.Instance(this.DatabaseSession).DefaultLocale) .Build()) .Build(); var extraLarge = new SizeBuilder(this.DatabaseSession) .WithName("extra large") .WithLocalisedName(new LocalisedTextBuilder(this.DatabaseSession) .WithText("Extra large") .WithLocale(Singleton.Instance(this.DatabaseSession).DefaultLocale) .Build()) .Build(); var order = new SalesOrderBuilder(this.DatabaseSession) .WithBillToCustomer(customer) .WithShipToCustomer(customer) .WithVatRegime(new VatRegimes(this.DatabaseSession).Export) .Build(); var item1 = new SalesOrderItemBuilder(this.DatabaseSession).WithProduct(good1).WithQuantityOrdered(1).WithActualUnitPrice(15).Build(); var item2 = new SalesOrderItemBuilder(this.DatabaseSession).WithProductFeature(colorWhite).WithQuantityOrdered(1).WithActualUnitPrice(15).Build(); var item3 = new SalesOrderItemBuilder(this.DatabaseSession).WithProductFeature(extraLarge).WithQuantityOrdered(1).WithActualUnitPrice(15).Build(); item1.AddOrderedWithFeature(item2); item1.AddOrderedWithFeature(item3); var item4 = new SalesOrderItemBuilder(this.DatabaseSession).WithProduct(good1).WithQuantityOrdered(2).WithActualUnitPrice(15).Build(); var item5 = new SalesOrderItemBuilder(this.DatabaseSession).WithProduct(good2).WithQuantityOrdered(5).WithActualUnitPrice(15).Build(); order.AddSalesOrderItem(item1); order.AddSalesOrderItem(item2); order.AddSalesOrderItem(item3); order.AddSalesOrderItem(item4); order.AddSalesOrderItem(item5); this.DatabaseSession.Derive(true); order.Confirm(); this.DatabaseSession.Derive(true); var shipment = (CustomerShipment)mechelenAddress.ShipmentsWhereShipToAddress[0]; var pickList = good1.InventoryItemsWhereGood[0].PickListItemsWhereInventoryItem[0].PickListWherePickListItem; pickList.Picker = new Persons(this.DatabaseSession).FindBy(Persons.Meta.LastName, "orderProcessor"); //// item5: only 4 out of 5 are actually picked foreach (PickListItem pickListItem in pickList.PickListItems) { if (pickListItem.RequestedQuantity == 5) { pickListItem.ActualQuantity = 4; } } pickList.SetPicked(); this.DatabaseSession.Derive(true); //// all orderitems have same physical finished good, so there is only one picklist item. Assert.AreEqual(new CustomerShipmentObjectStates(this.DatabaseSession).Picked, shipment.CurrentShipmentStatus.CustomerShipmentObjectState); Assert.AreEqual(new PickListObjectStates(this.DatabaseSession).Picked, pickList.CurrentPickListStatus.PickListObjectState); Assert.AreEqual(1, item1.QuantityPicked); Assert.AreEqual(0, item1.QuantityReserved); Assert.AreEqual(0, item1.QuantityRequestsShipping); Assert.AreEqual(2, item4.QuantityPicked); Assert.AreEqual(0, item4.QuantityReserved); Assert.AreEqual(0, item4.QuantityRequestsShipping); Assert.AreEqual(4, item5.QuantityPicked); Assert.AreEqual(1, item5.QuantityReserved); Assert.AreEqual(0, item5.QuantityRequestsShipping); Assert.AreEqual(97, good1Inventory.QuantityOnHand); Assert.AreEqual(0, good1Inventory.QuantityCommittedOut); Assert.AreEqual(96, good2Inventory.QuantityOnHand); Assert.AreEqual(1, good2Inventory.QuantityCommittedOut); }
public void GivenSalesOrderWithMultipleRecipients_WhenConfirmed_ThenShipmentIsCreatedForEachRecipientAndPickListIsCreated() { var mechelen = new CityBuilder(this.DatabaseSession).WithName("Mechelen").Build(); var mechelenAddress = new PostalAddressBuilder(this.DatabaseSession).WithGeographicBoundary(mechelen).WithAddress1("Haverwerf 15").Build(); var shipToMechelen = new PartyContactMechanismBuilder(this.DatabaseSession) .WithContactMechanism(mechelenAddress) .WithContactPurpose(new ContactMechanismPurposes(this.DatabaseSession).ShippingAddress) .WithUseAsDefault(true) .Build(); var baal = new CityBuilder(this.DatabaseSession).WithName("Baal").Build(); var baalAddress = new PostalAddressBuilder(this.DatabaseSession).WithGeographicBoundary(baal).WithAddress1("Haverwerf 15").Build(); var shipToBaal = new PartyContactMechanismBuilder(this.DatabaseSession) .WithContactMechanism(baalAddress) .WithContactPurpose(new ContactMechanismPurposes(this.DatabaseSession).ShippingAddress) .WithUseAsDefault(true) .Build(); var person1 = new PersonBuilder(this.DatabaseSession).WithLastName("person1").WithPartyContactMechanism(shipToMechelen).Build(); var person2 = new PersonBuilder(this.DatabaseSession).WithLastName("person2").WithPartyContactMechanism(shipToBaal).Build(); var internalOrganisation = Singleton.Instance(this.DatabaseSession).DefaultInternalOrganisation; new CustomerRelationshipBuilder(this.DatabaseSession).WithFromDate(DateTime.UtcNow).WithCustomer(person1).WithInternalOrganisation(internalOrganisation).Build(); new CustomerRelationshipBuilder(this.DatabaseSession).WithFromDate(DateTime.UtcNow).WithCustomer(person2).WithInternalOrganisation(internalOrganisation).Build(); var vatRate21 = new VatRateBuilder(this.DatabaseSession).WithRate(21).Build(); var part = new FinishedGoodBuilder(this.DatabaseSession) .WithName("part1") .WithOwnedByParty(new InternalOrganisations(this.DatabaseSession).FindBy(InternalOrganisations.Meta.Name, "internalOrganisation")) .Build(); this.DatabaseSession.Derive(true); var partInventory = (NonSerializedInventoryItem)part.InventoryItemsWherePart[0]; partInventory.AddInventoryItemVariance(new InventoryItemVarianceBuilder(this.DatabaseSession).WithQuantity(100).WithReason(new VarianceReasons(this.DatabaseSession).Unknown).Build()); this.DatabaseSession.Derive(true); var good1 = new GoodBuilder(this.DatabaseSession) .WithSku("10101") .WithVatRate(vatRate21) .WithName("good1") .WithFinishedGood(part) .WithUnitOfMeasure(new UnitsOfMeasure(this.DatabaseSession).Piece) .Build(); var good2 = new GoodBuilder(this.DatabaseSession) .WithSku("10102") .WithVatRate(vatRate21) .WithName("good2") .WithFinishedGood(part) .WithUnitOfMeasure(new UnitsOfMeasure(this.DatabaseSession).Piece) .Build(); var colorBlack = new ColourBuilder(this.DatabaseSession) .WithName("white") .WithLocalisedName(new LocalisedTextBuilder(this.DatabaseSession) .WithText("White") .WithLocale(Singleton.Instance(this.DatabaseSession).DefaultLocale) .Build()) .Build(); var extraLarge = new SizeBuilder(this.DatabaseSession) .WithName("Extra large") .WithLocalisedName(new LocalisedTextBuilder(this.DatabaseSession) .WithText("White") .WithLocale(Singleton.Instance(this.DatabaseSession).DefaultLocale) .Build()) .Build(); var order = new SalesOrderBuilder(this.DatabaseSession) .WithBillToCustomer(person1) .WithShipToCustomer(person1) .WithShipToAddress(mechelenAddress) .WithVatRegime(new VatRegimes(this.DatabaseSession).Export) .Build(); var item1 = new SalesOrderItemBuilder(this.DatabaseSession).WithProduct(good1).WithQuantityOrdered(1).WithActualUnitPrice(15).Build(); var item2 = new SalesOrderItemBuilder(this.DatabaseSession).WithProductFeature(colorBlack).WithQuantityOrdered(1).WithActualUnitPrice(15).Build(); var item3 = new SalesOrderItemBuilder(this.DatabaseSession).WithProductFeature(extraLarge).WithQuantityOrdered(1).WithActualUnitPrice(15).Build(); item1.AddOrderedWithFeature(item2); item1.AddOrderedWithFeature(item3); var item4 = new SalesOrderItemBuilder(this.DatabaseSession).WithProduct(good1).WithQuantityOrdered(2).WithActualUnitPrice(15).Build(); var item5 = new SalesOrderItemBuilder(this.DatabaseSession).WithProduct(good2).WithQuantityOrdered(5).WithActualUnitPrice(15).WithAssignedShipToParty(person2).Build(); order.AddSalesOrderItem(item1); order.AddSalesOrderItem(item2); order.AddSalesOrderItem(item3); order.AddSalesOrderItem(item4); order.AddSalesOrderItem(item5); this.DatabaseSession.Derive(true); order.Confirm(); this.DatabaseSession.Derive(true); var shipmentToMechelen = mechelenAddress.ShipmentsWhereShipToAddress[0]; var shipmentToBaal = baalAddress.ShipmentsWhereShipToAddress[0]; this.DatabaseSession.Derive(true); Assert.AreEqual(mechelenAddress, shipmentToMechelen.ShipToAddress); Assert.AreEqual(1, shipmentToMechelen.ShipmentItems.Count); Assert.AreEqual(3, shipmentToMechelen.ShipmentItems[0].Quantity); Assert.AreEqual(baalAddress, shipmentToBaal.ShipToAddress); Assert.AreEqual(1, shipmentToBaal.ShipmentItems.Count); Assert.AreEqual(good2, shipmentToBaal.ShipmentItems[0].Good); Assert.AreEqual(5, shipmentToBaal.ShipmentItems[0].Quantity); }
public void GivenOrderItemForGood1WithFeature2_WhenDerivingPrices_ThenUsePriceComponentsForGood1AndFeature2() { this.InstantiateObjects(this.DatabaseSession); const decimal quantityOrdered = 3; var item1 = new SalesOrderItemBuilder(this.DatabaseSession).WithProduct(this.good).WithQuantityOrdered(quantityOrdered).Build(); var item2 = new SalesOrderItemBuilder(this.DatabaseSession).WithProductFeature(this.feature2).WithQuantityOrdered(quantityOrdered).Build(); item1.AddOrderedWithFeature(item2); this.order.AddSalesOrderItem(item1); this.order.AddSalesOrderItem(item2); this.DatabaseSession.Derive(true); var expectedCalculatedUnitPrice = this.currentGoodBasePrice.Price; expectedCalculatedUnitPrice += this.currentFeature2BasePrice.Price; var expectedTotalBasePrice = this.currentGoodBasePrice.Price * quantityOrdered; expectedTotalBasePrice += this.currentFeature2BasePrice.Price * quantityOrdered; var expectedTotalExVat = this.currentGoodBasePrice.Price * quantityOrdered; expectedTotalExVat += this.currentFeature2BasePrice.Price * quantityOrdered; Assert.AreEqual(this.currentGoodBasePrice.Price, item1.UnitBasePrice); Assert.AreEqual(0, item1.UnitDiscount); Assert.AreEqual(0, item1.UnitSurcharge); Assert.AreEqual(expectedCalculatedUnitPrice, item1.CalculatedUnitPrice); Assert.AreEqual(expectedTotalBasePrice, item1.TotalBasePrice); Assert.AreEqual(0, item1.TotalDiscount); Assert.AreEqual(0, item1.TotalSurcharge); Assert.AreEqual(expectedTotalExVat, item1.TotalExVat); Assert.AreEqual(this.currentFeature2BasePrice.Price, item2.UnitBasePrice); Assert.AreEqual(0, item2.UnitDiscount); Assert.AreEqual(0, item2.UnitSurcharge); Assert.AreEqual(this.currentFeature2BasePrice.Price, item2.CalculatedUnitPrice); Assert.AreEqual(this.currentFeature2BasePrice.Price * quantityOrdered, item2.TotalBasePrice); Assert.AreEqual(0, item2.TotalDiscount); Assert.AreEqual(0, item2.TotalSurcharge); Assert.AreEqual(this.currentFeature2BasePrice.Price * quantityOrdered, item2.TotalExVat); Assert.AreEqual(expectedTotalBasePrice, this.order.TotalBasePrice); Assert.AreEqual(0, this.order.TotalDiscount); Assert.AreEqual(0, this.order.TotalSurcharge); Assert.AreEqual(expectedTotalExVat, this.order.TotalExVat); }