Auslesen einer Tabelle und Berechnen von Mitarbeiterpausen

Diskutiere Auslesen einer Tabelle und Berechnen von Mitarbeiterpausen im JavaScript Forum im Bereich Programmierung; Diese Buchstaben zeigen die Abwesenheit an: 'K', 'X', 'KU', 'ZA', 'U', 'x', 'PF
  • Auslesen einer Tabelle und Berechnen von Mitarbeiterpausen Beitrag #21
K
Knox
Member
Beiträge
15
Punkte Reaktionen
0
Diese Buchstaben zeigen die Abwesenheit an:

'K', 'X', 'KU', 'ZA', 'U', 'x', 'PF
 
Zuletzt bearbeitet:
  • Auslesen einer Tabelle und Berechnen von Mitarbeiterpausen Beitrag #22
S
Sempervivum
Well-known member
Beiträge
760
Punkte Reaktionen
125
Verstehe, auf dieses Array war ich schon Mal gestoßen. Der Status steht dann in der ersten Spalte und bei Abwesenheit sind alle Zellen leer. Ich werde versuchen, es einzuarbeiten.
Aber was bedeuten dann die Buchstaben in den Zellen für jedes Intervall?
 
  • Auslesen einer Tabelle und Berechnen von Mitarbeiterpausen Beitrag #23
K
Knox
Member
Beiträge
15
Punkte Reaktionen
0
Nein selbst bei Abwesenheit sind alle Zellen des Excel gefüllt. Die Buchstaben sind entweder Diensteinteilungen oder Pausen!

Das Problem ist, dass die Mitarbeiternamen nciht angezeigt werden, sondern nur Mitarbeiter 1, Mitarbeiter 2 usw.
 
  • Auslesen einer Tabelle und Berechnen von Mitarbeiterpausen Beitrag #24
S
Sempervivum
Well-known member
Beiträge
760
Punkte Reaktionen
125
Das Problem ist, dass die Mitarbeiternamen nciht angezeigt werden, sondern nur Mitarbeiter 1, Mitarbeiter 2 usw.
Das dürfte ja dann mit der neuen Version des Sheet behoben sein, wir brauchen nur den Namen zu übernehmen.

Die Buchstaben sind entweder Diensteinteilungen oder Pausen!
Sind das dann andere Pausen, als die, die zu planen sind? Das Raster ist ja 30 Minuten und so lang wären dann auch diese Pausen?
 
  • Auslesen einer Tabelle und Berechnen von Mitarbeiterpausen Beitrag #25
K
Knox
Member
Beiträge
15
Punkte Reaktionen
0
Wie übernehme ich diese Namen?

Ja diese 30 minütigen Pausen sind praktisch "Dienstfreie Zeiten" wo der Mitarbeiter isst oder eine Schulung besucht.
 
  • Auslesen einer Tabelle und Berechnen von Mitarbeiterpausen Beitrag #26
S
Sempervivum
Well-known member
Beiträge
760
Punkte Reaktionen
125
Ja diese 30 minütigen Pausen sind praktisch "Dienstfreie Zeiten" wo der Mitarbeiter isst oder eine Schulung besucht.
Verstehe, dann müssen die kurzen Pausen um diese langen Pausenzeiten herum geplant werden.

Wie übernehme ich diese Namen?
In meiner Version brauche ich sie nur aus der zweiten Spalte zu übernehmen und mit in die Dienstzeiten einzutragen. Sieht so aus:
Code:
        function getBereinigteDienstzeit(rowData) {
            let bereinigteDienstzeit = [];
            let startTime = null;
            let endTime = null;
            const
                name = rowData[1],
                team = rowData[36];
            for (let i = 2; i < rowData.length - 1; i++) {
                const currentStatus = rowData[i];
                if (currentStatus === 'P' || currentStatus === 'S') {
                    if (startTime && endTime) {
                        bereinigteDienstzeit.push({
                            name: name,
                            team: team,
                            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({
                    name: name,
                    team: team,
                    fromStr: startTime, from: getMinutes(startTime),
                    toStr: endTime, to: getMinutes(endTime)
                });
            }
            return bereinigteDienstzeit;
        }
Der Name tritt dabei mehrfach auf aber das akzeptiere ich vorläufig.
 
  • Auslesen einer Tabelle und Berechnen von Mitarbeiterpausen Beitrag #27
K
Knox
Member
Beiträge
15
Punkte Reaktionen
0
Er zeigt bei mir weiterhin nur "Mitarbeiter 1" an
 
Zuletzt bearbeitet:
  • Auslesen einer Tabelle und Berechnen von Mitarbeiterpausen Beitrag #28
S
Sempervivum
Well-known member
Beiträge
760
Punkte Reaktionen
125
Den Namen muss man dann auch bei der Formatierung ausgeben. Ich habe mal versucht, alles Neue in meine Version einzuarbeiten, einschl. deiner Formatierung und Ausgabe. Auch das Zählen der MA, die in Pause sind, hatte ich in der Zwischenzeit ergänzt.
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
                let startEnd = {};
                document.querySelector('button').addEventListener('click',
                    startEnd = 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 getTimeStr(minutes) {
            return String(Math.floor(minutes / 60)).padStart(2, '0')
                + ':' + String((minutes % 60)).padStart(2, '0');
        }

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

    <script>
        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 ${mitarbeiterPausen[0].name}:</strong></p>`;
                    mitarbeiterPausen.forEach(dienstzeit => {
                        const pausenZeiten = dienstzeit.pausenzeiten.map(pausenzeit => getTimeStr(pausenzeit));
                        formattedPausenzeiten += `<p>Pausenzeiten: ${pausenZeiten.join(', ')}</p>`;
                    });
                }
            });
            return formattedPausenzeiten;
        }

        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 startDienstzeit = Infinity, endeDienstzeit = 0;
            let pausenzeiten = this.map((item, idx) => {
                item.forEach((dienstzeit, idx) => {
                    if (dienstzeit.from < startDienstzeit) startDienstzeit = dienstzeit.from;
                    if (dienstzeit.to > endeDienstzeit) endeDienstzeit = dienstzeit.to;
                    // 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;
            });

            // Anzahl der Mitarbeiter in Pause ermitteln
            let
                // Anzahl der Mitarbeiter in Pause für ein Zeitraster von 10 Minuten
                anzahlInPauseGesamt = [],
                // Anzahl der Pausen pro Team
                anzahlInPauseTeam = {};

            pausenzeiten.forEach(item => {
                item.forEach(dienstzeit => {
                    if (!anzahlInPauseTeam[dienstzeit.team]) anzahlInPauseTeam[dienstzeit.team] = []
                    dienstzeit.pausenzeiten.forEach(pause => {
                        if (!anzahlInPauseGesamt[pause]) {
                            anzahlInPauseGesamt[pause] = 1;
                        } else {
                            anzahlInPauseGesamt[pause]++;
                        }

                        if (!anzahlInPauseTeam[dienstzeit.team][pause]) {
                            anzahlInPauseTeam[dienstzeit.team][pause] = 1;
                        } else {
                            anzahlInPauseTeam[dienstzeit.team][pause]++;
                        }
                    });
                });
            });
            console.log(pausenzeiten);
            console.log(startDienstzeit, endeDienstzeit);
            anzahlInPauseGesamt.forEach((item, idx) => {
                console.log(idx, item);
            });

            for (team in anzahlInPauseTeam) {
                anzahlInPauseTeam[team].forEach((item, idx) => {
                    console.log('team:' + team + ' zeit:' + idx + ' anzahl:' + item);
                });
            }
            // Den Inhalt des 'pausenzeiten'-Arrays in das 'pausenzeiten'-<div> einfügen
            const pausenzeitenDiv = document.getElementById('pausenzeiten');
            pausenzeitenDiv.innerHTML = formatierePausenzeiten(pausenzeiten);
        }
    </script>

</body>

</html>
 
  • Auslesen einer Tabelle und Berechnen von Mitarbeiterpausen Beitrag #29
K
Knox
Member
Beiträge
15
Punkte Reaktionen
0
Vielen Dank, das hat alles gut funktioniert! :)
 
  • Auslesen einer Tabelle und Berechnen von Mitarbeiterpausen Beitrag #30
S
Sempervivum
Well-known member
Beiträge
760
Punkte Reaktionen
125
Das Zählen war jetzt der leichteste Teil der Übung, schwieriger wird es, die Pausen so anzupassen, dass nicht zu viel MA gleichzeitig in Pause sind.

Und mir scheint, mein Algorithmus, die Pausen zu berechnen, ist verbesserungsfähig: Wenn man mit einem festen Abstand rechnet, kann am Schluss ein Intervall übrig bleiben, dass ziemlich kurz oder ziemlich lang ist. Vielleicht besser die Dienstzeit durch Pause plus Intervall dividieren, dann bekommt man eine Anzahl und kann dann die Pausen gleichmäßig auf die Dienstzeit verteilen.
 
  • Auslesen einer Tabelle und Berechnen von Mitarbeiterpausen Beitrag #31
K
Knox
Member
Beiträge
15
Punkte Reaktionen
0
An der maximalen Mitarbeiteranzahl arbeite ich auch noch ...

Durch die Änderung

Javascript:
let letztePausenzeit = dienstzeit.to - 30; // 30 = minPausenabstand

und die Abstandsänderung:


Javascript:
const minPausenabstand = 45; // Mindestabstand zwischen den Pausen in Minuten
 const minPausenstart = 40; // Mindestzeit nach Dienstbeginn für die erste Pause in Minuten

passt die Anzahl der Pausen gut!
 
Thema:

Auslesen einer Tabelle und Berechnen von Mitarbeiterpausen

Oben Unten