Fix #15: USt. und Brutto-Anzeige unter Nettobetrag-Eingabefeld

This commit is contained in:
fds2610 2026-03-30 22:04:39 +02:00
parent f8899d6bff
commit 283830cc6a
2 changed files with 84 additions and 4 deletions

View file

@ -333,7 +333,7 @@ $suppliers = $suppliers ?? [];
</div>
<div class="form-group">
<label>USt-Satz (%)</label>
<select name="ust_satz" id="ust_satz_select" onchange="updateSteuerartVisibility()">
<select name="ust_satz" id="ust_satz_select" onchange="updateSteuerartVisibility();updateNettoAnzeige()">
<?php foreach (['0','7','19'] as $s): ?>
<option value="<?= $s ?>"<?= ($formData['ust_satz'] ?? '19') === $s ? ' selected' : '' ?>><?= $s ?> %</option>
<?php endforeach; ?>
@ -416,10 +416,12 @@ $suppliers = $suppliers ?? [];
<div class="form-grid form-grid-2">
<div class="form-group">
<label>Nettobetrag (€) *</label>
<input type="number" name="betrag_netto" step="0.01" required
<input type="number" name="betrag_netto" id="betrag_netto_input" step="0.01" required
placeholder="0.00"
value="<?= $h($formData['betrag_netto'] ?? '') ?>"
class="<?= isset($formErrors['betrag_netto']) ? 'input-error' : '' ?>">
class="<?= isset($formErrors['betrag_netto']) ? 'input-error' : '' ?>"
oninput="updateNettoAnzeige()">
<p id="ust_brutto_anzeige" class="text-muted text-sm" style="margin-top:.25rem;line-height:1.6"></p>
</div>
<div class="form-group">
<label>Buchungstext *</label>
@ -506,6 +508,7 @@ document.addEventListener('DOMContentLoaded', function() {
if (checked) filterKategorieKonten(checked.value);
updateSteuerartVisibility();
updateEigenanteilState();
updateNettoAnzeige();
// Leeres Lieferantenfeld fokussieren wenn kein KI-Block aktiv
const sup = document.getElementById('supplier-persistent-input');
@ -526,6 +529,26 @@ function updateSteuerartVisibility() {
}
updateEigenanteilState();
}
function updateNettoAnzeige() {
const nettoEl = document.getElementById('betrag_netto_input');
const ustEl = document.getElementById('ust_satz_select');
const anzeige = document.getElementById('ust_brutto_anzeige');
if (!nettoEl || !ustEl || !anzeige) return;
const netto = parseFloat(nettoEl.value);
if (isNaN(netto) || nettoEl.value === '') {
anzeige.textContent = '';
return;
}
const ustSatz = parseFloat(ustEl.value) || 0;
const ust = Math.round(netto * ustSatz / 100 * 100) / 100;
const brutto = Math.round((netto + ust) * 100) / 100;
const fmt = v => v.toLocaleString('de-DE', {minimumFractionDigits: 2, maximumFractionDigits: 2}) + ' €';
anzeige.innerHTML = 'USt. ' + fmt(ust) + ' &nbsp;·&nbsp; Brutto ' + fmt(brutto);
}
</script>
<?php if (!$beleg['locked'] && ($kiAktiv ?? false)): ?>
@ -554,7 +577,7 @@ function _applyKiVorschlag(v) {
_selectById(zhlEl2, v.zahlungskonto_id);
if (zhlEl2) transferKontoNr(zhlEl2);
const netEl = document.querySelector('input[name="betrag_netto"]');
if (netEl && v.betrag_netto) netEl.value = v.betrag_netto;
if (netEl && v.betrag_netto) { netEl.value = v.betrag_netto; updateNettoAnzeige(); }
const txtEl = document.querySelector('input[name="buchungstext"]');
if (txtEl && v.buchungstext) txtEl.value = v.buchungstext;

View file

@ -0,0 +1,57 @@
<?php
declare(strict_types=1);
/**
* Test 14: USt- und Brutto-Anzeige im Buchungsformular
*
* Prüft, dass die notwendigen HTML-Elemente und die JS-Funktion
* updateNettoAnzeige() im Beleg-Detailview vorhanden sind.
*/
class UstBruttoAnzeigeTest extends TestCase
{
protected string $testName = 'Test 14: USt- und Brutto-Anzeige im Buchungsformular';
public function run(): void
{
$viewFile = __DIR__ . '/../src/Views/belege/detail.php';
$content = file_get_contents($viewFile);
$this->assert(
$content !== false,
'View-Datei belege/detail.php ist lesbar'
);
$this->assert(
str_contains($content, 'id="betrag_netto_input"'),
'Nettobetrag-Input hat id="betrag_netto_input"'
);
$this->assert(
str_contains($content, 'id="ust_brutto_anzeige"'),
'Anzeigebereich id="ust_brutto_anzeige" vorhanden'
);
$this->assert(
str_contains($content, 'oninput="updateNettoAnzeige()"'),
'Nettobetrag-Input ruft updateNettoAnzeige() bei Eingabe auf'
);
$this->assert(
str_contains($content, 'function updateNettoAnzeige()'),
'JavaScript-Funktion updateNettoAnzeige() ist definiert'
);
$this->assert(
str_contains($content, 'updateNettoAnzeige();updateNettoAnzeige()') === false
&& str_contains($content, 'updateNettoAnzeige()'),
'updateNettoAnzeige() wird an mehreren Stellen aufgerufen'
);
// Prüfe dass USt-Satz-Änderung auch updateNettoAnzeige aufruft
$this->assert(
str_contains($content, 'updateSteuerartVisibility();updateNettoAnzeige()'),
'USt-Satz-Änderung löst auch updateNettoAnzeige() aus'
);
}
}