Fix #15: USt. und Brutto-Anzeige unter Nettobetrag-Eingabefeld
This commit is contained in:
parent
f8899d6bff
commit
283830cc6a
2 changed files with 84 additions and 4 deletions
|
|
@ -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) + ' · 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;
|
||||
|
||||
|
|
|
|||
57
tests/14_UstBruttoAnzeigeTest.php
Normal file
57
tests/14_UstBruttoAnzeigeTest.php
Normal 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'
|
||||
);
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue