422 lines
15 KiB
JavaScript
422 lines
15 KiB
JavaScript
function calculateTimeWithDuration(timeInputValue, timeElement, startDate, duration, hoursMinutesDropdownBtnId) {
|
|
var isInMin = window.getIsZeiterfassungseinheitInMinutes();
|
|
|
|
const hoursToMinutes = parseTimeInputToIntegerArray(timeInputValue);
|
|
const hours = parseInt(hoursToMinutes[0]);
|
|
const minutes = parseInt(hoursToMinutes[1]);
|
|
const stdMinDropdown = $(`#${hoursMinutesDropdownBtnId}`);
|
|
|
|
startDate.hours(hours);
|
|
startDate.minutes(minutes);
|
|
|
|
if(stdMinDropdown.length) {
|
|
isInMin = stdMinDropdown.text().replaceAll(/\s/g, "") === "Minuten";
|
|
}
|
|
|
|
const durationFormat = isInMin ? "m" : "h";
|
|
|
|
startDate.add(duration, durationFormat);
|
|
|
|
timeInputValue = startDate.format("HH:mm");
|
|
|
|
timeElement.val(timeInputValue);
|
|
}
|
|
|
|
function onDurationChange(startTimeId, endTimeId, startDateId, endDateId, durationId, hoursMinutesDropdownBtnId, startDatePickerId, endDatePickerId) {
|
|
try {
|
|
var isInMin = getIsZeiterfassungseinheitInMinutes();
|
|
|
|
var startTime = $(`#${startTimeId}`).val();
|
|
var endTime = $(`#${endTimeId}`).val();
|
|
var duration = $(`#${durationId}`).val();
|
|
var hoursMinutesDropdownButton = $(`#${hoursMinutesDropdownBtnId}`);
|
|
|
|
var startTimeCondition = startTime !== undefined && startTime !== null && startTime.length > 0;
|
|
var endTimeCondition = endTime !== undefined && endTime !== null && endTime.length > 0;
|
|
var durationNumber = parseFloat(duration.replace(",", "."));
|
|
var durationCondition = !isNaN(durationNumber);
|
|
|
|
if((false === startTimeCondition && false === endTimeCondition) || durationCondition === false) {
|
|
return;
|
|
}
|
|
|
|
var startDateString = $(`#${startDatePickerId}`).datetimepicker("date");
|
|
var endDate = moment(new Date());
|
|
var startDate = moment(new Date());
|
|
|
|
if(startDateString.length !== 0) {
|
|
startDate = moment(startDateString);
|
|
endDate = startDate.clone();
|
|
}
|
|
|
|
if($(`#${endDatePickerId}`).length !== 0) {
|
|
var endDateString = $(`#${endDatePickerId}`).datetimepicker("date");
|
|
endDate = moment(endDateString);
|
|
}
|
|
|
|
var h2m = [0, 0];
|
|
|
|
if(hoursMinutesDropdownButton.length) {
|
|
isInMin = hoursMinutesDropdownButton.text().replaceAll(/\s/g, "") === "Minuten";
|
|
}
|
|
|
|
var durationFormat = isInMin ? "m" : "h";
|
|
|
|
if(startTimeCondition === true) {
|
|
h2m = parseTimeInputToIntegerArray(startTime);
|
|
|
|
startDate = startDate.hours(h2m[0]).minutes(h2m[1]);
|
|
endDate = startDate.clone().add(durationNumber, durationFormat);
|
|
|
|
$(`#${endTimeId}`).val(endDate.format("HH:mm"));
|
|
$(`#${endDateId}`).val(endDate.format("DD.MM.yyyy"));
|
|
} else {
|
|
h2m = parseTimeInputToIntegerArray(endTime);
|
|
|
|
endDate = endDate.hours(h2m[0]).minutes(h2m[1]);
|
|
startDate = endDate.clone().add(durationNumber * -1, durationFormat);
|
|
|
|
$(`#${startTimeId}`).val(startDate.format("HH:mm"));
|
|
$(`#${startDateId}`).val(startDate.format("DD.MM.yyyy"));
|
|
}
|
|
} catch(error) {
|
|
window.showErrorPopup(error);
|
|
}
|
|
}
|
|
|
|
// ToDo: VERALTET (14.05.2025); Erst Dauer, dann Start- oder Endzeit führt dazu, dass die Dauer in Stunden benutzt wird!
|
|
function calculateDuration(isInvocatedByHoursMinutesButton, startTimeId, endTimeId, durationId, hoursMinutesDropdownBtnId, startDatePickerId, endDatePickerId, isInvokedByStartElement, isInvokedByEndElement) {
|
|
var startTime = $(`#${startTimeId}`).val();
|
|
var endTime = $(`#${endTimeId}`).val();
|
|
var duration = $(`#${durationId}`).val();
|
|
|
|
var hoursMinutesDropdownButton = $(`#${hoursMinutesDropdownBtnId}`);
|
|
|
|
var isInMin = window.getIsZeiterfassungseinheitInMinutes();
|
|
|
|
if(hoursMinutesDropdownButton.length) {
|
|
isInMin = hoursMinutesDropdownButton.text().replaceAll(/\s/g, "") === "Minuten";
|
|
}
|
|
|
|
var durationFormat = isInMin ? "m" : "h";
|
|
|
|
if((startTime.length > 0 && startTime.length < 5) || (endTime.length > 0 && endTime.length < 5)) {
|
|
return;
|
|
}
|
|
|
|
var isStartTimeValid = startTime !== undefined && startTime !== null && startTime.length > 0;
|
|
var isEndTimeValid = endTime !== undefined && endTime !== null && endTime.length > 0;
|
|
|
|
var durationNumber = parseFloat(duration.replace(",", "."));
|
|
var isDurationValid = !isNaN(durationNumber);
|
|
|
|
var startDateString = $("#" + startDatePickerId).datetimepicker("date");
|
|
|
|
var endDate = moment(new Date());
|
|
var startDate = moment(new Date());
|
|
|
|
// Das Startdatum hat einen Wert
|
|
if(startDateString !== null && startDateString.length !== 0) {
|
|
startDate = moment(startDateString);
|
|
endDate = startDate.clone();
|
|
}
|
|
|
|
// Es gibt ein Enddatumsfeld
|
|
if($(`#${endDatePickerId}`).length !== 0) {
|
|
var endDateString = $(`#${endDatePickerId}`).datetimepicker("date");
|
|
// Das Enddatum hat einen Wert
|
|
if(endDateString !== null && endDateString.length !== 0) {
|
|
endDate = moment(endDateString);
|
|
}
|
|
}
|
|
|
|
var newDurationValue = 0;
|
|
|
|
// Start- und Enddatum sind vorhanden und das Event wurde nicht vom Stunden/Minuten-Dropdown aufgerufen
|
|
if(isStartTimeValid && isEndTimeValid && isInvocatedByHoursMinutesButton === false) {
|
|
var startHHmm = parseTimeInputToIntegerArray(startTime);
|
|
var endHHmm = parseTimeInputToIntegerArray(endTime);
|
|
|
|
startDate.hours(startHHmm[0]);
|
|
startDate.minutes(startHHmm[1]);
|
|
endDate.hours(endHHmm[0]);
|
|
endDate.minutes(endHHmm[1]);
|
|
|
|
var momentDuration = moment.duration(endDate.diff(startDate));
|
|
|
|
if(durationNumber > 0 && isInvokedByStartElement && startDate >= endDate) {
|
|
endDate = startDate.clone().add(durationNumber, durationFormat);
|
|
|
|
$(`#${endTimeId}`).val(endDate.format("HH:mm"));
|
|
$(`#${endDatePickerId}`).val(endDate.format("DD.MM.yyyy"));
|
|
|
|
momentDuration = moment.duration(endDate.diff(startDate));
|
|
}
|
|
|
|
if(durationNumber > 0 && isInvokedByEndElement && startDate >= endDate) {
|
|
startDate = endDate.clone().subtract(durationNumber, durationFormat);
|
|
|
|
$(`#${startTimeId}`).val(startDate.format("HH:mm"));
|
|
$(`#${startDatePickerId}`).val(startDate.format("DD.MM.yyyy"));
|
|
|
|
momentDuration = moment.duration(endDate.diff(startDate));
|
|
}
|
|
|
|
newDurationValue = isInMin ? momentDuration.asMinutes() : momentDuration.asHours();
|
|
|
|
$(`#${durationId}`).val(newDurationValue);
|
|
// Startdatum und Dauer sind vorhanden
|
|
} else if(isStartTimeValid && isDurationValid) {
|
|
if(isInvocatedByHoursMinutesButton) {
|
|
durationNumber = isInMin ? durationNumber *= 60 : durationNumber /= 60;
|
|
$(`#${durationId}`).val(durationNumber);
|
|
}
|
|
|
|
calculateTimeWithDuration(startTime, $(`#${endTimeId}`), startDate, durationNumber, hoursMinutesDropdownBtnId);
|
|
// Enddatum und Dauer sind vorhanden
|
|
} else if(isEndTimeValid && isDurationValid) {
|
|
if(isInvocatedByHoursMinutesButton) {
|
|
durationNumber = isInMin ? durationNumber *= 60 : durationNumber /= 60;
|
|
$(`#${durationId}`).val(durationNumber);
|
|
}
|
|
|
|
calculateTimeWithDuration(endTime, $(`#${startTimeId}`), startDate, durationNumber * -1, hoursMinutesDropdownBtnId);
|
|
} else if(isInvocatedByHoursMinutesButton) {
|
|
// Wurde von Min zu Std oder Std zu Min
|
|
if(isInvocatedByHoursMinutesButton && isDurationValid) {
|
|
durationNumber = isInMin ? durationNumber * 60 : durationNumber / 60;
|
|
$(`#${durationId}`).val(durationNumber);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function calcDuration(idPrefix, isFormatChange, isInvokedByStart, isInvokedByEnd) {
|
|
const endDateInput = $(`#${idPrefix}-end-date-input`);
|
|
const startDateInput = $(`#${idPrefix}-start-date-input`);
|
|
const endTimeInput = $(`#${idPrefix}-end-time-input`);
|
|
const startTimeInput = $(`#${idPrefix}-start-time-input`);
|
|
const durationInput = $(`#${idPrefix}-duration-input`);
|
|
const hoursMinutesBtn = $(`#${idPrefix}-hours-minutes-dropdown-btn`);
|
|
|
|
const startDateValue = startDateInput.val();
|
|
const startTimeValue = startTimeInput.val();
|
|
const endDateValue = endDateInput.val();
|
|
const endTimeValue = endTimeInput.val();
|
|
const durationValue = durationInput.val();
|
|
|
|
//alert(hoursMinutesBtn.text());
|
|
const isInMin = hoursMinutesBtn.length === 0 || hoursMinutesBtn.length > 0 && hoursMinutesBtn.text().replaceAll(/\s/g, "") === "Minuten";
|
|
//alert(isInMin);
|
|
const hasEndDate = endDateInput.length;
|
|
|
|
if (startDateValue.length === 0) {
|
|
return;
|
|
}
|
|
|
|
const isStartTimeValid = startTimeValue !== null && startTimeValue !== undefined && startTimeValue.length > 0;
|
|
const isEndTimeValid = endTimeValue !== null && endTimeValue !== undefined && endTimeValue.length > 0;
|
|
const duration = parseFloat(durationValue.replace(",", "."));
|
|
const isDurationValid = !isNaN(duration);
|
|
|
|
let start = new Date(startDateValue);
|
|
let end = hasEndDate ? new Date(endDateValue) : start;
|
|
|
|
if (true === isStartTimeValid && true === isEndTimeValid && false === isFormatChange) {
|
|
start = combineDateAndTime(start, startTimeValue);
|
|
end = combineDateAndTime(end, endTimeValue);
|
|
|
|
let dauer = (end.getTime() - start.getTime()) / 60000;
|
|
|
|
if (duration > 0 && start >= end) {
|
|
dauer = (false === isInMin ? duration * 60 : duration);
|
|
|
|
if (true === isInvokedByStart) {
|
|
end = new Date(start.getTime() + dauer * 60000);
|
|
|
|
endTimeInput.val(getTimeAsString(end));
|
|
endDateInput.val(getDateAsString(end));
|
|
}
|
|
else if (true === isInvokedByEnd) {
|
|
end.setDate(end.getDate() + 1);
|
|
|
|
var test = new Date(2025, 1, 31);
|
|
test.setDate(test.getDate() + 1);
|
|
//start = new Date(end.getTime() - dauer * 60000);
|
|
|
|
endTimeInput.val(getTimeAsString(end));
|
|
endDateInput.val(getDateAsString(end));
|
|
|
|
//startTimeInput.val(getTimeAsString(start));
|
|
//startDateInput.val(getDateAsString(start));
|
|
}
|
|
|
|
dauer = (end.getTime() - start.getTime()) / 60000;
|
|
}
|
|
|
|
if (false === isInMin) {
|
|
dauer /= 60.0;
|
|
}
|
|
|
|
durationInput.val(dauer);
|
|
} else if (true === isStartTimeValid && true === isDurationValid) {
|
|
var newDuration = duration;
|
|
if (true === isFormatChange) {
|
|
let newDurationValue = true === isInMin ? duration * 60.0 : duration / 60.0;
|
|
|
|
if(isNaN(newDurationValue)) {
|
|
durationInput.val("");
|
|
} else {
|
|
durationInput.val(newDurationValue);
|
|
}
|
|
if (true === isInMin)
|
|
{
|
|
newDuration = newDurationValue;
|
|
}
|
|
|
|
}
|
|
|
|
calcTimeWithDuration(startTimeValue, endTimeInput, start, newDuration, isFormatChange, isInMin);
|
|
} else if(true === isEndTimeValid && true === isDurationValid) {
|
|
if(true === isFormatChange) {
|
|
durationInput.val(formatDuration(isInMin, true === isInMin ? duration * 60.0 : duration / 60.0));
|
|
}
|
|
|
|
calcTimeWithDuration(endTimeValue, startTimeInput, start, duration * -1.0, isFormatChange, isInMin);
|
|
} else if(true === isFormatChange) {
|
|
if (true === isFormatChange) {
|
|
durationInput.val(formatDuration(isInMin, true === isInMin ? duration * 60.0 : duration / 60.0));
|
|
}
|
|
}
|
|
}
|
|
|
|
function formatDuration(isInMin, durationAsNumber) {
|
|
if(true === isNaN(durationAsNumber)) {
|
|
return "";
|
|
}
|
|
|
|
const roundedValue = Math.round(durationAsNumber * 1000) / 1000;
|
|
|
|
if(isInMin) {
|
|
return roundedValue.toString().includes(".") ? roundedValue.toString().split(".")[0] : roundedValue;
|
|
} else {
|
|
if (roundedValue.toString().includes(".")) {
|
|
const splitRoundedValue = roundedValue.toString().split(".");
|
|
const [predecimalPlaces, decimalPlaces] = splitRoundedValue;
|
|
|
|
const end = decimalPlaces.length === 0 ? "00" : decimalPlaces.length > 2 ? decimalPlaces.substring(0, 2) : `${decimalPlaces}0`;
|
|
|
|
return `${predecimalPlaces},${end}`;
|
|
} else {
|
|
return `${roundedValue},00`;
|
|
}
|
|
}
|
|
}
|
|
|
|
function calcTimeWithDuration(timeAsString, timeElement, start, duration, isFormatChange, isInMin) {
|
|
start = combineDateAndTime(start, timeAsString);
|
|
|
|
const x = new Date(start.getTime() + duration * 60000);
|
|
var timeString = `${x.getHours().toString().padStart(2, "0")}:${x.getMinutes().toString().padStart(2, "0")}`;
|
|
timeElement.val(timeString);
|
|
}
|
|
|
|
function beiDaueraenderung(idPrefix) {
|
|
const hoursMinutesDropdown = $(`#${idPrefix}-hours-minutes-dropdown-btn`);
|
|
|
|
const startTimeInput = $(`#${idPrefix}-start-time-input`);
|
|
const endTimeInput = $(`#${idPrefix}-end-time-input`);
|
|
const durationInput = $(`#${idPrefix}-duration-input`);
|
|
const startDateInput = $(`#${idPrefix}-start-date-input`);
|
|
const endDateInput = $(`#${idPrefix}-end-date-input`);
|
|
const isInMin = hoursMinutesDropdown.length === 0 || hoursMinutesDropdown.length > 0 && hoursMinutesDropdown.text().replaceAll(/\s/g, "") === "Minuten";
|
|
|
|
const startTimeCondition = startTimeInput.val().length > 0;
|
|
const endTimeCondition = endTimeInput.val().length > 0;
|
|
let duration = parseFloat(durationInput.val().replace(",", "."));
|
|
|
|
const durationCondition = false === isNaN(duration);
|
|
|
|
if((false === startTimeCondition && false === endTimeCondition) || false === durationCondition) {
|
|
return;
|
|
}
|
|
|
|
if(false === isInMin) {
|
|
duration *= 60;
|
|
}
|
|
|
|
let start = new Date();
|
|
let end = new Date();
|
|
|
|
if(startDateInput.length > 0) {
|
|
start = new Date(startDateInput.val());
|
|
end = new Date(start);
|
|
}
|
|
|
|
if(endDateInput.length > 0) {
|
|
end = new Date(endDateInput.val());
|
|
}
|
|
|
|
if(true === startTimeCondition) {
|
|
const startDateAndTimeCombined = combineDateAndTime(start, startTimeInput.val());
|
|
|
|
end = new Date(startDateAndTimeCombined.getTime() + duration * 60000);
|
|
|
|
endTimeInput.val(getTimeAsString(end));
|
|
endDateInput.val(getDateAsString(end));
|
|
} else {
|
|
const endDateAndTimeCombined = combineDateAndTime(end, endTimeInput.val());
|
|
|
|
start = new Date(endDateAndTimeCombined.getTime() - duration * 60000);
|
|
|
|
startTimeInput.val(getTimeAsString(start));
|
|
startDateInput.val(getDateAsString(start));
|
|
}
|
|
}
|
|
|
|
function combineDateAndTime(date, time) {
|
|
const hours = time.split(":")[0];
|
|
const minutes = time.split(":")[1];
|
|
|
|
return new Date(date.getFullYear(), date.getMonth(), date.getDate(), hours, minutes);
|
|
}
|
|
|
|
function getTimeAsString(date) {
|
|
const hours = date.getHours().toString().padStart(2, "0");
|
|
const minutes = date.getMinutes().toString().padStart(2, "0");
|
|
|
|
return `${hours}:${minutes}`;
|
|
}
|
|
|
|
function getDateAsString(dateObject) {
|
|
const year = dateObject.getFullYear();
|
|
const date = dateObject.getDate().toString().padStart(2, "0");
|
|
const month = (dateObject.getMonth() + 1).toString().padStart(2, "0");
|
|
|
|
return `${year}-${month}-${date}`;
|
|
}
|
|
|
|
function dateToDateMonthFullYearStr(date) {
|
|
const dayOfMonth = date.getDate();
|
|
const month = date.getMonth() + 1;
|
|
const fullYear = date.getFullYear();
|
|
|
|
return `${dayOfMonth}.${month}.${fullYear}`;
|
|
} |