public virtual async Task <Money> GetPreselectedPriceAsync(Product product, Customer customer, PriceCalculationContext context)
        {
            Guard.NotNull(product, nameof(product));

            var result = decimal.Zero;

            context ??= new PriceCalculationContext(null, _services, _storeContext.CurrentStore, customer ?? _workContext.CurrentCustomer, true);

            if (product.ProductType == ProductType.BundledProduct)
            {
                var bundleItems = await context.ProductBundleItems.GetOrLoadAsync(product.Id);

                var bundleItemsData = bundleItems.Select(x => new ProductBundleItemData(x)).ToList();

                var productIds = bundleItemsData.Select(x => x.Item.ProductId).ToList();
                productIds.Add(product.Id);
                context.Collect(productIds);

                // Fetch bundleItemsData.AdditionalCharge for all bundle items.
                foreach (var bundleItem in bundleItemsData.Where(x => x.Item.Product.CanBeBundleItem()))
                {
                    var _ = await GetPreselectedPriceAmountAsync(bundleItem.Item.Product, customer, context, bundleItem, bundleItemsData);
                }

                result = await GetPreselectedPriceAmountAsync(product, customer, context, null, bundleItemsData);
            }
            else
            {
                result = await GetPreselectedPriceAmountAsync(product, customer, context, null, null);
            }

            return(new(result, _primaryCurrency));
        }
        public virtual async Task <Money> GetPreselectedPriceAsync(Product product, Customer customer, Currency currency, PriceCalculationContext context)
        {
            Guard.NotNull(product, nameof(product));

            context ??= CreatePriceCalculationContext(customer: customer);

            if (product.ProductType == ProductType.BundledProduct)
            {
                var bundleItems = await context.ProductBundleItems.GetOrLoadAsync(product.Id);

                var bundleItemsData = bundleItems.Select(x => new ProductBundleItemData(x)).ToList();

                var productIds = bundleItemsData.Select(x => x.Item.ProductId).ToList();
                productIds.Add(product.Id);
                context.Collect(productIds);

                // Fetch bundleItemsData.AdditionalCharge for all bundle items.
                foreach (var bundleItem in bundleItemsData.Where(x => x.Item.Product.CanBeBundleItem()))
                {
                    var _ = await GetPreselectedPriceAsync(bundleItem.Item.Product, customer, currency, context, bundleItem, bundleItemsData);
                }

                return(await GetPreselectedPriceAsync(product, customer, currency, context, null, bundleItemsData));
            }
            else
            {
                return(await GetPreselectedPriceAsync(product, customer, currency, context, null, null));
            }
        }