Add export routes to backend and frontend; implement routing and UI components for data export management

This commit is contained in:
Torsten Schulz (local)
2025-10-18 00:00:34 +02:00
parent ac3720fb61
commit 6a519fc4d4
7 changed files with 796 additions and 0 deletions

View File

@@ -0,0 +1,91 @@
const ExportService = require('../services/ExportService');
/**
* Controller für Daten-Export
* Verarbeitet HTTP-Requests und delegiert an ExportService
*/
class ExportController {
/**
* Exportiert Daten als CSV
*/
async exportCSV(req, res) {
try {
const userId = req.user?.id || 1;
const { startDate, endDate } = req.query;
if (!startDate || !endDate) {
return res.status(400).json({
message: 'Start- und Enddatum sind erforderlich'
});
}
const csv = await ExportService.exportCSV(userId, startDate, endDate);
res.setHeader('Content-Type', 'text/csv; charset=utf-8');
res.setHeader('Content-Disposition', `attachment; filename="zeiterfassung_${startDate}_${endDate}.csv"`);
res.send(csv);
} catch (error) {
console.error('Fehler beim CSV-Export:', error);
res.status(500).json({
message: 'Fehler beim Export',
error: error.message
});
}
}
/**
* Exportiert Daten als Excel
*/
async exportExcel(req, res) {
try {
const userId = req.user?.id || 1;
const { startDate, endDate } = req.query;
if (!startDate || !endDate) {
return res.status(400).json({
message: 'Start- und Enddatum sind erforderlich'
});
}
const excel = await ExportService.exportExcel(userId, startDate, endDate);
res.setHeader('Content-Type', 'text/csv; charset=utf-8');
res.setHeader('Content-Disposition', `attachment; filename="zeiterfassung_${startDate}_${endDate}.csv"`);
res.send(excel);
} catch (error) {
console.error('Fehler beim Excel-Export:', error);
res.status(500).json({
message: 'Fehler beim Export',
error: error.message
});
}
}
/**
* Exportiert Daten für PDF (gibt JSON zurück, PDF wird im Frontend generiert)
*/
async exportPDF(req, res) {
try {
const userId = req.user?.id || 1;
const { startDate, endDate } = req.query;
if (!startDate || !endDate) {
return res.status(400).json({
message: 'Start- und Enddatum sind erforderlich'
});
}
const data = await ExportService.exportPDFData(userId, startDate, endDate);
res.json(data);
} catch (error) {
console.error('Fehler beim PDF-Export:', error);
res.status(500).json({
message: 'Fehler beim Export',
error: error.message
});
}
}
}
module.exports = new ExportController();