/*
M0 Golden-Master Queries

Ziel:
- Fachliche Legacy-Ergebnisse exportieren, damit Migration und neue SaaS-App
  gegen denselben Stand verglichen werden können.

Ausführung:
- In der Legacy-Datenbank ausführen.
- Ergebnisse je Query als CSV speichern.
- Keine personenbezogenen Exporte ins Repo committen.
*/

DECLARE @CurrentYear int = YEAR(GETDATE());

-- 1. Teilnehmer-Basisdaten
SELECT
    m.MitarbeiterID,
    m.Name,
    m.Email,
    m.aktiv,
    m.admin
FROM kl_Mitarbeiter m
ORDER BY m.Name;

-- 2. Saldo je Teilnehmer
WITH payments AS (
    SELECT
        MitarbeiterID,
        SUM(Betrag) AS total_payments
    FROM kl_Einzahlungen
    GROUP BY MitarbeiterID
),
consumption AS (
    SELECT
        MitarbeiterID,
        SUM(Kosten) AS total_costs,
        SUM(AnzahlStriche) AS total_marks
    FROM kl_Kaffeeverbrauch
    GROUP BY MitarbeiterID
)
SELECT
    m.MitarbeiterID,
    m.Name,
    m.Email,
    COALESCE(p.total_payments, 0) AS total_payments,
    COALESCE(c.total_costs, 0) AS total_costs,
    COALESCE(c.total_marks, 0) AS total_marks,
    COALESCE(p.total_payments, 0) - COALESCE(c.total_costs, 0) AS balance
FROM kl_Mitarbeiter m
LEFT JOIN payments p ON p.MitarbeiterID = m.MitarbeiterID
LEFT JOIN consumption c ON c.MitarbeiterID = m.MitarbeiterID
ORDER BY m.Name;

-- 3. Jahreswerte je Teilnehmer
WITH year_payments AS (
    SELECT
        MitarbeiterID,
        SUM(Betrag) AS year_payments
    FROM kl_Einzahlungen
    WHERE YEAR(Datum) = @CurrentYear
    GROUP BY MitarbeiterID
),
year_consumption AS (
    SELECT
        MitarbeiterID,
        SUM(Kosten) AS year_costs,
        SUM(AnzahlStriche) AS year_marks
    FROM kl_Kaffeeverbrauch
    WHERE YEAR(Datum) = @CurrentYear
    GROUP BY MitarbeiterID
)
SELECT
    m.MitarbeiterID,
    m.Name,
    m.Email,
    COALESCE(yp.year_payments, 0) AS year_payments,
    COALESCE(yc.year_costs, 0) AS year_costs,
    COALESCE(yc.year_marks, 0) AS year_marks
FROM kl_Mitarbeiter m
LEFT JOIN year_payments yp ON yp.MitarbeiterID = m.MitarbeiterID
LEFT JOIN year_consumption yc ON yc.MitarbeiterID = m.MitarbeiterID
ORDER BY m.Name;

-- 4. Letzte Einzahlungen je Teilnehmer
SELECT
    e.EinzahlungsID,
    e.MitarbeiterID,
    m.Name,
    m.Email,
    e.Betrag,
    e.Datum
FROM kl_Einzahlungen e
JOIN kl_Mitarbeiter m ON m.MitarbeiterID = e.MitarbeiterID
ORDER BY e.Datum DESC, e.EinzahlungsID DESC;

-- 5. Letzte Strich-/Verbrauchseinträge je Teilnehmer
SELECT
    v.VerbrauchID,
    v.MitarbeiterID,
    m.Name,
    m.Email,
    v.AnzahlStriche,
    v.Kosten,
    v.KostenproStrich,
    v.Datum,
    v.Eintragsart
FROM kl_Kaffeeverbrauch v
JOIN kl_Mitarbeiter m ON m.MitarbeiterID = v.MitarbeiterID
ORDER BY v.Datum DESC, v.VerbrauchID DESC;

-- 6. Aktuelle Konfiguration
SELECT
    *
FROM kl_config;

-- 7. Aktuelle und historische Hinweise
SELECT
    id,
    nachricht,
    gueltig_bis
FROM kl_hinweise
ORDER BY gueltig_bis DESC;

-- 8. 100-Tage-Vorderseite analog Legacy-Stricherfassung
DECLARE @ReferenceDate date = (
    SELECT MAX(CAST(Datum AS date))
    FROM kl_Kaffeeverbrauch
    WHERE Datum < CAST(GETDATE() AS date)
);

SELECT
    m.MitarbeiterID,
    m.Name,
    m.Email,
    SUM(v.AnzahlStriche) AS marks_in_window
FROM kl_Mitarbeiter m
JOIN kl_Kaffeeverbrauch v ON m.MitarbeiterID = v.MitarbeiterID
WHERE v.Datum >= DATEADD(DAY, -100, @ReferenceDate)
  AND m.aktiv = 1
GROUP BY m.MitarbeiterID, m.Name, m.Email
HAVING SUM(v.AnzahlStriche) >= 10
ORDER BY m.Name;

-- 9. 100-Tage-Rückseite analog Legacy-Stricherfassung
SELECT
    m.MitarbeiterID,
    m.Name,
    m.Email,
    COALESCE(SUM(v.AnzahlStriche), 0) AS marks_in_window
FROM kl_Mitarbeiter m
LEFT JOIN kl_Kaffeeverbrauch v
    ON m.MitarbeiterID = v.MitarbeiterID
   AND v.Datum >= DATEADD(DAY, -100, @ReferenceDate)
WHERE m.aktiv = 1
GROUP BY m.MitarbeiterID, m.Name, m.Email
HAVING COALESCE(SUM(v.AnzahlStriche), 0) < 10
ORDER BY m.Name;

-- 10. CSV-Import-Dublettenbasis
SELECT
    e.MitarbeiterID,
    m.Name,
    e.Betrag,
    CONVERT(varchar, e.Datum, 23) AS booking_day,
    COUNT(*) AS duplicates_per_day
FROM kl_Einzahlungen e
JOIN kl_Mitarbeiter m ON m.MitarbeiterID = e.MitarbeiterID
GROUP BY e.MitarbeiterID, m.Name, e.Betrag, CONVERT(varchar, e.Datum, 23)
HAVING COUNT(*) > 1
ORDER BY booking_day DESC, m.Name;

-- 11. Jahresauswertung: Gesamtstriche aktuelles Jahr
SELECT
    m.MitarbeiterID,
    m.Name,
    m.Email,
    SUM(v.AnzahlStriche) AS GesamtStriche
FROM kl_Kaffeeverbrauch v
JOIN kl_Mitarbeiter m ON v.MitarbeiterID = m.MitarbeiterID
WHERE YEAR(v.Datum) = @CurrentYear
  AND m.aktiv = 1
GROUP BY m.MitarbeiterID, m.Name, m.Email
ORDER BY GesamtStriche DESC, m.Name;
