Steuerkram/tests/32_BankTransactionTest.php

125 lines
6.6 KiB
PHP
Raw Permalink 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);
/**
* Test 32: BankTransaction – linkBeleg, unlinkBeleg, recalcStatus, findDuplicates.
*
* Legt eine Test-Bankbuchung an und prüft die Zuordnungslogik komplett durch.
*/
class BankTransactionTest extends TestCase
{
protected string $testName = 'Test 32: BankTransaction – Zuordnungslogik';
public function run(): void
{
$formatId = (int)(\Steuerkram\Database::fetchOne('SELECT id FROM bank_import_formats LIMIT 1')['id'] ?? 0);
if (!$formatId) {
$this->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');
}
}