This commit is contained in:
2026-05-07 10:06:14 -05:00
parent e01c5367bc
commit 5b3da47d87
6 changed files with 1414 additions and 226 deletions

View File

@@ -9,10 +9,15 @@ const accountingService = require('../services/accounting-service');
// ────────────────────────────────────────────────────────────────────
function handleQboError(err, res, context) {
console.error(`❌ Accounting/${context} error:`, err.message);
if (err.qboFault) console.error(' QBO Fault detail:', JSON.stringify(err.qboFault));
if (err.stack) console.error(err.stack);
res.status(500).json({ error: err.message || 'QBO request failed', context });
const statusCode = err.statusCode || 500;
if (statusCode >= 500) {
console.error(`❌ Accounting/${context} error:`, err.message);
if (err.qboFault) console.error(' QBO Fault:', JSON.stringify(err.qboFault));
if (err.stack) console.error(err.stack);
} else {
console.warn(`⚠️ Accounting/${context} ${statusCode}:`, err.message);
}
res.status(statusCode).json({ error: err.message || 'Request failed', context });
}
// ════════════════════════════════════════════════════════════════════
@@ -166,4 +171,40 @@ router.get('/payment-methods', async (req, res) => {
} catch (err) { handleQboError(err, res, 'payment-methods'); }
});
// ─── POST /api/accounting/vendors ───────────────────────────────────
// Erstellt einen neuen Vendor in QBO + Cache.
// Body: { name, email?, phone?, address?: {...}, notes? }
// Status: 200 { id, displayName, ..., existed: false }
// 200 { ..., existed: true } ← Idempotent: Vendor war schon da
// 400 wenn name fehlt
router.post('/vendors', express.json(), async (req, res) => {
try {
const result = await accountingService.createVendor(req.body || {});
res.json(result);
} catch (err) { handleQboError(err, res, 'vendor-create'); }
});
// ─── POST /api/accounting/expenses ──────────────────────────────────
// Erstellt eine QBO Purchase (Expense) mit ein oder mehreren Lines.
// Body: { vendorId, paymentAccountId, txnDate, paymentMethodId?, refNo?, memo?, lines: [...] }
router.post('/expenses', express.json(), async (req, res) => {
try {
const result = await accountingService.createExpense(req.body || {});
res.json(result);
} catch (err) { handleQboError(err, res, 'expense-create'); }
});
// ─── GET /api/accounting/expenses ───────────────────────────────────
// ?startDate=YYYY-MM-DD&endDate=YYYY-MM-DD&onlyMine=true|false
router.get('/expenses', async (req, res) => {
try {
const expenses = await accountingService.listExpenses({
startDate: req.query.startDate,
endDate: req.query.endDate,
onlyMine: req.query.onlyMine === 'true'
});
res.json(expenses);
} catch (err) { handleQboError(err, res, 'expense-list'); }
});
module.exports = router;