This commit is contained in:
Matthias Hochmeister
2026-03-26 14:22:35 +01:00
parent 3c95b7506b
commit c29b21f714
9 changed files with 400 additions and 103 deletions

View File

@@ -1,5 +1,6 @@
import { Request, Response } from 'express';
import bestellungService from '../services/bestellung.service';
import { permissionService } from '../services/permission.service';
import logger from '../utils/logger';
import fs from 'fs';
@@ -227,7 +228,34 @@ class BestellungController {
return;
}
try {
const order = await bestellungService.updateOrderStatus(id, status, req.user!.id, !!force);
// For force override, require manage_orders
if (force) {
const canManage = permissionService.hasPermission(req.user!.groups || [], 'bestellungen:manage_orders');
if (!canManage) {
res.status(403).json({ success: false, message: 'Keine Berechtigung für manuelle Statusänderung' });
return;
}
}
// For approval/rejection transitions, require bestellungen:approve
if (status === 'bereit_zur_bestellung' || status === 'entwurf') {
// Check if this is an approval/rejection (from wartet_auf_genehmigung)
const currentOrder = await bestellungService.getOrderById(id);
if (!currentOrder) {
res.status(404).json({ success: false, message: 'Bestellung nicht gefunden' });
return;
}
const currentStatus = currentOrder.bestellung.status;
if (currentStatus === 'wartet_auf_genehmigung') {
const canApprove = permissionService.hasPermission(req.user!.groups || [], 'bestellungen:approve');
if (!canApprove) {
res.status(403).json({ success: false, message: 'Keine Berechtigung zur Genehmigung/Ablehnung von Bestellungen' });
return;
}
}
}
const order = await bestellungService.updateOrderStatus(id, status, req.user!.id, !!force, req.user!.id);
if (!order) {
res.status(404).json({ success: false, message: 'Bestellung nicht gefunden' });
return;
@@ -327,7 +355,11 @@ class BestellungController {
return;
}
res.status(200).json({ success: true, data: item });
} catch (error) {
} catch (error: any) {
if (error.statusCode === 400) {
res.status(400).json({ success: false, message: error.message });
return;
}
logger.error('BestellungController.updateReceivedQuantity error', { error });
res.status(500).json({ success: false, message: 'Liefermenge konnte nicht aktualisiert werden' });
}
@@ -501,6 +533,11 @@ class BestellungController {
res.status(404).json({ success: false, message: 'Bestellung nicht gefunden' });
return;
}
const orderStatus = order.bestellung.status;
if (orderStatus === 'entwurf' || orderStatus === 'wartet_auf_genehmigung') {
res.status(403).json({ success: false, message: 'Export nur nach Genehmigung verfügbar' });
return;
}
res.status(200).json({ success: true, data: order });
} catch (error) {
logger.error('BestellungController.exportOrder error', { error });