Auslesen einer Tabelle und Berechnen von Mitarbeiterpausen

Diskutiere Auslesen einer Tabelle und Berechnen von Mitarbeiterpausen im JavaScript Forum im Bereich Programmierung; Hallo! Leider schaffe ich es nicht, jedem Mitarbeiter korrekte Pausen zuzuordnen. Das Auslesen der Daten aus einem Excel File funktioniert...
  • Auslesen einer Tabelle und Berechnen von Mitarbeiterpausen Beitrag #1
K
Knox
Member
Beiträge
15
Punkte Reaktionen
0
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.

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>



ich glaube das Problem liegt an der Funktion function calculateBreakTimes()

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>";
  }
}
Kann jemand helfen?
 
Zuletzt bearbeitet:
  • Auslesen einer Tabelle und Berechnen von Mitarbeiterpausen Beitrag #2
S
Sempervivum
Well-known member
Beiträge
760
Punkte Reaktionen
125
Hallo Knox, willkommen im Forum!

Code besser in Codetags posten, die drei Punkte oben rechts von dem Landschaftssymbol und dann </>.

Es wäre hilfreich, wenn Du auch ein Beispiel solch einer Excel-Datei anhängen würdest, dann kann man es viel leichter testen.
 
Zuletzt bearbeitet:
  • Auslesen einer Tabelle und Berechnen von Mitarbeiterpausen Beitrag #3
K
Knox
Member
Beiträge
15
Punkte Reaktionen
0
Hallo,

und vielen Dank!
Ich hoffe so passt die Formatierung:


Edit: Fehlerhaften Code entfernt.


Die Exceldatei (xlsx) wird hier wohl nicht akzeptiert. Kann ich sie in einem anderen Dateiformat posten?
Die Originaldatei ist eine XLSM Datei.
 
Zuletzt bearbeitet:
  • Auslesen einer Tabelle und Berechnen von Mitarbeiterpausen Beitrag #4
S
Sempervivum
Well-known member
Beiträge
760
Punkte Reaktionen
125
Ja, so ist es wesentlich besser. Ein [i] wird sonst als BBCode für "italic" interpretiert und verschluckt.

Wenn Du die Exceldatei in ein ZIP packst, müsstest Du sie eigentlich anhängen können.
 
  • Auslesen einer Tabelle und Berechnen von Mitarbeiterpausen Beitrag #5
K
Knox
Member
Beiträge
15
Punkte Reaktionen
0
Vielen Dank :)
 
  • Auslesen einer Tabelle und Berechnen von Mitarbeiterpausen Beitrag #6
S
Sempervivum
Well-known member
Beiträge
760
Punkte Reaktionen
125
Ja, so geht es, ich habe sie gespeichert und kann sie laden. Ich werde mir das ansehen.
 
  • Auslesen einer Tabelle und Berechnen von Mitarbeiterpausen Beitrag #7
S
Sempervivum
Well-known member
Beiträge
760
Punkte Reaktionen
125
Ich sehe da Script-Tags in einem HTML-Dokument, also Javascript.
Dies:
Code:
from datetime import datetime, timedelta

def calculatePausenzeiten(realeDienstzeiten):
sieht mir jedoch mehr nach Python aus? Habe ich da eine Wissenslücke?
 
  • Auslesen einer Tabelle und Berechnen von Mitarbeiterpausen Beitrag #8
K
Knox
Member
Beiträge
15
Punkte Reaktionen
0
Enthschuldigung, der Code ist leider vor meiner letzten Änderung. Hier ist der aktuellste Code:


Code:
<!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>
 
  • Auslesen einer Tabelle und Berechnen von Mitarbeiterpausen Beitrag #9
S
Sempervivum
Well-known member
Beiträge
760
Punkte Reaktionen
125
Ja, so funktioniert es, Einlesen der Excel-Datei und Anzeigen in der Tabelle geht einwandfrei.
Da ins Detail einzusteigen fehlt mir im Moment die Zeit. Sicher nimmt sich jemand anders dieser Sache an.
 
  • Auslesen einer Tabelle und Berechnen von Mitarbeiterpausen Beitrag #10
S
Sempervivum
Well-known member
Beiträge
760
Punkte Reaktionen
125
Ich habe den Code, den Du für das Ermitteln der Pausenzeiten verwendest, mal oberflächlich angesehen. Anscheinend legst Du zunächst die Pausenzeiten für einen bestimmten Mitarbeiter fest und prüfst dann, ob sie die Kriterien einhalten. Ist das nicht der Fall, löschst Du die betr. Pause. Am Schluss kann das dazu führen, dass zu wenig Pausen geplant werden bzw. der max. Abstand von 60 oder 70 Minuten überschritten wird.

Ich erwarte, dass diese Aufgabe nicht ganz trivial sein könnte, wenn man alle Kriterien berücksichtigen will. Als ersten Ansatz stelle ich mir folgendes vor:
Du legst für den aktuellen Mitarbeiter eine Pause entspr. mittlerem Abstand von 45 Minuten fest. Anschließend ermittelst Du, wie viele andere Mitarbeiter in dem selben Zeitraum ebenfalls eine Pause haben, einmal für das Team und insgesamt. Wird eine maximale Anzahl überschritten, verschiebst Du die Pause für den aktuellen Mitarbeiter bis Du eine zulässige Zeit gefunden hast. Jetzt kann es passieren, dass dabei die Grenze für den minimalen und maximalen Abstand überschritten wird. Dann wird es ein wenig komplexer.
 
  • Auslesen einer Tabelle und Berechnen von Mitarbeiterpausen Beitrag #11
K
Knox
Member
Beiträge
15
Punkte Reaktionen
0
Gibt es einen logischeren Ansatz, als den Mitarbeitern Pausen zuzuteilen und sie anhand der Regeln danach ggfs zu löschen?
Eigentlich sollten sich alle Mitarbeiter mit den vorhandenen Regeln gut einteilen lassen - "von hinten aufgezäumt" wird das denke ich immer zu Problemen führen...
 
  • Auslesen einer Tabelle und Berechnen von Mitarbeiterpausen Beitrag #12
S
Sempervivum
Well-known member
Beiträge
760
Punkte Reaktionen
125
Wie schon geschrieben, wenn Du eine Pause einfach löschst, könnte der Abstand zwischen den Pausen zu groß werden, jedenfalls wenn ich die Regeln richtig verstehe.

Was für Probleme beobachtest Du denn überhaupt bei deinem Verfahren, was passt anschließend mit den Pausen nicht?
 
  • Auslesen einer Tabelle und Berechnen von Mitarbeiterpausen Beitrag #13
K
Knox
Member
Beiträge
15
Punkte Reaktionen
0
Derzeit gibt es 3 Probleme mit der Ausgabe der Pausen:

1. Die Pausen berücksichtigen die reale Dienstzeit nicht, manche Pausen werden außerhalb dieser Zeit gegeben

2. Die Abstände zur Dienstbeginn und Dienstende werden nicht berücksichtigt (zb 07:00-12:00, die erste Pause wird leider immer um 07:00 vergeben

3. Zu viele Pausen, die 16% werden nicht berücksichtigt
 
  • Auslesen einer Tabelle und Berechnen von Mitarbeiterpausen Beitrag #14
S
Sempervivum
Well-known member
Beiträge
760
Punkte Reaktionen
125
1. und 2. müssten sich durch geeignete Anfangs- und Endekriterien beim Zuteilen der Pausen vermeiden lassen. Also starten mit Anfang Dienstzeit + mittlerer Pausen-Abstand und dort die erste Pause setzen. Dann Abstand aufaddieren und neue Pause setzen solange Ende Dienstzeit minus Pausen-Abstand nicht erreicht ist.
3. würde sich evtl. schon verbessern wenn Pausen außerhalb der Dienstzeit und direkt bei Dienstbeginn weg sind.
 
  • Auslesen einer Tabelle und Berechnen von Mitarbeiterpausen Beitrag #15
K
Knox
Member
Beiträge
15
Punkte Reaktionen
0
Hallo!

nachdem ich mich jetzt ewig an der Funktion versucht habe, werden die Pausen nun garnicht mehr berechnet.

Ich habe versucht, die Dienstzeit in 10 Minuten abschnitte einzuteilen und dann die entsprechenden Abschnitte zu entfernen/speichern.
Neuer Plan war:

Die ersten 4 Werte streichen
Die letzten 3 werte streichen
wenn der neue letzte wert "xx:30" hat: Den letzten wert an die unterste stelle der tabelle mit den Pausenzeiten speichern
einen zufälligen der ersten 3 werte speichern
von dort die nächsten 4 streichen
Einen zufälligen der nächsten 3 werte speichern
die nächsten 4 streichen
Einen zufälligen der nächsten 3 werte speichern
die nächsten 4 streichen
Einen zufälligen der nächsten 3 werte speichern
 
  • Auslesen einer Tabelle und Berechnen von Mitarbeiterpausen Beitrag #16
S
Sempervivum
Well-known member
Beiträge
760
Punkte Reaktionen
125
Ich war inzwischen auch nicht untätig und habe einen ersten Versuch unternommen, die Pausenzeiten festzulegen. Zunächst ohne Prüfungen bzgl. der maximalen Anzahl der MA in Pause und den Prozentwert. Und ohne Anzeige, nur mit Ausgabe in der Console.
Code:
<!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>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 });

                let bereinigteDienstzeiten = [];
                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]);
                    bereinigteDienstzeiten.push(getBereinigteDienstzeit(jsonData[i]));
                }
                console.log(bereinigteDienstzeiten);
                loadingText.style.display = 'none'; // Verstecke den Lade-Text, nachdem die Daten berechnet wurden
                document.querySelector('button').addEventListener('click',
                    calculateBreakTimes.bind(bereinigteDienstzeiten)
                );
            };

            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 getMinutes(timeStr) {
            const matches = timeStr.match(/(\d{2}):(\d{2})/);
            return Number(matches[1]) * 60 + Number(matches[2]);
        }

        function getBereinigteDienstzeit(rowData) {
            let bereinigteDienstzeit = [];
            let startTime = null;
            let endTime = null;

            for (let i = 2; i < rowData.length - 1; i++) {
                const currentStatus = rowData[i];
                if (currentStatus === 'P' || currentStatus === 'S') {
                    if (startTime && endTime) {
                        bereinigteDienstzeit.push({
                            fromStr: startTime, from: getMinutes(startTime),
                            toStr: endTime, to: getMinutes(endTime)
                        });
                        startTime = null;
                        endTime = null;
                    }
                } 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) {
                bereinigteDienstzeit.push({
                    fromStr: startTime, from: getMinutes(startTime),
                    toStr: endTime, to: getMinutes(endTime)
                });
            }

            return bereinigteDienstzeit;
        }
    </script>

    <script>
        function calculateBreakTimes(event) {
            const gewuenschtePausendauer = 10; // Gewünschte Pausendauer in Minuten
            const minPausenabstand = 40; // Mindestabstand zwischen den Pausen in Minuten
            const minPausenstart = 40; // Mindestzeit nach Dienstbeginn für die erste Pause in Minuten
            const maxMitarbeiter = 7; // Maximale Anzahl von Mitarbeitern zur selben Zeit
            let pausenzeiten = this.map((item, idx) => {
                item.forEach((dienstzeit, idx) => {
                    // Leeres Array mit den Pausenzeiten einfügen
                    dienstzeit.pausenzeiten = [];
                    // Start- und Endezeit für die Pausen festlegen
                    let pausenzeit = dienstzeit.from + minPausenstart;
                    let letztePausenzeit = dienstzeit.to - minPausenabstand - gewuenschtePausendauer;
                    // Solange die Endezeit nicht erreicht ist
                    while (pausenzeit < letztePausenzeit) {
                        // Pause einfügen
                        dienstzeit.pausenzeiten.push(pausenzeit);
                        pausenzeit += (minPausenabstand + gewuenschtePausendauer);
                    }
                })
                return item;
            });
            console.log(pausenzeiten);
        }
    </script>

</body>

</html>
 
  • Auslesen einer Tabelle und Berechnen von Mitarbeiterpausen Beitrag #17
K
Knox
Member
Beiträge
15
Punkte Reaktionen
0
Vielen Dank für die Mühe!
Das funktioniert schonmal sehr gut.

an zwei Problemen hänge ich jedoch noch:
1. Es wird "Mitarbeiter 1", "Mitarbeiter 2" usw. angezeigt, statt dem tatsächlichen Namen. Ich hab eine neue Dummy Datei angefügt, mit Beispielnamen.
2. Mitarbeiter mit einem Status ('K', 'X', 'KU', 'ZA', 'U', 'x', 'PF) werden in der Pausenberechnung angezeigt.

ich hab schon einiges versucht, um diese Probleme zu beheben, bin aber leider gescheitert.
Ich hab eine Ausgabe eingefügt, um die Pausen nicht nur in der Console anzuzeigen und ein paar Änderungen an den Grundeinstellungen vorgenommen:


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>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 });

                let bereinigteDienstzeiten = [];
                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]);
                    bereinigteDienstzeiten.push(getBereinigteDienstzeit(jsonData[i]));
                   
                   
               
                }  
                console.log(bereinigteDienstzeiten);
                loadingText.style.display = 'none'; // Verstecke den Lade-Text, nachdem die Daten berechnet wurden
                document.querySelector('button').addEventListener('click',
                    calculateBreakTimes.bind(bereinigteDienstzeiten)
                );
            };

            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 getMinutes(timeStr) {
            const matches = timeStr.match(/(\d{2}):(\d{2})/);
            return Number(matches[1]) * 60 + Number(matches[2]);
        }

        function getBereinigteDienstzeit(rowData) {
            let bereinigteDienstzeit = [];
            let startTime = null;
            let endTime = null;

            for (let i = 2; i < rowData.length - 1; i++) {
                const currentStatus = rowData[i];
                if (currentStatus === 'P' || currentStatus === 'S') {
                    if (startTime && endTime) {
                        bereinigteDienstzeit.push({
                            fromStr: startTime, from: getMinutes(startTime),
                            toStr: endTime, to: getMinutes(endTime)
                        });
                        startTime = null;
                        endTime = null;
                    }
                } 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) {
                bereinigteDienstzeit.push({
                    fromStr: startTime, from: getMinutes(startTime),
                    toStr: endTime, to: getMinutes(endTime)
                });
            }

            return bereinigteDienstzeit;
        }
    </script>

    <script>
   
    function getRandomValue() {
        const values = [40, 50];
        const randomIndex = Math.floor(Math.random() * values.length);
  return values[randomIndex];
}


        function calculateBreakTimes(event) {
            const gewuenschtePausendauer = 10; // Gewünschte Pausendauer in Minuten
            const minPausenabstand = getRandomValue(); // Mindestabstand zwischen den Pausen in Minuten
            const minPausenstart = 40; // Mindestzeit nach Dienstbeginn für die erste Pause in Minuten
            const maxMitarbeiter = 7; // Maximale Anzahl von Mitarbeitern zur selben Zeit
            let pausenzeiten = this.map((item, idx) => {
                item.forEach((dienstzeit, idx) => {
                    // Leeres Array mit den Pausenzeiten einfügen
                    dienstzeit.pausenzeiten = [];
                    // Start- und Endezeit für die Pausen festlegen
                    let pausenzeit = dienstzeit.from + minPausenstart;
                    let letztePausenzeit = dienstzeit.to - minPausenabstand;
                    // Solange die Endezeit nicht erreicht ist
                    while (pausenzeit <= letztePausenzeit) {
                        // Pause einfügen
                        dienstzeit.pausenzeiten.push(pausenzeit);
                        pausenzeit += (minPausenabstand + gewuenschtePausendauer);
                       
                    }
                })
                return item;
            });
            // Den Inhalt des 'pausenzeiten'-Arrays in das 'pausenzeiten'-<div> einfügen
    const pausenzeitenDiv = document.getElementById('pausenzeiten');
    pausenzeitenDiv.innerHTML = formatierePausenzeiten(pausenzeiten);
        }
       
function formatierePausenzeiten(pausenzeiten) {
    let formattedPausenzeiten = '';
    pausenzeiten.forEach((item, idx) => {
        const mitarbeiterPausen = item.filter(dienstzeit => dienstzeit.pausenzeiten.length > 0);
        if (mitarbeiterPausen.length > 0) {
            formattedPausenzeiten += `<p><strong>Mitarbeiter ${idx + 1}:</strong></p>`;
            mitarbeiterPausen.forEach(dienstzeit => {
                const pausenZeiten = dienstzeit.pausenzeiten.map(pausenzeit => formatiereZeit(pausenzeit));
                formattedPausenzeiten += `<p>Pausenzeiten: ${pausenZeiten.join(', ')}</p>`;
            });
        }
    });
    return formattedPausenzeiten;
}

function formatiereZeit(zeit) {
    const stunden = Math.floor(zeit / 60);
    const minuten = zeit % 60;
    return `${padLeadingZero(stunden)}:${padLeadingZero(minuten)}`;
}

function padLeadingZero(num) {
    return num.toString().padStart(2, '0');
}
    </script>

</body>
 
Anhänge
  • dummy.zip
    180 KB · Aufrufe: 1
  • Auslesen einer Tabelle und Berechnen von Mitarbeiterpausen Beitrag #18
S
Sempervivum
Well-known member
Beiträge
760
Punkte Reaktionen
125
Das mit dem Status habe ich auch leider nicht richtig verstanden und es so gelassen, wie Du es gemacht hattest in der Hoffnung, dass es dann passt. Ich kann nur vermuten, dass es etwas in der Richtung Urlaub, Krankheit etc. ist. Bei Urlaub, Krankheit dürften dann keine Dienstzeiten eingetragen sein.
 
  • Auslesen einer Tabelle und Berechnen von Mitarbeiterpausen Beitrag #19
K
Knox
Member
Beiträge
15
Punkte Reaktionen
0
Richtig, der Status gibt an, dass der Mitarbeiter fehlt (Krankenstand, Urlaub etc.).
Deshalb sollen diesem Mitarbeiter keine Pausen zugeteilt werden, unter anderem auch, damit die Regel der maximal 7 Mitarbeiter besser passt.
Eigentlich wird auch ein Teamwert ausgelesen, der den Mitarbeitern Teams zuweist. Sinn dahinter ist, dass nicht mehr als 30% aller Mitarbeiter eines Teams die selben Pausenzeiten haben.
Die Dienstzeiten von diesen abwesenden Mitarbeitern sind im Excel eingetragen, jedoch gibt der Status eben Auskunft über Abwesenheit (im Excel wird der MA einfach farblich ausgeblendet)
 
  • Auslesen einer Tabelle und Berechnen von Mitarbeiterpausen Beitrag #20
S
Sempervivum
Well-known member
Beiträge
760
Punkte Reaktionen
125
Verstehe, dann gibt der Buchstabe in dem 30-min-Intervall jeweils den Status an und tritt wiederholt auf. Welche Buchstaben zeigen denn dann an, dass der Mitarbeiter abwesend ist?
 
Thema:

Auslesen einer Tabelle und Berechnen von Mitarbeiterpausen

Oben Unten