Skip to content

Instantly share code, notes, and snippets.

@DaniilVysotskiy
Created September 9, 2021 10:42
Show Gist options
  • Save DaniilVysotskiy/10c430c3227c7049128c2cb356c1f9cf to your computer and use it in GitHub Desktop.
Save DaniilVysotskiy/10c430c3227c7049128c2cb356c1f9cf to your computer and use it in GitHub Desktop.
Weekly duty table generator
import {
eachWeekOfInterval,
startOfYear,
endOfYear,
endOfWeek,
format,
isWithinInterval
} from "date-fns";
const members = [
{ name: "Name1", skip: [new Date("2021.09.09")] },
{ name: "Name2" },
{ name: "Name3" },
{ name: "Name4" }
];
const weeks = {};
const delayedMembers = [];
weeks.begin = eachWeekOfInterval({
start: startOfYear(new Date()),
end: endOfYear(new Date())
});
weeks.end = weeks.begin.map((week) => endOfWeek(week));
let memberIdx = 0;
const result = weeks.begin.map((week, index) => {
let row;
const start = week;
const end = weeks.end[index];
const startFormatted = format(start, "dd.MM.yyyy");
const endFormatted = format(end, "dd.MM.yyyy");
const delayedMember = delayedMembers.pop();
memberIdx = index % members.length;
let onDuty = delayedMember || members[memberIdx];
const isWithinWeek = onDuty.skip?.some((day) => {
return isWithinInterval(day, { start, end });
});
if (isWithinWeek) {
delayedMembers.push(onDuty);
memberIdx = (index + 1) % members.length;
onDuty = members[memberIdx];
}
row = { date: `${startFormatted} - ${endFormatted}`, duty: onDuty.name };
return row;
});
console.table(result);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment