featur add fahrmeister

This commit is contained in:
Matthias Hochmeister
2026-02-27 21:46:50 +01:00
parent da4a56ba6b
commit dbe4f52871
17 changed files with 426 additions and 152 deletions

View File

@@ -0,0 +1,110 @@
-- Migration 007: Authentik groups + vehicle inspection/service periods
-- Depends on: 001_create_users_table.sql, 005_create_fahrzeuge.sql
--
-- Changes:
-- 1. Add authentik_groups column to users (stores Authentik group memberships)
-- 2. Add paragraph57a_faellig_am + naechste_wartung_am to fahrzeuge
-- 3. Refresh the fahrzeuge_mit_pruefstatus view to expose the new columns
-- Rollback:
-- ALTER TABLE users DROP COLUMN IF EXISTS authentik_groups;
-- ALTER TABLE fahrzeuge DROP COLUMN IF EXISTS paragraph57a_faellig_am;
-- ALTER TABLE fahrzeuge DROP COLUMN IF EXISTS naechste_wartung_am;
-- ── 1. users: Authentik group memberships ─────────────────────────────────────
ALTER TABLE users
ADD COLUMN IF NOT EXISTS authentik_groups TEXT[] NOT NULL DEFAULT '{}';
COMMENT ON COLUMN users.authentik_groups IS
'Authentik group slugs synced on every login (e.g. dashboard_admin, fahrmeister)';
-- ── 2. fahrzeuge: §57a (Austrian periodic inspection) + service interval ──────
ALTER TABLE fahrzeuge
ADD COLUMN IF NOT EXISTS paragraph57a_faellig_am DATE;
COMMENT ON COLUMN fahrzeuge.paragraph57a_faellig_am IS
'§57a StVO periodic inspection due date (Austrian equivalent of HU/TÜV)';
ALTER TABLE fahrzeuge
ADD COLUMN IF NOT EXISTS naechste_wartung_am DATE;
COMMENT ON COLUMN fahrzeuge.naechste_wartung_am IS
'Next scheduled service / maintenance due date';
-- ── 3. Refresh view to expose new vehicle columns ─────────────────────────────
-- Drop and recreate since CREATE OR REPLACE on views requires identical column list.
DROP VIEW IF EXISTS fahrzeuge_mit_pruefstatus;
CREATE OR REPLACE VIEW fahrzeuge_mit_pruefstatus AS
WITH latest_pruefungen AS (
SELECT DISTINCT ON (fahrzeug_id, pruefung_art)
fahrzeug_id,
pruefung_art,
id AS pruefung_id,
faellig_am,
durchgefuehrt_am,
ergebnis,
naechste_faelligkeit,
pruefende_stelle,
CURRENT_DATE - faellig_am::date AS tage_ueberfaellig,
faellig_am::date - CURRENT_DATE AS tage_bis_faelligkeit
FROM fahrzeug_pruefungen
ORDER BY
fahrzeug_id,
pruefung_art,
(durchgefuehrt_am IS NULL) DESC,
faellig_am DESC
)
SELECT
f.id,
f.bezeichnung,
f.kurzname,
f.amtliches_kennzeichen,
f.fahrgestellnummer,
f.baujahr,
f.hersteller,
f.typ_schluessel,
f.besatzung_soll,
f.status,
f.status_bemerkung,
f.standort,
f.bild_url,
f.created_at,
f.updated_at,
-- §57a Austrian periodic inspection
f.paragraph57a_faellig_am,
f.paragraph57a_faellig_am::date - CURRENT_DATE AS paragraph57a_tage_bis_faelligkeit,
-- Next service/maintenance
f.naechste_wartung_am,
f.naechste_wartung_am::date - CURRENT_DATE AS wartung_tage_bis_faelligkeit,
-- Legacy pruefungen (HU / AU / UVV / Leiter) kept for backwards compat
hu.pruefung_id AS hu_pruefung_id,
hu.faellig_am AS hu_faellig_am,
hu.tage_bis_faelligkeit AS hu_tage_bis_faelligkeit,
hu.ergebnis AS hu_ergebnis,
au.pruefung_id AS au_pruefung_id,
au.faellig_am AS au_faellig_am,
au.tage_bis_faelligkeit AS au_tage_bis_faelligkeit,
au.ergebnis AS au_ergebnis,
uvv.pruefung_id AS uvv_pruefung_id,
uvv.faellig_am AS uvv_faellig_am,
uvv.tage_bis_faelligkeit AS uvv_tage_bis_faelligkeit,
uvv.ergebnis AS uvv_ergebnis,
leiter.pruefung_id AS leiter_pruefung_id,
leiter.faellig_am AS leiter_faellig_am,
leiter.tage_bis_faelligkeit AS leiter_tage_bis_faelligkeit,
leiter.ergebnis AS leiter_ergebnis,
-- Overall worst urgency: §57a + Wartung take precedence, legacy pruefungen kept
LEAST(
f.paragraph57a_faellig_am::date - CURRENT_DATE,
f.naechste_wartung_am::date - CURRENT_DATE,
hu.tage_bis_faelligkeit,
au.tage_bis_faelligkeit,
uvv.tage_bis_faelligkeit,
leiter.tage_bis_faelligkeit
) AS naechste_pruefung_tage
FROM
fahrzeuge f
LEFT JOIN latest_pruefungen hu ON hu.fahrzeug_id = f.id AND hu.pruefung_art = 'HU'
LEFT JOIN latest_pruefungen au ON au.fahrzeug_id = f.id AND au.pruefung_art = 'AU'
LEFT JOIN latest_pruefungen uvv ON uvv.fahrzeug_id = f.id AND uvv.pruefung_art = 'UVV'
LEFT JOIN latest_pruefungen leiter ON leiter.fahrzeug_id = f.id AND leiter.pruefung_art = 'Leiter';