expenses
This commit is contained in:
@@ -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;
|
||||
Reference in New Issue
Block a user