60 lines
1.6 KiB
Go
60 lines
1.6 KiB
Go
package db
|
|
|
|
import "gestion/models"
|
|
|
|
// ResolveFreeGift retourne la quantité offerte (du même produit) pour un
|
|
// produit, sa catégorie catalogue et une quantité commandée donnés — le seuil
|
|
// le plus élevé (BuyQuantity) atteint par la quantité commandée est retenu,
|
|
// tous seuils confondus pour ce produit (ex: seuils 10g→+1g et 20g→+3g, une
|
|
// commande de 25g retient +3g, pas +1g).
|
|
func ResolveFreeGift(settings *models.AppSettings, productID int, category string, quantity float64) float64 {
|
|
if settings == nil || !settings.FreeGiftsEnabled {
|
|
return 0
|
|
}
|
|
|
|
var bestBuy, bestFree float64
|
|
found := false
|
|
consider := func(tiers []models.FreeGiftTier) {
|
|
for _, t := range tiers {
|
|
if t.BuyQuantity <= 0 || t.FreeQuantity <= 0 || quantity < t.BuyQuantity {
|
|
continue
|
|
}
|
|
if !found || t.BuyQuantity > bestBuy {
|
|
bestBuy, bestFree = t.BuyQuantity, t.FreeQuantity
|
|
found = true
|
|
}
|
|
}
|
|
}
|
|
|
|
for _, g := range settings.FreeGifts {
|
|
if g.Category != category {
|
|
continue
|
|
}
|
|
if g.AllProducts {
|
|
consider(g.Tiers)
|
|
continue
|
|
}
|
|
for _, pq := range g.Products {
|
|
if pq.ProductID == productID {
|
|
consider(pq.Tiers)
|
|
}
|
|
}
|
|
}
|
|
|
|
if !found {
|
|
return 0
|
|
}
|
|
return bestFree
|
|
}
|
|
|
|
// ResolveFreeGiftQuantity lit les settings courants et applique
|
|
// ResolveFreeGift — wrapper pratique pour les appelants qui n'ont pas déjà
|
|
// les settings sous la main (même style que ApplyPromotionToPrice).
|
|
func (d *Database) ResolveFreeGiftQuantity(productID int, category string, quantity float64) float64 {
|
|
settings, err := d.GetSettings()
|
|
if err != nil {
|
|
return 0
|
|
}
|
|
return ResolveFreeGift(&settings, productID, category, quantity)
|
|
}
|