feat(rda): measure the two district sources before arbitrating between them
A log imported from HAMLOG.online carries the Russian district in CNTY, and the offline RDA database has its own answer for the same contact. Which wins is a real question — but only if the two are independent. If HAMLOG's value is itself a lookup in the same kind of database, there is nothing to arbitrate and a precedence rule would be ceremony around a redundancy. So this measures instead of deciding: Settings → RDA gains a read-only compare that reports agreements, disagreements, and the contacts where only one side knows, then lists the disagreements — callsign, date, both districts, whether the database answer was a DATED record (the award administrators' own fact) or the callsign's current district (an assumption), and whether the QSO is confirmed on HAMLOG (their value has then been through a match of two logs). It changes nothing in the log. What to do about a conflict is the next decision, and it should be taken with the operator's own numbers in hand. Also: the four HAMLOG fields become filterable, so 'never sent there' is a filter rather than a guess. A field that can be written and not read back is half a feature — pinned by a test against the bulk-editable list.
This commit is contained in:
Vendored
+2
@@ -127,6 +127,8 @@ export function ClusterSpotStatuses(arg1:Array<main.SpotQuery>):Promise<Array<ma
|
||||
|
||||
export function CompactDatabase(arg1:string):Promise<main.CompactResult>;
|
||||
|
||||
export function CompareRDASources():Promise<main.RDACompareResult>;
|
||||
|
||||
export function ComputeQSOAwardRefs(arg1:qso.QSO):Promise<Array<main.QSOAwardRef>>;
|
||||
|
||||
export function ComputeStationInfo(arg1:string,arg2:string):Promise<main.StationInfoComputed>;
|
||||
|
||||
@@ -194,6 +194,10 @@ export function CompactDatabase(arg1) {
|
||||
return window['go']['main']['App']['CompactDatabase'](arg1);
|
||||
}
|
||||
|
||||
export function CompareRDASources() {
|
||||
return window['go']['main']['App']['CompareRDASources']();
|
||||
}
|
||||
|
||||
export function ComputeQSOAwardRefs(arg1) {
|
||||
return window['go']['main']['App']['ComputeQSOAwardRefs'](arg1);
|
||||
}
|
||||
|
||||
@@ -3229,6 +3229,79 @@ export namespace main {
|
||||
this.team_last60 = source["team_last60"];
|
||||
}
|
||||
}
|
||||
export class RDAConflict {
|
||||
qso_id: number;
|
||||
callsign: string;
|
||||
date: string;
|
||||
band: string;
|
||||
mode: string;
|
||||
from_log: string;
|
||||
from_db: string;
|
||||
dated: boolean;
|
||||
confirmed: boolean;
|
||||
|
||||
static createFrom(source: any = {}) {
|
||||
return new RDAConflict(source);
|
||||
}
|
||||
|
||||
constructor(source: any = {}) {
|
||||
if ('string' === typeof source) source = JSON.parse(source);
|
||||
this.qso_id = source["qso_id"];
|
||||
this.callsign = source["callsign"];
|
||||
this.date = source["date"];
|
||||
this.band = source["band"];
|
||||
this.mode = source["mode"];
|
||||
this.from_log = source["from_log"];
|
||||
this.from_db = source["from_db"];
|
||||
this.dated = source["dated"];
|
||||
this.confirmed = source["confirmed"];
|
||||
}
|
||||
}
|
||||
export class RDACompareResult {
|
||||
scanned: number;
|
||||
both_known: number;
|
||||
agree: number;
|
||||
disagree: number;
|
||||
only_log: number;
|
||||
only_db: number;
|
||||
neither: number;
|
||||
conflicts: RDAConflict[];
|
||||
|
||||
static createFrom(source: any = {}) {
|
||||
return new RDACompareResult(source);
|
||||
}
|
||||
|
||||
constructor(source: any = {}) {
|
||||
if ('string' === typeof source) source = JSON.parse(source);
|
||||
this.scanned = source["scanned"];
|
||||
this.both_known = source["both_known"];
|
||||
this.agree = source["agree"];
|
||||
this.disagree = source["disagree"];
|
||||
this.only_log = source["only_log"];
|
||||
this.only_db = source["only_db"];
|
||||
this.neither = source["neither"];
|
||||
this.conflicts = this.convertValues(source["conflicts"], RDAConflict);
|
||||
}
|
||||
|
||||
convertValues(a: any, classs: any, asMap: boolean = false): any {
|
||||
if (!a) {
|
||||
return a;
|
||||
}
|
||||
if (a.slice && a.map) {
|
||||
return (a as any[]).map(elem => this.convertValues(elem, classs));
|
||||
} else if ("object" === typeof a) {
|
||||
if (asMap) {
|
||||
for (const key of Object.keys(a)) {
|
||||
a[key] = new classs(a[key]);
|
||||
}
|
||||
return a;
|
||||
}
|
||||
return new classs(a);
|
||||
}
|
||||
return a;
|
||||
}
|
||||
}
|
||||
|
||||
export class RelayAutoRule {
|
||||
device_id: string;
|
||||
relay: number;
|
||||
|
||||
Reference in New Issue
Block a user