Finanzmanager/tests/52_RegelmaessigeLoeschenTest.php
fds2610-bot ecab07e5da Fix n.n.: Buchungstext bei regelmäßigen Buchungen
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-01 09:24:53 +02:00

112 lines
4.3 KiB
PHP

<?php
declare(strict_types=1);
use Finanzmanager\Models\Buchung;
use Finanzmanager\Models\Konto;
use Finanzmanager\Models\RegelmaessigeBuchung;
/**
* Wird eine Buchung gelöscht, die aus einer regelmäßigen Buchung entstand,
* ist deren Termin wieder offen: die Fälligkeit rückt zurück.
*/
class RegelmaessigeLoeschenTest extends TestCase
{
protected string $testName = 'Test 52: Fälligkeit nach Löschen der Buchung';
private int $giro = 0;
public function run(): void
{
$this->mandantAnlegen();
$this->giro = Konto::anlegen([
'name' => 'Fälligkeitsgiro', 'kontoart' => 'bank', 'anfangssaldo' => 0, 'aktiv' => 1,
]);
$this->loeschenOeffnetTerminWieder();
$this->aeltereVonZweienGeloescht();
$this->beendeteReiheWirdAktiv();
$this->manuelleBuchungBleibtUnberuehrt();
$this->buchungstextWirdUebernommen();
}
private function reihe(string $name, string $beginn, ?string $ende = null): int
{
return RegelmaessigeBuchung::anlegen([
'name' => $name, 'konto_id' => $this->giro, 'betrag' => -10,
'intervall' => 'monatlich', 'beginn' => $beginn, 'ende' => $ende, 'aktiv' => 1,
]);
}
private function faelligkeit(int $id): string
{
return (string)RegelmaessigeBuchung::find($id)['naechste_faelligkeit'];
}
private function loeschenOeffnetTerminWieder(): void
{
$id = $this->reihe('Löschtest', '2026-06-01');
$buchung = RegelmaessigeBuchung::buchen($id);
$this->assertEquals($id, (int)Buchung::find($buchung)['regelmaessige_id'], 'Die Buchung kennt ihre Reihe');
$this->assertEquals('2026-06-01', (string)Buchung::find($buchung)['faelligkeit'], 'Und ihren Termin');
$this->assert($this->faelligkeit($id) > '2026-06-01', 'Nach dem Buchen ist der Termin fortgeschrieben');
Buchung::loeschen($buchung);
$this->assertEquals('2026-06-01', $this->faelligkeit($id), 'Nach dem Löschen steht der Termin wieder an');
$this->assertNull(RegelmaessigeBuchung::find($id)['zuletzt_am'], 'Ohne verbleibende Buchung kein letztes Datum');
}
private function aeltereVonZweienGeloescht(): void
{
$id = $this->reihe('Zwei Termine', '2026-03-01');
$erste = RegelmaessigeBuchung::buchen($id);
$zweite = RegelmaessigeBuchung::buchen($id);
Buchung::loeschen($erste);
$this->assertEquals('2026-03-01', $this->faelligkeit($id), 'Es gilt der älteste offene Termin');
$this->assertEquals(
(string)Buchung::find($zweite)['datum'],
(string)RegelmaessigeBuchung::find($id)['zuletzt_am'],
'zuletzt_am folgt der verbleibenden Buchung'
);
}
private function beendeteReiheWirdAktiv(): void
{
$id = $this->reihe('Befristet', '2026-07-01', '2026-07-31');
$buchung = RegelmaessigeBuchung::buchen($id);
$this->assertEquals(0, (int)RegelmaessigeBuchung::find($id)['aktiv'], 'Die Reihe ist ausgelaufen');
Buchung::loeschen($buchung);
$this->assertEquals(1, (int)RegelmaessigeBuchung::find($id)['aktiv'], 'Das Löschen öffnet sie wieder');
$this->assertEquals('2026-07-01', $this->faelligkeit($id), 'Mit dem gelöschten Termin');
}
private function manuelleBuchungBleibtUnberuehrt(): void
{
$id = $this->reihe('Unbeteiligt', '2026-09-01');
$vorher = $this->faelligkeit($id);
$manuell = Buchung::anlegen(['konto_id' => $this->giro, 'datum' => '2026-08-01', 'betrag' => -5]);
Buchung::loeschen($manuell);
$this->assertEquals($vorher, $this->faelligkeit($id), 'Eine freie Buchung ändert keine Fälligkeit');
}
private function buchungstextWirdUebernommen(): void
{
$id = RegelmaessigeBuchung::anlegen([
'name' => 'Mit Text', 'konto_id' => $this->giro, 'betrag' => -10, 'buchungstext' => 'Miete Oktober',
'intervall' => 'monatlich', 'beginn' => '2026-10-01', 'aktiv' => 1,
]);
$this->assertEquals('Miete Oktober', (string)RegelmaessigeBuchung::find($id)['buchungstext'], 'Der Buchungstext wird gespeichert');
$buchung = RegelmaessigeBuchung::buchen($id);
$this->assertEquals('Miete Oktober', (string)Buchung::find($buchung)['buchungstext'], 'Und in die Buchung übernommen');
}
}