Files
eway/internal/entity/gooditem.go
2024-02-11 15:50:43 +03:00

150 lines
3.4 KiB
Go

package entity
import (
"fmt"
"strconv"
"strings"
"time"
"unicode"
)
type GoodsItemSize struct {
Width Dimension
Height Dimension
Length Dimension
}
func (s GoodsItemSize) GetSum(kind DimensionKind) float64 {
var value float64
sum := func(ds ...Dimension) {
for _, d := range ds {
value += d.AdjustTo(kind).Value
}
}
sum(s.Height, s.Length, s.Length)
return value
}
type GoodsItem struct {
Articul string `json:"sku"`
PhotoURLs []string `json:"photo"`
Name string `json:"name"`
Description string `json:"description"`
Category string `json:"category"`
Type string `json:"type"`
Producer string `json:"producer"`
Pack int `json:"pack"`
Step int `json:"step"`
Price float64 `json:"price"`
TariffPrice float64 `json:"tariff_price"`
Cart int64 `json:"cart"`
Stock int `json:"stock"`
Sizes GoodsItemSize `json:"sizes"`
Parameters map[string]string `json:"parameters"`
CreatedAt time.Time `json:"created_at"`
}
type GoodsItemRaw struct {
SKU string // or articul
Photo string
Certificate string
Configurator []string
Name []string // first element is name, second is description
Category string
Type string
Producer string
Storage string // ?
Pack string // like "20 шт."
Step string
Price string // float actually
TariffPrice string // float
SpecialOffers []any
Cart float64
Other string
}
type GoodsItemInfo struct {
Parameters map[string]string
PhotoURLs []string
}
type MappedGoodsRemnants map[int]GoodsRemnant
type GoodsRemnant [4]int32
func MakeGoodsItem(
gi GoodsItemRaw,
remnants MappedGoodsRemnants,
info GoodsItemInfo,
) (out GoodsItem, err error) {
var name, desc string
var pack, step int
var price, tariffPrice float64
if len(gi.Name) >= 2 {
name = gi.Name[0]
desc = gi.Name[1]
}
fixSpace := func(in string) string {
return strings.ReplaceAll(in, " ", "")
}
price, err = strconv.ParseFloat(fixSpace(gi.Price), 64)
if err != nil {
return out, fmt.Errorf("parsing price: %w", err)
}
tariffPrice, err = strconv.ParseFloat(fixSpace(gi.TariffPrice), 64)
if err != nil {
return out, fmt.Errorf("parsing tariff_price: %w", err)
}
getDigits := func(in string) string {
var sb strings.Builder
sb.Grow(len(in))
for _, c := range in {
if unicode.IsDigit(c) {
sb.WriteRune(c)
continue
}
break
}
return sb.String()
}
const countTemplate = "%d"
_, err = fmt.Sscanf(getDigits(gi.Pack), countTemplate, &pack)
if err != nil {
return out, fmt.Errorf("getting pack count (%s): %w", gi.Pack, err)
}
_, err = fmt.Sscanf(getDigits(gi.Step), countTemplate, &step)
if err != nil {
return out, fmt.Errorf("getting step count (%s): %w", gi.Step, err)
}
photoURLs := info.PhotoURLs
if len(photoURLs) > 7 {
photoURLs = info.PhotoURLs[:7]
}
return GoodsItem{
Articul: gi.SKU,
Name: name,
Description: desc,
Category: gi.Category,
Type: gi.Type,
Producer: gi.Producer,
Pack: pack,
Step: step,
Price: price,
TariffPrice: tariffPrice,
Cart: int64(gi.Cart),
Stock: int(remnants[int(gi.Cart)][0]),
PhotoURLs: photoURLs,
Parameters: info.Parameters,
}, nil
}