fix(loyalty): correct stamp accumulation, one-per-day guard, and test coverage
- Handler: apply existing redemption BEFORE incrementing stamps (was creating
and applying redemption to same booking)
- Handler: guard stamp increment behind bookingTotal > 0 (free bookings don't
earn stamps)
- Handler: fix global milestone off-by-one (globalCount already includes
current booking since status updated before discount logic)
- Schema: chk_milestone constraint only requires milestone_unit for anniversary
type, not per_user_booking_count or global_booking_count
- Tests: rewrite from scratch with 12 focused tests:
- FullCycle, ExistingRedemptionApplies, OneStampPerDay, ZeroTotalNoStamp,
CycleRepeats, TimeBasedCampaign, PerUserMilestone, GlobalMilestone,
AnniversaryMilestone, LoyaltyPriority, NoDiscountOnZeroTotal,
CampaignMaxRedemptions
- Tests: fix path parameter extraction in makeProgressRequest
- Vendor: go mod tidy + vendor for testify dependency
This commit is contained in:
@@ -433,7 +433,7 @@ CREATE TABLE discount_campaigns (
|
||||
created_by CHAR(12) REFERENCES users(id) ON DELETE SET NULL,
|
||||
CONSTRAINT chk_dates CHECK (campaign_type = 'milestone' OR (start_date IS NOT NULL AND end_date IS NOT NULL AND end_date > start_date)),
|
||||
CONSTRAINT chk_discount CHECK (discount_percent > 0 AND discount_percent <= 100),
|
||||
CONSTRAINT chk_milestone CHECK (campaign_type = 'time_based' OR (milestone_type IS NOT NULL AND milestone_value IS NOT NULL AND milestone_unit IS NOT NULL))
|
||||
CONSTRAINT chk_milestone CHECK (campaign_type = 'time_based' OR (milestone_type IS NOT NULL AND milestone_value IS NOT NULL AND (milestone_type != 'anniversary' OR milestone_unit IS NOT NULL)))
|
||||
);
|
||||
|
||||
CREATE INDEX idx_discount_campaigns_dates ON discount_campaigns(start_date, end_date) WHERE start_date IS NOT NULL;
|
||||
|
||||
Reference in New Issue
Block a user