示例#1
0
        private void AppsInvoiceThis(IDerivation derivation)
        {
            var salesInvoice = new SalesInvoiceBuilder(this.Strategy.Session)
                               .WithBilledFrom(this.TakenBy)
                               .WithBilledFromContactMechanism(this.TakenByContactMechanism)
                               .WithBilledFromContactPerson(this.TakenByContactPerson)
                               .WithBillToCustomer(this.BillToCustomer)
                               .WithBillToContactMechanism(this.BillToContactMechanism)
                               .WithBillToContactPerson(this.BillToContactPerson)
                               .WithBillToEndCustomer(this.BillToEndCustomer)
                               .WithBillToEndCustomerContactMechanism(this.BillToEndCustomerContactMechanism)
                               .WithBillToEndCustomerContactPerson(this.BillToEndCustomerContactPerson)
                               .WithShipToCustomer(this.ShipToCustomer)
                               .WithShipToAddress(this.ShipToAddress)
                               .WithShipToContactPerson(this.ShipToContactPerson)
                               .WithShipToEndCustomer(this.ShipToEndCustomer)
                               .WithShipToEndCustomerAddress(this.ShipToEndCustomerAddress)
                               .WithShipToEndCustomerContactPerson(this.ShipToEndCustomerContactPerson)
                               .WithDescription(this.Description)
                               .WithStore(this.Store)
                               .WithInvoiceDate(DateTime.UtcNow)
                               .WithSalesChannel(this.SalesChannel)
                               .WithSalesInvoiceType(new SalesInvoiceTypes(this.Strategy.Session).SalesInvoice)
                               .WithVatRegime(this.VatRegime)
                               .WithDiscountAdjustment(this.DiscountAdjustment)
                               .WithSurchargeAdjustment(this.SurchargeAdjustment)
                               .WithShippingAndHandlingCharge(this.ShippingAndHandlingCharge)
                               .WithFee(this.Fee)
                               .WithCustomerReference(this.CustomerReference)
                               .WithPaymentMethod(this.PaymentMethod)
                               .Build();

            foreach (SalesOrderItem orderItem in this.ValidOrderItems)
            {
                var amountAlreadyInvoiced = orderItem.OrderItemBillingsWhereOrderItem.Sum(v => v.Amount);

                var leftToInvoice = (orderItem.QuantityOrdered * orderItem.ActualUnitPrice) - amountAlreadyInvoiced;

                if (leftToInvoice > 0)
                {
                    var invoiceItem = new SalesInvoiceItemBuilder(this.Strategy.Session)
                                      .WithInvoiceItemType(orderItem.InvoiceItemType)
                                      .WithActualUnitPrice(orderItem.ActualUnitPrice)
                                      .WithProduct(orderItem.Product)
                                      .WithQuantity(orderItem.QuantityOrdered)
                                      .WithDetails(orderItem.Details)
                                      .WithDescription(orderItem.Description)
                                      .WithInternalComment(orderItem.InternalComment)
                                      .WithMessage(orderItem.Message)
                                      .Build();

                    salesInvoice.AddSalesInvoiceItem(invoiceItem);

                    new OrderItemBillingBuilder(this.strategy.Session)
                    .WithQuantity(orderItem.QuantityOrdered)
                    .WithAmount(leftToInvoice)
                    .WithOrderItem(orderItem)
                    .WithInvoiceItem(invoiceItem)
                    .Build();
                }
            }

            foreach (SalesTerm salesTerm in this.SalesTerms)
            {
                if (salesTerm.GetType().Name == typeof(IncoTerm).Name)
                {
                    salesInvoice.AddSalesTerm(new IncoTermBuilder(this.strategy.Session)
                                              .WithTermType(salesTerm.TermType)
                                              .WithTermValue(salesTerm.TermValue)
                                              .WithDescription(salesTerm.Description)
                                              .Build());
                }

                if (salesTerm.GetType().Name == typeof(InvoiceTerm).Name)
                {
                    salesInvoice.AddSalesTerm(new InvoiceTermBuilder(this.strategy.Session)
                                              .WithTermType(salesTerm.TermType)
                                              .WithTermValue(salesTerm.TermValue)
                                              .WithDescription(salesTerm.Description)
                                              .Build());
                }

                if (salesTerm.GetType().Name == typeof(OrderTerm).Name)
                {
                    salesInvoice.AddSalesTerm(new OrderTermBuilder(this.strategy.Session)
                                              .WithTermType(salesTerm.TermType)
                                              .WithTermValue(salesTerm.TermValue)
                                              .WithDescription(salesTerm.Description)
                                              .Build());
                }
            }
        }
示例#2
0
        public void BaseInvoice(CustomerShipmentInvoice method)
        {
            if (this.ShipmentState.Equals(new ShipmentStates(this.Strategy.Session).Shipped) &&
                Equals(this.Store.BillingProcess, new BillingProcesses(this.Strategy.Session).BillingForShipmentItems))
            {
                var invoiceByOrder = new Dictionary <SalesOrder, SalesInvoice>();
                var costsInvoiced  = false;

                foreach (ShipmentItem shipmentItem in this.ShipmentItems)
                {
                    foreach (OrderShipment orderShipment in shipmentItem.OrderShipmentsWhereShipmentItem)
                    {
                        var salesOrder = orderShipment.OrderItem.OrderWhereValidOrderItem as SalesOrder;

                        if (!invoiceByOrder.TryGetValue(salesOrder, out var salesInvoice))
                        {
                            salesInvoice = new SalesInvoiceBuilder(this.Strategy.Session)
                                           .WithStore(salesOrder.Store)
                                           .WithBilledFrom(salesOrder.TakenBy)
                                           .WithAssignedBilledFromContactMechanism(salesOrder.DerivedTakenByContactMechanism)
                                           .WithBilledFromContactPerson(salesOrder.TakenByContactPerson)
                                           .WithBillToCustomer(salesOrder.BillToCustomer)
                                           .WithAssignedBillToContactMechanism(salesOrder.DerivedBillToContactMechanism)
                                           .WithBillToContactPerson(salesOrder.BillToContactPerson)
                                           .WithBillToEndCustomer(salesOrder.BillToEndCustomer)
                                           .WithAssignedBillToEndCustomerContactMechanism(salesOrder.DerivedBillToEndCustomerContactMechanism)
                                           .WithBillToEndCustomerContactPerson(salesOrder.BillToEndCustomerContactPerson)
                                           .WithShipToCustomer(salesOrder.ShipToCustomer)
                                           .WithAssignedShipToAddress(salesOrder.DerivedShipToAddress)
                                           .WithShipToContactPerson(salesOrder.ShipToContactPerson)
                                           .WithShipToEndCustomer(salesOrder.ShipToEndCustomer)
                                           .WithAssignedShipToEndCustomerAddress(salesOrder.DerivedShipToEndCustomerAddress)
                                           .WithShipToEndCustomerContactPerson(salesOrder.ShipToEndCustomerContactPerson)
                                           .WithInvoiceDate(this.Session().Now())
                                           .WithSalesChannel(salesOrder.SalesChannel)
                                           .WithSalesInvoiceType(new SalesInvoiceTypes(this.Strategy.Session).SalesInvoice)
                                           .WithAssignedVatRegime(salesOrder.DerivedVatRegime)
                                           .WithAssignedIrpfRegime(salesOrder.DerivedIrpfRegime)
                                           .WithCustomerReference(salesOrder.CustomerReference)
                                           .WithAssignedPaymentMethod(this.PaymentMethod)
                                           .Build();

                            invoiceByOrder.Add(salesOrder, salesInvoice);

                            foreach (OrderAdjustment orderAdjustment in salesOrder.OrderAdjustments)
                            {
                                OrderAdjustment newAdjustment = null;
                                if (orderAdjustment.GetType().Name.Equals(typeof(DiscountAdjustment).Name))
                                {
                                    newAdjustment = new DiscountAdjustmentBuilder(this.Session()).Build();
                                }

                                if (orderAdjustment.GetType().Name.Equals(typeof(SurchargeAdjustment).Name))
                                {
                                    newAdjustment = new SurchargeAdjustmentBuilder(this.Session()).Build();
                                }

                                if (orderAdjustment.GetType().Name.Equals(typeof(Fee).Name))
                                {
                                    newAdjustment = new FeeBuilder(this.Session()).Build();
                                }

                                if (orderAdjustment.GetType().Name.Equals(typeof(ShippingAndHandlingCharge).Name))
                                {
                                    newAdjustment = new ShippingAndHandlingChargeBuilder(this.Session()).Build();
                                }

                                if (orderAdjustment.GetType().Name.Equals(typeof(MiscellaneousCharge).Name))
                                {
                                    newAdjustment = new MiscellaneousChargeBuilder(this.Session()).Build();
                                }

                                newAdjustment.Amount ??= orderAdjustment.Amount;
                                newAdjustment.Percentage ??= orderAdjustment.Percentage;
                                salesInvoice.AddOrderAdjustment(newAdjustment);
                            }

                            if (!costsInvoiced)
                            {
                                var costs = this.BaseOnDeriveShippingAndHandlingCharges();
                                if (costs > 0)
                                {
                                    salesInvoice.AddOrderAdjustment(new ShippingAndHandlingChargeBuilder(this.Strategy.Session).WithAmount(costs).Build());
                                    costsInvoiced = true;
                                }
                            }

                            foreach (SalesTerm salesTerm in salesOrder.SalesTerms)
                            {
                                if (salesTerm.GetType().Name == typeof(IncoTerm).Name)
                                {
                                    salesInvoice.AddSalesTerm(new IncoTermBuilder(this.Strategy.Session)
                                                              .WithTermType(salesTerm.TermType)
                                                              .WithTermValue(salesTerm.TermValue)
                                                              .WithDescription(salesTerm.Description)
                                                              .Build());
                                }

                                if (salesTerm.GetType().Name == typeof(InvoiceTerm).Name)
                                {
                                    salesInvoice.AddSalesTerm(new InvoiceTermBuilder(this.Strategy.Session)
                                                              .WithTermType(salesTerm.TermType)
                                                              .WithTermValue(salesTerm.TermValue)
                                                              .WithDescription(salesTerm.Description)
                                                              .Build());
                                }

                                if (salesTerm.GetType().Name == typeof(OrderTerm).Name)
                                {
                                    salesInvoice.AddSalesTerm(new OrderTermBuilder(this.Strategy.Session)
                                                              .WithTermType(salesTerm.TermType)
                                                              .WithTermValue(salesTerm.TermValue)
                                                              .WithDescription(salesTerm.Description)
                                                              .Build());
                                }
                            }
                        }

                        var amountAlreadyInvoiced = shipmentItem.ShipmentItemBillingsWhereShipmentItem.Sum(v => v.Amount);
                        var leftToInvoice         = (orderShipment.OrderItem.QuantityOrdered * orderShipment.OrderItem.AssignedUnitPrice) - amountAlreadyInvoiced;

                        if (leftToInvoice > 0)
                        {
                            if (orderShipment.OrderItem is SalesOrderItem salesOrderItem)
                            {
                                var invoiceItem = new SalesInvoiceItemBuilder(this.Strategy.Session)
                                                  .WithInvoiceItemType(new InvoiceItemTypes(this.Strategy.Session).ProductItem)
                                                  .WithProduct(salesOrderItem.Product)
                                                  .WithQuantity(orderShipment.Quantity)
                                                  .WithAssignedUnitPrice(salesOrderItem.UnitPrice)
                                                  .WithAssignedVatRegime(salesOrderItem.AssignedVatRegime)
                                                  .WithDescription(salesOrderItem.Description)
                                                  .WithInternalComment(salesOrderItem.InternalComment)
                                                  .WithMessage(salesOrderItem.Message)
                                                  .Build();

                                salesInvoice.AddSalesInvoiceItem(invoiceItem);

                                new ShipmentItemBillingBuilder(this.Strategy.Session)
                                .WithQuantity(shipmentItem.Quantity)
                                .WithAmount(leftToInvoice)
                                .WithShipmentItem(shipmentItem)
                                .WithInvoiceItem(invoiceItem)
                                .Build();
                            }
                        }
                    }
                }
            }
        }
示例#3
0
        public SalesInvoice AppsCopy(SalesInvoiceCopy method)
        {
            var salesInvoice = new SalesInvoiceBuilder(this.Strategy.Session)
                               .WithPurchaseInvoice(this.PurchaseInvoice)
                               .WithBilledFrom(this.BilledFrom)
                               .WithBilledFromContactMechanism(this.BilledFromContactMechanism)
                               .WithBilledFromContactPerson(this.BilledFromContactPerson)
                               .WithBillToCustomer(this.BillToCustomer)
                               .WithBillToContactMechanism(this.BillToContactMechanism)
                               .WithBillToContactPerson(this.BillToContactPerson)
                               .WithBillToEndCustomer(this.BillToEndCustomer)
                               .WithBillToEndCustomerContactMechanism(this.BillToEndCustomerContactMechanism)
                               .WithBillToEndCustomerContactPerson(this.BillToEndCustomerContactPerson)
                               .WithShipToCustomer(this.ShipToCustomer)
                               .WithShipToAddress(this.ShipToAddress)
                               .WithShipToContactPerson(this.ShipToContactPerson)
                               .WithShipToEndCustomer(this.ShipToEndCustomer)
                               .WithShipToEndCustomerAddress(this.ShipToEndCustomerAddress)
                               .WithShipToEndCustomerContactPerson(this.ShipToEndCustomerContactPerson)
                               .WithDescription(this.Description)
                               .WithStore(this.Store)
                               .WithInvoiceDate(DateTime.UtcNow)
                               .WithSalesChannel(this.SalesChannel)
                               .WithSalesInvoiceType(new SalesInvoiceTypes(this.Strategy.Session).SalesInvoice)
                               .WithVatRegime(this.VatRegime)
                               .WithDiscountAdjustment(this.DiscountAdjustment)
                               .WithSurchargeAdjustment(this.SurchargeAdjustment)
                               .WithShippingAndHandlingCharge(this.ShippingAndHandlingCharge)
                               .WithFee(this.Fee)
                               .WithCustomerReference(this.CustomerReference)
                               .WithPaymentMethod(this.PaymentMethod)
                               .WithComment(this.Comment)
                               .WithInternalComment(this.InternalComment)
                               .WithMessage(this.Message)
                               .WithBillingAccount(this.BillingAccount)
                               .Build();

            foreach (SalesInvoiceItem salesInvoiceItem in this.SalesInvoiceItems)
            {
                var invoiceItem = new SalesInvoiceItemBuilder(this.Strategy.Session)
                                  .WithInvoiceItemType(salesInvoiceItem.InvoiceItemType)
                                  .WithActualUnitPrice(salesInvoiceItem.ActualUnitPrice)
                                  .WithProduct(salesInvoiceItem.Product)
                                  .WithProductFeature(salesInvoiceItem.ProductFeature)
                                  .WithQuantity(salesInvoiceItem.Quantity)
                                  .WithDescription(salesInvoiceItem.Description)
                                  .WithSerialisedItem(salesInvoiceItem.SerialisedItem)
                                  .WithComment(salesInvoiceItem.Comment)
                                  .WithDetails(salesInvoiceItem.Details)
                                  .WithInternalComment(salesInvoiceItem.InternalComment)
                                  .WithMessage(salesInvoiceItem.Message)
                                  .WithFacility(salesInvoiceItem.Facility)
                                  .Build();

                salesInvoice.AddSalesInvoiceItem(invoiceItem);

                foreach (SalesTerm salesTerm in salesInvoiceItem.SalesTerms)
                {
                    if (salesTerm.GetType().Name == typeof(IncoTerm).Name)
                    {
                        salesInvoiceItem.AddSalesTerm(new IncoTermBuilder(this.strategy.Session)
                                                      .WithTermType(salesTerm.TermType)
                                                      .WithTermValue(salesTerm.TermValue)
                                                      .WithDescription(salesTerm.Description)
                                                      .Build());
                    }

                    if (salesTerm.GetType().Name == typeof(InvoiceTerm).Name)
                    {
                        salesInvoiceItem.AddSalesTerm(new InvoiceTermBuilder(this.strategy.Session)
                                                      .WithTermType(salesTerm.TermType)
                                                      .WithTermValue(salesTerm.TermValue)
                                                      .WithDescription(salesTerm.Description)
                                                      .Build());
                    }

                    if (salesTerm.GetType().Name == typeof(OrderTerm).Name)
                    {
                        salesInvoiceItem.AddSalesTerm(new OrderTermBuilder(this.strategy.Session)
                                                      .WithTermType(salesTerm.TermType)
                                                      .WithTermValue(salesTerm.TermValue)
                                                      .WithDescription(salesTerm.Description)
                                                      .Build());
                    }
                }
            }

            foreach (SalesTerm salesTerm in this.SalesTerms)
            {
                if (salesTerm.GetType().Name == typeof(IncoTerm).Name)
                {
                    salesInvoice.AddSalesTerm(new IncoTermBuilder(this.strategy.Session)
                                              .WithTermType(salesTerm.TermType)
                                              .WithTermValue(salesTerm.TermValue)
                                              .WithDescription(salesTerm.Description)
                                              .Build());
                }

                if (salesTerm.GetType().Name == typeof(InvoiceTerm).Name)
                {
                    salesInvoice.AddSalesTerm(new InvoiceTermBuilder(this.strategy.Session)
                                              .WithTermType(salesTerm.TermType)
                                              .WithTermValue(salesTerm.TermValue)
                                              .WithDescription(salesTerm.Description)
                                              .Build());
                }

                if (salesTerm.GetType().Name == typeof(OrderTerm).Name)
                {
                    salesInvoice.AddSalesTerm(new OrderTermBuilder(this.strategy.Session)
                                              .WithTermType(salesTerm.TermType)
                                              .WithTermValue(salesTerm.TermValue)
                                              .WithDescription(salesTerm.Description)
                                              .Build());
                }
            }

            return(salesInvoice);
        }
示例#4
0
        public void AppsInvoiceThis(IDerivation derivation)
        {
            var invoiceByOrder = new Dictionary <SalesOrder, SalesInvoice>();
            var costsInvoiced  = false;

            foreach (ShipmentItem shipmentItem in this.ShipmentItems)
            {
                foreach (OrderShipment orderShipment in shipmentItem.OrderShipmentsWhereShipmentItem)
                {
                    var salesOrder     = orderShipment.OrderItem.OrderWhereValidOrderItem as SalesOrder;
                    var salesOrderItem = orderShipment.OrderItem as SalesOrderItem;

                    if (!invoiceByOrder.TryGetValue(salesOrder, out var salesInvoice))
                    {
                        salesInvoice = new SalesInvoiceBuilder(this.Strategy.Session)
                                       .WithStore(salesOrder.Store)
                                       .WithBilledFrom(salesOrder.TakenBy)
                                       .WithBilledFromContactMechanism(salesOrder.TakenByContactMechanism)
                                       .WithBilledFromContactPerson(salesOrder.TakenByContactPerson)
                                       .WithBillToCustomer(salesOrder.BillToCustomer)
                                       .WithBillToContactMechanism(salesOrder.BillToContactMechanism)
                                       .WithBillToContactPerson(salesOrder.BillToContactPerson)
                                       .WithBillToEndCustomer(salesOrder.BillToEndCustomer)
                                       .WithBillToEndCustomerContactMechanism(salesOrder.BillToEndCustomerContactMechanism)
                                       .WithBillToEndCustomerContactPerson(salesOrder.BillToEndCustomerContactPerson)
                                       .WithShipToCustomer(salesOrder.ShipToCustomer)
                                       .WithShipToAddress(salesOrder.ShipToAddress)
                                       .WithShipToContactPerson(salesOrder.ShipToContactPerson)
                                       .WithShipToEndCustomer(salesOrder.ShipToEndCustomer)
                                       .WithShipToEndCustomerAddress(salesOrder.ShipToEndCustomerAddress)
                                       .WithShipToEndCustomerContactPerson(salesOrder.ShipToEndCustomerContactPerson)
                                       .WithInvoiceDate(DateTime.UtcNow)
                                       .WithSalesChannel(salesOrder.SalesChannel)
                                       .WithSalesInvoiceType(new SalesInvoiceTypes(this.Strategy.Session).SalesInvoice)
                                       .WithVatRegime(salesOrder.VatRegime)
                                       .WithDiscountAdjustment(salesOrder.DiscountAdjustment)
                                       .WithSurchargeAdjustment(salesOrder.SurchargeAdjustment)
                                       .WithShippingAndHandlingCharge(salesOrder.ShippingAndHandlingCharge)
                                       .WithFee(salesOrder.Fee)
                                       .WithCustomerReference(salesOrder.CustomerReference)
                                       .WithPaymentMethod(this.PaymentMethod)
                                       .Build();

                        invoiceByOrder.Add(salesOrder, salesInvoice);

                        if (!costsInvoiced)
                        {
                            var costs = this.AppsOnDeriveShippingAndHandlingCharges(derivation);
                            if (costs > 0)
                            {
                                salesInvoice.ShippingAndHandlingCharge = new ShippingAndHandlingChargeBuilder(this.Strategy.Session).WithAmount(costs).Build();
                                costsInvoiced = true;
                            }
                        }

                        foreach (SalesTerm salesTerm in salesOrder.SalesTerms)
                        {
                            if (salesTerm.GetType().Name == typeof(IncoTerm).Name)
                            {
                                salesInvoice.AddSalesTerm(new IncoTermBuilder(this.strategy.Session)
                                                          .WithTermType(salesTerm.TermType)
                                                          .WithTermValue(salesTerm.TermValue)
                                                          .WithDescription(salesTerm.Description)
                                                          .Build());
                            }

                            if (salesTerm.GetType().Name == typeof(InvoiceTerm).Name)
                            {
                                salesInvoice.AddSalesTerm(new InvoiceTermBuilder(this.strategy.Session)
                                                          .WithTermType(salesTerm.TermType)
                                                          .WithTermValue(salesTerm.TermValue)
                                                          .WithDescription(salesTerm.Description)
                                                          .Build());
                            }

                            if (salesTerm.GetType().Name == typeof(OrderTerm).Name)
                            {
                                salesInvoice.AddSalesTerm(new OrderTermBuilder(this.strategy.Session)
                                                          .WithTermType(salesTerm.TermType)
                                                          .WithTermValue(salesTerm.TermValue)
                                                          .WithDescription(salesTerm.Description)
                                                          .Build());
                            }
                        }
                    }

                    var amountAlreadyInvoiced = shipmentItem.ShipmentItemBillingsWhereShipmentItem.Sum(v => v.Amount);
                    var leftToInvoice         = (orderShipment.OrderItem.QuantityOrdered * orderShipment.OrderItem.ActualUnitPrice) - amountAlreadyInvoiced;

                    if (leftToInvoice > 0)
                    {
                        if (salesOrderItem != null)
                        {
                            var invoiceItem = new SalesInvoiceItemBuilder(this.Strategy.Session)
                                              .WithInvoiceItemType(new InvoiceItemTypes(this.Strategy.Session).ProductItem)
                                              .WithProduct(salesOrderItem.Product)
                                              .WithQuantity(orderShipment.Quantity)
                                              .Build();

                            salesInvoice.AddSalesInvoiceItem(invoiceItem);

                            new ShipmentItemBillingBuilder(this.strategy.Session)
                            .WithQuantity(shipmentItem.Quantity)
                            .WithAmount(leftToInvoice)
                            .WithShipmentItem(shipmentItem)
                            .WithInvoiceItem(invoiceItem)
                            .Build();
                        }
                    }
                }
            }
        }
示例#5
0
        public void BaseInvoice(SalesOrderInvoice method)
        {
            if (this.CanInvoice)
            {
                var salesInvoice = new SalesInvoiceBuilder(this.Strategy.Session)
                                   .WithBilledFrom(this.TakenBy)
                                   .WithBilledFromContactMechanism(this.TakenByContactMechanism)
                                   .WithBilledFromContactPerson(this.TakenByContactPerson)
                                   .WithBillToCustomer(this.BillToCustomer)
                                   .WithBillToContactMechanism(this.BillToContactMechanism)
                                   .WithBillToContactPerson(this.BillToContactPerson)
                                   .WithBillToEndCustomer(this.BillToEndCustomer)
                                   .WithBillToEndCustomerContactMechanism(this.BillToEndCustomerContactMechanism)
                                   .WithBillToEndCustomerContactPerson(this.BillToEndCustomerContactPerson)
                                   .WithShipToCustomer(this.ShipToCustomer)
                                   .WithShipToAddress(this.ShipToAddress)
                                   .WithShipToContactPerson(this.ShipToContactPerson)
                                   .WithShipToEndCustomer(this.ShipToEndCustomer)
                                   .WithShipToEndCustomerAddress(this.ShipToEndCustomerAddress)
                                   .WithShipToEndCustomerContactPerson(this.ShipToEndCustomerContactPerson)
                                   .WithDescription(this.Description)
                                   .WithStore(this.Store)
                                   .WithInvoiceDate(this.Session().Now())
                                   .WithSalesChannel(this.SalesChannel)
                                   .WithSalesInvoiceType(new SalesInvoiceTypes(this.Strategy.Session).SalesInvoice)
                                   .WithVatRegime(this.VatRegime)
                                   .WithAssignedVatClause(this.DerivedVatClause)
                                   .WithDiscountAdjustment(this.DiscountAdjustment)
                                   .WithSurchargeAdjustment(this.SurchargeAdjustment)
                                   .WithShippingAndHandlingCharge(this.ShippingAndHandlingCharge)
                                   .WithFee(this.Fee)
                                   .WithCustomerReference(this.CustomerReference)
                                   .WithPaymentMethod(this.PaymentMethod)
                                   .WithCurrency(this.Currency)
                                   .Build();

                foreach (SalesOrderItem orderItem in this.ValidOrderItems)
                {
                    var amountAlreadyInvoiced = orderItem.OrderItemBillingsWhereOrderItem.Sum(v => v.Amount);

                    var leftToInvoice = (orderItem.QuantityOrdered * orderItem.UnitPrice) - amountAlreadyInvoiced;

                    if (leftToInvoice > 0)
                    {
                        var invoiceItem = new SalesInvoiceItemBuilder(this.Strategy.Session)
                                          .WithInvoiceItemType(orderItem.InvoiceItemType)
                                          .WithAssignedUnitPrice(orderItem.UnitPrice)
                                          .WithProduct(orderItem.Product)
                                          .WithQuantity(orderItem.CostOfGoodsSold)
                                          .WithCostOfGoodsSold(orderItem.QuantityOrdered)
                                          .WithAssignedVatRegime(orderItem.AssignedVatRegime)
                                          .WithDescription(orderItem.Description)
                                          .WithInternalComment(orderItem.InternalComment)
                                          .WithMessage(orderItem.Message)
                                          .Build();

                        if (orderItem.ExistSerialisedItem)
                        {
                            invoiceItem.SerialisedItem = orderItem.SerialisedItem;
                        }

                        salesInvoice.AddSalesInvoiceItem(invoiceItem);

                        new OrderItemBillingBuilder(this.Strategy.Session)
                        .WithQuantity(orderItem.QuantityOrdered)
                        .WithAmount(leftToInvoice)
                        .WithOrderItem(orderItem)
                        .WithInvoiceItem(invoiceItem)
                        .Build();
                    }
                }

                foreach (SalesTerm salesTerm in this.SalesTerms)
                {
                    if (salesTerm.GetType().Name == typeof(IncoTerm).Name)
                    {
                        salesInvoice.AddSalesTerm(new IncoTermBuilder(this.Strategy.Session)
                                                  .WithTermType(salesTerm.TermType)
                                                  .WithTermValue(salesTerm.TermValue)
                                                  .WithDescription(salesTerm.Description)
                                                  .Build());
                    }

                    if (salesTerm.GetType().Name == typeof(InvoiceTerm).Name)
                    {
                        salesInvoice.AddSalesTerm(new InvoiceTermBuilder(this.Strategy.Session)
                                                  .WithTermType(salesTerm.TermType)
                                                  .WithTermValue(salesTerm.TermValue)
                                                  .WithDescription(salesTerm.Description)
                                                  .Build());
                    }

                    if (salesTerm.GetType().Name == typeof(OrderTerm).Name)
                    {
                        salesInvoice.AddSalesTerm(new OrderTermBuilder(this.Strategy.Session)
                                                  .WithTermType(salesTerm.TermType)
                                                  .WithTermValue(salesTerm.TermValue)
                                                  .WithDescription(salesTerm.Description)
                                                  .Build());
                    }
                }
            }
        }