public static ConfiguredGroup ToConfiguredGroup(this orderDto.DemoOrderConfiguredGroup group, CustomerOrder order)
        {
            var result = new ConfiguredGroup(group.Quantity ?? 0, order.Currency, group.ProductId)
            {
                Id           = group.Id,
                Name         = group.Name,
                ImageUrl     = group.ImageUrl,
                CreatedBy    = group.CreatedBy,
                CreatedDate  = group.CreatedDate ?? DateTime.UtcNow,
                ModifiedBy   = group.ModifiedBy,
                ModifiedDate = group.ModifiedDate,

                ExtendedPrice        = new Money(group.ExtendedPrice ?? 0, order.Currency),
                ExtendedPriceWithTax = new Money(group.ExtendedPriceWithTax ?? 0, order.Currency),
                TaxTotal             = new Money(group.TaxTotal ?? 0, order.Currency),

                Price              = new Money(group.Price ?? 0, order.Currency),
                PriceWithTax       = new Money(group.PriceWithTax ?? 0, order.Currency),
                PlacedPrice        = new Money(group.PlacedPrice ?? 0, order.Currency),
                PlacedPriceWithTax = new Money(group.PlacedPriceWithTax ?? 0, order.Currency),
                Currency           = order.Currency,
            };

            foreach (var item in group.ItemIds.Select(id => order.Items.First(x => x.Id == id)))
            {
                result.Items.Add(item);
            }

            return(result);
        }
        public static ConfiguredGroup ToConfiguredGroup(this cartApiDto.DemoCartConfiguredGroup group, ShoppingCart cart)
        {
            var result = new ConfiguredGroup(group.Quantity ?? 0, cart.Currency, group.ProductId)
            {
                Id           = group.Id,
                CreatedBy    = group.CreatedBy,
                CreatedDate  = group.CreatedDate ?? DateTime.UtcNow,
                ModifiedBy   = group.ModifiedBy,
                ModifiedDate = group.ModifiedDate,

                ExtendedPrice        = new Money(group.ExtendedPrice ?? 0, cart.Currency),
                ExtendedPriceWithTax = new Money(group.ExtendedPriceWithTax ?? 0, cart.Currency),
                TaxTotal             = new Money(group.TaxTotal ?? 0, cart.Currency),

                ListPrice          = new Money(group.ListPrice ?? 0, cart.Currency),
                ListPriceWithTax   = new Money(group.ListPriceWithTax ?? 0, cart.Currency),
                SalePrice          = new Money(group.SalePrice ?? 0, cart.Currency),
                SalePriceWithTax   = new Money(group.SalePriceWithTax ?? 0, cart.Currency),
                PlacedPrice        = new Money(group.PlacedPrice ?? 0, cart.Currency),
                PlacedPriceWithTax = new Money(group.PlacedPriceWithTax ?? 0, cart.Currency),
                Currency           = cart.Currency,
            };

            foreach (var item in group.ItemIds.Select(id => cart.Items.First(x => x.Id == id)))
            {
                result.Items.Add(item);
            }

            return(result);
        }
        public static orderDto.DemoOrderConfiguredGroup ToConfiguredGroup(this ConfiguredGroup group)
        {
            foreach (var lineItem in group.Items)
            {
                lineItem.Id = lineItem.Id ?? Guid.NewGuid().ToString("N");
            }

            return(new orderDto.DemoOrderConfiguredGroup
            {
                Id = group.Id ?? Guid.NewGuid().ToString("N"),
                ProductId = group.ProductId,
                Name = group.Name,
                ImageUrl = group.ImageUrl,
                ItemIds = group.Items.Select(x => x.Id).ToList(),
                CreatedBy = group.CreatedBy,
                CreatedDate = group.CreatedDate,
                ModifiedBy = group.ModifiedBy,
                ModifiedDate = group.ModifiedDate,
                Currency = group.Currency.Code,
                ExtendedPrice = (double)group.ExtendedPrice.InternalAmount,
                ExtendedPriceWithTax = (double)group.ExtendedPriceWithTax.InternalAmount,
                Price = (double)group.Price.InternalAmount,
                PriceWithTax = (double)group.PriceWithTax.InternalAmount,
                PlacedPrice = (double)group.PlacedPrice.InternalAmount,
                PlacedPriceWithTax = (double)group.PlacedPriceWithTax.InternalAmount,
                TaxTotal = (double)group.TaxTotal.InternalAmount,
                Quantity = group.Quantity
            });
        }
Exemple #4
0
        public async Task <ActionResult <AddItemsToCartResult> > AddItemsToCart([FromBody] AddCartItem[] items)
        {
            if (items.IsNullOrEmpty())
            {
                throw new ArgumentNullException(nameof(items));
            }

            EnsureCartExists();

            //Need lock to prevent concurrent access to same cart
            using (await AsyncLock.GetLockByKey(WorkContext.CurrentCart.Value.GetCacheKey()).LockAsync())
            {
                var productIds = items.Select(x => x.Id).ToArray();
                var products   = await _catalogService.GetProductsAsync(productIds, Model.Catalog.ItemResponseGroup.ItemSmall | Model.Catalog.ItemResponseGroup.ItemWithPrices | Model.Catalog.ItemResponseGroup.Inventory);

                var cartBuilder = await LoadOrCreateCartAsync();

                var cart     = _cartBuilder.Cart;
                var currency = WorkContext.CurrentCurrency;

                var firstItem = items.First();

                var             configuredProductId = firstItem.ConfiguredProductId;
                ConfiguredGroup configuredGroup     = null;

                // case with the configured product adding
                if (configuredProductId != null)
                {
                    configuredGroup = cart.ConfiguredGroups?.FirstOrDefault(x => (x.ProductId == configuredProductId) &&
                                                                            x.Items.OrderBy(x => x.ProductId).Select(x => x.ProductId).SequenceEqual(items.OrderBy(i => i.ProductId).Select(i => i.ProductId).ToArray())
                                                                            );

                    if (configuredGroup == null)
                    {
                        var configuredProduct = (await _catalogService.GetProductsAsync(new string[] { configuredProductId }, Model.Catalog.ItemResponseGroup.ItemSmall)).FirstOrDefault();
                        configuredGroup = new Model.Cart.Demo.ConfiguredGroup(firstItem.Quantity, currency, configuredProductId)
                        {
                            Name     = configuredProduct?.Name ?? string.Empty,
                            ImageUrl = configuredProduct?.PrimaryImage?.Url
                        };
                        cart.ConfiguredGroups.Add(configuredGroup);
                    }
                    else
                    {
                        configuredGroup.Quantity += Math.Max(1, firstItem.Quantity);
                    }
                }

                foreach (var item in items)
                {
                    item.ConfiguredGroupId = configuredGroup?.Id;
                    item.Product           = products.First(x => x.Id == item.ProductId);
                    await cartBuilder.AddItemAsync(item);
                }

                var validationResult = await new CartDemoValidator().ValidateAsync(cart, ruleSet: "default,strict");

                if (validationResult.IsValid)
                {
                    await cartBuilder.SaveAsync();
                }

                var result = new AddItemsToCartResult
                {
                    IsSuccess  = validationResult.IsValid,
                    ErrorCodes = validationResult.Errors.Select(x => x.ErrorCode).Distinct().ToArray()
                };

                return(result);
            }
        }