Gift-card rolling expiry, SvelteDate→Date purge, strict DST tests, UTC scan-location + settings legal floor
Gift-card rolling expiry (setting-driven, was dead config): - GetGiftCardExpiryMonths(): single source of truth (business_settings gift_card_expiry_months, fallback 24) shared by payment handlers and the CleanupExpiredGiftCards job (was hardcoded 24). - expiry_date now maintained on ALL 9 gift-card write sites (buy, topup, transfer, redeem, terminal payment, refund credit, till) so the refund-time guard at refunds.go actually fires. Schema default 12->24 + migration note; test-DB seed aligned. Stale "expiry_date IS NULL" test rewritten; new expired-card-rejected regression test. Frontend SvelteDate purge (docs' stated convention, wide): - All 180+ raw `new SvelteDate(...)` uses across routes/components replaced with parseWallClockDate (backend UTC ISO) or new Date (wall-clock constructors). SvelteDate imports removed. timeSlots.ts getDayWithOrdinal fixed. Zero SvelteDate references remain; svelte-check clean. Strict timezone/DST testing + QA fixes: - 8 new hermetic boundary tests: clock.DST transitions (both 2026 folds), closing-hours GMT vs BST, booking date-window midnight, refund-tier elapsed-time independence, deposit-window UTC-instant, scheduling LondonDateString midnight, today AT TIME ZONE window + UTC round-trip. - today.go summary date labels fixed to London wall-clock (were showing the previous UTC day during BST) + regression test. - pgx ScanLocation fixed to UTC via AfterConnect (was host-local -> JSON offsets depended on deployment TZ, contradicting the documented UTC invariant) + regression test. Registered as a new *Type to avoid a data race on the shared type map (caught by -race). Admin Business Settings (setting now functional => legal floor): - gift_card_expiry_months validation floor raised 1 -> 12 months (CMA/ Consumer Rights Act 2015 unfair-contract-term guidance) in endpoint + UI, with rolling-expiry semantics shown in both display and edit form. - 3 new expiry validation tests; 2 pre-existing message assertions updated. Full suite 25/25 + race clean via run-tests.sh lockfile; svelte-check 0 errors/warnings; production build succeeds.
This commit is contained in:
@@ -228,11 +228,15 @@ func GetCurrentAndNextHandler(w http.ResponseWriter, r *http.Request) {
|
||||
response.DoneForDay = &done
|
||||
|
||||
if todayOpen {
|
||||
// Regular done-for-the-day: show daily summary
|
||||
// Regular done-for-the-day: show daily summary. Format the dates in
|
||||
// Europe/London: todayStart is London midnight converted to UTC (e.g.
|
||||
// 2026-08-04 00:00 BST = 2026-08-03 23:00 UTC), so formatting the UTC
|
||||
// instant directly yields the PREVIOUS day during BST. Use the
|
||||
// London-located instant so the summary header shows the business day.
|
||||
summary := computeAggregateSummary(r, todayStart, todayEnd)
|
||||
summary.SummaryScope = "day"
|
||||
summary.SummaryStartDate = todayStart.Format("2006-01-02")
|
||||
summary.SummaryEndDate = todayEnd.Format("2006-01-02")
|
||||
summary.SummaryStartDate = todayStart.In(londonLocation).Format("2006-01-02")
|
||||
summary.SummaryEndDate = todayEnd.In(londonLocation).Format("2006-01-02")
|
||||
response.Summary = summary
|
||||
|
||||
// If tomorrow is closed, also compute a week summary
|
||||
@@ -241,8 +245,8 @@ func GetCurrentAndNextHandler(w http.ResponseWriter, r *http.Request) {
|
||||
weekStart, _ := findWeekSummaryRange(r, tomorrow)
|
||||
ws := computeAggregateSummary(r, weekStart, todayEnd)
|
||||
ws.SummaryScope = "week"
|
||||
ws.SummaryStartDate = weekStart.Format("2006-01-02")
|
||||
ws.SummaryEndDate = todayStart.Format("2006-01-02")
|
||||
ws.SummaryStartDate = weekStart.In(londonLocation).Format("2006-01-02")
|
||||
ws.SummaryEndDate = todayStart.In(londonLocation).Format("2006-01-02")
|
||||
response.WeekSummary = ws
|
||||
}
|
||||
} else {
|
||||
@@ -250,8 +254,8 @@ func GetCurrentAndNextHandler(w http.ResponseWriter, r *http.Request) {
|
||||
weekStart, _ := findWeekSummaryRange(r, londonNow)
|
||||
summary := computeAggregateSummary(r, weekStart, todayEnd)
|
||||
summary.SummaryScope = "week"
|
||||
summary.SummaryStartDate = weekStart.Format("2006-01-02")
|
||||
summary.SummaryEndDate = todayStart.Format("2006-01-02")
|
||||
summary.SummaryStartDate = weekStart.In(londonLocation).Format("2006-01-02")
|
||||
summary.SummaryEndDate = todayStart.In(londonLocation).Format("2006-01-02")
|
||||
response.Summary = summary
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user