London Dev Meetup Rescheduled! Due to unavoidable reasons, the event has been moved to 21st May. Speakers remain the same—any changes will be communicated. Seats are limited—register here to secure your spot!
London Dev Meetup Rescheduled! Due to unavoidable reasons, the event has been moved to 21st May. Speakers remain the same—any changes will be communicated. Seats are limited—register here to secure your spot!
Not sure if I understood your question correctly, but prices are placed on variant level, not product level.
If you're going to have the same price for all variants on a product you'll have to loop through all the variants and add the price to each of them and save them using the PriceDetailService.Save()-method.
To get the content references of all the variants of a product you can call the ProductContent.GetVariants()-method.
Updating customer group data is just a matter of running PriceDetailService.List and selecting an appropriate IPriceDetailValue.
I wrote together some sample code from what I gathered from your question it will obviously need editing but just to give you an idea:
// Inject these: IPriceDetailService _priceDetailService; IContentRepository _contentRepository; public void CreateOrUpdateCustomerGroupPrice(ProductContent product, string customerGroupName, Money price, MarketId market) { var variantReferences = product.GetVariants(); foreach (var variantReference in variantReferences) { // Gets current read only prices. var variantPrices = _priceDetailService.List(variantReference); var currentPrice = variantPrices.FirstOrDefault( x => x.CustomerPricing.PriceTypeId == CustomerPricing.PriceType.PriceGroup && x.CustomerPricing.PriceCode == customerGroupName); CatalogKey catalogKey; // we need to either generate this or copy it from the current price if (currentPrice == null) { // lot's of loading for a catalogkey, maybe needs another approach. var variant = _contentRepository.Get<VariationContent>(variantReference); catalogKey = new CatalogKey(variant.LoadEntry()); } else { catalogKey = currentPrice.CatalogKey; // Delete the old price _priceDetailService.Delete(currentPrice.PriceValueId); } // Mostly copied from world sample code. Set values to whatever you need here, parameterize the ones that aren't static. var newPriceValue = new PriceDetailValue { CatalogKey = catalogKey, MarketId = market, CustomerPricing = new CustomerPricing(CustomerPricing.PriceType.PriceGroup, customerGroupName), ValidFrom = DateTime.UtcNow.AddDays(-7), ValidUntil = DateTime.UtcNow.AddDays(7), MinQuantity = 0m, UnitPrice = price }; // Save the new price _priceDetailService.Save(newPriceValue); } }
Disclaimer: This code is untested and is only intended as a sample solution.
Hi Jafet,
Thank You for your response.
I too used the same procedure what you did.
While Insert the price we first delete old price right. That's an actual problem I need to update 10k products means I have to delete the old price and add the new one.
Is there any way to update the price?
_priceDetailService.Delete(currentPrice.PriceValueId);
Ok, try the constructor overload of PriceDetailValue that accepts an IPriceDetailValue instead:
// Inject these: IPriceDetailService _priceDetailService; IContentRepository _contentRepository; public void CreateOrUpdateCustomerGroupPrice(ProductContent product, string customerGroupName, Money price, MarketId market) { var variantReferences = product.GetVariants(); foreach (var variantReference in variantReferences) { // Gets current read only prices. var variantPrices = _priceDetailService.List(variantReference); var currentPrice = variantPrices.FirstOrDefault( x => x.CustomerPricing.PriceTypeId == CustomerPricing.PriceType.PriceGroup && x.CustomerPricing.PriceCode == customerGroupName); PriceDetailValue newPriceValue; if (currentPrice == null) { // lot's of loading for a catalogkey, maybe needs another approach. var variant = _contentRepository.Get<VariationContent>(variantReference); // Set values to whatever you need here, parameterize the ones that aren't static. newPriceValue = new PriceDetailValue { CatalogKey = new CatalogKey(variant.LoadEntry()), MarketId = market, CustomerPricing = new CustomerPricing(CustomerPricing.PriceType.PriceGroup, customerGroupName), ValidFrom = DateTime.UtcNow.AddDays(-7), ValidUntil = DateTime.UtcNow.AddDays(7), MinQuantity = 0m, UnitPrice = price }; } else { newPriceValue = new PriceDetailValue(currentPrice); // Copies the previous one including it's priceValueId newPriceValue.UnitPrice = price; } // Save the new price _priceDetailService.Save(newPriceValue); // Updates or creates the price based on if newPriceValue already has a priceValueId set or not } }
Disclaimer: This code is untested and is only intended as a sample solution.
Hi everyone,
I am using E-commerce site. So, I need to update the product price values frequently. I try to update the product price. But it's not worked.
I just referred the following link,
https://world.episerver.com/documentation/Items/Developers-Guide/Episerver-Commerce/9/Pricing/Pricing-examples/
Still, now, I used to delete the product price before update the new price value.
Is there any way to update the price based on product Customer Group( Sale Code).