volume_up

A critical vulnerability was discovered in React Server Components (Next.js). Our systems remain protected but we advise to update packages to newest version. Learn More

volume_up

A critical vulnerability was discovered in React Server Components (Next.js). Our systems remain protected but we advise to update packages to newest version. Learn More

Always choose CustomerGroup price

Hi!

Our customer has price groups for their customers and if you are not connected to a price group the have better prices if you buy 5 instead of 1 and so on. The thing is that a customer connected to a price group should not get the better price if they buy 5, it should always be the price in the price group.
How do I handle this? The totalt in the cart are calculated with the cheaper price but the customer should get the higher price since they are connected to a price group.
So what I want to do is to have Commerce to always pick the price group price even if it is higher.

Thanks!

/Kristoffer

#147133
Apr 06, 2016 16:56
Vote:

You could do something like this.  Add logic to determine customer price group.  Then register your implementation of IPriceService in container

using EPiServer.Events.ChangeNotification;
using EPiServer.Framework.Cache;
using Mediachase.Commerce;
using Mediachase.Commerce.Catalog;
using Mediachase.Commerce.Engine.Events;
using Mediachase.Commerce.Pricing;
using Mediachase.Commerce.Pricing.Database;
using System;
using System.Collections.Generic;
using System.Linq;

namespace EPiServer.Commerce.Sample.Business
{
    /// <summary>
    /// /
    /// </summary>
    /// <seealso cref="Mediachase.Commerce.Pricing.Database.PriceServiceDatabase" />
    public class PriceGroupPricingProvider : PriceServiceDatabase
    {
        public PriceGroupPricingProvider(ICatalogSystem catalogSystem,
            IChangeNotificationManager changeManager,
            ISynchronizedObjectInstanceCache objectInstanceCache,
            CatalogKeyEventBroadcaster broadcaster,
            IApplicationContext applicationContext,
            EntryIdentityResolver identityResolver) : base(catalogSystem, changeManager, objectInstanceCache, broadcaster, applicationContext, identityResolver) { }

        public IPriceValue GetDefaultPrice(MarketId market, DateTime validOn, CatalogKey catalogKey, Currency currency)
        {
            var myPricingGroup = CustomerPricing.AllCustomers;
            if (true)//enter logic here to get customer price group
            {
                myPricingGroup = new CustomerPricing (CustomerPricing.PriceType.PriceGroup, "mycode");
            }
            PriceFilter filter = new PriceFilter()
            {
                Quantity = 0,
                Currencies = new Currency[] { currency },
                CustomerPricing = new CustomerPricing[] { myPricingGroup }
            };

            return GetPrices(market, validOn, catalogKey, filter).SingleOrDefault();
        }


        public IEnumerable<IPriceValue> GetPrices(MarketId market, DateTime validOn, CatalogKey catalogKey, PriceFilter filter)
        {
            var myPricingGroup = CustomerPricing.AllCustomers;
            if (true)//enter logic here to get customer price group
            {
                myPricingGroup = new CustomerPricing(CustomerPricing.PriceType.PriceGroup, "mycode");
            }
            filter.CustomerPricing = new CustomerPricing[] { myPricingGroup };
            return base.GetPrices(market, validOn, catalogKey, filter);
        }


        public IEnumerable<IPriceValue> GetPrices(MarketId market, DateTime validOn, IEnumerable<CatalogKey> catalogKeys, PriceFilter filter)
        {
            var myPricingGroup = CustomerPricing.AllCustomers;
            if (true)//enter logic here to get customer price group
            {
                myPricingGroup = new CustomerPricing(CustomerPricing.PriceType.PriceGroup, "mycode");
            }
            filter.CustomerPricing = new CustomerPricing[] { myPricingGroup };
            return base.GetPrices(market, validOn, catalogKeys, filter);
        }


        public IEnumerable<IPriceValue> GetPrices(MarketId market, DateTime validOn, IEnumerable<CatalogKeyAndQuantity> catalogKeysAndQuantities, PriceFilter filter)
        {
            var myPricingGroup = CustomerPricing.AllCustomers;
            if (true)//enter logic here to get customer price group
            {
                myPricingGroup = new CustomerPricing(CustomerPricing.PriceType.PriceGroup, "mycode");
            }
            filter.CustomerPricing = new CustomerPricing[] { myPricingGroup };
            return base.GetPrices(market, validOn, catalogKeysAndQuantities, filter);
        }
    }
        
}
#147240
Apr 08, 2016 11:36

Hi Mark!

This look really good. And this will work even when the workflow kicks in? I solved it by implementing my own workflows but maybe this is better?

/Kristoffer

#147257
Apr 08, 2016 12:48

Yes the workflow calls the following 

GetPrices(lineItem.Parent.Parent.MarketId, FrameworkContext.Current.CurrentDateTime, new CatalogKey(entry), priceFilter)
#147265
Apr 08, 2016 15:10
error This topic was created over six months ago and has been resolved. If you have a similar question, please create a new topic and refer to this one.
* You are NOT allowed to include any hyperlinks in the post because your account hasn't associated to your company. User profile should be updated.