findAccountId('1200'); $kto4650 = $this->findAccountId('4650'); $kto4651 = $this->findAccountId('4651'); $kto4654 = $this->findAccountId('4654'); $kto4656 = $this->findAccountId('4656'); if (!$bankId || !$kto4650 || !$kto4651 || !$kto4654 || !$kto4656) { $this->assert(false, 'Benötigte Konten (1200, 4650, 4651, 4654, 4656) nicht gefunden'); return; } // ── Test 1: Split bei Konto 4650 ───────────────────────────── $beleg1 = \Steuerkram\Models\Beleg::create([ 'beleg_nr' => 'TEST-BEW-4650-' . uniqid(), 'filename' => 'test.pdf', 'storage_path' => '', 'mime_type' => 'application/pdf', 'file_hash' => hash('sha256', 'bew4650' . uniqid()), 'beleg_datum' => $datum, 'belegtyp' => 'Eingangsrechnung', ]); \Steuerkram\Database::execute( 'UPDATE belege SET bewirtungsgrund = ?, teilnehmerliste = ? WHERE id = ?', ['Kundengespräch', 'Max Mustermann, Erika Mustermann', $beleg1] ); // Bewirtungssplit direkt über Booking::create + zweite Buchung simulieren // (wie BookingController::bucheBewirtungssplit() es tut) $netto = 100.0; $ustSatz = 19.0; $netto70 = round($netto * 0.7, 2); $netto30 = round($netto - $netto70, 2); $id1a = \Steuerkram\Models\Booking::create([ 'beleg_id' => $beleg1, 'buchungs_datum' => $datum, 'buchungstyp' => 'Ausgabe', 'kategorie_konto_id' => $kto4650, 'zahlungskonto_id' => $bankId, 'betrag_netto' => $netto70, 'ust_satz' => $ustSatz, 'buchungstext' => 'Bewirtung Test 70%', ]); $id1b = \Steuerkram\Models\Booking::create([ 'beleg_id' => $beleg1, 'buchungs_datum' => $datum, 'buchungstyp' => 'Ausgabe', 'kategorie_konto_id' => $kto4654, 'zahlungskonto_id' => $bankId, 'betrag_netto' => $netto30, 'ust_satz' => $ustSatz, 'buchungstext' => 'Bewirtung Test 30%', ]); $b1a = \Steuerkram\Models\Booking::find($id1a); $b1b = \Steuerkram\Models\Booking::find($id1b); $this->assertEquals(70.0, (float)$b1a['betrag_netto'], '70%-Buchung hat 70% Netto'); $this->assertEquals(30.0, (float)$b1b['betrag_netto'], '30%-Buchung hat 30% Netto'); $this->assertEquals($kto4650, (int)$b1a['kategorie_konto_id'], '70%-Buchung auf 4650'); $this->assertEquals($kto4654, (int)$b1b['kategorie_konto_id'], '30%-Buchung auf 4654'); // USt wird proportional berechnet $expectedUst70 = round($netto70 * $ustSatz / 100, 2); $expectedUst30 = round($netto30 * $ustSatz / 100, 2); $this->assertEquals($expectedUst70, (float)$b1a['betrag_ust'], '70%-Buchung USt korrekt'); $this->assertEquals($expectedUst30, (float)$b1b['betrag_ust'], '30%-Buchung USt korrekt'); // Gesamt-VSt = 100 * 19% = 19 $this->assertEquals( round($netto * $ustSatz / 100, 2), round((float)$b1a['betrag_ust'] + (float)$b1b['betrag_ust'], 2), 'Gesamt-Vorsteuer korrekt (100% des Nettobetrags)' ); // Bewirtungsfelder auf dem Beleg gespeichert (seit Migration 024 in belege, nicht bookings) $belegDaten = \Steuerkram\Models\Beleg::find($beleg1); $this->assertEquals('Kundengespräch', $belegDaten['bewirtungsgrund'], 'Bewirtungsgrund gespeichert'); $this->assertEquals('Max Mustermann, Erika Mustermann', $belegDaten['teilnehmerliste'], 'Teilnehmerliste gespeichert'); // ── Test 2: Split bei Konto 4651 ───────────────────────────── $beleg2 = \Steuerkram\Models\Beleg::create([ 'beleg_nr' => 'TEST-BEW-4651-' . uniqid(), 'filename' => 'test2.pdf', 'storage_path' => '', 'mime_type' => 'application/pdf', 'file_hash' => hash('sha256', 'bew4651' . uniqid()), 'beleg_datum' => $datum, 'belegtyp' => 'Eingangsrechnung', ]); $id2a = \Steuerkram\Models\Booking::create([ 'beleg_id' => $beleg2, 'buchungs_datum' => $datum, 'buchungstyp' => 'Ausgabe', 'kategorie_konto_id' => $kto4651, 'zahlungskonto_id' => $bankId, 'betrag_netto' => round(50.0 * 0.7, 2), 'ust_satz' => 7.0, 'buchungstext' => 'Bewirtung 4651 70%', 'bewirtungsgrund' => 'Teambesprechung', 'teilnehmerliste' => 'Team A', ]); $id2b = \Steuerkram\Models\Booking::create([ 'beleg_id' => $beleg2, 'buchungs_datum' => $datum, 'buchungstyp' => 'Ausgabe', 'kategorie_konto_id' => $kto4656, 'zahlungskonto_id' => $bankId, 'betrag_netto' => round(50.0 - round(50.0 * 0.7, 2), 2), 'ust_satz' => 7.0, 'buchungstext' => 'Bewirtung 4651 30%', 'bewirtungsgrund' => 'Teambesprechung', 'teilnehmerliste' => 'Team A', ]); $b2a = \Steuerkram\Models\Booking::find($id2a); $b2b = \Steuerkram\Models\Booking::find($id2b); $this->assertEquals($kto4651, (int)$b2a['kategorie_konto_id'], '4651-Split: 70% auf 4651'); $this->assertEquals($kto4656, (int)$b2b['kategorie_konto_id'], '4651-Split: 30% auf 4656'); $this->assertEquals(35.0, (float)$b2a['betrag_netto'], '4651-Split: 70% von 50 = 35'); $this->assertEquals(15.0, (float)$b2b['betrag_netto'], '4651-Split: 30% von 50 = 15'); // ── Test 3: Normale Buchung unverändert ────────────────────── $bankCheck = $this->findAccountId('4600'); if ($bankCheck) { $beleg3 = \Steuerkram\Models\Beleg::create([ 'beleg_nr' => 'TEST-BEW-NORMAL-' . uniqid(), 'filename' => 'test3.pdf', 'storage_path' => '', 'mime_type' => 'application/pdf', 'file_hash' => hash('sha256', 'normal' . uniqid()), 'beleg_datum' => $datum, 'belegtyp' => 'Eingangsrechnung', ]); $idNormal = \Steuerkram\Models\Booking::create([ 'beleg_id' => $beleg3, 'buchungs_datum' => $datum, 'buchungstyp' => 'Ausgabe', 'kategorie_konto_id' => $bankCheck, 'zahlungskonto_id' => $bankId, 'betrag_netto' => 200.0, 'ust_satz' => 19.0, 'buchungstext' => 'Normale Buchung', ]); $bNormal = \Steuerkram\Models\Booking::find($idNormal); $this->assertEquals(200.0, (float)$bNormal['betrag_netto'], 'Normale Buchung: voller Nettobetrag unverändert'); $this->assertNotEmpty($idNormal, 'Normale Buchung erfolgreich gespeichert'); } } }