diff --git a/src/app/utils/formatUtil.ts b/src/app/utils/formatUtil.ts index 15c7d82..bc72e4d 100644 --- a/src/app/utils/formatUtil.ts +++ b/src/app/utils/formatUtil.ts @@ -32,7 +32,7 @@ export const truncateMoney = (amount: number | undefined) => { const fractionDigits = maximumFractionDigits ?? minimumFractionDigits ?? 0; const factor = Math.pow(10, fractionDigits); - const truncatedAmount = Math.floor(amount * factor) / factor; + const truncatedAmount = Math.round(amount * factor) / factor; return truncatedAmount; }; diff --git a/src/components/CreateProject/CreateProject.tsx b/src/components/CreateProject/CreateProject.tsx index dbde1a1..1842f9a 100644 --- a/src/components/CreateProject/CreateProject.tsx +++ b/src/components/CreateProject/CreateProject.tsx @@ -59,7 +59,7 @@ import { } from "../Swal/CustomAlerts"; import dayjs from "dayjs"; import { DELETE_PROJECT } from "@/middleware"; -import { OUTPUT_DATE_FORMAT } from "@/app/utils/formatUtil"; +import { OUTPUT_DATE_FORMAT, sumMoney } from "@/app/utils/formatUtil"; import { deleteDraft, loadDraft, saveToLocalStorage } from "@/app/utils/draftUtils"; export interface Props { @@ -273,7 +273,7 @@ const CreateProject: React.FC = ({ const onSubmit = useCallback>( async (data, event) => { try { - console.log(data); + // console.log(data); // detect errors let hasErrors = false; @@ -374,30 +374,43 @@ const CreateProject: React.FC = ({ data.milestones[parseFloat(key)].startDate = null data.milestones[parseFloat(key)].endDate = null } - // if ( - // !Boolean(startDate) || - // startDate === "Invalid Date" || - // !Boolean(endDate) || - // endDate === "Invalid Date" || - // new Date(startDate) > new Date(endDate) - // ) { - // formProps.setError("milestones", { - // message: "milestones is not valid", - // type: "invalid", - // }); - // setTabIndex(3); - // hasErrors = true; - // } - + /* + unused code for checking the stage start date and end date + if ( + !Boolean(startDate) || + startDate === "Invalid Date" || + !Boolean(endDate) || + endDate === "Invalid Date" || + new Date(startDate) > new Date(endDate) + ) { + formProps.setError("milestones", { + message: "milestones is not valid", + type: "invalid", + }); + setTabIndex(3); + hasErrors = true; + } + + unused code for bulk add milestone payment projectTotal += payments.reduce( (acc, payment) => acc + payment.amount, 0, ); + **/ + + projectTotal += payments.reduce( + (acc, p) => sumMoney(acc, p.amount), + 0, + ); + + }); + // console.log(projectTotal) + console.log(milestonesKeys) if ( - projectTotal !== data.expectedProjectFee || - milestonesKeys.length !== taskGroupKeys.length + projectTotal !== data.expectedProjectFee + // || milestonesKeys.length !== taskGroupKeys.length ) { formProps.setError("milestones", { message: "milestones is not valid", @@ -484,7 +497,7 @@ const CreateProject: React.FC = ({ setServerError(t("An error has occurred. Please try again later.")); } }, - [router, t], + [router, t, draftId], ); const onSubmitError = useCallback>( @@ -565,6 +578,7 @@ const CreateProject: React.FC = ({ const saveDraft = useCallback(async () => { const currentTimestamp = Date.now() + console.log(currentTimestamp) saveToLocalStorage(draftId || currentTimestamp, formProps.getValues()); diff --git a/src/components/CreateProject/CreateProjectWrapper.tsx b/src/components/CreateProject/CreateProjectWrapper.tsx index 7595fbe..6dcb46a 100644 --- a/src/components/CreateProject/CreateProjectWrapper.tsx +++ b/src/components/CreateProject/CreateProjectWrapper.tsx @@ -83,7 +83,7 @@ const CreateProjectWrapper: React.FC = async (props) => { var filteredTeamLeads = teamId ? teamLeads.filter( (teamLead) => teamLead.teamId === teamId, ) : teamLeads - if (userStaff?.id !== null && userStaff?.id == 1) { + if (userStaff?.id != null && userStaff?.id == 1) { filteredTeamLeads = teamLeads.filter( (teamLead) => teamLead.teamId === teamId || teamLead.team == "ST", ) diff --git a/src/components/CreateProject/Milestone.tsx b/src/components/CreateProject/Milestone.tsx index 5b4c3a6..69f41bc 100644 --- a/src/components/CreateProject/Milestone.tsx +++ b/src/components/CreateProject/Milestone.tsx @@ -23,6 +23,7 @@ import { useFormContext } from "react-hook-form"; import { CreateProjectInputs } from "@/app/api/projects/actions"; import MilestoneSection from "./MilestoneSection"; import ProjectTotalFee from "./ProjectTotalFee"; +import { sumMoney } from "@/app/utils/formatUtil"; export interface Props { allTasks: Task[]; @@ -89,10 +90,17 @@ const Milestone: React.FC = ({ allTasks, isActive }) => { // hasError = true // } - projectTotal += payments.reduce((acc, payment) => acc + payment.amount, 0) + // projectTotal += payments.reduce((acc, payment) => acc + payment.amount, 0) + projectTotal += payments.reduce( + (acc, p) => sumMoney(acc, p.amount), + 0, + ); + }) + console.log(milestonesKeys) - if (projectTotal !== expectedTotalFee || milestonesKeys.length !== taskGroupsIds.length) { + // if (projectTotal !== expectedTotalFee || milestonesKeys.length !== taskGroupsIds.length) { + if (projectTotal !== expectedTotalFee) { hasError = true } // console.log(Object.keys(milestones).reduce((acc, key) => acc + milestones[parseFloat(key)].payments.reduce((acc2, value) => acc2 + value.amount, 0), 0)) diff --git a/src/components/CreateProject/ProjectClientDetails.tsx b/src/components/CreateProject/ProjectClientDetails.tsx index 4414949..5e86694 100644 --- a/src/components/CreateProject/ProjectClientDetails.tsx +++ b/src/components/CreateProject/ProjectClientDetails.tsx @@ -242,18 +242,18 @@ const ProjectClientDetails: React.FC = ({ // (acc, wn) => ({ ...acc, [wn.id]: wn.name }), // {}, // ); - const planStart = getValues("projectPlanStart") - const planEnd = getValues("projectPlanEnd") + const planStart = watch("projectPlanStart") + const planEnd = watch("projectPlanEnd") useEffect(() => { let hasErrors = false if( - !planStart || planStart > planEnd + !planStart || new Date(planStart) > new Date(planEnd) ){ hasErrors = true; } if( - !planEnd || planStart > planEnd + !planEnd || new Date(planStart) > new Date(planEnd) ){ hasErrors = true; } diff --git a/src/components/CreateStaff/StaffInfo.tsx b/src/components/CreateStaff/StaffInfo.tsx index 212295c..cee90c4 100644 --- a/src/components/CreateStaff/StaffInfo.tsx +++ b/src/components/CreateStaff/StaffInfo.tsx @@ -26,7 +26,7 @@ import { AdapterDayjs } from "@mui/x-date-pickers/AdapterDayjs"; import { DemoItem } from "@mui/x-date-pickers/internals/demo"; import dayjs from "dayjs"; import { INPUT_DATE_FORMAT } from "@/app/utils/formatUtil"; -import TableModal from "./TableModal"; +// import TableModal from "./TableModal"; import { Preview } from "@mui/icons-material"; import SalaryEffectiveModel from "../EditStaff/SalaryEffectiveModel"; import TeamHistoryModal from "../EditStaff/TeamHistoryModal"; diff --git a/src/components/LeaveTable/LeaveTable.tsx b/src/components/LeaveTable/LeaveTable.tsx index 4e36f44..c95f4b8 100644 --- a/src/components/LeaveTable/LeaveTable.tsx +++ b/src/components/LeaveTable/LeaveTable.tsx @@ -13,12 +13,14 @@ interface Props { leaveTypes: LeaveType[]; timesheetRecords: RecordTimesheetInput; companyHolidays: HolidaysResult[]; + isSaturdayWorker: boolean; } const LeaveTable: React.FC = ({ leaveTypes, timesheetRecords, companyHolidays, + isSaturdayWorker }) => { const { watch } = useFormContext(); const currentInput = watch(); @@ -32,6 +34,7 @@ const LeaveTable: React.FC = ({ timesheetEntries={timesheetRecords} EntryTableComponent={LeaveEntryTable} entryTableProps={{ leaveTypes }} + isSaturdayWorker={isSaturdayWorker} /> ); }; diff --git a/src/components/NavigationContent/NavigationContent.tsx b/src/components/NavigationContent/NavigationContent.tsx index f533e20..cf72724 100644 --- a/src/components/NavigationContent/NavigationContent.tsx +++ b/src/components/NavigationContent/NavigationContent.tsx @@ -110,10 +110,19 @@ const NavigationContent: React.FC = ({ abilities, username }) => { path: "/home", showOnMobile: true, }, + // { + // icon: , + // label: "Financial Summary", + // path: "/dashboard/ProjectFinancialSummary", + // isHidden: ![VIEW_DASHBOARD_ALL, VIEW_DASHBOARD_SELF].some((ability) => + // abilities!.includes(ability), + // ), + // showOnMobile: false, + // }, { icon: , label: "Financial Summary", - path: "/dashboard/ProjectFinancialSummary", + path: "/dashboard/ProjectFinancialSummaryV2", isHidden: ![VIEW_DASHBOARD_ALL, VIEW_DASHBOARD_SELF].some((ability) => abilities!.includes(ability), ), @@ -172,16 +181,6 @@ const NavigationContent: React.FC = ({ abilities, username }) => { }, ], }, - - // { - // icon: , - // label: "Financial Summary", - // path: "/dashboard/ProjectFinancialSummaryV2", - // isHidden: ![VIEW_DASHBOARD_ALL, VIEW_DASHBOARD_SELF].some((ability) => - // abilities!.includes(ability), - // ), - // showOnMobile: true, - // }, // No Claim function in Breaur, will be implement later // {