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>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>USt-Satz (%)</label>
|
<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): ?>
|
<?php foreach (['0','7','19'] as $s): ?>
|
||||||
<option value="<?= $s ?>"<?= ($formData['ust_satz'] ?? '19') === $s ? ' selected' : '' ?>><?= $s ?> %</option>
|
<option value="<?= $s ?>"<?= ($formData['ust_satz'] ?? '19') === $s ? ' selected' : '' ?>><?= $s ?> %</option>
|
||||||
<?php endforeach; ?>
|
<?php endforeach; ?>
|
||||||
|
|
@ -416,10 +416,12 @@ $suppliers = $suppliers ?? [];
|
||||||
<div class="form-grid form-grid-2">
|
<div class="form-grid form-grid-2">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>Nettobetrag (€) *</label>
|
<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"
|
placeholder="0.00"
|
||||||
value="<?= $h($formData['betrag_netto'] ?? '') ?>"
|
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>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label>Buchungstext *</label>
|
<label>Buchungstext *</label>
|
||||||
|
|
@ -506,6 +508,7 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||||
if (checked) filterKategorieKonten(checked.value);
|
if (checked) filterKategorieKonten(checked.value);
|
||||||
updateSteuerartVisibility();
|
updateSteuerartVisibility();
|
||||||
updateEigenanteilState();
|
updateEigenanteilState();
|
||||||
|
updateNettoAnzeige();
|
||||||
|
|
||||||
// Leeres Lieferantenfeld fokussieren wenn kein KI-Block aktiv
|
// Leeres Lieferantenfeld fokussieren wenn kein KI-Block aktiv
|
||||||
const sup = document.getElementById('supplier-persistent-input');
|
const sup = document.getElementById('supplier-persistent-input');
|
||||||
|
|
@ -526,6 +529,26 @@ function updateSteuerartVisibility() {
|
||||||
}
|
}
|
||||||
updateEigenanteilState();
|
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>
|
</script>
|
||||||
|
|
||||||
<?php if (!$beleg['locked'] && ($kiAktiv ?? false)): ?>
|
<?php if (!$beleg['locked'] && ($kiAktiv ?? false)): ?>
|
||||||
|
|
@ -554,7 +577,7 @@ function _applyKiVorschlag(v) {
|
||||||
_selectById(zhlEl2, v.zahlungskonto_id);
|
_selectById(zhlEl2, v.zahlungskonto_id);
|
||||||
if (zhlEl2) transferKontoNr(zhlEl2);
|
if (zhlEl2) transferKontoNr(zhlEl2);
|
||||||
const netEl = document.querySelector('input[name="betrag_netto"]');
|
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"]');
|
const txtEl = document.querySelector('input[name="buchungstext"]');
|
||||||
if (txtEl && v.buchungstext) txtEl.value = v.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