before test update and import

This commit is contained in:
merdan 2023-06-04 17:56:39 +05:00
parent 5600ae746f
commit cbbf952748
4 changed files with 122 additions and 198 deletions

View File

@ -139,6 +139,7 @@ func GetWishlistProducts(db *gorm.DB) ([]Product, error) {
func GetFlatSources(db *gorm.DB) ([]ProductAttributeValue, error) { func GetFlatSources(db *gorm.DB) ([]ProductAttributeValue, error) {
var productSources []ProductAttributeValue var productSources []ProductAttributeValue
//todo add filter by updated_at query
err := db.Joins("JOIN wishlist wp ON product_attribute_values.product_id = wp.product_id"). err := db.Joins("JOIN wishlist wp ON product_attribute_values.product_id = wp.product_id").
Joins("JOIN marketplace_products mp ON product_attribute_values.product_id = mp.product_id"). Joins("JOIN marketplace_products mp ON product_attribute_values.product_id = mp.product_id").
Find(&productSources, "mp.marketplace_seller_id=1 AND product_attribute_values.text_value IS NOT NULL AND product_attribute_values.attribute_id=31").Error Find(&productSources, "mp.marketplace_seller_id=1 AND product_attribute_values.text_value IS NOT NULL AND product_attribute_values.attribute_id=31").Error

View File

@ -82,7 +82,7 @@ func worker(db *gorm.DB, stopCh <-chan struct{}, updatePeriod time.Duration) {
return return
case <-ticker.C: case <-ticker.C:
result, err := bagisto_models.GetFlatSources(importer.Baza) result, err := bagisto_models.GetFlatSources(db)
if err != nil { if err != nil {
log.Println("Error retrieving products:", err) log.Println("Error retrieving products:", err)
continue continue
@ -111,8 +111,9 @@ func worker(db *gorm.DB, stopCh <-chan struct{}, updatePeriod time.Duration) {
} }
// Update the product in the database // Update the product in the database
if err := importer.UpdateOrCreate(jsonProduct, product.ProductID).Error; err != nil { if importer.UpdateOrCreate(jsonProduct, product.ProductID).Error != nil {
log.Println("Error updateing product information:", err) log.Println("Error updateing product information:", err)
importer.Error = nil
} }
} }

View File

@ -111,51 +111,74 @@ func ParseImporterInstance(db *gorm.DB) (instance *Importer, err error) {
return instance, nil return instance, nil
} }
func (importer *Importer) ImportProduct(product models.Product) (instance *Importer) { func (importer *Importer) UpdateOrCreate(product models.Product, product_id uint) (instance *Importer) {
var linkedProducts []gm.Product
var firstProduct *gm.Product var firstProduct *gm.Product
if firstProduct, importer.Error = importer.importVariant(product); importer.Error != nil { var newProducts []gm.Product
return importer //haryt satuwdan ayrlan bolsa bagistoda disable et
} else if product.ColorVariants != nil && len(*product.ColorVariants) > 0 { if !product.IsSellable {
linkedProducts = append(linkedProducts, *firstProduct) if firstProduct = importer.disableVariant(product, product_id); firstProduct == nil {
for _, colorVariant := range *product.ColorVariants { //disable edende error doran bolsa dowam etme
return importer
if !colorVariant.IsSellable {
continue
}
if variant, err := importer.importVariant(colorVariant); err == nil {
linkedProducts = append(linkedProducts, *variant)
}
} }
} else if firstProduct, _ = importer.updateVariant(product, product_id); firstProduct == nil {
return importer
} }
if len(linkedProducts) > 1 { if &firstProduct != nil {
newProducts = append(newProducts, *firstProduct)
}
var relation []gm.ProductRelation if product.ColorVariants != nil && len(*product.ColorVariants) > 0 {
for index, variant := range linkedProducts { linkedProducts := []gm.Product{*firstProduct}
//spoint := "color" + strconv.Itoa(index)
temp := make([]gm.Product, len(linkedProducts))
copy(temp, linkedProducts) for _, colorVariant := range *product.ColorVariants {
if index+1 <= len(temp) { var (
temp = append(temp[:index], temp[index+1:]...) variant *gm.Product
variantFlat *gm.ProductFlat
err error
)
for _, item := range temp { err = importer.Baza.Preload("Product").Preload("Variants").First(&variantFlat, "sku = ?", colorVariant.ProductNumber).Error
relation = append(relation, gm.ProductRelation{ParentID: variant.ID, ChildID: item.ID})
if err != nil && errors.Is(err, gorm.ErrRecordNotFound) && colorVariant.IsSellable {
if variant, err = importer.importVariant(colorVariant); err == nil {
newProducts = append(newProducts, *variant)
}
} else if err == nil && !colorVariant.IsSellable {
variant = importer.disableVariant(colorVariant, variantFlat.ProductID)
linkedProducts = append(linkedProducts, *variant)
} else {
if variant, importer.Error = importer.updateVariant(colorVariant, variantFlat.ProductID); importer.Error != nil {
return importer
}
linkedProducts = append(linkedProducts, *variant)
}
}
if len(newProducts) > 0 {
// relation
var relation []gm.ProductRelation
for _, linkedProduct := range linkedProducts {
for _, newProd := range newProducts {
relation = append(relation, gm.ProductRelation{ParentID: linkedProduct.ID, ChildID: newProd.ID})
relation = append(relation, gm.ProductRelation{ParentID: newProd.ID, ChildID: linkedProduct.ID})
} }
} }
} if err := importer.Baza.Create(&relation).Error; err != nil {
log.Println(err)
if err := importer.Baza.Create(&relation).Error; err != nil { }
log.Println(err)
} }
} }
return importer return importer
} }
@ -211,17 +234,6 @@ func (importer *Importer) importVariant(product models.Product) (*gm.Product, er
err := tx.Preload("Product").Preload("Variants").First(&variantFlat, "sku = ?", sku).Error err := tx.Preload("Product").Preload("Variants").First(&variantFlat, "sku = ?", sku).Error
savePoint := "size" + strconv.Itoa(index) savePoint := "size" + strconv.Itoa(index)
tx.SavePoint(savePoint) tx.SavePoint(savePoint)
if err == nil {
tx.Model(&variantFlat).Updates(map[string]interface{}{"status": variant.Sellable, "parent_id": mainFlat.ID})
tx.Model(&gm.ProductAttributeValue{}).Where("attribute_id=8 AND product_id=?", variantFlat.ProductID).Update("boolean_value", variant.Sellable)
tx.Model(&variantFlat.Product).Update("parent_id", mainPorduct.ID)
if variant.Sellable {
importer.updatePrice(variant.Price, &variantFlat)
}
continue
}
var sizeOPtion gm.AttributeOption var sizeOPtion gm.AttributeOption
if variant.AttributeName == "Beden" { if variant.AttributeName == "Beden" {
@ -230,6 +242,54 @@ func (importer *Importer) importVariant(product models.Product) (*gm.Product, er
sizeOPtion = gm.GetAttributeOption(tx, importer.AttributesMap["boyut"].ID, variant.AttributeValue) sizeOPtion = gm.GetAttributeOption(tx, importer.AttributesMap["boyut"].ID, variant.AttributeValue)
} }
if err == nil {
err = tx.Model(&variantFlat).Updates(map[string]interface{}{"status": variant.Sellable, "parent_id": mainFlat.ID, "size": sizeOPtion.ID, "size_label": variant.AttributeValue}).Error
err = tx.Model(&gm.ProductAttributeValue{}).Where("attribute_id=8 AND product_id=?", variantFlat.ProductID).Update("boolean_value", variant.Sellable).Error
err = tx.Model(&variantFlat.Product).Update("parent_id", mainPorduct.ID).Error
if err == nil && variant.Sellable {
if variant.Price.OriginalPrice.Value > variant.Price.DiscountedPrice.Value {
err = tx.Model(&variantFlat).Updates(map[string]interface{}{
"price": variant.Price.OriginalPrice.Value,
"special_price": variant.Price.DiscountedPrice.Value,
"min_price": variant.Price.DiscountedPrice.Value,
"max_price": variant.Price.OriginalPrice.Value,
}).Error
err = tx.Model(&gm.ProductAttributeValue{}).
Where("attribute_id = 11 and product_id = ?", variantFlat.ProductID).
Update("float_value", variant.Price.OriginalPrice.Value).Error
err = tx.Model(&gm.ProductAttributeValue{}).
Where("attribute_id = 13 and product_id = ?", variantFlat.ProductID).
Update("float_value", variant.Price.DiscountedPrice.Value).Error
} else {
err = tx.Model(&variantFlat).Updates(map[string]interface{}{
"price": variant.Price.DiscountedPrice.Value,
"special_price": nil,
"min_price": variant.Price.DiscountedPrice.Value,
"max_price": variant.Price.DiscountedPrice.Value,
}).Error
err = tx.Model(&gm.ProductAttributeValue{}).
Where("attribute_id = 11 and product_id = ?", variantFlat.ProductID).
Update("float_value", variant.Price.DiscountedPrice.Value).Error
err = tx.Where("attribute_id = 13 and product_id = ?", variantFlat.ProductID).
Delete(&gm.ProductAttributeValue{}).Error
}
if err != nil {
tx.RollbackTo(savePoint)
}
} else {
tx.RollbackTo(savePoint)
}
continue
}
variantProduct := productRepo.makeVariant(mainPorduct.ID, mainPorduct.AttributeFamilyID, sku) variantProduct := productRepo.makeVariant(mainPorduct.ID, mainPorduct.AttributeFamilyID, sku)
variantProduct.AttributeValues = productRepo.getVariantAttributes(importer.AttributesMap, &variant, sizeOPtion.ID) variantProduct.AttributeValues = productRepo.getVariantAttributes(importer.AttributesMap, &variant, sizeOPtion.ID)
@ -362,13 +422,14 @@ func (importer *Importer) GetSexOption(optionName string) gm.AttributeOption {
importer.SexMutex.Unlock() importer.SexMutex.Unlock()
return option return option
} }
func (importer *Importer) disableVariant(product models.Product, product_id uint) (instance *Importer) {
func (importer *Importer) disableVariant(product models.Product, product_id uint) *gm.Product {
var flat gm.ProductFlat var flat gm.ProductFlat
importer.Error = importer.Baza.Preload("Product").Preload("Variants"). importer.Error = importer.Baza.Preload("Product").Preload("Variants").
First(&flat, "product_id = ?", product_id).Error First(&flat, "product_id = ?", product_id).Error
if importer.Error != nil { if importer.Error != nil {
return importer return nil
} }
importer.Error = importer.Baza.Model(&flat).Update("status", false).Error importer.Error = importer.Baza.Model(&flat).Update("status", false).Error
@ -377,20 +438,22 @@ func (importer *Importer) disableVariant(product models.Product, product_id uint
Where("attribute_id=8 AND product_id=?", flat.ProductID). Where("attribute_id=8 AND product_id=?", flat.ProductID).
Update("boolean_value", false).Error Update("boolean_value", false).Error
return importer return &flat.Product
} }
func (importer *Importer) updateVariant(product models.Product, product_id uint) (*gm.Product, error) { func (importer *Importer) updateVariant(product models.Product, product_id uint) (*gm.Product, error) {
var flat gm.ProductFlat var flat gm.ProductFlat
err := importer.Baza.Preload("Product").Preload("Variants").First(&flat, "product_id = ?", product_id).Error
if err != nil { importer.Error = importer.Baza.Preload("Product").Preload("Variants").First(&flat, "product_id = ?", product_id).Error
if errors.Is(err, gorm.ErrRecordNotFound) {
if importer.Error != nil {
if errors.Is(importer.Error, gorm.ErrRecordNotFound) {
return importer.importVariant(product) return importer.importVariant(product)
} }
//todo not found bolsa create etmeli //todo not found bolsa create etmeli
return nil, err return nil, importer.Error
} }
if flat.Product.Type == "configurable" { if flat.Product.Type == "configurable" {
@ -694,144 +757,3 @@ func (importer *Importer) updateParsedVariant(product models.Product) (gm.Produc
} }
return flat.Product, nil return flat.Product, nil
} }
func (importer *Importer) UpdateOrCreateLCW(product models.Product) (instance *Importer) {
var firstProduct gm.Product
result := importer.Baza.First(&firstProduct, "sku=?", product.ProductNumber)
if errors.Is(result.Error, gorm.ErrRecordNotFound) {
firstProduct, importer.Error = importer.importParsedVariant(product)
} else {
firstProduct, importer.Error = importer.updateParsedVariant(product)
}
var newProducts []gm.Product
if importer.Error != nil {
return importer
} else if &firstProduct != nil {
newProducts = append(newProducts, firstProduct)
}
if product.ColorVariants != nil && len(*product.ColorVariants) > 0 {
linkedProducts := []gm.Product{firstProduct}
for _, colorVariant := range *product.ColorVariants {
var (
variant gm.Product
err error
)
if !colorVariant.IsSellable {
if err = importer.Baza.Model(&gm.ProductFlat{}).Where("sku=?", colorVariant.ProductNumber).Update("status", false).Error; err != nil {
log.Println(err)
}
continue
} else {
//todo check parsed import variant
if variant, err = importer.importParsedVariant(colorVariant); err != nil {
if variant, importer.Error = importer.updateParsedVariant(colorVariant); importer.Error != nil {
return importer
}
linkedProducts = append(linkedProducts, variant)
} else {
newProducts = append(newProducts, variant)
}
}
}
if len(newProducts) > 0 {
// relation
var relation []gm.ProductRelation
for _, linkedProduct := range linkedProducts {
for _, newProd := range newProducts {
relation = append(relation, gm.ProductRelation{ParentID: linkedProduct.ID, ChildID: newProd.ID})
relation = append(relation, gm.ProductRelation{ParentID: newProd.ID, ChildID: linkedProduct.ID})
}
}
if err := importer.Baza.Create(&relation).Error; err != nil {
log.Println(err)
}
}
}
return importer
}
func (importer *Importer) UpdateOrCreate(product models.Product, product_id uint) (instance *Importer) {
if !product.IsSellable {
return importer.disableVariant(product, product_id)
}
firstProduct, err := importer.updateVariant(product, product_id)
var newProducts []gm.Product
if err != nil {
importer.Error = err
return importer
} else if &firstProduct != nil {
newProducts = append(newProducts, *firstProduct)
}
if product.ColorVariants != nil && len(*product.ColorVariants) > 0 {
linkedProducts := []gm.Product{*firstProduct}
for _, colorVariant := range *product.ColorVariants {
var (
variant *gm.Product
variantFlat *gm.ProductFlat
err error
)
err = importer.Baza.Preload("Product").Preload("Variants").First(&variantFlat, "sku = ?", colorVariant.ProductNumber).Error
if err != nil && errors.Is(err, gorm.ErrRecordNotFound) && colorVariant.IsSellable {
variant, err = importer.importVariant(colorVariant)
newProducts = append(newProducts, *variant)
continue
} else if err == nil && !colorVariant.IsSellable {
importer.disableVariant(colorVariant, variantFlat.ProductID)
continue
}
if variant, importer.Error = importer.updateVariant(colorVariant, variantFlat.ProductID); importer.Error != nil {
return importer
}
linkedProducts = append(linkedProducts, *variant)
}
if len(newProducts) > 0 {
// relation
var relation []gm.ProductRelation
for _, linkedProduct := range linkedProducts {
for _, newProd := range newProducts {
relation = append(relation, gm.ProductRelation{ParentID: linkedProduct.ID, ChildID: newProd.ID})
relation = append(relation, gm.ProductRelation{ParentID: newProd.ID, ChildID: linkedProduct.ID})
}
}
if err := importer.Baza.Create(&relation).Error; err != nil {
log.Println(err)
}
}
}
return importer
}

View File

@ -211,12 +211,12 @@ func (pr *ProductRepo) makeVariantFlat(variant models.Variant, SizID, parentID,
ProductNumber: fmt.Sprintf("%d", variant.ItemNumber), ProductNumber: fmt.Sprintf("%d", variant.ItemNumber),
Weight: pr.Weight, Weight: pr.Weight,
FavoritesCount: uint(pr.Data.FavoriteCount), FavoritesCount: uint(pr.Data.FavoriteCount),
//SizeLabel: variant.AttributeValue, SizeLabel: variant.AttributeValue,
//Size: int(SizID), Size: int(SizID),
MaxPrice: maxPRice, MaxPrice: maxPRice,
MinPrice: variant.Price.DiscountedPrice.Value, MinPrice: variant.Price.DiscountedPrice.Value,
Price: maxPRice, Price: maxPRice,
ProductID: productID, ProductID: productID,
} }
if variant.AttributeName == "Beden" { if variant.AttributeName == "Beden" {
@ -283,7 +283,7 @@ func (pr *ProductRepo) getVariantAttributes(AttributesMap map[string]gm.Attribut
{AttributeID: AttributesMap["name"].ID, TextValue: pr.Data.Name, Channel: "default", Locale: "tm"}, {AttributeID: AttributesMap["name"].ID, TextValue: pr.Data.Name, Channel: "default", Locale: "tm"},
{AttributeID: AttributesMap["weight"].ID, TextValue: pr.Data.Weight}, {AttributeID: AttributesMap["weight"].ID, TextValue: pr.Data.Weight},
{AttributeID: AttributesMap["status"].ID, BooleanValue: true}, {AttributeID: AttributesMap["status"].ID, BooleanValue: true},
//{AttributeID: AttributesMap["size"].ID, IntegerValue: int(SizID)}, {AttributeID: AttributesMap["size"].ID, IntegerValue: int(SizID)},
{AttributeID: AttributesMap["price"].ID, FloatValue: price}, {AttributeID: AttributesMap["price"].ID, FloatValue: price},
} }
if product.AttributeName == "Beden" { if product.AttributeName == "Beden" {