|
- "use client";
-
- import {
- FinancialSummaryByProject,
- FinancialSummaryByClient,
- FinancialByProject,
- } from "@/app/api/financialsummary";
- import SearchBox, { Criterion } from "../SearchBox";
- import { useEffect, useMemo, useState } from "react";
- import CustomDatagrid from "../CustomDatagrid";
- import { useTranslation } from "react-i18next";
- import { useRouter } from "next/navigation";
- import { Box, Grid } from "@mui/material";
- import { SumOfByClient } from "./gptFn";
- // import { summarizeFinancialData } from "./gptFn";
-
- interface Props {
- financialSummByProject: FinancialByProject[];
- financialSummByClient: SumOfByClient[];
- }
- type SearchQuery = Partial<Omit<FinancialSummaryByProject, "id">>;
- type SearchParamNames = keyof SearchQuery;
-
- type SearchQuery2 = Partial<Omit<SumOfByClient, "id">>;
- type SearchParamNames2 = keyof SearchQuery2;
-
- const FinancialStatusByProject: React.FC<Props> = ({
- financialSummByProject,
- financialSummByClient
- }) => {
- console.log(financialSummByProject);
- // console.log(financialSummByClient);
- const { t } = useTranslation("dashboard");
- const router = useRouter();
- const [filteredByProjectRows, setFilteredByProjectRows] = useState(financialSummByProject);
- const [filteredByClientRows, setFilteredByClientRows] = useState(financialSummByClient);
- console.log(filteredByProjectRows);
- console.log(filteredByClientRows);
-
- // const testing = useMemo(() => summarizeFinancialData(filteredByProjectRows), [])
- const greenColor = "text-lime-500";
- const redColor = "text-red-500";
- const searchCriteria: Criterion<SearchParamNames>[] = useMemo(
- () => [
- { label: t("Project Code"), paramName: "projectCode", type: "text" },
- { label: t("Project Name"), paramName: "projectName", type: "text" },
- ],
- [t],
- );
-
- const searchCriteria2: Criterion<SearchParamNames2>[] = useMemo(
- () => [
- { label: t("Client Code"), paramName: "customerCode", type: "text" },
- { label: t("Client Name"), paramName: "customerName", type: "text" },
- ],
- [t],
- );
-
- useEffect(() => {
- setFilteredByProjectRows(financialSummByProject);
- setFilteredByClientRows(financialSummByClient)
- }, [financialSummByProject, financialSummByClient]);
-
- const columns1 = [
- {
- id: "projectCode",
- field: "projectCode",
- headerName: t("Project Code"),
- minWidth: 50,
- renderCell: (params: any) => (
- <div
- className="text-blue-600 hover:underline cursor-pointer"
- onClick={() => {
- router.push(
- `/dashboard/ProjectCashFlow?projectId=${params.row.id}`
- );
- }}
- >
- {params.value}
- </div>
- ),
- },
- {
- id: "projectName",
- field: "projectName",
- headerName: t("Project Name"),
- minWidth: 50,
- },
- {
- id: "customerName",
- field: "customerName",
- headerName: t("Client Name"),
- minWidth: 50,
- },
- {
- id: "subsidiaryName",
- field: "subsidiaryName",
- headerName: t("Subsidiary"),
- minWidth: 50,
- },
- {
- id: "cashFlowStatus",
- field: "cashFlowStatus",
- headerName: t("Cash Flow Status"),
- minWidth: 80,
- renderCell: (params: any) => {
- if (params.row.invoicedAmount >= params.row.cumulativeExpenditure) {
- return <span className={greenColor}>{t("Positive")}</span>;
- } else {
- return <span className={redColor}>{t("Negative")}</span>;
- }
- },
- },
- {
- id: "cpi",
- field: "cpi",
- headerName: "CPI",
- minWidth: 50,
- renderCell: (params: any) => {
- var cpi = params.invoicedAmount/(params.projectExpense + params.invoicedAmount) || 0
- return (
- <span className={cpi >= 1 ? greenColor : redColor}>
- {cpi.toLocaleString(undefined, {
- minimumFractionDigits: 2,
- maximumFractionDigits: 2,
- })}
- </span>
- );
- },
- },
- {
- id: "projectedCashFlowStatus",
- field: "projectedCashFlowStatus",
- headerName: t("Projected Cash Flow Status"),
- minWidth: 100,
- renderCell: (params: any) => {
- var cumulativeExpenditure = params.row.projectExpense + params.row.invoicedAmount
- if (params.row.totalFee >= cumulativeExpenditure) {
- return <span className={greenColor}>{t("Positive")}</span>;
- } else {
- return <span className={redColor}>{t("Negative")}</span>;
- }
- },
- },
- {
- id: "projectedCpi",
- field: "projectedCpi",
- headerName: t("Projected CPI"),
- minWidth: 50,
- renderCell: (params: any) => {
- var projectedCpi = params.row.totalFee/(params.row.projectExpense + params.row.invoicedAmount)
- return (
- <span
- className={projectedCpi >= 1 ? greenColor : redColor}
- >
- {projectedCpi.toLocaleString(undefined, {
- minimumFractionDigits: 2,
- maximumFractionDigits: 2,
- })}
- </span>
- );
- },
- },
- {
- id: "totalFee",
- field: "totalFee",
- headerName: t("Total Fees") + t("HKD"),
- type: "number",
- minWidth: 50,
- renderCell: (params: any) => {
- return (
- <span>
- $
- {params.row.totalFee.toLocaleString(undefined, {
- minimumFractionDigits: 2,
- maximumFractionDigits: 2,
- })}
- </span>
- );
- },
- },
- {
- id: "totalBudget",
- field: "totalBudget",
- headerName: t("Total Budget") + t("HKD"),
- minWidth: 50,
- type: "number",
- renderCell: (params: any) => {
- return (
- <span>
- $
- {params.row.totalBudget.toLocaleString(undefined, {
- minimumFractionDigits: 2,
- maximumFractionDigits: 2,
- })}
- </span>
- );
- },
- },
- {
- id: "cumulativeExpenditure",
- field: "cumulativeExpenditure",
- headerName: t("Total Cumulative Expenditure") + t("HKD"),
- minWidth: 250,
- type: "number",
- renderCell: (params: any) => {
- var cumulativeExpenditure = params.row.projectExpense + params.row.invoicedAmount
- return (
- <span>
- $
- {cumulativeExpenditure.toLocaleString(undefined, {
- minimumFractionDigits: 2,
- maximumFractionDigits: 2,
- })}
- </span>
- );
- },
- },
- {
- id: "manhourExpense",
- field: "manhourExpense",
- headerName: t("Manpower Expenses") + t("HKD"),
- minWidth: 280,
- type: "number",
- renderCell: (params: any) => {
- return (
- <span>
- $
- {params.row.manhourExpense.toLocaleString(undefined, {
- minimumFractionDigits: 2,
- maximumFractionDigits: 2,
- })}
- </span>
- );
- },
- },
- {
- id: "projectExpense",
- field: "projectExpense",
- headerName: t("Project Expense") + t("HKD"),
- minWidth: 280,
- type: "number",
- renderCell: (params: any) => {
- return (
- <span>
- $
- {(params.row.projectExpense ?? 0).toLocaleString(undefined, {
- minimumFractionDigits: 2,
- maximumFractionDigits: 2,
- })}
- </span>
- );
- },
- },
- {
- id: "invoicedAmount",
- field: "invoicedAmount",
- headerName: t("Total Invoiced Amount") + t("HKD"),
- minWidth: 250,
- type: "number",
- renderCell: (params: any) => {
- return (
- <span>
- $
- {params.row.invoicedAmount.toLocaleString(undefined, {
- minimumFractionDigits: 2,
- maximumFractionDigits: 2,
- })}
- </span>
- );
- },
- },
- {
- id: "nonInvoicedAmount",
- field: "nonInvoicedAmount",
- headerName: t("Total Un-Invoiced Amount") + t("HKD"),
- minWidth: 250,
- type: "number",
- renderCell: (params: any) => {
- var nonInvoiced = params.row.totalFee - params.row.invoicedAmount
- return (
- <span>
- $
- {nonInvoiced.toLocaleString(undefined, {
- minimumFractionDigits: 2,
- maximumFractionDigits: 2,
- })}
- </span>
- );
- },
- },
- {
- id: "paidAmount",
- field: "paidAmount",
- headerName: t("Total Received Amount") + t("HKD"),
- minWidth: 250,
- type: "number",
- renderCell: (params: any) => {
- return (
- <span>
- $
- {params.row.paidAmount.toLocaleString(undefined, {
- minimumFractionDigits: 2,
- maximumFractionDigits: 2,
- })}
- </span>
- );
- },
- },
- ];
-
- const columns2 = [
- {
- id: "customerCode",
- field: "customerCode",
- headerName: t("Client Code"),
- minWidth: 50,
- renderCell: (params: any) => (
- <div
- className="text-blue-600 hover:underline cursor-pointer"
- onClick={() => {
- router.push(
- `/dashboard/ProjectStatusByClient?customerId=${params.row.id}`
- );
- }}
- >
- {params.value}
- </div>
- ),
- },
- {
- id: "customerName",
- field: "customerName",
- headerName: t("Client Name"),
- minWidth: 80,
- },
- {
- id: "sumOfProjects",
- field: "sumOfProjects",
- headerName: t("Total Project Involved"),
- minWidth: 80,
- },
- {
- id: "cashFlowStatus",
- field: "cashFlowStatus",
- headerName: t("Cash Flow Status"),
- minWidth: 100,
- renderCell: (params: any) => {
- var cumulativeExpenditure = params.row.projectExpense + params.row.invoicedAmount
- return params.row.invoicedAmount >= cumulativeExpenditure ?
- <span className={greenColor}>{t("Positive")}</span>
- : <span className={redColor}>{t("Negative")}</span>
- },
- },
- {
- id: "cpi",
- field: "cpi",
- headerName: t("CPI"),
- minWidth: 50,
- renderCell: (params: any) => {
- var cumulativeExpenditure = params.row.projectExpense + params.row.invoicedAmount
- var cpi = cumulativeExpenditure != 0 ? params.row.invoicedAmount/cumulativeExpenditure : 0
- var cpiString = cpi.toLocaleString(undefined, {
- minimumFractionDigits: 2,
- maximumFractionDigits: 2,
- })
- return (cpi >= 1) ?
- <span className={greenColor}>{cpiString}</span>:
- <span className={redColor}>{cpiString}</span>
- },
- },
- {
- id: "projectedCashFlowStatus",
- field: "projectedCashFlowStatus",
- headerName: t("Projected Cash Flow Status"),
- minWidth: 100,
- renderCell: (params: any) => {
- var cumulativeExpenditure = params.row.projectExpense + params.row.invoicedAmount
- var status = params.row.invoiceAmount >= cumulativeExpenditure
- return status ?
- <span className={greenColor}>{t("Positive")}</span>
- : <span className={redColor}>{t("Negative")}</span>
- },
- },
- {
- id: "projectedCpi",
- field: "projectedCpi",
- headerName: t("Projected CPI"),
- minWidth: 50,
- renderCell: (params: any) => {
- var cumulativeExpenditure = params.row.projectExpense + params.row.invoicedAmount
- var projectCpi = cumulativeExpenditure != 0 ? params.row.totalFee/cumulativeExpenditure : 0
- var projectCpiString = projectCpi.toLocaleString(undefined, {
- minimumFractionDigits: 2,
- maximumFractionDigits: 2,
- })
- if (projectCpi >= 1) {
- return <span className={greenColor}>{projectCpiString}</span>;
- } else {
- return <span className={redColor}>{projectCpiString}</span>;
- }
- },
- },
- {
- id: "totalFee",
- field: "totalFee",
- headerName: t("Total Fees") + t("HKD"),
- minWidth: 50,
- type: "number",
- renderCell: (params: any) => {
- return (
- <span>
- $
- {params.row.totalFee.toLocaleString(undefined, {
- minimumFractionDigits: 2,
- maximumFractionDigits: 2,
- })}
- </span>
- );
- },
- },
- {
- id: "totalBudget",
- field: "totalBudget",
- headerName: t("Total Budget") + t("HKD"),
- minWidth: 50,
- type: "number",
- renderCell: (params: any) => {
- return (
- <span>
- $
- {params.row.totalBudget.toLocaleString(undefined, {
- minimumFractionDigits: 2,
- maximumFractionDigits: 2,
- })}
- </span>
- );
- },
- },
- {
- id: "cumulativeExpenditure",
- field: "cumulativeExpenditure",
- headerName: t("Total Cumulative Expenditure") + t("HKD"),
- minWidth: 280,
- type: "number",
- renderCell: (params: any) => {
- var cumulativeExpenditure = params.row.projectExpense + params.row.invoicedAmount
- return (
- <span>
- $
- {cumulativeExpenditure.toLocaleString(undefined, {
- minimumFractionDigits: 2,
- maximumFractionDigits: 2,
- })}
- </span>
- );
- },
- },
- {
- id: "manhourExpense",
- field: "manhourExpense",
- headerName: t("Manpower Expenses") + t("HKD"),
- minWidth: 280,
- type: "number",
- renderCell: (params: any) => {
- return (
- <span>
- $
- {params.row.manhourExpense.toLocaleString(undefined, {
- minimumFractionDigits: 2,
- maximumFractionDigits: 2,
- })}
- </span>
- );
- },
- },
- {
- id: "projectExpense",
- field: "projectExpense",
- headerName: t("Project Expense") + t("HKD"),
- minWidth: 280,
- type: "number",
- renderCell: (params: any) => {
- return (
- <span>
- $
- {(params.row.projectExpense ?? 0).toLocaleString(undefined, {
- minimumFractionDigits: 2,
- maximumFractionDigits: 2,
- })}
- </span>
- );
- },
- },
- {
- id: "invoicedAmount",
- field: "invoicedAmount",
- headerName: t("Total Invoiced Amount") + t("HKD"),
- minWidth: 250,
- type: "number",
- renderCell: (params: any) => {
- return (
- <span>
- $
- {params.row.invoicedAmount.toLocaleString(undefined, {
- minimumFractionDigits: 2,
- maximumFractionDigits: 2,
- })}
- </span>
- );
- },
- },
- {
- id: "nonInvoicedAmount",
- field: "nonInvoicedAmount",
- headerName: t("Total Un-Invoiced Amount") + t("HKD"),
- minWidth: 250,
- type: "number",
- renderCell: (params: any) => {
- var uninvoiced = params.row.totalFee - params.row.invoicedAmount
- return (
- <span>
- $
- {uninvoiced.toLocaleString(undefined, {
- minimumFractionDigits: 2,
- maximumFractionDigits: 2,
- })}
- </span>
- );
- },
- },
- {
- id: "paidAmount",
- field: "paidAmount",
- headerName: t("Total Received Amount") + t("HKD"),
- minWidth: 250,
- type: "number",
- renderCell: (params: any) => {
- return (
- <span>
- $
- {params.row.paidAmount.toLocaleString(undefined, {
- minimumFractionDigits: 2,
- maximumFractionDigits: 2,
- })}
- </span>
- );
- },
- },
- ];
-
- return (
- <>
- <Box sx={{ mt: 3 }}>
- <SearchBox
- criteria={searchCriteria}
- onSearch={(query) => {
- setFilteredByProjectRows(
- filteredByProjectRows.filter(
- (cp:any) =>
- cp.projectCode.toLowerCase().includes(query.projectCode.toLowerCase()) &&
- cp.projectName.toLowerCase().includes(query.projectName.toLowerCase())
- ),
- );
- }}
- />
- <div style={{ display: "inline-block", width: "99%", marginLeft: 10 }}>
- <CustomDatagrid
- rows={filteredByProjectRows}
- columns={columns1}
- columnWidth={200}
- dataGridHeight={300}
- />
- </div>
- {/* <SearchResults<StaffResult> items={filteredStaff} columns={columns} /> */}
- </Box>
- <Box sx={{ mt: 3 }}>
- <SearchBox
- criteria={searchCriteria2}
- onSearch={(query) => {
- setFilteredByClientRows(
- filteredByClientRows.filter(
- (cp:any) =>
- cp.customerCode.toLowerCase().includes(query.customerCode.toLowerCase()) &&
- cp.customerName.toLowerCase().includes(query.customerName.toLowerCase())
- ),
- );
- }}
- />
- <div style={{ display: "inline-block", width: "99%", marginLeft: 10 }}>
- <CustomDatagrid
- rows={filteredByClientRows}
- columns={columns2}
- columnWidth={200}
- dataGridHeight={300}
- />
- </div>
- </Box>
- </>
- );
- };
- export default FinancialStatusByProject;
|