public List <PurchaseOrderItem> GetPurchaseOrderItems(List <PurchaseRequirement> purchaseRequirements)
        {
            var result = purchaseRequirements
                         .Where(s => s.Product.Type != Database.ProductType.Service)
                         .Select(purchaseRequirement => new
            {
                PurchaseRequirement = purchaseRequirement,
                SupplierFullfilment = purchaseRequirement.Product.Stock.Select(stock => new
                {
                    Supplier               = stock.Supplier,
                    ShippingCost           = _supplierShippingCostCalculator.CalculateShippingCost(stock.Supplier, _supplierService.GetStockQuantityAbleToSupply(stock.StockOnHand, purchaseRequirement.Quantity)),
                    SupplierCost           = stock.Cost,
                    StockOnHand            = stock.StockOnHand,
                    StockAvailableToSupply = _supplierService.GetStockQuantityAbleToSupply(stock.StockOnHand, purchaseRequirement.Quantity)
                })
            })
                         .Select(supplierStock => new PurchaseRequirementFulfillmentOptions
            {
                PurchaseRequirement = supplierStock.PurchaseRequirement,
                OptionsList         = supplierStock.SupplierFullfilment
                                      .Where(fulfullment => fulfullment.StockOnHand > 0)
                                      .Select(fulfullment => new SupplierFulfillmentOptions
                {
                    Supplier                  = fulfullment.Supplier,
                    ShippingCost              = fulfullment.ShippingCost,
                    SupplierCost              = fulfullment.SupplierCost,
                    StockOnHand               = fulfullment.StockOnHand,
                    StockAvailableToSupply    = fulfullment.StockAvailableToSupply,
                    UnitCostIncludingShipping = _supplierService.CalculateUnitCostIncludingShipping(fulfullment.StockAvailableToSupply, fulfullment.SupplierCost, fulfullment.ShippingCost)
                })
                                      .OrderBy(x => x.UnitCostIncludingShipping)
                                      .ToList()
            })
                         .SelectMany(requirementOption =>
                                     _purchaseOrderFulfillmentService.ProducePurchaseOrderItem(requirementOption.OptionsList, requirementOption.PurchaseRequirement)
                                     )
                         .ToList();

            return(result);
        }