feat(buchhaltung): add transfers, bank statements, Haushaltsplan, and PDF export
This commit is contained in:
@@ -201,6 +201,23 @@ class BuchhaltungController {
|
||||
}
|
||||
}
|
||||
|
||||
async getBankkontoStatement(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 filters = {
|
||||
von: req.query.von as string | undefined,
|
||||
bis: req.query.bis as string | undefined,
|
||||
};
|
||||
const data = await buchhaltungService.getBankkontoStatement(id, filters);
|
||||
if (!data) { res.status(404).json({ success: false, message: 'Bankkonto nicht gefunden' }); return; }
|
||||
res.json({ success: true, data });
|
||||
} catch (error) {
|
||||
logger.error('BuchhaltungController.getBankkontoStatement', { error });
|
||||
res.status(500).json({ success: false, message: 'Kontoauszug konnte nicht geladen werden' });
|
||||
}
|
||||
}
|
||||
|
||||
// ── Konten ───────────────────────────────────────────────────────────────────
|
||||
|
||||
async listKonten(req: Request, res: Response): Promise<void> {
|
||||
@@ -411,6 +428,18 @@ class BuchhaltungController {
|
||||
}
|
||||
}
|
||||
|
||||
// ── Transfers ─────────────────────────────────────────────────────────────────
|
||||
|
||||
async createTransfer(req: Request, res: Response): Promise<void> {
|
||||
try {
|
||||
const data = await buchhaltungService.createTransfer(req.body, req.user!.id);
|
||||
res.status(201).json({ success: true, data });
|
||||
} catch (error) {
|
||||
logger.error('BuchhaltungController.createTransfer', { error });
|
||||
res.status(500).json({ success: false, message: 'Umbuchung konnte nicht erstellt werden' });
|
||||
}
|
||||
}
|
||||
|
||||
// ── Belege ───────────────────────────────────────────────────────────────────
|
||||
|
||||
async uploadBeleg(req: Request, res: Response): Promise<void> {
|
||||
@@ -566,6 +595,128 @@ class BuchhaltungController {
|
||||
}
|
||||
}
|
||||
|
||||
// ── Planung ─────────────────────────────────────────────────────────────────
|
||||
|
||||
async listPlanungen(_req: Request, res: Response): Promise<void> {
|
||||
try {
|
||||
const data = await buchhaltungService.listPlanungen();
|
||||
res.json({ success: true, data });
|
||||
} catch (error) {
|
||||
logger.error('BuchhaltungController.listPlanungen', { error });
|
||||
res.status(500).json({ success: false, message: 'Planungen konnten nicht geladen werden' });
|
||||
}
|
||||
}
|
||||
|
||||
async getPlanung(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 data = await buchhaltungService.getPlanungById(id);
|
||||
if (!data) { res.status(404).json({ success: false, message: 'Planung nicht gefunden' }); return; }
|
||||
res.json({ success: true, data });
|
||||
} catch (error) {
|
||||
logger.error('BuchhaltungController.getPlanung', { error });
|
||||
res.status(500).json({ success: false, message: 'Planung konnte nicht geladen werden' });
|
||||
}
|
||||
}
|
||||
|
||||
async createPlanung(req: Request, res: Response): Promise<void> {
|
||||
try {
|
||||
const data = await buchhaltungService.createPlanung(req.body, req.user!.id);
|
||||
res.status(201).json({ success: true, data });
|
||||
} catch (error) {
|
||||
logger.error('BuchhaltungController.createPlanung', { error });
|
||||
res.status(500).json({ success: false, message: 'Planung konnte nicht erstellt werden' });
|
||||
}
|
||||
}
|
||||
|
||||
async updatePlanung(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 data = await buchhaltungService.updatePlanung(id, req.body);
|
||||
if (!data) { res.status(404).json({ success: false, message: 'Planung nicht gefunden' }); return; }
|
||||
res.json({ success: true, data });
|
||||
} catch (error) {
|
||||
logger.error('BuchhaltungController.updatePlanung', { error });
|
||||
res.status(500).json({ success: false, message: 'Planung konnte nicht aktualisiert werden' });
|
||||
}
|
||||
}
|
||||
|
||||
async deletePlanung(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 {
|
||||
await buchhaltungService.deletePlanung(id);
|
||||
res.json({ success: true });
|
||||
} catch (error) {
|
||||
logger.error('BuchhaltungController.deletePlanung', { error });
|
||||
res.status(500).json({ success: false, message: 'Planung konnte nicht gelöscht werden' });
|
||||
}
|
||||
}
|
||||
|
||||
async createPlanposition(req: Request, res: Response): Promise<void> {
|
||||
const planungId = parseInt(param(req, 'id'), 10);
|
||||
if (isNaN(planungId)) { res.status(400).json({ success: false, message: 'Ungültige ID' }); return; }
|
||||
try {
|
||||
const data = await buchhaltungService.createPlanposition(planungId, req.body);
|
||||
res.status(201).json({ success: true, data });
|
||||
} catch (error) {
|
||||
logger.error('BuchhaltungController.createPlanposition', { error });
|
||||
res.status(500).json({ success: false, message: 'Planposition konnte nicht erstellt werden' });
|
||||
}
|
||||
}
|
||||
|
||||
async updatePlanposition(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 data = await buchhaltungService.updatePlanposition(id, req.body);
|
||||
if (!data) { res.status(404).json({ success: false, message: 'Planposition nicht gefunden' }); return; }
|
||||
res.json({ success: true, data });
|
||||
} catch (error) {
|
||||
logger.error('BuchhaltungController.updatePlanposition', { error });
|
||||
res.status(500).json({ success: false, message: 'Planposition konnte nicht aktualisiert werden' });
|
||||
}
|
||||
}
|
||||
|
||||
async deletePlanposition(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 {
|
||||
await buchhaltungService.deletePlanposition(id);
|
||||
res.json({ success: true });
|
||||
} catch (error) {
|
||||
logger.error('BuchhaltungController.deletePlanposition', { error });
|
||||
res.status(500).json({ success: false, message: 'Planposition konnte nicht gelöscht werden' });
|
||||
}
|
||||
}
|
||||
|
||||
async listPlanpositionen(req: Request, res: Response): Promise<void> {
|
||||
const planungId = parseInt(param(req, 'id'), 10);
|
||||
if (isNaN(planungId)) { res.status(400).json({ success: false, message: 'Ungültige ID' }); return; }
|
||||
try {
|
||||
const data = await buchhaltungService.getPlanpositionenByPlanung(planungId);
|
||||
res.json({ success: true, data });
|
||||
} catch (error) {
|
||||
logger.error('BuchhaltungController.listPlanpositionen', { error });
|
||||
res.status(500).json({ success: false, message: 'Planpositionen konnten nicht geladen werden' });
|
||||
}
|
||||
}
|
||||
|
||||
async createHaushaltsjahrFromPlan(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 data = await buchhaltungService.createHaushaltsjahrFromPlan(id, req.user!.id);
|
||||
res.status(201).json({ success: true, data });
|
||||
} catch (error: any) {
|
||||
logger.error('BuchhaltungController.createHaushaltsjahrFromPlan', { error });
|
||||
const status = error.statusCode || 500;
|
||||
res.status(status).json({ success: false, message: error.message || 'Haushaltsjahr konnte nicht erstellt werden' });
|
||||
}
|
||||
}
|
||||
|
||||
// ── Freigaben ────────────────────────────────────────────────────────────────
|
||||
|
||||
async requestFreigabe(req: Request, res: Response): Promise<void> {
|
||||
|
||||
Reference in New Issue
Block a user