refactor(mitglieder): replace legacy status values (passiv/anwärter/ausgetreten/…) with aktiv/kind/jugend/reserve across backend, frontend, and sync

This commit is contained in:
Matthias Hochmeister
2026-04-15 19:43:18 +02:00
parent c1de8bd163
commit 260b71baf8
11 changed files with 84 additions and 67 deletions

View File

@@ -33,6 +33,20 @@ async function dumpHtml(frame: Frame, label: string): Promise<void> {
}
}
/**
* Maps a raw FDISK status string to a dashboard status value.
* Returns null for unknown/unneeded statuses — those members should be skipped.
*/
function mapFdiskStatus(raw: string): 'aktiv' | 'kind' | 'jugend' | 'reserve' | null {
switch (raw.trim()) {
case 'Aktiv': return 'aktiv';
case 'Kind': return 'kind';
case 'Jugend': return 'jugend';
case 'Reserve': return 'reserve';
default: return null;
}
}
function log(msg: string) {
console.log(`[scraper] ${new Date().toISOString()} ${msg}`);
}
@@ -153,6 +167,8 @@ async function scrapeKnownMembers(
const members: FdiskMember[] = [];
for (const row of allRows) {
if (!row.standesbuchNr || !row.vorname || !row.zuname) continue;
const status = mapFdiskStatus(row.status);
if (!status) continue; // skip members with non-synced statuses
const abmeldedatum = parseDate(row.abmeldedatum);
members.push({
standesbuchNr: row.standesbuchNr,
@@ -163,7 +179,7 @@ async function scrapeKnownMembers(
svnr: row.svnr || null,
eintrittsdatum: parseDate(row.eintrittsdatum),
abmeldedatum,
status: abmeldedatum ? 'ausgetreten' : 'aktiv',
status,
detailUrl: row.href,
geburtsort: null,
geschlecht: null,
@@ -593,6 +609,8 @@ async function scrapeMembers(frame: Frame): Promise<FdiskMember[]> {
const members: FdiskMember[] = [];
for (const row of allRows) {
if (!row.standesbuchNr || !row.vorname || !row.zuname) continue;
const status = mapFdiskStatus(row.status);
if (!status) continue; // skip members with non-synced statuses
const abmeldedatum = parseDate(row.abmeldedatum);
members.push({
standesbuchNr: row.standesbuchNr,
@@ -603,7 +621,7 @@ async function scrapeMembers(frame: Frame): Promise<FdiskMember[]> {
svnr: row.svnr || null,
eintrittsdatum: parseDate(row.eintrittsdatum),
abmeldedatum,
status: abmeldedatum ? 'ausgetreten' : 'aktiv',
status,
detailUrl: row.href,
geburtsort: null,
geschlecht: null,

View File

@@ -7,8 +7,8 @@ export interface FdiskMember {
svnr: string | null;
eintrittsdatum: string | null;
abmeldedatum: string | null;
/** 'aktiv' if no Abmeldedatum, 'ausgetreten' otherwise */
status: 'aktiv' | 'ausgetreten';
/** Status mapped from FDISK column: Aktiv/Kind/Jugend/Reserve */
status: 'aktiv' | 'kind' | 'jugend' | 'reserve';
/** URL or identifier to navigate to the member detail page */
detailUrl: string | null;
/** Additional profile fields scraped from the detail form */