feat(org-detail): Verbrauchs-Korrektur direkt an der Kachel, Zahlenfelder ohne Pfeile

Die Korrektur des Verbrauchszählers sitzt jetzt direkt an der Kachel
"Verbrauchte Credits", wo man den Zähler sieht, als Eingabefeld mit
Korrigieren-Knopf und Sicherheitsrückfrage. Das Feld im Kontingent-
Formular entfällt dafür. Außerdem sind die Hochzähl-Pfeile an allen
Zahlenfeldern des Portals entfernt.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Dieser Commit ist enthalten in:
claude-dev
2026-07-25 16:33:24 +00:00
Ursprung 73ae7be76d
Commit 50a8237e96
3 geänderte Dateien mit 47 neuen und 11 gelöschten Zeilen

Datei anzeigen

@@ -386,6 +386,37 @@ function setOrgLanguage(wert) {
_saveOrgSetting({ output_language: wert }, "Pipeline-Sprache gespeichert");
}
// Verbrauchszähler direkt an der Kachel korrigieren (Kulanz, Fehlbereinigung)
async function korrigiereVerbrauch() {
const input = document.getElementById("korrCreditsUsed");
if (!input || input.value === "") {
showToast("Bitte den neuen Zählerstand eintragen", "error");
return;
}
const n = parseFloat(input.value);
if (isNaN(n) || n < 0) {
showToast("Der Zählerstand muss 0 oder größer sein", "error");
return;
}
showConfirm(
"Verbrauch korrigieren",
"Verbrauchszähler dieser Organisation auf " + n.toLocaleString("de-DE") + " Credits setzen? Der Kunde sieht die Änderung sofort.",
async () => {
try {
const licenses = await API.get("/api/licenses?org_id=" + currentOrgId);
const aktiv = licenses.find(l => l.status === "active");
if (!aktiv) { showToast("Keine aktive Lizenz gefunden", "error"); return; }
await API.put("/api/token-usage/budget/" + aktiv.id, { credits_used: n });
input.value = "";
showToast("Verbrauchszähler gesetzt", "success");
loadOrgTokenUsage(currentOrgId);
} catch (err) {
showToast(err.message, "error");
}
}
);
}
// Max Nutzer der aktiven Lizenz direkt in der Tabelle ändern
async function setLicenseMaxUsers(licId, wert) {
const n = parseInt(wert, 10);
@@ -1124,7 +1155,6 @@ async function loadOrgTokenUsage(orgId) {
function fillBudgetForm(budget) {
const el = (id, val) => { const e = document.getElementById(id); if (e && val != null) e.value = val; };
el('editCreditsTotal', budget.credits_total);
el('editCreditsUsed', budget.credits_used ? Math.round(budget.credits_used) : 0);
el('editWarnPercent', budget.budget_warning_percent);
const periodSel = document.getElementById('editCreditsPeriod');
if (periodSel) periodSel.value = budget.credits_period || 'monthly';
@@ -1282,7 +1312,6 @@ document.addEventListener('DOMContentLoaded', function() {
body.unlimited_budget = isUnlimited;
var creditsTotal = document.getElementById('editCreditsTotal');
var creditsUsed = document.getElementById('editCreditsUsed');
if (!isUnlimited) {
if (creditsTotal && creditsTotal.value) body.credits_total = parseInt(creditsTotal.value);
@@ -1295,8 +1324,6 @@ document.addEventListener('DOMContentLoaded', function() {
var warnPercent = document.getElementById('editWarnPercent');
if (warnPercent && warnPercent.value) body.budget_warning_percent = parseInt(warnPercent.value);
}
// credits_used immer mitsenden (auch im Unlimited-Modus, fuer Korrekturen)
if (creditsUsed && creditsUsed.value !== '') body.credits_used = parseFloat(creditsUsed.value);
var result = await API.put('/api/token-usage/budget/' + activeLic.id, body);
if (msgEl) {