Initial commit - Stand 26.04.2026

This commit is contained in:
OpenClaw
2026-04-26 07:51:39 +02:00
commit b29c467187
186 changed files with 39281 additions and 0 deletions
+246
View File
@@ -0,0 +1,246 @@
/**
* 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);