feat: create specific price system and adapt product queries
This commit is contained in:
@@ -4,7 +4,6 @@ import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
|
||||
"git.ma-al.com/goc_daniel/b2b/app/db"
|
||||
"git.ma-al.com/goc_daniel/b2b/app/model"
|
||||
"git.ma-al.com/goc_daniel/b2b/app/repos/productsRepo"
|
||||
constdata "git.ma-al.com/goc_daniel/b2b/app/utils/const_data"
|
||||
@@ -23,64 +22,90 @@ func New() *ProductService {
|
||||
}
|
||||
}
|
||||
|
||||
func (s *ProductService) GetJSON(p_id_product, p_id_lang, p_id_customer, b2b_id_country, p_quantity int) (*json.RawMessage, error) {
|
||||
products, err := s.productsRepo.GetJSON(p_id_product, constdata.SHOP_ID, p_id_lang, p_id_customer, b2b_id_country, p_quantity)
|
||||
if err != nil {
|
||||
return products, err
|
||||
}
|
||||
func (s *ProductService) Get(
|
||||
p_id_product, p_id_lang, p_id_customer, b2b_id_country, p_quantity uint,
|
||||
) (*json.RawMessage, error) {
|
||||
|
||||
return products, nil
|
||||
}
|
||||
|
||||
func (s *ProductService) Find(id_lang uint, p find.Paging, filters *filters.FiltersList, customer *model.Customer, quantity int, shopID uint) (*find.Found[model.ProductInList], error) {
|
||||
if customer == nil || customer.Country == nil {
|
||||
return nil, errors.New("customer is nil or is missing fields")
|
||||
}
|
||||
// customer.ID, customer.CountryID, uint(customer.Country.CurrencyID), quantity, shopID
|
||||
|
||||
found, err := s.productsRepo.Find(id_lang, p, filters)
|
||||
product, err := s.productsRepo.GetBase(p_id_product, constdata.SHOP_ID, p_id_lang)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
price, err := s.productsRepo.GetPrice(p_id_product, nil, constdata.SHOP_ID, p_id_customer, b2b_id_country, p_quantity)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
variants, err := s.productsRepo.GetVariants(p_id_product, constdata.SHOP_ID, p_id_lang, p_id_customer, b2b_id_country, p_quantity)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
result := view.ProductFull{
|
||||
Product: product,
|
||||
Price: price,
|
||||
Variants: variants,
|
||||
}
|
||||
|
||||
if len(variants) > 0 {
|
||||
result.Variants = variants
|
||||
}
|
||||
|
||||
jsonBytes, err := json.Marshal(result)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
raw := json.RawMessage(jsonBytes)
|
||||
return &raw, nil
|
||||
}
|
||||
|
||||
func (s *ProductService) Find(
|
||||
idLang uint,
|
||||
p find.Paging,
|
||||
filters *filters.FiltersList,
|
||||
customer *model.Customer,
|
||||
quantity uint,
|
||||
shopID uint,
|
||||
) (*find.Found[model.ProductInList], error) {
|
||||
|
||||
if customer == nil || customer.Country == nil {
|
||||
return nil, errors.New("customer is nil or missing fields")
|
||||
}
|
||||
|
||||
found, err := s.productsRepo.Find(idLang, p, filters)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// 1. collect simple products (no variants)
|
||||
simpleProductIndexes := make([]int, 0, len(found.Items))
|
||||
|
||||
for i := range found.Items {
|
||||
if found.Items[i].VariantsNumber <= 0 {
|
||||
err := s.PopulateProductPrice(&found.Items[i], customer, quantity, shopID)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
simpleProductIndexes = append(simpleProductIndexes, i)
|
||||
}
|
||||
}
|
||||
|
||||
return found, err
|
||||
}
|
||||
// 2. resolve prices ONLY for simple products
|
||||
for _, i := range simpleProductIndexes {
|
||||
price, err := s.productsRepo.GetPrice(
|
||||
found.Items[i].ProductID,
|
||||
nil,
|
||||
shopID,
|
||||
customer.ID,
|
||||
customer.CountryID,
|
||||
quantity,
|
||||
)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
func (s *ProductService) PopulateProductPrice(product *model.ProductInList, targetCustomer *model.Customer, quantity int, shopID uint) error {
|
||||
row := db.Get().Raw(
|
||||
"CALL get_product_price(?, ?, ?, ?, ?)",
|
||||
product.ProductID,
|
||||
shopID,
|
||||
targetCustomer.ID,
|
||||
targetCustomer.CountryID,
|
||||
quantity,
|
||||
).Row()
|
||||
|
||||
var (
|
||||
id uint
|
||||
base float64
|
||||
excl float64
|
||||
incl float64
|
||||
tax float64
|
||||
)
|
||||
|
||||
err := row.Scan(&id, &base, &excl, &incl, &tax)
|
||||
if err != nil {
|
||||
return err
|
||||
found.Items[i].PriceTaxExcl = price.FinalTaxExcl
|
||||
found.Items[i].PriceTaxIncl = price.FinalTaxIncl
|
||||
}
|
||||
|
||||
product.PriceTaxExcl = excl
|
||||
product.PriceTaxIncl = incl
|
||||
return nil
|
||||
|
||||
return found, nil
|
||||
}
|
||||
|
||||
func (s *ProductService) GetProductAttributes(
|
||||
@@ -91,5 +116,10 @@ func (s *ProductService) GetProductAttributes(
|
||||
countryID uint,
|
||||
quantity uint,
|
||||
) ([]view.ProductAttribute, error) {
|
||||
return s.productsRepo.GetProductVariants(langID, productID, shopID, customerID, countryID, quantity)
|
||||
variants, err := s.productsRepo.GetVariants(productID, constdata.SHOP_ID, langID, customerID, countryID, quantity)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return variants, nil
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user