Files
PackControl/pirp/tools/migrate_journal_entries.php

97 lines
3.6 KiB
PHP

<?php
/**
* Migrationstool: Erstellt nachträglich Journalbuchungen für alle bezahlten
* Rechnungen und Ausgaben, die noch keinen Journaleintrag haben.
*
* Setzt außerdem payment_date für bestehende bezahlte Belege, falls noch nicht gesetzt.
*
* Ausführung: php tools/migrate_journal_entries.php
*/
require_once __DIR__ . '/../src/config.php';
require_once __DIR__ . '/../src/db.php';
require_once __DIR__ . '/../src/invoice_functions.php';
require_once __DIR__ . '/../src/journal_functions.php';
require_once __DIR__ . '/../src/expense_functions.php';
echo "=== PIRP Journal-Migration ===\n\n";
$pdo = get_db();
// 1. payment_date für bezahlte Rechnungen setzen (Fallback: invoice_date)
echo "1. Payment-Dates für Rechnungen setzen...\n";
$stmt = $pdo->query("UPDATE invoices SET payment_date = invoice_date WHERE paid = TRUE AND payment_date IS NULL");
$count = $stmt->rowCount();
echo " $count Rechnungen aktualisiert.\n\n";
// 2. payment_date für bezahlte Ausgaben setzen (Fallback: expense_date)
echo "2. Payment-Dates für Ausgaben setzen...\n";
$stmt = $pdo->query("UPDATE expenses SET payment_date = expense_date WHERE paid = TRUE AND payment_date IS NULL");
$count = $stmt->rowCount();
echo " $count Ausgaben aktualisiert.\n\n";
// 3. total_net für Ausgaben setzen (Fallback: amount, keine MwSt)
echo "3. Netto-Beträge für Ausgaben setzen...\n";
$stmt = $pdo->query("UPDATE expenses SET total_net = amount, total_vat = 0 WHERE total_net IS NULL");
$count = $stmt->rowCount();
echo " $count Ausgaben aktualisiert.\n\n";
// 4. Bezahlte Rechnungen ohne Journaleintrag
echo "4. Bezahlte Rechnungen ohne Journalbuchung...\n";
$stmt = $pdo->query("SELECT i.id, i.invoice_number, i.total_gross, i.payment_date, c.name AS customer_name
FROM invoices i
JOIN customers c ON c.id = i.customer_id
LEFT JOIN journal_entries je ON je.invoice_id = i.id
WHERE i.paid = TRUE AND je.id IS NULL
ORDER BY i.invoice_date ASC");
$unbooked_invoices = $stmt->fetchAll(PDO::FETCH_ASSOC);
$inv_ok = 0;
$inv_err = 0;
foreach ($unbooked_invoices as $inv) {
try {
$entry_id = create_journal_entry_from_invoice((int)$inv['id']);
echo " OK: {$inv['invoice_number']} ({$inv['customer_name']}) -> Journal #{$entry_id}\n";
$inv_ok++;
} catch (Exception $e) {
echo " FEHLER: {$inv['invoice_number']}: {$e->getMessage()}\n";
$inv_err++;
}
}
echo " Ergebnis: $inv_ok erstellt, $inv_err Fehler.\n\n";
// 5. Bezahlte Ausgaben ohne Journaleintrag
echo "5. Bezahlte Ausgaben ohne Journalbuchung...\n";
$stmt = $pdo->query("SELECT e.id, e.description, e.amount, e.payment_date
FROM expenses e
LEFT JOIN journal_entries je ON je.expense_id = e.id
WHERE e.paid = TRUE AND je.id IS NULL
ORDER BY e.expense_date ASC");
$unbooked_expenses = $stmt->fetchAll(PDO::FETCH_ASSOC);
$exp_ok = 0;
$exp_err = 0;
foreach ($unbooked_expenses as $exp) {
try {
$entry_id = create_journal_entry_from_expense((int)$exp['id']);
echo " OK: \"{$exp['description']}\" ({$exp['amount']} EUR) -> Journal #{$entry_id}\n";
$exp_ok++;
} catch (Exception $e) {
echo " FEHLER: \"{$exp['description']}\": {$e->getMessage()}\n";
$exp_err++;
}
}
echo " Ergebnis: $exp_ok erstellt, $exp_err Fehler.\n\n";
// Zusammenfassung
echo "=== Zusammenfassung ===\n";
echo "Rechnungen: $inv_ok gebucht" . ($inv_err > 0 ? ", $inv_err Fehler" : '') . "\n";
echo "Ausgaben: $exp_ok gebucht" . ($exp_err > 0 ? ", $exp_err Fehler" : '') . "\n";
$total = $inv_ok + $exp_ok;
if ($total === 0) {
echo "\nKeine fehlenden Buchungen gefunden. Alles aktuell.\n";
} else {
echo "\n$total Buchungen insgesamt erstellt.\n";
}