All items with a specific item template set price
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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