diff --git a/server.js b/server.js index 56d59f0..ebe4ff9 100644 --- a/server.js +++ b/server.js @@ -194,12 +194,18 @@ async function exportInvoiceToQbo(invoiceId, client) { const data = response.getJson ? response.getJson() : response.json; if (data.Fault?.Error?.[0]?.code === '6140') { + console.log(` ⚠️ DocNumber ${qboPayload.DocNumber} exists, retrying...`); qboPayload.DocNumber = (parseInt(qboPayload.DocNumber) + 1).toString(); continue; } + if (data.Fault) { + const errMsg = data.Fault.Error?.map(e => `${e.code}: ${e.Message} - ${e.Detail}`).join('; ') || JSON.stringify(data.Fault); + console.error(`❌ QBO Export Fault:`, errMsg); + throw new Error('QBO export failed: ' + errMsg); + } qboInvoice = data.Invoice || data; if (qboInvoice.Id) break; - throw new Error("QBO returned no ID: " + (data.Fault?.Error?.[0]?.Message || JSON.stringify(data))); + throw new Error("QBO returned no ID: " + JSON.stringify(data).substring(0, 500)); } if (!qboInvoice?.Id) throw new Error('Could not find free DocNumber after 5 attempts.'); @@ -279,8 +285,19 @@ async function syncInvoiceToQbo(invoiceId, client) { }); const updateData = updateRes.getJson ? updateRes.getJson() : updateRes.json; + + // Prüfe auf Fault + if (updateData.Fault) { + const errMsg = updateData.Fault.Error?.map(e => `${e.code}: ${e.Message} - ${e.Detail}`).join('; ') || JSON.stringify(updateData.Fault); + console.error(`❌ QBO Sync Fault:`, errMsg); + throw new Error('QBO sync failed: ' + errMsg); + } + const updated = updateData.Invoice || updateData; - if (!updated.Id) throw new Error('QBO update returned no ID'); + if (!updated.Id) { + console.error(`❌ QBO unexpected response:`, JSON.stringify(updateData).substring(0, 500)); + throw new Error('QBO update returned no ID'); + } await client.query( 'UPDATE invoices SET qbo_sync_token = $1, updated_at = CURRENT_TIMESTAMP WHERE id = $2',