Files
BeWoPlaner/BeWoPlanerMobil/Scripts/ownSoft-Scripts/utils/service-record-time-calc.js
Christian f8b180975d - Diverse Bugfixes Mok
- Kontaktdaten geändert bei LH Frankfurt Oder
2025-07-04 00:30:36 +02:00

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