117 lines
4.5 KiB
JavaScript
117 lines
4.5 KiB
JavaScript
// ==UserScript==
|
|
// @name stomp
|
|
// @namespace https://git.lorenzzz.dev/lorenzhohermuth/
|
|
// @source https://git.lorenzzz.dev/lorenzhohermuth/stomp
|
|
// @version 1.5
|
|
// @description try to take over the world!
|
|
// @author You
|
|
// @match https://services.bsi-software.com/bsicrm/*
|
|
// @updateURL https://git.lorenzzz.dev/lorenzhohermuth/stomp/raw/branch/main/stomp.js
|
|
// @downloadURL https://git.lorenzzz.dev/lorenzhohermuth/stomp/raw/branch/main/stomp.js
|
|
// @grant none
|
|
// ==/UserScript==
|
|
|
|
document.addEventListener('keyup', doc_keyUp, false);
|
|
|
|
const successColor = "#1c9c31"
|
|
const errorColor = "#fa3737"
|
|
|
|
function doc_keyUp(e) {
|
|
if (e.keyCode == 145) {
|
|
if (!document.querySelector("div.menubar-box.left > div:nth-child(3) > span.content.text").textContent.match("Neue Arbeit")) {
|
|
return;
|
|
}
|
|
var headers = document.getElementsByClassName("table-header-item-text");
|
|
var columnPosBuchungstext;
|
|
var columnPosHours;
|
|
var columnPosActivity;
|
|
const emptyCellClassName = "table-cell white-space-nowrap halign-left table-aggregate-cell empty";
|
|
for (let i = 0; i < headers.length; i++) {
|
|
if (headers[i]) {
|
|
if (headers[i].textContent.match(/Buchungstext/gm)) {
|
|
columnPosBuchungstext = i;
|
|
} else if (headers[i].textContent.match(/Dauer \[h]/gm)) {
|
|
columnPosHours = i;
|
|
} else if (headers[i].textContent.match(/Aktivität/gm)) {
|
|
columnPosActivity = i;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
var startpos;
|
|
var nodes = document.getElementsByClassName("table-row first")[0].parentNode.children;
|
|
for (let i = 0; i < nodes.length; i++) {
|
|
if (nodes[i].className.match(/table-row (?:selected select-single )?first/g)) {
|
|
startpos = i;
|
|
break;
|
|
}
|
|
}
|
|
|
|
// 0800-1200/1245-1700[]
|
|
for (let i = startpos; i < nodes.length - 1; i++) {
|
|
let node = nodes[i].childNodes[columnPosBuchungstext];
|
|
let text = node.textContent;
|
|
if (text && text.match(/^[0-9]{4}-[0-9]{4}(?:\/[0-9]{4}-[0-9]{4})?(?:\[[-]?[0-9]{0,2}\])?/gm)) {
|
|
let morning = getMinutes(text.substring(0, 4), text.substring(5, 9));
|
|
let afternoon = getMinutes(text.substring(10, 14), text.substring(15, 19));
|
|
let stampMinutes = morning + afternoon + parseInt(text.match(/\[([-]?[0-9]+)\]/)[1]);
|
|
let n = i;
|
|
while (nodes[n].childNodes[columnPosBuchungstext].className != emptyCellClassName) {
|
|
n--;
|
|
}
|
|
let sumNode = nodes[n].childNodes[columnPosHours];
|
|
let actualNode = nodes[n].childNodes[columnPosBuchungstext];
|
|
let workSum = nodes[n].childNodes[columnPosHours].getElementsByClassName("text")[0].textContent.split(".");
|
|
let actualMinutes = toMinutes(parseInt(workSum[0]), parseInt(workSum[1] / 100 * 60));
|
|
actualMinutes -= getSchoolSum(n);
|
|
if (actualMinutes === stampMinutes) {
|
|
node.style.background = successColor;
|
|
sumNode.style.background = successColor;
|
|
} else {
|
|
node.style.background = errorColor;
|
|
sumNode.style.background = errorColor;
|
|
actualNode.textContent = "stomp: " + toHoursAndMinutes(stampMinutes);
|
|
actualNode.style.background = errorColor;
|
|
}
|
|
}
|
|
}
|
|
|
|
function getSchoolSum(startpos) {
|
|
for (let i = startpos + 1; (i < nodes.length - 1) && (nodes[i].childNodes[columnPosBuchungstext].className != emptyCellClassName); i++) {
|
|
let activityNode = nodes[i].childNodes[columnPosActivity];
|
|
let activityText = activityNode.textContent;
|
|
if (activityText && activityText.match(/Lernende: Berufsschule/gm)) {
|
|
let schoolSum = nodes[i].childNodes[columnPosHours].getElementsByClassName("text")[0].textContent.split(".");
|
|
return toMinutes(parseInt(schoolSum[0]), parseInt(schoolSum[1] / 100 * 60));
|
|
}
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
function getMinutes(first, second) {
|
|
var time_start = new Date();
|
|
var time_end = new Date();
|
|
var value_start = slice(first, 2);
|
|
var value_end = slice(second, 2);
|
|
|
|
time_start.setHours(value_start[0], value_start[1], 0, 0);
|
|
time_end.setHours(value_end[0], value_end[1], 0, 0);
|
|
return (time_end - time_start) / 1000 / 60 || 0;
|
|
}
|
|
|
|
function slice(str, index) {
|
|
return [str.slice(0, index), str.slice(index)];
|
|
}
|
|
|
|
function toHoursAndMinutes(totalMinutes) {
|
|
const hours = Math.floor(totalMinutes / 60);
|
|
const minutes = totalMinutes % 60 / 60 * 100;
|
|
return hours + "." + minutes;
|
|
}
|
|
|
|
function toMinutes(hours, minutes) {
|
|
return hours * 60 + minutes;
|
|
}
|
|
}
|
|
} |