package order import "github.com/perfect-panel/server/internal/types" // getDiscount returns the discount factor for the given quantity. // // - New user: pick the tier with the lowest discount value (biggest saving). // - Non-new user: pick the tier with the highest discount value (least saving / closest to full price). func getDiscount(discounts []types.SubscribeDiscount, inputMonths int64, isNewUser bool) float64 { best := float64(-1) for _, d := range discounts { if d.Quantity != inputMonths || d.Discount <= 0 || d.Discount >= 100 { continue } if isNewUser { // lowest discount value = biggest saving if best < 0 || d.Discount < best { best = d.Discount } } else { // highest discount value = least saving (closest to original price) if best < 0 || d.Discount > best { best = d.Discount } } } if best < 0 { return 1 } return best / float64(100) } // isNewUserOnlyForQuantity checks whether the matched discount tier has new_user_only enabled. // Returns true only when all matching tiers for the given quantity require new-user status // (i.e. no fallback tier with new_user_only=false exists). When both a new-user-only tier // and a general tier exist for the same quantity, non-new-users can still purchase via the // general tier, so this returns false. func isNewUserOnlyForQuantity(discounts []types.SubscribeDiscount, inputQuantity int64) bool { hasNewUserOnly := false hasFallback := false for _, d := range discounts { if d.Quantity != inputQuantity { continue } if d.NewUserOnly { hasNewUserOnly = true } else { hasFallback = true } } return hasNewUserOnly && !hasFallback }