Korrektur zur Nummer ermittlung

This commit is contained in:
Andreas Knuth 2026-02-19 22:18:15 -06:00
parent 410faee6d1
commit 451f6f66c1
1 changed files with 23 additions and 17 deletions

View File

@ -1170,37 +1170,43 @@ app.post('/api/invoices/:id/export', async (req, res) => {
? 'https://quickbooks.api.intuit.com' ? 'https://quickbooks.api.intuit.com'
: 'https://sandbox-quickbooks.api.intuit.com'; : 'https://sandbox-quickbooks.api.intuit.com';
// --- SCHRITT 3a: NÄCHSTE NUMMER ERMITTELN ---
console.log("🔍 Frage QBO nach der letzten Rechnungsnummer...");
// Wir suchen die ZULETZT ERSTELLTE Rechnung // -------------------------------------------
const lastNumQuery = "SELECT DocNumber FROM Invoice ORDERBY MetaData.CreateTime DESC MAXRESULTS 1"; // --- SCHRITT 3a: NÄCHSTE NUMMER ERMITTELN ---
console.log("🔍 Frage QBO nach der höchsten Rechnungsnummer...");
// Alle Rechnungen laden (nur DocNumber Feld), nach DocNumber absteigend
// QBO unterstützt leider kein MAX() oder CAST, daher holen wir die letzten 100
// und ermitteln die höchste rein numerische Nummer clientseitig.
const numQuery = "SELECT DocNumber FROM Invoice ORDERBY DocNumber DESC MAXRESULTS 100";
const lastNumResponse = await makeQboApiCall({ const lastNumResponse = await makeQboApiCall({
url: `${baseUrl}/v3/company/${companyId}/query?query=${encodeURI(lastNumQuery)}`, url: `${baseUrl}/v3/company/${companyId}/query?query=${encodeURI(numQuery)}`,
method: 'GET' method: 'GET'
}); });
const lastNumData = lastNumResponse.getJson ? lastNumResponse.getJson() : lastNumResponse.json; const lastNumData = lastNumResponse.getJson ? lastNumResponse.getJson() : lastNumResponse.json;
let nextDocNumber = null; let nextDocNumber = null;
if (lastNumData.QueryResponse && lastNumData.QueryResponse.Invoice && lastNumData.QueryResponse.Invoice.length > 0) { if (lastNumData.QueryResponse?.Invoice?.length > 0) {
const lastDocNumberStr = lastNumData.QueryResponse.Invoice[0].DocNumber; // Nur rein numerische DocNumbers betrachten (keine "110444-A" etc.)
// Versuchen, die Nummer zu parsen (Entfernt Buchstaben, behält Zahlen) const numericDocs = lastNumData.QueryResponse.Invoice
const lastNum = parseInt(lastDocNumberStr.replace(/[^0-9]/g, ''), 10); .map(inv => inv.DocNumber)
.filter(dn => /^\d+$/.test(dn))
.map(dn => parseInt(dn, 10))
.sort((a, b) => b - a); // Absteigend
if (!isNaN(lastNum)) { if (numericDocs.length > 0) {
nextDocNumber = (lastNum + 1).toString(); const highest = numericDocs[0];
console.log(`✅ Letzte Nummer war ${lastDocNumberStr}. Neue Nummer wird: ${nextDocNumber}`); nextDocNumber = (highest + 1).toString();
console.log(`✅ Höchste numerische Nummer: ${highest}. Neue Nummer: ${nextDocNumber}`);
} }
} }
// Fallback: Wenn QBO leer ist oder Parsing fehlschlägt, nimm die lokale Nummer // Fallback
if (!nextDocNumber) { if (!nextDocNumber) {
console.log("⚠️ Konnte keine Nummer aus QBO ermitteln. Verwende lokale Nummer."); console.log("⚠️ Konnte keine Nummer aus QBO ermitteln. Verwende lokale Nummer.");
nextDocNumber = invoice.invoice_number; nextDocNumber = invoice.invoice_number;
} }
// -------------------------------------------
// 4. QBO JSON bauen // 4. QBO JSON bauen
const lineItems = items.map(item => { const lineItems = items.map(item => {