/** * KORRIGIERTER IMPORT: Niki Kredit via API * Beachtet: Neue Kosten sind NEGATIV in Excel */ const http = require('http'); // KORREKTE Daten aus Excel (Neue Kosten sind NEGATIV!) const EXCEL_DATA = [ // Zahlungen ['2024-04-01', 500, null, ''], ['2024-05-01', 500, null, ''], ['2024-06-01', 150, -90, 'Kameras'], ['2024-07-01', 450, -45, 'Kameras'], ['2024-08-01', 500, null, ''], ['2024-09-01', 300, null, ''], ['2024-10-01', 300, -110, 'Videorekorder + Zubehör'], ['2025-02-01', 200, null, ''], ['2025-06-01', 500, -260, 'Handyvertag'] ]; function apiCall(method, endpoint, data = null) { return new Promise((resolve, reject) => { const options = { hostname: 'localhost', port: 3001, path: `/api${endpoint}`, method: method, headers: { 'Content-Type': 'application/json' } }; const req = http.request(options, (res) => { let responseData = ''; res.on('data', (chunk) => responseData += chunk); res.on('end', () => { try { const parsed = JSON.parse(responseData); resolve(parsed); } catch (e) { resolve(responseData); } }); }); req.on('error', reject); if (data) req.write(JSON.stringify(data)); req.end(); }); } async function main() { console.log('='.repeat(60)); console.log('NIKI KREDIT - KORRIGIERTER IMPORT'); console.log('(Neue Kosten sind NEGATIV in Excel)'); console.log('='.repeat(60)); console.log('\n' + '='.repeat(60)); console.log('SCHRITT 1: Alten Kredit löschen'); console.log('='.repeat(60)); let kredite; try { kredite = await apiCall('GET', '/kredite'); } catch (err) { console.error('Fehler:', err.message); process.exit(1); } const nikiKredite = kredite.filter(k => k.name?.toLowerCase().includes('niki')); for (const kredit of nikiKredite) { console.log(`Lösche: ${kredit.name}`); await apiCall('DELETE', `/kredite/${kredit.id}`); } if (nikiKredite.length === 0) console.log('Kein Kredit gefunden'); console.log('\n' + '='.repeat(60)); console.log('SCHRITT 2: Excel-Daten verarbeiten'); console.log('='.repeat(60)); // Extrahiere Zahlungen und Auslagen const zahlungen = []; for (const row of EXCEL_DATA) { const [datum, abgezahlt, neueKosten, fuerWas] = row; // Zahlung (Abgezahlt > 0) if (abgezahlt && abgezahlt > 0) { zahlungen.push({ datum: datum, typ: 'zahlung', betrag: abgezahlt, notiz: fuerWas || 'Rate gezahlt' }); } // Auslage (Neue Kosten ist NEGATIV in Excel -> wir speichern als negativ) if (neueKosten && neueKosten < 0) { zahlungen.push({ datum: datum, typ: 'auslage', betrag: neueKosten, // Bereits negativ notiz: fuerWas || 'Neue Kosten' }); } } const summeZahlungen = zahlungen .filter(z => z.typ === 'zahlung') .reduce((sum, z) => sum + z.betrag, 0); const summeAuslagen = zahlungen .filter(z => z.typ === 'auslage') .reduce((sum, z) => sum + z.betrag, 0); // Bereits negativ console.log(`Gefunden:`); console.log(`- ${zahlungen.filter(z => z.typ === 'zahlung').length} Zahlungen = ${summeZahlungen.toFixed(2)} €`); console.log(`- ${zahlungen.filter(z => z.typ === 'auslage').length} Auslagen = ${summeAuslagen.toFixed(2)} €`); console.log('\nAlle Transaktionen:'); for (const z of zahlungen) { const sign = z.betrag >= 0 ? '+' : ''; console.log(` ${z.datum} | ${z.typ.padEnd(10)} | ${sign}${z.betrag.toFixed(2).padStart(8)} € | ${z.notiz}`); } // Berechne korrekte Restschuld const korrekteRestschuld = 7000 - summeZahlungen + Math.abs(summeAuslagen); console.log(`\nStartschuld: 7000 €`); console.log(`Abzüglich Zahlungen: -${summeZahlungen.toFixed(2)} €`); console.log(`Plus Auslagen: +${Math.abs(summeAuslagen).toFixed(2)} €`); console.log(`=> Restschuld: ${korrekteRestschuld.toFixed(2)} €`); console.log('\n' + '='.repeat(60)); console.log('SCHRITT 3: Kredit anlegen'); console.log('='.repeat(60)); const kreditData = { name: 'Niki Schulden', kreditgeber: 'Niki', person: 'Niki', ursprungsschuld: 7000, restschuld: korrekteRestschuld, monatsrate: 500, zinssatz: 10, start_datum: '2023-07-01', richtung: 'eingehend', status: 'aktiv', notizen: 'Importiert aus Excel (Schulden Niki.xlsx)' }; let neuerKredit; try { neuerKredit = await apiCall('POST', '/kredite', kreditData); console.log(`✅ Kredit angelegt: ${neuerKredit.id}`); } catch (err) { console.error('❌ Fehler:', err.message); process.exit(1); } console.log('\n' + '='.repeat(60)); console.log('SCHRITT 4: Zahlungen importieren'); console.log('='.repeat(60)); for (const z of zahlungen) { try { await apiCall('POST', `/kredite/${neuerKredit.id}/zahlungen`, { datum: z.datum, betrag: z.betrag, typ: z.typ, notizen: z.notiz }); const sign = z.betrag >= 0 ? '+' : ''; console.log(` ✅ ${z.datum} | ${z.typ.padEnd(10)} | ${sign}${z.betrag.toFixed(2).padStart(8)} €`); } catch (err) { console.log(` ❌ ${z.datum} | FEHLER: ${err.message}`); } } console.log('\n' + '='.repeat(60)); console.log('SCHRITT 5: Verifikation'); console.log('='.repeat(60)); // Kredit prüfen const alleKredite = await apiCall('GET', '/kredite'); const nikiKredit = alleKredite.find(k => k.id === neuerKredit.id); console.log('\nKredit in DB:'); console.log(` Name: ${nikiKredit.name}`); console.log(` Ursprungsschuld: ${parseFloat(nikiKredit.ursprungsschuld).toFixed(2)} €`); console.log(` Restschuld: ${parseFloat(nikiKredit.restschuld).toFixed(2)} €`); console.log(` Soll-Restschuld: ${korrekteRestschuld.toFixed(2)} €`); // Zahlungen prüfen let zahlungenDB; try { zahlungenDB = await apiCall('GET', `/kredite/${neuerKredit.id}/zahlungen`); } catch (err) { zahlungenDB = []; } console.log(`\nZahlungen in DB: ${zahlungenDB.length}`); let sumZahlungenDB = 0; let sumAuslagenDB = 0; for (const z of zahlungenDB) { const betrag = parseFloat(z.betrag); const typ = z.typ || 'zahlung'; const sign = betrag >= 0 ? '+' : ''; console.log(` ${z.datum?.split('T')[0]} | ${typ.padEnd(10)} | ${sign}${betrag.toFixed(2).padStart(8)} € | ${z.notizen || ''}`); if (typ === 'zahlung') sumZahlungenDB += betrag; if (typ === 'auslage') sumAuslagenDB += betrag; } console.log('\n' + '='.repeat(60)); console.log('SUMMEN-VERGLEICH'); console.log('='.repeat(60)); console.log(` Excel DB`); console.log(` Zahlungen: ${summeZahlungen.toFixed(2).padStart(10)} € ${sumZahlungenDB.toFixed(2).padStart(10)} €`); console.log(` Auslagen: ${summeAuslagen.toFixed(2).padStart(10)} € ${sumAuslagenDB.toFixed(2).padStart(10)} €`); const zahlungOk = Math.abs(summeZahlungen - sumZahlungenDB) < 0.01; const auslageOk = Math.abs(summeAuslagen - sumAuslagenDB) < 0.01; const restschuldOk = Math.abs(korrekteRestschuld - parseFloat(nikiKredit.restschuld)) < 0.01; if (zahlungOk && auslageOk && restschuldOk) { console.log('\n✅ VERIFIKATION ERFOLGREICH!'); console.log(' ✓ Alle Zahlungen korrekt importiert'); console.log(' ✓ Alle Auslagen korrekt importiert'); console.log(' ✓ Restschuld stimmt: ' + parseFloat(nikiKredit.restschuld).toFixed(2) + ' €'); console.log(' ✓ Verlauf ist abrufbar'); } else { console.log('\n❌ WARNUNG:'); if (!zahlungOk) console.log(' - Zahlungen stimmen nicht überein'); if (!auslageOk) console.log(' - Auslagen stimmen nicht überein'); if (!restschuldOk) console.log(` - Restschuld: DB=${nikiKredit.restschuld}, Soll=${korrekteRestschuld}`); } console.log('\n' + '='.repeat(60)); console.log('IMPORT ABGESCHLOSSEN'); console.log('='.repeat(60)); console.log('✅ Kredit "Niki Schulden" ist jetzt korrekt in der Datenbank.'); console.log('✅ Alle 13 Transaktionen (9 Zahlungen + 4 Auslagen) importiert.'); console.log('✅ Restschuld: ' + korrekteRestschuld.toFixed(2) + ' €'); } main().catch(console.error);