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 $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'); } }