Finanzmanager/tests/60_RegelmaessigAbgleichenTest.php
fds2610-bot 0e8000e3dc Fix #123: Regelmäßige Buchungen automatisch abgleichen
Neuer Schalter „automatisch abgleichen“ unter „automatisch buchen“
(Vorgabe: eingeschaltet). Gesetzt wird die aus der Reihe entstandene
Buchung als abgeglichen markiert. Die Übersicht erhält die Spalte
„Abgleichen“ zwischen „Auto“ und „Aktiv“.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 17:37:34 +02:00

105 lines
4 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.

<?php
declare(strict_types=1);
use Finanzmanager\Database;
use Finanzmanager\Mandant;
use Finanzmanager\Models\Buchung;
use Finanzmanager\Models\Konto;
use Finanzmanager\Models\RegelmaessigeBuchung;
use Finanzmanager\Services\Faelligkeitslauf;
/**
* Regelmäßige Buchungen: automatisch abgleichen (#123).
*
* Der Schalter ist in der Vorgabe eingeschaltet; die aus der Reihe entstandene
* Buchung ist dann gleich abgeglichen – beim Fälligkeitslauf wie beim Buchen
* von Hand. Ausgeschaltet bleibt sie offen.
*/
class RegelmaessigAbgleichenTest extends TestCase
{
protected string $testName = 'Test 60: Regelmäßige Buchungen automatisch abgleichen';
private int $giro = 0;
public function run(): void
{
$this->mandantAnlegen();
$this->giro = Konto::anlegen([
'name' => 'Abgleichgiro', 'kontoart' => 'bank', 'anfangssaldo' => 0, 'aktiv' => 1,
]);
$this->vorgabeIstEingeschaltet();
$this->schalterLaesstSichSpeichern();
$this->buchenGleichtAb();
$this->ohneSchalterBleibtOffen();
$this->faelligkeitslaufGleichtAb();
}
/** @param array<string,mixed> $zusatz */
private function reihe(string $name, array $zusatz = []): int
{
return RegelmaessigeBuchung::anlegen($zusatz + [
'name' => $name, 'konto_id' => $this->giro, 'betrag' => -25,
'intervall' => 'monatlich', 'beginn' => '2026-06-01', 'aktiv' => 1,
]);
}
private function vorgabeIstEingeschaltet(): void
{
$id = $this->reihe('Ohne Angabe');
$this->assertEquals(1, (int)RegelmaessigeBuchung::find($id)['abgleichen'], 'Ohne Angabe wird abgeglichen');
Database::execute(
'INSERT INTO regelmaessige_buchungen (benutzer_id, name, konto_id, beginn) VALUES (?, ?, ?, ?)',
[Mandant::id(), 'Spaltenvorgabe', $this->giro, '2026-06-01']
);
$this->assertEquals(
1,
(int)RegelmaessigeBuchung::find(Database::lastInsertId())['abgleichen'],
'Die Spalte steht in der Vorgabe auf eingeschaltet'
);
}
private function schalterLaesstSichSpeichern(): void
{
$daten = [
'name' => 'Umschalten', 'konto_id' => $this->giro, 'betrag' => -5,
'intervall' => 'monatlich', 'beginn' => '2026-06-01', 'aktiv' => 1, 'abgleichen' => 0,
];
$id = RegelmaessigeBuchung::anlegen($daten);
$this->assertEquals(0, (int)RegelmaessigeBuchung::find($id)['abgleichen'], 'Ausgeschaltet wird gespeichert');
RegelmaessigeBuchung::speichern($id, ['abgleichen' => 1] + $daten);
$this->assertEquals(1, (int)RegelmaessigeBuchung::find($id)['abgleichen'], 'Einschalten wird gespeichert');
}
private function buchenGleichtAb(): void
{
$buchung = RegelmaessigeBuchung::buchen($this->reihe('Miete', ['abgleichen' => 1]));
$this->assertEquals(1, (int)Buchung::find($buchung)['abgeglichen'], 'Die Buchung ist abgeglichen');
}
private function ohneSchalterBleibtOffen(): void
{
$buchung = RegelmaessigeBuchung::buchen($this->reihe('Strom', ['abgleichen' => 0]));
$this->assertEquals(0, (int)Buchung::find($buchung)['abgeglichen'], 'Ohne Schalter bleibt sie offen');
}
private function faelligkeitslaufGleichtAb(): void
{
$mit = $this->reihe('Lauf mit', ['automatisch' => 1, 'abgleichen' => 1, 'beginn' => date('Y-m-d')]);
$ohne = $this->reihe('Lauf ohne', ['automatisch' => 1, 'abgleichen' => 0, 'beginn' => date('Y-m-d')]);
Faelligkeitslauf::ausfuehren();
$status = static fn(int $reihe): array => array_map('intval', array_column(Database::fetchAll(
'SELECT abgeglichen FROM buchungen WHERE regelmaessige_id = ? AND benutzer_id = ?',
[$reihe, Mandant::id()]
), 'abgeglichen'));
$this->assertEquals([1], $status($mit), 'Der Fälligkeitslauf bucht abgeglichen');
$this->assertEquals([0], $status($ohne), 'Ohne Schalter bucht der Lauf offen');
}
}