|
@@ -1,8 +1,6 @@ |
|
|
"use client"; |
|
|
"use client"; |
|
|
import { fetchFinancialSummary, fetchFinancialSummaryByProject, FinancialSummaryByProject, FinancialSummaryType, FinancialSummaryByClient, FinancialByProject, fetchFinancialSummaryByProjectV2 } from '@/app/api/financialsummary'; |
|
|
|
|
|
import { Box, Card, CardContent, CardHeader, FormControl, InputLabel, Link, MenuItem, Select, Stack } from '@mui/material'; |
|
|
|
|
|
import { usePathname, useSearchParams } from 'next/navigation'; |
|
|
|
|
|
import { useRouter } from 'next/navigation'; |
|
|
|
|
|
|
|
|
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 { useCallback, useEffect, useMemo, useState } from 'react'; |
|
|
import { useTranslation } from "react-i18next"; |
|
|
import { useTranslation } from "react-i18next"; |
|
|
import ProjectFinancialCard from '../ProjectFinancialSummary/ProjectFinancialCard'; |
|
|
import ProjectFinancialCard from '../ProjectFinancialSummary/ProjectFinancialCard'; |
|
@@ -12,7 +10,6 @@ import { SumOfByClient, SumOfByTeam, sumUpByClient, sumUpByTeam } from './gptFn' |
|
|
import FinancialStatusByProject from './FinnancialStatusByProject'; |
|
|
import FinancialStatusByProject from './FinnancialStatusByProject'; |
|
|
|
|
|
|
|
|
interface Props { |
|
|
interface Props { |
|
|
// _financialSumm: FinancialSummaryType[], |
|
|
|
|
|
_teamId: number, |
|
|
_teamId: number, |
|
|
financialSummByProject: FinancialByProject[] |
|
|
financialSummByProject: FinancialByProject[] |
|
|
} |
|
|
} |
|
@@ -23,6 +20,7 @@ interface Props { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
type DateParams = { |
|
|
type DateParams = { |
|
|
|
|
|
0: InputDate; |
|
|
2: InputDate; |
|
|
2: InputDate; |
|
|
3: InputDate; |
|
|
3: InputDate; |
|
|
4: InputDate; |
|
|
4: InputDate; |
|
@@ -32,16 +30,18 @@ const FinancialSummaryPage: React.FC<Props> = ({ |
|
|
_teamId, |
|
|
_teamId, |
|
|
financialSummByProject |
|
|
financialSummByProject |
|
|
}) => { |
|
|
}) => { |
|
|
|
|
|
console.log(financialSummByProject) |
|
|
const { t } = useTranslation(); |
|
|
const { t } = useTranslation(); |
|
|
const curr = useMemo(() => dayjs().format(INPUT_DATE_FORMAT), []) |
|
|
const curr = useMemo(() => dayjs().format(INPUT_DATE_FORMAT), []) |
|
|
const currYear = useMemo(() => dayjs().get("year"), []) |
|
|
const currYear = useMemo(() => dayjs().get("year"), []) |
|
|
const startDate = useMemo(() => "10-01", []) |
|
|
|
|
|
const endDate = useMemo(() => "09-30", []) |
|
|
|
|
|
|
|
|
const startDate = "10-01" |
|
|
|
|
|
const endDate = "09-30" |
|
|
const currFinancialYear = useMemo(() => curr > `${currYear}-${startDate}` ? currYear + 1 : currYear, [currYear]) |
|
|
const currFinancialYear = useMemo(() => curr > `${currYear}-${startDate}` ? currYear + 1 : currYear, [currYear]) |
|
|
const [mainData, setMainData] = useState<FinancialByProject[]>(financialSummByProject) |
|
|
const [mainData, setMainData] = useState<FinancialByProject[]>(financialSummByProject) |
|
|
const [byTeam, setByTeam] = useState<SumOfByTeam[]>(() => sumUpByTeam(mainData)) // do fetch to set |
|
|
const [byTeam, setByTeam] = useState<SumOfByTeam[]>(() => sumUpByTeam(mainData)) // do fetch to set |
|
|
const [byProject, setByProject] = useState<FinancialByProject[]>(financialSummByProject) |
|
|
const [byProject, setByProject] = useState<FinancialByProject[]>(financialSummByProject) |
|
|
const [byClient, setByClient] = useState<SumOfByClient[]>(() => sumUpByClient(mainData)) |
|
|
const [byClient, setByClient] = useState<SumOfByClient[]>(() => sumUpByClient(mainData)) |
|
|
|
|
|
const [isLoading, setIsLoading] = useState(false) |
|
|
const allTeam = useMemo(()=> { |
|
|
const allTeam = useMemo(()=> { |
|
|
var _allTeam: SumOfByTeam = { |
|
|
var _allTeam: SumOfByTeam = { |
|
|
id: 0, |
|
|
id: 0, |
|
@@ -66,12 +66,14 @@ const FinancialSummaryPage: React.FC<Props> = ({ |
|
|
} |
|
|
} |
|
|
return _allTeam |
|
|
return _allTeam |
|
|
}, [mainData]) |
|
|
}, [mainData]) |
|
|
|
|
|
console.log(allTeam) |
|
|
|
|
|
|
|
|
const [teamId, setTeamId] = useState(_teamId) |
|
|
const [teamId, setTeamId] = useState(_teamId) |
|
|
const [isCardClickedIndex, setIsCardClickedIndex] = useState(_teamId || 0); |
|
|
const [isCardClickedIndex, setIsCardClickedIndex] = useState(_teamId || 0); |
|
|
const [period, setPeriod] = useState(0); |
|
|
const [period, setPeriod] = useState(0); |
|
|
|
|
|
|
|
|
const dateMap: DateParams = useMemo(() => ({ |
|
|
const dateMap: DateParams = useMemo(() => ({ |
|
|
|
|
|
0: {startDate: "", endDate: ""}, |
|
|
2: {startDate: `${currFinancialYear-2}-${startDate}`, endDate: `${currFinancialYear-1}-${endDate}`}, |
|
|
2: {startDate: `${currFinancialYear-2}-${startDate}`, endDate: `${currFinancialYear-1}-${endDate}`}, |
|
|
3: {startDate: `${currFinancialYear-3}-${startDate}`, endDate: `${currFinancialYear-2}-${endDate}`}, |
|
|
3: {startDate: `${currFinancialYear-3}-${startDate}`, endDate: `${currFinancialYear-2}-${endDate}`}, |
|
|
4: {startDate: `${currFinancialYear-4}-${startDate}`, endDate: `${currFinancialYear-3}-${endDate}`}, |
|
|
4: {startDate: `${currFinancialYear-4}-${startDate}`, endDate: `${currFinancialYear-3}-${endDate}`}, |
|
@@ -79,11 +81,13 @@ const FinancialSummaryPage: React.FC<Props> = ({ |
|
|
}), [currYear, startDate, endDate]) |
|
|
}), [currYear, startDate, endDate]) |
|
|
|
|
|
|
|
|
const fetchFinancialSummaryByProject = useCallback(async (endDate: string, startDate: string) => { |
|
|
const fetchFinancialSummaryByProject = useCallback(async (endDate: string, startDate: string) => { |
|
|
|
|
|
setIsLoading(true) |
|
|
const data = await fetchFinancialSummaryByProjectV2(_teamId, endDate, startDate) |
|
|
const data = await fetchFinancialSummaryByProjectV2(_teamId, endDate, startDate) |
|
|
setMainData(data) |
|
|
setMainData(data) |
|
|
setByTeam(sumUpByTeam(data)) |
|
|
setByTeam(sumUpByTeam(data)) |
|
|
setByProject(data) |
|
|
setByProject(data) |
|
|
setByClient(sumUpByClient(data)) |
|
|
setByClient(sumUpByClient(data)) |
|
|
|
|
|
setIsLoading(false) |
|
|
}, [setMainData, setByTeam, setByProject, setByClient]) |
|
|
}, [setMainData, setByTeam, setByProject, setByClient]) |
|
|
|
|
|
|
|
|
const handleCardClick = useCallback((teamId: number) => { |
|
|
const handleCardClick = useCallback((teamId: number) => { |
|
@@ -96,10 +100,7 @@ const FinancialSummaryPage: React.FC<Props> = ({ |
|
|
console.log(value) |
|
|
console.log(value) |
|
|
var _startDate: string = "" |
|
|
var _startDate: string = "" |
|
|
var _endDate = "" |
|
|
var _endDate = "" |
|
|
if (value == 0) { |
|
|
|
|
|
_startDate = "" |
|
|
|
|
|
_endDate == "" |
|
|
|
|
|
} else if (value == 1) { |
|
|
|
|
|
|
|
|
if (value == 1) { |
|
|
if (curr <= `${currYear}-${endDate}`) { |
|
|
if (curr <= `${currYear}-${endDate}`) { |
|
|
_startDate = `${currYear - 1}-${startDate}` |
|
|
_startDate = `${currYear - 1}-${startDate}` |
|
|
_endDate = `${currYear}-${endDate}` |
|
|
_endDate = `${currYear}-${endDate}` |
|
@@ -164,7 +165,7 @@ const FinancialSummaryPage: React.FC<Props> = ({ |
|
|
<CardHeader className="text-slate-500" title= {t("Active Project Financial Status")}/> |
|
|
<CardHeader className="text-slate-500" title= {t("Active Project Financial Status")}/> |
|
|
<CardContent component={Stack} spacing={4}> |
|
|
<CardContent component={Stack} spacing={4}> |
|
|
<div className="ml-10 mr-10" style={{ display: 'flex', flexWrap: 'wrap', justifyContent: 'start'}}> |
|
|
<div className="ml-10 mr-10" style={{ display: 'flex', flexWrap: 'wrap', justifyContent: 'start'}}> |
|
|
{allTeam && |
|
|
|
|
|
|
|
|
{_teamId == 0 && allTeam && |
|
|
<div className="hover:cursor-pointer ml-4 inline-block" key={0} onClick={() => handleCardClick(0)}> |
|
|
<div className="hover:cursor-pointer ml-4 inline-block" key={0} onClick={() => handleCardClick(0)}> |
|
|
<ProjectFinancialCard |
|
|
<ProjectFinancialCard |
|
|
Title={t("All Team")} |
|
|
Title={t("All Team")} |
|
@@ -172,15 +173,15 @@ const FinancialSummaryPage: React.FC<Props> = ({ |
|
|
TotalActiveProjectNumber={allTeam.activeProject} |
|
|
TotalActiveProjectNumber={allTeam.activeProject} |
|
|
TotalFees={allTeam.totalFee} |
|
|
TotalFees={allTeam.totalFee} |
|
|
TotalBudget={allTeam.totalBudget} |
|
|
TotalBudget={allTeam.totalBudget} |
|
|
TotalCumulative={allTeam.projectExpense + allTeam.invoicedAmount} |
|
|
|
|
|
|
|
|
TotalCumulative={allTeam.manhourExpense + allTeam.projectExpense} |
|
|
TotalProjectExpense={allTeam.projectExpense} |
|
|
TotalProjectExpense={allTeam.projectExpense} |
|
|
TotalInvoicedAmount={allTeam.invoicedAmount} |
|
|
TotalInvoicedAmount={allTeam.invoicedAmount} |
|
|
TotalUnInvoicedAmount={allTeam.totalFee - allTeam.invoicedAmount} |
|
|
TotalUnInvoicedAmount={allTeam.totalFee - allTeam.invoicedAmount} |
|
|
TotalReceivedAmount={allTeam.paidAmount} |
|
|
TotalReceivedAmount={allTeam.paidAmount} |
|
|
CashFlowStatus={allTeam.invoicedAmount >= (allTeam.projectExpense + allTeam.invoicedAmount) ? "Positive" : "Negative"} |
|
|
|
|
|
CostPerformanceIndex={allTeam.invoicedAmount/(allTeam.projectExpense + allTeam.invoicedAmount) || 0} |
|
|
|
|
|
ProjectedCashFlowStatus={allTeam.totalFee >= (allTeam.projectExpense + allTeam.invoicedAmount) ? "Positive" : "Negative"} |
|
|
|
|
|
ProjectedCPI={allTeam.totalFee/(allTeam.projectExpense + allTeam.invoicedAmount)} |
|
|
|
|
|
|
|
|
CashFlowStatus={allTeam.invoicedAmount >= (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} |
|
|
ClickedIndex={isCardClickedIndex} |
|
|
Index={0}/> |
|
|
Index={0}/> |
|
|
</div>} |
|
|
</div>} |
|
@@ -192,15 +193,15 @@ const FinancialSummaryPage: React.FC<Props> = ({ |
|
|
TotalActiveProjectNumber={record.activeProject} |
|
|
TotalActiveProjectNumber={record.activeProject} |
|
|
TotalFees={record.totalFee} |
|
|
TotalFees={record.totalFee} |
|
|
TotalBudget={record.totalBudget} |
|
|
TotalBudget={record.totalBudget} |
|
|
TotalCumulative={record.projectExpense + record.invoicedAmount} |
|
|
|
|
|
|
|
|
TotalCumulative={record.projectExpense + record.manhourExpense} |
|
|
TotalProjectExpense={record.projectExpense} |
|
|
TotalProjectExpense={record.projectExpense} |
|
|
TotalInvoicedAmount={record.invoicedAmount} |
|
|
TotalInvoicedAmount={record.invoicedAmount} |
|
|
TotalUnInvoicedAmount={record.totalFee - record.invoicedAmount} |
|
|
|
|
|
|
|
|
TotalUnInvoicedAmount={Math.abs(record.totalFee - record.invoicedAmount)} |
|
|
TotalReceivedAmount={record.paidAmount} |
|
|
TotalReceivedAmount={record.paidAmount} |
|
|
CashFlowStatus={record.invoicedAmount >= (record.projectExpense + record.invoicedAmount) ? "Positive" : "Negative"} |
|
|
|
|
|
CostPerformanceIndex={record.invoicedAmount/(record.projectExpense + record.invoicedAmount) || 0} |
|
|
|
|
|
ProjectedCashFlowStatus={record.totalFee >= (record.projectExpense + record.invoicedAmount) ? "Positive" : "Negative"} |
|
|
|
|
|
ProjectedCPI={record.totalFee/(record.projectExpense + record.invoicedAmount)} |
|
|
|
|
|
|
|
|
CashFlowStatus={record.invoicedAmount >= (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} |
|
|
ClickedIndex={isCardClickedIndex} |
|
|
Index={record.id}/> |
|
|
Index={record.id}/> |
|
|
</div> |
|
|
</div> |
|
@@ -211,6 +212,7 @@ const FinancialSummaryPage: React.FC<Props> = ({ |
|
|
<FinancialStatusByProject |
|
|
<FinancialStatusByProject |
|
|
financialSummByProject={byProject} |
|
|
financialSummByProject={byProject} |
|
|
financialSummByClient={byClient} |
|
|
financialSummByClient={byClient} |
|
|
|
|
|
isLoading={isLoading} |
|
|
/> |
|
|
/> |
|
|
</> |
|
|
</> |
|
|
) |
|
|
) |
|
|