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) }