diff --git a/public/static/js/app.js b/public/static/js/app.js
index cb668b8..6cd6f03 100644
--- a/public/static/js/app.js
+++ b/public/static/js/app.js
@@ -524,17 +524,18 @@ document.addEventListener('input', function(e) {
if (!inp.matches('#vorlage-modal .vorlage-netto, #vorlage-modal .vorlage-brutto')) return;
const row = inp.closest('.vorlage-ust-row');
if (!row) return;
+ const pDec = v => parseFloat(String(v).replace(',', '.')) || 0;
const satz = parseFloat(row.dataset.ustSatz) / 100;
const netto = row.querySelector('.vorlage-netto');
const brutto = row.querySelector('.vorlage-brutto');
const ust = row.querySelector('.vorlage-ust');
const ustAnzeige = row.querySelector('.vorlage-ust-anzeige');
if (inp.classList.contains('vorlage-netto')) {
- const n = parseFloat(netto.value) || 0;
+ const n = pDec(netto.value);
brutto.value = (n * (1 + satz)).toFixed(2);
ust.value = (n * satz).toFixed(2);
} else {
- const b = parseFloat(brutto.value) || 0;
+ const b = pDec(brutto.value);
const n = b / (1 + satz);
netto.value = n.toFixed(2);
ust.value = (b - n).toFixed(2);
@@ -547,7 +548,7 @@ function vorlageUpdateBruttoGesamt() {
const modal = document.getElementById('vorlage-modal');
if (!modal) return;
const bruttoFelder = modal.querySelectorAll('.vorlage-brutto');
- const summe = Array.from(bruttoFelder).reduce((s, el) => s + (parseFloat(el.value) || 0), 0);
+ const summe = Array.from(bruttoFelder).reduce((s, el) => s + (parseFloat(String(el.value).replace(',', '.')) || 0), 0);
const anzeige = modal.querySelector('[data-feldname="brutto_gesamt"]');
if (anzeige) anzeige.textContent = summe.toFixed(2).replace('.', ',') + ' €';
}
diff --git a/src/Services/VorlageBuchungsService.php b/src/Services/VorlageBuchungsService.php
index ad69907..446464b 100644
--- a/src/Services/VorlageBuchungsService.php
+++ b/src/Services/VorlageBuchungsService.php
@@ -58,7 +58,7 @@ class VorlageBuchungsService
continue;
}
foreach ($regel['buchungen'] as $buchung) {
- $betrag = round((float)($inputDaten[$buchung['betrag_ref']] ?? 0), 2);
+ $betrag = round((float)str_replace(',', '.', (string)($inputDaten[$buchung['betrag_ref']] ?? 0)), 2);
if ($betrag == 0.0) {
continue;
}
diff --git a/src/Views/buchungsvorlagen/modal.php b/src/Views/buchungsvorlagen/modal.php
index 79e5ea7..9b55cff 100644
--- a/src/Views/buchungsvorlagen/modal.php
+++ b/src/Views/buchungsvorlagen/modal.php
@@ -2,10 +2,14 @@
declare(strict_types=1);
$h = fn($v) => htmlspecialchars((string)$v, ENT_QUOTES, 'UTF-8');
-// Felder nach Gruppen aufteilen
-$gruppe1 = array_filter($felder, fn($f) => $f['gruppe_nr'] == 1);
-$gruppe2 = array_filter($felder, fn($f) => $f['gruppe_nr'] == 2);
-$gruppe3 = array_filter($felder, fn($f) => $f['gruppe_nr'] == 3);
+// Felder nach Gruppe_nr sortiert gruppieren (dynamisch, unabhängig von festen Nummern)
+$gruppenFelder = [];
+foreach ($felder as $feld) {
+ $gruppenFelder[(int)$feld['gruppe_nr']][] = $feld;
+}
+ksort($gruppenFelder);
+
+$gruppenLabel = [1 => 'Belegdaten', 2 => 'Beträge', 3 => 'Zahlung'];
// Vorbelegen: Vorlage-Standard-Lieferant hat Vorrang vor Beleg-Lieferant
$standardLieferant = trim($vorlage['standard_lieferant'] ?? '');
@@ -44,19 +48,83 @@ if (!$defaultKontoId && !empty($zahlungskonten)) {
-
-
+ $felderInGruppe): ?>
-
Belegdaten
-
-
+
+ = $h($gruppenLabel[$gruppeNr] ?? 'Abschnitt ' . $gruppeNr) ?>
+
+
+
+
+
+ | Steuer |
+ Netto (€) |
+ Brutto (€) |
+ USt (€) |
+
+
+
+
+
+
+
+
+
+
+ | = $h($feld['label']) ?> |
+
+
+ |
+
+
+ |
+
+ 0,00
+
+ |
+
+
+
+
+
+
+
0,00 €
-
+
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
Zahlung
-
-
-
-
-
-
-
-
-
-
+
diff --git a/src/version.txt b/src/version.txt
index 4be5dc2..4d21510 100644
--- a/src/version.txt
+++ b/src/version.txt
@@ -1 +1 @@
-1-260601
+1-260604