change dat format in member overview, sync exams to atemschutz tool, rework member detail page
This commit is contained in:
@@ -349,8 +349,7 @@ export async function syncLehrgangToAtemschutz(pool: Pool): Promise<void> {
|
||||
SET atemschutz_lehrgang = true,
|
||||
lehrgang_theorie_only = true,
|
||||
lehrgang_datum = COALESCE(atemschutz_traeger.lehrgang_datum, EXCLUDED.lehrgang_datum),
|
||||
updated_at = NOW()
|
||||
WHERE atemschutz_traeger.lehrgang_theorie_only IS DISTINCT FROM false`
|
||||
updated_at = NOW()`
|
||||
);
|
||||
log(`Lehrgang-Sync: ${theorieResult.rowCount ?? 0} theory-only lehrgang rows upserted`);
|
||||
}
|
||||
@@ -388,14 +387,21 @@ export async function syncUntersuchungenToAtemschutz(pool: Pool): Promise<void>
|
||||
);
|
||||
log(`Untersuchungen→Atemschutz: ${ltResult.rowCount ?? 0} Leistungstest rows synced`);
|
||||
|
||||
// --- 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
|
||||
// --- Atemschutztauglichkeitsuntersuchung ---
|
||||
// Take the latest PASSED exam per user, calculate gueltig_bis (default 5 years,
|
||||
// overridden by "N Jahre" in anmerkungen field, e.g. "3 Jahre").
|
||||
// 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)
|
||||
`INSERT INTO atemschutz_traeger (id, user_id, untersuchung_datum, untersuchung_gueltig_bis, untersuchung_ergebnis)
|
||||
SELECT uuid_generate_v4(), sub.user_id, sub.datum,
|
||||
sub.datum + make_interval(years =>
|
||||
CASE
|
||||
WHEN sub.real_anmerkungen ~ '(\\d+)\\s*[Jj]ahre'
|
||||
THEN (regexp_match(sub.real_anmerkungen, '(\\d+)\\s*[Jj]ahre'))[1]::int
|
||||
ELSE 5
|
||||
END
|
||||
),
|
||||
CASE
|
||||
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
|
||||
@@ -403,20 +409,30 @@ export async function syncUntersuchungenToAtemschutz(pool: Pool): Promise<void>
|
||||
FROM (
|
||||
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
|
||||
END AS ergebnis_text,
|
||||
CASE
|
||||
WHEN TRIM(art) = 'Atemschutztauglichkeit' THEN anmerkungen
|
||||
ELSE NULL
|
||||
END AS real_anmerkungen
|
||||
FROM untersuchungen
|
||||
WHERE (TRIM(art) = 'Atemschutztauglichkeit' OR TRIM(anmerkungen) = 'Atemschutztauglichkeit')
|
||||
AND datum IS NOT NULL
|
||||
AND (
|
||||
-- correct data: ergebnis has the result — must be tauglich (not "nicht tauglich")
|
||||
(TRIM(art) = 'Atemschutztauglichkeit' AND ergebnis ILIKE '%tauglich%' AND ergebnis NOT ILIKE '%nicht%tauglich%')
|
||||
OR
|
||||
-- bugged data: art has the result
|
||||
(TRIM(anmerkungen) = 'Atemschutztauglichkeit' AND art ILIKE '%tauglich%' AND art NOT ILIKE '%nicht%tauglich%')
|
||||
)
|
||||
ORDER BY user_id, datum DESC
|
||||
) sub
|
||||
ON CONFLICT (user_id) DO UPDATE
|
||||
SET untersuchung_datum = EXCLUDED.untersuchung_datum,
|
||||
untersuchung_ergebnis = COALESCE(EXCLUDED.untersuchung_ergebnis, atemschutz_traeger.untersuchung_ergebnis),
|
||||
SET untersuchung_datum = EXCLUDED.untersuchung_datum,
|
||||
untersuchung_gueltig_bis = EXCLUDED.untersuchung_gueltig_bis,
|
||||
untersuchung_ergebnis = COALESCE(EXCLUDED.untersuchung_ergebnis, atemschutz_traeger.untersuchung_ergebnis),
|
||||
updated_at = NOW()`
|
||||
);
|
||||
log(`Untersuchungen→Atemschutz: ${atResult.rowCount ?? 0} Atemschutztauglichkeit rows synced`);
|
||||
|
||||
Reference in New Issue
Block a user