Steuerkram/scripts/e2e-cleanup.php

108 lines
3.2 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env php
<?php
declare(strict_types=1);
/**
* Entfernt liegengebliebene E2E-Testdaten.
*
* Die E2E-Tests räumen ihre Datensätze selbst wieder ab. Bricht ein Lauf
* vorzeitig ab, können markierte Reste zurückbleiben — die holt dieses Skript.
* Erkannt wird ausschließlich der Marker "E2E-TEST" (siehe tests/e2e/helpers/app.js);
* echte Buchführungsdaten bleiben unangetastet.
*
* Verwendung:
* docker compose exec web php scripts/e2e-cleanup.php # nur anzeigen
* docker compose exec web php scripts/e2e-cleanup.php --force # wirklich löschen
*/
$projectRoot = dirname(__DIR__);
if (!file_exists($projectRoot . '/vendor/autoload.php')) {
fwrite(STDERR, "Fehler: vendor/autoload.php nicht gefunden. Bitte 'composer install' ausführen.\n");
exit(1);
}
require $projectRoot . '/vendor/autoload.php';
\Steuerkram\Config::load();
use Steuerkram\Database;
use Steuerkram\Models\Beleg;
use Steuerkram\Models\Invoice;
use Steuerkram\Models\Setting;
const MARKER = 'E2E-TEST%';
$force = in_array('--force', array_slice($argv, 1), true);
if (!Setting::isTestMode()) {
fwrite(STDERR, "Abbruch: Die Instanz läuft nicht im Testmodus – hier wird nichts gelöscht.\n");
exit(1);
}
// Absteigend (jüngste zuerst): Nur die zuletzt vergebene Nummer wandert beim
// Löschen in den Nummernkreis zurück – rückwärts abgeräumt greift das für die
// ganze Kette statt nur für den letzten Datensatz.
$belege = Database::fetchAll(
'SELECT id, beleg_nr, filename FROM belege WHERE notes LIKE ? OR filename LIKE ? ORDER BY id DESC',
[MARKER, MARKER]
);
$rechnungen = Database::fetchAll(
'SELECT id, rechnungs_nr, betreff, status FROM invoices WHERE betreff LIKE ? ORDER BY id DESC',
[MARKER]
);
if (!$belege && !$rechnungen) {
echo "Keine E2E-Testdaten gefunden.\n";
exit(0);
}
echo 'Gefunden: ' . count($belege) . ' Beleg(e), ' . count($rechnungen) . " Rechnung(en).\n";
foreach ($belege as $b) {
echo " Beleg #{$b['id']} {$b['beleg_nr']} ({$b['filename']})\n";
}
foreach ($rechnungen as $r) {
$nr = $r['rechnungs_nr'] ?: 'Entwurf';
echo " Rechnung #{$r['id']} {$nr} [{$r['status']}] {$r['betreff']}\n";
}
if (!$force) {
echo "\nNichts gelöscht. Zum Löschen erneut mit --force aufrufen.\n";
exit(0);
}
$geloescht = ['belege' => 0, 'rechnungen' => 0];
$fehler = [];
foreach ($rechnungen as $r) {
try {
Invoice::delete((int)$r['id']);
$geloescht['rechnungen']++;
} catch (\Throwable $e) {
$fehler[] = "Rechnung #{$r['id']}: " . $e->getMessage();
}
}
foreach ($belege as $b) {
$id = (int)$b['id'];
// Buchungen zuerst – sonst verweigert Beleg::delete() die Löschung.
Database::execute('DELETE FROM bookings WHERE beleg_id = ?', [$id]);
Database::execute('UPDATE belege SET locked = 0 WHERE id = ?', [$id]);
if (Beleg::delete($id)) {
$geloescht['belege']++;
} else {
$fehler[] = "Beleg #{$id} konnte nicht gelöscht werden.";
}
}
echo "\nGelöscht: {$geloescht['belege']} Beleg(e), {$geloescht['rechnungen']} Rechnung(en).\n";
if ($fehler) {
echo "Nicht gelöscht:\n";
foreach ($fehler as $f) {
echo " - {$f}\n";
}
exit(1);
}