|
- import * as React from "react";
- import Grid from "@mui/material/Grid";
- import { useState, useEffect, useMemo } from "react";
- import Paper from "@mui/material/Paper";
- import { TFunction } from "i18next";
- import { useTranslation } from "react-i18next";
- import { Card, CardHeader } from "@mui/material";
- import CustomSearchForm from "../CustomSearchForm/CustomSearchForm";
- import CustomDatagrid from "../CustomDatagrid/CustomDatagrid";
- import ReactApexChart from "react-apexcharts";
- import { ApexOptions } from "apexcharts";
- import { GridColDef, GridRowSelectionModel } from "@mui/x-data-grid";
- import ReportProblemIcon from "@mui/icons-material/ReportProblem";
- import dynamic from "next/dynamic";
- import "../../app/global.css";
- import { AnyARecord, AnyCnameRecord } from "dns";
- import SearchBox, { Criterion } from "../SearchBox";
- import ProgressByClientSearch from "@/components/ProgressByClientSearch";
- import { Suspense } from "react";
- import RadioButtonUncheckedIcon from '@mui/icons-material/RadioButtonUnchecked';
- import RadioButtonCheckedIcon from '@mui/icons-material/RadioButtonChecked';
- import { useRouter } from "next/navigation";
-
- interface Props {
- Title: string;
- TeamId: number;
- TotalActiveProjectNumber: number;
- TotalFees: number;
- TotalBudget: number;
- TotalCumulative: number;
- TotalInvoicedAmount: number;
- TotalUnInvoicedAmount: number;
- TotalReceivedAmount: number;
- CashFlowStatus: string;
- CostPerformanceIndex: number;
- ClickedIndex: number;
- ProjectedCPI: number;
- ProjectedCashFlowStatus: string;
- Index: number;
- }
-
- const dataBaseStyle:any = { color: "#6b87cf", textAlign: "right" }
- const dataNegativeStyle:any = { color: "#f896aa", textAlign: "right" }
- const dataPositiveStyle:any = { color: "#71d19e", textAlign: "right" }
-
- const ProjectFinancialCard: React.FC<Props> = ({
- Title,
- TeamId,
- TotalActiveProjectNumber,
- TotalFees,
- TotalBudget,
- TotalCumulative,
- TotalInvoicedAmount,
- TotalUnInvoicedAmount,
- TotalReceivedAmount,
- CashFlowStatus,
- CostPerformanceIndex,
- ClickedIndex,
- ProjectedCPI,
- ProjectedCashFlowStatus,
- Index,
- }) => {
- const router = useRouter();
- const [SearchCriteria, setSearchCriteria] = React.useState({});
- const { t } = useTranslation("dashboard");
- const handleCheckProjectStatusClick = (TeamId:number) => {
- router.push(`/dashboard/ProjectStatusByTeam?teamLeadId=${TeamId}`);
- };
- const borderColor =
- CashFlowStatus === "Negative"
- ? "border-red-300 border-solid"
- : "border-green-200 border-solid";
- const selectedBackgroundColor =
- ClickedIndex === Index ? "rgb(235 235 235)" : "rgb(255 255 255)";
- return (
- <Card
- style={{
- maxWidth: "25%",
- minWidth: "280px",
- boxShadow:
- "0 0px 10px 0 rgba(0, 0, 0, 0.08), 0 0px 10px 0 rgba(0, 0, 0, 0.08)",
- backgroundColor: selectedBackgroundColor,
- }}
- className={`${borderColor}`}
- >
- <div
- className="text-xl mt-2 font-medium inline-block"
- style={{ width: "100%", textAlign: "center", color: "#898d8d" }}
- >
- {ClickedIndex === Index ?
- <div className="w-full" style={{ overflow: 'hidden' }}>
- <div className=" float-right mt-1 mr-5 text-gray-500"><RadioButtonCheckedIcon /></div></div>
- :
- <div className="w-full" style={{ overflow: 'hidden' }}>
- <div className=" float-right mt-1 mr-5 text-gray-400"><RadioButtonUncheckedIcon /></div></div>
- }
- {Title !== t("All Team") ?
- <div className="mb-2">{Title}</div>
- :
- <div className="mb-9">{Title}</div>
- }
-
- </div>
-
- {Title !== t("All Team") ?
- <>
- <div onClick={(r) => handleCheckProjectStatusClick(TeamId)} className="bg-lime-100 mb-2 border-b-2 pt-1 pb-1 hover:bg-lime-200" style={{ width: "100%", textAlign: "center", color: "#898d8d" }}>{t("Check Project Status")}</div>
- </>
- :
- <><hr /></>
- }
- <div className="text-sm font-medium ml-5" style={{ color: "#898d8d" }}>
- {"(a) " + t("Total Active Project")}
- </div>
- <div className="text-lg font-medium mx-5" style={dataBaseStyle}>
- {TotalActiveProjectNumber.toLocaleString()}
- </div>
- <hr />
- <div className="text-sm font-medium ml-5" style={{ color: "#898d8d" }}>
- {"(b) " + t("Total Fees")}
- </div>
- <div className="text-lg font-medium mx-5" style={dataBaseStyle}>
- {TotalFees.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}
- </div>
- <hr />
- <div className="text-sm font-medium ml-5" style={{ color: "#898d8d" }}>
- {"(c) " + t("Total Budget")}
- </div>
- <div className="text-lg font-medium mx-5" style={dataBaseStyle}>
- {TotalBudget.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}
- </div>
- <div style={{ overflow: 'hidden' }}>
- <div className="text-sm font-medium ml-5 border-solid w-fit rounded-md mt-2 float-right mr-2" style={{ color: "#888d8f" }}>
- <div className="ml-2 mr-2 ">{"(c) = (b) * 80%"}</div>
- </div>
- </div>
- <hr />
- <div className="text-sm font-medium ml-5" style={{ color: "#898d8d" }}>
- {"(d) " + t("Total Cumulative Expenditure")}
- </div>
- <div className="text-lg font-medium mx-5" style={dataBaseStyle}>
- {TotalCumulative.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}
- </div>
- <hr />
- <div className="text-sm font-medium ml-5" style={{ color: "#898d8d" }}>
- {"(e) " + t("Total Invoiced Amount")}
- </div>
- <div className="text-lg font-medium mx-5" style={dataBaseStyle}>
- {TotalInvoicedAmount.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}
- </div>
- <hr />
- <div className="text-sm font-medium ml-5" style={{ color: "#898d8d" }}>
- {"(f) " + t("Total Un-Invoiced Amount")}
- </div>
- <div className="text-lg font-medium mx-5" style={dataBaseStyle}>
- {TotalUnInvoicedAmount.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}
- </div>
- <div style={{ overflow: 'hidden' }}>
- <div className="text-sm font-medium ml-5 border-solid w-fit rounded-md mt-2 float-right mr-2" style={{ color: "#888d8f" }}>
- <div className="ml-2 mr-2">{"(f) =(b) - (e)"}</div>
- </div>
- </div>
- <hr />
- <div className="text-sm font-medium ml-5" style={{ color: "#898d8d" }}>
- {"(g) " + t("Total Received Amount")}
- </div>
- <div className="text-lg font-medium mx-5" style={dataBaseStyle}>
- {TotalReceivedAmount.toLocaleString(undefined, { minimumFractionDigits: 2, maximumFractionDigits: 2 })}
- </div>
- <hr />
- <div className="text-sm font-medium ml-5" style={{ color: "#898d8d" }}>
- {"(h) " + t("Cash Flow Status")}
- </div>
- {CashFlowStatus === "Negative" && (
- <>
- <div
- className="text-lg font-medium mx-5"
- style={dataNegativeStyle}
- >
- {t(CashFlowStatus)}
- </div>
- <div style={{ overflow: 'hidden' }}>
- <div className="text-sm font-medium ml-5 border-solid w-fit rounded-md mt-2 float-right mr-2" style={{ color: "#888d8f" }}>
- <div className="ml-2 mr-2 ">{t("Positive") + ": (e) > or = (d)"}</div>
- <div className="ml-2 mr-2 ">{t("Negative") + ": (e) < (d)"}</div>
- </div>
- </div>
- <hr />
- </>
- )}
- {CashFlowStatus === "Positive" && (
- <>
- <div
- className="text-lg font-medium mx-5"
- style={dataPositiveStyle}
- >
- {t(CashFlowStatus)}
- </div>
- <div style={{ overflow: 'hidden' }}>
- <div className="text-sm font-medium ml-5 border-solid w-fit rounded-md mt-2 float-right mr-2" style={{ color: "#888d8f" }}>
- <div className="ml-2 mr-2 ">{t("Positive") + ": (e) > or = (d)"}</div>
- <div className="ml-2 mr-2 ">{t("Negative") + ": (e) < (d)"}</div>
- </div>
- </div>
- <hr />
- </>
- )}
- <div
- className="text-sm mt-2 font-medium mx-5"
- style={{ color: "#898d8d" }}
- >
- {"(i) " + t("Cost Performance Index") + " (CPI)"}
- </div>
- { Number(CostPerformanceIndex) < 1 && (
- <>
- <div
- className="text-lg font-medium mx-5 mb-2"
- style={dataNegativeStyle}
- >
- {CostPerformanceIndex}
- </div>
- <div style={{ overflow: 'hidden' }}>
- <div className="text-sm font-medium ml-5 border-solid w-fit rounded-md mt-2 float-right mr-2" style={{ color: "#888d8f" }}>
- <div className="ml-2 mr-2 ">{"(i) = (e) / (d)"}</div>
- </div>
- </div>
- <hr />
- </>
- )}
- {Number(CostPerformanceIndex) >= 1 && (
- <>
- <div
- className="text-lg font-medium mx-5 mb-2"
- style={dataPositiveStyle}
- >
- {CostPerformanceIndex}
- </div>
- <div style={{ overflow: 'hidden' }}>
- <div className="text-sm font-medium ml-5 border-solid w-fit rounded-md mt-2 float-right mr-2" style={{ color: "#888d8f" }}>
- <div className="ml-2 mr-2 ">{"(i) =(e) / (d)"}</div>
- </div>
- </div>
- <hr />
- </>
- )}
- <div className="text-sm font-medium ml-5" style={{ color: "#898d8d" }}>
- {"(j) " + t("Projected Cash Flow Status")}
- </div>
- {ProjectedCashFlowStatus === "Negative" && (
- <>
- <div
- className="text-lg font-medium mx-5"
- style={dataNegativeStyle}
- >
- {t(ProjectedCashFlowStatus)}
- </div>
- <div style={{ overflow: 'hidden' }}>
- <div className="text-sm font-medium mr-2 border-solid w-fit rounded-md mt-2 float-right" style={{ color: "#888d8f" }}>
- <div className="ml-2 mr-2 ">{t("Positive") + ": (b) > or = (d)"}</div>
- <div className="ml-2 mr-2 ">{t("Negative") + ": (b) < (d)"}</div>
- </div>
- </div>
- <hr />
- </>
- )}
- {ProjectedCashFlowStatus === "Positive" && (
- <>
- <div
- className="text-lg font-medium mx-5"
- style={dataPositiveStyle}
- >
- {t(ProjectedCashFlowStatus)}
- </div>
- <div style={{ overflow: 'hidden' }}>
- <div className="text-sm font-medium mr-2 border-solid w-fit rounded-md mt-2 float-right" style={{ color: "#888d8f" }}>
- <div className="ml-2 mr-2 ">{t("Positive") + ": (b) > or = (d)"}</div>
- <div className="ml-2 mr-2 ">{t("Negative") + ": (b) < (d)"}</div>
- </div>
- </div>
- <hr />
- </>
- )}
- <div
- className="text-sm mt-2 font-medium ml-5"
- style={{ color: "#898d8d" }}
- >
- {"(k) " + t("Projected Cost Performance Index") + " (CPI)"}
- </div>
- {Number(ProjectedCPI) < 1 && (
- <>
- <div
- className="text-lg font-medium mx-5 mb-2"
- style={dataNegativeStyle}
- >
- {ProjectedCPI}
- </div>
- <div className="text-sm font-medium ml-5 border-solid w-fit rounded-md mb-2 mr-2 float-right" style={{ color: "#888d8f" }}>
- <div className="ml-2 mr-2 ">{"(k) = (b) / (d)"}</div>
- </div>
- </>
- )}
- {Number(ProjectedCPI) >= 1 && (
- <>
- <div
- className="text-lg font-medium mx-5 mb-2"
- style={dataPositiveStyle}
- >
- {ProjectedCPI}
- </div>
- <div className="text-sm font-medium ml-5 border-solid w-fit rounded-md mb-2 mr-2 float-right" style={{ color: "#888d8f" }}>
- <div className="ml-2 mr-2 ">{"(k) = (b) / (d)"}</div>
- </div>
- </>
- )}
- </Card>
- );
- };
-
- export default ProjectFinancialCard;
|