"use client"; import { FinancialByProject, fetchFinancialSummaryByProjectV2 } from '@/app/api/financialsummary'; import { Box, Card, CardContent, CardHeader, FormControl, InputLabel, MenuItem, Select, Stack } from '@mui/material'; import { useCallback, useEffect, useMemo, useState } from 'react'; import { useTranslation } from "react-i18next"; import ProjectFinancialCard from '../ProjectFinancialSummary/ProjectFinancialCard'; import dayjs from 'dayjs'; import { INPUT_DATE_FORMAT } from '@/app/utils/formatUtil'; import { SumOfByClient, SumOfByTeam, sumUpByClient, sumUpByTeam } from './gptFn'; import FinancialStatusByProject from './FinnancialStatusByProject'; interface Props { _teamId: number, financialSummByProject: FinancialByProject[] } type InputDate = { startDate: string; endDate: string; } type DateParams = { 0: InputDate; 2: InputDate; 3: InputDate; 4: InputDate; 5: InputDate; } const FinancialSummaryPage: React.FC = ({ _teamId, financialSummByProject }) => { console.log(financialSummByProject) const { t } = useTranslation(); const curr = useMemo(() => dayjs().format(INPUT_DATE_FORMAT), []) const currYear = useMemo(() => dayjs().get("year"), []) const startDate = "10-01" const endDate = "09-30" const currFinancialYear = useMemo(() => curr > `${currYear}-${startDate}` ? currYear + 1 : currYear, [currYear]) const [mainData, setMainData] = useState(financialSummByProject) const [byTeam, setByTeam] = useState(() => sumUpByTeam(mainData)) // do fetch to set const [byProject, setByProject] = useState(financialSummByProject) const [byClient, setByClient] = useState(() => sumUpByClient(mainData)) const [isLoading, setIsLoading] = useState(false) const allTeam = useMemo(()=> { var _allTeam: SumOfByTeam = { id: 0, team: "All Team", totalFee: 0, totalBudget: 0, manhourExpense: 0, projectExpense: 0, invoicedAmount: 0, paidAmount: 0, activeProject: 0, } for (let i = 0; i < byTeam.length; i++) { var curr = byTeam[i] _allTeam["totalFee"] += curr.totalFee _allTeam["totalBudget"] += curr.totalBudget _allTeam["manhourExpense"] += curr.manhourExpense _allTeam["projectExpense"] += curr.projectExpense _allTeam["invoicedAmount"] += curr.invoicedAmount _allTeam["paidAmount"] += curr.paidAmount _allTeam["activeProject"] += curr.activeProject } return _allTeam }, [mainData]) console.log(allTeam) const [teamId, setTeamId] = useState(_teamId) const [isCardClickedIndex, setIsCardClickedIndex] = useState(_teamId || 0); const [period, setPeriod] = useState(0); const dateMap: DateParams = useMemo(() => ({ 0: {startDate: "", endDate: ""}, 2: {startDate: `${currFinancialYear-2}-${startDate}`, endDate: `${currFinancialYear-1}-${endDate}`}, 3: {startDate: `${currFinancialYear-3}-${startDate}`, endDate: `${currFinancialYear-2}-${endDate}`}, 4: {startDate: `${currFinancialYear-4}-${startDate}`, endDate: `${currFinancialYear-3}-${endDate}`}, 5: {startDate: "", endDate: `${currFinancialYear-4}-${endDate}`}, }), [currYear, startDate, endDate]) const fetchFinancialSummaryByProject = useCallback(async (endDate: string, startDate: string) => { setIsLoading(true) const data = await fetchFinancialSummaryByProjectV2(_teamId, endDate, startDate) setMainData(data) setByTeam(sumUpByTeam(data)) setByProject(data) setByClient(sumUpByClient(data)) setIsLoading(false) }, [setMainData, setByTeam, setByProject, setByClient]) const handleCardClick = useCallback((teamId: number) => { setIsCardClickedIndex(teamId) setTeamId(teamId) }, []); const handleFilter = useCallback((value: number) => { setPeriod(value) console.log(value) var _startDate: string = "" var _endDate = "" if (value == 1) { if (curr <= `${currYear}-${endDate}`) { _startDate = `${currYear - 1}-${startDate}` _endDate = `${currYear}-${endDate}` } else { _startDate = `${currYear}-${startDate}` _endDate = `${currFinancialYear}-${endDate}` } } else { _startDate = dateMap[value as keyof DateParams].startDate _endDate = dateMap[value as keyof DateParams].endDate } console.log(_startDate) console.log(_endDate) fetchFinancialSummaryByProject(_endDate, _startDate) }, [isCardClickedIndex]) useEffect(() => { if (teamId > 0) { var filterByTeam = mainData.filter(item => item.teamId == teamId) setByProject(filterByTeam) setByClient(sumUpByClient(filterByTeam)) } else { setByProject(financialSummByProject) setByClient(sumUpByClient(mainData)) } }, [teamId]) return ( <> {/* */} Financial Year
{_teamId == 0 && allTeam &&
handleCardClick(0)}> = (allTeam.projectExpense + allTeam.manhourExpense) ? "Positive" : "Negative"} CostPerformanceIndex={allTeam.invoicedAmount/(allTeam.projectExpense + allTeam.manhourExpense) || 0} ProjectedCashFlowStatus={allTeam.totalFee >= (allTeam.projectExpense + allTeam.manhourExpense) ? "Positive" : "Negative"} ProjectedCPI={allTeam.totalFee/(allTeam.projectExpense + allTeam.manhourExpense)} ClickedIndex={isCardClickedIndex} Index={0}/>
} {byTeam.length > 0 && byTeam.map((record) => (
handleCardClick(record.id)}> = (record.projectExpense + record.manhourExpense) ? "Positive" : "Negative"} CostPerformanceIndex={record.invoicedAmount/(record.projectExpense + record.manhourExpense) || 0} ProjectedCashFlowStatus={record.totalFee >= (record.projectExpense + record.manhourExpense) ? "Positive" : "Negative"} ProjectedCPI={record.totalFee/(record.projectExpense + record.manhourExpense)} ClickedIndex={isCardClickedIndex} Index={record.id}/>
))}
) } export default FinancialSummaryPage