Buy a bundle get a discount

When giving a talk at the Serbia meetup for Episerver last Thursday, about setting up / creating your catalog (models), I got the question if it was possible to give a discount on a bundle. This is not possible out of the box but can be easily done with a custom promotion.

Nothing special going on in the code, just using the content references in the bundle instead of the references below a category. Note: set MatchRecursive to false when getting the DiscountItems or PromotionItems

protected static DiscountItems GetTargetItems(BuyBundleGetItemDiscount promotionData)
{
    IEnumerable<ContentReference> entries = ListBundleEntries(referenceToBundle:  promotionData.Bundle).Select(e => e.Child);

    return new DiscountItems { Items = entries.ToList(), MatchRecursive = false };
}

protected static IEnumerable<BundleEntry> ListBundleEntries(ContentReference referenceToBundle)
{
    IRelationRepository relationRepository = ServiceLocator.Current.GetInstance<IRelationRepository>();

    // Relations to bundle entries are of type BundleEntry
    List<BundleEntry> bundleEntries = relationRepository.GetChildren<BundleEntry>(parentLink: referenceToBundle).ToList();

    return bundleEntries;
}

The complete promotion can be found in a Gist

One thought on “Buy a bundle get a discount

Leave a comment