assert(false, 'Kein bank_import_format vorhanden – Test übersprungen'); return; } $this->assert(true, 'bank_import_format vorhanden'); // ── Hilfsfunktionen ──────────────────────────────────────────── $batchId = \Steuerkram\Models\BankTransaction::createBatch($formatId, 'test-32.csv', 1); $this->assertGreaterThan(0, $batchId, 'Batch angelegt (id > 0)'); $date = date('Y-m-d'); \Steuerkram\Models\BankTransaction::insertRow($batchId, [ 'buchungstag' => $date, 'wertstellung' => $date, 'vorgang' => 'Lastschrift', 'buchungstext' => 'Test-Lieferant Rechnung 32', 'wert' => '-119.00', 'raw_line' => null, ]); $tx = \Steuerkram\Database::fetchOne( 'SELECT id FROM bank_transactions WHERE batch_id = ? LIMIT 1', [$batchId] ); $this->assert($tx !== false, 'Bankbuchung in DB gefunden'); $txId = (int)$tx['id']; // ── Status initial: offen ────────────────────────────────────── \Steuerkram\Models\BankTransaction::recalcStatus($txId); $row = \Steuerkram\Database::fetchOne('SELECT status FROM bank_transactions WHERE id = ?', [$txId]); $this->assertEquals('offen', $row['status'], 'Status nach Anlage: offen'); // ── Beleg anlegen ────────────────────────────────────────────── $belegId = \Steuerkram\Models\Beleg::create([ 'beleg_nr' => 'BT32-' . uniqid(), 'filename' => 'bt32.pdf', 'storage_path' => '', 'mime_type' => 'application/pdf', 'file_hash' => hash('sha256', 'bt32-' . uniqid()), 'beleg_datum' => $date, 'belegtyp' => 'Eingangsrechnung', ]); // ── Teilzuordnung (60 €) → Status: teilweise ───────────────── \Steuerkram\Models\BankTransaction::linkBeleg($txId, $belegId, 60.00); $row = \Steuerkram\Database::fetchOne('SELECT status FROM bank_transactions WHERE id = ?', [$txId]); $this->assertEquals('teilweise', $row['status'], 'Status nach Teilzuordnung (60/119): teilweise'); $remaining = \Steuerkram\Models\BankTransaction::getRemainingBetrag($txId); $this->assertEquals(59.00, $remaining, 'Restbetrag nach 60-€-Zuordnung = 59,00'); // ── Vollzuordnung (restliche 59 €) → Status: gebucht ───────── $belegId2 = \Steuerkram\Models\Beleg::create([ 'beleg_nr' => 'BT32B-' . uniqid(), 'filename' => 'bt32b.pdf', 'storage_path' => '', 'mime_type' => 'application/pdf', 'file_hash' => hash('sha256', 'bt32b-' . uniqid()), 'beleg_datum' => $date, 'belegtyp' => 'Eingangsrechnung', ]); \Steuerkram\Models\BankTransaction::linkBeleg($txId, $belegId2, 59.00); $row = \Steuerkram\Database::fetchOne('SELECT status FROM bank_transactions WHERE id = ?', [$txId]); $this->assertEquals('gebucht', $row['status'], 'Status nach Vollzuordnung (60+59=119): gebucht'); // ── Verknüpfte Belege prüfen ─────────────────────────────────── $linked = \Steuerkram\Models\BankTransaction::getLinkedBelege($txId); $this->assertEquals(2, count($linked), 'Anzahl verknüpfter Belege = 2'); // ── Zuordnung aufheben → Status: teilweise ──────────────────── \Steuerkram\Models\BankTransaction::unlinkBeleg($txId, $belegId2); $row = \Steuerkram\Database::fetchOne('SELECT status FROM bank_transactions WHERE id = ?', [$txId]); $this->assertEquals('teilweise', $row['status'], 'Status nach unlinkBeleg: teilweise'); // ── Alle Zuordnungen aufheben → Status: offen ───────────────── \Steuerkram\Models\BankTransaction::unlinkBeleg($txId, $belegId); $row = \Steuerkram\Database::fetchOne('SELECT status FROM bank_transactions WHERE id = ?', [$txId]); $this->assertEquals('offen', $row['status'], 'Status nach vollständigem Unlink: offen'); // ── findDuplicates: leere Eingabe ───────────────────────────── $result = \Steuerkram\Models\BankTransaction::findDuplicates([]); $this->assertEquals(0, count($result['new']), 'findDuplicates([]) → new leer'); $this->assertEquals(0, count($result['dup']), 'findDuplicates([]) → dup leer'); // ── findDuplicates: identische Buchung ist Duplikat ─────────── $dupRow = [ 'buchungstag' => $date, 'wertstellung' => $date, 'vorgang' => 'Lastschrift', 'buchungstext' => 'Test-Lieferant Rechnung 32', 'wert' => '-119.00', ]; $result2 = \Steuerkram\Models\BankTransaction::findDuplicates([$dupRow]); $this->assertEquals(1, count($result2['dup']), 'Identische Buchung als Duplikat erkannt'); $this->assertEquals(0, count($result2['new']), 'Keine neue Buchung bei Duplikat'); // ── findDuplicates: neue Buchung ist kein Duplikat ──────────── $newRow = [ 'buchungstag' => $date, 'wertstellung' => $date, 'vorgang' => 'Gutschrift', 'buchungstext' => 'Einnahme Test 32', 'wert' => '500.00', ]; $result3 = \Steuerkram\Models\BankTransaction::findDuplicates([$newRow]); $this->assertEquals(1, count($result3['new']), 'Neue Buchung korrekt als neu erkannt'); $this->assertEquals(0, count($result3['dup']), 'Keine Duplikate bei neuer Buchung'); } }