package fetdata
import (
"html/template"
"strings"
"time"
"golang-fave/engine/utils"
"golang-fave/engine/wrapper"
)
type ShopProductVarItem struct {
Link string
Name string
Selected bool
}
type ShopProduct struct {
wrap *wrapper.Wrapper
object *utils.MySql_shop_product
user *User
currency *ShopCurrency
category *ShopCategory
images []*ShopProductImage
specs []*ShopProductSpec
vars []*ShopProductVarItem
}
func (this *ShopProduct) load() *ShopProduct {
if this == nil {
return this
}
if rows, err := this.wrap.DB.Query(
this.wrap.R.Context(),
`SELECT
fave_shop_product_images.product_id,
fave_shop_product_images.filename
FROM
fave_shop_product_images
WHERE
fave_shop_product_images.product_id = ?
ORDER BY
fave_shop_product_images.ord ASC
;`,
this.object.A_id,
); err == nil {
defer rows.Close()
for rows.Next() {
img := utils.MySql_shop_product_image{}
if err := rows.Scan(
&img.A_product_id,
&img.A_filename,
); *this.wrap.LogCpError(&err) == nil {
this.images = append(this.images, &ShopProductImage{wrap: this.wrap, object: &img})
}
}
}
// Get images from parent
if len(this.images) <= 0 && this.object.A_parent_id() > 0 {
if rows, err := this.wrap.DB.Query(
this.wrap.R.Context(),
`SELECT
fave_shop_product_images.product_id,
fave_shop_product_images.filename
FROM
fave_shop_product_images
WHERE
fave_shop_product_images.product_id = ?
ORDER BY
fave_shop_product_images.ord ASC
;`,
this.object.A_parent_id(),
); err == nil {
defer rows.Close()
for rows.Next() {
img := utils.MySql_shop_product_image{}
if err := rows.Scan(
&img.A_product_id,
&img.A_filename,
); *this.wrap.LogCpError(&err) == nil {
this.images = append(this.images, &ShopProductImage{wrap: this.wrap, object: &img})
}
}
}
}
filter_ids := []int{}
filter_names := map[int]string{}
filter_values := map[int][]string{}
if rows, err := this.wrap.DB.Query(
this.wrap.R.Context(),
`SELECT
fave_shop_filters.id,
fave_shop_filters.filter,
fave_shop_filters_values.name
FROM
fave_shop_filter_product_values
LEFT JOIN fave_shop_filters_values ON fave_shop_filters_values.id = fave_shop_filter_product_values.filter_value_id
LEFT JOIN fave_shop_filters ON fave_shop_filters.id = fave_shop_filters_values.filter_id
WHERE
fave_shop_filter_product_values.product_id = ?
ORDER BY
fave_shop_filters.filter ASC,
fave_shop_filters_values.name ASC
;`,
this.object.A_id,
); err == nil {
defer rows.Close()
values := make([]string, 3)
scan := make([]interface{}, len(values))
for i := range values {
scan[i] = &values[i]
}
for rows.Next() {
err = rows.Scan(scan...)
if *this.wrap.LogCpError(&err) == nil {
if !utils.InArrayInt(filter_ids, utils.StrToInt(string(values[0]))) {
filter_ids = append(filter_ids, utils.StrToInt(string(values[0])))
}
filter_names[utils.StrToInt(string(values[0]))] = string(values[1])
filter_values[utils.StrToInt(string(values[0]))] = append(filter_values[utils.StrToInt(string(values[0]))], string(values[2]))
}
}
}
for _, filter_id := range filter_ids {
this.specs = append(this.specs, &ShopProductSpec{wrap: this.wrap, object: &utils.MySql_shop_product_spec{
A_product_id: this.object.A_id,
A_filter_id: filter_id,
A_filter_name: filter_names[filter_id],
A_filter_value: strings.Join(filter_values[filter_id], ", "),
}})
}
// Variations
if rows, err := this.wrap.DB.Query(
this.wrap.R.Context(),
`SELECT
fave_shop_products.id,
fave_shop_products.name,
fave_shop_products.alias
FROM
fave_shop_products
WHERE
fave_shop_products.active = 1 AND
(
(fave_shop_products.id = ? OR fave_shop_products.parent_id = ?) OR
(
(fave_shop_products.id = ?) OR
(fave_shop_products.parent_id IS NOT NULL AND fave_shop_products.parent_id = ?)
)
)
ORDER BY
fave_shop_products.name ASC
;`,
this.object.A_id,
this.object.A_id,
this.object.A_parent_id(),
this.object.A_parent_id(),
); err == nil {
defer rows.Close()
for rows.Next() {
var tmp_id int
var tmp_name string
var tmp_alias string
if err := rows.Scan(
&tmp_id,
&tmp_name,
&tmp_alias,
); *this.wrap.LogCpError(&err) == nil {
selected := false
if tmp_id == this.object.A_id {
selected = true
}
this.vars = append(this.vars, &ShopProductVarItem{
Link: "/shop/" + tmp_alias + "/",
Name: tmp_name + " " + utils.IntToStr(tmp_id),
Selected: selected,
})
}
}
}
return this
}
func (this *ShopProduct) Id() int {
if this == nil {
return 0
}
return this.object.A_id
}
func (this *ShopProduct) User() *User {
if this == nil {
return nil
}
if this.user != nil {
return this.user
}
this.user = (&User{wrap: this.wrap}).load()
this.user.loadById(this.object.A_user)
return this.user
}
func (this *ShopProduct) Currency() *ShopCurrency {
if this == nil {
return nil
}
if this.currency != nil {
return this.currency
}
this.currency = (&ShopCurrency{wrap: this.wrap}).load()
this.currency.loadById(this.object.A_currency)
return this.currency
}
func (this *ShopProduct) Price() float64 {
if this == nil {
return 0
}
if this.Currency() == nil {
return this.object.A_price
}
if this.wrap.ShopGetCurrentCurrency() == nil {
return this.object.A_price
}
if this.wrap.ShopGetCurrentCurrency().A_id == this.Currency().Id() {
return this.object.A_price
}
if this.Currency().Id() == 1 {
return this.object.A_price * this.wrap.ShopGetCurrentCurrency().A_coefficient
} else {
if c, ok := (*this.wrap.ShopGetAllCurrencies())[this.Currency().Id()]; ok == true {
return this.object.A_price / c.A_coefficient
} else {
return this.object.A_price
}
}
}
func (this *ShopProduct) PriceOld() float64 {
if this == nil {
return 0
}
if this.Currency() == nil {
return this.object.A_price_old
}
if this.wrap.ShopGetCurrentCurrency() == nil {
return this.object.A_price_old
}
if this.wrap.ShopGetCurrentCurrency().A_id == this.Currency().Id() {
return this.object.A_price_old
}
if this.Currency().Id() == 1 {
return this.object.A_price_old * this.wrap.ShopGetCurrentCurrency().A_coefficient
} else {
if c, ok := (*this.wrap.ShopGetAllCurrencies())[this.Currency().Id()]; ok == true {
return this.object.A_price_old / c.A_coefficient
} else {
return this.object.A_price_old
}
}
}
func (this *ShopProduct) PriceNice() string {
return utils.FormatProductPrice(
this.Price(),
(*this.wrap.Config).Shop.Price.Format,
(*this.wrap.Config).Shop.Price.Round,
)
}
func (this *ShopProduct) PriceOldNice() string {
return utils.FormatProductPrice(
this.PriceOld(),
(*this.wrap.Config).Shop.Price.Format,
(*this.wrap.Config).Shop.Price.Round,
)
}
func (this *ShopProduct) PriceFormat(format string) string {
return utils.Float64ToStrF(this.Price(), format)
}
func (this *ShopProduct) Group() string {
if this == nil {
return ""
}
return this.object.A_gname
}
func (this *ShopProduct) Name() string {
if this == nil {
return ""
}
return this.object.A_name
}
func (this *ShopProduct) Alias() string {
if this == nil {
return ""
}
return this.object.A_alias
}
func (this *ShopProduct) Vendor() string {
if this == nil {
return ""
}
return this.object.A_vendor
}
func (this *ShopProduct) Quantity() int {
if this == nil {
return 0
}
return this.object.A_quantity
}
func (this *ShopProduct) Category() *ShopCategory {
if this == nil {
return nil
}
if this.category != nil {
return this.category
}
this.category = (&ShopCategory{wrap: this.wrap}).load(nil)
this.category.loadById(this.object.A_category)
return this.category
}
func (this *ShopProduct) Briefly() template.HTML {
if this == nil {
return template.HTML("")
}
return template.HTML(this.object.A_briefly)
}
func (this *ShopProduct) Content() template.HTML {
if this == nil {
return template.HTML("")
}
return template.HTML(this.object.A_content)
}
func (this *ShopProduct) DateTimeUnix() int {
if this == nil {
return 0
}
return this.object.A_datetime
}
func (this *ShopProduct) DateTimeFormat(format string) string {
if this == nil {
return ""
}
return time.Unix(int64(this.object.A_datetime), 0).Format(format)
}
func (this *ShopProduct) Active() bool {
if this == nil {
return false
}
return this.object.A_active > 0
}
func (this *ShopProduct) Permalink() string {
if this == nil {
return ""
}
return "/shop/" + this.object.A_alias + "/"
}
func (this *ShopProduct) Image() *ShopProductImage {
if this == nil {
return nil
}
if len(this.images) <= 0 {
return nil
}
return this.images[0]
}
func (this *ShopProduct) HaveImages() bool {
if this == nil {
return false
}
if len(this.images) <= 0 {
return false
}
return true
}
func (this *ShopProduct) Images() []*ShopProductImage {
if this == nil {
return []*ShopProductImage{}
}
return this.images
}
func (this *ShopProduct) ImagesCount() int {
if this == nil {
return 0
}
return len(this.images)
}
func (this *ShopProduct) HaveSpecs() bool {
if this == nil {
return false
}
if len(this.specs) <= 0 {
return false
}
return true
}
func (this *ShopProduct) Specs() []*ShopProductSpec {
if this == nil {
return []*ShopProductSpec{}
}
return this.specs
}
func (this *ShopProduct) SpecsCount() int {
if this == nil {
return 0
}
return len(this.specs)
}
func (this *ShopProduct) HaveVariations() bool {
if this == nil {
return false
}
if len(this.vars) <= 1 {
return false
}
return true
}
func (this *ShopProduct) Variations() []*ShopProductVarItem {
if this == nil {
return []*ShopProductVarItem{}
}
return this.vars
}
func (this *ShopProduct) VariationsCount() int {
if this == nil {
return 0
}
return len(this.vars)
}