All items with a specific item template set price
namespace Plugin.Pricing.Action | |
{ | |
using System; | |
using System.Collections.Generic; | |
using System.Linq; | |
using System.Runtime.CompilerServices; | |
using Sitecore.Commerce.Core; | |
using Sitecore.Commerce.Plugin.Carts; | |
using Sitecore.Commerce.Plugin.Pricing; | |
using Sitecore.Framework.Rules; | |
[EntityIdentifier("All items with a specific item template set price")] | |
public class CartAllItemsWithTemplateSpecifyAmountAction : ICartLineAction | |
{ | |
public void Execute(IRuleExecutionContext context) | |
{ | |
var commerceContext = context.Fact<CommerceContext>(); | |
if (commerceContext == null) | |
{ | |
return; | |
} | |
var cart = (commerceContext.Objects.OfType<Cart>()).FirstOrDefault(); | |
var totals = (commerceContext.Objects.OfType<CartTotals>()).FirstOrDefault(); | |
if ((cart != null) && cart.Lines.Any() && ((totals != null) && totals.Lines.Any()) == false) | |
{ | |
return; | |
} | |
// This the code that decides which lines to discount | |
var source = new List<CartLineComponent>(); | |
foreach (var cartLine in cart.Lines.Where(x => x.HasComponent<CartProductComponent>())) | |
{ | |
if(cartLine.GetComponent<CartProductComponent>().ItemTemplate == this.Template.Yield(context)) | |
{ | |
source.Add(cartLine); | |
} | |
} | |
if (!source.Any()) | |
{ | |
return; | |
} | |
var model = commerceContext.Objects.OfType<PropertiesModel>().FirstOrDefault(); | |
if (model == null) | |
{ | |
return; | |
} | |
foreach (var line in source) | |
{ | |
if (!totals.Lines.ContainsKey(line.Id)) | |
{ | |
continue; | |
} | |
var discount = commerceContext.GetPolicy<KnownCartAdjustmentTypesPolicy>().Discount; | |
var d = this.Price.Yield(context); | |
if (commerceContext.GetPolicy<GlobalPricingPolicy>().ShouldRoundPriceCalc) | |
{ | |
d = decimal.Round(d, commerceContext.GetPolicy<GlobalPricingPolicy>().RoundDigits, commerceContext.GetPolicy<GlobalPricingPolicy>().MidPointRoundUp ? MidpointRounding.AwayFromZero : MidpointRounding.ToEven); | |
} | |
decimal amount; | |
var currentAmount = totals.Lines[line.Id].SubTotal.Amount; | |
if (currentAmount <= d) | |
{ | |
amount = d - currentAmount; | |
totals.Lines[line.Id].SubTotal.Amount += amount; | |
} | |
else | |
{ | |
amount = currentAmount - d; | |
amount = amount * decimal.MinusOne; | |
totals.Lines[line.Id].SubTotal.Amount += amount; | |
} | |
var item = new CartLineLevelAwardedAdjustment | |
{ | |
Name = (string) model.GetPropertyValue("PromotionText"), | |
DisplayName = (string) model.GetPropertyValue("PromotionCartText"), | |
Adjustment = new Money(commerceContext.CurrentCurrency(), amount), | |
AdjustmentType = discount, | |
IsTaxable = false, | |
AwardingBlock = "CartAllItemsWithProductDefinitionSpecifyAmountAction" | |
}; | |
line.Adjustments.Add(item); | |
line.GetComponent<MessagesComponent>().AddMessage(commerceContext.GetPolicy<KnownMessageCodePolicy>().Promotions, $"PromotionApplied: {model.GetPropertyValue("PromotionId")}"); | |
} | |
} | |
public IRuleValue<decimal> Price { get; set; } | |
public IRuleValue<string> Template { get; set; } | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment