K
Knox
Member
- Beiträge
- 15
- Punkte Reaktionen
- 0
Diese Buchstaben zeigen die Abwesenheit an:
'K', 'X', 'KU', 'ZA', 'U', 'x', 'PF
'K', 'X', 'KU', 'ZA', 'U', 'x', 'PF
Zuletzt bearbeitet:
Das dürfte ja dann mit der neuen Version des Sheet behoben sein, wir brauchen nur den Namen zu übernehmen.Das Problem ist, dass die Mitarbeiternamen nciht angezeigt werden, sondern nur Mitarbeiter 1, Mitarbeiter 2 usw.
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?Die Buchstaben sind entweder Diensteinteilungen oder Pausen!
Verstehe, dann müssen die kurzen Pausen um diese langen Pausenzeiten herum geplant werden.Ja diese 30 minütigen Pausen sind praktisch "Dienstfreie Zeiten" wo der Mitarbeiter isst oder eine Schulung besucht.
In meiner Version brauche ich sie nur aus der zweiten Spalte zu übernehmen und mit in die Dienstzeiten einzutragen. Sieht so aus:Wie übernehme ich diese Namen?
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;
}
<!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>
let letztePausenzeit = dienstzeit.to - 30; // 30 = minPausenabstand
const minPausenabstand = 45; // Mindestabstand zwischen den Pausen in Minuten
const minPausenstart = 40; // Mindestzeit nach Dienstbeginn für die erste Pause in Minuten