From 59a0305a752fc7fc7463a6242be0ee0092edbf7d Mon Sep 17 00:00:00 2001 From: patrick Date: Thu, 6 Aug 2026 22:25:45 +0200 Subject: [PATCH] feat(reports): DATEV-Monatsblatt-Button im Zeiterfassungs-Tab MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Neuer Button "DATEV-Monatsblatt" neben CSV/Excel/PDF im time-Tab von ReportsPage. Nutzt den bestehenden Mitarbeiter-Filter + den Monat aus dateFrom, lädt GET /reports/datev-monthly/export als PDF herunter. Manager müssen einen einzelnen Mitarbeiter wählen (kein Sammel-Export möglich, da 1 Blatt = 1 Mitarbeiter/Monat). Co-Authored-By: Claude Sonnet 5 Claude-Session: https://claude.ai/code/session_01CviFgc739S89xS97pvjszj --- frontend/src/pages/ReportsPage.tsx | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/frontend/src/pages/ReportsPage.tsx b/frontend/src/pages/ReportsPage.tsx index 0c07628..5206e8a 100644 --- a/frontend/src/pages/ReportsPage.tsx +++ b/frontend/src/pages/ReportsPage.tsx @@ -200,6 +200,24 @@ export function ReportsPage() { a.download = `${type}_${dateFrom}_${dateTo}.${format}`; a.click() } + const downloadDatev = async () => { + if (isManager && !filterUser) { setError('DATEV-Monatsblatt: bitte oben einen einzelnen Mitarbeiter auswählen.'); return } + const uid = filterUser || user?.id + if (!uid) { setError('Bitte einen Mitarbeiter auswählen.'); return } + const d = new Date(dateFrom) + const year = d.getFullYear() + const month = d.getMonth() + 1 + const token = localStorage.getItem('access_token') + const res = await fetch( + `/api/v1/reports/datev-monthly/export?user_id=${uid}&year=${year}&month=${month}`, + { headers: { Authorization: `Bearer ${token}` } } + ) + if (!res.ok) { setError('DATEV-Export fehlgeschlagen'); return } + const blob = await res.blob() + const a = document.createElement('a'); a.href = URL.createObjectURL(blob) + a.download = `datev_stundenaufzeichnung_${year}_${String(month).padStart(2, '0')}.pdf`; a.click() + } + const setQuick = (from: string, to: string) => { setDateFrom(from); setDateTo(to) } const hasResult = !!(timeReport || absenceReport || overtimeReport || sickStats || payrollReport) @@ -317,6 +335,13 @@ export function ReportsPage() { )} + {type === 'time' && ( + + )}