Skip to content

Instantly share code, notes, and snippets.

@RWebster-Noble
Last active July 13, 2023 09:35
Show Gist options
  • Save RWebster-Noble/088cbcc3463134f8b5d55c6359759b36 to your computer and use it in GitHub Desktop.
Save RWebster-Noble/088cbcc3463134f8b5d55c6359759b36 to your computer and use it in GitHub Desktop.
//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