'Testmann', 'vorname' => 'Karl', 'firma' => 'Test GmbH', 'strasse' => 'Teststraße 1', 'plz' => '12345', 'ort' => 'Teststadt', 'land' => 'DE', 'payment_days' => 14, ]); $this->assertGreaterThan(0, $customerId, 'Testkunde wurde angelegt'); // Ausgangsrechnung erstellen $datum = date('Y-m-d'); $invoiceId = \Steuerkram\Models\Invoice::create([ 'customer_id' => $customerId, 'betreff' => 'Testrechnung Webentwicklung', 'rechnungs_datum' => $datum, 'leistungszeitraum_von' => date('Y-m-01'), 'leistungszeitraum_bis' => date('Y-m-t'), 'notes' => 'Automatisch erstellt (Test)', 'lines' => [ [ 'bezeichnung' => 'Webentwicklung', 'menge' => 10, 'einheit' => 'Std.', 'einzelpreis' => 100.00, 'ust_satz' => 19.0, ], ], ]); $this->assertGreaterThan(0, $invoiceId, 'Rechnung wurde in der DB angelegt (ID > 0)'); // Rechnung via Invoice::find() abrufbar $invoice = \Steuerkram\Models\Invoice::find($invoiceId); $this->assertNotEmpty($invoice, 'Invoice::find() liefert einen Datensatz'); $this->assertEquals('Testrechnung Webentwicklung', $invoice['betreff'] ?? null, 'Betreff stimmt überein'); $this->assertEquals('Entwurf', $invoice['status'] ?? null, 'Status ist Entwurf'); $this->assertEquals($customerId, (int)($invoice['customer_id'] ?? 0), 'Kunde korrekt zugeordnet'); // Betragsberechnung prüfen $erwNetto = 1000.00; // 10 Std. × 100 € $erwUst = 190.00; // 19% $erwBrutto = 1190.00; $this->assertEquals($erwNetto, (float)($invoice['betrag_netto'] ?? 0), 'Nettobetrag korrekt berechnet'); $this->assertEquals($erwUst, (float)($invoice['betrag_ust'] ?? 0), 'USt-Betrag korrekt berechnet'); $this->assertEquals($erwBrutto, (float)($invoice['betrag_brutto'] ?? 0), 'Bruttobetrag korrekt berechnet'); // Positionen vorhanden $lines = \Steuerkram\Models\Invoice::lines($invoiceId); $this->assertEquals(1, count($lines), 'Rechnung hat genau 1 Position'); $this->assertEquals('Webentwicklung', $lines[0]['bezeichnung'] ?? null, 'Positionsbezeichnung korrekt'); // Rechnung in Invoice::all() auffindbar $result = \Steuerkram\Models\Invoice::all([], 1, 999); $found = false; foreach ($result['rows'] as $row) { if ((int)$row['id'] === $invoiceId) { $found = true; break; } } $this->assert($found, 'Rechnung erscheint in Invoice::all() (Rechnungsübersicht)'); $this->assertGreaterThan(0, $result['total'], 'Rechnungsübersicht enthält mindestens 1 Eintrag'); } }