diff --git a/gorm_models/family.go b/gorm_models/family.go index d698c2d..b788cf6 100644 --- a/gorm_models/family.go +++ b/gorm_models/family.go @@ -1,16 +1,25 @@ package gorm_models import ( + "errors" "log" "gorm.io/gorm" ) type AttributeOption struct { - ID uint `gorm:"primaryKey"` - AttributeID uint - AdminName string - SortOrder int `sql:"DEFAULT:NULL" gorm:"default:null"` + ID uint `gorm:"primaryKey"` + AttributeID uint + AdminName string + SortOrder int `sql:"DEFAULT:NULL" gorm:"default:null"` + Translations []AttributeOptionTranslation +} + +type AttributeOptionTranslation struct { + ID uint `gorm:"primaryKey"` + AttributeOptionID uint + Locale string + Label string } type Attribute struct { @@ -61,11 +70,27 @@ func GetAttributes(db *gorm.DB) ([]Attribute, error) { func GetAttributeOption(db *gorm.DB, attrbuteID uint, value string) AttributeOption { var option AttributeOption - err := db.FirstOrCreate(&option, AttributeOption{AttributeID: attrbuteID, AdminName: value}).Error - if err != nil { - log.Println(err.Error()) + err := db.Where("attribute_id=? and admin_name", attrbuteID, value).First(&option).Error + + if err != nil && errors.Is(err, gorm.ErrRecordNotFound) { + option = AttributeOption{ + AttributeID: attrbuteID, + AdminName: value, + SortOrder: 1000, + Translations: []AttributeOptionTranslation{ + {Locale: "tm", Label: value}, + {Locale: "ru", Label: value}, + {Locale: "tr", Label: value}, + }, + } + + if err := db.Create(&option).Error; err != nil { + log.Println(err.Error()) + + } } + return option } diff --git a/gorm_models/product.go b/gorm_models/product.go index bd88456..2e2dafe 100644 --- a/gorm_models/product.go +++ b/gorm_models/product.go @@ -32,13 +32,12 @@ type ProductRelation struct { } type ProductFlat struct { - ID uint `gorm:"primary_key"` - Sku string - 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"` + ID uint `gorm:"primary_key"` + Sku string + 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"` VisibleIndividually bool `sql:"DEFAULT:NULL" gorm:"default:null"` Price float64 `gorm:"type:decimal(12,4)"` MinPrice float64 `gorm:"type:decimal(12,4)"` @@ -60,6 +59,8 @@ type ProductFlat struct { ColorLabel string `sql:"DEFAULT:NULL" gorm:"default:null"` Size int `sql:"DEFAULT:NULL" gorm:"default:null"` SizeLabel string `sql:"DEFAULT:NULL" gorm:"default:null"` + Boyut int `sql:"DEFAULT:NULL" gorm:"default:null"` + BoyutLabel 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"` diff --git a/repositories/ImportRepository.go b/repositories/ImportRepository.go index 2fe7b57..27700ae 100644 --- a/repositories/ImportRepository.go +++ b/repositories/ImportRepository.go @@ -304,7 +304,14 @@ func (importer *Importer) importVariant(product models.Product) (*gm.Product, er } savePoint := "size" + strconv.Itoa(index) tx.SavePoint(savePoint) - sizeOPtion := gm.GetAttributeOption(tx, importer.AttributesMap["size"].ID, variant.AttributeValue) + + var sizeOPtion gm.AttributeOption + + if variant.AttributeName == "Beden" { + sizeOPtion = gm.GetAttributeOption(tx, importer.AttributesMap["size"].ID, variant.AttributeValue) + } else { + sizeOPtion = gm.GetAttributeOption(tx, importer.AttributesMap["boyut"].ID, variant.AttributeValue) + } sku := fmt.Sprintf("%s-%d", product.ProductNumber, variant.ItemNumber) variantProduct := productRepo.makeVariant(mainPorduct.ID, mainPorduct.AttributeFamilyID, sku) @@ -422,9 +429,45 @@ func (importer *Importer) updateVariant(product models.Product) (*gm.Product, er } if flat.Product.Type == "configurable" { - + //todo update variant prices + //todo create none existing variant + //todo update min max price } else { + price := product.Price + + if price.OriginalPrice.Value > price.DiscountedPrice.Value { + + importer.baza.Model(&flat).Updates(map[string]interface{}{ + "price": price.OriginalPrice.Value, + "special_price": price.DiscountedPrice.Value, + "min_price": price.DiscountedPrice.Value, + "max_price": price.OriginalPrice.Value, + }) + + importer.baza.Model(&gm.ProductAttributeValue{}). + Where("attribute_id = 11 and product_id = ?", flat.ProductID). + Update("float_value", price.OriginalPrice.Value) + + importer.baza.Model(&gm.ProductAttributeValue{}). + Where("attribute_id = 13 and product_id = ?", flat.ProductID). + Update("float_value", price.DiscountedPrice.Value) + } else { + + importer.baza.Model(&flat).Updates(map[string]interface{}{ + "price": price.DiscountedPrice.Value, + "special_price": nil, + "min_price": price.DiscountedPrice.Value, + "max_price": price.DiscountedPrice.Value, + }) + + importer.baza.Model(&gm.ProductAttributeValue{}). + Where("attribute_id = 11 and product_id = ?", flat.ProductID). + Update("float_value", price.DiscountedPrice.Value) + + importer.baza.Where("attribute_id = 13 and product_id = ?", flat.ProductID). + Delete(&gm.ProductAttributeValue{}) + } } return nil, nil } diff --git a/repositories/ProductRepository.go b/repositories/ProductRepository.go index e9632e3..7fd34e4 100644 --- a/repositories/ProductRepository.go +++ b/repositories/ProductRepository.go @@ -198,12 +198,20 @@ func (pr *ProductRepo) makeVariantFlat(variant models.Variant, SizID, parentID, ProductNumber: fmt.Sprintf("%d", variant.ItemNumber), Weight: pr.Weight, FavoritesCount: uint(pr.Data.FavoriteCount), - SizeLabel: variant.AttributeValue, - Size: int(SizID), - MaxPrice: maxPRice, - MinPrice: variant.Price.DiscountedPrice.Value, - Price: maxPRice, - ProductID: productID, + //SizeLabel: variant.AttributeValue, + //Size: int(SizID), + MaxPrice: maxPRice, + MinPrice: variant.Price.DiscountedPrice.Value, + Price: maxPRice, + ProductID: productID, + } + + if variant.AttributeName == "Beden" { + flat.Size = int(SizID) + flat.SizeLabel = variant.AttributeValue + } else { + flat.Boyut = int(SizID) + flat.BoyutLabel = variant.AttributeValue } if flat.MaxPrice > flat.MinPrice { @@ -253,9 +261,14 @@ func (pr *ProductRepo) getVariantAttributes(AttributesMap map[string]gm.Attribut {AttributeID: AttributesMap["name"].ID, TextValue: pr.Data.Name, Channel: "default", Locale: "tm"}, {AttributeID: AttributesMap["weight"].ID, TextValue: pr.Data.Weight}, {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}, } + if product.AttributeName == "Beden" { + attributes = append(attributes, gm.ProductAttributeValue{AttributeID: AttributesMap["size"].ID, IntegerValue: int(SizID)}) + } else { + attributes = append(attributes, gm.ProductAttributeValue{AttributeID: AttributesMap["boyut"].ID, IntegerValue: int(SizID)}) + } if pr.Data.Color != "" { attributes = append(attributes, gm.ProductAttributeValue{AttributeID: AttributesMap["color"].ID, IntegerValue: int(pr.ColorOption.ID)})