public CheckoutState Apply(CheckoutState checkoutState) { if (checkoutState.DiscountableItemsTotal == 0) { return(ToNotAppliedState(checkoutState)); } var discountToApply = Math.Min(checkoutState.DiscountableItemsTotal, _value); var newBasketTotal = checkoutState.CurrentTotal - discountToApply; return(checkoutState.ToNewState(newBasketTotal, DiscountResult.CreateApplied(_id))); }
public CheckoutState Apply(CheckoutState checkoutState) { var applicableItems = GetApplicableItems(checkoutState).ToArray(); if (!applicableItems.Any()) { return(ToNotAppliedCheckoutState(checkoutState, GetNoApplicableProductsMessage())); } var leftToSpend = AmountRequiredToPassThreshold(checkoutState.DiscountableItemsTotal); if (leftToSpend > 0) { return(ToNotAppliedCheckoutState(checkoutState, GetThresholdNotReachedMessage(leftToSpend))); } var currentSpendOnApplicableItems = CurrentSpendOnApplicableItems(applicableItems); var discountToApply = CalculateDiscountToApply(currentSpendOnApplicableItems); var newStateTotal = checkoutState.CurrentTotal - discountToApply; return(checkoutState.ToNewState(newStateTotal, DiscountResult.CreateApplied(_id))); }
private CheckoutState ToNotAppliedState(CheckoutState checkoutState) { var notAppliedResult = DiscountResult.CreateNotApplied(_id, GetNotAppliedMessage()); return(checkoutState.ToNewState(checkoutState.CurrentTotal, notAppliedResult)); }
private CheckoutState ToNotAppliedCheckoutState(CheckoutState checkoutState, string message) { var notAppliedResult = DiscountResult.CreateNotApplied(_id, message); return(checkoutState.ToNewState(checkoutState.CurrentTotal, notAppliedResult)); }