package order import ( "context" "math" commonLogic "github.com/perfect-panel/server/internal/logic/common" "github.com/perfect-panel/server/internal/svc" "github.com/perfect-panel/server/internal/types" ) type orderPriceResult struct { OriginalPrice int64 PayableBase int64 DiscountAmount int64 PromoRuleId int64 PromoDiscount int64 PromoPrice int64 } func calculatePurchasePrice( ctx context.Context, svcCtx *svc.ServiceContext, userID int64, subscribeID int64, unitPrice int64, quantity int64, discounts []types.SubscribeDiscount, eligibleForDiscount bool, isFirstPurchase bool, ) (*orderPriceResult, error) { originalPrice := unitPrice * quantity result := &orderPriceResult{ OriginalPrice: originalPrice, PayableBase: originalPrice, } promoResult, err := commonLogic.EvaluatePromo(ctx, svcCtx, userID, subscribeID, quantity, isFirstPurchase) if err != nil { return nil, err } if promoResult != nil && promoResult.Eligible && promoResult.PromoPrice < originalPrice { result.PayableBase = promoResult.PromoPrice result.PromoRuleId = promoResult.RuleID result.PromoDiscount = originalPrice - result.PayableBase result.PromoPrice = promoResult.PromoPrice if result.PromoDiscount < 0 { result.PromoDiscount = 0 } return result, nil } discount := float64(1) if len(discounts) > 0 { discount = getDiscount(discounts, quantity, eligibleForDiscount) } result.PayableBase = int64(math.Round(float64(originalPrice) * discount)) result.DiscountAmount = originalPrice - result.PayableBase return result, nil }