feat: add account hierarchy, budget types (GWG/Anlagen/Instandhaltung), and Buchhaltung UI overhaul with collapsible tree, pending badge, and konto detail page

This commit is contained in:
Matthias Hochmeister
2026-03-30 09:49:28 +02:00
parent bc39963746
commit 0c5432b50e
9 changed files with 673 additions and 116 deletions

View File

@@ -127,6 +127,42 @@ class BuchhaltungController {
}
}
async getKontenTree(req: Request, res: Response): Promise<void> {
const haushaltsjahrId = req.query.haushaltsjahr_id ? parseInt(req.query.haushaltsjahr_id as string, 10) : undefined;
if (!haushaltsjahrId || isNaN(haushaltsjahrId)) { res.status(400).json({ success: false, message: 'haushaltsjahr_id erforderlich' }); return; }
try {
const tree = await buchhaltungService.getKontenTree(haushaltsjahrId);
res.json(tree);
} catch (error) {
logger.error('BuchhaltungController.getKontenTree', { error });
res.status(500).json({ error: 'Fehler beim Laden des Kontenbaums' });
}
}
async getKontoDetail(req: Request, res: Response): Promise<void> {
const id = parseInt(param(req, 'id'), 10);
if (isNaN(id)) { res.status(400).json({ success: false, message: 'Ungültige ID' }); return; }
try {
const detail = await buchhaltungService.getKontoDetail(id);
if (!detail) { res.status(404).json({ error: 'Konto nicht gefunden' }); return; }
res.json(detail);
} catch (error) {
logger.error('BuchhaltungController.getKontoDetail', { error });
res.status(500).json({ error: 'Fehler beim Laden des Kontos' });
}
}
async getPendingCount(req: Request, res: Response): Promise<void> {
try {
const haushaltsjahrId = req.query.haushaltsjahr_id ? parseInt(req.query.haushaltsjahr_id as string, 10) : undefined;
const count = await buchhaltungService.getPendingCount(haushaltsjahrId);
res.json({ count });
} catch (error) {
logger.error('BuchhaltungController.getPendingCount', { error });
res.status(500).json({ error: 'Fehler' });
}
}
async createKonto(req: Request, res: Response): Promise<void> {
try {
const data = await buchhaltungService.createKonto(req.body, req.user!.id);