/// <summary> /// Main basket items processing method. It's idemopotent. /// </summary> public void Checkout() { SkuEntity skuEntity; IBasketParser basketParser = BasketParser.Create(basketFilePath); receiptLineItems = new List <Entities.LineItem>(); // Iterate through each item in the basket while (basketParser.MoveNext()) { basketItem = basketParser.Current; skuEntity = this.catalogModel.Find(basketItem.Sku); if (skuEntity != null) { // Add regular line item receiptLineItems.Add(new LineItem { LineItemType = DiscountTypes.noDiscount, Label = skuEntity.Label, Price = skuEntity.Price, Qty = basketItem.Qty, Sku = skuEntity.Id, Total = basketItem.Qty * skuEntity.Price }); // Add discount line item (automatically determined by the appropriate discount strategy for the item) IDiscountStrategy discountStrategy = DiscountStrategy.Instance.Create(skuEntity.DiscountType); // Create the discount line item if any LineItem discountLineItem = discountStrategy.GenerateDiscountLineItem(skuEntity, basketItem); if (discountLineItem != null) { receiptLineItems.Add(discountLineItem); } } } // Reset discount strategies to get them ready for next basket checkout DiscountStrategy.Instance.Reset(); }