112 lines
4.3 KiB
PHP
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');
|
|
}
|
|
}
|