Files
OpsLog/internal
rouggy 8fc6673611 fix(awards): apply the per-reference validity window
References are not forever: a park is delisted, a district merged, a castle
loses its number. A QSO made while the reference existed is a valid contact
and must keep counting; one made afterwards must not.

The JSON format did not need to change — ValidFrom/ValidTo were already on
awardref.Ref, already columns in award_references, already round-tripping
through export and import. They were simply never read: awardRefMetas dropped
them on the way into the engine, so nothing downstream could enforce them.
This carries them through and checks them in keepRefs.

Empty means the award's own window governs, which inScope already enforces for
every QSO in the award. That fallback is deliberately NOT duplicated per
reference — two places enforcing the same dates is two places for them to
disagree. The editor shows the award's dates as the hint under the boxes so
the operator can see what empty inherits.

Dates are compared as ISO strings rather than parsed times: the stored shape
is "2006-01-02", lexical order on it IS chronological, and this cannot fail on
a malformed value the way a parse can — a reference with a typo in its window
keeps counting instead of silently vanishing from an operator's totals.

The Explain trace names the date and the cutoff, because "did not count" on a
contact the operator remembers making is exactly when they need to be told it
is the reference that has a window, not their log that is wrong.
2026-08-12 10:43:23 +02:00
..
2026-08-02 20:03:16 +02:00
2026-07-03 19:08:50 +02:00
2026-07-04 11:39:33 +02:00
2026-08-02 23:51:46 +02:00
2026-08-10 23:40:42 +02:00
2026-08-02 23:51:46 +02:00
up
2026-06-15 23:45:14 +02:00
2026-06-07 01:11:37 +02:00
2026-06-11 21:54:35 +02:00
up
2026-06-15 23:45:14 +02:00
2026-07-09 17:32:13 +02:00
2026-07-26 16:57:19 +02:00
2026-08-02 06:40:10 +02:00
2026-07-26 16:57:19 +02:00