DMA for SMEs
We'll guide you through the world of AI.
/**
* DMA (Digital Maturity Assessment) Calculator
* -------------------------------------------
* Dieses Skript berechnet die Reifegrade für die KMU- und ÖD-Versionen des DMA-Formulars in Elementor Pro.
* Es synchronisiert benutzerdefinierte HTML-Matrix-Tabellen mit versteckten Elementor-Feldern,
* führt die Reifegradberechnungen durch und befüllt das visuelle Dashboard am Ende des Formulars.
*/
(function() {
let initialized = false;
function tryInit() {
if (initialized) return;
// Versuche festzustellen, welches Formular auf der Seite aktiv ist
const isKMUForm = document.querySelector('[name*="kmu_"]') ||
document.querySelector('[class*="kmu_"]') ||
document.getElementById('form-field-kmu_score_overall') !== null;
const isODForm = document.querySelector('[name*="od_"]') ||
document.querySelector('[class*="od_"]') ||
document.getElementById('form-field-od_score_overall') !== null;
if (isKMUForm) {
console.log("DMA Calculator: KMU Formular erkannt, initialisiere...");
setupKMUMatrixTable();
setupCheckboxResets('kmu_m21_q2');
setupKMUQ1Resets();
setupCheckboxResets('kmu_m22_q3');
setupCheckboxResets('kmu_m23_q5');
setupCheckboxResets('kmu_m23_q6');
setupCheckboxResets('kmu_m24_q7');
setupCheckboxResets('kmu_m24_q8');
setupCheckboxResets('kmu_m26_q10');
// Event Listener auf alle relevanten Formularfelder legen
document.addEventListener('change', function(e) {
if (e.target.name && e.target.name.includes('kmu_')) {
calculateKMUScores();
}
});
// Event-Listener für Elementor-Schritt-Navigation
if (window.jQuery) {
jQuery(document).on('elementor/forms/navigation', function() {
setTimeout(calculateKMUScores, 100);
});
jQuery(document).on('submit_success', function() {
showSuccessPopup();
});
}
// Fallback für Klicks auf Navigations-Buttons
document.addEventListener('click', function(e) {
if (e.target.closest('.elementor-button') || e.target.closest('[class*="step"]')) {
setTimeout(calculateKMUScores, 200);
}
});
calculateKMUScores();
initialized = true;
} else if (isODForm) {
console.log("DMA Calculator: ÖD Formular erkannt, initialisiere...");
setupCheckboxResets('od_m21_q1');
setupCheckboxResets('od_m22_q3');
setupCheckboxResets('od_m23_q5');
setupCheckboxResets('od_m23_q6');
setupCheckboxResets('od_m24_q7');
setupCheckboxResets('od_m24_q8');
setupCheckboxResets('od_m26_q10');
document.addEventListener('change', function(e) {
if (e.target.name && e.target.name.includes('od_')) {
calculateODScores();
}
});
if (window.jQuery) {
jQuery(document).on('elementor/forms/navigation', function() {
setTimeout(calculateODScores, 100);
});
jQuery(document).on('submit_success', function() {
showSuccessPopup();
});
}
document.addEventListener('click', function(e) {
if (e.target.closest('.elementor-button') || e.target.closest('[class*="step"]')) {
setTimeout(calculateODScores, 200);
}
});
calculateODScores();
initialized = true;
}
}
// Starte Initialisierungsversuche zu verschiedenen Zeitpunkten
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', tryInit);
} else {
tryInit();
}
window.addEventListener('load', tryInit);
// Polling-Fallback für dynamisch geladene Formulare
const initInterval = setInterval(function() {
if (initialized) {
clearInterval(initInterval);
} else {
tryInit();
}
}, 500);
// Nach 15 Sekunden Suche einstellen
setTimeout(function() {
clearInterval(initInterval);
}, 15000);
/**
* Setzt die Checkboxen zurück, wenn "Keine der Optionen" (oder das Äquivalent) ausgewählt wird,
* und hebt die Auswahl von "Keine der Optionen" auf, wenn eine andere Checkbox gewählt wird.
*/
function setupCheckboxResets(fieldId) {
const selector = `[name^="form_fields[${fieldId}]"]`;
const checkboxes = document.querySelectorAll(selector);
if (checkboxes.length === 0) return;
checkboxes.forEach(cb => {
cb.addEventListener('change', function(e) {
const currentVal = e.target.value.trim();
const isNoneOption = currentVal === '0' || e.target.nextElementSibling?.textContent.toLowerCase().includes('keine') || e.target.nextElementSibling?.textContent.toLowerCase().includes('keiner');
if (e.target.checked) {
if (isNoneOption) {
// Wenn "Keine" gecheckt wird, alle anderen entchecken
checkboxes.forEach(otherCb => {
if (otherCb !== e.target) otherCb.checked = false;
});
} else {
// Wenn etwas anderes gecheckt wird, das "Keine"-Feld entchecken
checkboxes.forEach(otherCb => {
const otherVal = otherCb.value.trim();
const otherIsNone = otherVal === '0' || otherCb.nextElementSibling?.textContent.toLowerCase().includes('keine') || otherCb.nextElementSibling?.textContent.toLowerCase().includes('keiner');
if (otherIsNone) otherCb.checked = false;
});
}
}
});
});
}
/**
* KMU M2.1 Q1 Matrix-Tabelle Funktionalität:
* Synchronisiert die Checkboxen der HTML-Tabelle mit dem Hidden Feld in Elementor.
*/
function setupKMUMatrixTable() {
const matrixContainer = document.querySelector('.dma-matrix-container');
const hiddenField = document.getElementById('form-field-kmu_m21_q1_data') || document.querySelector('[name="form_fields[kmu_m21_q1_data]"]');
const noneCheckbox = document.getElementById('kmu_m21_q1_none');
if (!matrixContainer || !hiddenField) return;
const tableCheckboxes = matrixContainer.querySelectorAll('.dma-matrix-cb');
tableCheckboxes.forEach(cb => {
cb.addEventListener('change', function() {
if (this.checked && noneCheckbox) {
noneCheckbox.checked = false; // "Keine" entchecken
}
updateKMUMatrixHiddenData(hiddenField, tableCheckboxes, noneCheckbox);
calculateKMUScores();
});
});
if (noneCheckbox) {
noneCheckbox.addEventListener('change', function() {
if (this.checked) {
// Alle anderen Checkboxen in der Tabelle deaktivieren
tableCheckboxes.forEach(cb => cb.checked = false);
}
updateKMUMatrixHiddenData(hiddenField, tableCheckboxes, noneCheckbox);
calculateKMUScores();
});
}
}
function updateKMUMatrixHiddenData(hiddenField, checkboxes, noneCheckbox) {
const data = {
getaetigt: [],
geplant: []
};
if (!noneCheckbox || !noneCheckbox.checked) {
checkboxes.forEach(cb => {
if (cb.checked) {
const idx = parseInt(cb.getAttribute('data-index'));
if (cb.classList.contains('getaetigt')) {
data.getaetigt.push(idx);
} else if (cb.classList.contains('geplant')) {
data.geplant.push(idx);
}
}
});
}
// Als JSON im Hidden Field abspeichern, damit Elementor es mitsendet
hiddenField.value = JSON.stringify(data);
}
/**
* Hilfsfunktion zum Summieren von ausgewählten Checkbox-Werten in Elementor
*/
function sumCheckedValues(fieldId) {
let sum = 0;
const checked = document.querySelectorAll(`[name^="form_fields[${fieldId}]"]:checked`);
checked.forEach(cb => {
const val = parseFloat(cb.value);
if (!isNaN(val)) sum += val;
});
return sum;
}
/**
* Hilfsfunktion zum Zählen der ausgewählten Checkboxen (z. B. wenn alle je 1 Punkt wert sind)
*/
function countCheckedOptions(fieldId) {
const checked = document.querySelectorAll(`[name^="form_fields[${fieldId}]"]:checked`);
let count = 0;
checked.forEach(cb => {
// "Keine" Option (Wert 0 oder Text enthält 'keine') nicht mitzählen
const labelText = cb.nextElementSibling?.textContent.toLowerCase() || "";
const isNone = cb.value.trim() === '0' || labelText.includes('keine') || labelText.includes('keiner');
if (!isNone) count++;
});
return count;
}
/**
* Hilfsfunktion zum Auslesen eines Radio-Buttons
*/
function getRadioValue(fieldId) {
const checked = document.querySelector(`[name="form_fields[${fieldId}]"]:checked`);
return checked ? parseFloat(checked.value) : 0;
}
function updateHiddenScoreField(fieldId, val) {
const fld = document.getElementById(`form-field-${fieldId}`) ||
document.querySelector(`[name="form_fields[${fieldId}]"]`) ||
document.querySelector(`[name*="${fieldId}"]`);
if (fld) fld.value = val;
}
/**
* BERECHNUNG FÜR KMU (UNTERNEHMEN)
*/
function calculateKMUScores() {
console.log("Berechne KMU Scores...");
// --- Dimension 1: Strategie (M2.1) ---
let q1_getaetigt_count = 0;
let q1_geplant_count = 0;
const matrixContainer = document.querySelector('.dma-matrix-container');
const noneCheckbox = document.getElementById('kmu_m21_q1_none');
if (matrixContainer && (!noneCheckbox || !noneCheckbox.checked)) {
q1_getaetigt_count = matrixContainer.querySelectorAll('.dma-matrix-cb.getaetigt:checked').length;
q1_geplant_count = matrixContainer.querySelectorAll('.dma-matrix-cb.geplant:checked').length;
} else {
// Fallback für Standard-Elementor-Radios (falls keine Matrix-Tabelle im DOM ist)
for (let i = 1; i Max 30 Punkte summiert * 3.333 = 100
const d1 = Math.min(100, Math.round((q1_getaetigt_count + q1_geplant_count + q2_count) * (100 / 30)));
// --- Dimension 2: Bereitschaft (M2.2) ---
const q3_count = countCheckedOptions('kmu_m22_q3'); // Max 10
let q4_sum = 0;
for (let i = 1; i <= 7; i++) {
q4_sum += getRadioValue(`kmu_m22_q4_${i}`);
}
const q4_scaled = (q4_sum / 7); // Skaliert auf 10 Punkte (da Q4-Werte nun 0 bis 10 sind)
const d2 = Math.min(100, Math.round((q3_count + q4_scaled) * 5)); // D2 = (Q3 + Q4) * 5
// --- Dimension 3: Menschzentriert (M2.3) ---
const q5_sum = sumCheckedValues('kmu_m23_q5'); // Max 9 Punkte in Gewichten
const q5_scaled = (q5_sum * 10 / 9); // Skaliert auf 10
const q6_sum = sumCheckedValues('kmu_m23_q6'); // Max 10 Punkte in Gewichten
const d3 = Math.min(100, Math.round((q5_scaled + q6_sum) * 5)); // D3 = (Q5 + Q6) * 5
// --- Dimension 4: Daten & Sicherheit (M2.4) ---
const q7_count = countCheckedOptions('kmu_m24_q7'); // Max 7 positive Optionen
const q7_scaled = (q7_count * 10 / 7);
const q8_count = countCheckedOptions('kmu_m24_q8'); // Max 6 positive Optionen
const q8_scaled = (q8_count * 10 / 6);
const d4 = Math.min(100, Math.round((q7_scaled + q8_scaled) * 5)); // D4 = (Q7 + Q8) * 5
// --- Dimension 5: Automatisierung & KI (M2.5) ---
let q9_sum = 0;
for (let i = 1; i <= 5; i++) {
q9_sum += getRadioValue(`kmu_m25_q9_${i}`);
}
const q9_scaled = (q9_sum / 5); // Skaliert auf 10 (da Q9-Werte nun 0 bis 10 sind)
const d5 = Math.min(100, Math.round(q9_scaled * 10)); // D5 = Q9 * 10
// --- Dimension 6: Grüne Digitalisierung (M2.6) ---
const q10_count = countCheckedOptions('kmu_m26_q10'); // Max 10
let q11_sum = 0;
for (let i = 1; i <= 5; i++) {
q11_sum += getRadioValue(`kmu_m26_q11_${i}`); // Werte 0, 10, 20. Max 100
}
const q11_scaled = q11_sum / 10; // Skaliert auf max 10 Punkte
const d6 = Math.min(100, Math.round((q10_count + q11_scaled) * 5)); // D6 = (Q10 + Q11) * 5
// --- Gesamtergebnis ---
const overall = Math.round((d1 + d2 + d3 + d4 + d5 + d6) / 6);
// Versteckte Felder befüllen (für die Übermittlung)
updateHiddenScoreField('kmu_score_d1', d1);
updateHiddenScoreField('kmu_score_d2', d2);
updateHiddenScoreField('kmu_score_d3', d3);
updateHiddenScoreField('kmu_score_d4', d4);
updateHiddenScoreField('kmu_score_d5', d5);
updateHiddenScoreField('kmu_score_d6', d6);
updateHiddenScoreField('kmu_score_overall', overall);
// Dashboard rendern
renderDashboard('kmu_dma_dashboard_html', { d1, d2, d3, d4, d5, d6 }, overall);
}
/**
* BERECHNUNG FÜR ÖFFENTLICHEN SEKTOR (ÖD)
*/
function calculateODScores() {
console.log("Berechne ÖD Scores...");
// --- Dimension 1: Strategie & Investition (M2.1) ---
const q1_count = countCheckedOptions('od_m21_q1'); // Max 10
let q2_sum = 0;
for (let i = 1; i <= 8; i++) {
q2_sum += getRadioValue(`od_m21_q2_${i}`); // Werte: 0, 0.5, 1. Max 8
}
const q2_scaled = (q2_sum * 10 / 8);
const d1 = Math.min(100, Math.round((q1_count + q2_scaled) * 5));
// --- Dimension 2: Bereitschaft (M2.2) ---
const q3_count = countCheckedOptions('od_m22_q3'); // Max 9
const q3_scaled = (q3_count * 10 / 9);
let q4_sum = 0;
for (let i = 1; i <= 8; i++) {
q4_sum += getRadioValue(`od_m22_q4_${i}`); // Skala 0 bis 1. Max 8
}
const q4_scaled = (q4_sum * 10 / 8);
const d2 = Math.min(100, Math.round((q3_scaled + q4_scaled) * 5));
// --- Dimension 3: Menschzentriert (M2.3) ---
const q5_count = countCheckedOptions('od_m23_q5'); // Max 7
const q5_scaled = (q5_count * 10 / 7);
const q6_count = countCheckedOptions('od_m23_q6'); // Max 10
const d3 = Math.min(100, Math.round((q5_scaled + q6_count) * 5));
// --- Dimension 4: Daten & Sicherheit (M2.4) ---
const q7_count = countCheckedOptions('od_m24_q7'); // Max 9
const q7_scaled = (q7_count * 10 / 9);
const q8_count = countCheckedOptions('od_m24_q8'); // Max 6
const q8_scaled = (q8_count * 10 / 6);
const d4 = Math.min(100, Math.round((q7_scaled + q8_scaled) * 5));
// --- Dimension 5: Interoperabilität (M2.5) ---
let q9_sum = 0;
for (let i = 1; i <= 16; i++) {
q9_sum += getRadioValue(`od_m25_q9_${i}`); // Werte: 0, 0.5, 1. Max 16
}
const q9_scaled = (q9_sum * 10 / 16);
const d5 = Math.min(100, Math.round(q9_scaled * 10));
// --- Dimension 6: Grüne Digitalisierung (M2.6) ---
const q10_count = countCheckedOptions('od_m26_q10'); // Max 9
const q10_scaled = (q10_count * 10 / 9);
let q11_sum = 0;
for (let i = 1; i <= 5; i++) {
q11_sum += getRadioValue(`od_m26_q11_${i}`); // Werte: 0, 0.5, 1. Max 5
}
const q11_scaled = (q11_sum * 10 / 5);
const d6 = Math.min(100, Math.round((q10_scaled + q11_scaled) * 5));
// --- Gesamtergebnis ---
const overall = Math.round((d1 + d2 + d3 + d4 + d5 + d6) / 6);
// Versteckte Felder befüllen
updateHiddenScoreField('od_score_d1', d1);
updateHiddenScoreField('od_score_d2', d2);
updateHiddenScoreField('od_score_d3', d3);
updateHiddenScoreField('od_score_d4', d4);
updateHiddenScoreField('od_score_d5', d5);
updateHiddenScoreField('od_score_d6', d6);
updateHiddenScoreField('od_score_overall', overall);
// Dashboard rendern
renderDashboard('od_dma_dashboard_html', { d1, d2, d3, d4, d5, d6 }, overall);
}
/**
* Rendert die visuell ansprechende Dashboard-Auswertung im HTML-Bereich am Ende.
*/
function renderDashboard(containerId, dimensionScores, overallScore) {
let container = document.getElementById('dma-dashboard-container') ||
document.querySelector(`#form-field-${containerId} #dma-dashboard-container`) ||
document.querySelector('#dma-dashboard-container');
if (!container) {
// Dynamisches Fallback: Falls der Container nicht im HTML-Feld existiert, erzeuge ihn im Elementor-Feld-Wrapper
const wrapper = document.querySelector(`.elementor-field-group-${containerId}`) ||
document.querySelector(`[class*="${containerId}"]`);
if (wrapper) {
console.log(`DMA Calculator: Erzeuge Dashboard-Container dynamisch in Wrapper für ${containerId}`);
container = document.createElement('div');
container.id = 'dma-dashboard-container';
wrapper.appendChild(container);
}
}
if (!container) {
console.log("DMA Calculator: Dashboard-Container nicht gefunden und konnte nicht erzeugt werden.");
return;
}
// Reifegrad-Klasse bestimmen
let levelTitle = "";
let levelDesc = "";
let levelColor = "";
if (overallScore = 20 && overallScore = 50 && overallScore {
const val = dimensionScores[key];
let barColor = "#3b82f6"; // default blau
if (val < 20) barColor = "#ef4444";
else if (val < 50) barColor = "#f59e0b";
else if (val < 80) barColor = "#10b981";
dimensionsHtml += `
`;
});
container.innerHTML = `
`;
}
/**
* KMU M2.1 Q1 Reset-Funktionalität:
* Setzt alle Radio-Buttons zurück, wenn "Keine der Optionen" gewählt wird.
*/
function setupKMUQ1Resets() {
const noneCheckbox = document.getElementById('form-field-kmu_m21_q1_none') ||
document.querySelector('[name="form_fields[kmu_m21_q1_none]"]') ||
document.querySelector('[name*="kmu_m21_q1_none"]') ||
document.getElementById('kmu_m21_q1_none');
if (!noneCheckbox) return;
noneCheckbox.addEventListener('change', function() {
if (this.checked) {
for (let i = 1; i r.checked = false);
}
calculateKMUScores();
}
});
for (let i = 1; i {
r.addEventListener('change', function() {
if (this.checked && noneCheckbox.checked) {
noneCheckbox.checked = false;
calculateKMUScores();
}
});
});
}
}
/**
* Erzeugt und zeigt das Erfolgs-Popup nach Absenden des Formulars an.
*/
function showSuccessPopup() {
let overlay = document.getElementById('dmaSuccessOverlay');
if (!overlay) {
overlay = document.createElement('div');
overlay.id = 'dmaSuccessOverlay';
overlay.className = 'dma-success-overlay';
overlay.innerHTML = `
`;
document.body.appendChild(overlay);
document.getElementById('dmaCloseSuccessBtn').addEventListener('click', function() {
overlay.classList.remove('dma-show');
window.scrollTo({ top: 0, behavior: 'smooth' });
});
}
setTimeout(function() {
overlay.classList.add('dma-show');
}, 100);
}
})();
D${index+1}: ${dimNames[key]}
${val} / 100
${overallScore}
Index
Ihr digitaler Reifegrad
${levelTitle}
${levelDesc}
Ergebnis nach Dimensionen:
${dimensionsHtml}
💡 Dieses Ergebnis wurde basierend auf Ihren Angaben in Echtzeit berechnet. Beim Absenden des Formulars werden die Daten zur Auswertung an das EDIH gesendet. Dieses wird sich dann umgehend mit Ihnen in Verbindung setzen.
Vielen Dank!
Ihr Formular wurde erfolgreich übermittelt. Das EDIH-Team wird sich umgehend mit Ihnen in Verbindung setzen.