diff --git a/database.js b/database.js index 4cf55a5..05f694d 100644 --- a/database.js +++ b/database.js @@ -55,12 +55,15 @@ function initDatabase() { const db = getDatabase(); db.serialize(() => { - // Anbieter (Providers) + // Anbieter (Providers). default_vo_id picks which of this provider's + // VOs is preselected in the schaltung wizard. db.run(`CREATE TABLE IF NOT EXISTS anbieter ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL UNIQUE, + default_vo_id INTEGER, created_at DATETIME DEFAULT CURRENT_TIMESTAMP )`); + addColumnIfMissing(db, 'anbieter', 'default_vo_id INTEGER'); // Mitarbeiter-Prozentsätze pro Anbieter db.run(`CREATE TABLE IF NOT EXISTS mitarbeiter_prozentsaetze ( diff --git a/public/index.html b/public/index.html index 916377a..357bdb7 100644 --- a/public/index.html +++ b/public/index.html @@ -1273,6 +1273,7 @@
Die mit ★ markierte VO wird bei der Schaltungserfassung automatisch vorausgewählt.
| Nummer | Bezeichnung | Aktiv | +Standard | Aktionen | diff --git a/public/script.js b/public/script.js index b78f8fd..98cbb1b 100644 --- a/public/script.js +++ b/public/script.js @@ -68,7 +68,7 @@ async function renderWizardAnbieterButtons() { btn.className = 'btn-success'; btn.style.cssText = 'padding:14px 22px; font-size:15px; min-width:140px;'; btn.textContent = a.name; - btn.addEventListener('click', () => wizardSelectAnbieter(a.id, a.name)); + btn.addEventListener('click', () => wizardSelectAnbieter(a.id, a.name, a.default_vo_id)); container.appendChild(btn); }); } catch (e) { @@ -76,15 +76,17 @@ async function renderWizardAnbieterButtons() { } } -async function wizardSelectAnbieter(anbieterId, anbieterName) { +async function wizardSelectAnbieter(anbieterId, anbieterName, defaultVoId) { document.getElementById('anbieter').value = anbieterId; document.getElementById('wizardAnbieterLabel').textContent = '· ' + anbieterName; document.getElementById('wizardStep1').style.display = 'none'; document.getElementById('wizardStep2').style.display = 'block'; - // Load VOs for this provider const voSelect = document.getElementById('wizardVo'); voSelect.innerHTML = ''; + document.getElementById('wizardTarif').innerHTML = ''; + document.getElementById('tarifoptionenSection').style.display = 'none'; + try { const vos = await apiRequest(`/api/vos?anbieter_id=${encodeURIComponent(anbieterId)}`); vos.forEach(v => { @@ -93,12 +95,20 @@ async function wizardSelectAnbieter(anbieterId, anbieterName) { }); if (vos.length === 0) { showMessage('Für diesen Anbieter wurden noch keine VOs angelegt. Bitte in der Administration → VOs eine VO anlegen.', 'error'); + return; + } + // Preselect the provider's default VO if set, otherwise the first VO if it is the only one. + let preselect = null; + if (defaultVoId && vos.some(v => v.id === defaultVoId)) { + preselect = defaultVoId; + } else if (vos.length === 1) { + preselect = vos[0].id; + } + if (preselect) { + voSelect.value = String(preselect); + await loadTarifeForWizard(); } } catch (e) { /* error shown */ } - - // Reset Tarif + Tarifoptionen - document.getElementById('wizardTarif').innerHTML = ''; - document.getElementById('tarifoptionenSection').style.display = 'none'; } function wizardBackToStep1() { @@ -4067,22 +4077,34 @@ async function loadAnbieterForVoForm() { async function loadVosAdmin() { const tbody = document.getElementById('vosList'); if (!tbody) return; - tbody.innerHTML = '|
|---|---|---|---|---|---|
| Lade... | |||||
| Lade... | |||||
| Keine VOs vorhanden | |||||
| Keine VOs vorhanden | ${escapeHtml(v.anbieter_name)} | ${escapeHtml(v.nummer)} | ${escapeHtml(v.bezeichnung || '')} | ${v.aktiv ? 'Ja' : 'Nein'} | +${isDefault ? '★' : ''} | + ${isDefault + ? `` + : ``} |