const express = require('express'); const db = require('../db'); const asyncHandler = require('../middleware/asyncHandler'); const router = express.Router(); function validateAmount(amount) { return amount === null || amount === undefined || (Number.isFinite(parseFloat(amount)) && parseFloat(amount) >= 0); } router.get('/', asyncHandler(async (req, res) => { const rows = await db.all( `SELECT t.*, a.name AS anbieter_name FROM tarife t JOIN anbieter a ON t.anbieter_id = a.id ORDER BY a.name, t.name` ); res.json(rows); })); router.get('/:anbieter_id', asyncHandler(async (req, res) => { const { anbieter_id } = req.params; const rows = await db.all('SELECT * FROM tarife WHERE anbieter_id = ? ORDER BY name', [anbieter_id]); res.json(rows); })); router.post('/', asyncHandler(async (req, res) => { const { name, anbieter_id, provision_euro, beschreibung } = req.body || {}; if (!name || !name.trim()) { return res.status(400).json({ error: 'Tarifname ist erforderlich' }); } if (!anbieter_id) { return res.status(400).json({ error: 'Anbieter ist erforderlich' }); } if (!validateAmount(provision_euro)) { return res.status(400).json({ error: 'Provision muss eine positive Zahl sein' }); } try { const result = await db.run( `INSERT INTO tarife (name, anbieter_id, provision_euro, beschreibung) VALUES (?, ?, ?, ?)`, [name.trim(), anbieter_id, provision_euro || 0, beschreibung || null] ); res.json({ id: result.lastID, name: name.trim(), anbieter_id, provision_euro: provision_euro || 0, beschreibung: beschreibung || null, }); } catch (err) { if (/UNIQUE/.test(err.message)) { return res.status(400).json({ error: 'Tarif mit diesem Namen existiert bereits für diesen Anbieter' }); } throw err; } })); router.put('/:id', asyncHandler(async (req, res) => { const { id } = req.params; const { name, provision_euro, beschreibung } = req.body || {}; if (!name) return res.status(400).json({ error: 'Tarif-Name ist erforderlich' }); if (!validateAmount(provision_euro)) { return res.status(400).json({ error: 'Provision muss eine positive Zahl sein' }); } const result = await db.run( `UPDATE tarife SET name = ?, provision_euro = ?, beschreibung = ? WHERE id = ?`, [name, provision_euro || 0, beschreibung || null, id] ); if (result.changes === 0) return res.status(404).json({ error: 'Tarif nicht gefunden' }); res.json({ message: 'Tarif erfolgreich aktualisiert' }); })); router.delete('/:id', asyncHandler(async (req, res) => { const { id } = req.params; const used = await db.get( 'SELECT EXISTS(SELECT 1 FROM schaltungen WHERE tarif_id = ?) AS has_schaltungen', [id] ); if (used.has_schaltungen) { return res.status(400).json({ error: 'Tarif kann nicht gelöscht werden: Tarif wird in Schaltungen verwendet' }); } const result = await db.run('DELETE FROM tarife WHERE id = ?', [id]); if (result.changes === 0) return res.status(404).json({ error: 'Tarif nicht gefunden' }); res.json({ message: 'Tarif erfolgreich gelöscht' }); })); router.get('/:tarif_id/tarifoptionen', asyncHandler(async (req, res) => { const { tarif_id } = req.params; const rows = await db.all( 'SELECT * FROM tarifoptionen WHERE tarif_id = ? AND aktiv = 1 ORDER BY name', [tarif_id] ); res.json(rows); })); router.get('/:id/provisionsregeln', asyncHandler(async (req, res) => { const { id } = req.params; const rows = await db.all( `SELECT pr.*, t.name AS tarif_name, a.name AS anbieter_name FROM provisionsregeln pr JOIN tarife t ON pr.tarif_id = t.id JOIN anbieter a ON t.anbieter_id = a.id WHERE pr.tarif_id = ? AND pr.aktiv = 1 ORDER BY pr.gueltig_ab DESC`, [id] ); res.json(rows); })); router.put('/:id/mitarbeiter-provision', asyncHandler(async (req, res) => { const { id } = req.params; const { mitarbeiter_provision } = req.body || {}; const result = await db.run( 'UPDATE tarife SET mitarbeiter_provision = ? WHERE id = ?', [mitarbeiter_provision || 0, id] ); if (result.changes === 0) return res.status(404).json({ error: 'Tarif nicht gefunden' }); res.json({ message: 'Mitarbeiter-Provision erfolgreich aktualisiert' }); })); module.exports = router;