#!/usr/bin/env node // ===================================================== // set_qbo_token.js // // Einmalig ausführen um qbo_token.json korrekt zu setzen. // Die intuit-oauth Library braucht ein vollständiges Token-Objekt, // nicht nur access_token + refresh_token. // // Verwendung: // node set_qbo_token.js // // Beispiel: // node set_qbo_token.js "eyJlbmMi..." "AB11..." "9341..." // ===================================================== const fs = require('fs'); const path = require('path'); const accessToken = process.argv[2]; const refreshToken = process.argv[3]; const realmId = process.argv[4]; if (!accessToken || !refreshToken || !realmId) { console.log(''); console.log('Verwendung:'); console.log(' node set_qbo_token.js '); console.log(''); console.log('Die Werte bekommst du aus dem Intuit OAuth Playground:'); console.log(' https://developer.intuit.com/app/developer/playground'); console.log(''); process.exit(1); } // Das ist das Format, das die intuit-oauth Library erwartet const tokenObject = { token_type: "bearer", access_token: accessToken, refresh_token: refreshToken, expires_in: 3600, x_refresh_token_expires_in: 8726400, realmId: realmId, // createdAt wird von der Library geprüft um zu sehen ob der Token abgelaufen ist createdAt: new Date().toISOString() }; const tokenFile = path.join(__dirname, 'qbo_token.json'); fs.writeFileSync(tokenFile, JSON.stringify(tokenObject, null, 2)); console.log(''); console.log('✅ qbo_token.json erfolgreich erstellt!'); console.log(` 📁 ${tokenFile}`); console.log(` 🔑 Access Token: ${accessToken.substring(0, 20)}...`); console.log(` 🔄 Refresh Token: ${refreshToken.substring(0, 15)}...`); console.log(` 🏢 Realm ID: ${realmId}`); console.log(''); console.log('Nächste Schritte:'); console.log(' 1. Docker Container neu starten: docker compose restart quote_app'); console.log(' 2. In Settings → "Test Connection" klicken'); console.log('');