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>
105 lines
4 KiB
PHP
105 lines
4 KiB
PHP
<?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');
|
||
}
|
||
}
|