97 lines
3.6 KiB
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";
|
|
}
|