Foren
Neue Beiträge
Foren durchsuchen
Was ist neu?
Neue Beiträge
Profilnachrichten
Online
Anmelden
Registrieren
Aktuelles
Suche
Suche
Nur Titel durchsuchen
Von:
Neue Beiträge
Foren durchsuchen
Menü
Anmelden
Registrieren
App installieren
Installieren
Programmierung
JavaScript
Auslesen einer Tabelle und Berechnen von Mitarbeiterpausen
JavaScript ist deaktiviert. Für eine bessere Darstellung aktiviere bitte JavaScript in deinem Browser, bevor du fortfährst.
Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden.
Du solltest ein Upgrade durchführen oder einen
alternativen Browser
verwenden.
Auf Thema antworten
Beitrag
[QUOTE="Knox, post: 14043, member: 4798"] Hallo! Leider schaffe ich es nicht, jedem Mitarbeiter korrekte Pausen zuzuordnen. Das Auslesen der Daten aus einem Excel File funktioniert perfekt. Die Daten sollen aus dem Reiter "Reale Dienstzeiten" ausgelesen werden. Folgende Pausenregeln sollen berücksichtigt werden: Die Pausendauer beträgt 10 Minuten. Die erste Pause muss mindestens 30 Minuten nach Dienstbeginn liegen und darf maximal 60 Minuten nach Dienstbeginn liegen. Die letzte Pause muss mindestens 30 Minuten vor Dienstende liegen und darf maximal 60 Minuten vor Dienstende liegen. Der Abstand zwischen den Pausen soll 40, 50 oder 60 Minuten betragen.Im Notfall kann dieser Wert auf 30 Minuten oder 70 Minuten korrigiert werden. Alle Pausen müssen innerhalb der Realen Dienstzeit liegen. Es dürfen nicht mehr als 2 Mitarbeiter mit dem selben Team-Wert zur gleichen Zeit Pause haben Die Gesamtanzahl aller Pausen eines Mitarbeiters soll etwa 16% der Realen Dienstzeit entsprechen Es dürfen nicht mehr als 7 Mitarbeiter gleichzeitig zur Pause eingeteilt werden Die Realen Dienstzeiten sind im Format HH:MM - HH:MM. Es kann mehrere Dienstzeiten für einen Mitarbeiter geben, die mit einem ";" getrennt sind (z.B. HH:MM - HH:MM ; HH:MM - HH:MM ; HH:MM - HH:MM -> ein einziger Mitarbeiter) Pausen sollen immer zu vollen 10 Minuten beginnen (z.B. 08:10). Die Pausen sollen am Ende im Div <div id="pausenzeiten"></div> angezeigt werden Mitarbeiter ohne Pausen sollen nicht angezeigt werden. Die Tabelle enthält über 100 Mitarbeiter, manche mit mehreren Dienstzeiten (07:00 - 10:00 ; 10:30 - 15:00) Edit: Der Code wurde aktualisiert und ist jetzt am aktuellen Stand. Eine Dummy XLSX Datei wurde angefügt, die Originaldatei hat Format XLSM. [CODE=html]<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Excel-Daten auslesen</title> <style> #dropZone { border: 2px dashed #ccc; width: 300px; height: 200px; line-height: 200px; text-align: center; font-size: 18px; margin: 20px auto; } #loadingText { text-align: center; font-size: 18px; margin-bottom: 20px; display: none; /* Verstecke den Text standardmäßig */ } #outputTable th:nth-child(4), #outputTable td:nth-child(4) { display: none; /* Blende die Spalte "Dienstzeiten" aus */ } #pausenzeiten { display: block; height: auto; } </style> </head> <body> <h1>Excel-Daten auslesen</h1> <div id="loadingText">Daten werden berechnet...</div> <div id="dropZone">Datei hier ablegen</div> <table id="outputTable"> <thead> <tr> <th>Name</th> <th>Status</th> <th>Team</th> <th>Dienstzeiten</th> <th>Reale Dienstzeiten</th> </tr> </thead> <tbody id="outputBody"></tbody> </table> <div> <button onclick="calculateBreakTimes()">Pausenzeiten berechnen</button> </div> <div id="pausenzeiten"></div> <script src="https://unpkg.com/xlsx/dist/xlsx.full.min.js"></script> <script> const dropZone = document.getElementById('dropZone'); const outputBody = document.getElementById('outputBody'); const loadingText = document.getElementById('loadingText'); const excludedStatus = ['K', 'X', 'KU', 'ZA', 'U', 'x', 'PF']; // Liste der auszuschließenden Status // Datei per Drag & Drop hochladen dropZone.addEventListener('dragover', handleDragOver, false); dropZone.addEventListener('drop', handleFileSelect, false); function handleDragOver(e) { e.preventDefault(); } function handleFileSelect(e) { e.preventDefault(); const file = e.dataTransfer.files[0]; const reader = new FileReader(); loadingText.style.display = 'block'; // Zeige den Lade-Text an reader.onload = function (e) { const data = new Uint8Array(e.target.result); const workbook = XLSX.read(data, { type: 'array' }); const sheetName = getSheetName(); // Funktion, um den passenden Tabellennamen zu ermitteln const worksheet = workbook.Sheets[sheetName]; const jsonData = XLSX.utils.sheet_to_json(worksheet, { header: 1 }); outputBody.innerHTML = ''; for (let i = 5; i < 108; i++) { const name = jsonData[i][1]; const status = jsonData[i][0]; const team = jsonData[i][36]; // Spalte AK const dienstzeiten = getDienstzeiten(jsonData[i]); const bereinigteDienstzeiten = getBereinigteDienstzeit(jsonData[i]); if (name && dienstzeiten && !excludedStatus.includes(status)) { // Überprüfe, ob der Status nicht in der Liste der auszuschließenden Status enthalten ist const row = document.createElement('tr'); const nameCell = document.createElement('td'); const statusCell = document.createElement('td'); const teamCell = document.createElement('td'); const dienstzeitenCell = document.createElement('td'); const bereinigteDienstzeitenCell = document.createElement('td'); nameCell.textContent = name; statusCell.textContent = status; teamCell.textContent = team; dienstzeitenCell.textContent = dienstzeiten; bereinigteDienstzeitenCell.textContent = bereinigteDienstzeiten; row.appendChild(nameCell); row.appendChild(statusCell); row.appendChild(teamCell); row.appendChild(dienstzeitenCell); row.appendChild(bereinigteDienstzeitenCell); outputBody.appendChild(row); } } loadingText.style.display = 'none'; // Verstecke den Lade-Text, nachdem die Daten berechnet wurden }; reader.readAsArrayBuffer(file); } function getSheetName() { const date = new Date(); const day = date.getDate(); const month = date.getMonth() + 1; const year = date.getFullYear(); const sheetName = `${getDayName(date.getDay())}${day}.${month < 10 ? '0' + month : month}.${year}`; return sheetName; } function getDayName(dayIndex) { const days = ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa']; return days[dayIndex]; } function getDienstzeiten(rowData) { let earliestTime = ''; let latestTime = ''; for (let i = 2; i < rowData.length; i++) { if (rowData[i] === 'T' || rowData[i] === 'M' || rowData[i] === 'R' || rowData[i] === 'W' || rowData[i] === 'E' || rowData[i] === 'H') { const startTime = getTimeFromIndex(i); const endTime = getTimeFromIndex(i + 1); if (!earliestTime) { earliestTime = startTime; } latestTime = endTime; } } if (earliestTime && latestTime) { return `${earliestTime} - ${latestTime}`; } else { return ''; } } function getTimeFromIndex(index) { const hours = Math.floor(index / 2) + 5; const minutes = index % 2 === 0 ? '00' : '30'; return `${hours < 10 ? '0' + hours : hours}:${minutes}`; } function getBereinigteDienstzeit(rowData) { let bereinigteDienstzeit = ''; let startTime = ''; let endTime = ''; for (let i = 2; i < rowData.length - 1; i++) { const currentStatus = rowData[i]; if (currentStatus === 'P' || currentStatus === 'S') { if (startTime && endTime) { if (bereinigteDienstzeit) { bereinigteDienstzeit += ' ; '; } bereinigteDienstzeit += `${startTime} - ${endTime}`; startTime = ''; endTime = ''; } } else if (currentStatus === 'T' || currentStatus === 'M' || currentStatus === 'H' || currentStatus === 'R' || currentStatus === 'W' || currentStatus === 'E') { if (!startTime) { startTime = getTimeFromIndex(i); } if (i + 1 < rowData.length) { endTime = getTimeFromIndex(i + 1); } } } if (startTime && endTime) { if (bereinigteDienstzeit) { bereinigteDienstzeit += ' ; '; } bereinigteDienstzeit += `${startTime} - ${endTime}`; } return bereinigteDienstzeit; } </script> <script> function calculateBreakTimes() { var tableBody = document.getElementById("outputBody"); var rows = tableBody.getElementsByTagName("tr"); var dienstzeiten = {}; // Extrahiere die realen Dienstzeiten für jeden Mitarbeiter for (var i = 0; i < rows.length; i++) { var row = rows[i]; var nameCell = row.cells[0]; var dienstzeitenCell = row.cells[4]; // Verwende den Index 4 für die Spalte "Reale Dienstzeiten" var name = nameCell.innerText; var zeiten = dienstzeitenCell.innerText; dienstzeiten[name] = zeiten; } var gewuenschte_pausendauer = 10; // Gewünschte Pausendauer in Minuten var min_pausenabstand = 40; // Mindestabstand zwischen den Pausen in Minuten var min_pausenstart = 40; // Mindestzeit nach Dienstbeginn für die erste Pause in Minuten var max_mitarbeiter = 7; // Maximale Anzahl von Mitarbeitern zur selben Zeit var pausenzeitenDiv = document.getElementById("pausenzeiten"); pausenzeitenDiv.innerHTML = ""; for (var mitarbeiter in dienstzeiten) { var zeiten = dienstzeiten[mitarbeiter].split(";"); var pausenstart = Infinity; var pausenende = -Infinity; // Finde den frühesten Pausenstart und den spätesten Pausenende for (var i = 0; i < zeiten.length; i++) { var zeit = zeiten[i].trim(); var timeRegex = /(\d{2}):(\d{2}) - (\d{2}):(\d{2})/; var match = zeit.match(timeRegex); if (match) { var stundenStart = parseInt(match[1]); var minutenStart = parseInt(match[2]); var stundenEnde = parseInt(match[3]); var minutenEnde = parseInt(match[4]); var startInMinuten = stundenStart * 60 + minutenStart; var endeInMinuten = stundenEnde * 60 + minutenEnde; pausenstart = Math.min(pausenstart, startInMinuten); pausenende = Math.max(pausenende, endeInMinuten); } } var pausendauer = gewuenschte_pausendauer; var pausestartZeit = pausenstart; // Berechne die Pausenzeiten basierend auf den gewünschten Parametern var pausenzeiten = []; while (pausestartZeit + pausendauer <= pausenende) { pausenzeiten.push({ start: pausestartZeit, ende: pausestartZeit + pausendauer }); pausestartZeit += pausendauer + min_pausenabstand; } // Überprüfe, ob die Bedingungen für Pausen erfüllt sind if (pausestartZeit - pausendauer < pausenende) { pausenzeiten.push({ start: pausestartZeit, ende: pausenende }); } // Überprüfe, ob die Mindestzeit nach Dienstbeginn für die erste Pause erfüllt ist if (pausenzeiten.length > 0 && pausenzeiten[0].start < min_pausenstart) { pausenzeiten.shift(); } // Überprüfe, ob die maximale Anzahl von Mitarbeitern zur gleichen Zeit überschritten wird if (pausenzeiten.length > max_mitarbeiter) { pausenzeiten.splice(max_mitarbeiter); } var pausenzeitenText = ""; for (var j = 0; j < pausenzeiten.length; j++) { var pause = pausenzeiten[j]; var startStunden = Math.floor(pause.start / 60); var startMinuten = pause.start % 60; var endeStunden = Math.floor(pause.ende / 60); var endeMinuten = pause.ende % 60; var pauseText = ("0" + startStunden).slice(-2) + ":" + ("0" + startMinuten).slice(-2) + " - " + ("0" + endeStunden).slice(-2) + ":" + ("0" + endeMinuten).slice(-2); pausenzeitenText += pauseText + "<br>"; } pausenzeitenDiv.innerHTML += "<p><b>" + mitarbeiter + ":</b><br>" + pausenzeitenText + "</p>"; } } </script> </body> </html> [/CODE] ich glaube das Problem liegt an der Funktion [I]function calculateBreakTimes()[/I] [CODE=javascript]function calculateBreakTimes() { var tableBody = document.getElementById("outputBody"); var rows = tableBody.getElementsByTagName("tr"); var dienstzeiten = {}; // Extrahiere die realen Dienstzeiten für jeden Mitarbeiter for (var i = 0; i < rows.length; i++) { var row = rows[i]; var nameCell = row.cells[0]; var dienstzeitenCell = row.cells[4]; // Verwende den Index 4 für die Spalte "Reale Dienstzeiten" var name = nameCell.innerText; var zeiten = dienstzeitenCell.innerText; dienstzeiten[name] = zeiten; } var gewuenschte_pausendauer = 10; // Gewünschte Pausendauer in Minuten var min_pausenabstand = 40; // Mindestabstand zwischen den Pausen in Minuten var min_pausenstart = 40; // Mindestzeit nach Dienstbeginn für die erste Pause in Minuten var max_mitarbeiter = 7; // Maximale Anzahl von Mitarbeitern zur selben Zeit var pausenzeitenDiv = document.getElementById("pausenzeiten"); pausenzeitenDiv.innerHTML = ""; for (var mitarbeiter in dienstzeiten) { var zeiten = dienstzeiten[mitarbeiter].split(";"); var pausenstart = Infinity; var pausenende = -Infinity; // Finde den frühesten Pausenstart und den spätesten Pausenende for (var i = 0; i < zeiten.length; i++) { var zeit = zeiten[i].trim(); var timeRegex = /(\d{2}):(\d{2}) - (\d{2}):(\d{2})/; var match = zeit.match(timeRegex); if (match) { var stundenStart = parseInt(match[1]); var minutenStart = parseInt(match[2]); var stundenEnde = parseInt(match[3]); var minutenEnde = parseInt(match[4]); var startInMinuten = stundenStart * 60 + minutenStart; var endeInMinuten = stundenEnde * 60 + minutenEnde; pausenstart = Math.min(pausenstart, startInMinuten); pausenende = Math.max(pausenende, endeInMinuten); } } var pausendauer = gewuenschte_pausendauer; var pausestartZeit = pausenstart; // Berechne die Pausenzeiten basierend auf den gewünschten Parametern var pausenzeiten = []; while (pausestartZeit + pausendauer <= pausenende) { pausenzeiten.push({ start: pausestartZeit, ende: pausestartZeit + pausendauer }); pausestartZeit += pausendauer + min_pausenabstand; } // Überprüfe, ob die Bedingungen für Pausen erfüllt sind if (pausestartZeit - pausendauer < pausenende) { pausenzeiten.push({ start: pausestartZeit, ende: pausenende }); } // Überprüfe, ob die Mindestzeit nach Dienstbeginn für die erste Pause erfüllt ist if (pausenzeiten.length > 0 && pausenzeiten[0].start < min_pausenstart) { pausenzeiten.shift(); } // Überprüfe, ob die maximale Anzahl von Mitarbeitern zur gleichen Zeit überschritten wird if (pausenzeiten.length > max_mitarbeiter) { pausenzeiten.splice(max_mitarbeiter); } var pausenzeitenText = ""; for (var j = 0; j < pausenzeiten.length; j++) { var pause = pausenzeiten[j]; var startStunden = Math.floor(pause.start / 60); var startMinuten = pause.start % 60; var endeStunden = Math.floor(pause.ende / 60); var endeMinuten = pause.ende % 60; var pauseText = ("0" + startStunden).slice(-2) + ":" + ("0" + startMinuten).slice(-2) + " - " + ("0" + endeStunden).slice(-2) + ":" + ("0" + endeMinuten).slice(-2); pausenzeitenText += pauseText + "<br>"; } pausenzeitenDiv.innerHTML += "<p><b>" + mitarbeiter + ":</b><br>" + pausenzeitenText + "</p>"; } } [/CODE] [I]Kann jemand helfen?[/I] [/QUOTE]
Zitate
Authentifizierung
Antworten
Programmierung
JavaScript
Auslesen einer Tabelle und Berechnen von Mitarbeiterpausen
Oben
Unten