Feature: Asset-Verknüpfung in Buchung – Neu-Anlage oder Auswahl bei AV-Konten

This commit is contained in:
fds2610-bot 2026-04-12 11:51:20 +02:00
parent 05a964edbb
commit f22d640e4e
4 changed files with 30 additions and 5 deletions

View file

@ -0,0 +1,6 @@
-- Migration 030: asset_id in bookings – Verknüpfung zur Anlagegut-Tabelle
ALTER TABLE bookings
ADD COLUMN asset_id INT UNSIGNED NULL
COMMENT 'FK auf assets – bei Buchungen auf Anlagevermögenskonten'
AFTER beleg_id,
ADD KEY idx_bookings_asset (asset_id);

View file

@ -137,13 +137,28 @@ class BookingController
] ]
); );
// Bewirtungskonto-Split: 4650→4654, 4651→4656, 4652→4657 // Anlagevermögen: neues Asset anlegen oder bestehendes verknüpfen
$konto = \Steuerkram\Database::fetchOne( $konto = \Steuerkram\Database::fetchOne(
'SELECT kontonummer FROM accounts WHERE id = ?', 'SELECT id, kontonummer, kontenart FROM accounts WHERE id = ?',
[(int)$data['kategorie_konto_id']] [(int)$data['kategorie_konto_id']]
); );
$kontonummer = $konto['kontonummer'] ?? ''; $kontonummer = $konto['kontonummer'] ?? '';
if (($konto['kontenart'] ?? '') === 'Anlagevermögen') {
$assetId = isset($data['asset_id']) && $data['asset_id'] !== '' ? (int)$data['asset_id'] : null;
if ($assetId === null) {
// Neues Anlagegut anlegen
$assetId = \Steuerkram\Models\Asset::create([
'bezeichnung' => $data['buchungstext'],
'account_id' => (int)$data['kategorie_konto_id'],
'anschaffungsdatum' => $data['buchungs_datum'],
'anschaffungskosten' => (float)$data['betrag_netto'],
]);
}
$data['asset_id'] = $assetId;
}
// Bewirtungskonto-Split: 4650→4654, 4651→4656, 4652→4657
if (in_array($kontonummer, ['4650', '4651', '4652'], true)) { if (in_array($kontonummer, ['4650', '4651', '4652'], true)) {
$this->bucheBewirtungssplit($data, $kontonummer); $this->bucheBewirtungssplit($data, $kontonummer);
} else { } else {
@ -180,6 +195,7 @@ class BookingController
$bookings = \Steuerkram\Models\Booking::forBeleg($belegId); $bookings = \Steuerkram\Models\Booking::forBeleg($belegId);
$accounts = \Steuerkram\Models\Account::all(['aktiv' => 1]); $accounts = \Steuerkram\Models\Account::all(['aktiv' => 1]);
$integrity = \Steuerkram\Models\Beleg::verifyIntegrity($belegId); $integrity = \Steuerkram\Models\Beleg::verifyIntegrity($belegId);
$assets = \Steuerkram\Models\Asset::all();
$view = new View(); $view = new View();
$view->render('layout/base.php', [ $view->render('layout/base.php', [
@ -189,6 +205,7 @@ class BookingController
'bookings' => $bookings, 'bookings' => $bookings,
'integrity' => $integrity, 'integrity' => $integrity,
'accounts' => $accounts, 'accounts' => $accounts,
'assets' => $assets,
'formErrors' => $errors, 'formErrors' => $errors,
'formData' => $formData, 'formData' => $formData,
]), ]),

View file

@ -101,15 +101,18 @@ class Booking
$steuerart = 'normal'; $steuerart = 'normal';
} }
$assetId = isset($data['asset_id']) && $data['asset_id'] !== '' ? (int)$data['asset_id'] : null;
Database::execute( Database::execute(
'INSERT INTO bookings (buchungs_nr, beleg_id, buchungs_datum, buchungstyp, 'INSERT INTO bookings (buchungs_nr, beleg_id, asset_id, buchungs_datum, buchungstyp,
kategorie_konto_id, zahlungskonto_id, kategorie_konto_id, zahlungskonto_id,
betrag_netto, ust_satz, steuerart, betrag_ust, betrag_brutto, betrag_netto, ust_satz, steuerart, betrag_ust, betrag_brutto,
buchungstext, fiscal_year_id) buchungstext, fiscal_year_id)
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)',
[ [
$nr, $nr,
(int)$data['beleg_id'], (int)$data['beleg_id'],
$assetId,
$data['buchungs_datum'], $data['buchungs_datum'],
$data['buchungstyp'], $data['buchungstyp'],
(int)$data['kategorie_konto_id'], (int)$data['kategorie_konto_id'],

View file

@ -496,7 +496,6 @@ $suppliers = $suppliers ?? [];
<div class="modal" style="max-width:640px;width:100%"> <div class="modal" style="max-width:640px;width:100%">
<div class="modal-header"> <div class="modal-header">
<h3 class="modal-title">Anlagevermögen buchen</h3> <h3 class="modal-title">Anlagevermögen buchen</h3>
<button type="button" class="modal-close" data-modal-close aria-label="Schließen">&times;</button>
</div> </div>
<div class="modal-body"> <div class="modal-body">
<p style="margin-bottom:1rem">Das gewählte Konto gehört zum Anlagevermögen. Soll ein neues Anlagegut angelegt oder ein bestehendes ausgewählt werden?</p> <p style="margin-bottom:1rem">Das gewählte Konto gehört zum Anlagevermögen. Soll ein neues Anlagegut angelegt oder ein bestehendes ausgewählt werden?</p>