in src/Modules/SimplCommerce.Module.Catalog/Areas/Catalog/Controllers/ProductApiController.cs [700:783]
private async Task AddOrDeleteProductVariation(User loginUser, ProductForm model, Product product)
{
foreach (var productVariationVm in model.Product.Variations)
{
var productLink = product.ProductLinks.Where(x => x.LinkType == ProductLinkType.Super).FirstOrDefault(x => x.LinkedProduct.Name == productVariationVm.Name);
if (productLink == null)
{
productLink = new ProductLink
{
LinkType = ProductLinkType.Super,
Product = product,
LinkedProduct = product.Clone()
};
productLink.LinkedProduct.CreatedById = loginUser.Id;
productLink.LinkedProduct.LatestUpdatedById = loginUser.Id;
productLink.LinkedProduct.Name = productVariationVm.Name;
productLink.LinkedProduct.Slug = StringHelper.ToUrlFriendly(productVariationVm.Name);
productLink.LinkedProduct.Sku = productVariationVm.Sku;
productLink.LinkedProduct.Gtin = productVariationVm.Gtin;
productLink.LinkedProduct.Price = productVariationVm.Price;
productLink.LinkedProduct.OldPrice = productVariationVm.OldPrice;
productLink.LinkedProduct.NormalizedName = productVariationVm.NormalizedName;
productLink.LinkedProduct.HasOptions = false;
productLink.LinkedProduct.IsVisibleIndividually = false;
if(product.ThumbnailImage != null)
{
productLink.LinkedProduct.ThumbnailImage = new Media { FileName = product.ThumbnailImage.FileName };
}
await MapProductVariantImageFromVm(productVariationVm, productLink.LinkedProduct);
foreach (var combinationVm in productVariationVm.OptionCombinations)
{
productLink.LinkedProduct.AddOptionCombination(new ProductOptionCombination
{
OptionId = combinationVm.OptionId,
Value = combinationVm.Value,
SortIndex = combinationVm.SortIndex
});
}
var productPriceHistory = CreatePriceHistory(loginUser, productLink.LinkedProduct);
productLink.LinkedProduct.PriceHistories.Add(productPriceHistory);
product.AddProductLinks(productLink);
}
else
{
var isPriceChanged = false;
if(productLink.LinkedProduct.Price != productVariationVm.Price ||
productLink.LinkedProduct.OldPrice != productVariationVm.OldPrice)
{
isPriceChanged = true;
}
productLink.LinkedProduct.LatestUpdatedById = loginUser.Id;
productLink.LinkedProduct.LatestUpdatedOn = DateTimeOffset.Now;
productLink.LinkedProduct.Sku = productVariationVm.Sku;
productLink.LinkedProduct.Gtin = productVariationVm.Gtin;
productLink.LinkedProduct.Price = productVariationVm.Price;
productLink.LinkedProduct.OldPrice = productVariationVm.OldPrice;
productLink.LinkedProduct.IsDeleted = false;
productLink.LinkedProduct.StockTrackingIsEnabled = product.StockTrackingIsEnabled;
await MapProductVariantImageFromVm(productVariationVm, productLink.LinkedProduct);
if (isPriceChanged)
{
var productPriceHistory = CreatePriceHistory(loginUser, productLink.LinkedProduct);
productLink.LinkedProduct.PriceHistories.Add(productPriceHistory);
}
}
}
foreach (var productLink in product.ProductLinks.Where(x => x.LinkType == ProductLinkType.Super))
{
if (model.Product.Variations.All(x => x.Name != productLink.LinkedProduct.Name))
{
_productLinkRepository.Remove(productLink);
productLink.LinkedProduct.IsDeleted = true;
}
}
}