"use client"; 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 { 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 { ClientSubsidiaryProjectResult } from "@/app/api/clientprojects/actions"; import { ClientProjectResult} from "@/app/api/clientprojects"; import { ConstructionOutlined } from "@mui/icons-material"; import ReactApexChart from "react-apexcharts"; import { ApexOptions } from "apexcharts"; import { useSearchParams } from 'next/navigation'; import { fetchAllClientSubsidiaryProjects} from "@/app/api/clientprojects/actions"; // const ReactApexChart = dynamic(() => import('react-apexcharts'), { ssr: false }); interface Props { // clientSubsidiaryProjectResult: ClientSubsidiaryProjectResult[]; } const ProgressByClient: React.FC = () => { const searchParams = useSearchParams(); const customerId = searchParams.get('customerId'); const subsidiaryId = searchParams.get('subsidiaryId'); const [activeTab, setActiveTab] = useState("financialSummary"); const [SearchCriteria, setSearchCriteria] = React.useState({}); const { t } = useTranslation("dashboard"); const [clientCode, setClientCode] = useState(""); const [clientName, setClientName] = useState(""); const [subsidiaryClientCode, setSubsidiaryClientCode] = useState(""); const [subsidiaryClientName, setSubsidiaryClientName] = useState(""); const [projectArray, setProjectArray]: any[] = useState([]); const [percentageArray, setPercentageArray]: any[] = useState([]); const [colorArray, setColorArray]: any[] = useState([]); const [selectionModel, setSelectionModel]: any[] = React.useState([]); const [pieChartColor, setPieChartColor]: any[] = React.useState([]); const [totalSpentPercentage, setTotalSpentPercentage]: any = React.useState(); const [projectBudgetManhour, setProjectBudgetManhour]: any = React.useState("-"); const [actualManhourSpent, setActualManhourSpent]: any = React.useState("-"); const [remainedManhour, setRemainedManhour]: any = React.useState("-"); const [lastUpdate, setLastUpdate]: any = React.useState("-"); const [dropdownDemo, setDropdownDemo] = useState(""); const [dateDemo, setDateDemo] = useState(null); const [checkboxDemo, setCheckboxDemo] = useState(false); const [receiptFromDate, setReceiptFromDate] = useState(null); const [receiptToDate, setReceiptToDate] = useState(null); const [selectedRows, setSelectedRows]:any[] = useState([]); const [chartProjectName, setChartProjectName]:any[] = useState([]); const [chartManhourConsumptionPercentage, setChartManhourConsumptionPercentage]:any[] = useState([]); const color = ["#f57f90", "#94f7d6", "#87c5f5", "#ab95f5", "#fcd68b"]; const [clientSubsidiaryProjectResult, setClientSubsidiaryProjectResult]:any[] = useState([]); const fetchData = async () => { if (customerId && subsidiaryId) { try { if (subsidiaryId === '-'){ console.log("ss") const clickResult = await fetchAllClientSubsidiaryProjects( Number(customerId),Number(0)) console.log(clickResult) setClientSubsidiaryProjectResult(clickResult); } else { const clickResult = await fetchAllClientSubsidiaryProjects( Number(customerId), Number(subsidiaryId)) console.log(clickResult) setClientSubsidiaryProjectResult(clickResult); } } catch (error) { console.error('Error fetching client subsidiary projects:', error); } } } useEffect(() => { const projectName = [] const manhourConsumptionPercentage = [] for (let i = 0; i < clientSubsidiaryProjectResult.length; i++){ clientSubsidiaryProjectResult[i].color = color[i] projectName.push(clientSubsidiaryProjectResult[i].projectName) manhourConsumptionPercentage.push(clientSubsidiaryProjectResult[i].manhourConsumptionPercentage) } setChartProjectName(projectName) setChartManhourConsumptionPercentage(manhourConsumptionPercentage) }, [clientSubsidiaryProjectResult]); useEffect(() => { fetchData() }, [customerId,subsidiaryId]); const rows2 = [ { id: 1, project: "Consultancy Project 123", team: "XXX", teamLeader: "XXX", currentStage: "Contract Documentation", budgetedManhour: "200.00", spentManhour: "120.00", remainedManhour: "80.00", comingPaymentMilestone: "31/03/2024", alert: false, color: "#f57f90", }, { id: 2, project: "Consultancy Project 456", team: "XXX", teamLeader: "XXX", currentStage: "Report Preparation", budgetedManhour: "400.00", spentManhour: "200.00", remainedManhour: "200.00", comingPaymentMilestone: "20/02/2024", alert: false, color: "#94f7d6", }, { id: 3, project: "Construction Project A", team: "YYY", teamLeader: "YYY", currentStage: "Construction", budgetedManhour: "187.50", spentManhour: "200.00", remainedManhour: "12.50", comingPaymentMilestone: "13/12/2023", alert: true, color: "#87c5f5", }, { id: 4, project: "Construction Project B", team: "XXX", teamLeader: "XXX", currentStage: "Post Construction", budgetedManhour: "100.00", spentManhour: "40.00", remainedManhour: "60.00", comingPaymentMilestone: "05/01/2024", alert: false, color: "#ab95f5", }, { id: 5, project: "Construction Project C", team: "YYY", teamLeader: "YYY", currentStage: "Construction", budgetedManhour: "300.00", spentManhour: "150.00", remainedManhour: "150.00", comingPaymentMilestone: "31/03/2024", alert: false, color: "#fcd68b", }, ]; const columns2 = [ { id: "color", field: "color", headerName: "", renderCell: (param: any) => { return ( ); }, flex:0.1 }, { id: "projectName", field: "projectName", headerName: "Project", minWidth:300 }, { id: "team", field: "team", headerName: "Team", minWidth: 50 }, { id: "teamLead", field: "teamLead", headerName: "Team Leader", minWidth: 70 }, { id: "expectedStage", field: "expectedStage", headerName: "Expected Stage", minWidth: 300 }, { id: "budgetedManhour", field: "budgetedManhour", headerName: "Budgeted Manhour", minWidth: 70 }, { id: "spentManhour", field: "spentManhour", headerName: "Spent Manhour", renderCell: (params: any) => { if (params.row.budgetedManhour - params.row.spentManhour <= 0) { return ( {params.row.spentManhour} ); } else { console.log(params) return {params.row.spentManhour}; } }, minWidth: 70 }, { id: "remainedManhour", field: "remainedManhour", headerName: "Remained Manhour", renderCell: (params: any) => { if (params.row.budgetedManhour - params.row.spentManhour <= 0) { return ( ({params.row.remainedManhour}) ); } else { return {params.row.remainedManhour}; } }, minWidth: 70 }, { id: "comingPaymentMilestone", field: "comingPaymentMilestone", headerName: "Coming Payment Milestone", minWidth: 100 }, { id: "alert", field: "alert", headerName: "Alert", renderCell: (params: any) => { if (params.row.alert === true) { return ( ); } else { return ; } }, flex:0.1 }, ]; const optionstest: ApexOptions = { chart: { height: 350, type: "line", }, stroke: { width: [0, 0, 2, 2], }, plotOptions: { bar: { horizontal: false, distributed: false, }, }, dataLabels: { enabled: false, }, xaxis: { categories: [ "Q1", "Q2", "Q3", "Q4", "Q5", "Q6", "Q7", "Q8", "Q9", "Q10", "Q11", "Q12", ], }, yaxis: [ { title: { text: "Monthly Income and Expenditure(HKD)", }, min: 0, max: 350000, tickAmount: 5, labels: { formatter: function (val) { return val.toLocaleString() } } }, { show: false, seriesName: "Monthly_Expenditure", title: { text: "Monthly Expenditure (HKD)", }, min: 0, max: 350000, tickAmount: 5, }, { seriesName: "Cumulative_Income", opposite: true, title: { text: "Cumulative Income and Expenditure(HKD)", }, min: 0, max: 850000, tickAmount: 5, labels: { formatter: function (val) { return val.toLocaleString() } } }, { show: false, seriesName: "Cumulative_Expenditure", opposite: true, title: { text: "Cumulative Expenditure (HKD)", }, min: 0, max: 850000, tickAmount: 5, }, ], grid: { borderColor: "#f1f1f1", }, annotations: {}, series: [ { name: "Monthly_Income", type: "column", color: "#ffde91", data: [0, 110000, 0, 0, 185000, 0, 0, 189000, 0, 0, 300000, 0], }, { name: "Monthly_Expenditure", type: "column", color: "#82b59a", data: [ 0, 160000, 120000, 120000, 55000, 55000, 55000, 55000, 55000, 70000, 55000, 55000, ], }, { name: "Cumulative_Income", type: "line", color: "#EE6D7A", data: [ 0, 100000, 100000, 100000, 300000, 300000, 300000, 500000, 500000, 500000, 800000, 800000, ], }, { name: "Cumulative_Expenditure", type: "line", color: "#7cd3f2", data: [ 0, 198000, 240000, 400000, 410000, 430000, 510000, 580000, 600000, 710000, 730000, 790000, ], }, ], }; const options2: ApexOptions = { chart: { type: "donut", }, colors: colorArray, plotOptions: { pie: { donut: { labels: { show: true, name: { show: true, }, value: { show: true, fontWeight: 500, fontSize: "30px", color: "#3e98c7", }, total: { show: true, showAlways: true, label: "Spent", fontFamily: "sans-serif", formatter: function (val) { return totalSpentPercentage + "%"; }, }, }, }, }, }, labels: projectArray, legend: { show: false, }, responsive: [ { breakpoint: 480, options: { chart: { width: 200, }, legend: { position: "bottom", show: false, }, }, }, ], }; const options: ApexOptions = { chart: { type: "bar", height: 350, }, series: [{ name: "Project Resource Consumption Percentage", data: chartManhourConsumptionPercentage, },], colors: ["#f57f90", "#94f7d6", "#87c5f5", "#ab95f5", "#fcd68b"], plotOptions: { bar: { horizontal: true, distributed: true, }, }, dataLabels: { enabled: false, }, xaxis: { categories: chartProjectName, }, yaxis: { title: { text: "Projects", }, labels: { maxWidth: 200, style: { cssClass: "apexcharts-yaxis-label", }, }, }, title: { text: "Project Resource Consumption Percentage", align: "center", }, grid: { borderColor: "#f1f1f1", }, annotations: {}, }; const handleSelectionChange = (newSelectionModel: GridRowSelectionModel) => { const selectedRowsData:any = clientSubsidiaryProjectResult.filter((row:any) => newSelectionModel.includes(row.projectId), ); console.log(selectedRowsData); const projectArray = []; const pieChartColorArray = []; let totalSpent = 0; let totalBudgetManhour = 0; const percentageArray = []; for (let i = 0; i <= selectedRowsData.length; i++) { if (i === selectedRowsData.length && i > 0) { projectArray.push("Remained"); } else if (selectedRowsData.length > 0) { projectArray.push(selectedRowsData[i].projectName); totalBudgetManhour += Number(selectedRowsData[i].budgetedManhour); totalSpent += Number(selectedRowsData[i].spentManhour); pieChartColorArray.push(color[i]); } } for (let i = 0; i <= selectedRowsData.length; i++) { if (i === selectedRowsData.length && i > 0) { const remainedManhour = totalBudgetManhour - totalSpent; percentageArray.push( Number(((remainedManhour / totalBudgetManhour) * 100).toFixed(1)), ); } else if (selectedRowsData.length > 0) { const percentage = ( (Number(selectedRowsData[i].spentManhour) / totalBudgetManhour) * 100 ).toFixed(1); percentageArray.push(Number(percentage)); } } setProjectBudgetManhour(totalBudgetManhour.toFixed(2)); setActualManhourSpent(totalSpent.toFixed(2)); setRemainedManhour((totalBudgetManhour - totalSpent).toFixed(2)); setLastUpdate(new Date().toLocaleDateString("en-GB")); setSelectionModel(newSelectionModel); console.log(projectArray); setProjectArray(projectArray); setPercentageArray(percentageArray); console.log(percentageArray); setTotalSpentPercentage( ((totalSpent / totalBudgetManhour) * 100).toFixed(1), ); if (projectArray.length > 0 && projectArray.includes("Remained")) { const nonLastRecordColors = pieChartColorArray; setColorArray([ ...nonLastRecordColors.slice(0, projectArray.length - 1), "#a3a3a3", ]); } else { setColorArray(pieChartColorArray); } }; const applySearch = (data: any) => { console.log(data); setSearchCriteria(data); }; return ( {/* */} {/* */}
{/*

Stage Deadline

{stageDeadline.map((date, index) => { const marginTop = index === 0 ? 25 : 20; return (

{date}

); })}
*/}
{percentageArray.length === 0 && (
Please select the project you want to check.
)} {percentageArray.length > 0 && ( )}
Project Budget Manhour
{projectBudgetManhour}

Actual Manhour Spent
{actualManhourSpent}

Remained Manhour
{remainedManhour}

Last Update
{lastUpdate}
); }; export default ProgressByClient;