|
|
@@ -27,6 +27,9 @@ const ProjectCashFlow: React.FC = () => { |
|
|
|
const [cashFlowYear, setCashFlowYear]: any[] = React.useState( |
|
|
|
todayDate.getFullYear(), |
|
|
|
); |
|
|
|
const [anticipateCashFlowYear, setAnticipateCashFlowYear]: any[] = React.useState( |
|
|
|
todayDate.getFullYear(), |
|
|
|
); |
|
|
|
const columns = [ |
|
|
|
{ |
|
|
|
id: "projectCode", |
|
|
@@ -236,6 +239,113 @@ const ProjectCashFlow: React.FC = () => { |
|
|
|
], |
|
|
|
}; |
|
|
|
|
|
|
|
const anticipateOptions: 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: "Anticipate 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: "#f1c48a", |
|
|
|
data: [0, 110000, 0, 0, 185000, 0, 0, 189000, 0, 0, 300000, 0], |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: "Monthly_Expenditure", |
|
|
|
type: "column", |
|
|
|
color: "#89d7f3", |
|
|
|
data: [ |
|
|
|
60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, 60000, |
|
|
|
60000, 60000, |
|
|
|
], |
|
|
|
} |
|
|
|
], |
|
|
|
}; |
|
|
|
|
|
|
|
const accountsReceivableOptions: ApexOptions = { |
|
|
|
colors: ["#20E647"], |
|
|
|
series: [80], |
|
|
@@ -624,6 +734,48 @@ const ProjectCashFlow: React.FC = () => { |
|
|
|
}} |
|
|
|
> |
|
|
|
<Grid item xs={12} md={12} lg={12}> |
|
|
|
<Card> |
|
|
|
<CardHeader |
|
|
|
className="text-slate-500" |
|
|
|
title="Anticipate Cash Flow by Month" |
|
|
|
/> |
|
|
|
<div style={{ display: "inline-block", width: "99%" }}> |
|
|
|
<div className="inline-block"> |
|
|
|
<Label className="text-slate-500 font-medium ml-6"> |
|
|
|
Period: |
|
|
|
</Label> |
|
|
|
<Input |
|
|
|
id={"cashFlowYear"} |
|
|
|
value={anticipateCashFlowYear} |
|
|
|
readOnly={true} |
|
|
|
bsSize="lg" |
|
|
|
className="rounded-md text-base w-12" |
|
|
|
/> |
|
|
|
</div> |
|
|
|
<div className="inline-block ml-1"> |
|
|
|
<button |
|
|
|
onClick={() => setAnticipateCashFlowYear(cashFlowYear - 1)} |
|
|
|
className="hover:cursor-pointer hover:bg-slate-200 bg-transparent rounded-md w-8 h-8 text-base" |
|
|
|
> |
|
|
|
< |
|
|
|
</button> |
|
|
|
</div> |
|
|
|
<div className="inline-block ml-1"> |
|
|
|
<button |
|
|
|
onClick={() => setAnticipateCashFlowYear(cashFlowYear + 1)} |
|
|
|
className="hover:cursor-pointer hover:bg-slate-200 bg-transparent rounded-md w-8 h-8 text-base" |
|
|
|
> |
|
|
|
> |
|
|
|
</button> |
|
|
|
</div> |
|
|
|
<ReactApexChart |
|
|
|
options={anticipateOptions} |
|
|
|
series={anticipateOptions.series} |
|
|
|
type="line" |
|
|
|
height="350" |
|
|
|
/> |
|
|
|
</div> |
|
|
|
</Card> |
|
|
|
<Card> |
|
|
|
<CardHeader |
|
|
|
className="text-slate-500" |
|
|
|