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>
60 lines
1.9 KiB
JavaScript
60 lines
1.9 KiB
JavaScript
/* 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 };
|
||
})();
|