go_service/controllers/ImportController.go

841 lines
27 KiB
Go
Raw Normal View History

2022-09-07 12:55:55 +00:00
package controller
2022-08-27 06:43:56 +00:00
import (
gm "db_service/gorm_models"
"db_service/models"
helper "db_service/pkg"
"encoding/json"
"fmt"
"log"
"math/big"
"net/http"
"os"
"strconv"
"sync"
"time"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
2022-09-07 12:55:55 +00:00
var (
mainCategories []gm.Category
baza *gorm.DB
mainImportWG, famAndSellerWG sync.WaitGroup
families []gm.AttributeFamily
sellers = make(map[string]gm.MarketplaceSeller)
2022-09-15 12:24:06 +00:00
AttributesMap = make(map[string]gm.Attribute)
2022-09-07 12:55:55 +00:00
)
2022-08-27 06:43:56 +00:00
2022-09-07 12:55:55 +00:00
func StartImport(w http.ResponseWriter, route *http.Request) {
2022-08-27 06:43:56 +00:00
start := time.Now()
r := new(big.Int)
fmt.Println("start import", r.Binomial(1000, 10))
baza, err := gorm.Open(mysql.Open(os.Getenv("database_url")), &gorm.Config{})
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
//get categories from mysql on main thread
mainCategories = gm.GetMainCategories(baza)
famAndSellerWG.Add(3)
//get attribute families from mysql with gorutine
go func() {
defer famAndSellerWG.Done()
2022-09-03 13:27:46 +00:00
families, err = gm.GetFamilies(baza)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
2022-08-27 06:43:56 +00:00
}()
//get sellers families from mysql with gorutine
go func() {
defer famAndSellerWG.Done()
2022-09-03 13:27:46 +00:00
var vendors, err = gm.GetSellers(baza)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
for _, vendor := range vendors {
2022-08-27 06:43:56 +00:00
sellers[vendor.Url] = vendor
}
}()
go func() {
defer famAndSellerWG.Done()
2022-09-03 13:27:46 +00:00
var attributes, err = gm.GetAttributes(baza)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
2022-08-27 06:43:56 +00:00
for _, atrattribute := range attributes {
2022-09-15 12:24:06 +00:00
AttributesMap[atrattribute.Code] = atrattribute
2022-08-27 06:43:56 +00:00
}
}()
mainImportWG.Add(len(mainCategories))
2022-09-01 11:53:11 +00:00
errDel := gm.DeleteProducts(baza)
2022-09-01 11:26:15 +00:00
if errDel != nil {
http.Error(w, errDel.Error(), http.StatusInternalServerError)
return
}
2022-08-27 06:43:56 +00:00
for _, element := range mainCategories {
slug := element.Translations[0].Slug
2022-09-07 12:55:55 +00:00
go importCategoryProducts("ty_db_"+slug, baza)
2022-08-27 06:43:56 +00:00
// fmt.Println(<-result)
}
mainImportWG.Wait()
2022-09-05 12:35:26 +00:00
err = gm.Flush()
2022-08-27 06:43:56 +00:00
2022-09-05 12:35:26 +00:00
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
}
2022-09-06 13:49:08 +00:00
2022-08-27 06:43:56 +00:00
elapsed := time.Since(start)
log.Printf("end import took %s", elapsed)
2022-09-06 13:49:08 +00:00
http.Error(w, fmt.Sprintf("end import took %s", elapsed), http.StatusOK)
2022-08-27 06:43:56 +00:00
}
2022-09-07 12:55:55 +00:00
func importCategoryProducts(dbName string, db *gorm.DB) {
2022-08-27 06:43:56 +00:00
defer mainImportWG.Done()
dbExists := helper.CheckDBExists(os.Getenv("couch_db_source") + dbName)
fmt.Println(dbName)
if dbExists {
totalDocCount := getTotalDocumentCount(dbName)
skip := 0
2022-09-05 12:35:26 +00:00
limit := 500
2022-08-27 06:43:56 +00:00
for skip < totalDocCount {
var response models.BagistoModelResponse
url := fmt.Sprintf("%s%s/_all_docs?include_docs=true&limit=%v&skip=%v", os.Getenv("couch_db_source"), dbName, limit, skip)
fmt.Println(url)
skip += limit
2022-09-07 12:55:55 +00:00
body, err := helper.SendRequest("GET", url, nil, "")
2022-08-27 06:43:56 +00:00
if err != nil {
fmt.Println(err.Error())
continue
}
err = json.Unmarshal(body, &response)
if err != nil {
log.Println(err.Error())
continue
}
//itearate 100 row products
for _, element := range response.Rows {
2022-09-07 12:55:55 +00:00
ImportProduct(element.Doc, db)
2022-08-27 06:43:56 +00:00
}
}
} else {
fmt.Println(dbName + "+doesnt exist")
}
}
func getTotalDocumentCount(db string) int {
var response models.DBDocCountResponse
url := os.Getenv("couch_db_source") + db
2022-09-07 12:55:55 +00:00
body, err := helper.SendRequest("GET", url, nil, "")
2022-08-27 06:43:56 +00:00
if err != nil {
log.Println(err.Error())
return 0
}
err = json.Unmarshal(body, &response)
if err != nil {
log.Println(err.Error())
return 0
}
return response.DocCount
}
// todo defailt variant
// productflat
func getCats(db *gorm.DB, catIDs []int) ([]gm.Category, string, error) {
var categories []gm.Category
var keywords string
errCat := db.Preload("Translations").Find(&categories, catIDs).Error
if errCat != nil {
return categories, keywords, errCat
}
for _, cat := range categories {
if len(cat.Translations) > 0 && cat.Translations[0].MetaKeywords != "" {
translation := cat.Translations[0]
keywords += "," + translation.MetaKeywords
}
}
return categories, keywords, nil
}
2022-09-07 12:55:55 +00:00
func ImportProduct(product models.Product, db *gorm.DB) error {
2022-08-27 06:43:56 +00:00
famAndSellerWG.Wait() //wait until attribute families and sellers are not get from mysql
categories, keywords, errCat := getCats(db, product.Categories)
if errCat != nil {
log.Println(errCat)
2022-09-07 12:55:55 +00:00
return errCat
2022-08-27 06:43:56 +00:00
}
var brand gm.Brand
if product.Brand != "" {
brand = gm.FindOrCreateBrand(db, product.Brand, categories)
}
attributes, mainProductFlat := prepearAttributesWithFlat(&product)
2022-09-15 12:24:06 +00:00
colorOption := gm.GetAttributeOption(db, AttributesMap["color"].ID, product.Color)
2022-09-05 13:09:43 +00:00
mainProductFlat.Color = int(colorOption.ID)
mainProductFlat.ColorLabel = product.Color
2022-09-05 15:10:39 +00:00
var productImages []gm.ProductImage
2022-09-05 13:09:43 +00:00
attributes = append(attributes, []gm.ProductAttributeValue{
2022-09-15 12:24:06 +00:00
{AttributeID: AttributesMap["color"].ID, IntegerValue: int(colorOption.ID)},
{AttributeID: AttributesMap["meta_keywords"].ID, TextValue: keywords, Channel: "default", Locale: "tm"}}...)
2022-08-27 06:43:56 +00:00
2022-09-05 16:16:10 +00:00
for _, element := range product.Images {
productImages = append(productImages, gm.ProductImage{Type: "cdn", Path: element})
}
2022-09-09 06:25:47 +00:00
var famID uint = 1
if len(families) > 0 {
famID = families[0].ID
}
2022-08-27 06:43:56 +00:00
iproduct := gm.Product{
Sku: product.ProductGroupID,
Type: "simple",
2022-09-09 06:25:47 +00:00
AttributeFamilyID: famID,
2022-08-27 06:43:56 +00:00
BrandID: brand.ID,
Categories: categories,
AttributeValues: attributes,
2022-09-05 16:16:10 +00:00
Images: productImages,
2022-08-27 06:43:56 +00:00
}
2022-09-03 13:27:46 +00:00
if len(product.ColorVariants) > 0 {
2022-09-15 12:24:06 +00:00
iproduct.SuperAttributes = append(iproduct.SuperAttributes, AttributesMap["color"])
2022-08-27 06:43:56 +00:00
}
if len(product.SizeVariants) > 0 {
2022-09-15 12:24:06 +00:00
iproduct.SuperAttributes = append(iproduct.SuperAttributes, AttributesMap["size"])
2022-08-27 06:43:56 +00:00
}
if len(iproduct.SuperAttributes) > 0 {
iproduct.Type = "configurable"
2022-09-09 06:25:47 +00:00
famID = 2
if len(families) > 1 {
famID = families[1].ID
}
iproduct.AttributeFamilyID = famID
2022-08-27 06:43:56 +00:00
}
2022-09-05 16:16:10 +00:00
2022-08-27 06:43:56 +00:00
errMainProduct := db.Omit("Categories.*", "SuperAttributes.*", "ParentID").Create(&iproduct).Error
if errMainProduct != nil {
2022-09-06 10:19:37 +00:00
log.Println(errMainProduct.Error())
2022-09-07 12:55:55 +00:00
return errMainProduct
2022-08-27 06:43:56 +00:00
}
mainProductFlat.ProductID = iproduct.ID
mainProductFlat.BrandID = brand.ID
mainProductFlat.MetaKeywords = keywords
errProductMainFlat := db.Create(&mainProductFlat).Error
if errProductMainFlat != nil {
log.Println(errProductMainFlat)
2022-09-07 12:55:55 +00:00
return errProductMainFlat
2022-08-27 06:43:56 +00:00
}
2022-09-01 11:16:43 +00:00
if len(product.ColorVariants) > 0 {
product.ColorVariants = append(product.ColorVariants, product)
for _, colorVariant := range product.ColorVariants {
weight, _ := strconv.ParseFloat(colorVariant.Weight, 64)
var description string
for _, desc := range colorVariant.Descriptions {
description += "<p>" + desc.Description + "</p>"
}
2022-08-27 06:43:56 +00:00
2022-09-15 12:24:06 +00:00
colorOption := gm.GetAttributeOption(db, AttributesMap["color"].ID, colorVariant.Color)
2022-08-27 06:43:56 +00:00
2022-09-01 11:16:43 +00:00
if len(colorVariant.SizeVariants) > 0 {
2022-08-27 06:43:56 +00:00
2022-09-01 11:16:43 +00:00
for _, sizeVariant := range colorVariant.SizeVariants {
2022-08-27 06:43:56 +00:00
2022-09-01 11:16:43 +00:00
sku := fmt.Sprintf("%s-%s-%d-col-size", colorVariant.ProductGroupID, colorVariant.ProductNumber, sizeVariant.ItemNumber)
2022-09-15 12:24:06 +00:00
sizeOption := gm.GetAttributeOption(db, AttributesMap["size"].ID, sizeVariant.AttributeValue)
2022-08-27 06:43:56 +00:00
2022-09-01 11:16:43 +00:00
productNumber := fmt.Sprintf("%s-%d", colorVariant.ProductNumber, sizeVariant.ItemNumber)
2022-09-01 09:27:48 +00:00
2022-09-01 11:16:43 +00:00
attributes := []gm.ProductAttributeValue{
2022-09-15 12:24:06 +00:00
{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)},
2022-08-27 06:43:56 +00:00
}
2022-09-01 11:16:43 +00:00
//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{
2022-09-15 12:24:06 +00:00
{AttributeID: AttributesMap["price"].ID, FloatValue: sizeVariant.Price.OriginalPrice.Value},
{AttributeID: AttributesMap["special_price"].ID, FloatValue: sizeVariant.Price.DiscountedPrice.Value},
2022-09-01 11:16:43 +00:00
}...)
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 {
2022-09-20 10:55:04 +00:00
attributes = append(attributes, gm.ProductAttributeValue{AttributeID: AttributesMap["price"].ID, FloatValue: sizeVariant.Price.DiscountedPrice.Value})
2022-08-27 06:43:56 +00:00
2022-09-20 10:55:04 +00:00
flatVariant.Price = sizeVariant.Price.DiscountedPrice.Value
2022-09-01 11:16:43 +00:00
flatVariant.MinPrice = sizeVariant.Price.DiscountedPrice.Value
2022-09-20 10:55:04 +00:00
flatVariant.MaxPrice = sizeVariant.Price.DiscountedPrice.Value
2022-08-27 06:43:56 +00:00
}
2022-09-06 10:19:37 +00:00
if mainProductFlat.MinPrice > flatVariant.MinPrice || mainProductFlat.MinPrice == 0 {
2022-09-01 11:16:43 +00:00
mainProductFlat.MinPrice = flatVariant.MinPrice
2022-08-27 06:43:56 +00:00
}
2022-09-01 11:16:43 +00:00
if mainProductFlat.MaxPrice < flatVariant.MaxPrice {
mainProductFlat.MaxPrice = flatVariant.MaxPrice
}
2022-08-27 06:43:56 +00:00
productVariant := gm.Product{
ParentID: mainProductFlat.ProductID,
Type: "simple",
2022-09-01 11:16:43 +00:00
AttributeFamilyID: iproduct.AttributeFamilyID,
2022-08-27 06:43:56 +00:00
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)
2022-09-07 12:55:55 +00:00
return errProdVariant
2022-08-27 06:43:56 +00:00
}
2022-09-01 11:16:43 +00:00
flatVariant.ProductID = productVariant.ID
2022-08-27 06:43:56 +00:00
2022-09-01 11:16:43 +00:00
errVariant := db.Create(&flatVariant).Error
2022-08-27 06:43:56 +00:00
if errVariant != nil {
log.Println(errVariant)
2022-09-07 12:55:55 +00:00
return errVariant
2022-08-27 06:43:56 +00:00
}
2022-09-01 11:16:43 +00:00
mainProductFlat.Variants = append(mainProductFlat.Variants, flatVariant)
2022-08-27 06:43:56 +00:00
}
2022-09-01 11:16:43 +00:00
} else {
2022-08-27 06:43:56 +00:00
2022-09-15 12:24:06 +00:00
colorOption := gm.GetAttributeOption(db, AttributesMap["color"].ID, colorVariant.Color)
2022-09-01 11:16:43 +00:00
attributes, variantFlat := collectAttributes(&colorVariant, &colorOption)
2022-09-15 12:24:06 +00:00
attributes = append(attributes, gm.ProductAttributeValue{AttributeID: AttributesMap["meta_keywords"].ID, TextValue: keywords, Channel: "default", Locale: "tm"})
2022-08-27 06:43:56 +00:00
2022-09-06 10:19:37 +00:00
if mainProductFlat.MinPrice > variantFlat.MinPrice || mainProductFlat.MinPrice == 0 {
2022-09-01 11:16:43 +00:00
mainProductFlat.MinPrice = variantFlat.MinPrice
2022-09-01 09:27:48 +00:00
}
2022-08-27 06:43:56 +00:00
2022-09-01 11:16:43 +00:00
if mainProductFlat.MaxPrice < variantFlat.MaxPrice {
mainProductFlat.MaxPrice = variantFlat.MaxPrice
2022-09-01 09:27:48 +00:00
}
2022-09-01 08:54:46 +00:00
2022-09-01 11:16:43 +00:00
sku := fmt.Sprintf("%s-%s-%s-%s", iproduct.Sku, colorVariant.ProductNumber, colorVariant.ProductCode, colorVariant.Color)
2022-09-01 08:54:46 +00:00
2022-09-01 11:16:43 +00:00
productVariant := gm.Product{
2022-09-01 09:27:48 +00:00
ParentID: mainProductFlat.ProductID,
Type: "simple",
Sku: sku,
BrandID: mainProductFlat.BrandID,
AttributeValues: attributes,
AttributeFamilyID: iproduct.AttributeFamilyID,
Categories: categories,
}
2022-09-01 08:54:46 +00:00
2022-09-01 11:16:43 +00:00
for _, element := range colorVariant.Images {
productVariant.Images = append(productVariant.Images, gm.ProductImage{Type: "cdn", Path: element})
}
errProdVariant := db.Omit("Categories.*").Create(&productVariant).Error
2022-09-01 08:54:46 +00:00
2022-09-01 11:16:43 +00:00
if errProdVariant != nil {
log.Println(errProdVariant)
2022-09-07 12:55:55 +00:00
return errProdVariant
2022-09-01 09:27:48 +00:00
}
2022-09-01 08:54:46 +00:00
2022-09-01 11:16:43 +00:00
variantFlat.ProductID = productVariant.ID
variantFlat.Color = int(colorOption.ID)
variantFlat.ColorLabel = colorOption.AdminName
variantFlat.MetaKeywords = keywords
variantFlat.ParentID = mainProductFlat.ID
2022-08-27 06:43:56 +00:00
2022-09-01 11:16:43 +00:00
errVariant := db.Create(&variantFlat).Error
2022-08-27 06:43:56 +00:00
2022-09-01 09:27:48 +00:00
if errVariant != nil {
log.Println(errVariant)
2022-09-07 12:55:55 +00:00
return errVariant
2022-08-27 06:43:56 +00:00
}
2022-09-01 09:27:48 +00:00
2022-09-01 11:16:43 +00:00
mainProductFlat.Variants = append(mainProductFlat.Variants, variantFlat)
}
2022-08-27 06:43:56 +00:00
}
2022-09-01 11:16:43 +00:00
} else if len(product.SizeVariants) > 0 {
weight, _ := strconv.ParseFloat(product.Weight, 64)
2022-09-15 12:24:06 +00:00
colorOption := gm.GetAttributeOption(db, AttributesMap["color"].ID, product.Color)
2022-09-01 11:16:43 +00:00
for _, sizeVariant := range product.SizeVariants {
2022-08-27 06:43:56 +00:00
2022-09-01 11:16:43 +00:00
sku := fmt.Sprintf("%s-%s-%d-size", iproduct.Sku, product.ProductNumber, sizeVariant.ItemNumber)
2022-09-15 12:24:06 +00:00
sizeOption := gm.GetAttributeOption(db, AttributesMap["size"].ID, sizeVariant.AttributeValue)
2022-09-01 11:16:43 +00:00
attributes := []gm.ProductAttributeValue{
2022-09-15 12:24:06 +00:00
{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"},
{AttributeID: AttributesMap["color"].ID, IntegerValue: int(colorOption.ID)},
2022-09-01 11:16:43 +00:00
}
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,
2022-09-05 13:09:43 +00:00
Color: int(colorOption.ID),
ColorLabel: product.Color,
FavoritesCount: uint(product.FavoriteCount),
ParentID: mainProductFlat.ID,
2022-09-01 11:16:43 +00:00
}
if sizeVariant.Price.OriginalPrice.Value > sizeVariant.Price.DiscountedPrice.Value {
attributes = append(attributes, []gm.ProductAttributeValue{
2022-09-15 12:24:06 +00:00
{AttributeID: AttributesMap["price"].ID, FloatValue: sizeVariant.Price.OriginalPrice.Value},
{AttributeID: AttributesMap["special_price"].ID, FloatValue: sizeVariant.Price.DiscountedPrice.Value},
2022-09-01 11:16:43 +00:00
}...)
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 {
2022-09-20 10:55:04 +00:00
attributes = append(attributes, gm.ProductAttributeValue{AttributeID: AttributesMap["price"].ID, FloatValue: sizeVariant.Price.DiscountedPrice.Value})
2022-09-01 11:16:43 +00:00
2022-09-20 10:55:04 +00:00
flatVariant.Price = sizeVariant.Price.DiscountedPrice.Value
2022-09-01 11:16:43 +00:00
flatVariant.MinPrice = sizeVariant.Price.DiscountedPrice.Value
2022-09-20 10:55:04 +00:00
flatVariant.MaxPrice = sizeVariant.Price.DiscountedPrice.Value
2022-09-01 11:16:43 +00:00
}
2022-09-06 10:19:37 +00:00
if mainProductFlat.MinPrice > flatVariant.MinPrice || mainProductFlat.MinPrice == 0 {
2022-09-01 11:16:43 +00:00
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,
2022-09-05 16:16:10 +00:00
}
for _, element := range product.Images {
sizeVariantProduct.Images = append(sizeVariantProduct.Images, gm.ProductImage{Type: "cdn", Path: element})
2022-09-01 11:16:43 +00:00
}
errSizeVar := db.Omit("Categories.*").Create(&sizeVariantProduct).Error
if errSizeVar != nil {
log.Println(errSizeVar)
2022-09-07 12:55:55 +00:00
return errSizeVar
2022-09-01 11:16:43 +00:00
}
flatVariant.ProductID = sizeVariantProduct.ID
2022-09-05 15:10:39 +00:00
errVariant := db.Create(&flatVariant).Error
2022-09-01 11:16:43 +00:00
if errVariant != nil {
log.Println(errVariant)
2022-09-07 12:55:55 +00:00
return errVariant
2022-09-01 11:16:43 +00:00
}
mainProductFlat.Variants = append(mainProductFlat.Variants, flatVariant)
2022-08-27 06:43:56 +00:00
}
2022-09-01 11:16:43 +00:00
}
errFlat := db.Omit("ParentID", "CreatedAt", "Variants").Save(&mainProductFlat)
if errFlat != nil {
log.Println(errFlat)
2022-08-27 06:43:56 +00:00
}
sProduct := createSellerProduct(&mainProductFlat, product.Vendor)
2022-09-05 15:10:39 +00:00
2022-08-27 06:43:56 +00:00
errSProduct := db.Create(&sProduct).Error
if errSProduct != nil {
log.Println(errSProduct)
}
2022-09-07 12:55:55 +00:00
return nil
2022-08-27 06:43:56 +00:00
}
func createSellerProduct(flat *gm.ProductFlat, sellerURL string) gm.MarketplaceProduct {
2022-09-15 12:32:15 +00:00
sellerID := sellers[sellerURL].ID
if sellerID == 0 {
sellerID = 1
}
2022-08-27 06:43:56 +00:00
sellerProduct := gm.MarketplaceProduct{
2022-09-15 12:32:15 +00:00
MarketplaceSellerID: sellerID,
IsApproved: true,
Condition: "new",
Description: "scraped",
IsOwner: true,
ProductID: flat.ProductID,
2022-08-27 06:43:56 +00:00
}
for _, variant := range flat.Variants {
sellerProduct.Variants = append(sellerProduct.Variants, gm.MarketplaceProduct{
ProductID: variant.ProductID,
IsOwner: true,
IsApproved: true,
MarketplaceSeller: sellers[sellerURL],
Condition: "new",
})
}
return sellerProduct
}
func collectAttributes(variant *models.Product, option *gm.AttributeOption) ([]gm.ProductAttributeValue, gm.ProductFlat) {
sku := fmt.Sprintf("%s-%s", variant.ProductGroupID, variant.ProductNumber)
weight, _ := strconv.ParseFloat(variant.Weight, 64)
2022-09-01 07:49:31 +00:00
var description string
2022-08-27 06:43:56 +00:00
2022-09-01 07:49:31 +00:00
for _, desc := range variant.Descriptions {
description += "<p>" + desc.Description + "</p>"
}
2022-08-27 06:43:56 +00:00
2022-09-20 10:55:04 +00:00
flat := gm.ProductFlat{
2022-08-27 06:43:56 +00:00
Status: true,
VisibleIndividually: true,
Name: variant.Name,
Sku: sku,
ProductNumber: variant.ProductNumber,
UrlKey: sku,
Weight: weight,
2022-09-20 10:55:04 +00:00
FavoritesCount: uint(variant.FavoriteCount),
Description: description,
MinPrice: 0,
MaxPrice: 0,
2022-08-27 06:43:56 +00:00
}
attributes := []gm.ProductAttributeValue{
2022-09-15 12:24:06 +00:00
{AttributeID: AttributesMap["favoritesCount"].ID, IntegerValue: variant.FavoriteCount},
{AttributeID: AttributesMap["source"].ID, TextValue: variant.URLKey},
{AttributeID: AttributesMap["sku"].ID, TextValue: sku},
{AttributeID: AttributesMap["product_number"].ID, TextValue: variant.ProductNumber},
{AttributeID: AttributesMap["name"].ID, TextValue: variant.Name, Channel: "default", Locale: "tm"},
{AttributeID: AttributesMap["weight"].ID, TextValue: variant.Weight},
{AttributeID: AttributesMap["status"].ID, BooleanValue: true},
{AttributeID: AttributesMap["visible_individually"].ID, BooleanValue: true},
{AttributeID: AttributesMap["url_key"].ID, TextValue: sku},
2022-08-27 06:43:56 +00:00
{AttributeID: option.AttributeID, IntegerValue: int(option.ID)},
2022-09-15 12:24:06 +00:00
{AttributeID: AttributesMap["description"].ID, TextValue: description, Channel: "default", Locale: "tm"},
2022-08-27 06:43:56 +00:00
}
if variant.Price.OriginalPrice.Value > variant.Price.DiscountedPrice.Value {
attributes = append(attributes, []gm.ProductAttributeValue{
2022-09-15 12:24:06 +00:00
{AttributeID: AttributesMap["price"].ID, FloatValue: variant.Price.OriginalPrice.Value},
{AttributeID: AttributesMap["special_price"].ID, FloatValue: variant.Price.DiscountedPrice.Value},
2022-08-27 06:43:56 +00:00
}...)
flat.Price = variant.Price.OriginalPrice.Value
flat.SpecialPrice = variant.Price.DiscountedPrice.Value
flat.MinPrice = variant.Price.DiscountedPrice.Value
flat.MaxPrice = variant.Price.OriginalPrice.Value
} else {
2022-09-20 10:55:04 +00:00
attributes = append(attributes, gm.ProductAttributeValue{AttributeID: AttributesMap["price"].ID, FloatValue: variant.Price.DiscountedPrice.Value})
flat.Price = variant.Price.DiscountedPrice.Value
2022-08-27 06:43:56 +00:00
flat.MinPrice = variant.Price.DiscountedPrice.Value
2022-09-20 10:55:04 +00:00
flat.MaxPrice = variant.Price.DiscountedPrice.Value
2022-08-27 06:43:56 +00:00
}
return attributes, flat
}
func prepearAttributesWithFlat(data *models.Product) ([]gm.ProductAttributeValue, gm.ProductFlat) {
2022-09-10 09:32:19 +00:00
weight, wEror := strconv.ParseFloat(data.Weight, 64)
if wEror != nil || weight == 0 {
weight = 0.5
}
2022-08-27 06:43:56 +00:00
var description string
for _, desc := range data.Descriptions {
description += "<p>" + desc.Description + "</p>"
}
//$desc = implode(array_map(fn($value): string => '<p>' . $value['description'] . '</p>', $data['descriptions']));
var productAttributeValues = []gm.ProductAttributeValue{
2022-09-15 12:24:06 +00:00
{AttributeID: AttributesMap["source"].ID, TextValue: data.URLKey},
{AttributeID: AttributesMap["favoritesCount"].ID, IntegerValue: data.FavoriteCount},
{AttributeID: AttributesMap["sku"].ID, TextValue: data.ProductGroupID},
{AttributeID: AttributesMap["product_number"].ID, TextValue: data.ProductNumber},
{AttributeID: AttributesMap["name"].ID, TextValue: data.Name, Channel: "default", Locale: "tm"},
{AttributeID: AttributesMap["weight"].ID, TextValue: data.Weight},
{AttributeID: AttributesMap["status"].ID, BooleanValue: true},
{AttributeID: AttributesMap["visible_individually"].ID, BooleanValue: true},
{AttributeID: AttributesMap["url_key"].ID, TextValue: data.ProductGroupID},
{AttributeID: AttributesMap["description"].ID, TextValue: description, Channel: "default", Locale: "tm"},
2022-08-27 06:43:56 +00:00
}
flat := gm.ProductFlat{
Status: true,
VisibleIndividually: true,
Name: data.Name,
Sku: data.ProductGroupID,
ProductNumber: data.ProductNumber,
Description: description,
UrlKey: data.ProductGroupID,
Weight: weight,
2022-09-01 07:49:31 +00:00
//Source: data.URLKey,
2022-08-27 06:43:56 +00:00
FavoritesCount: uint(data.FavoriteCount),
2022-09-20 10:55:04 +00:00
MaxPrice: 0,
MinPrice: 0,
Price: 0,
2022-08-27 06:43:56 +00:00
}
2022-09-20 10:55:04 +00:00
if len(data.ColorVariants) == 0 && len(data.SizeVariants) != 0 {
2022-09-06 10:19:37 +00:00
if data.Price.OriginalPrice.Value > data.Price.DiscountedPrice.Value {
productAttributeValues = append(productAttributeValues, []gm.ProductAttributeValue{
2022-09-15 12:24:06 +00:00
{AttributeID: AttributesMap["price"].ID, FloatValue: data.Price.OriginalPrice.Value},
{AttributeID: AttributesMap["special_price"].ID, FloatValue: data.Price.DiscountedPrice.Value},
2022-09-06 10:19:37 +00:00
}...)
flat.Price = data.Price.OriginalPrice.Value
flat.SpecialPrice = data.Price.DiscountedPrice.Value
flat.MinPrice = data.Price.DiscountedPrice.Value
flat.MaxPrice = data.Price.OriginalPrice.Value
} else {
2022-09-20 10:55:04 +00:00
productAttributeValues = append(productAttributeValues, gm.ProductAttributeValue{AttributeID: AttributesMap["price"].ID, FloatValue: data.Price.DiscountedPrice.Value})
flat.Price = data.Price.DiscountedPrice.Value
flat.MinPrice = data.Price.DiscountedPrice.Value
flat.MaxPrice = data.Price.DiscountedPrice.Value
2022-09-06 10:19:37 +00:00
}
2022-08-27 06:43:56 +00:00
}
return productAttributeValues, flat
}
2022-09-07 12:55:55 +00:00
2022-09-09 09:43:25 +00:00
func UpdateProduct(product models.Product, db *gorm.DB, productFlat gm.ProductFlat) error {
productFlat.Status = true
if len(product.ColorVariants) == 0 && len(product.SizeVariants) == 0 {
if product.Price.OriginalPrice.Value > product.Price.DiscountedPrice.Value {
//productAttributeValues = append(productAttributeValues, []gm.ProductAttributeValue{
2022-09-15 12:24:06 +00:00
// {AttributeID: AttributesMap["price"].ID, FloatValue: data.Price.OriginalPrice.Value},
// {AttributeID: AttributesMap["special_price"].ID, FloatValue: data.Price.DiscountedPrice.Value},
2022-09-09 09:43:25 +00:00
//}...)
if productFlat.Price != product.Price.OriginalPrice.Value {
productFlat.Price = product.Price.OriginalPrice.Value
productFlat.MaxPrice = product.Price.OriginalPrice.Value
//db.Model(&User{}).Where("active = ?", true).Update("name", "hello")
err := db.Model(gm.ProductAttributeValue{}).
Where("attribute_id = ? AND product_id = ?", 11, productFlat.ProductID).
Update("float_value", product.Price.OriginalPrice.Value).Error
if err != nil {
return err
}
}
if productFlat.SpecialPrice != product.Price.DiscountedPrice.Value {
productFlat.SpecialPrice = product.Price.DiscountedPrice.Value
productFlat.MinPrice = product.Price.DiscountedPrice.Value
err := db.Model(gm.ProductAttributeValue{}).
Where("attribute_id = ? AND product_id = ?", 13, productFlat.ProductID).
Update("float_value", product.Price.OriginalPrice.Value).Error
if err != nil {
return err
}
}
} else {
if productFlat.Price != product.Price.OriginalPrice.Value {
productFlat.Price = product.Price.OriginalPrice.Value
productFlat.MaxPrice = product.Price.OriginalPrice.Value
productFlat.MinPrice = product.Price.OriginalPrice.Value
err := db.Model(gm.ProductAttributeValue{}).
Where("attribute_id = ? AND product_id = ?", 11, productFlat.ProductID).
Update("float_value", product.Price.OriginalPrice.Value).Error
if err != nil {
return err
}
}
}
} else {
2022-09-20 10:55:04 +00:00
//todo update configurable product
2022-09-09 09:43:25 +00:00
}
2022-09-09 09:49:56 +00:00
errFlat := db.Omit("Product", "ParentID", "CreatedAt").Save(&productFlat).Error
2022-09-09 09:43:25 +00:00
return errFlat
}
2022-09-07 12:55:55 +00:00
//func productAttributesAndFlat(data *models.Product) ([]gm.ProductAttributeValue,gm.ProductFlat){
//
// var description string
//
// for _, desc := range data.Descriptions {
// description += "<p>" + desc.Description + "</p>"
// }
//
// weight, _ := strconv.ParseFloat(data.Weight, 64)
//
// flat := gm.ProductFlat{
// Status: true,
// VisibleIndividually: true,
// Name: data.Name,
// Sku: data.ProductGroupID,
// ProductNumber: data.ProductNumber,
// Description: description,
// UrlKey: data.ProductGroupID,
// Weight: weight,
// FavoritesCount: uint(data.FavoriteCount),
// }
// return []gm.ProductAttributeValue{
2022-09-15 12:24:06 +00:00
// {AttributeID: AttributesMap["favoritesCount"].ID, IntegerValue: data.FavoriteCount},
// {AttributeID: AttributesMap["source"].ID, TextValue: data.URLKey},
// {AttributeID: AttributesMap["product_number"].ID, TextValue: data.ProductNumber},
// {AttributeID: AttributesMap["name"].ID, TextValue: data.Name, Channel: "default", Locale: "tm"},
// {AttributeID: AttributesMap["weight"].ID, TextValue: data.Weight},
// {AttributeID: AttributesMap["status"].ID, BooleanValue: true},
// {AttributeID: AttributesMap["visible_individually"].ID, BooleanValue: true},
// {AttributeID: AttributesMap["description"].ID, TextValue: description, Channel: "default", Locale: "tm"},
2022-09-07 12:55:55 +00:00
// },flat
//}