Fix #34: Nach Buchung auf Anlagevermögens-Konto direkt zur Asset-Bearbeitung weiterleiten

This commit is contained in:
fds2610-bot 2026-04-26 17:02:28 +02:00
parent 02463e40d4
commit 0866344f51
2 changed files with 89 additions and 1 deletions

View file

@ -144,6 +144,7 @@ class BookingController
);
$kontonummer = $konto['kontonummer'] ?? '';
$newAssetId = null;
if (($konto['kontenart'] ?? '') === 'Anlagevermögen') {
$assetId = isset($data['asset_id']) && $data['asset_id'] !== '' ? (int)$data['asset_id'] : null;
if ($assetId === null) {
@ -154,6 +155,7 @@ class BookingController
'anschaffungsdatum' => $data['buchungs_datum'],
'anschaffungskosten' => (float)$data['betrag_netto'],
]);
$newAssetId = $assetId;
}
$data['asset_id'] = $assetId;
}
@ -180,7 +182,11 @@ class BookingController
}
}
View::redirect("/belege/{$belegId}", 'Buchung erfasst.');
if ($newAssetId !== null) {
View::redirect("/assets/{$newAssetId}/edit", 'Buchung erfasst. Bitte Wirtschaftsgut-Details ergänzen.');
} else {
View::redirect("/belege/{$belegId}", 'Buchung erfasst.');
}
} catch (\PDOException $e) {
error_log('[Steuerkram] PDO-Fehler in BookingController::store(): ' . $e->getMessage());
$this->renderBelegDetail($belegId, ['_exception' => 'Datenbankfehler beim Speichern der Buchung.'], $data);

View file

@ -0,0 +1,82 @@
<?php
declare(strict_types=1);
use Steuerkram\Models\Asset;
use Steuerkram\Models\Beleg;
use Steuerkram\Models\Booking;
class AnlageAutoRedirectTest extends TestCase
{
protected string $testName = 'Test 25: Neues Anlagegut aus Buchung → asset_id gesetzt';
public function run(): void
{
// Anlagevermögens-Konto suchen
$anlageKonto = \Steuerkram\Database::fetchOne(
"SELECT id FROM accounts WHERE kontenart = 'Anlagevermögen' AND aktiv = 1 LIMIT 1"
);
$this->assertNotEmpty($anlageKonto, 'Anlagevermögens-Konto vorhanden');
$bankKonto = \Steuerkram\Database::fetchOne(
"SELECT id FROM accounts WHERE kontenart = 'Zahlungskonto' AND aktiv = 1 LIMIT 1"
);
$this->assertNotEmpty($bankKonto, 'Zahlungskonto vorhanden');
if (!$anlageKonto || !$bankKonto) {
return;
}
// Beleg anlegen
$belegNr = 'ANLAGE-TEST-' . uniqid();
$datum = date('Y-m-d');
$belegId = Beleg::create([
'beleg_nr' => $belegNr,
'filename' => 'anlage-test.pdf',
'storage_path' => 'static/uploads/test/anlage-test.pdf',
'mime_type' => 'application/pdf',
'file_hash' => hash('sha256', $belegNr),
'beleg_datum' => $datum,
'rechnungs_nr' => 'RE-ANLAGE-001',
'betrag_brutto' => 1190.00,
'belegtyp' => 'Eingangsrechnung',
]);
$this->assertGreaterThan(0, $belegId, 'Beleg angelegt');
// Buchung auf Anlagevermögens-Konto, kein bestehendes Asset
$buchungId = Booking::create([
'beleg_id' => $belegId,
'buchungs_datum' => $datum,
'buchungstyp' => 'Ausgabe',
'kategorie_konto_id' => (int)$anlageKonto['id'],
'zahlungskonto_id' => (int)$bankKonto['id'],
'betrag_netto' => 1000.00,
'ust_satz' => 19.0,
'buchungstext' => 'Test-Notebook',
'asset_id' => null,
]);
$this->assertGreaterThan(0, $buchungId, 'Buchung auf Anlagekonto angelegt');
// Neues Asset muss automatisch existieren und mit Buchungstext befüllt sein
$buchung = Booking::find($buchungId);
$this->assertNotEmpty($buchung, 'Buchung abrufbar');
// In der Praxis legt BookingController das Asset an und setzt asset_id.
// Hier testen wir, dass Asset::create() korrekt einen Datensatz erzeugt,
// der die Buchungsdaten spiegelt – so wie BookingController es tut.
$assetId = Asset::create([
'bezeichnung' => 'Test-Notebook',
'account_id' => (int)$anlageKonto['id'],
'anschaffungsdatum' => $datum,
'anschaffungskosten' => 1000.00,
]);
$this->assertGreaterThan(0, $assetId, 'Asset wird aus Buchungsdaten angelegt (ID > 0)');
$asset = Asset::find($assetId);
$this->assertNotEmpty($asset, 'Asset abrufbar');
$this->assertEquals('Test-Notebook', $asset['bezeichnung'], 'Bezeichnung = Buchungstext');
$this->assertEquals($datum, $asset['anschaffungsdatum'], 'Anschaffungsdatum = Buchungsdatum');
$this->assertEquals(1000.00, (float)$asset['anschaffungskosten'], 'Anschaffungskosten = Nettobetrag');
$this->assertEquals((int)$anlageKonto['id'], (int)$asset['account_id'], 'Account-ID verknüpft');
}
}