83 lines
3.6 KiB
PHP
83 lines
3.6 KiB
PHP
<?php
|
||
|
||
declare(strict_types=1);
|
||
|
||
/**
|
||
* Test 3: Ausgangsrechnung erstellen und in der Übersicht prüfen.
|
||
*
|
||
* Erstellt einen Testkunden und eine Ausgangsrechnung mit einer Position,
|
||
* dann wird geprüft ob die Rechnung in Invoice::all() und Invoice::find() erscheint.
|
||
*/
|
||
class AusgangsrechnungTest extends TestCase
|
||
{
|
||
protected string $testName = 'Test 3: Ausgangsrechnung erstellen → Übersicht';
|
||
|
||
public function run(): void
|
||
{
|
||
// Testkunden anlegen
|
||
$customerId = \Steuerkram\Models\Customer::create([
|
||
'nachname' => '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');
|
||
}
|
||
}
|