Finanzmanager/public/static/betrag.js
fds2610-bot 619e427a30 Fix #96: Splitbuchungen zeigen Restbetrag, Speichern nur bei Null
Die Summenzeile der Splitbuchungen (Buchungsmaske und Splitdialog im
Kontoblatt) zeigt jetzt den noch offenen Restbetrag zum Buchungswert statt
der Summe der Zeilen. „Speichern" bleibt gesperrt, solange Splitzeilen
befüllt sind und der Restbetrag nicht Null ist; ohne Splitzeilen (auch mit
direkter Kategorie/Gegenkonto) bleibt der Knopf wie bisher an.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-09-29 23:34:27 +02:00

60 lines
1.9 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* Beträge im deutschen Format lesen und schreiben.
*
* Dieselbe Regel wie KontenController::zahl(): ohne Komma entscheidet die
* Stellenzahl, ob der Punkt Tausender- oder Dezimaltrenner ist. Die Maske und
* das Kontoblatt rechnen beide Restbeträge mit – deshalb steht das hier und
* nicht zweimal.
*/
(function () {
'use strict';
function zahl(text) {
const bereinigt = String(text).replace(/[\s€]/g, '');
if (bereinigt === '') {
return 0;
}
if (bereinigt.indexOf(',') !== -1) {
return parseFloat(bereinigt.replace(/\./g, '').replace(',', '.')) || 0;
}
const punkte = (bereinigt.match(/\./g) || []).length;
const letzter = bereinigt.split('.').pop();
if (punkte > 1 || (punkte === 1 && letzter.length === 3)) {
return parseFloat(bereinigt.replace(/\./g, '')) || 0;
}
return parseFloat(bereinigt) || 0;
}
function formatiere(wert) {
return wert.toLocaleString('de-DE', { minimumFractionDigits: 2, maximumFractionDigits: 2 });
}
/* Die Summe der Splitzeilen unter `felder` gegen `ziel` – das Ergebnis geht
* so in die Anzeige, wie beide Masken es brauchen. Angezeigt wird der noch
* offene Restbetrag (ziel - summe), nicht die Summe der Zeilen selbst: Nur
* so sieht man auf einen Blick, was noch fehlt. */
function splitsumme(felder, ziel) {
let summe = 0;
let belegt = false;
felder.forEach(function (feld) {
if (feld.value.trim() === '') {
return;
}
belegt = true;
summe += zahl(feld.value);
});
const rest = Math.round((ziel - summe) * 100) / 100;
return {
belegt: belegt,
summe: summe,
rest: rest,
text: formatiere(rest)
};
}
window.FmBetrag = { zahl: zahl, formatiere: formatiere, splitsumme: splitsumme };
})();