Files
worklenz/worklenz-backend/src/shared/tasks-controller-utils.ts

148 lines
4.7 KiB
TypeScript

import moment, {max, min} from "moment";
import db from "../config/db";
import {IGanttDateRange, IGanttWeekRange} from "../interfaces/gantt-chart";
const monthNames = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"];
export function isWeekend(date: Date) {
return date.getDay() == 0 || date.getDay() == 6;
}
export function isSunday(date: Date) {
return date.getDay() == 0;
}
export function isLastDayOfWeek(date: Date) {
return isSunday(new Date(date));
}
export function isToday(date: Date) {
return moment().isSame(moment(date).format("YYYY-MM-DD"), "day");
}
export async function getDates(startDate = "", endDate = "") {
let datesToAdd = 21;
const currentDuration = moment(endDate).diff(moment(startDate), "days");
if (currentDuration < 100) datesToAdd = 100 - currentDuration;
const start = moment(startDate).subtract("1", "day").format("YYYY-MM-DD");
const end = moment(endDate).add(datesToAdd, "days").format("YYYY-MM-DD");
let dates: IGanttDateRange[] = [];
const theDate = new Date(start);
while (theDate < new Date(end)) {
const data: IGanttDateRange = {
isSunday: isSunday(theDate),
isToday: isToday(theDate),
isWeekend: isWeekend(theDate),
isLastDayOfWeek: isLastDayOfWeek(theDate),
date: new Date(theDate)
};
dates = [...dates, data];
theDate.setDate(theDate.getDate() + 1);
}
dates.splice(-1);
return dates;
}
export async function getWeekRange(dates: IGanttDateRange[]) {
const weekData: IGanttWeekRange[] = [];
const weeks: number[] = [];
for (const [index, element] of dates.entries()) {
const weekIndex = moment(element.date).week();
if (!weeks.includes(weekIndex)) {
const d: any = {};
const monthData: string[] = [];
d.week_index = weekIndex;
d.days_of_week = dates.filter(e => {
return moment(e.date).week() === moment(element.date).week();
});
for (const item of d.days_of_week) {
const monthIndex = moment(item.date).month();
if (!monthData.includes(monthNames[monthIndex])) monthData.push(monthNames[monthIndex]);
}
d.month_name = monthData.join(" - ");
d.min = dates.findIndex(e => e.date?.valueOf() === min(d.days_of_week.map((days: any) => moment(days.date))).valueOf());
d.min = index !== 0 ? d.min + 2 : d.min + 1;
d.max = dates.findIndex(e => e.date?.valueOf() === max(d.days_of_week.map((days: any) => moment(days.date))).valueOf()) + 3;
weeks.push(weekIndex);
weekData.push(d);
}
}
return weekData;
}
export async function getMonthRange(dates: any[]) {
const monthData = [];
const months: any[] = [];
for (const [, date] of dates.entries()) {
const monthIndex = moment(date.date).month();
if (!months.includes(monthIndex)) {
const d: any = {};
d.month_name = monthNames[monthIndex];
d.month_index = monthIndex;
d.days_of_month = dates.filter(e => {
return moment(e.date).month() === moment(date.date).month();
});
d.min = dates.findIndex(e => e.date.valueOf() === min(d.days_of_month.map((days: any) => moment(days.date))).valueOf()) + 1;
d.max = dates.findIndex(e => e.date.valueOf() === max(d.days_of_month.map((days: any) => moment(days.date))).valueOf()) + 2;
months.push(monthIndex);
monthData.push(d);
}
}
return monthData;
}
export async function getMinMaxOfTaskDates(projectId: string) {
const q = `SELECT MIN(start_date) as min_date, MAX(end_date) as max_date
FROM tasks
WHERE project_id = $1;`;
const result = await db.query(q, [projectId]);
const [data] = result.rows;
if (!data.min_date) {
const minDateQ = `SELECT MIN(created_at) as min_date
FROM tasks
WHERE project_id = $1;`;
const q1Result = await db.query(minDateQ, [projectId]);
const [dataMinDate] = q1Result.rows;
data.min_date = dataMinDate?.min_date;
}
if (!data.max_date) {
const maxDateQ = `SELECT MAX(created_at) as max_date
FROM tasks
WHERE project_id = $1;`;
const q1Result = await db.query(maxDateQ, [projectId]);
const [dataMaxDate] = q1Result.rows;
data.max_date = dataMaxDate?.max_date;
}
return data;
}
export async function getDatesForResourceAllocation(startDate = "", endDate = "") {
const end = moment(endDate).add(4, "weeks").format("YYYY-MM-DD");
let dates: IGanttDateRange[] = [];
const theDate = new Date(startDate);
while (theDate < new Date(end)) {
const data: IGanttDateRange = {
isSunday: isSunday(theDate),
isToday: isToday(theDate),
isWeekend: isWeekend(theDate),
isLastDayOfWeek: isLastDayOfWeek(theDate),
date: new Date(theDate)
};
dates = [...dates, data];
theDate.setDate(theDate.getDate() + 1);
}
return dates;
}