fix(lookup): read the fields the providers were already sending

Audit of every field a lookup returns against what OpsLog can store, prompted
by a report that HamQTH was not fetching the email.

The email was never broken: pinned now against a captured HamQTH answer, it
parses and reaches the QSO. The reported callsign simply has no public address
on HamQTH, which the empty field could not distinguish from a fault — so the
"[email protected]" placeholder is gone. A greyed-out sample address in the one
field an operator checks to see whether the lookup found one reads as a value.

Real gaps found and closed:

- web: the qso table has had the column since migration 0003 and no provider
  mapping ever read it. HamQTH sends <web>.
- picture: Result.ImageURL was documented "QRZ only" because HamQTH's element
  is <picture>, not <image>. It was there all along.
- zip: sent by both providers, read by neither.
- adr_name: used only as a fallback when a record carries neither nick nor
  name. Deliberately NOT preferred over <nick> — a log wants the name the
  operator goes by on the air, "Igor", not "Igor Vladimirovich Getman".

The parse tests use a real captured payload, including the stray <div> advert
the server injects into its own XML.
This commit is contained in:
2026-08-12 17:34:45 +02:00
parent 4f3c3edaee
commit 2f5fd63afd
9 changed files with 202 additions and 15 deletions
+3 -1
View File
@@ -3303,7 +3303,7 @@ export default function App() {
sat_name: details.sat_name, sat_mode: details.sat_mode,
contest_id: details.contest_id,
srx: srxE.num, stx: stxE.num, srx_string: srxE.str, stx_string: stxE.str,
email: details.email,
email: details.email, web: details.web,
};
applyAwardRefs(payload, details.award_refs ?? '', awardFieldRef.current);
// Contest mode overrides the exchange fields: CONTEST_ID, the sent
@@ -3666,6 +3666,7 @@ export default function App() {
ituz: d.ituz ?? (last.ituz || undefined),
cont: d.cont || last.cont || '',
email: d.email || last.email || '',
web: d.web || last.web || '',
qsl_via: d.qsl_via || last.qsl_via || '',
};
});
@@ -3728,6 +3729,7 @@ export default function App() {
ituz: d.ituz ?? (r.ituz || undefined),
cont: d.cont || (r.cont ?? ''),
email: d.email || (r.email ?? ''),
web: d.web || (r.web ?? ''),
qsl_via: d.qsl_via || (r.qsl_via ?? ''),
}));
// Backfill anything the provider didn't supply from the last time we worked