fix: remove discount_eligible from booking creation, fix modal scrolling, lower default to 5%
- Remove all discount_eligible checks from CreateBookingHandler and AdminCreateBookingForUserHandler - Discounts are only calculated at completion/payment time, not at booking time - Remove discount_eligible from frontend Booking type and pending_redemption from BookingUser - Remove TestDiscount_EligibilityFlag test (no longer relevant) - Fix modal scrolling: add max-h-[90vh] overflow-y-auto to match ServicesManagement pattern - Lower default discount from 10% to 5% - Clarify max_redemptions label as 'campaign total' (per campaign, not per person)
This commit is contained in:
@@ -1307,24 +1307,6 @@ func CreateBookingHandler(w http.ResponseWriter, r *http.Request) {
|
||||
createdBy = &creatorID
|
||||
}
|
||||
|
||||
var discountEligible bool
|
||||
if !isGuest {
|
||||
var hasPendingRedemption bool
|
||||
_ = db.DB.QueryRow(r.Context(), `
|
||||
SELECT EXISTS(SELECT 1 FROM loyalty_redemptions WHERE user_id = $1 AND status = 'pending' AND expires_at > NOW())
|
||||
`, userID).Scan(&hasPendingRedemption)
|
||||
|
||||
var activeCampaigns int
|
||||
_ = db.DB.QueryRow(r.Context(), `
|
||||
SELECT COUNT(*) FROM discount_campaigns
|
||||
WHERE status = 'active' AND campaign_type = 'time_based'
|
||||
AND start_date <= NOW() AND end_date >= NOW()
|
||||
AND (max_redemptions IS NULL OR times_redeemed < max_redemptions)
|
||||
`).Scan(&activeCampaigns)
|
||||
|
||||
discountEligible = hasPendingRedemption || activeCampaigns > 0
|
||||
}
|
||||
|
||||
tx, err := db.DB.Begin(r.Context())
|
||||
if err != nil {
|
||||
log.Printf("Failed to start transaction: %v", err)
|
||||
@@ -1346,10 +1328,10 @@ func CreateBookingHandler(w http.ResponseWriter, r *http.Request) {
|
||||
var booking Booking
|
||||
booking.User = &UserSummary{}
|
||||
if err := tx.QueryRow(r.Context(), `
|
||||
INSERT INTO bookings (user_id, start_time, notes, created_by, deposit_required, status, idempotency_key, discount_eligible)
|
||||
VALUES ($1, $2, $3::text, $4, $5, CASE WHEN $3::text IS NOT NULL AND $3::text != '' THEN 'pending'::booking_status ELSE 'confirmed'::booking_status END, $6, $7)
|
||||
INSERT INTO bookings (user_id, start_time, notes, created_by, deposit_required, status, idempotency_key)
|
||||
VALUES ($1, $2, $3::text, $4, $5, CASE WHEN $3::text IS NOT NULL AND $3::text != '' THEN 'pending'::booking_status ELSE 'confirmed'::booking_status END, $6)
|
||||
RETURNING id, user_id, start_time, status, notes, created_at, updated_at, created_by, deposit_required
|
||||
`, userID, req.StartTime, req.Notes, createdBy, depositRequiredSnapshot, sql.NullString{String: idempotencyKey, Valid: idempotencyKey != ""}, discountEligible).Scan(
|
||||
`, userID, req.StartTime, req.Notes, createdBy, depositRequiredSnapshot, sql.NullString{String: idempotencyKey, Valid: idempotencyKey != ""}).Scan(
|
||||
&booking.ID, &booking.User.ID, &booking.StartTime, &booking.Status,
|
||||
&booking.Notes, &booking.CreatedAt, &booking.UpdatedAt, &booking.CreatedBy,
|
||||
&booking.DepositRequired,
|
||||
|
||||
Reference in New Issue
Block a user