Last active
July 13, 2023 09:35
-
-
Save RWebster-Noble/088cbcc3463134f8b5d55c6359759b36 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
//javascript:%28function%28%29%7Bfunction makeDate%28hours%2Cmins%29%7Bvar date%3Dnew Date%280%29%3Bdate.setHours%28hours%29%3Bdate.setMinutes%28mins%29%3Breturn date%7Dfunction calculateFlexitime%28times%2Cnow%2CcurrentBalanceMins%29%7Bfunction toTimeString%28mins%29%7Bfunction pad%28d%29%7Breturn d<10%3F"0"%2Bd.toString%28%29%3Ad.toString%28%29%7Dvar hoursString%3DMath.floor%28Math.abs%28mins%2F60%29%29%3Bvar minsString%3Dpad%28Math.floor%28Math.abs%28mins%29%2560%29%29%3Breturn hoursString%2B"%3A"%2BminsString%7Dvar minsWorked%3D0%3Bfor%28var i%3D0%3Bi%2B1<times.length%3Bi%2B%3D2%29%7Bvar timeIn%3Dtimes%5Bi%5D%3Bvar timeOut%3Dtimes%5Bi%2B1%5D%3BminsWorked%2B%3D%28timeOut.getTime%28%29-timeIn.getTime%28%29%29%2F%2860%2A1e3%29%7Dvar minsOnBreak%3D0%3Bfor%28var i%3D1%3Bi%2B1<times.length%3Bi%2B%3D2%29%7Bvar timeOut%3Dtimes%5Bi%5D%3Bvar timeIn%3Dtimes%5Bi%2B1%5D%3BminsOnBreak%2B%3D%28timeIn.getTime%28%29-timeOut.getTime%28%29%29%2F%2860%2A1e3%29%7Dif%28minsOnBreak<30%26%26minsWorked>30%29%7Bvar wastedBreak%3D30-minsOnBreak%3BminsWorked-%3DwastedBreak%3BminsOnBreak%3D30%7Dvar minsLeft%3D7%2A60%2B30-minsWorked%3Bvar timeLeftsignedString%3D%28minsLeft>0%3F"-"%3A"%2B"%29%2BtoTimeString%28minsLeft%29%3Bvar leaveAt%3Dnew Date%28now.getTime%28%29%2BminsLeft%2A%2860%2A1e3%29%29%3Bvar newClockingsString%3D"Leave at%3A "%2BleaveAt.toLocaleTimeString%28"en-GB"%2C%7Bhour%3A"2-digit"%2Cminute%3A"2-digit"%7D%29%2B" %28"%2BtimeLeftsignedString%2B"%29"%3Bvar newBalanceMins%3DcurrentBalanceMins-minsLeft%3Bvar newBalanceString%3D%28newBalanceMins>-.001%3F""%3A"-"%29%2BtoTimeString%28newBalanceMins%29%3Breturn%7BnewBalanceString%3AnewBalanceString%2CnewClockingsString%3AnewClockingsString%7D%7Dfunction sign%28n%29%7Breturn n%3D%3D-0%3F-1%3An%3D%3D0%3F1%3AMath.sign%28n%29%7Ddebugger%3Bvar now%3Dnew Date%3Bvar swipes%3D%5B%5D%3Bif%28__NEXT_DATA__.props.pageProps.initialState.clockings%29swipes%3D__NEXT_DATA__.props.pageProps.initialState.clockings.split%28" "%29%3Belse swipes%3D%5B...__NEXT_DATA__.props.initialState.flexiStatement.days%5B0%5D.swipes%5D%3Bvar lastSwipeString%3Bif%28__NEXT_DATA__.props.pageProps.initialState.lastSwipe%29lastSwipeString%3D__NEXT_DATA__.props.pageProps.initialState.lastSwipe%3Belse lastSwipeString%3D__NEXT_DATA__.props.pageProps.initialState.flexiStatement.days%5B0%5D.lastSwipe%3Bvar lastSwipeDate%3Dnew Date%28lastSwipeString%29%3Bvar lastSwipe%3DmakeDate%28lastSwipeDate.getHours%28%29%2ClastSwipeDate.getMinutes%28%29%29%3Bif%28swipes%5B0%5D%3D%3D"No"%29swipes%3D%5BlastSwipe%5D%3Bvar times%3D%5B%5D%3Bswipes.forEach%28time%3D>%7Bif%28typeof time%3D%3D%3D"string"%29%7BtimeParts%3Dtime.split%28"%2C"%29%5B0%5D.split%28"%3A"%29%3Btimes.push%28makeDate%28timeParts%5B0%5D%2CtimeParts%5B1%5D%29%29%7Delse%7Bvar t%3Dnew Date%28time%29%3Btimes.push%28makeDate%28t.getHours%28%29%2Ct.getMinutes%28%29%29%29%7D%7D%29%3Bif%28times%5Btimes.length-1%5D.getTime%28%29<lastSwipe.getTime%28%29%29times.push%28lastSwipe%29%3Btimes.push%28makeDate%28now.getHours%28%29%2Cnow.getMinutes%28%29%29%29%3Bvar balanceString%3Bif%28__NEXT_DATA__.props.pageProps.initialState.entitlement%26%26__NEXT_DATA__.props.pageProps.initialState.entitlement.flexiBalance%29balanceString%3D__NEXT_DATA__.props.pageProps.initialState.entitlement.flexiBalance%3Belse balanceString%3D__NEXT_DATA__.props.initialState.flexiStatement.periods%5B0%5D.currentBalance%3Bvar currentBalanceSplit%3DbalanceString.split%28"%3A"%29%3Bvar currentBalanceHours%3D%2BcurrentBalanceSplit%5B0%5D%3Bvar currentBalanceSign%3Dsign%28%2B%28currentBalanceSplit%5B0%5D%2B".1"%29%29%3Bvar currentBalanceMins%3DcurrentBalanceHours%2A60%2BcurrentBalanceSign%2A%2BcurrentBalanceSplit%5B1%5D%3Bvar%7BnewBalanceString%2CnewClockingsString%7D%3DcalculateFlexitime%28times%2Cnow%2CcurrentBalanceMins%29%3Bconsole.log%28balanceString%29%3Bconsole.log%28newBalanceString%29%3Bconsole.log%28newClockingsString%29%3Balert%28%60Current balance %3A %24%7BcurrentBalanceSplit%5B0%5D%7D%3A%24%7BcurrentBalanceSplit%5B1%5D%7D%5Cn%24%7BnewClockingsString%7D%5CnYour balance if you were to leave now%3A %24%7BnewBalanceString%7D%60%29%7D%29%28%29%3B | |
javascript: (function () { | |
function makeDate(hours, mins) { | |
var date = new Date(0); | |
date.setHours(hours); | |
date.setMinutes(mins); | |
return date; | |
} | |
function calculateFlexitime(times, now, currentBalanceMins) { | |
function toTimeString(mins) { | |
function pad(d) { | |
return (d < 10) ? '0' + d.toString() : d.toString(); | |
} | |
var hoursString = Math.floor(Math.abs(mins / 60)); | |
var minsString = pad(Math.floor(Math.abs(mins) % 60)); | |
return hoursString + ":" + minsString; | |
} | |
var minsWorked = 0; | |
for (var i = 0; i + 1 < times.length; i += 2) { | |
var timeIn = times[i]; | |
var timeOut = times[i + 1]; | |
minsWorked += (timeOut.getTime() - timeIn.getTime()) / (60 * 1000); | |
} | |
var minsOnBreak = 0; | |
for (var i = 1; i + 1 < times.length; i += 2) { | |
var timeOut = times[i]; | |
var timeIn = times[i + 1]; | |
minsOnBreak += (timeIn.getTime() - timeOut.getTime()) / (60 * 1000); | |
} | |
if (minsOnBreak < 30 && minsWorked > 30) { | |
var wastedBreak = 30 - minsOnBreak; | |
minsWorked -= wastedBreak; | |
minsOnBreak = 30; | |
//console.log("break Wasted:" + new Date(wastedBreak)) | |
} | |
var minsLeft = (7 * 60 + 30) - minsWorked; | |
var timeLeftsignedString = (minsLeft > 0 ? "-" : "+") + toTimeString(minsLeft) | |
//debugger; | |
var leaveAt = new Date(now.getTime() + (minsLeft) * (60 * 1000)) | |
//var leaveAtString = leaveAt.getHours() + ":" + pad(Math.round(leaveAt.getMinutes())) | |
var newClockingsString = "Leave at: " + leaveAt.toLocaleTimeString("en-GB", { hour: '2-digit', minute: '2-digit' }) + " (" + timeLeftsignedString + ")" | |
var newBalanceMins = currentBalanceMins - minsLeft | |
var newBalanceString = (newBalanceMins > -0.001 ? "" : "-") + toTimeString(newBalanceMins) | |
return { newBalanceString, newClockingsString }; | |
} | |
function sign(n) { | |
return n == -0 ? -1 : n == 0 ? 1 : Math.sign(n); | |
} | |
debugger; | |
var now = new Date(); | |
var swipes = []; | |
if (__NEXT_DATA__.props.pageProps.initialState.clockings) | |
swipes = __NEXT_DATA__.props.pageProps.initialState.clockings.split(" "); | |
else | |
swipes = [...__NEXT_DATA__.props.initialState.flexiStatement.days[0].swipes]; | |
var lastSwipeString; | |
if (__NEXT_DATA__.props.pageProps.initialState.lastSwipe) | |
lastSwipeString = __NEXT_DATA__.props.pageProps.initialState.lastSwipe | |
else | |
lastSwipeString = __NEXT_DATA__.props.pageProps.initialState.flexiStatement.days[0].lastSwipe | |
var lastSwipeDate = new Date(lastSwipeString) | |
var lastSwipe = makeDate(lastSwipeDate.getHours(), lastSwipeDate.getMinutes()) | |
if (swipes[0] == "No") | |
swipes = [lastSwipe] | |
var times = []; | |
swipes.forEach(time => { | |
if (typeof time === 'string') { | |
timeParts = time.split(",")[0].split(":"); | |
times.push(makeDate(timeParts[0], timeParts[1])) | |
} | |
else { | |
var t = new Date(time); | |
times.push(makeDate(t.getHours(), t.getMinutes())) | |
} | |
}) | |
if (times[times.length - 1].getTime() < lastSwipe.getTime()) | |
times.push(lastSwipe); | |
times.push(makeDate(now.getHours(), now.getMinutes())); | |
var balanceString; | |
if (__NEXT_DATA__.props.pageProps.initialState.entitlement && __NEXT_DATA__.props.pageProps.initialState.entitlement.flexiBalance) | |
balanceString = __NEXT_DATA__.props.pageProps.initialState.entitlement.flexiBalance | |
else | |
balanceString = __NEXT_DATA__.props.initialState.flexiStatement.periods[0].currentBalance | |
// var balanceString = "-01:30" | |
var currentBalanceSplit = balanceString.split(":") | |
var currentBalanceHours = +currentBalanceSplit[0] | |
var currentBalanceSign = sign(+(currentBalanceSplit[0] + ".1")) | |
var currentBalanceMins = currentBalanceHours * 60 + (currentBalanceSign * +currentBalanceSplit[1]); | |
var { newBalanceString, newClockingsString } = calculateFlexitime(times, now, currentBalanceMins); | |
console.log(balanceString) | |
console.log(newBalanceString) | |
console.log(newClockingsString) | |
alert(`Current balance : ${currentBalanceSplit[0]}:${currentBalanceSplit[1]}\n${newClockingsString}\nYour balance if you were to leave now: ${newBalanceString}`) | |
// document.getElementsByClassName("ace-balance__flexi-balance")[0].innerText = newBalanceString | |
// document.getElementsByClassName("ace-balance__flexi-today")[0].innerText = newClockingsString | |
function assertEquals(actual, expected, line) { | |
if (expected != actual) { | |
console.log(line + "\nexpected: \"" + expected + "\"\nactual : \"" + actual + "\""); | |
} | |
} | |
var now = makeDate(17, 00); | |
var times = [makeDate(9, 00), makeDate(12, 00), makeDate(12, 30), now] | |
currentBalanceMins = 0 | |
var { newBalanceString, newClockingsString } = calculateFlexitime(times, now, currentBalanceMins); | |
assertEquals(newClockingsString, "Leave at: 17:00 (+0:00)", "newClockingsString: 9 till 5") | |
assertEquals(newBalanceString, "0:00", "newBalanceString: 9 till 5") | |
var now = makeDate(17, 00); | |
var times = [makeDate(9, 01), makeDate(12, 00), makeDate(12, 00), now] | |
currentBalanceMins = 0 | |
var { newBalanceString, newClockingsString } = calculateFlexitime(times, now, currentBalanceMins); | |
assertEquals(newClockingsString, "Leave at: 17:01 (-0:01)", "newClockingsString: 9:01 start") | |
assertEquals(newBalanceString, "-0:01", "newBalanceString: 9:01 start") | |
var now = makeDate(17, 00); | |
var times = [makeDate(8, 59), makeDate(12, 00), makeDate(12, 00), now] | |
currentBalanceMins = 0 | |
var { newBalanceString, newClockingsString } = calculateFlexitime(times, now, currentBalanceMins); | |
assertEquals(newClockingsString, "Leave at: 16:59 (+0:01)", "newClockingsString: 8:59 start") | |
assertEquals(newBalanceString, "0:01", "newBalanceString: 8:59 start") | |
var now = makeDate(17, 00); | |
var times = [makeDate(9, 00), makeDate(12, 01), makeDate(12, 30), now] | |
currentBalanceMins = 0 | |
var { newBalanceString, newClockingsString } = calculateFlexitime(times, now, currentBalanceMins); | |
assertEquals(newClockingsString, "Leave at: 17:00 (+0:00)", "newClockingsString: 12:01 lunch") | |
assertEquals(newBalanceString, "0:00", "newBalanceString: 12:01 lunch") | |
var now = makeDate(17, 00); | |
var times = [makeDate(9, 00), makeDate(11, 59), makeDate(12, 30), now] | |
currentBalanceMins = 0 | |
var { newBalanceString, newClockingsString } = calculateFlexitime(times, now, currentBalanceMins); | |
assertEquals(newClockingsString, "Leave at: 17:01 (-0:01)", "newClockingsString: 11:59 lunch") | |
assertEquals(newBalanceString, "-0:01", "newBalanceString: 11:59 lunch") | |
var now = makeDate(17, 00); | |
var times = [makeDate(9, 00), makeDate(12, 00), makeDate(12, 31), now] | |
currentBalanceMins = 0 | |
var { newBalanceString, newClockingsString } = calculateFlexitime(times, now, currentBalanceMins); | |
assertEquals(newClockingsString, "Leave at: 17:01 (-0:01)", "newClockingsString: 12:31 lunch end") | |
assertEquals(newBalanceString, "-0:01", "newBalanceString: 12:31 lunch end") | |
var now = makeDate(17, 00); | |
var times = [makeDate(9, 00), makeDate(12, 00), makeDate(12, 29), now] | |
currentBalanceMins = 0 | |
var { newBalanceString, newClockingsString } = calculateFlexitime(times, now, currentBalanceMins); | |
assertEquals(newClockingsString, "Leave at: 17:00 (+0:00)", "newClockingsString: 12:29 lunch end") | |
assertEquals(newBalanceString, "0:00", "newBalanceString: 12:29 lunch end") | |
var now = makeDate(17, 01); | |
var times = [makeDate(9, 00), makeDate(12, 00), makeDate(12, 30), now] | |
currentBalanceMins = 0 | |
var { newBalanceString, newClockingsString } = calculateFlexitime(times, now, currentBalanceMins); | |
assertEquals(newClockingsString, "Leave at: 17:00 (+0:01)", "newClockingsString: 17:01 now") | |
assertEquals(newBalanceString, "0:01", "newBalanceString: 17:01 now") | |
var now = makeDate(17, 00); | |
var times = [makeDate(9, 00), makeDate(12, 00), makeDate(12, 00), now] | |
currentBalanceMins = 0 | |
var { newBalanceString, newClockingsString } = calculateFlexitime(times, now, currentBalanceMins); | |
assertEquals(newClockingsString, "Leave at: 17:00 (+0:00)", "newClockingsString: no lunch") | |
assertEquals(newBalanceString, "0:00", "newBalanceString: no lunch") | |
var now = makeDate(17, 00); | |
var times = [makeDate(9, 00), makeDate(12, 00), makeDate(14, 00), now] | |
currentBalanceMins = 0 | |
var { newBalanceString, newClockingsString } = calculateFlexitime(times, now, currentBalanceMins); | |
assertEquals(newClockingsString, "Leave at: 18:30 (-1:30)", "newClockingsString: 2 hr lunch") | |
assertEquals(newBalanceString, "-1:30", "newBalanceString: 2 hr lunch") | |
var now = makeDate(17, 00); | |
var times = [makeDate(9, 00), makeDate(12, 00), makeDate(12, 30), now] | |
currentBalanceMins = 90 | |
var { newBalanceString, newClockingsString } = calculateFlexitime(times, now, currentBalanceMins); | |
assertEquals(newClockingsString, "Leave at: 17:00 (+0:00)", "newClockingsString: 1:30 existing balance") | |
assertEquals(newBalanceString, "1:30", "newBalanceString: 1:30 existing balance") | |
var now = makeDate(17, 00); | |
var times = [makeDate(9, 00), makeDate(12, 00), makeDate(12, 30), now] | |
currentBalanceMins = -90 | |
var { newBalanceString, newClockingsString } = calculateFlexitime(times, now, currentBalanceMins); | |
assertEquals(newClockingsString, "Leave at: 17:00 (+0:00)", "newClockingsString: -1:30 existing balance") | |
assertEquals(newBalanceString, "-1:30", "newBalanceString: -1:30 existing balance") | |
var now = makeDate(17, 00); | |
var times = [makeDate(8, 59), makeDate(12, 00), makeDate(12, 30), now] | |
currentBalanceMins = 90 | |
var { newBalanceString, newClockingsString } = calculateFlexitime(times, now, currentBalanceMins); | |
assertEquals(newClockingsString, "Leave at: 16:59 (+0:01)", "newClockingsString: 1:30 existing balance 8:59 start") | |
assertEquals(newBalanceString, "1:31", "newBalanceString: 1:30 existing balance 8:59 start") | |
var now = makeDate(15, 10); | |
var times = [makeDate(8, 39), makeDate(12,26), makeDate(12,55), now] | |
currentBalanceMins = -38 | |
var { newBalanceString, newClockingsString } = calculateFlexitime(times, now, currentBalanceMins); | |
assertEquals(newClockingsString, "Leave at: 16:39 (-1:29)", "newClockingsString: realworld") | |
assertEquals(newBalanceString, "-2:07", "newClockingsString: realworld") | |
var now = makeDate(16, 10); | |
var times = [makeDate(8, 00), makeDate(12,00), makeDate(13,35), now] | |
currentBalanceMins = 47 | |
var { newBalanceString, newClockingsString } = calculateFlexitime(times, now, currentBalanceMins); | |
assertEquals(newClockingsString, "Leave at: 17:05 (-0:55)", "newClockingsString: realworld2") | |
assertEquals(newBalanceString, "-0:08", "newClockingsString: realworld2") | |
})(); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment