feat(lotw): let the download cover every callsign on the account

The download passes qso_owncall so one profile does not pull another's
confirmations. That scope also hides them: a QSO made as F4BPO/P is confirmed at
LoTW and can never come back to an F4BPO profile, so it stays unconfirmed here
for good while the ARRL counts it — found while reconciling a DXCC account
against the panel, where it was the whole of the CW gap (Jersey, worked as
F4BPO/P).

Off by default: the scope is right for anyone whose profiles are separate
stations.
This commit is contained in:
2026-08-27 22:43:46 +02:00
parent 8865af35fd
commit 4366083152
6 changed files with 52 additions and 3 deletions
+22
View File
@@ -402,6 +402,7 @@ const (
keyExtLoTWTQSLPath = "extsvc.lotw.tqsl_path"
keyExtLoTWStationLoc = "extsvc.lotw.station_location"
keyExtLoTWAllCalls = "extsvc.lotw.download_all_calls" // download confirmations for EVERY call on the account, not just this profile's
keyExtLoTWForceCall = "extsvc.lotw.force_station_callsign" // override STATION_CALLSIGN at sign time (e.g. F4BPO/P on the F4BPO cert)
keyExtLoTWKeyPassword = "extsvc.lotw.key_password"
keyExtLoTWUploadFlag = "extsvc.lotw.upload_flag" // legacy single flag (migrated to upload_flags)
@@ -12096,6 +12097,17 @@ func manualRefFor(existing, code string) string {
return ""
}
// GetLoTWDownloadAllCalls reports whether the LoTW download ignores the
// profile's own call and pulls every callsign on the account.
func (a *App) GetLoTWDownloadAllCalls() bool {
return a.settingOr(keyExtLoTWAllCalls, "") == "1"
}
// SetLoTWDownloadAllCalls stores that choice.
func (a *App) SetLoTWDownloadAllCalls(on bool) {
a.setSetting(keyExtLoTWAllCalls, map[bool]string{true: "1", false: "0"}[on])
}
// DownloadConfirmations pulls confirmed QSOs from a service and updates the
// matching local QSOs' received status. LoTW only for now (the canonical
// confirmation system); runs in the background emitting the same
@@ -12167,6 +12179,16 @@ func (a *App) runDownloadConfirmations(ctx context.Context, svc extsvc.Service,
case extsvc.ServiceLoTW:
sinceDate := resolveSince(keyExtLoTWLastDownload)
ownCall := a.uploadOwnerCall(extsvc.ServiceLoTW)
// A LoTW account holds every call its owner operates — F4BPO, F4BPO/P,
// TM2Q — and the download is normally scoped to the profile's own call so
// one profile does not pull another's confirmations. That scope also
// silently hides them: a QSO made as F4BPO/P is confirmed at LoTW and can
// never be downloaded from the F4BPO profile, so it stays unconfirmed here
// for good while the ARRL counts it. Off by default, because the scope is
// right for anyone whose profiles are separate stations.
if a.settingOr(keyExtLoTWAllCalls, "") == "1" {
ownCall = ""
}
callLabel := ownCall
if callLabel == "" {
callLabel = "all callsigns"