This commit is contained in:
merdan 2022-09-01 16:16:43 +05:00
parent 3f188c9be9
commit 8cf3adbf74
2 changed files with 207 additions and 210 deletions

View File

@ -247,152 +247,100 @@ func importProduct(product models.Product, db *gorm.DB) {
return
}
if iproduct.Type == "configurable" {
if len(product.ColorVariants) > 0 {
product.ColorVariants = append(product.ColorVariants, product)
var productFlatVariants []gm.ProductFlat
for _, colorVariant := range product.ColorVariants {
weight, _ := strconv.ParseFloat(colorVariant.Weight, 64)
var description string
for _, desc := range colorVariant.Descriptions {
description += "<p>" + desc.Description + "</p>"
}
if len(product.ColorVariants) > 0 {
colorOption := gm.GetAttributeOption(db, attributesMap["color"].ID, colorVariant.Color)
for _, colorVariant := range product.ColorVariants {
weight, _ := strconv.ParseFloat(colorVariant.Weight, 64)
var description string
for _, desc := range colorVariant.Descriptions {
description += "<p>" + desc.Description + "</p>"
}
if len(colorVariant.SizeVariants) > 0 {
colorOption := gm.GetAttributeOption(db, attributesMap["color"].ID, colorVariant.Color)
for _, sizeVariant := range colorVariant.SizeVariants {
if len(colorVariant.SizeVariants) > 0 {
sku := fmt.Sprintf("%s-%s-%d-col-size", colorVariant.ProductGroupID, colorVariant.ProductNumber, sizeVariant.ItemNumber)
for _, sizeVariant := range colorVariant.SizeVariants {
sizeOption := gm.GetAttributeOption(db, attributesMap["size"].ID, sizeVariant.AttributeValue)
sku := fmt.Sprintf("%s-%s-%d-col-size", colorVariant.ProductGroupID, colorVariant.ProductNumber, sizeVariant.ItemNumber)
productNumber := fmt.Sprintf("%s-%d", colorVariant.ProductNumber, sizeVariant.ItemNumber)
sizeOption := gm.GetAttributeOption(db, attributesMap["size"].ID, sizeVariant.AttributeValue)
productNumber := fmt.Sprintf("%s-%d", colorVariant.ProductNumber, sizeVariant.ItemNumber)
attributes := []gm.ProductAttributeValue{
{AttributeID: attributesMap["source"].ID, TextValue: colorVariant.URLKey},
{AttributeID: attributesMap["favoritesCount"].ID, IntegerValue: colorVariant.FavoriteCount},
{AttributeID: attributesMap["sku"].ID, TextValue: sku},
{AttributeID: attributesMap["product_number"].ID, TextValue: productNumber},
{AttributeID: attributesMap["name"].ID, TextValue: colorVariant.Name, Channel: "default", Locale: "tm"},
{AttributeID: attributesMap["weight"].ID, TextValue: colorVariant.Weight},
{AttributeID: attributesMap["status"].ID, BooleanValue: true},
//{AttributeID: attributesMap["visible_individually"].ID, BooleanValue: true, Channel: "default", Locale: "tm"},
{AttributeID: attributesMap["url_key"].ID, TextValue: sku},
{AttributeID: attributesMap["meta_keywords"].ID, TextValue: keywords, Channel: "default", Locale: "tm"},
{AttributeID: attributesMap["description"].ID, TextValue: description, Channel: "default", Locale: "tm"},
{AttributeID: attributesMap["color"].ID, IntegerValue: int(colorOption.ID)},
{AttributeID: attributesMap["size"].ID, IntegerValue: int(sizeOption.ID)},
}
//todo assign images
flatVariant := gm.ProductFlat{
//ProductID: productVariant.ID,
BrandID: mainProductFlat.BrandID,
Status: true,
//VisibleIndividually: false,
Name: colorVariant.Name,
Sku: sku,
ProductNumber: productNumber,
Description: description,
UrlKey: sku,
Weight: weight,
// Source: colorVariant.URLKey,
FavoritesCount: uint(colorVariant.FavoriteCount),
Color: int(colorOption.ID),
Size: int(sizeOption.ID),
ColorLabel: colorOption.AdminName,
SizeLabel: sizeOption.AdminName,
MetaKeywords: keywords,
ParentID: mainProductFlat.ID,
}
if sizeVariant.Price.OriginalPrice.Value > sizeVariant.Price.DiscountedPrice.Value {
attributes = append(attributes, []gm.ProductAttributeValue{
{AttributeID: attributesMap["price"].ID, FloatValue: sizeVariant.Price.OriginalPrice.Value},
{AttributeID: attributesMap["special_price"].ID, FloatValue: sizeVariant.Price.DiscountedPrice.Value},
}...)
flatVariant.Price = sizeVariant.Price.OriginalPrice.Value
flatVariant.SpecialPrice = sizeVariant.Price.DiscountedPrice.Value
flatVariant.MinPrice = sizeVariant.Price.DiscountedPrice.Value
flatVariant.MaxPrice = sizeVariant.Price.OriginalPrice.Value
} else {
attributes = append(attributes, gm.ProductAttributeValue{AttributeID: attributesMap["price"].ID, FloatValue: sizeVariant.Price.OriginalPrice.Value})
flatVariant.Price = sizeVariant.Price.OriginalPrice.Value
flatVariant.MinPrice = sizeVariant.Price.DiscountedPrice.Value
flatVariant.MaxPrice = sizeVariant.Price.OriginalPrice.Value
}
if mainProductFlat.MinPrice > flatVariant.MinPrice {
mainProductFlat.MinPrice = flatVariant.MinPrice
}
if mainProductFlat.MaxPrice < flatVariant.MaxPrice {
mainProductFlat.MaxPrice = flatVariant.MaxPrice
}
productVariant := gm.Product{
ParentID: mainProductFlat.ProductID,
Type: "simple",
AttributeFamilyID: iproduct.AttributeFamilyID,
Sku: sku,
BrandID: mainProductFlat.BrandID,
AttributeValues: attributes,
Categories: categories,
}
for _, element := range colorVariant.Images {
productVariant.Images = append(productVariant.Images, gm.ProductImage{Type: "cdn", Path: element})
}
errProdVariant := db.Omit("Categories.*").Create(&productVariant).Error
if errProdVariant != nil {
log.Println(errProdVariant)
return
}
flatVariant.ProductID = productVariant.ID
errVariant := db.Create(&flatVariant).Error
if errVariant != nil {
log.Println(errVariant)
return
}
productFlatVariants = append(productFlatVariants, flatVariant)
}
} else {
colorOption := gm.GetAttributeOption(db, attributesMap["color"].ID, colorVariant.Color)
attributes, variantFlat := collectAttributes(&colorVariant, &colorOption)
attributes = append(attributes, gm.ProductAttributeValue{AttributeID: attributesMap["meta_keywords"].ID, TextValue: keywords, Channel: "default", Locale: "tm"})
if mainProductFlat.MinPrice > variantFlat.MinPrice {
mainProductFlat.MinPrice = variantFlat.MinPrice
attributes := []gm.ProductAttributeValue{
{AttributeID: attributesMap["source"].ID, TextValue: colorVariant.URLKey},
{AttributeID: attributesMap["favoritesCount"].ID, IntegerValue: colorVariant.FavoriteCount},
{AttributeID: attributesMap["sku"].ID, TextValue: sku},
{AttributeID: attributesMap["product_number"].ID, TextValue: productNumber},
{AttributeID: attributesMap["name"].ID, TextValue: colorVariant.Name, Channel: "default", Locale: "tm"},
{AttributeID: attributesMap["weight"].ID, TextValue: colorVariant.Weight},
{AttributeID: attributesMap["status"].ID, BooleanValue: true},
//{AttributeID: attributesMap["visible_individually"].ID, BooleanValue: true, Channel: "default", Locale: "tm"},
{AttributeID: attributesMap["url_key"].ID, TextValue: sku},
{AttributeID: attributesMap["meta_keywords"].ID, TextValue: keywords, Channel: "default", Locale: "tm"},
{AttributeID: attributesMap["description"].ID, TextValue: description, Channel: "default", Locale: "tm"},
{AttributeID: attributesMap["color"].ID, IntegerValue: int(colorOption.ID)},
{AttributeID: attributesMap["size"].ID, IntegerValue: int(sizeOption.ID)},
}
if mainProductFlat.MaxPrice < variantFlat.MaxPrice {
mainProductFlat.MaxPrice = variantFlat.MaxPrice
//todo assign images
flatVariant := gm.ProductFlat{
//ProductID: productVariant.ID,
BrandID: mainProductFlat.BrandID,
Status: true,
//VisibleIndividually: false,
Name: colorVariant.Name,
Sku: sku,
ProductNumber: productNumber,
Description: description,
UrlKey: sku,
Weight: weight,
// Source: colorVariant.URLKey,
FavoritesCount: uint(colorVariant.FavoriteCount),
Color: int(colorOption.ID),
Size: int(sizeOption.ID),
ColorLabel: colorOption.AdminName,
SizeLabel: sizeOption.AdminName,
MetaKeywords: keywords,
ParentID: mainProductFlat.ID,
}
sku := fmt.Sprintf("%s-%s-%s-%s", iproduct.Sku, colorVariant.ProductNumber, colorVariant.ProductCode, colorVariant.Color)
if sizeVariant.Price.OriginalPrice.Value > sizeVariant.Price.DiscountedPrice.Value {
attributes = append(attributes, []gm.ProductAttributeValue{
{AttributeID: attributesMap["price"].ID, FloatValue: sizeVariant.Price.OriginalPrice.Value},
{AttributeID: attributesMap["special_price"].ID, FloatValue: sizeVariant.Price.DiscountedPrice.Value},
}...)
flatVariant.Price = sizeVariant.Price.OriginalPrice.Value
flatVariant.SpecialPrice = sizeVariant.Price.DiscountedPrice.Value
flatVariant.MinPrice = sizeVariant.Price.DiscountedPrice.Value
flatVariant.MaxPrice = sizeVariant.Price.OriginalPrice.Value
} else {
attributes = append(attributes, gm.ProductAttributeValue{AttributeID: attributesMap["price"].ID, FloatValue: sizeVariant.Price.OriginalPrice.Value})
flatVariant.Price = sizeVariant.Price.OriginalPrice.Value
flatVariant.MinPrice = sizeVariant.Price.DiscountedPrice.Value
flatVariant.MaxPrice = sizeVariant.Price.OriginalPrice.Value
}
if mainProductFlat.MinPrice > flatVariant.MinPrice {
mainProductFlat.MinPrice = flatVariant.MinPrice
}
if mainProductFlat.MaxPrice < flatVariant.MaxPrice {
mainProductFlat.MaxPrice = flatVariant.MaxPrice
}
productVariant := gm.Product{
ParentID: mainProductFlat.ProductID,
Type: "simple",
AttributeFamilyID: iproduct.AttributeFamilyID,
Sku: sku,
BrandID: mainProductFlat.BrandID,
AttributeValues: attributes,
AttributeFamilyID: iproduct.AttributeFamilyID,
Categories: categories,
}
@ -407,95 +355,36 @@ func importProduct(product models.Product, db *gorm.DB) {
return
}
variantFlat.ProductID = productVariant.ID
variantFlat.Color = int(colorOption.ID)
variantFlat.ColorLabel = colorOption.AdminName
variantFlat.MetaKeywords = keywords
variantFlat.ParentID = mainProductFlat.ID
flatVariant.ProductID = productVariant.ID
errVariant := db.Create(&variantFlat).Error
errVariant := db.Create(&flatVariant).Error
if errVariant != nil {
log.Println(errVariant)
return
}
productFlatVariants = append(productFlatVariants, variantFlat)
mainProductFlat.Variants = append(mainProductFlat.Variants, flatVariant)
}
}
}
if len(product.SizeVariants) > 0 {
} else {
weight, _ := strconv.ParseFloat(product.Weight, 64)
colorOption := gm.GetAttributeOption(db, attributesMap["color"].ID, colorVariant.Color)
attributes, variantFlat := collectAttributes(&colorVariant, &colorOption)
attributes = append(attributes, gm.ProductAttributeValue{AttributeID: attributesMap["meta_keywords"].ID, TextValue: keywords, Channel: "default", Locale: "tm"})
for _, sizeVariant := range product.SizeVariants {
sku := fmt.Sprintf("%s-%s-%d-size", iproduct.Sku, product.ProductNumber, sizeVariant.ItemNumber)
sizeOption := gm.GetAttributeOption(db, attributesMap["size"].ID, sizeVariant.AttributeValue)
attributes := []gm.ProductAttributeValue{
{AttributeID: attributesMap["source"].ID, TextValue: product.URLKey},
{AttributeID: attributesMap["favoritesCount"].ID, IntegerValue: product.FavoriteCount},
{AttributeID: attributesMap["sku"].ID, TextValue: sku},
{AttributeID: attributesMap["product_number"].ID, TextValue: fmt.Sprint(sizeVariant.ItemNumber)},
{AttributeID: attributesMap["name"].ID, TextValue: product.Name, Channel: "default", Locale: "tm"},
{AttributeID: attributesMap["weight"].ID, TextValue: product.Weight},
{AttributeID: attributesMap["status"].ID, BooleanValue: true},
//{AttributeID: attributesMap["visible_individually"].ID, BooleanValue: true},
{AttributeID: attributesMap["url_key"].ID, TextValue: sku},
{AttributeID: attributesMap["meta_keywords"].ID, TextValue: keywords, Channel: "default", Locale: "tm"},
{AttributeID: attributesMap["size"].ID, IntegerValue: int(sizeOption.ID)},
{AttributeID: attributesMap["description"].ID, TextValue: mainProductFlat.Description, Channel: "default", Locale: "tm"},
if mainProductFlat.MinPrice > variantFlat.MinPrice {
mainProductFlat.MinPrice = variantFlat.MinPrice
}
flatVariant := gm.ProductFlat{
Status: true,
VisibleIndividually: false,
Name: product.Name,
Sku: sku,
ProductNumber: fmt.Sprint(sizeVariant.ItemNumber),
UrlKey: sku,
Weight: weight,
Size: int(sizeOption.ID),
SizeLabel: sizeOption.AdminName,
MetaKeywords: keywords,
Description: mainProductFlat.Description,
// Source: product.URLKey,
FavoritesCount: uint(product.FavoriteCount),
ParentID: mainProductFlat.ID,
if mainProductFlat.MaxPrice < variantFlat.MaxPrice {
mainProductFlat.MaxPrice = variantFlat.MaxPrice
}
if sizeVariant.Price.OriginalPrice.Value > sizeVariant.Price.DiscountedPrice.Value {
attributes = append(attributes, []gm.ProductAttributeValue{
{AttributeID: attributesMap["price"].ID, FloatValue: sizeVariant.Price.OriginalPrice.Value},
{AttributeID: attributesMap["special_price"].ID, FloatValue: sizeVariant.Price.DiscountedPrice.Value},
}...)
sku := fmt.Sprintf("%s-%s-%s-%s", iproduct.Sku, colorVariant.ProductNumber, colorVariant.ProductCode, colorVariant.Color)
flatVariant.Price = sizeVariant.Price.OriginalPrice.Value
flatVariant.SpecialPrice = sizeVariant.Price.DiscountedPrice.Value
flatVariant.MinPrice = sizeVariant.Price.DiscountedPrice.Value
flatVariant.MaxPrice = sizeVariant.Price.OriginalPrice.Value
} else {
attributes = append(attributes, gm.ProductAttributeValue{AttributeID: attributesMap["price"].ID, FloatValue: sizeVariant.Price.OriginalPrice.Value})
flatVariant.Price = sizeVariant.Price.OriginalPrice.Value
flatVariant.MinPrice = sizeVariant.Price.DiscountedPrice.Value
flatVariant.MaxPrice = sizeVariant.Price.OriginalPrice.Value
}
if mainProductFlat.MinPrice > flatVariant.MinPrice {
mainProductFlat.MinPrice = flatVariant.MinPrice
}
if mainProductFlat.MaxPrice < flatVariant.MaxPrice {
mainProductFlat.MaxPrice = flatVariant.MaxPrice
}
sizeVariantProduct := gm.Product{
productVariant := gm.Product{
ParentID: mainProductFlat.ProductID,
Type: "simple",
Sku: sku,
@ -505,34 +394,141 @@ func importProduct(product models.Product, db *gorm.DB) {
Categories: categories,
}
errSizeVar := db.Omit("Categories.*").Create(&sizeVariantProduct).Error
for _, element := range colorVariant.Images {
productVariant.Images = append(productVariant.Images, gm.ProductImage{Type: "cdn", Path: element})
}
if errSizeVar != nil {
log.Println(errSizeVar)
errProdVariant := db.Omit("Categories.*").Create(&productVariant).Error
if errProdVariant != nil {
log.Println(errProdVariant)
return
}
flatVariant.ProductID = sizeVariantProduct.ID
variantFlat.ProductID = productVariant.ID
variantFlat.Color = int(colorOption.ID)
variantFlat.ColorLabel = colorOption.AdminName
variantFlat.MetaKeywords = keywords
variantFlat.ParentID = mainProductFlat.ID
errVariant := db.Omit("Product.Categories.*").Create(&flatVariant).Error
errVariant := db.Create(&variantFlat).Error
if errVariant != nil {
log.Println(errVariant)
return
}
productFlatVariants = append(productFlatVariants, flatVariant)
mainProductFlat.Variants = append(mainProductFlat.Variants, variantFlat)
}
}
} else if len(product.SizeVariants) > 0 {
weight, _ := strconv.ParseFloat(product.Weight, 64)
for _, sizeVariant := range product.SizeVariants {
sku := fmt.Sprintf("%s-%s-%d-size", iproduct.Sku, product.ProductNumber, sizeVariant.ItemNumber)
sizeOption := gm.GetAttributeOption(db, attributesMap["size"].ID, sizeVariant.AttributeValue)
attributes := []gm.ProductAttributeValue{
{AttributeID: attributesMap["source"].ID, TextValue: product.URLKey},
{AttributeID: attributesMap["favoritesCount"].ID, IntegerValue: product.FavoriteCount},
{AttributeID: attributesMap["sku"].ID, TextValue: sku},
{AttributeID: attributesMap["product_number"].ID, TextValue: fmt.Sprint(sizeVariant.ItemNumber)},
{AttributeID: attributesMap["name"].ID, TextValue: product.Name, Channel: "default", Locale: "tm"},
{AttributeID: attributesMap["weight"].ID, TextValue: product.Weight},
{AttributeID: attributesMap["status"].ID, BooleanValue: true},
//{AttributeID: attributesMap["visible_individually"].ID, BooleanValue: true},
{AttributeID: attributesMap["url_key"].ID, TextValue: sku},
{AttributeID: attributesMap["meta_keywords"].ID, TextValue: keywords, Channel: "default", Locale: "tm"},
{AttributeID: attributesMap["size"].ID, IntegerValue: int(sizeOption.ID)},
{AttributeID: attributesMap["description"].ID, TextValue: mainProductFlat.Description, Channel: "default", Locale: "tm"},
}
flatVariant := gm.ProductFlat{
Status: true,
VisibleIndividually: false,
Name: product.Name,
Sku: sku,
ProductNumber: fmt.Sprint(sizeVariant.ItemNumber),
UrlKey: sku,
Weight: weight,
Size: int(sizeOption.ID),
SizeLabel: sizeOption.AdminName,
MetaKeywords: keywords,
Description: mainProductFlat.Description,
// Source: product.URLKey,
FavoritesCount: uint(product.FavoriteCount),
ParentID: mainProductFlat.ID,
}
if sizeVariant.Price.OriginalPrice.Value > sizeVariant.Price.DiscountedPrice.Value {
attributes = append(attributes, []gm.ProductAttributeValue{
{AttributeID: attributesMap["price"].ID, FloatValue: sizeVariant.Price.OriginalPrice.Value},
{AttributeID: attributesMap["special_price"].ID, FloatValue: sizeVariant.Price.DiscountedPrice.Value},
}...)
flatVariant.Price = sizeVariant.Price.OriginalPrice.Value
flatVariant.SpecialPrice = sizeVariant.Price.DiscountedPrice.Value
flatVariant.MinPrice = sizeVariant.Price.DiscountedPrice.Value
flatVariant.MaxPrice = sizeVariant.Price.OriginalPrice.Value
} else {
attributes = append(attributes, gm.ProductAttributeValue{AttributeID: attributesMap["price"].ID, FloatValue: sizeVariant.Price.OriginalPrice.Value})
flatVariant.Price = sizeVariant.Price.OriginalPrice.Value
flatVariant.MinPrice = sizeVariant.Price.DiscountedPrice.Value
flatVariant.MaxPrice = sizeVariant.Price.OriginalPrice.Value
}
if mainProductFlat.MinPrice > flatVariant.MinPrice {
mainProductFlat.MinPrice = flatVariant.MinPrice
}
if mainProductFlat.MaxPrice < flatVariant.MaxPrice {
mainProductFlat.MaxPrice = flatVariant.MaxPrice
}
sizeVariantProduct := gm.Product{
ParentID: mainProductFlat.ProductID,
Type: "simple",
Sku: sku,
BrandID: mainProductFlat.BrandID,
AttributeValues: attributes,
AttributeFamilyID: iproduct.AttributeFamilyID,
Categories: categories,
Images: iproduct.Images,
}
errSizeVar := db.Omit("Categories.*").Create(&sizeVariantProduct).Error
if errSizeVar != nil {
log.Println(errSizeVar)
return
}
flatVariant.ProductID = sizeVariantProduct.ID
errVariant := db.Omit("Product.Categories.*").Create(&flatVariant).Error
if errVariant != nil {
log.Println(errVariant)
return
}
mainProductFlat.Variants = append(mainProductFlat.Variants, flatVariant)
}
errFlat := db.Omit("ParentID", "CreatedAt").Save(&mainProductFlat)
}
if errFlat != nil {
log.Println(errFlat)
errFlat := db.Omit("ParentID", "CreatedAt", "Variants").Save(&mainProductFlat)
if errFlat != nil {
log.Println(errFlat)
}
mainProductFlat.Variants = productFlatVariants
}
sProduct := createSellerProduct(&mainProductFlat, product.Vendor)

View File

@ -10,6 +10,7 @@ type AttributeOption struct {
ID uint `gorm:"primaryKey"`
AttributeID uint
AdminName string
Position int
}
type Attribute struct {