diff --git a/sync/src/db.ts b/sync/src/db.ts index 94a18b6..26a2bca 100644 --- a/sync/src/db.ts +++ b/sync/src/db.ts @@ -332,14 +332,21 @@ export async function syncAT20ToAtemschutz(pool: Pool): Promise { */ export async function syncUntersuchungenToAtemschutz(pool: Pool): Promise { // --- Leistungstest (Finnentest) --- + // Match both correct data (art='Atemschutz Leistungstest') and old bugged data + // where the scraper shifted columns (art='Finnen Test bestanden', anmerkungen='Atemschutz Leistungstest') const ltResult = await pool.query( `INSERT INTO atemschutz_traeger (id, user_id, leistungstest_datum, leistungstest_gueltig_bis, leistungstest_bestanden) - SELECT uuid_generate_v4(), u.user_id, u.max_datum, u.max_datum + INTERVAL '1 year', true + SELECT uuid_generate_v4(), u.user_id, u.max_datum, make_date(EXTRACT(YEAR FROM u.max_datum)::int + 1, 12, 31), true FROM ( SELECT user_id, MAX(datum) AS max_datum FROM untersuchungen - WHERE TRIM(art) = 'Atemschutz Leistungstest' - AND TRIM(ergebnis) ILIKE '%bestanden%' + WHERE ( + -- correct data (after scraper fix) + (TRIM(art) = 'Atemschutz Leistungstest' AND TRIM(ergebnis) ILIKE '%bestanden%') + OR + -- old bugged data (columns shifted: art has ergebnis, anmerkungen has art) + (TRIM(anmerkungen) = 'Atemschutz Leistungstest' AND TRIM(art) ILIKE '%bestanden%') + ) GROUP BY user_id ) u ON CONFLICT (user_id) DO UPDATE @@ -352,19 +359,27 @@ export async function syncUntersuchungenToAtemschutz(pool: Pool): Promise // --- Atemschutztauglichkeit (G26 medical exam) --- // Map FDISK ergebnis text to the DB enum (tauglich / bedingt_tauglich / nicht_tauglich) + // Also handle old bugged data where art/ergebnis columns were shifted const atResult = await pool.query( `INSERT INTO atemschutz_traeger (id, user_id, untersuchung_datum, untersuchung_ergebnis) SELECT uuid_generate_v4(), sub.user_id, sub.datum, CASE - WHEN sub.ergebnis ILIKE '%nicht%tauglich%' THEN 'nicht_tauglich' - WHEN sub.ergebnis ILIKE '%bedingt%tauglich%' THEN 'bedingt_tauglich' - WHEN sub.ergebnis ILIKE '%tauglich%' THEN 'tauglich' + WHEN sub.ergebnis_text ILIKE '%nicht%tauglich%' THEN 'nicht_tauglich' + WHEN sub.ergebnis_text ILIKE '%bedingt%tauglich%' THEN 'bedingt_tauglich' + WHEN sub.ergebnis_text ILIKE '%tauglich%' THEN 'tauglich' ELSE NULL END FROM ( - SELECT DISTINCT ON (user_id) user_id, datum, ergebnis + SELECT DISTINCT ON (user_id) user_id, datum, + CASE + -- correct data: ergebnis has the result text + WHEN TRIM(art) = 'Atemschutztauglichkeit' THEN ergebnis + -- bugged data: art has the result, anmerkungen has the real art + WHEN TRIM(anmerkungen) = 'Atemschutztauglichkeit' THEN art + ELSE ergebnis + END AS ergebnis_text FROM untersuchungen - WHERE TRIM(art) = 'Atemschutztauglichkeit' + WHERE (TRIM(art) = 'Atemschutztauglichkeit' OR TRIM(anmerkungen) = 'Atemschutztauglichkeit') AND datum IS NOT NULL ORDER BY user_id, datum DESC ) sub