From b40eba85d859bee84fec2f1d603ba91ebc406672 Mon Sep 17 00:00:00 2001 From: merdan Date: Thu, 25 Aug 2022 10:39:59 +0500 Subject: [PATCH] finish --- gorm_models/brand.go | 2 +- gorm_models/product.go | 82 ++++--- gorm_models/vendor.go | 17 ++ test/testit.go | 509 ++++++++++++++++++++++++++--------------- 4 files changed, 387 insertions(+), 223 deletions(-) diff --git a/gorm_models/brand.go b/gorm_models/brand.go index ef2cb92..c59e7b7 100644 --- a/gorm_models/brand.go +++ b/gorm_models/brand.go @@ -12,7 +12,7 @@ type Brand struct { ID uint `gorm:"primary_key"` CreatedAt time.Time UpdatedAt time.Time - Name string + Name string `gorm:"default:TESTBRAND"` Code string Status bool Categories []Category `gorm:"many2many:category_brands;"` diff --git a/gorm_models/product.go b/gorm_models/product.go index ab346ec..1be3430 100644 --- a/gorm_models/product.go +++ b/gorm_models/product.go @@ -19,42 +19,39 @@ type Product struct { SuperAttributes []Attribute `gorm:"many2many:product_super_attributes;"` } -// $main_attributes = [ -// -// 'sku' => $parentProduct->sku, -// 'product_number' => $data['product_number'], -// 'name' => $data['name'], -// 'weight' => $data['weight'] ?? 0.45, -// 'source' => $data['url_key'], -// 'status' => 1, -// 'visible_individually' => 1, -// 'url_key' => $parentProduct->sku, -// 'short_description' => $desc, -// 'description' => $desc, -// 'favoritesCount' => $data['favorite_count'] -// -// ]; type ProductFlat struct { ID uint `gorm:"primary_key"` Sku string - ProductNumber string - Name string - Weight float64 `gorm:"type:decimal(12,4)"` - Status bool - Source string - VisibleIndividually bool - UrlKey string - ShortDescription string - Description string - FavoritesCount uint - CreatedAt time.Time - UpdatedAt time.Time + ProductNumber string `sql:"DEFAULT:NULL" gorm:"default:null"` + Name string `sql:"DEFAULT:''" gorm:"default:''"` + Weight float64 `sql:"DEFAULT:NULL" gorm:"type:decimal(12,4);default:null"` + Status bool `sql:"DEFAULT:NULL" gorm:"default:null"` + Source string `sql:"DEFAULT:NULL" gorm:"default:null"` + VisibleIndividually bool `sql:"DEFAULT:NULL" gorm:"default:null"` + Price float64 `gorm:"type:decimal(12,4)"` + MinPrice float64 `gorm:"type:decimal(12,4)"` + MaxPrice float64 `gorm:"type:decimal(12,4)"` + SpecialPrice float64 `gorm:"type:decimal(12,4)"` + UrlKey string `sql:"DEFAULT:NULL" gorm:"default:null"` + ShortDescription string `sql:"DEFAULT:NULL" gorm:"default:null"` + Description string `sql:"DEFAULT:NULL" gorm:"default:null"` + FavoritesCount uint `sql:"DEFAULT:NULL" gorm:"default:null"` + CreatedAt time.Time `sql:"DEFAULT:NULL" gorm:"default:null"` + UpdatedAt time.Time `sql:"DEFAULT:NULL" gorm:"default:null"` ProductID uint Product Product - Channel string `sql:"DEFAULT:default"` - Locale string `sql:"DEFAULT:tm"` - ParentID uint `sql:"DEFAULT:NULL"` - BrandID uint + Channel string `sql:"DEFAULT:default" gorm:"default:default"` + Locale string `sql:"DEFAULT:tm" gorm:"default:tm"` + ParentID *uint `sql:"DEFAULT:NULL" gorm:"default:null"` + Variants []ProductFlat `gorm:"foreignKey:ParentID"` + Color int `sql:"DEFAULT:NULL" gorm:"default:null"` + ColorLabel string `sql:"DEFAULT:NULL" gorm:"default:null"` + Size int `sql:"DEFAULT:NULL" gorm:"default:null"` + SizeLabel string `sql:"DEFAULT:NULL" gorm:"default:null"` + MetaTitle string `sql:"DEFAULT:NULL" gorm:"default:null"` + MetaKeywords string `sql:"DEFAULT:NULL" gorm:"default:null"` + BrandID uint `sql:"DEFAULT:NULL" gorm:"default:null"` + Brand Brand } type ProductImage struct { @@ -65,18 +62,27 @@ type ProductImage struct { } type ProductAttributeValue struct { - ID uint `gorm:"primary_key"` - Locale string - Channel string + ID uint `gorm:"primary_key"` + Locale string `sql:"DEFAULT:NULL" gorm:"default:null"` + Channel string `sql:"DEFAULT:NULL" gorm:"default:null"` ProductID uint AttributeID uint - TextValue string - BooleanValue bool - IntegerValue int - FloatValue float64 `gorm:"type:decimal(12,4)"` + TextValue string `sql:"DEFAULT:NULL" gorm:"default:null"` + BooleanValue bool `sql:"DEFAULT:NULL" gorm:"default:null"` + IntegerValue int `sql:"DEFAULT:NULL" gorm:"default:null"` + FloatValue float64 `sql:"DEFAULT:NULL" gorm:"type:decimal(12,4);default:null"` } type ProductSuperAttribute struct { ProductID uint AttributeID uint } + +type Tabler interface { + TableName() string +} + +// TableName overrides the table name used by User to `profiles` +func (ProductFlat) TableName() string { + return "product_flat" +} diff --git a/gorm_models/vendor.go b/gorm_models/vendor.go index be3aebe..9be2129 100644 --- a/gorm_models/vendor.go +++ b/gorm_models/vendor.go @@ -2,10 +2,27 @@ package gorm_models import ( "log" + "time" "gorm.io/gorm" ) +type MarketplaceProduct struct { + ID uint `gorm:"primaryKey"` + CreatedAt time.Time `sql:"DEFAULT:NULL" gorm:"default:null"` + UpdatedAt time.Time `sql:"DEFAULT:NULL" gorm:"default:null"` + ProductID uint + ParentID *uint `sql:"DEFAULT:NULL" gorm:"default:null"` + Condition string `sql:"DEFAULT:NULL" gorm:"default:null"` + Price float64 + Description string `sql:"DEFAULT:NULL" gorm:"default:null"` + IsApproved bool `sql:"DEFAULT:NULL" gorm:"default:null"` + IsOwner bool + MarketplaceSellerID uint + MarketplaceSeller MarketplaceSeller + Variants []MarketplaceProduct `gorm:"foreignKey:ParentID"` +} + type MarketplaceSeller struct { ID uint `gorm:"primaryKey"` Url string diff --git a/test/testit.go b/test/testit.go index ee712af..6672af1 100644 --- a/test/testit.go +++ b/test/testit.go @@ -19,7 +19,7 @@ var mainCategories []gm.Category var baza *gorm.DB var mainImportWG, famAndSellerWG sync.WaitGroup var families []gm.AttributeFamily -var sellers []gm.MarketplaceSeller +var sellers = make(map[string]gm.MarketplaceSeller) var attributesMap = make(map[string]gm.Attribute) func StartTest() error { @@ -42,7 +42,9 @@ func StartTest() error { //get sellers families from mysql with gorutine go func() { defer famAndSellerWG.Done() - sellers = gm.GetSellers(baza) + for _, vendor := range gm.GetSellers(baza) { + sellers[vendor.Url] = vendor + } }() go func() { @@ -140,57 +142,92 @@ func getTotalDocumentCount(db string) int { // 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 +} + func importProduct(product models.Product, db *gorm.DB) { famAndSellerWG.Wait() //wait until attribute families and sellers are not get from mysql - var categories []gm.Category - var brand gm.Brand - - errCat := db.Find(&categories, product.Categories).Error + categories, keywords, errCat := getCats(db, product.Categories) if errCat != nil { log.Println(errCat) return } + var brand gm.Brand + if product.Brand != "" { brand = gm.FindOrCreateBrand(db, product.Brand, categories) } + attributes, mainProductFlat := prepearAttributesWithFlat(&product) + + attributes = append(attributes, gm.ProductAttributeValue{AttributeID: attributesMap["meta_keywords"].ID, TextValue: keywords, Channel: "default", Locale: "tm"}) + iproduct := gm.Product{ Sku: product.ProductGroupID, Type: "simple", AttributeFamilyID: families[0].ID, Brand: brand, Categories: categories, - AttributeValues: assignAttributes(&product), + AttributeValues: attributes, } for _, element := range product.Images { iproduct.Images = append(iproduct.Images, gm.ProductImage{Type: "cdn", Path: element}) } - if product.ColorVariantCount > 0 || len(product.SizeVariants) > 0 { + if product.ColorVariantCount > 0 { + iproduct.SuperAttributes = append(iproduct.SuperAttributes, attributesMap["color"]) + } + + if len(product.SizeVariants) > 0 { + iproduct.SuperAttributes = append(iproduct.SuperAttributes, attributesMap["size"]) + } + + if len(iproduct.SuperAttributes) > 0 { iproduct.Type = "configurable" iproduct.AttributeFamilyID = families[1].ID } + //todo insert attribute values manytomany + mainProductFlat.Product = iproduct + mainProductFlat.Brand = brand + mainProductFlat.MetaKeywords = keywords - err := db.Omit("Categories").Select("Sku", "Type", "AttributeFamilyID", "CreatedAt", "UpdatedAt").Create(&iproduct).Error + errProduct := db.Omit("Product.ParentID", "Product.SuperAttributes.*", "Product.Categories.*").Create(&mainProductFlat).Error - if err != nil { - log.Println(err) + if errProduct != nil { + log.Println(errProduct) return } if iproduct.Type == "configurable" { - var productVariants []gm.Product - var superAttributes []gm.Attribute + var productFlatVariants []gm.ProductFlat if len(product.ColorVariants) > 0 { - //attach super attributes color - superAttributes = append(superAttributes, attributesMap["color"]) var description string for _, colorVariant := range product.ColorVariants { @@ -203,25 +240,25 @@ func importProduct(product models.Product, db *gorm.DB) { colorOption := gm.GetAttributeOption(db, attributesMap["color"].ID, colorVariant.Color) if len(colorVariant.SizeVariants) > 0 { - if len(superAttributes) < 2 { - superAttributes = append(superAttributes, attributesMap["size"]) - } for _, sizeVariant := range colorVariant.SizeVariants { if sizeVariant.Sellable { sku := fmt.Sprintf("%s-%s-%d-col-size", colorVariant.ProductGroupID, 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, Channel: "default", Locale: "tm"}, + // {AttributeID: attributesMap["favoritesCount"].ID, IntegerValue: colorVariant.FavoriteCount, Channel: "default", Locale: "tm"}, + // {AttributeID: attributesMap["meta_keywords"].ID, TextValue: description, Channel: "default", Locale: "tm"}, {AttributeID: attributesMap["sku"].ID, TextValue: sku, Channel: "default", Locale: "tm"}, - {AttributeID: attributesMap["product_number"].ID, TextValue: fmt.Sprintf("%s-%d", colorVariant.ProductNumber, sizeVariant.ItemNumber), Channel: "default", Locale: "tm"}, + {AttributeID: attributesMap["product_number"].ID, TextValue: productNumber, Channel: "default", Locale: "tm"}, {AttributeID: attributesMap["name"].ID, TextValue: colorVariant.Name, Channel: "default", Locale: "tm"}, {AttributeID: attributesMap["weight"].ID, FloatValue: weight, Channel: "default", Locale: "tm"}, - {AttributeID: attributesMap["source"].ID, TextValue: colorVariant.URLKey, Channel: "default", Locale: "tm"}, {AttributeID: attributesMap["status"].ID, BooleanValue: true, Channel: "default", Locale: "tm"}, {AttributeID: attributesMap["visible_individually"].ID, BooleanValue: true, Channel: "default", Locale: "tm"}, {AttributeID: attributesMap["url_key"].ID, TextValue: sku, Channel: "default", Locale: "tm"}, - // {AttributeID: attributesMap["favoritesCount"].ID, IntegerValue: colorVariant.FavoriteCount, Channel: "default", Locale: "tm"}, + {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, @@ -236,48 +273,108 @@ func importProduct(product models.Product, db *gorm.DB) { }, } - if sizeVariant.Price.OriginalPrice.Value > sizeVariant.Price.DiscountedPrice.Value { - attributes = append(attributes, []gm.ProductAttributeValue{ - {AttributeID: attributesMap["price"].ID, FloatValue: sizeVariant.Price.OriginalPrice.Value, Channel: "default", Locale: "tm"}, - {AttributeID: attributesMap["special_price"].ID, FloatValue: sizeVariant.Price.DiscountedPrice.Value, Channel: "default", Locale: "tm"}, - }...) - - } else { - attributes = append(attributes, gm.ProductAttributeValue{AttributeID: attributesMap["price"].ID, FloatValue: sizeVariant.Price.OriginalPrice.Value, Channel: "default", Locale: "tm"}) - } - productVariant := gm.Product{ - ParentID: iproduct.ID, + ParentID: mainProductFlat.ProductID, Type: "simple", - AttributeFamily: iproduct.AttributeFamily, - Sku: sku, - Brand: iproduct.Brand, - AttributeValues: attributes, 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 + } + //todo assign images - productVariants = append(productVariants, productVariant) + flatVariant := gm.ProductFlat{ + ProductID: productVariant.ID, + BrandID: mainProductFlat.BrandID, + Status: true, + VisibleIndividually: true, + 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, Channel: "default", Locale: "tm"}, + {AttributeID: attributesMap["special_price"].ID, FloatValue: sizeVariant.Price.DiscountedPrice.Value, Channel: "default", Locale: "tm"}, + }...) + + 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, Channel: "default", Locale: "tm"}) + + 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 + } + + errVariant := db.Create(&flatVariant).Error + + if errVariant != nil { + log.Println(errVariant) + return + } + + productFlatVariants = append(productFlatVariants, flatVariant) } } } else if colorVariant.IsSellable { colorOption := gm.GetAttributeOption(db, attributesMap["color"].ID, colorVariant.Color) - attributes := collectAttributes(&colorVariant, &colorOption) + attributes, variantFlat := collectAttributes(&colorVariant, &colorOption) + attributes = append(attributes, gm.ProductAttributeValue{AttributeID: attributesMap["meta_keywords"].ID, TextValue: keywords, Channel: "default", Locale: "tm"}) - sku := fmt.Sprintf("%s-%s-col-%s", iproduct.Sku, colorVariant.ProductNumber, colorVariant.Color) + if mainProductFlat.MinPrice > variantFlat.MinPrice { + mainProductFlat.MinPrice = variantFlat.MinPrice + } + + if mainProductFlat.MaxPrice < variantFlat.MaxPrice { + mainProductFlat.MaxPrice = variantFlat.MaxPrice + } + + sku := fmt.Sprintf("%s-%s-%s", iproduct.Sku, colorVariant.ProductNumber, colorVariant.ProductCode) productVariant := gm.Product{ - ParentID: iproduct.ID, + ParentID: mainProductFlat.ProductID, Type: "simple", - AttributeFamily: iproduct.AttributeFamily, Sku: sku, - Brand: iproduct.Brand, + BrandID: mainProductFlat.BrandID, AttributeValues: attributes, AttributeFamilyID: iproduct.AttributeFamilyID, Categories: categories, @@ -287,16 +384,33 @@ func importProduct(product models.Product, db *gorm.DB) { productVariant.Images = append(productVariant.Images, gm.ProductImage{Type: "cdn", Path: element}) } - productVariants = append(productVariants, productVariant) + errProdVariant := db.Omit("Categories.*").Create(&productVariant).Error + + if errProdVariant != nil { + log.Println(errProdVariant) + return + } + + variantFlat.ProductID = productVariant.ID + variantFlat.Color = int(colorOption.ID) + variantFlat.ColorLabel = colorOption.AdminName + variantFlat.MetaKeywords = keywords + variantFlat.ParentID = &mainProductFlat.ID + + errVariant := db.Create(&variantFlat).Error + + if errVariant != nil { + log.Println(errVariant) + return + } + + productFlatVariants = append(productFlatVariants, variantFlat) + } } } if len(product.SizeVariants) > 0 { - //attach super attributes size - if len(superAttributes) < 2 { - superAttributes = append(superAttributes, attributesMap["size"]) - } var description string for _, desc := range product.Descriptions { @@ -311,126 +425,129 @@ func importProduct(product models.Product, db *gorm.DB) { sizeOption := gm.GetAttributeOption(db, attributesMap["size"].ID, sizeVariant.AttributeValue) attributes := []gm.ProductAttributeValue{ - {AttributeID: attributesMap["sku"].ID, TextValue: sku, Channel: "default", Locale: "tm"}, - {AttributeID: attributesMap["product_number"].ID, TextValue: string(sizeVariant.ItemNumber), Channel: "default", Locale: "tm"}, + // {AttributeID: attributesMap["source"].ID, TextValue: product.URLKey}, + // {AttributeID: attributesMap["favoritesCount"].ID, IntegerValue: product.FavoriteCount}, + // {AttributeID: attributesMap["meta_keywords"].ID, TextValue: description, Channel: "default", Locale: "tm"}, + {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, FloatValue: weight, Channel: "default", Locale: "tm"}, - {AttributeID: attributesMap["source"].ID, TextValue: product.URLKey, Channel: "default", Locale: "tm"}, - {AttributeID: attributesMap["status"].ID, BooleanValue: true, Channel: "default", Locale: "tm"}, - {AttributeID: attributesMap["visible_individually"].ID, BooleanValue: true, Channel: "default", Locale: "tm"}, - {AttributeID: attributesMap["url_key"].ID, TextValue: sku, Channel: "default", Locale: "tm"}, - // {AttributeID: attributesMap["favoritesCount"].ID, IntegerValue: product.FavoriteCount, Channel: "default", Locale: "tm"}, + {AttributeID: attributesMap["weight"].ID, FloatValue: 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: description, Channel: "default", Locale: "tm"}, - { - AttributeID: attributesMap["size"].ID, - IntegerValue: int(sizeOption.ID), - Channel: "default", - Locale: "tm", + } + + flatVariant := gm.ProductFlat{ + + Status: true, + VisibleIndividually: true, + Name: product.Name, + Sku: sku, + ProductNumber: fmt.Sprint(sizeVariant.ItemNumber), + UrlKey: sku, + Weight: weight, + Size: int(sizeOption.ID), + SizeLabel: sizeOption.AdminName, + MetaKeywords: keywords, + Product: gm.Product{ + ParentID: mainProductFlat.ProductID, + Type: "simple", + Sku: sku, + BrandID: mainProductFlat.BrandID, + AttributeValues: attributes, + AttributeFamilyID: iproduct.AttributeFamilyID, + Categories: categories, }, + // 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, Channel: "default", Locale: "tm"}, - {AttributeID: attributesMap["special_price"].ID, FloatValue: sizeVariant.Price.DiscountedPrice.Value, Channel: "default", Locale: "tm"}, + {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, Channel: "default", Locale: "tm"}) + 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 } - productVariant := gm.Product{ - ParentID: iproduct.ID, - Type: "simple", - AttributeFamily: iproduct.AttributeFamily, - Sku: sku, - Brand: iproduct.Brand, - AttributeValues: attributes, - AttributeFamilyID: iproduct.AttributeFamilyID, - Categories: categories, + if mainProductFlat.MinPrice > flatVariant.MinPrice { + mainProductFlat.MinPrice = flatVariant.MinPrice } - // for _, element := range colorVariant.Images { - // productVariant.Images = append(iproduct.Images, gm.ProductImage{Type: "cdn", Path: element}) - // } + if mainProductFlat.MaxPrice < flatVariant.MaxPrice { + mainProductFlat.MaxPrice = flatVariant.MaxPrice + } + errVariant := db.Omit("Product.Categories.*").Create(&flatVariant).Error - productVariants = append(productVariants, productVariant) + if errVariant != nil { + log.Println(errVariant) + return + } + productFlatVariants = append(productFlatVariants, flatVariant) } } + } - saErr := db.Model(&iproduct).Association("SuperAttributes").Append(superAttributes) + errFlat := db.Omit("Product.ParentID", "Product.SuperAttributes.*", "Product.Categories.*", "Source", "FavoritesCount", "CreatedAt").Save(&mainProductFlat) + + if errFlat != nil { + log.Println(errFlat) - if saErr != nil { - log.Println(saErr) } - - errVariants := db.Omit("Categories").Create(&productVariants).Error - - if errVariants != nil { - log.Println(errVariants) - } - + mainProductFlat.Variants = productFlatVariants } + sProduct := createSellerProduct(&mainProductFlat, product.Vendor) //todo seller product, meta keys - // if($data['vendor'] && $seller = $this->vendorRepository->findOneByField('url',$data['vendor'])){ - // $this->createSellerProduct($parentProduct, $seller->id); - // } + errSProduct := db.Create(&sProduct).Error - if product.Vendor != "" { - for i := range sellers { - if sellers[i].Url == product.Vendor { - createSellerProduct() - break - } - } + if errSProduct != nil { + log.Println(errSProduct) + } +} + +func createSellerProduct(flat *gm.ProductFlat, sellerURL string) gm.MarketplaceProduct { + sellerProduct := gm.MarketplaceProduct{ + MarketplaceSeller: sellers[sellerURL], + IsApproved: true, + Condition: "new", + Description: "scraped", + IsOwner: true, + ProductID: flat.ProductID, } -} - -func createFlat(product gm.Product) gm.ProductFlat { - flat := gm.ProductFlat{ - ProductID: product.ID, - BrandID: product.BrandID, - Status: true, - VisibleIndividually: true, + 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 flat + return sellerProduct + } -func createSellerProduct() { - /* - Event::dispatch('marketplace.catalog.product.create.before'); - - $sellerProduct = $this->vendorProductRepository->create([ - 'marketplace_seller_id' => $seller_id, - 'is_approved' => 1, - 'condition' => 'new', - 'description' => 'scraped product', - 'is_owner' => 1, - 'product_id' => $product->id, - ]); - - foreach ($sellerProduct->product->variants as $baseVariant) { - $this->vendorProductRepository->create([ - 'parent_id' => $sellerProduct->id, - 'product_id' => $baseVariant->id, - 'is_owner' => 1, - 'marketplace_seller_id' => $seller_id, - 'is_approved' => 1, - 'condition' => 'new', - ]); - } - - Event::dispatch('marketplace.catalog.product.create.after', $sellerProduct); - - return $sellerProduct; - */ -} -func collectAttributes(variant *models.Product, option *gm.AttributeOption) []gm.ProductAttributeValue { +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) // var description string @@ -438,35 +555,56 @@ func collectAttributes(variant *models.Product, option *gm.AttributeOption) []gm // for _, desc := range variant.Descriptions { // description += "

" + desc.Description + "

" // } + flat := gm.ProductFlat{ + + Status: true, + VisibleIndividually: true, + Name: variant.Name, + Sku: sku, + ProductNumber: variant.ProductNumber, + UrlKey: sku, + Weight: weight, + // Source: variant.URLKey, + // FavoritesCount: uint(variant.FavoriteCount), + } attributes := []gm.ProductAttributeValue{ - {AttributeID: attributesMap["sku"].ID, TextValue: sku, Channel: "default", Locale: "tm"}, - {AttributeID: attributesMap["product_number"].ID, TextValue: variant.ProductNumber, Channel: "default", Locale: "tm"}, + // {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, FloatValue: weight, Channel: "default", Locale: "tm"}, - {AttributeID: attributesMap["source"].ID, TextValue: variant.URLKey, Channel: "default", Locale: "tm"}, - {AttributeID: attributesMap["status"].ID, BooleanValue: true, Channel: "default", Locale: "tm"}, - {AttributeID: attributesMap["visible_individually"].ID, BooleanValue: true, Channel: "default", Locale: "tm"}, - {AttributeID: attributesMap["url_key"].ID, TextValue: sku, Channel: "default", Locale: "tm"}, - {AttributeID: attributesMap["favoritesCount"].ID, IntegerValue: variant.FavoriteCount, Channel: "default", Locale: "tm"}, + {AttributeID: attributesMap["weight"].ID, FloatValue: weight}, + {AttributeID: attributesMap["status"].ID, BooleanValue: true}, + {AttributeID: attributesMap["visible_individually"].ID, BooleanValue: true}, + {AttributeID: attributesMap["url_key"].ID, TextValue: sku}, // {AttributeID: attributesMap["description"].ID, TextValue: description, Channel: "default", Locale: "tm"}, - {AttributeID: option.AttributeID, IntegerValue: int(option.ID), Channel: "default", Locale: "tm"}, + // {AttributeID: attributesMap["meta_keywords"].ID, TextValue: description, Channel: "default", Locale: "tm"}, + {AttributeID: option.AttributeID, IntegerValue: int(option.ID)}, } if variant.Price.OriginalPrice.Value > variant.Price.DiscountedPrice.Value { attributes = append(attributes, []gm.ProductAttributeValue{ - {AttributeID: attributesMap["price"].ID, FloatValue: variant.Price.OriginalPrice.Value, Channel: "default", Locale: "tm"}, - {AttributeID: attributesMap["special_price"].ID, FloatValue: variant.Price.DiscountedPrice.Value, Channel: "default", Locale: "tm"}, + {AttributeID: attributesMap["price"].ID, FloatValue: variant.Price.OriginalPrice.Value}, + {AttributeID: attributesMap["special_price"].ID, FloatValue: variant.Price.DiscountedPrice.Value}, }...) + 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 { - attributes = append(attributes, gm.ProductAttributeValue{AttributeID: attributesMap["price"].ID, FloatValue: variant.Price.OriginalPrice.Value, Channel: "default", Locale: "tm"}) + attributes = append(attributes, gm.ProductAttributeValue{AttributeID: attributesMap["price"].ID, FloatValue: variant.Price.OriginalPrice.Value}) + flat.Price = variant.Price.OriginalPrice.Value + flat.MinPrice = variant.Price.DiscountedPrice.Value + flat.MaxPrice = variant.Price.OriginalPrice.Value } - return attributes + return attributes, flat } -func assignAttributes(data *models.Product) []gm.ProductAttributeValue { +func prepearAttributesWithFlat(data *models.Product) ([]gm.ProductAttributeValue, gm.ProductFlat) { weight, _ := strconv.ParseFloat(data.Weight, 64) @@ -478,51 +616,54 @@ func assignAttributes(data *models.Product) []gm.ProductAttributeValue { //$desc = implode(array_map(fn($value): string => '

' . $value['description'] . '

', $data['descriptions'])); var productAttributeValues = []gm.ProductAttributeValue{ - {AttributeID: attributesMap["sku"].ID, TextValue: data.ProductGroupID, Channel: "default", Locale: "tm"}, - {AttributeID: attributesMap["product_number"].ID, TextValue: data.ProductNumber, Channel: "default", Locale: "tm"}, + // {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, FloatValue: weight, Channel: "default", Locale: "tm"}, - {AttributeID: attributesMap["source"].ID, TextValue: data.URLKey, Channel: "default", Locale: "tm"}, - {AttributeID: attributesMap["status"].ID, BooleanValue: true, Channel: "default", Locale: "tm"}, - {AttributeID: attributesMap["visible_individually"].ID, BooleanValue: true, Channel: "default", Locale: "tm"}, - {AttributeID: attributesMap["url_key"].ID, TextValue: data.ProductGroupID, Channel: "default", Locale: "tm"}, + {AttributeID: attributesMap["weight"].ID, FloatValue: 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"}, - {AttributeID: attributesMap["favoritesCount"].ID, IntegerValue: data.FavoriteCount, Channel: "default", Locale: "tm"}, + // {AttributeID: attributesMap["meta_keywords"].ID, TextValue: data.Name, Channel: "default", Locale: "tm"}, } - if data.ColorVariantCount == 0 && len(data.SizeVariants) == 0 { - if data.Price.OriginalPrice.Value > data.Price.DiscountedPrice.Value { - productAttributeValues = append(productAttributeValues, []gm.ProductAttributeValue{ - {AttributeID: attributesMap["price"].ID, FloatValue: data.Price.OriginalPrice.Value, Channel: "default", Locale: "tm"}, - {AttributeID: attributesMap["special_price"].ID, FloatValue: data.Price.DiscountedPrice.Value, Channel: "default", Locale: "tm"}, - }...) + flat := gm.ProductFlat{ - } else { - productAttributeValues = append(productAttributeValues, gm.ProductAttributeValue{AttributeID: attributesMap["price"].ID, FloatValue: data.Price.OriginalPrice.Value, Channel: "default", Locale: "tm"}) - - } + Status: true, + VisibleIndividually: true, + Name: data.Name, + Sku: data.ProductGroupID, + ProductNumber: data.ProductNumber, + Description: description, + UrlKey: data.ProductGroupID, + Weight: weight, + // Source: data.URLKey, + // FavoritesCount: uint(data.FavoriteCount), } + if data.Price.OriginalPrice.Value > data.Price.DiscountedPrice.Value { + productAttributeValues = append(productAttributeValues, []gm.ProductAttributeValue{ + {AttributeID: attributesMap["price"].ID, FloatValue: data.Price.OriginalPrice.Value}, + {AttributeID: attributesMap["special_price"].ID, FloatValue: data.Price.DiscountedPrice.Value}, + }...) - return productAttributeValues -} - -func getPriceAttributes(productID uint, price *models.Price) []gm.ProductAttributeValue { - var productAttributeValues []gm.ProductAttributeValue - if price.OriginalPrice.Value > price.DiscountedPrice.Value { - productAttributeValues = []gm.ProductAttributeValue{ - {ProductID: productID, AttributeID: attributesMap["price"].ID, FloatValue: price.OriginalPrice.Value, Channel: "default", Locale: "tm"}, - {ProductID: productID, AttributeID: attributesMap["special_price"].ID, FloatValue: price.DiscountedPrice.Value, Channel: "default", Locale: "tm"}, - } + 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 { - productAttributeValues = []gm.ProductAttributeValue{{ProductID: productID, AttributeID: attributesMap["price"].ID, FloatValue: price.OriginalPrice.Value, Channel: "default", Locale: "tm"}} - + productAttributeValues = append(productAttributeValues, gm.ProductAttributeValue{AttributeID: attributesMap["price"].ID, FloatValue: data.Price.OriginalPrice.Value}) + flat.Price = data.Price.OriginalPrice.Value + flat.MinPrice = data.Price.OriginalPrice.Value + flat.MaxPrice = data.Price.OriginalPrice.Value } - return productAttributeValues -} + if data.ColorVariantCount != 0 || len(data.SizeVariants) != 0 { + flat.Price = 0 + flat.SpecialPrice = 0 + } -func getAttributeFamily() gm.AttributeFamily { - - return families[0] + return productAttributeValues, flat }