Report Cash Flow
This commit is contained in:
parent
b3a41fe0e0
commit
a1d23cad9e
@ -0,0 +1,22 @@
|
|||||||
|
import ReportTitle from '@/components/report/ReportTitle'
|
||||||
|
import ReportCashCard from '@/views/apps/report/cash-flow/ReportCashCard'
|
||||||
|
import ReportCashFlowContent from '@/views/apps/report/cash-flow/ReportCashFlowContent'
|
||||||
|
import Grid from '@mui/material/Grid2'
|
||||||
|
|
||||||
|
const CashFlowPage = () => {
|
||||||
|
return (
|
||||||
|
<Grid container spacing={6}>
|
||||||
|
<Grid size={{ xs: 12 }}>
|
||||||
|
<ReportTitle title='Arus Kas' />
|
||||||
|
</Grid>
|
||||||
|
<Grid size={{ xs: 12 }}>
|
||||||
|
<ReportCashCard />
|
||||||
|
</Grid>
|
||||||
|
<Grid size={{ xs: 12 }}>
|
||||||
|
<ReportCashFlowContent />
|
||||||
|
</Grid>
|
||||||
|
</Grid>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default CashFlowPage
|
||||||
101
src/components/report/ReportItem.tsx
Normal file
101
src/components/report/ReportItem.tsx
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
import React from 'react'
|
||||||
|
import { Box, Typography, Paper } from '@mui/material'
|
||||||
|
|
||||||
|
// Types
|
||||||
|
type ReportItemHeaderProps = {
|
||||||
|
title: string
|
||||||
|
date: string
|
||||||
|
}
|
||||||
|
|
||||||
|
type ReportItemSubheaderProps = {
|
||||||
|
title: string
|
||||||
|
}
|
||||||
|
|
||||||
|
type ReportItemProps = {
|
||||||
|
accountCode: string
|
||||||
|
accountName: string
|
||||||
|
amount: number
|
||||||
|
onClick?: () => void
|
||||||
|
isSubtitle?: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
type ReportItemFooterProps = {
|
||||||
|
title: string
|
||||||
|
amount: number
|
||||||
|
children?: React.ReactNode
|
||||||
|
}
|
||||||
|
|
||||||
|
// Helper function to format currency
|
||||||
|
const formatCurrency = (amount: number) => {
|
||||||
|
return new Intl.NumberFormat('id-ID', {
|
||||||
|
minimumFractionDigits: 0,
|
||||||
|
maximumFractionDigits: 0
|
||||||
|
}).format(amount)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ReportItemHeader Component
|
||||||
|
export const ReportItemHeader: React.FC<ReportItemHeaderProps> = ({ title, date }) => {
|
||||||
|
return (
|
||||||
|
<Box className='bg-slate-200 px-6 py-4 flex justify-between items-center'>
|
||||||
|
<Typography variant='h6' className='text-primary font-semibold'>
|
||||||
|
{title}
|
||||||
|
</Typography>
|
||||||
|
<Typography variant='body1' className='text-primary font-medium'>
|
||||||
|
{date}
|
||||||
|
</Typography>
|
||||||
|
</Box>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ReportItemSubheader Component
|
||||||
|
export const ReportItemSubheader: React.FC<ReportItemSubheaderProps> = ({ title }) => {
|
||||||
|
return (
|
||||||
|
<Box className='px-6 py-3 bg-white border-b border-gray-300 hover:bg-gray-50 transition-colors'>
|
||||||
|
<Typography variant='subtitle1' className='font-semibold text-gray-900'>
|
||||||
|
{title}
|
||||||
|
</Typography>
|
||||||
|
</Box>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ReportItem Component
|
||||||
|
export const ReportItem: React.FC<ReportItemProps> = ({
|
||||||
|
accountCode,
|
||||||
|
accountName,
|
||||||
|
amount,
|
||||||
|
onClick,
|
||||||
|
isSubtitle = true
|
||||||
|
}) => {
|
||||||
|
return (
|
||||||
|
<Box
|
||||||
|
onClick={onClick}
|
||||||
|
className={`px-6 py-3 flex justify-between items-center bg-white border-b border-gray-300 transition-all duration-200 ease-in-out ${
|
||||||
|
onClick ? 'cursor-pointer hover:bg-gray-50' : 'cursor-default'
|
||||||
|
}`}
|
||||||
|
>
|
||||||
|
<Typography variant='body1' className={`text-gray-900 font-normal ${isSubtitle ? 'ml-4' : ''}`}>
|
||||||
|
{accountCode} {accountName}
|
||||||
|
</Typography>
|
||||||
|
<Typography variant='body1' className='text-primary font-medium text-right'>
|
||||||
|
{formatCurrency(amount)}
|
||||||
|
</Typography>
|
||||||
|
</Box>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ReportItemFooter Component
|
||||||
|
export const ReportItemFooter: React.FC<ReportItemFooterProps> = ({ title, amount, children }) => {
|
||||||
|
return (
|
||||||
|
<Box className='px-6 py-4 border-b border-gray-300 hover:bg-gray-50 transition-colors'>
|
||||||
|
<Box className='flex justify-between items-center'>
|
||||||
|
<Typography variant='subtitle1' className='font-bold text-gray-900'>
|
||||||
|
{title}
|
||||||
|
</Typography>
|
||||||
|
<Typography variant='subtitle1' className='text-primary font-bold text-right'>
|
||||||
|
{formatCurrency(amount)}
|
||||||
|
</Typography>
|
||||||
|
</Box>
|
||||||
|
{children && <Box className='mt-2'>{children}</Box>}
|
||||||
|
</Box>
|
||||||
|
)
|
||||||
|
}
|
||||||
27
src/components/report/ReportTitle.tsx
Normal file
27
src/components/report/ReportTitle.tsx
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
'use client'
|
||||||
|
|
||||||
|
// MUI Imports
|
||||||
|
import Button from '@mui/material/Button'
|
||||||
|
import Typography from '@mui/material/Typography'
|
||||||
|
|
||||||
|
interface Props {
|
||||||
|
title: string
|
||||||
|
}
|
||||||
|
|
||||||
|
const ReportTitle = ({ title }: Props) => {
|
||||||
|
return (
|
||||||
|
<div className='flex flex-wrap sm:items-center justify-between max-sm:flex-col gap-6'>
|
||||||
|
<div>
|
||||||
|
<Typography variant='h4' className='mbe-1'>
|
||||||
|
{title}
|
||||||
|
</Typography>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Props {
|
||||||
|
title: string
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ReportTitle
|
||||||
@ -1,20 +1,30 @@
|
|||||||
|
'use client'
|
||||||
|
|
||||||
import { Container, Typography } from '@mui/material'
|
import { Container, Typography } from '@mui/material'
|
||||||
import Grid from '@mui/material/Grid2'
|
import Grid from '@mui/material/Grid2'
|
||||||
import ReportCard from './ReportCard'
|
import ReportCard from './ReportCard'
|
||||||
|
import { getLocalizedUrl } from '@/utils/i18n'
|
||||||
|
import { Locale } from '@/configs/i18n'
|
||||||
|
import { useParams } from 'next/navigation'
|
||||||
|
|
||||||
const ReportFinancialList: React.FC = () => {
|
const ReportFinancialList: React.FC = () => {
|
||||||
|
const { lang: locale } = useParams()
|
||||||
|
|
||||||
const financialReports = [
|
const financialReports = [
|
||||||
{
|
{
|
||||||
title: 'Arus Kas',
|
title: 'Arus Kas',
|
||||||
iconClass: 'tabler-cash'
|
iconClass: 'tabler-cash',
|
||||||
|
link: getLocalizedUrl(`/apps/report/cash-flow`, locale as Locale)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'Laba Rugi',
|
title: 'Laba Rugi',
|
||||||
iconClass: 'tabler-cash'
|
iconClass: 'tabler-cash',
|
||||||
|
link: getLocalizedUrl(`/apps/report/profit-loss`, locale as Locale)
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
title: 'Neraca',
|
title: 'Neraca',
|
||||||
iconClass: 'tabler-cash'
|
iconClass: 'tabler-cash',
|
||||||
|
link: getLocalizedUrl(`/apps/report/nerace`, locale as Locale)
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -27,7 +37,7 @@ const ReportFinancialList: React.FC = () => {
|
|||||||
<Grid container spacing={3}>
|
<Grid container spacing={3}>
|
||||||
{financialReports.map((report, index) => (
|
{financialReports.map((report, index) => (
|
||||||
<Grid key={index} size={{ xs: 12, sm: 4, md: 3 }}>
|
<Grid key={index} size={{ xs: 12, sm: 4, md: 3 }}>
|
||||||
<ReportCard title={report.title} avatarIcon={report.iconClass} />
|
<ReportCard title={report.title} avatarIcon={report.iconClass} href={report.link} />
|
||||||
</Grid>
|
</Grid>
|
||||||
))}
|
))}
|
||||||
</Grid>
|
</Grid>
|
||||||
|
|||||||
62
src/views/apps/report/cash-flow/ReportCashCard.tsx
Normal file
62
src/views/apps/report/cash-flow/ReportCashCard.tsx
Normal file
@ -0,0 +1,62 @@
|
|||||||
|
// MUI Imports
|
||||||
|
import Grid from '@mui/material/Grid2'
|
||||||
|
|
||||||
|
// Type Imports
|
||||||
|
import type { UserDataType } from '@components/card-statistics/HorizontalWithSubtitle'
|
||||||
|
|
||||||
|
// Component Imports
|
||||||
|
import HorizontalWithSubtitle from '@components/card-statistics/HorizontalWithSubtitle'
|
||||||
|
|
||||||
|
// Vars
|
||||||
|
const data: UserDataType[] = [
|
||||||
|
{
|
||||||
|
title: 'Quick Ratio',
|
||||||
|
stats: '2,4',
|
||||||
|
avatarIcon: 'tabler-gauge',
|
||||||
|
avatarColor: 'success',
|
||||||
|
trend: 'positive',
|
||||||
|
trendNumber: 'Target 0,2',
|
||||||
|
subtitle: 'Hari Ini'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'Current Ratio',
|
||||||
|
stats: '1,09',
|
||||||
|
avatarIcon: 'tabler-trending-down',
|
||||||
|
avatarColor: 'error',
|
||||||
|
trend: 'negative',
|
||||||
|
trendNumber: '7,6%',
|
||||||
|
subtitle: 'vs bulan sebelumnya'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'Debt Equity Ratio',
|
||||||
|
stats: '0',
|
||||||
|
avatarIcon: 'tabler-trending-up',
|
||||||
|
avatarColor: 'success',
|
||||||
|
trend: 'positive',
|
||||||
|
trendNumber: '0%',
|
||||||
|
subtitle: 'vs bulan sebelumnya'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'Equity Ratio',
|
||||||
|
stats: '0,65',
|
||||||
|
avatarIcon: 'tabler-trending-down',
|
||||||
|
avatarColor: 'error',
|
||||||
|
trend: 'negative',
|
||||||
|
trendNumber: '4,4%',
|
||||||
|
subtitle: 'vs bulan sebelumnya'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
const ReportCashCard = () => {
|
||||||
|
return (
|
||||||
|
<Grid container spacing={6}>
|
||||||
|
{data.map((item, i) => (
|
||||||
|
<Grid key={i} size={{ xs: 12, sm: 6, md: 3 }}>
|
||||||
|
<HorizontalWithSubtitle {...item} />
|
||||||
|
</Grid>
|
||||||
|
))}
|
||||||
|
</Grid>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ReportCashCard
|
||||||
113
src/views/apps/report/cash-flow/ReportCashFlowContent.tsx
Normal file
113
src/views/apps/report/cash-flow/ReportCashFlowContent.tsx
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
'use client'
|
||||||
|
|
||||||
|
import DateRangePicker from '@/components/RangeDatePicker'
|
||||||
|
import { ReportItem, ReportItemFooter, ReportItemHeader, ReportItemSubheader } from '@/components/report/ReportItem'
|
||||||
|
import { Button, Card, CardContent, Paper } from '@mui/material'
|
||||||
|
import { useState } from 'react'
|
||||||
|
|
||||||
|
const ReportCashFlowContent = () => {
|
||||||
|
const [startDate, setStartDate] = useState<Date | null>(new Date())
|
||||||
|
const [endDate, setEndDate] = useState<Date | null>(new Date())
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Card>
|
||||||
|
<div className='p-6 border-be'>
|
||||||
|
<div className='flex items-center justify-end gap-2'>
|
||||||
|
<Button
|
||||||
|
color='secondary'
|
||||||
|
variant='tonal'
|
||||||
|
startIcon={<i className='tabler-upload' />}
|
||||||
|
className='max-sm:is-full'
|
||||||
|
>
|
||||||
|
Ekspor
|
||||||
|
</Button>
|
||||||
|
<DateRangePicker
|
||||||
|
startDate={startDate}
|
||||||
|
endDate={endDate}
|
||||||
|
onStartDateChange={setStartDate}
|
||||||
|
onEndDateChange={setEndDate}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<CardContent>
|
||||||
|
<ReportItemHeader title='Aset' date='11/09/2025' />
|
||||||
|
<ReportItemSubheader title='Kas & Bank' />
|
||||||
|
<ReportItem accountCode='1-10001' accountName='Kas' amount={39705850} onClick={() => {}} />
|
||||||
|
<ReportItem accountCode='1-10002' accountName='Rekening Bank' amount={33335787} onClick={() => {}} />
|
||||||
|
<ReportItem accountCode='1-10003' accountName='Giro' amount={30631261} onClick={() => {}} />
|
||||||
|
<ReportItem accountCode='1-10003' accountName='Giro' amount={30631261} onClick={() => {}} />
|
||||||
|
<ReportItemFooter title='Total Kas & Bank' amount={103672897} />
|
||||||
|
<ReportItemSubheader title='' />
|
||||||
|
|
||||||
|
<ReportItemSubheader title='Aset Lancar' />
|
||||||
|
<ReportItem accountCode='1-10100' accountName='Piutang Usaha' amount={49601559} onClick={() => {}} />
|
||||||
|
<ReportItem accountCode='1-10102' accountName='Cadangan Kerugian Piutang' amount={5930450} onClick={() => {}} />
|
||||||
|
<ReportItem accountCode='1-10200' accountName='Persediaan Barang' amount={14536046} onClick={() => {}} />
|
||||||
|
<ReportItem accountCode='1-10402' accountName='Biaya Dibayar Di Muka' amount={-77477} onClick={() => {}} />
|
||||||
|
<ReportItem accountCode='1-10500' accountName='PPN Masukan' amount={4559934} onClick={() => {}} />
|
||||||
|
<ReportItem
|
||||||
|
accountCode='1-10501'
|
||||||
|
accountName='Pajak Dibayar Di Muka - PPh 22'
|
||||||
|
amount={-21622}
|
||||||
|
onClick={() => {}}
|
||||||
|
/>
|
||||||
|
<ReportItemFooter title='Total Aset Lancar' amount={74528890} />
|
||||||
|
<ReportItemSubheader title='' />
|
||||||
|
|
||||||
|
<ReportItemSubheader title='Aset Tetap' />
|
||||||
|
<ReportItem accountCode='1-10700' accountName='Aset Tetap - Tanah' amount={17900000} onClick={() => {}} />
|
||||||
|
<ReportItem accountCode='1-10701' accountName='Aset Tetap - Bangunan' amount={-21622} onClick={() => {}} />
|
||||||
|
<ReportItemFooter title='Total Aset Tetap' amount={17878378} />
|
||||||
|
<ReportItemSubheader title='' />
|
||||||
|
|
||||||
|
<ReportItemSubheader title='Depresiasi & Amortisasi' />
|
||||||
|
<ReportItem
|
||||||
|
accountCode='1-10753'
|
||||||
|
accountName='Akumulasi penyusutan - Kendaraan'
|
||||||
|
amount={-45946}
|
||||||
|
onClick={() => {}}
|
||||||
|
/>
|
||||||
|
<ReportItem accountCode='1-10757' accountName='Akumulasi Amortisasi' amount={19820} onClick={() => {}} />
|
||||||
|
<ReportItemFooter title='Total Depresiasi & Amortisasi' amount={-26126} />
|
||||||
|
<ReportItemSubheader title='' />
|
||||||
|
|
||||||
|
<ReportItemSubheader title='Lainnya' />
|
||||||
|
<ReportItemFooter title='Total Lainnya' amount={0} />
|
||||||
|
<ReportItemSubheader title='' />
|
||||||
|
|
||||||
|
<ReportItemFooter title='Total Aset' amount={196054040} />
|
||||||
|
<ReportItemSubheader title='' />
|
||||||
|
|
||||||
|
<ReportItemHeader title='Liabilities and Modal' date='11/09/2025' />
|
||||||
|
<ReportItemSubheader title='Liabilitas Jangka Pendek' />
|
||||||
|
<ReportItem accountCode='2-20100' accountName='Hutang Usaha' amount={43333108} onClick={() => {}} />
|
||||||
|
<ReportItem accountCode='2-20101' accountName='Hutang Belum Ditagih' amount={10367721} onClick={() => {}} />
|
||||||
|
<ReportItem accountCode='2-20500' accountName='PPN Keluaran' amount={14933183} onClick={() => {}} />
|
||||||
|
<ReportItemFooter title='Total Liabilitas Jangka Pendek' amount={68634012} />
|
||||||
|
<ReportItemSubheader title='' />
|
||||||
|
|
||||||
|
<ReportItemSubheader title='Liabilitas Jangka Panjang' />
|
||||||
|
<ReportItemFooter title='Total Liabilitas Jangka Panjang' amount={0} />
|
||||||
|
<ReportItemSubheader title='' />
|
||||||
|
|
||||||
|
<ReportItemSubheader title='Perubahan Modal' />
|
||||||
|
<ReportItem accountCode='3-30000' accountName='Modal Saham' amount={83665766} onClick={() => {}} />
|
||||||
|
<ReportItem
|
||||||
|
accountCode='3-30300'
|
||||||
|
accountName='Pendapatan Komprehensif Lainnya'
|
||||||
|
amount={-78378}
|
||||||
|
onClick={() => {}}
|
||||||
|
/>
|
||||||
|
<ReportItem accountCode='' accountName='Pendapatan sampai periode terakhir' amount={0} onClick={() => {}} />
|
||||||
|
<ReportItem accountCode='' accountName='Pendapatan periode ini' amount={43832641} onClick={() => {}} />
|
||||||
|
<ReportItemFooter title='Total Perubahan Modal' amount={127420028} />
|
||||||
|
<ReportItemSubheader title='' />
|
||||||
|
|
||||||
|
<ReportItemFooter title='Total Liabilitas and Modal' amount={196054040} />
|
||||||
|
<ReportItemSubheader title='' />
|
||||||
|
</CardContent>
|
||||||
|
</Card>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export default ReportCashFlowContent
|
||||||
Loading…
x
Reference in New Issue
Block a user