d5bd359802
- Statistik gilt jetzt für alle Kuppeln gemeinsam (kein Kuppel-Filter mehr) - Neue Tabellenstruktur: Besucher (RF/SF/SonF/PrF/ToT/Gesamt) | Anzahl (Führ./Beob./TD/Sonst./BEOS/ToT/Gesamt) - Anzahl zählt Einträge (COUNT(*)) statt distinkte Tage - Zusammenfassungskacheln auf 2 reduziert (Besucher + Führungen gesamt) - Fix: Besucher-State wird zurückgesetzt wenn ArtFuehrung auf TD/BEOS wechselt Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
78 lines
3.5 KiB
TypeScript
78 lines
3.5 KiB
TypeScript
import { NextRequest, NextResponse } from 'next/server';
|
|
import { query } from '@/lib/db';
|
|
import { getSession } from '@/lib/session';
|
|
|
|
export async function GET(request: NextRequest) {
|
|
const session = await getSession();
|
|
if (!session) return NextResponse.json({ error: 'Nicht angemeldet' }, { status: 401 });
|
|
|
|
const { searchParams } = new URL(request.url);
|
|
const year = parseInt(searchParams.get('year') || String(new Date().getFullYear()), 10);
|
|
|
|
try {
|
|
const monthlyRows = await query(
|
|
'SELECT' +
|
|
' MONTH(Beginn) AS monat,' +
|
|
" COUNT(CASE WHEN ArtFuehrung IN ('RF','SF','SonF','PrF') THEN 1 END) AS tageFuehrungen," +
|
|
" COUNT(CASE WHEN ArtFuehrung = 'Beob' THEN 1 END) AS tageBeob," +
|
|
" COUNT(CASE WHEN ArtFuehrung = 'TD' THEN 1 END) AS tageTD," +
|
|
" COUNT(CASE WHEN ArtFuehrung = 'Sonst' THEN 1 END) AS tageSonst," +
|
|
" COUNT(CASE WHEN ArtFuehrung = 'BEOS' THEN 1 END) AS tageBEOS," +
|
|
" COUNT(CASE WHEN ArtFuehrung = 'ToT' THEN 1 END) AS tagesToT," +
|
|
" COUNT(CASE WHEN ArtFuehrung IN ('RF','SF','SonF','PrF','Beob','TD','Sonst','BEOS','ToT') THEN 1 END) AS tageGesamt," +
|
|
" SUM(CASE WHEN ArtFuehrung = 'RF' THEN Besucher ELSE 0 END) AS besucherRF," +
|
|
" SUM(CASE WHEN ArtFuehrung = 'SF' THEN Besucher ELSE 0 END) AS besucherSF," +
|
|
" SUM(CASE WHEN ArtFuehrung = 'SonF' THEN Besucher ELSE 0 END) AS besucherSonF," +
|
|
" SUM(CASE WHEN ArtFuehrung = 'PrF' THEN Besucher ELSE 0 END) AS besucherPrF," +
|
|
" SUM(CASE WHEN ArtFuehrung = 'ToT' THEN Besucher ELSE 0 END) AS besucherToT," +
|
|
" SUM(CASE WHEN ArtFuehrung IN ('RF','SF','SonF','PrF','ToT') THEN Besucher ELSE 0 END) AS besucherGesamt" +
|
|
' FROM logbuch' +
|
|
' WHERE YEAR(Beginn) = ?' +
|
|
' GROUP BY MONTH(Beginn)' +
|
|
' ORDER BY monat',
|
|
[year]
|
|
) as {
|
|
monat: number;
|
|
tageFuehrungen: number; tageBeob: number; tageTD: number; tageSonst: number; tageBEOS: number; tagesToT: number; tageGesamt: number;
|
|
besucherRF: number; besucherSF: number; besucherSonF: number; besucherPrF: number;
|
|
besucherToT: number; besucherGesamt: number;
|
|
}[];
|
|
|
|
const cumulativeRows = await query(
|
|
"SELECT SUM(CASE WHEN ArtFuehrung IN ('RF','SF','SonF','PrF','ToT') THEN Besucher ELSE 0 END) AS total" +
|
|
' FROM logbuch WHERE YEAR(Beginn) = ?',
|
|
[year]
|
|
) as { total: number | null }[];
|
|
|
|
const tageRows = await query(
|
|
"SELECT COUNT(*) AS tage FROM logbuch WHERE YEAR(Beginn) = ? AND ArtFuehrung IN ('RF','SF','SonF','PrF','Beob','TD','Sonst','BEOS','ToT')",
|
|
[year]
|
|
) as { tage: number }[];
|
|
|
|
return NextResponse.json({
|
|
monthly: monthlyRows.map((r) => ({
|
|
monat: Number(r.monat),
|
|
tageFuehrungen: Number(r.tageFuehrungen),
|
|
tageBeob: Number(r.tageBeob),
|
|
tageTD: Number(r.tageTD),
|
|
tageSonst: Number(r.tageSonst),
|
|
tageBEOS: Number(r.tageBEOS),
|
|
tagesToT: Number(r.tagesToT),
|
|
tageGesamt: Number(r.tageGesamt),
|
|
besucherRF: Number(r.besucherRF),
|
|
besucherSF: Number(r.besucherSF),
|
|
besucherSonF: Number(r.besucherSonF),
|
|
besucherPrF: Number(r.besucherPrF),
|
|
besucherToT: Number(r.besucherToT),
|
|
besucherGesamt: Number(r.besucherGesamt),
|
|
})),
|
|
cumulative: Number(cumulativeRows[0]?.total ?? 0),
|
|
tage: Number(tageRows[0]?.tage ?? 0),
|
|
year,
|
|
});
|
|
} catch (error) {
|
|
console.error('GET /api/statistik:', error);
|
|
return NextResponse.json({ error: 'Datenbankfehler' }, { status: 500 });
|
|
}
|
|
}
|