247 lines
8.1 KiB
JavaScript
247 lines
8.1 KiB
JavaScript
/**
|
|
* 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);
|