diff --git a/__tests__/Utils/getTotalMissedTaskProgressUpdate.test.ts b/__tests__/Utils/getTotalMissedTaskProgressUpdate.test.ts new file mode 100644 index 000000000..ac2b13216 --- /dev/null +++ b/__tests__/Utils/getTotalMissedTaskProgressUpdate.test.ts @@ -0,0 +1,21 @@ +import { getTotalMissedTaskProgressUpdate } from '@/utils/getTotalMissedTaskProgressUpdate'; + +describe('Get total missed task progress update', () => { + test('should return 1 if progress is not updated in last 3 days', () => { + jest.useFakeTimers().setSystemTime(new Date('13 january 2024')); + const result = getTotalMissedTaskProgressUpdate(1704795225 * 1000); + expect(result).toBe(1); + }); + + test('should return 0 if last progress is updated in 3 days', () => { + jest.useFakeTimers().setSystemTime(new Date('11 january 2024')); + const result = getTotalMissedTaskProgressUpdate(1704795225 * 1000); + expect(result).toBe(0); + }); + + test('should return 0 if the last progress is not updated in 3 days but the date includes sunday', () => { + jest.useFakeTimers().setSystemTime(new Date('8 january 2024')); + const result = getTotalMissedTaskProgressUpdate(1704445747000); + expect(result).toBe(0); + }); +}); diff --git a/src/app/services/progressesApi.ts b/src/app/services/progressesApi.ts index 9436a90d2..9e110a7bd 100644 --- a/src/app/services/progressesApi.ts +++ b/src/app/services/progressesApi.ts @@ -3,7 +3,7 @@ import { progressDetails } from '@/types/standup.type'; type queryParamsType = { userId?: string; - taskId?: string; + taskId?: string | string[]; }; export const progressesApi = api.injectEndpoints({ diff --git a/src/app/services/taskDetailsApi.ts b/src/app/services/taskDetailsApi.ts index c3099626f..988e49447 100644 --- a/src/app/services/taskDetailsApi.ts +++ b/src/app/services/taskDetailsApi.ts @@ -56,7 +56,10 @@ const getTasksDependencyDetailsQueryFn = async ( export const taskDetailsApi = api.injectEndpoints({ endpoints: (build) => ({ - getTaskDetails: build.query({ + getTaskDetails: build.query< + taskDetailsDataType, + string[] | undefined | string + >({ query: (taskId): string => `${TASKS_URL}/${taskId}/details`, providesTags: ['Task_Details'], }), diff --git a/src/components/ProgressForm/ProgressLayout.tsx b/src/components/ProgressForm/ProgressLayout.tsx index c1adc7144..01c02245d 100644 --- a/src/components/ProgressForm/ProgressLayout.tsx +++ b/src/components/ProgressForm/ProgressLayout.tsx @@ -8,23 +8,51 @@ import ProgressForm from './ProgressForm'; import styles from '@/components/ProgressForm/ProgressForm.module.scss'; import { questions } from '@/constants/ProgressUpdates'; -import { getTotalMissedUpdates } from '@/utils/getTotalMissedUpdate'; +import { getTotalMissedTaskProgressUpdate } from '@/utils/getTotalMissedTaskProgressUpdate'; import { useGetProgressDetailsQuery } from '@/app/services/progressesApi'; -import { useGetUserQuery } from '@/app/services/userApi'; +import { useGetTaskDetailsQuery } from '@/app/services/taskDetailsApi'; -const ProgressLayout: FC = () => { - const { data: user } = useGetUserQuery(); - const { data: userStandupdata } = useGetProgressDetailsQuery({ - userId: user?.id, - }); +interface ProgressLayoutPropsType { + taskId: string[] | undefined; +} + +const ProgressLayout: FC = ({ taskId }) => { + const { data: userStandupdata, isLoading: isProgressUpdateDetailsLoading } = + useGetProgressDetailsQuery( + { + taskId: taskId, + }, + { skip: taskId ? false : true } + ); + + const { data: taskDetailData, isLoading: isTaskDetailsLoading } = + useGetTaskDetailsQuery(taskId); + + const taskStartedOn = taskDetailData?.taskData?.createdAt; const standupDates = userStandupdata?.data?.map((element) => element.date); - const totalMissedUpdates = getTotalMissedUpdates(standupDates || []); + + let totalProgressMissedUpdates; + + if (!isTaskDetailsLoading && !isProgressUpdateDetailsLoading) { + if (standupDates) { + totalProgressMissedUpdates = getTotalMissedTaskProgressUpdate( + standupDates[0] + ); + } else { + totalProgressMissedUpdates = getTotalMissedTaskProgressUpdate( + Number(taskStartedOn) * 1000 + ); + } + } else { + totalProgressMissedUpdates = 0; + } + return ( <>
diff --git a/src/interfaces/task.type.ts b/src/interfaces/task.type.ts index b408f1c5b..e3fde1610 100644 --- a/src/interfaces/task.type.ts +++ b/src/interfaces/task.type.ts @@ -6,6 +6,7 @@ type task = { type: string; links?: string[]; endsOn: number; + createdAt: string; startedOn: string; createdBy: string; assignee?: string; diff --git a/src/pages/progress/[id].tsx b/src/pages/progress/[id].tsx index 030b278a1..d8e477bbd 100644 --- a/src/pages/progress/[id].tsx +++ b/src/pages/progress/[id].tsx @@ -12,7 +12,7 @@ const ProgressUpdatesPage = () => { return ; } - return ; + return ; }; export default ProgressUpdatesPage; diff --git a/src/utils/getTotalMissedTaskProgressUpdate.ts b/src/utils/getTotalMissedTaskProgressUpdate.ts new file mode 100644 index 000000000..50b1b4c65 --- /dev/null +++ b/src/utils/getTotalMissedTaskProgressUpdate.ts @@ -0,0 +1,47 @@ +import { TOTAL_MILLISECONDS_IN_A_HOUR } from '@/constants/date'; + +export function getTotalMissedTaskProgressUpdate(lastUpdated: number) { + const presentDateInUtc = new Date().toUTCString(); + const taskLastUpdatedOn = new Date(lastUpdated).toUTCString(); + + const presentDateMillisecond = new Date(presentDateInUtc).valueOf(); + const taskStartedOnMillisecond = new Date(taskLastUpdatedOn).valueOf(); + + let count = 0; + const sundays = getSundays(lastUpdated); + + const differenceInHours = Math.round( + (presentDateMillisecond - taskStartedOnMillisecond) / + TOTAL_MILLISECONDS_IN_A_HOUR + ); + + let missedProgressUpdate = Math.round(differenceInHours / 24); + if (sundays !== 0) { + missedProgressUpdate = missedProgressUpdate - sundays; + } + + if (missedProgressUpdate >= 3) { + for (let i = 1; i <= missedProgressUpdate; i++) { + if (i % 3 === 0) { + count++; + } + } + return count; + } else { + return count; + } +} + +function getSundays(taskStartedOn: number) { + const taskStartedOnDate = new Date(taskStartedOn); + const currentDate = new Date(); + let sundays = 0; + + while (taskStartedOnDate <= currentDate) { + if (taskStartedOnDate.getDay() === 0) { + sundays++; + } + taskStartedOnDate.setDate(taskStartedOnDate.getDate() + 1); + } + return sundays; +}