Files
BeWoPlaner/BeWoPlanerMobil/Scripts/ownSoft-Scripts/utils/service-record-time-calc.js
2025-10-09 12:56:32 +02:00

256 lines
9.4 KiB
JavaScript

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 durationLabel = $(`#${idPrefix}-duration-label`);
const startDateValue = startDateInput.val();
const startTimeValue = startTimeInput.val();
const endDateValue = endDateInput.val();
const endTimeValue = endTimeInput.val();
const durationValue = durationInput.val();
const hasMinutesHoursDropdown = hoursMinutesBtn.length > 0;
const isInMin = (false === hasMinutesHoursDropdown && false === durationLabel.text().includes("(h)")) ||
hasMinutesHoursDropdown === true && hoursMinutesBtn.text().replaceAll(/\s/g, "") === "Minuten";
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));
updateEndDate(idPrefix, getDateAsString(end));
updateEndTime(idPrefix, getTimeAsString(end));
}
else if(true === isInvokedByEnd) {
end.setDate(end.getDate() + 1);
endTimeInput.val(getTimeAsString(end));
endDateInput.val(getDateAsString(end));
updateEndDate(idPrefix, getDateAsString(end));
updateEndTime(idPrefix, getTimeAsString(end));
}
dauer = (end.getTime() - start.getTime()) / 60000;
}
if(false === isInMin) {
dauer /= 60.0;
}
durationInput.val(dauer);
updateDuration(idPrefix, durationInput.val());
} 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);
updateDuration(idPrefix, durationInput.val());
}
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));
updateDuration(idPrefix, durationInput.val());
}
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));
updateDuration(idPrefix, durationInput.val());
}
}
}
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);
const timeString = `${x.getHours().toString().padStart(2, "0")}:${x.getMinutes().toString().padStart(2, "0")}`;
timeElement.val(timeString);
timeElement.trigger("change");
}
function beiDaueraenderung(idPrefix) {
logInfo2(`${idPrefix}-Dauer geändert`);
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 hoursMinutesBtn = $(`#${idPrefix}-hours-minutes-dropdown-btn`);
const durationLabel = $(`#${idPrefix}-duration-label`);
const hasMinutesHoursDropdown = hoursMinutesDropdown.length > 0;
const isInMin = (false === hasMinutesHoursDropdown && false === durationLabel.text().includes("(h)")) ||
hasMinutesHoursDropdown === true && hoursMinutesBtn.text().replaceAll(/\s/g, "") === "Minuten";
const startTimeCondition = startTimeInput.val().length > 0;
const endTimeCondition = endTimeInput.val().length > 0;
var dauerString = durationInput.val();
if(dauerString.indexOf(".") >= 0) {
dauerString = dauerString.replace(".", ",");
durationInput.val(dauerString);
}
let duration = parseFloat(dauerString.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));
endTimeInput.trigger("change");
endDateInput.trigger("change");
} else {
const endDateAndTimeCombined = combineDateAndTime(end, endTimeInput.val());
start = new Date(endDateAndTimeCombined.getTime() - duration * 60000);
startTimeInput.val(getTimeAsString(start));
startDateInput.val(getDateAsString(start));
startTimeInput.trigger("change");
startDateInput.trigger("change");
}
}
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) {
if(date === null || date === undefined) {
return null;
}
const hours = date.getHours().toString().padStart(2, "0");
const minutes = date.getMinutes().toString().padStart(2, "0");
return `${hours}:${minutes}`;
}
function getDateAsString(dateObject) {
if(dateObject === null || dateObject === undefined) {
return null;
}
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 getDateAndTimeAsString(dateObject) {
if(dateObject === null || dateObject === undefined) {
return null;
}
const hours = dateObject.getHours().toString().padStart(2, "0");
const minutes = dateObject.getMinutes().toString().padStart(2, "0");
const seconds = dateObject.getSeconds().toString().padStart(2, "0");
const milliseconds = dateObject.getMilliseconds().toString().padStart(3, "0");
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} ${hours}:${minutes}:${seconds}.${milliseconds}`;
}