fix(qsl): separate the QSL manager from the routing method (#16)

QSL_VIA is the manager. QSL_SENT_VIA and QSL_RCVD_VIA are the ADIF "QSL Via"
enumeration — B bureau, D direct, E electronic, M manager (import-only) —
and say how a card travelled. OpsLog had one column for all three:

  - the import folded QSL_SENT_VIA into QSL_VIA whenever QSL_VIA was empty,
    which is exactly a Log4OM export (it defaults QSL_SENT_VIA to E), so
    OE6CLD saw "E" everywhere OpsLog shows the manager;
  - QSL_RCVD_VIA was listed in adifPromoted with no column behind it, so it
    was not stored, not kept among the extras, and not exported — dropped
    outright on import;
  - neither was ever written on export, so an import followed by an export
    destroyed both;
  - and OpsLog polluted the field itself: the QSL Manager panel wrote
    "Bureau" / "Direct" / "Electronic", in full words, into QSL_VIA.

Two columns added (migration 0027), carried through the five places a
promoted ADIF field has to touch, with round-trip tests pinning the reported
case. The QSL panel now offers Bureau / Direct / Electronic for each
direction and stores the enumeration; the manager field is labelled as the
manager and holds only that. M is kept when a file gives it and never
written back out.

Existing logs hold a mixture of the two in one column. The repair is offered,
not performed: the count is shown once per log with a plain question, and a
"no" is remembered. It moves only where QSL_SENT_VIA is still empty, and only
values that normalise to the enumeration — a manager is a callsign and can
never be one of those six words, which a test pins against real manager calls.
This commit is contained in:
2026-08-14 11:50:25 +02:00
parent 30143b01bf
commit 4e88bdfaa7
20 changed files with 542 additions and 35 deletions
@@ -0,0 +1,18 @@
-- QSL_SENT_VIA / QSL_RCVD_VIA — the ADIF fields that say HOW a card travelled.
--
-- Until now OpsLog had one column, qsl_via, and used it for two unrelated
-- things: the QSL manager (what ADIF's QSL_VIA holds) and the routing method.
-- Imports made it worse — QSL_SENT_VIA was folded into qsl_via when qsl_via was
-- empty, so a Log4OM log arrived with "E" sitting where the manager belongs —
-- and QSL_RCVD_VIA was dropped outright, listed as a promoted field with no
-- column behind it, so it was not even kept among the extras.
--
-- These two columns hold the ADIF enumeration: B (bureau), D (direct),
-- E (electronic). M (manager) is accepted on import only, per the standard.
--
-- Adding the columns is all that happens here. Existing qsl_via values are NOT
-- touched: separating a manager from a routing word rewrites what an operator
-- can see in their own log, so it is offered once, with a count, and only runs
-- when they say yes.
ALTER TABLE qso ADD COLUMN qsl_sent_via TEXT;
ALTER TABLE qso ADD COLUMN qsl_rcvd_via TEXT;