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