Fix #34: Nach Buchung auf Anlagevermögens-Konto direkt zur Asset-Bearbeitung weiterleiten
This commit is contained in:
parent
02463e40d4
commit
0866344f51
2 changed files with 89 additions and 1 deletions
|
|
@ -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);
|
||||
|
|
|
|||
82
tests/25_AnlageAutoRedirectTest.php
Normal file
82
tests/25_AnlageAutoRedirectTest.php
Normal 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');
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue