public void Execute()
        {
            var singleton   = this.Session.GetSingleton();
            var dutchLocale = new Locales(this.Session).DutchNetherlands;

            singleton.AddAdditionalLocale(dutchLocale);

            var euro = new Currencies(this.Session).FindBy(M.Currency.IsoCode, "EUR");

            var be = new Countries(this.Session).FindBy(M.Country.IsoCode, "BE");
            var us = new Countries(this.Session).FindBy(M.Country.IsoCode, "US");

            var email2 = new EmailAddressBuilder(this.Session)
                         .WithElectronicAddressString("*****@*****.**")
                         .Build();

            var allorsLogo = this.DataPath + @"\www\admin\images\logo.png";

            var serialisedItemSoldOns = new SerialisedItemSoldOn[] { new SerialisedItemSoldOns(this.Session).SalesInvoiceSend, new SerialisedItemSoldOns(this.Session).PurchaseInvoiceConfirm };

            var allors = Organisations.CreateInternalOrganisation(
                session: this.Session,
                name: "Allors BVBA",
                address: "Kleine Nieuwedijkstraat 4",
                postalCode: "2800",
                locality: "Mechelen",
                country: be,
                phone1CountryCode: "+32",
                phone1: "2 335 2335",
                phone1Purpose: new ContactMechanismPurposes(this.Session).GeneralPhoneNumber,
                phone2CountryCode: string.Empty,
                phone2: string.Empty,
                phone2Purpose: null,
                emailAddress: "*****@*****.**",
                websiteAddress: "www.allors.com",
                taxNumber: "BE 0476967014",
                bankName: "ING",
                facilityName: "Allors warehouse 1",
                bic: "BBRUBEBB",
                iban: "BE89 3200 1467 7685",
                currency: euro,
                logo: allorsLogo,
                storeName: "Allors Store",
                billingProcess: new BillingProcesses(this.Session).BillingForOrderItems,
                outgoingShipmentNumberPrefix: "a-CS",
                salesInvoiceNumberPrefix: "a-SI",
                salesOrderNumberPrefix: "a-SO",
                purchaseOrderNumberPrefix: "a-PO",
                purchaseInvoiceNumberPrefix: "a-PI",
                requestNumberPrefix: "a-RFQ",
                quoteNumberPrefix: "a-Q",
                productNumberPrefix: "A-",
                workEffortPrefix: "a-WO-",
                creditNoteNumberPrefix: "a-CN-",
                isImmediatelyPicked: true,
                autoGenerateShipmentPackage: true,
                isImmediatelyPacked: true,
                isAutomaticallyShipped: true,
                autoGenerateCustomerShipment: true,
                isAutomaticallyReceived: false,
                autoGeneratePurchaseShipment: false,
                useCreditNoteSequence: true,
                requestCounterValue: 1,
                quoteCounterValue: 1,
                orderCounterValue: 1,
                purchaseOrderCounterValue: 1,
                purchaseInvoiceCounterValue: 1,
                invoiceCounterValue: 1,
                purchaseOrderNeedsApproval: true,
                purchaseOrderApprovalThresholdLevel1: 1000M,
                purchaseOrderApprovalThresholdLevel2: 5000M,
                serialisedItemSoldOns: serialisedItemSoldOns,
                collectiveWorkEffortInvoice: true);

            var dipu = Organisations.CreateInternalOrganisation(
                session: this.Session,
                name: "Dipu BVBA",
                address: "Kleine Nieuwedijkstraat 2",
                postalCode: "2800",
                locality: "Mechelen",
                country: be,
                phone1CountryCode: "+32",
                phone1: "2 15 49 49 49",
                phone1Purpose: new ContactMechanismPurposes(this.Session).GeneralPhoneNumber,
                phone2CountryCode: string.Empty,
                phone2: string.Empty,
                phone2Purpose: null,
                emailAddress: "*****@*****.**",
                websiteAddress: "www.dipu.com",
                taxNumber: "BE 0445366489",
                bankName: "ING",
                facilityName: "Dipu Facility",
                bic: "BBRUBEBB",
                iban: "BE23 3300 6167 6391",
                currency: euro,
                logo: allorsLogo,
                storeName: "Dipu Store",
                billingProcess: new BillingProcesses(this.Session).BillingForOrderItems,
                outgoingShipmentNumberPrefix: "d-CS",
                salesInvoiceNumberPrefix: "d-SI",
                salesOrderNumberPrefix: "d-SO",
                purchaseOrderNumberPrefix: "d-PO",
                purchaseInvoiceNumberPrefix: "d-PI",
                requestNumberPrefix: "d-RFQ",
                quoteNumberPrefix: "d-Q",
                productNumberPrefix: "D-",
                workEffortPrefix: "d-WO-",
                creditNoteNumberPrefix: "d-CN-",
                isImmediatelyPicked: true,
                autoGenerateShipmentPackage: true,
                isImmediatelyPacked: true,
                isAutomaticallyShipped: true,
                autoGenerateCustomerShipment: true,
                isAutomaticallyReceived: false,
                autoGeneratePurchaseShipment: false,
                useCreditNoteSequence: true,
                requestCounterValue: 1,
                quoteCounterValue: 1,
                orderCounterValue: 1,
                purchaseOrderCounterValue: 1,
                purchaseInvoiceCounterValue: 1,
                invoiceCounterValue: 1,
                purchaseOrderNeedsApproval: false,
                purchaseOrderApprovalThresholdLevel1: null,
                purchaseOrderApprovalThresholdLevel2: null,
                serialisedItemSoldOns: serialisedItemSoldOns,
                collectiveWorkEffortInvoice: true);

            singleton.Settings.DefaultFacility = allors.FacilitiesWhereOwner.First;
            var faker = this.Session.Faker();

            allors.CreateEmployee("letmein", faker);
            allors.CreateAdministrator("letmein", faker);
            var allorsB2BCustomer = allors.CreateB2BCustomer(this.Session.Faker());
            var allorsB2CCustomer = allors.CreateB2CCustomer(this.Session.Faker());

            allors.CreateSupplier(this.Session.Faker());
            allors.CreateSubContractor(this.Session.Faker());

            new CustomerRelationshipBuilder(this.Session)
            .WithCustomer(allorsB2BCustomer)
            .WithInternalOrganisation(dipu)
            .WithFromDate(this.Session.Now())
            .Build();

            new CustomerRelationshipBuilder(this.Session)
            .WithCustomer(allorsB2CCustomer)
            .WithInternalOrganisation(dipu)
            .WithFromDate(this.Session.Now())
            .Build();

            new CustomerRelationshipBuilder(this.Session)
            .WithCustomer(dipu)
            .WithInternalOrganisation(allors)
            .WithFromDate(this.Session.Now())
            .Build();

            dipu.CreateEmployee("letmein", faker);
            dipu.CreateAdministrator("letmein", faker);
            var dipuB2BCustomer = dipu.CreateB2BCustomer(this.Session.Faker());
            var dipuB2CCustomer = dipu.CreateB2CCustomer(this.Session.Faker());

            dipu.CreateSupplier(this.Session.Faker());
            dipu.CreateSubContractor(this.Session.Faker());

            new CustomerRelationshipBuilder(this.Session)
            .WithCustomer(dipuB2BCustomer)
            .WithInternalOrganisation(allors)
            .WithFromDate(this.Session.Now())
            .Build();

            new CustomerRelationshipBuilder(this.Session)
            .WithCustomer(dipuB2CCustomer)
            .WithInternalOrganisation(allors)
            .WithFromDate(this.Session.Now())
            .Build();

            new CustomerRelationshipBuilder(this.Session)
            .WithCustomer(allors)
            .WithInternalOrganisation(dipu)
            .WithFromDate(this.Session.Now())
            .Build();

            this.Session.Derive();

            var facility = new FacilityBuilder(this.Session)
                           .WithName("Allors warehouse 2")
                           .WithFacilityType(new FacilityTypes(this.Session).Warehouse)
                           .WithOwner(allors)
                           .Build();

            var store = new StoreBuilder(this.Session).WithName("store")
                        .WithInternalOrganisation(allors)
                        .WithDefaultFacility(facility)
                        .WithDefaultShipmentMethod(new ShipmentMethods(this.Session).Ground)
                        .WithDefaultCarrier(new Carriers(this.Session).Fedex)
                        .Build();

            var productType = new ProductTypeBuilder(this.Session)
                              .WithName($"Gizmo Serialised")
                              .WithSerialisedItemCharacteristicType(new SerialisedItemCharacteristicTypeBuilder(this.Session)
                                                                    .WithName("Size")
                                                                    .WithLocalisedName(new LocalisedTextBuilder(this.Session).WithText("Afmeting").WithLocale(dutchLocale).Build())
                                                                    .Build())
                              .WithSerialisedItemCharacteristicType(new SerialisedItemCharacteristicTypeBuilder(this.Session)
                                                                    .WithName("Weight")
                                                                    .WithLocalisedName(new LocalisedTextBuilder(this.Session).WithText("Gewicht").WithLocale(dutchLocale).Build())
                                                                    .WithUnitOfMeasure(new UnitsOfMeasure(this.Session).Kilogram)
                                                                    .Build())
                              .Build();

            var vatRate = new VatRateBuilder(this.Session).WithRate(21).Build();

            var brand = new BrandBuilder(this.Session).WithDefaults().Build();

            var good_1 = new UnifiedGoodBuilder(this.Session).WithNonSerialisedDefaults(allors).Build();

            this.Session.Derive();

            new InventoryItemTransactionBuilder(this.Session)
            .WithPart(good_1)
            .WithQuantity(100)
            .WithReason(new InventoryTransactionReasons(this.Session).Unknown)
            .Build();

            var good_2 = new NonUnifiedGoodBuilder(this.Session)
                         .WithSerialisedPartDefaults(allors)
                         .Build();

            var serialisedItem1 = new SerialisedItemBuilder(this.Session).WithDefaults(allors).Build();

            good_2.Part.AddSerialisedItem(serialisedItem1);

            this.Session.Derive();

            new SerialisedInventoryItemBuilder(this.Session)
            .WithPart(good_2.Part)
            .WithSerialisedItem(serialisedItem1)
            .WithFacility(allors.StoresWhereInternalOrganisation.First.DefaultFacility)
            .Build();

            var good_3 = new NonUnifiedGoodBuilder(this.Session)
                         .WithNonSerialisedPartDefaults(allors)
                         .Build();

            var good_4 = new UnifiedGoodBuilder(this.Session).WithSerialisedDefaults(allors).Build();

            var productCategory_1 = new ProductCategoryBuilder(this.Session)
                                    .WithInternalOrganisation(allors)
                                    .WithName("Best selling gizmo's")
                                    .WithLocalisedName(new LocalisedTextBuilder(this.Session).WithText("Meest verkochte gizmo's").WithLocale(dutchLocale).Build())
                                    .Build();

            var productCategory_2 = new ProductCategoryBuilder(this.Session)
                                    .WithInternalOrganisation(allors)
                                    .WithName("Big Gizmo's")
                                    .WithLocalisedName(new LocalisedTextBuilder(this.Session).WithText("Grote Gizmo's").WithLocale(dutchLocale).Build())
                                    .Build();

            var productCategory_3 = new ProductCategoryBuilder(this.Session)
                                    .WithInternalOrganisation(allors)
                                    .WithName("Small gizmo's")
                                    .WithLocalisedName(new LocalisedTextBuilder(this.Session).WithText("Kleine gizmo's").WithLocale(dutchLocale).Build())
                                    .WithProduct(good_1)
                                    .WithProduct(good_2)
                                    .WithProduct(good_3)
                                    .WithProduct(good_4)
                                    .Build();

            new CatalogueBuilder(this.Session)
            .WithInternalOrganisation(allors)
            .WithName("New gizmo's")
            .WithLocalisedName(new LocalisedTextBuilder(this.Session).WithText("Nieuwe gizmo's").WithLocale(dutchLocale).Build())
            .WithDescription("Latest in the world of Gizmo's")
            .WithLocalisedDescription(new LocalisedTextBuilder(this.Session).WithText("Laatste in de wereld van Gizmo's").WithLocale(dutchLocale).Build())
            .WithProductCategory(productCategory_1)
            .Build();

            this.Session.Derive();

            var administrator = (Person) new UserGroups(this.Session).Administrators.Members.First;

            new FaceToFaceCommunicationBuilder(this.Session)
            .WithDescription($"Meeting")
            .WithSubject($"meeting")
            .WithEventPurpose(new CommunicationEventPurposes(this.Session).Meeting)
            .WithFromParty(allors.ActiveEmployees.First)
            .WithToParty(allors.ActiveCustomers.First)
            .WithOwner(administrator)
            .WithActualStart(DateTime.UtcNow)
            .Build();

            new EmailCommunicationBuilder(this.Session)
            .WithDescription($"Email")
            .WithSubject($"email")
            .WithFromParty(allors.ActiveEmployees.First)
            .WithToParty(allors.ActiveCustomers.First)
            .WithFromEmail(allors.ActiveEmployees.First.GeneralEmail)
            .WithToEmail(allors.ActiveCustomers.First.GeneralEmail)
            .WithEventPurpose(new CommunicationEventPurposes(this.Session).Meeting)
            .WithOwner(administrator)
            .WithActualStart(DateTime.UtcNow)
            .Build();

            new LetterCorrespondenceBuilder(this.Session)
            .WithDescription($"Letter")
            .WithSubject($"letter")
            .WithFromParty(administrator)
            .WithToParty(allors.ActiveCustomers.First)
            .WithEventPurpose(new CommunicationEventPurposes(this.Session).Meeting)
            .WithOwner(administrator)
            .WithActualStart(DateTime.UtcNow)
            .Build();

            new PhoneCommunicationBuilder(this.Session)
            .WithDescription($"Phone")
            .WithSubject($"phone")
            .WithFromParty(administrator)
            .WithToParty(allors.ActiveCustomers.First)
            .WithEventPurpose(new CommunicationEventPurposes(this.Session).Meeting)
            .WithOwner(administrator)
            .WithActualStart(DateTime.UtcNow)
            .Build();

            new SalesOrderBuilder(this.Session).WithOrganisationInternalDefaults(allors).Build();
            new SalesOrderBuilder(this.Session).WithOrganisationExternalDefaults(allors).Build();
            new SalesOrderBuilder(this.Session).WithPersonInternalDefaults(allors).Build();
            new SalesOrderBuilder(this.Session).WithPersonExternalDefaults(allors).Build();

            new SalesInvoiceBuilder(this.Session).WithSalesExternalB2BInvoiceDefaults(allors).Build();

            new SupplierOfferingBuilder(this.Session)
            .WithPart(good_1)
            .WithSupplier(allors.ActiveSuppliers.First)
            .WithFromDate(this.Session.Now().AddMinutes(-1))
            .WithUnitOfMeasure(new UnitsOfMeasure(this.Session).Piece)
            .WithPrice(7)
            .WithCurrency(euro)
            .Build();

            var purchaseInvoiceItem_1 = new PurchaseInvoiceItemBuilder(this.Session)
                                        .WithDescription("first item")
                                        .WithPart(good_1)
                                        .WithAssignedUnitPrice(3000)
                                        .WithQuantity(1)
                                        .WithMessage(@"line1
line2")
                                        .WithInvoiceItemType(new InvoiceItemTypes(this.Session).ProductItem)
                                        .Build();

            var purchaseInvoiceItem_2 = new PurchaseInvoiceItemBuilder(this.Session)
                                        .WithDescription("second item")
                                        .WithAssignedUnitPrice(2000)
                                        .WithQuantity(2)
                                        .WithInvoiceItemType(new InvoiceItemTypes(this.Session).ProductItem)
                                        .Build();

            var purchaseInvoiceItem_3 = new PurchaseInvoiceItemBuilder(this.Session)
                                        .WithDescription("Service")
                                        .WithAssignedUnitPrice(100)
                                        .WithQuantity(1)
                                        .WithInvoiceItemType(new InvoiceItemTypes(this.Session).Service)
                                        .Build();

            var purchaseInvoice = new PurchaseInvoiceBuilder(this.Session)
                                  .WithBilledTo(allors)
                                  .WithInvoiceNumber("1")
                                  .WithBilledFrom(allors.ActiveSuppliers.First)
                                  .WithPurchaseInvoiceItem(purchaseInvoiceItem_1)
                                  .WithPurchaseInvoiceItem(purchaseInvoiceItem_2)
                                  .WithPurchaseInvoiceItem(purchaseInvoiceItem_3)
                                  .WithCustomerReference("a reference number")
                                  .WithDescription("Purchase of 1 used Aircraft Towbar")
                                  .WithPurchaseInvoiceType(new PurchaseInvoiceTypes(this.Session).PurchaseInvoice)
                                  .WithVatRegime(new VatRegimes(this.Session).Assessable21)
                                  .Build();

            var purchaseOrderItem_1 = new PurchaseOrderItemBuilder(this.Session)
                                      .WithDescription("first purchase order item")
                                      .WithPart(good_1)
                                      .WithQuantityOrdered(1)
                                      .Build();

            var purchaseOrder = new PurchaseOrderBuilder(this.Session)
                                .WithOrderedBy(allors)
                                .WithTakenViaSupplier(allors.ActiveSuppliers.First)
                                .WithPurchaseOrderItem(purchaseOrderItem_1)
                                .WithCustomerReference("reference 123")
                                .WithStoredInFacility(facility)
                                .Build();

            var workTask = new WorkTaskBuilder(this.Session)
                           .WithTakenBy(allors)
                           .WithCustomer(allors.ActiveCustomers.First)
                           .WithName("maintenance")
                           .Build();

            new PositionTypeBuilder(this.Session)
            .WithTitle("Mechanic")
            .WithUniqueId(new Guid("E62A8F4B-8045-472E-AB18-E39C51A02696"))
            .Build();

            new PositionTypeRateBuilder(this.Session)
            .WithRate(100)
            .WithRateType(new RateTypes(this.Session).StandardRate)
            .WithFrequency(new TimeFrequencies(this.Session).Hour)
            .Build();

            this.Session.Derive();

            // Serialized RFQ with Serialized Unified-Good
            var serializedRFQ = new RequestForQuoteBuilder(this.Session).WithSerializedDefaults(allors).Build();

            // NonSerialized RFQ with NonSerialized Unified-Good
            var nonSerializedRFQ = new RequestForQuoteBuilder(this.Session).WithNonSerializedDefaults(allors).Build();

            var quote = new ProductQuoteBuilder(this.Session)
                        .WithIssuer(allors)
                        .WithDescription("quote")
                        .WithReceiver(allors.ActiveCustomers.First)
                        .WithFullfillContactMechanism(allors.ActiveCustomers.First.GeneralCorrespondence)
                        .Build();

            this.Session.Derive();

            var quoteItem = new QuoteItemBuilder(this.Session)
                            .WithProduct(new Goods(this.Session).Extent().First)
                            .WithQuantity(1)
                            .WithAssignedUnitPrice(10)
                            .Build();

            quote.AddQuoteItem(quoteItem);

            this.Session.Derive();

            var salesOrder = new SalesOrderBuilder(this.Session)
                             .WithTakenBy(allors)
                             .WithShipToCustomer(allors.ActiveCustomers.First)
                             .Build();

            this.Session.Derive();

            var salesOrderItem = new SalesOrderItemBuilder(this.Session)
                                 .WithProduct(good_1)
                                 .WithQuantityOrdered(1)
                                 .WithAssignedUnitPrice(10)
                                 .Build();

            salesOrder.AddSalesOrderItem(salesOrderItem);

            this.Session.Derive();

            new CustomerShipmentBuilder(this.Session).WithDefaults(allors).Build();

            this.Session.Derive();

            new PurchaseShipmentBuilder(this.Session).WithDefaults(allors).Build();

            this.Session.Derive();
        }
        public static Organisation CreateInternalOrganisation(
            ISession session,
            string name,
            string address,
            string postalCode,
            string locality,
            Country country,
            string phone1CountryCode,
            string phone1,
            ContactMechanismPurpose phone1Purpose,
            string phone2CountryCode,
            string phone2,
            ContactMechanismPurpose phone2Purpose,
            string emailAddress,
            string websiteAddress,
            string taxNumber,
            string bankName,
            string facilityName,
            string bic,
            string iban,
            Currency currency,
            string logo,
            string storeName,
            BillingProcess billingProcess,
            string outgoingShipmentNumberPrefix,
            string salesInvoiceNumberPrefix,
            string salesOrderNumberPrefix,
            string purchaseOrderNumberPrefix,
            string purchaseInvoiceNumberPrefix,
            string requestNumberPrefix,
            string quoteNumberPrefix,
            string productNumberPrefix,
            string workEffortPrefix,
            string creditNoteNumberPrefix,
            bool isImmediatelyPicked,
            bool autoGenerateShipmentPackage,
            bool isImmediatelyPacked,
            bool isAutomaticallyShipped,
            bool autoGenerateCustomerShipment,
            bool isAutomaticallyReceived,
            bool autoGeneratePurchaseShipment,
            bool useCreditNoteSequence,
            int?requestCounterValue,
            int?quoteCounterValue,
            int?orderCounterValue,
            int?purchaseOrderCounterValue,
            int?invoiceCounterValue,
            int?purchaseInvoiceCounterValue,
            bool purchaseOrderNeedsApproval,
            decimal?purchaseOrderApprovalThresholdLevel1,
            decimal?purchaseOrderApprovalThresholdLevel2,
            SerialisedItemSoldOn serialisedItemSoldOn,
            bool collectiveWorkEffortInvoice)
        {
            var postalAddress1 = new PostalAddressBuilder(session)
                                 .WithAddress1(address)
                                 .WithPostalCode(postalCode)
                                 .WithLocality(locality)
                                 .WithCountry(country)
                                 .Build();

            var webSite = new WebAddressBuilder(session)
                          .WithElectronicAddressString(websiteAddress)
                          .Build();

            BankAccount bankAccount = null;

            if (!string.IsNullOrEmpty(bic) && !string.IsNullOrEmpty(iban))
            {
                var bank = new BankBuilder(session).WithName(bankName).WithBic(bic).WithCountry(country).Build();
                bankAccount = new BankAccountBuilder(session)
                              .WithBank(bank)
                              .WithIban(iban)
                              .WithNameOnAccount(name)
                              .WithCurrency(currency)
                              .Build();
            }

            var internalOrganisation = new OrganisationBuilder(session)
                                       .WithIsInternalOrganisation(true)
                                       .WithTaxNumber(taxNumber)
                                       .WithName(name)
                                       .WithPreferredCurrency(new Currencies(session).FindBy(M.Currency.IsoCode, "EUR"))
                                       .WithInvoiceSequence(new InvoiceSequences(session).EnforcedSequence)
                                       .WithFiscalYearStartMonth(01)
                                       .WithFiscalYearStartDay(01)
                                       .WithDoAccounting(false)
                                       .WithRequestNumberPrefix(requestNumberPrefix)
                                       .WithQuoteNumberPrefix(quoteNumberPrefix)
                                       .WithWorkEffortPrefix(workEffortPrefix)
                                       .WithPurchaseOrderNumberPrefix(purchaseOrderNumberPrefix)
                                       .WithPurchaseInvoiceNumberPrefix(purchaseInvoiceNumberPrefix)
                                       .WithPurchaseOrderNeedsApproval(purchaseOrderNeedsApproval)
                                       .WithPurchaseOrderApprovalThresholdLevel1(purchaseOrderApprovalThresholdLevel1)
                                       .WithPurchaseOrderApprovalThresholdLevel2(purchaseOrderApprovalThresholdLevel2)
                                       .WithAutoGeneratePurchaseShipment(autoGeneratePurchaseShipment)
                                       .WithIsAutomaticallyReceived(isAutomaticallyReceived)
                                       .WithSerialisedItemSoldOn(serialisedItemSoldOn)
                                       .WithCollectiveWorkEffortInvoice(collectiveWorkEffortInvoice)
                                       .Build();

            if (purchaseOrderCounterValue != null)
            {
                internalOrganisation.PurchaseOrderCounter = new CounterBuilder(session).WithValue(purchaseOrderCounterValue).Build();
            }

            if (purchaseInvoiceCounterValue != null)
            {
                internalOrganisation.PurchaseInvoiceCounter = new CounterBuilder(session).WithValue(purchaseInvoiceCounterValue).Build();
            }

            OwnBankAccount defaultCollectionMethod = null;

            if (bankAccount != null)
            {
                internalOrganisation.AddBankAccount(bankAccount);
                defaultCollectionMethod = new OwnBankAccountBuilder(session).WithBankAccount(bankAccount).WithDescription("Huisbank").Build();
                internalOrganisation.DefaultCollectionMethod = defaultCollectionMethod;
            }

            if (requestCounterValue != null)
            {
                internalOrganisation.RequestCounter = new CounterBuilder(session).WithValue(requestCounterValue).Build();
            }

            if (quoteCounterValue != null)
            {
                internalOrganisation.QuoteCounter = new CounterBuilder(session).WithValue(quoteCounterValue).Build();
            }

            if (!string.IsNullOrEmpty(emailAddress))
            {
                var email = new EmailAddressBuilder(session)
                            .WithElectronicAddressString(emailAddress)
                            .Build();

                internalOrganisation.AddPartyContactMechanism(new PartyContactMechanismBuilder(session)
                                                              .WithUseAsDefault(true)
                                                              .WithContactMechanism(email)
                                                              .WithContactPurpose(new ContactMechanismPurposes(session).GeneralEmail)
                                                              .Build());
            }

            internalOrganisation.AddPartyContactMechanism(new PartyContactMechanismBuilder(session)
                                                          .WithUseAsDefault(true)
                                                          .WithContactMechanism(postalAddress1)
                                                          .WithContactPurpose(new ContactMechanismPurposes(session).RegisteredOffice)
                                                          .WithContactPurpose(new ContactMechanismPurposes(session).GeneralCorrespondence)
                                                          .WithContactPurpose(new ContactMechanismPurposes(session).BillingAddress)
                                                          .WithContactPurpose(new ContactMechanismPurposes(session).ShippingAddress)
                                                          .Build());
            internalOrganisation.AddPartyContactMechanism(new PartyContactMechanismBuilder(session)
                                                          .WithUseAsDefault(true)
                                                          .WithContactMechanism(webSite)
                                                          .WithContactPurpose(new ContactMechanismPurposes(session).InternetAddress)
                                                          .Build());

            TelecommunicationsNumber phoneNumber1 = null;

            if (!string.IsNullOrEmpty(phone1))
            {
                phoneNumber1 = new TelecommunicationsNumberBuilder(session).WithContactNumber(phone1).Build();
                if (!string.IsNullOrEmpty(phone1CountryCode))
                {
                    phoneNumber1.CountryCode = phone1CountryCode;
                }
            }

            if (phoneNumber1 != null)
            {
                internalOrganisation.AddPartyContactMechanism(new PartyContactMechanismBuilder(session)
                                                              .WithUseAsDefault(true)
                                                              .WithContactMechanism(phoneNumber1)
                                                              .WithContactPurpose(phone1Purpose)
                                                              .Build());
            }

            TelecommunicationsNumber phoneNumber2 = null;

            if (!string.IsNullOrEmpty(phone2))
            {
                phoneNumber2 = new TelecommunicationsNumberBuilder(session).WithContactNumber(phone2).Build();
                if (!string.IsNullOrEmpty(phone2CountryCode))
                {
                    phoneNumber2.CountryCode = phone2CountryCode;
                }
            }

            if (phoneNumber2 != null)
            {
                internalOrganisation.AddPartyContactMechanism(new PartyContactMechanismBuilder(session)
                                                              .WithUseAsDefault(true)
                                                              .WithContactMechanism(phoneNumber2)
                                                              .WithContactPurpose(phone2Purpose)
                                                              .Build());
            }

            if (!string.IsNullOrWhiteSpace(logo))
            {
                var logoFile = new FileInfo(logo);
                if (logoFile.Exists)
                {
                    internalOrganisation.LogoImage = logoFile.CreateMedia(session);
                }
            }

            Facility facility = null;

            if (facilityName != null)
            {
                facility = new FacilityBuilder(session)
                           .WithName(facilityName)
                           .WithFacilityType(new FacilityTypes(session).Warehouse)
                           .WithOwner(internalOrganisation)
                           .Build();
            }

            var store = new StoreBuilder(session)
                        .WithName(storeName)
                        .WithOutgoingShipmentNumberPrefix(outgoingShipmentNumberPrefix)
                        .WithSalesInvoiceNumberPrefix(salesInvoiceNumberPrefix)
                        .WithSalesOrderNumberPrefix(salesOrderNumberPrefix)
                        .WithDefaultCollectionMethod(defaultCollectionMethod)
                        .WithCreditNoteNumberPrefix(creditNoteNumberPrefix)
                        .WithDefaultShipmentMethod(new ShipmentMethods(session).Ground)
                        .WithDefaultCarrier(new Carriers(session).Fedex)
                        .WithBillingProcess(billingProcess)
                        .WithSalesInvoiceCounter(new CounterBuilder(session).WithUniqueId(Guid.NewGuid()).WithValue(0).Build())
                        .WithIsImmediatelyPicked(isImmediatelyPicked)
                        .WithAutoGenerateShipmentPackage(autoGenerateShipmentPackage)
                        .WithIsImmediatelyPacked(isImmediatelyPacked)
                        .WithIsAutomaticallyShipped(isAutomaticallyShipped)
                        .WithAutoGenerateCustomerShipment(autoGenerateCustomerShipment)
                        .WithUseCreditNoteSequence(useCreditNoteSequence)
                        .WithInternalOrganisation(internalOrganisation)
                        .Build();

            if (defaultCollectionMethod == null)
            {
                store.DefaultCollectionMethod = new CashBuilder(session).Build();
            }
            else
            {
                store.DefaultCollectionMethod = defaultCollectionMethod;
            }

            if (facility != null)
            {
                store.DefaultFacility = facility;
            }

            if (orderCounterValue != null)
            {
                store.SalesOrderCounter = new CounterBuilder(session).WithValue(orderCounterValue).Build();
            }

            if (invoiceCounterValue != null)
            {
                store.SalesInvoiceCounter = new CounterBuilder(session).WithValue(invoiceCounterValue).Build();
            }

            return(internalOrganisation);
        }
        public static void Full(this Singleton @this, DirectoryInfo dataPath, Faker faker)
        {
            var dutchLocale = new Locales(@this.Session()).DutchNetherlands;

            @this.AddAdditionalLocale(dutchLocale);

            var administrator = new PersonBuilder(@this.Session()).WithUserName("administrator").Build();

            new UserGroups(@this.Session()).Administrators.AddMember(administrator);
            new UserGroups(@this.Session()).Creators.AddMember(administrator);

            @this.Session().Derive();

            var euro = new Currencies(@this.Session()).FindBy(M.Currency.IsoCode, "EUR");

            var be = new Countries(@this.Session()).FindBy(M.Country.IsoCode, "BE");
            var us = new Countries(@this.Session()).FindBy(M.Country.IsoCode, "US");

            var allorsLogo = dataPath + @"\www\admin\images\logo.png";

            var serialisedItemSoldOns = new SerialisedItemSoldOn[] { new SerialisedItemSoldOns(@this.Session()).SalesInvoiceSend, new SerialisedItemSoldOns(@this.Session()).PurchaseInvoiceConfirm };

            var allors = Organisations.CreateInternalOrganisation(
                session: @this.Session(),
                name: "Allors BVBA",
                address: "Kleine Nieuwedijkstraat 4",
                postalCode: "2800",
                locality: "Mechelen",
                country: be,
                phone1CountryCode: "+32",
                phone1: "2 335 2335",
                phone1Purpose: new ContactMechanismPurposes(@this.Session()).GeneralPhoneNumber,
                phone2CountryCode: string.Empty,
                phone2: string.Empty,
                phone2Purpose: null,
                emailAddress: "*****@*****.**",
                websiteAddress: "www.allors.com",
                taxNumber: "BE 0476967014",
                bankName: "ING",
                facilityName: "Allors Warehouse 1",
                bic: "BBRUBEBB",
                iban: "BE89 3200 1467 7685",
                currency: euro,
                logo: "allors.png",
                storeName: "Allors Store",
                billingProcess: new BillingProcesses(@this.Session()).BillingForOrderItems,
                outgoingShipmentNumberPrefix: "a-CS",
                salesInvoiceNumberPrefix: "a-SI-{year}-",
                salesOrderNumberPrefix: "a-SO",
                purchaseOrderNumberPrefix: "a-PO",
                purchaseInvoiceNumberPrefix: "a-PI",
                requestNumberPrefix: "a-RFQ",
                quoteNumberPrefix: "a-Q",
                productNumberPrefix: "A-",
                workEffortPrefix: "a-WO-",
                creditNoteNumberPrefix: "a-CN-",
                isImmediatelyPicked: true,
                autoGenerateShipmentPackage: true,
                isImmediatelyPacked: true,
                isAutomaticallyShipped: true,
                autoGenerateCustomerShipment: true,
                isAutomaticallyReceived: false,
                autoGeneratePurchaseShipment: false,
                useCreditNoteSequence: true,
                requestCounterValue: 0,
                quoteCounterValue: 0,
                orderCounterValue: 0,
                purchaseOrderCounterValue: 0,
                invoiceCounterValue: 100,
                purchaseInvoiceCounterValue: 0,
                purchaseOrderNeedsApproval: true,
                purchaseOrderApprovalThresholdLevel1: 1000M,
                purchaseOrderApprovalThresholdLevel2: 5000M,
                serialisedItemSoldOns: serialisedItemSoldOns,
                collectiveWorkEffortInvoice: true);

            var dipu = Organisations.CreateInternalOrganisation(
                session: @this.Session(),
                name: "Dipu BVBA",
                address: "Kleine Nieuwedijkstraat 2",
                postalCode: "2800",
                locality: "Mechelen",
                country: be,
                phone1CountryCode: "+32",
                phone1: "2 15 49 49 49",
                phone1Purpose: new ContactMechanismPurposes(@this.Session()).GeneralPhoneNumber,
                phone2CountryCode: string.Empty,
                phone2: string.Empty,
                phone2Purpose: null,
                emailAddress: "*****@*****.**",
                websiteAddress: "www.dipu.com",
                taxNumber: "BE 0445366489",
                bankName: "ING",
                facilityName: "Dipu Facility",
                bic: "BBRUBEBB",
                iban: "BE23 3300 6167 6391",
                currency: euro,
                logo: "allors.png",
                storeName: "Dipu Store",
                billingProcess: new BillingProcesses(@this.Session()).BillingForOrderItems,
                outgoingShipmentNumberPrefix: "d-CS",
                salesInvoiceNumberPrefix: "d-SI",
                salesOrderNumberPrefix: "d-SO",
                purchaseOrderNumberPrefix: "d-PO",
                purchaseInvoiceNumberPrefix: "d-PI",
                requestNumberPrefix: "d-RFQ",
                quoteNumberPrefix: "d-Q",
                productNumberPrefix: "D-",
                workEffortPrefix: "a-WO-",
                creditNoteNumberPrefix: "d-CN-",
                isImmediatelyPicked: true,
                autoGenerateShipmentPackage: true,
                isImmediatelyPacked: true,
                isAutomaticallyShipped: true,
                autoGenerateCustomerShipment: true,
                isAutomaticallyReceived: false,
                autoGeneratePurchaseShipment: false,
                useCreditNoteSequence: true,
                requestCounterValue: 0,
                quoteCounterValue: 0,
                orderCounterValue: 0,
                purchaseOrderCounterValue: 0,
                purchaseInvoiceCounterValue: 0,
                invoiceCounterValue: 0,
                purchaseOrderNeedsApproval: false,
                purchaseOrderApprovalThresholdLevel1: null,
                purchaseOrderApprovalThresholdLevel2: null,
                serialisedItemSoldOns: serialisedItemSoldOns,
                collectiveWorkEffortInvoice: true);

            // Give Administrator access
            new EmploymentBuilder(@this.Session()).WithEmployee(administrator).WithEmployer(allors).Build();

            @this.Settings.DefaultFacility = allors.FacilitiesWhereOwner.First;

            var allorsEmployee1                   = allors.CreateEmployee("letmein", faker);
            var allorsEmployee2                   = allors.CreateEmployee("letmein", faker);
            var allorsProductQuoteApprover        = allors.CreateEmployee("letmein", faker);
            var allorsPurchaseInvoiceApprover     = allors.CreateEmployee("letmein", faker);
            var allorsPurchaseOrderApproverLevel1 = allors.CreateEmployee("letmein", faker);
            var allorsPurchaseOrderApproverLevel2 = allors.CreateEmployee("letmein", faker);

            var dipuEmployee                = dipu.CreateEmployee("letmein", faker);
            var dipuProductQuoteApprover    = dipu.CreateEmployee("letmein", faker);
            var dipuPurchaseInvoiceApprover = dipu.CreateEmployee("letmein", faker);

            new FacilityBuilder(@this.Session())
            .WithName("Allors warehouse 2")
            .WithFacilityType(new FacilityTypes(@this.Session()).Warehouse)
            .WithOwner(allors)
            .Build();

            var vatRate      = new VatRateBuilder(@this.Session()).WithRate(21).Build();
            var manufacturer = new OrganisationBuilder(@this.Session()).WithManufacturerDefaults(faker).Build();

            allors.CreateSupplier(faker);
            allors.CreateSupplier(faker);

            allors.CreateSubContractor(faker);
            allors.CreateSubContractor(faker);

            @this.Session().Derive();

            var nonSerialisedPart1 = allors.CreateNonSerialisedNonUnifiedPart(faker);
            var nonSerialisedPart2 = allors.CreateNonSerialisedNonUnifiedPart(faker);
            var serialisedPart1    = allors.CreateSerialisedNonUnifiedPart(faker);
            var serialisedPart2    = allors.CreateSerialisedNonUnifiedPart(faker);

            var good1 = new NonUnifiedGoodBuilder(@this.Session()).WithNonSerialisedPartDefaults(allors).Build();

            var good2 = new NonUnifiedGoodBuilder(@this.Session()).WithSerialisedPartDefaults(allors).Build();

            var serialisedItem = new SerialisedItemBuilder(@this.Session()).WithDefaults(allors).Build();

            serialisedPart1.AddSerialisedItem(serialisedItem);

            new InventoryItemTransactionBuilder(@this.Session())
            .WithSerialisedItem(serialisedItem)
            .WithFacility(allors.FacilitiesWhereOwner.First)
            .WithQuantity(1)
            .WithReason(new InventoryTransactionReasons(@this.Session()).IncomingShipment)
            .WithSerialisedInventoryItemState(new SerialisedInventoryItemStates(@this.Session()).Good)
            .Build();

            var good3 = new NonUnifiedGoodBuilder(@this.Session()).WithNonSerialisedPartDefaults(allors).Build();

            var good4 = new NonUnifiedGoodBuilder(@this.Session()).WithSerialisedPartDefaults(allors).Build();

            var productCategory1 = new ProductCategoryBuilder(@this.Session())
                                   .WithInternalOrganisation(allors)
                                   .WithName("Best selling gizmo's")
                                   .WithLocalisedName(new LocalisedTextBuilder(@this.Session()).WithText("Meest verkochte gizmo's").WithLocale(dutchLocale).Build())
                                   .Build();

            var productCategory2 = new ProductCategoryBuilder(@this.Session())
                                   .WithInternalOrganisation(allors)
                                   .WithName("Big Gizmo's")
                                   .WithLocalisedName(new LocalisedTextBuilder(@this.Session()).WithText("Grote Gizmo's").WithLocale(dutchLocale).Build())
                                   .Build();

            var productCategory3 = new ProductCategoryBuilder(@this.Session())
                                   .WithInternalOrganisation(allors)
                                   .WithName("Small gizmo's")
                                   .WithLocalisedName(new LocalisedTextBuilder(@this.Session()).WithText("Kleine gizmo's").WithLocale(dutchLocale).Build())
                                   .WithProduct(good1)
                                   .WithProduct(good2)
                                   .WithProduct(good3)
                                   .WithProduct(good4)
                                   .Build();

            new CatalogueBuilder(@this.Session())
            .WithInternalOrganisation(allors)
            .WithName("New gizmo's")
            .WithLocalisedName(new LocalisedTextBuilder(@this.Session()).WithText("Nieuwe gizmo's").WithLocale(dutchLocale).Build())
            .WithDescription("Latest in the world of Gizmo's")
            .WithLocalisedDescription(new LocalisedTextBuilder(@this.Session()).WithText("Laatste in de wereld van Gizmo's").WithLocale(dutchLocale).Build())
            .WithProductCategory(productCategory1)
            .Build();

            @this.Session().Derive();

            var email2 = new EmailAddressBuilder(@this.Session())
                         .WithElectronicAddressString("*****@*****.**")
                         .Build();

            for (var i = 0; i < 10; i++)
            {
                var b2BCustomer = allors.CreateB2BCustomer(faker);

                @this.Session().Derive();

                new FaceToFaceCommunicationBuilder(@this.Session())
                .WithDescription($"Meeting {i}")
                .WithSubject($"meeting {i}")
                .WithEventPurpose(new CommunicationEventPurposes(@this.Session()).Meeting)
                .WithFromParty(allors.CurrentContacts.First)
                .WithToParty(b2BCustomer.CurrentContacts.First)
                .WithOwner(administrator)
                .WithActualStart(@this.Session().Now())
                .Build();

                new EmailCommunicationBuilder(@this.Session())
                .WithDescription($"Email {i}")
                .WithSubject($"email {i}")
                .WithFromParty(allors.CurrentContacts.First)
                .WithToParty(b2BCustomer.CurrentContacts.First)
                .WithFromEmail(allors.GeneralEmail)
                .WithToEmail(email2)
                .WithEventPurpose(new CommunicationEventPurposes(@this.Session()).Meeting)
                .WithOwner(administrator)
                .WithActualStart(@this.Session().Now())
                .Build();

                new LetterCorrespondenceBuilder(@this.Session())
                .WithDescription($"Letter {i}")
                .WithSubject($"letter {i}")
                .WithFromParty(administrator)
                .WithToParty(b2BCustomer.CurrentContacts.First)
                .WithEventPurpose(new CommunicationEventPurposes(@this.Session()).Meeting)
                .WithOwner(administrator)
                .WithActualStart(@this.Session().Now())
                .Build();

                new PhoneCommunicationBuilder(@this.Session())
                .WithDescription($"Phone {i}")
                .WithSubject($"phone {i}")
                .WithFromParty(administrator)
                .WithToParty(b2BCustomer.CurrentContacts.First)
                .WithEventPurpose(new CommunicationEventPurposes(@this.Session()).Meeting)
                .WithOwner(administrator)
                .WithActualStart(@this.Session().Now())
                .Build();

                var requestForQuote = new RequestForQuoteBuilder(@this.Session())
                                      .WithEmailAddress($"customer{i}@acme.com")
                                      .WithTelephoneNumber("+1 234 56789")
                                      .WithRecipient(allors)
                                      .Build();

                var requestItem = new RequestItemBuilder(@this.Session())
                                  .WithSerialisedItem(serialisedItem)
                                  .WithProduct(serialisedItem.PartWhereSerialisedItem.NonUnifiedGoodsWherePart.FirstOrDefault())
                                  .WithComment($"Comment {i}")
                                  .WithQuantity(1)
                                  .Build();

                requestForQuote.AddRequestItem(requestItem);

                var quote = new ProductQuoteBuilder(@this.Session()).WithSerializedDefaults(allors).Build();

                var salesOrderItem1 = new SalesOrderItemBuilder(@this.Session())
                                      .WithDescription("first item")
                                      .WithProduct(good1)
                                      .WithAssignedUnitPrice(3000)
                                      .WithQuantityOrdered(1)
                                      .WithMessage(@"line1
line2")
                                      .WithInvoiceItemType(new InvoiceItemTypes(@this.Session()).ProductItem)
                                      .Build();

                var salesOrderItem2 = new SalesOrderItemBuilder(@this.Session())
                                      .WithDescription("second item")
                                      .WithAssignedUnitPrice(2000)
                                      .WithQuantityOrdered(2)
                                      .WithInvoiceItemType(new InvoiceItemTypes(@this.Session()).ProductItem)
                                      .Build();

                var salesOrderItem3 = new SalesOrderItemBuilder(@this.Session())
                                      .WithDescription("Service")
                                      .WithAssignedUnitPrice(100)
                                      .WithQuantityOrdered(1)
                                      .WithInvoiceItemType(new InvoiceItemTypes(@this.Session()).Service)
                                      .Build();

                var order = new SalesOrderBuilder(@this.Session())
                            .WithTakenBy(allors)
                            .WithBillToCustomer(b2BCustomer)
                            .WithBillToEndCustomerContactMechanism(b2BCustomer.BillingAddress)
                            .WithSalesOrderItem(salesOrderItem1)
                            .WithSalesOrderItem(salesOrderItem2)
                            .WithSalesOrderItem(salesOrderItem3)
                            .WithCustomerReference("a reference number")
                            .WithDescription("Sale of 1 used Aircraft Towbar")
                            .WithVatRegime(new VatRegimes(@this.Session()).Assessable21)
                            .Build();

                var salesInvoiceItem1 = new SalesInvoiceItemBuilder(@this.Session())
                                        .WithDescription("first item")
                                        .WithProduct(good1)
                                        .WithAssignedUnitPrice(3000)
                                        .WithQuantity(1)
                                        .WithMessage(@"line1
line2")
                                        .WithInvoiceItemType(new InvoiceItemTypes(@this.Session()).ProductItem)
                                        .Build();

                var salesInvoiceItem2 = new SalesInvoiceItemBuilder(@this.Session())
                                        .WithDescription("second item")
                                        .WithAssignedUnitPrice(2000)
                                        .WithQuantity(2)
                                        .WithInvoiceItemType(new InvoiceItemTypes(@this.Session()).ProductItem)
                                        .Build();

                var salesInvoiceItem3 = new SalesInvoiceItemBuilder(@this.Session())
                                        .WithDescription("Service")
                                        .WithAssignedUnitPrice(100)
                                        .WithQuantity(1)
                                        .WithInvoiceItemType(new InvoiceItemTypes(@this.Session()).Service)
                                        .Build();

                var exw      = new IncoTermTypes(@this.Session()).Exw;
                var incoTerm = new IncoTermBuilder(@this.Session()).WithTermType(exw).WithTermValue("XW").Build();

                var salesInvoice = new SalesInvoiceBuilder(@this.Session())
                                   .WithBilledFrom(allors)
                                   .WithBillToCustomer(b2BCustomer)
                                   .WithBillToContactPerson(b2BCustomer.CurrentContacts.First)
                                   .WithBillToContactMechanism(b2BCustomer.BillingAddress)
                                   .WithSalesInvoiceItem(salesInvoiceItem1)
                                   .WithSalesInvoiceItem(salesInvoiceItem2)
                                   .WithSalesInvoiceItem(salesInvoiceItem3)
                                   .WithCustomerReference("a reference number")
                                   .WithDescription("Sale of 1 used Aircraft Towbar")
                                   .WithSalesInvoiceType(new SalesInvoiceTypes(@this.Session()).SalesInvoice)
                                   .WithSalesTerm(incoTerm)
                                   .WithVatRegime(new VatRegimes(@this.Session()).Assessable21)
                                   .Build();

                for (var j = 0; j < 3; j++)
                {
                    var salesInvoiceItem = new SalesInvoiceItemBuilder(@this.Session())
                                           .WithDescription("Some service being delivered")
                                           .WithAssignedUnitPrice(100 + j)
                                           .WithQuantity(1)
                                           .WithInvoiceItemType(new InvoiceItemTypes(@this.Session()).Service)
                                           .Build();

                    salesInvoice.AddSalesInvoiceItem(salesInvoiceItem);
                }
            }

            @this.Session().Derive();

            for (var i = 0; i < 4; i++)
            {
                var supplier = faker.Random.ListItem(allors.CurrentSuppliers);

                var purchaseInvoiceItem1 = new PurchaseInvoiceItemBuilder(@this.Session())
                                           .WithDescription("first item")
                                           .WithPart(nonSerialisedPart1)
                                           .WithAssignedUnitPrice(3000)
                                           .WithQuantity(1)
                                           .WithMessage(@"line1
line2")
                                           .WithInvoiceItemType(new InvoiceItemTypes(@this.Session()).PartItem)
                                           .Build();

                var purchaseInvoiceItem2 = new PurchaseInvoiceItemBuilder(@this.Session())
                                           .WithDescription("second item")
                                           .WithAssignedUnitPrice(2000)
                                           .WithQuantity(2)
                                           .WithPart(nonSerialisedPart2)
                                           .WithInvoiceItemType(new InvoiceItemTypes(@this.Session()).PartItem)
                                           .Build();

                var purchaseInvoiceItem3 = new PurchaseInvoiceItemBuilder(@this.Session())
                                           .WithDescription("Service")
                                           .WithAssignedUnitPrice(100)
                                           .WithQuantity(1)
                                           .WithInvoiceItemType(new InvoiceItemTypes(@this.Session()).Service)
                                           .Build();

                var purchaseInvoice = new PurchaseInvoiceBuilder(@this.Session())
                                      .WithBilledTo(allors)
                                      .WithBilledFrom(supplier)
                                      .WithPurchaseInvoiceItem(purchaseInvoiceItem1)
                                      .WithPurchaseInvoiceItem(purchaseInvoiceItem2)
                                      .WithPurchaseInvoiceItem(purchaseInvoiceItem3)
                                      .WithCustomerReference("a reference number")
                                      .WithDescription("Purchase of 1 used Aircraft Towbar")
                                      .WithPurchaseInvoiceType(new PurchaseInvoiceTypes(@this.Session()).PurchaseInvoice)
                                      .WithVatRegime(new VatRegimes(@this.Session()).Assessable21)
                                      .Build();

                var purchaseOrderItem1 = new PurchaseOrderItemBuilder(@this.Session())
                                         .WithDescription("first purchase order item")
                                         .WithPart(nonSerialisedPart1)
                                         .WithQuantityOrdered(1)
                                         .Build();

                var purchaseOrder = new PurchaseOrderBuilder(@this.Session())
                                    .WithOrderedBy(allors)
                                    .WithTakenViaSupplier(supplier)
                                    .WithPurchaseOrderItem(purchaseOrderItem1)
                                    .WithCustomerReference("reference " + i)
                                    .Build();
            }

            var anOrganisation = new Organisations(@this.Session()).FindBy(M.Organisation.IsInternalOrganisation, false);

            var item = new SerialisedItemBuilder(@this.Session())
                       .WithSerialNumber("112")
                       .WithSerialisedItemAvailability(new SerialisedItemAvailabilities(@this.Session()).Sold)
                       .WithAvailableForSale(false)
                       .WithOwnedBy(anOrganisation)
                       .Build();

            nonSerialisedPart2.AddSerialisedItem(item);

            var workTask = new WorkTaskBuilder(@this.Session())
                           .WithTakenBy(allors)
                           .WithCustomer(anOrganisation)
                           .WithName("maintenance")
                           .Build();

            new WorkEffortFixedAssetAssignmentBuilder(@this.Session())
            .WithFixedAsset(item)
            .WithAssignment(workTask)
            .Build();

            var workOrderPart1 = allors.CreateNonSerialisedNonUnifiedPart(faker);
            var workOrderPart2 = allors.CreateNonSerialisedNonUnifiedPart(faker);
            var workOrderPart3 = allors.CreateNonSerialisedNonUnifiedPart(faker);

            @this.Session().Derive();

            var workOrder = new WorkTaskBuilder(@this.Session())
                            .WithName("Task")
                            .WithTakenBy(allors)
                            .WithFacility(new Facilities(@this.Session()).Extent().First)
                            .WithCustomer(anOrganisation)
                            .WithWorkEffortPurpose(new WorkEffortPurposes(@this.Session()).Maintenance)
                            .WithSpecialTerms("Net 45 Days")
                            .Build();

            new WorkEffortFixedAssetAssignmentBuilder(@this.Session())
            .WithFixedAsset(item)
            .WithAssignment(workOrder)
            .WithComment("Busted tailpipe")
            .Build();

            workOrder.CreateInventoryAssignment(workOrderPart1, 11);
            workOrder.CreateInventoryAssignment(workOrderPart2, 12);
            workOrder.CreateInventoryAssignment(workOrderPart3, 13);

            //// Work Effort Time Entries
            var yesterday      = DateTimeFactory.CreateDateTime(@this.Session().Now().AddDays(-1));
            var laterYesterday = DateTimeFactory.CreateDateTime(yesterday.AddHours(3));

            var today      = DateTimeFactory.CreateDateTime(@this.Session().Now());
            var laterToday = DateTimeFactory.CreateDateTime(today.AddHours(4));

            var tomorrow      = DateTimeFactory.CreateDateTime(@this.Session().Now().AddDays(1));
            var laterTomorrow = DateTimeFactory.CreateDateTime(tomorrow.AddHours(6));

            var standardRate = new RateTypes(@this.Session()).StandardRate;
            var overtimeRate = new RateTypes(@this.Session()).OvertimeRate;

            var frequencies = new TimeFrequencies(@this.Session());

            var timeEntryYesterday1 = workOrder.CreateTimeEntry(yesterday, laterYesterday, frequencies.Day, standardRate);
            var timeEntryToday1     = workOrder.CreateTimeEntry(today, laterToday, frequencies.Hour, standardRate);
            var timeEntryTomorrow1  = workOrder.CreateTimeEntry(tomorrow, laterTomorrow, frequencies.Minute, overtimeRate);

            allorsEmployee1.TimeSheetWhereWorker.AddTimeEntry(timeEntryYesterday1);
            allorsEmployee1.TimeSheetWhereWorker.AddTimeEntry(timeEntryToday1);
            allorsEmployee1.TimeSheetWhereWorker.AddTimeEntry(timeEntryTomorrow1);

            var timeEntryYesterday2 = workOrder.CreateTimeEntry(yesterday, laterYesterday, frequencies.Day, standardRate);
            var timeEntryToday2     = workOrder.CreateTimeEntry(today, laterToday, frequencies.Hour, standardRate);
            var timeEntryTomorrow2  = workOrder.CreateTimeEntry(tomorrow, laterTomorrow, frequencies.Minute, overtimeRate);

            allorsEmployee2.TimeSheetWhereWorker.AddTimeEntry(timeEntryYesterday2);
            allorsEmployee2.TimeSheetWhereWorker.AddTimeEntry(timeEntryToday2);
            allorsEmployee2.TimeSheetWhereWorker.AddTimeEntry(timeEntryTomorrow2);

            var po = new PurchaseOrders(@this.Session()).Extent().First;

            foreach (PurchaseOrderItem purchaseOrderItem in po.PurchaseOrderItems)
            {
                new WorkEffortPurchaseOrderItemAssignmentBuilder(@this.Session())
                .WithPurchaseOrderItem(purchaseOrderItem)
                .WithAssignment(workOrder)
                .WithQuantity(1)
                .Build();
            }

            @this.Session().Derive();
        }