From c1afd778fa66a861ce80a06d6e347d22b97daa65 Mon Sep 17 00:00:00 2001 From: "MSI\\2Fi" Date: Thu, 22 Aug 2024 13:42:46 +0800 Subject: [PATCH 1/2] Add delete Invoice button in edit dialog --- src/app/api/invoices/actions.ts | 17 ++++++++++++-- .../InvoiceSearch/InvoiceSearch.tsx | 22 ++++++++++++++++--- 2 files changed, 34 insertions(+), 5 deletions(-) diff --git a/src/app/api/invoices/actions.ts b/src/app/api/invoices/actions.ts index 22bbd0f..d4d526b 100644 --- a/src/app/api/invoices/actions.ts +++ b/src/app/api/invoices/actions.ts @@ -1,6 +1,6 @@ "use server" -import { serverFetchJson, serverFetchString } from "@/app/utils/fetchUtil"; +import { serverFetchJson, serverFetchString, serverFetchWithNoContent } from "@/app/utils/fetchUtil"; import { BASE_API_URL } from "@/config/api"; import { revalidateTag } from "next/cache"; import { cache } from "react"; @@ -117,4 +117,17 @@ export const updateInvoice = async (data: any) => { revalidateTag("invoices") return updateInvoice; -} \ No newline at end of file +} + +export const deleteInvoice = async (id: number) => { + const invoice = await serverFetchWithNoContent( + `${BASE_API_URL}/invoices/${id}`, + { + method: "DELETE", + headers: { "Content-Type": "application/json" }, + }, + ); + + revalidateTag("invoices"); + return invoice; +}; \ No newline at end of file diff --git a/src/components/InvoiceSearch/InvoiceSearch.tsx b/src/components/InvoiceSearch/InvoiceSearch.tsx index 5d1423c..53c69ef 100644 --- a/src/components/InvoiceSearch/InvoiceSearch.tsx +++ b/src/components/InvoiceSearch/InvoiceSearch.tsx @@ -8,8 +8,8 @@ import EditNote from "@mui/icons-material/EditNote"; import { moneyFormatter } from "@/app/utils/formatUtil" import { Button, ButtonGroup, Stack, Tab, Tabs, TabsProps, Dialog, DialogTitle, DialogContent, DialogContentText, DialogActions, TextField, CardContent, Typography, Divider, Card } from "@mui/material"; import FileUploadIcon from '@mui/icons-material/FileUpload'; -import { importIssuedInovice, importReceivedInovice, updateInvoice } from "@/app/api/invoices/actions"; -import { errorDialogWithContent, successDialog } from "../Swal/CustomAlerts"; +import { deleteInvoice, importIssuedInovice, importReceivedInovice, updateInvoice } from "@/app/api/invoices/actions"; +import { deleteDialog, errorDialogWithContent, successDialog } from "../Swal/CustomAlerts"; import { invoiceList, issuedInvoiceList, issuedInvoiceSearchForm, receivedInvoiceList, receivedInvoiceSearchForm } from "@/app/api/invoices"; import EditOutlinedIcon from '@mui/icons-material/EditOutlined'; import { GridCellParams, GridColDef, GridEventListener, GridRowId, GridRowModes, GridRowModesModel } from "@mui/x-data-grid"; @@ -43,7 +43,7 @@ type SearchQuery2 = Partial>; type SearchParamNames2 = keyof SearchQuery2; const InvoiceSearch: React.FC = ({ issuedInvoice, receivedInvoice, invoices }) => { - console.log(invoices) + // console.log(invoices) const { t } = useTranslation("invoices"); const [tabIndex, setTabIndex] = useState(0); @@ -268,6 +268,19 @@ const InvoiceSearch: React.FC = ({ issuedInvoice, receivedInvoice, invoic // setSelectedRow([]); }; + const handleDeleteInvoice = useCallback(() => { + deleteDialog(async() => { + //console.log(selectedRow[0]) + await deleteInvoice(selectedRow[0].id!!) + setDialogOpen(false); + const result = await successDialog("Delete Success", t); + if (result) { + window.location.reload() + } + }, t) + }, [selectedRow]); + + const handleSaveDialog = async () => { // setDialogOpen(false); await updateInvoice(selectedRow[0]) @@ -562,6 +575,9 @@ const InvoiceSearch: React.FC = ({ issuedInvoice, receivedInvoice, invoic /> + From 959a7684850e853fcf680a76aac5cbae56b58fc3 Mon Sep 17 00:00:00 2001 From: kelvinsuen Date: Fri, 23 Aug 2024 18:09:51 +0800 Subject: [PATCH 2/2] update number digit alignment --- .../ProgressByClient/ProgressByClient.tsx | 39 +++++--- .../ProgressByTeam/ProgressByTeam.tsx | 44 +++++---- .../ProjectCashFlow/ProjectCashFlow.tsx | 31 ++++--- .../ProjectFinancialSummary.tsx | 12 +++ .../ProjectResourceConsumptionRanking.tsx | 41 +++++--- .../ProjectResourceSummary.tsx | 93 ++++++++++--------- 6 files changed, 155 insertions(+), 105 deletions(-) diff --git a/src/components/ProgressByClient/ProgressByClient.tsx b/src/components/ProgressByClient/ProgressByClient.tsx index ed6d118..8856446 100644 --- a/src/components/ProgressByClient/ProgressByClient.tsx +++ b/src/components/ProgressByClient/ProgressByClient.tsx @@ -281,6 +281,7 @@ const ProgressByClient: React.FC = () => { id: "budgetedManhour", field: "budgetedManhour", headerName: t("Budgeted Manhours"), + type: "number", minWidth: 70, renderCell: (params: any) => { return {params.row.budgetedManhour.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}; @@ -290,6 +291,7 @@ const ProgressByClient: React.FC = () => { id: "spentManhour", field: "spentManhour", headerName: t("Spent Manhours"), + type: "number", renderCell: (params: any) => { if (params.row.budgetedManhour - params.row.spentManhour <= 0) { return ( @@ -306,6 +308,7 @@ const ProgressByClient: React.FC = () => { id: "remainedManhour", field: "remainedManhour", headerName: t("Remained Manhours"), + type: "number", renderCell: (params: any) => { if (params.row.budgetedManhour - params.row.spentManhour <= 0) { return ( @@ -378,6 +381,14 @@ const ProgressByClient: React.FC = () => { legend: { show: false, }, + tooltip: { + enabled: true, + y: { + formatter: function (val) { + return val.toFixed(1) + "%"; + } + } + }, responsive: [ { breakpoint: 480, @@ -412,11 +423,11 @@ const ProgressByClient: React.FC = () => {
${projectCode} - ${projectName}
- ${t("Budget Manhours")}: ${budgetManhours} hours + ${t("Budget Manhours")}: ${budgetManhours.toFixed(2)} hours
- ${t("Spent Manhours")}: ${spentManhours} hours + ${t("Spent Manhours")}: ${spentManhours.toFixed(2)} hours
- Percentage: ${value}% + Percentage: ${value.toFixed(1)}%
`; @@ -674,9 +685,9 @@ const ProgressByClient: React.FC = () => {
- {projectBudgetManhour} + {projectBudgetManhour}

@@ -685,13 +696,13 @@ const ProgressByClient: React.FC = () => { className="mt-2 text-lg font-medium" style={{ color: "#898d8d" }} > - {t("Actual Manhours Spent")} + {t("Actual Manhours Spent")}
- {actualManhourSpent} + {actualManhourSpent}

@@ -700,13 +711,13 @@ const ProgressByClient: React.FC = () => { className="mt-2 text-lg font-medium" style={{ color: "#898d8d" }} > - {t("Remained Manhours")} + {t("Remained Manhours")}
- {remainedManhour} + {remainedManhour}

@@ -715,13 +726,13 @@ const ProgressByClient: React.FC = () => { className="mt-2 text-lg font-medium" style={{ color: "#898d8d" }} > - {t("Last Update")} + {t("Last Update")}
- {lastUpdate} + {lastUpdate}
diff --git a/src/components/ProgressByTeam/ProgressByTeam.tsx b/src/components/ProgressByTeam/ProgressByTeam.tsx index edc0b93..9e1e3ba 100644 --- a/src/components/ProgressByTeam/ProgressByTeam.tsx +++ b/src/components/ProgressByTeam/ProgressByTeam.tsx @@ -322,6 +322,7 @@ const ProgressByTeam: React.FC = () => { field: "budgetedManhour", headerName: t("Budgeted Manhours"), minWidth: 70, + type: "number", renderCell: (params: any) => { return {params.row.budgetedManhour.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}; } @@ -330,6 +331,7 @@ const ProgressByTeam: React.FC = () => { id: "spentManhour", field: "spentManhour", headerName: t("Spent Manhours"), + type: "number", renderCell: (params: any) => { if (params.row.budgetedManhour - params.row.spentManhour <= 0) { return ( @@ -345,6 +347,7 @@ const ProgressByTeam: React.FC = () => { id: "remainedManhour", field: "remainedManhour", headerName: t("Remained Manhours"), + type: "number", renderCell: (params: any) => { if (params.row.budgetedManhour - params.row.spentManhour <= 0) { return ( @@ -461,6 +464,14 @@ const ProgressByTeam: React.FC = () => { legend: { show: false, }, + tooltip: { + enabled: true, + y: { + formatter: function (val) { + return val.toFixed(1) + "%"; + } + } + }, responsive: [ { breakpoint: 480, @@ -494,12 +505,9 @@ const ProgressByTeam: React.FC = () => { const tooltipContent = `
${projectCode} - ${projectName} -
- ${t("Budget Manhours")}: ${budgetManhours} hours -
- ${t("Spent Manhours")}: ${spentManhours} hours -
- Percentage: ${value}% +
${t("Budget Manhours")}:${budgetManhours.toFixed(2)} hours +
${t("Spent Manhours")}:${spentManhours.toFixed(2)} hours +
Percentage:${value.toFixed(1)}%
`; @@ -789,13 +797,13 @@ const ProgressByTeam: React.FC = () => { className="mt-5 text-lg font-medium" style={{ color: "#898d8d" }} > - {t("Project Budget Manhours")} + {t("Project Budget Manhours")}
- {projectBudgetManhour} + {projectBudgetManhour}

@@ -804,13 +812,13 @@ const ProgressByTeam: React.FC = () => { className="mt-2 text-lg font-medium" style={{ color: "#898d8d" }} > - {t("Actual Manhours Spent")} + {t("Actual Manhours Spent")}
- {actualManhourSpent} + {actualManhourSpent}

@@ -819,13 +827,13 @@ const ProgressByTeam: React.FC = () => { className="mt-2 text-lg font-medium" style={{ color: "#898d8d" }} > - {t("Remained Manhours")} + {t("Remained Manhours")}
- {remainedManhour} + {remainedManhour}

@@ -834,13 +842,13 @@ const ProgressByTeam: React.FC = () => { className="mt-2 text-lg font-medium" style={{ color: "#898d8d" }} > - {t("Last Update")} + {t("Last Update")}
- {lastUpdate} + {lastUpdate}
diff --git a/src/components/ProjectCashFlow/ProjectCashFlow.tsx b/src/components/ProjectCashFlow/ProjectCashFlow.tsx index cb3b3b1..711bfc7 100644 --- a/src/components/ProjectCashFlow/ProjectCashFlow.tsx +++ b/src/components/ProjectCashFlow/ProjectCashFlow.tsx @@ -286,6 +286,7 @@ const ProjectCashFlow: React.FC = () => { field: "expenditure", headerName: t("Expenditure (HKD)"), flex: 0.6, + type: "number", renderCell: (params:any) => { return ( ${params.row.expenditure.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })} @@ -297,6 +298,7 @@ const ProjectCashFlow: React.FC = () => { field: "income", headerName: t("Income (HKD)"), flex: 0.6, + type: "number", renderCell: (params:any) => { return ( ${params.row.income.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })} @@ -308,6 +310,7 @@ const ProjectCashFlow: React.FC = () => { field: "balance", headerName: t("Cash Flow Balance (HKD)"), flex: 0.6, + type: "number", renderCell: (params:any) => { if (params.row.balance < 0) { return ( @@ -869,8 +872,8 @@ const ProjectCashFlow: React.FC = () => { {t("Total Project Fee")}
${totalFee.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}
@@ -882,8 +885,8 @@ const ProjectCashFlow: React.FC = () => { {t("Total Invoiced Amount")}
${totalInvoiced.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}
@@ -895,8 +898,8 @@ const ProjectCashFlow: React.FC = () => { {t("Total Received Amount")}
${totalReceived.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}
@@ -908,8 +911,8 @@ const ProjectCashFlow: React.FC = () => { {t("Accounts Receivable")}
${receivable.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}
@@ -944,8 +947,8 @@ const ProjectCashFlow: React.FC = () => { {t("Total Budget")}
${totalBudget.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}
@@ -957,8 +960,8 @@ const ProjectCashFlow: React.FC = () => { {t("Total Cumulative Expenditure")}
${totalExpenditure.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}
@@ -970,8 +973,8 @@ const ProjectCashFlow: React.FC = () => { {t("Remaining Budget")}
${expenditureReceivable.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}
diff --git a/src/components/ProjectFinancialSummary/ProjectFinancialSummary.tsx b/src/components/ProjectFinancialSummary/ProjectFinancialSummary.tsx index e55aaf8..88fcdc7 100644 --- a/src/components/ProjectFinancialSummary/ProjectFinancialSummary.tsx +++ b/src/components/ProjectFinancialSummary/ProjectFinancialSummary.tsx @@ -199,6 +199,7 @@ const ProjectFinancialSummary: React.FC = () => { field: 'totalFee', headerName: t("Total Fees")+t("HKD"), minWidth:50, + type: "number", renderCell: (params:any) => { return ( ${params.row.totalFee.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })} @@ -210,6 +211,7 @@ const ProjectFinancialSummary: React.FC = () => { field: 'totalBudget', headerName: t("Total Budget")+t("HKD"), minWidth:50, + type: "number", renderCell: (params:any) => { return ( ${params.row.totalBudget.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })} @@ -221,6 +223,7 @@ const ProjectFinancialSummary: React.FC = () => { field: 'cumulativeExpenditure', headerName: t("Total Cumulative Expenditure")+t("HKD"), minWidth:280, + type: "number", renderCell: (params:any) => { return ( ${params.row.cumulativeExpenditure.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })} @@ -232,6 +235,7 @@ const ProjectFinancialSummary: React.FC = () => { field: 'totalInvoiced', headerName: t("Total Invoiced Amount")+t("HKD"), minWidth:250, + type: "number", renderCell: (params:any) => { return ( ${params.row.totalInvoiced.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })} @@ -243,6 +247,7 @@ const ProjectFinancialSummary: React.FC = () => { field: 'totalUnInvoiced', headerName: t("Total Un-Invoiced Amount")+t("HKD"), minWidth:250, + type: "number", renderCell: (params:any) => { return ( ${params.row.totalUninvoiced.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })} @@ -254,6 +259,7 @@ const ProjectFinancialSummary: React.FC = () => { field: 'totalReceived', headerName: t("Total Received Amount")+t("HKD"), minWidth:250, + type: "number", renderCell: (params:any) => { return ( ${params.row.totalReceived.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })} @@ -404,6 +410,7 @@ const columns2 = [ id: 'totalFees', field: 'totalFees', headerName: t("Total Fees")+t("HKD"), + type: "number", minWidth:50, renderCell: (params:any) => { return ( @@ -416,6 +423,7 @@ const columns2 = [ field: 'totalBudget', headerName: t("Total Budget")+t("HKD"), minWidth:50, + type: "number", renderCell: (params:any) => { return ( ${params.row.totalBudget.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })} @@ -427,6 +435,7 @@ const columns2 = [ field: 'totalCumulativeExpenditure', headerName: t("Total Cumulative Expenditure")+t("HKD"), minWidth:250, + type: "number", renderCell: (params:any) => { return ( ${params.row.cumulativeExpenditure.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })} @@ -438,6 +447,7 @@ const columns2 = [ field: 'totalInvoicedAmount', headerName: t("Total Invoiced Amount")+t("HKD"), minWidth:250, + type: "number", renderCell: (params:any) => { return ( ${params.row.totalInvoiced.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })} @@ -449,6 +459,7 @@ const columns2 = [ field: 'totalUnInvoicedAmount', headerName: t("Total Un-Invoiced Amount")+t("HKD"), minWidth:250, + type: "number", renderCell: (params:any) => { return ( ${params.row.totalUninvoiced.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })} @@ -460,6 +471,7 @@ const columns2 = [ field: 'totalReceivedAmount', headerName: t("Total Received Amount") +t("HKD"), minWidth:250, + type: "number", renderCell: (params:any) => { return ( ${params.row.totalReceived.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })} diff --git a/src/components/ProjectResourceConsumptionRanking/ProjectResourceConsumptionRanking.tsx b/src/components/ProjectResourceConsumptionRanking/ProjectResourceConsumptionRanking.tsx index 34c40f1..d282a49 100644 --- a/src/components/ProjectResourceConsumptionRanking/ProjectResourceConsumptionRanking.tsx +++ b/src/components/ProjectResourceConsumptionRanking/ProjectResourceConsumptionRanking.tsx @@ -408,6 +408,7 @@ const ProjectResourceConsumptionRanking: React.FC = () => { field: "budgetedManhour", headerName: t("Budgeted Manhours"), minWidth: 70, + type: "number", renderCell: (params: any) => { return {params.row.budgetedManhour.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}; } @@ -416,6 +417,7 @@ const ProjectResourceConsumptionRanking: React.FC = () => { id: "spentManhour", field: "spentManhour", headerName: t("Spent Manhours"), + type: "number", renderCell: (params: any) => { if (params.row.budgetedManhour - params.row.spentManhour <= 0) { return ( @@ -431,6 +433,7 @@ const ProjectResourceConsumptionRanking: React.FC = () => { id: "remainedManhour", field: "remainedManhour", headerName: t("Remained Manhours"), + type: "number", renderCell: (params: any) => { if (params.row.budgetedManhour - params.row.spentManhour <= 0) { return ( @@ -547,6 +550,14 @@ const ProjectResourceConsumptionRanking: React.FC = () => { legend: { show: false, }, + tooltip: { + enabled: true, + y: { + formatter: function (val) { + return val.toFixed(1) + "%"; + } + } + }, responsive: [ { breakpoint: 480, @@ -581,11 +592,11 @@ const ProjectResourceConsumptionRanking: React.FC = () => {
${projectCode} - ${projectName}
- ${t("Budget Manhours")}: ${budgetManhours} ${t("hours")} + ${t("Budget Manhours")}: ${budgetManhours.toFixed(2)} ${t("hours")}
- ${t("Spent Manhours")}: ${spentManhours} ${t("hours")} + ${t("Spent Manhours")}: ${spentManhours.toFixed(2)} ${t("hours")}
- Percentage: ${value}% + Percentage: ${value.toFixed(1)}%
`; @@ -909,13 +920,13 @@ const ProjectResourceConsumptionRanking: React.FC = () => { className="mt-5 text-lg font-medium" style={{ color: "#898d8d" }} > - {t("Project Budget Manhours")} + {t("Project Budget Manhours")}
- {projectBudgetManhour} + {projectBudgetManhour}

@@ -924,13 +935,13 @@ const ProjectResourceConsumptionRanking: React.FC = () => { className="mt-2 text-lg font-medium" style={{ color: "#898d8d" }} > - {t("Actual Manhours Spent")} + {t("Actual Manhours Spent")}
- {actualManhourSpent} + {actualManhourSpent}

@@ -939,13 +950,13 @@ const ProjectResourceConsumptionRanking: React.FC = () => { className="mt-2 text-lg font-medium" style={{ color: "#898d8d" }} > - {t("Remained Manhours")} + {t("Remained Manhours")}
- {remainedManhour} + {remainedManhour}

@@ -954,13 +965,13 @@ const ProjectResourceConsumptionRanking: React.FC = () => { className="mt-2 text-lg font-medium" style={{ color: "#898d8d" }} > - {t("Last Update")} + {t("Last Update")}
- {lastUpdate} + {lastUpdate}
diff --git a/src/components/ProjectResourceSummary/ProjectResourceSummary.tsx b/src/components/ProjectResourceSummary/ProjectResourceSummary.tsx index 531462e..03bb662 100644 --- a/src/components/ProjectResourceSummary/ProjectResourceSummary.tsx +++ b/src/components/ProjectResourceSummary/ProjectResourceSummary.tsx @@ -234,6 +234,11 @@ const ProjectResourceSummary: React.FC = () => { // createTaskData("1.1 Preparation of preliminary...","-","-","172.00","-","54.00","-","42.00","-","12.00","-","3.00","-","283.00"), // ]; + const colBaseStyle:any = {fontSize:13, textAlign:"right"}; + const headerBaseStyle:any = {fontSize:11, minWidth:30, textAlign:"right"} + const infoHeaderStyle:any = { fontSize:"1em", fontWeight:"bold"};//, textAlign: "right"}; + const infoDataStyle:any = { fontSize:"1em"};//, textAlign: "right"}; + function Row(props:any) { const { row } = props; const [open, setOpen] = React.useState(false); @@ -253,19 +258,19 @@ const ProjectResourceSummary: React.FC = () => { )} {row.stage} - {row.taskCount} - {row.g1Planned.toFixed(2)} - {row.g1Actual.toFixed(2)} - {row.g2Planned.toFixed(2)} - {row.g2Actual.toFixed(2)} - {row.g3Planned.toFixed(2)} - {row.g3Actual.toFixed(2)} - {row.g4Planned.toFixed(2)} - {row.g4Actual.toFixed(2)} - {row.g5Planned.toFixed(2)} - {row.g5Actual.toFixed(2)} - {row.totalPlanned.toFixed(2)} - {row.totalActual.toFixed(2)} + {row.taskCount} + {row.g1Planned.toFixed(2)} + {row.g1Actual.toFixed(2)} + {row.g2Planned.toFixed(2)} + {row.g2Actual.toFixed(2)} + {row.g3Planned.toFixed(2)} + {row.g3Actual.toFixed(2)} + {row.g4Planned.toFixed(2)} + {row.g4Actual.toFixed(2)} + {row.g5Planned.toFixed(2)} + {row.g5Actual.toFixed(2)} + {row.totalPlanned.toFixed(2)} + {row.totalActual.toFixed(2)} {row.task.map((taskRow:any) => ( @@ -622,92 +627,92 @@ const columns2 = [
-
+
{t("Project")}
-
+
{projectName}
-
+
{t("Project Fee")}
-
+
HKD ${projectFee.toFixed(2)}
-
+
{t("Total Budget")}
-
+
HKD ${projectBudget.toFixed(2)}
-
+
{t("Cumulative Expenditure")}
-
+
HKD ${expenditure.toFixed(2)}
-
+
{t("Remaining Budget")}
-
+
HKD ${remainingBudget.toFixed(2)}
-
+
{t("Status")}
-
+
{t(status)}
-
+
{t("Planned Resources")}
-
+
{plannedResources.toFixed(2)} {t("Manhours")}
-
+
{t("Actual Resources Spent")}
-
+
{(actualResourcesSpent ?? 0).toFixed(2)} {t("Manhours")} ({(actualResourcesSpent/plannedResources*100).toFixed(2)}%)
-
+
{t("Remaining Resources")}
-
+
{(remainingResources ?? 0).toFixed(2)} {t("Manhours")} ({(remainingResources/plannedResources*100).toFixed(2)}%)
@@ -748,19 +753,19 @@ const columns2 = [ {t("Stage")} - {t("Task Count")} - {t("Planned")} - {t("Actual")} - {t("Planned")} - {t("Actual")} - {t("Planned")} - {t("Actual")} - {t("Planned")} - {t("Actual")} - {t("Planned")} - {t("Actual")} - {t("Planned")} - {t("Actual")} + {t("Task Count")} + {t("Planned")} + {t("Actual")} + {t("Planned")} + {t("Actual")} + {t("Planned")} + {t("Actual")} + {t("Planned")} + {t("Actual")} + {t("Planned")} + {t("Actual")} + {t("Planned")} + {t("Actual")}