Korrektur zur Nummer ermittlung
This commit is contained in:
parent
410faee6d1
commit
451f6f66c1
40
server.js
40
server.js
|
|
@ -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 ---
|
// --- SCHRITT 3a: NÄCHSTE NUMMER ERMITTELN ---
|
||||||
console.log("🔍 Frage QBO nach der letzten Rechnungsnummer...");
|
console.log("🔍 Frage QBO nach der höchsten Rechnungsnummer...");
|
||||||
|
|
||||||
// Wir suchen die ZULETZT ERSTELLTE Rechnung
|
// Alle Rechnungen laden (nur DocNumber Feld), nach DocNumber absteigend
|
||||||
const lastNumQuery = "SELECT DocNumber FROM Invoice ORDERBY MetaData.CreateTime DESC MAXRESULTS 1";
|
// 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))
|
||||||
if (!isNaN(lastNum)) {
|
.map(dn => parseInt(dn, 10))
|
||||||
nextDocNumber = (lastNum + 1).toString();
|
.sort((a, b) => b - a); // Absteigend
|
||||||
console.log(`✅ Letzte Nummer war ${lastDocNumberStr}. Neue Nummer wird: ${nextDocNumber}`);
|
|
||||||
|
if (numericDocs.length > 0) {
|
||||||
|
const highest = numericDocs[0];
|
||||||
|
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 => {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue