e-verify/pages/index.js
2024-05-14 22:19:14 +07:00

507 lines
16 KiB
JavaScript

/* eslint-disable no-mixed-spaces-and-tabs */
import { LandingPageLayout } from '@/components/Layouts'
import { CekTagihan } from '@/services/cek-tagihan-service'
import { HomepageGet } from '@/services/homepage-service'
import Head from 'next/head'
import Image from 'next/image'
import Link from 'next/link'
import { Button } from 'primereact/button'
import { Column } from 'primereact/column'
import { ColumnGroup } from 'primereact/columngroup'
import { DataTable } from 'primereact/datatable'
import { InputText } from 'primereact/inputtext'
import { Panel } from 'primereact/panel'
import { Row } from 'primereact/row'
import { Steps } from 'primereact/steps'
import React, { useEffect, useState } from 'react'
import { FaFileArrowUp, FaFileCircleCheck, FaFileLines, FaFileSignature } from 'react-icons/fa6'
export default function LandingPage({ token }) {
const [cekTagihan, setCekTagihan] = useState('')
const [dataCekTagihan, setDataCekTagihan] = useState([])
const [data, setData] = useState([
{
status_tagihan_daily: {
'Ditolak/dikembalikan': { total: 0, percentage: 0 },
'Disetujui dengan catatan': { total: 0, percentage: 0 },
'Disetujui tanpa catatan': { total: 0, percentage: 0 },
},
status_tagihan_ytd: {
'Ditolak/dikembalikan': { total: 0, percentage: 0 },
'Disetujui dengan catatan': { total: 0, percentage: 0 },
'Disetujui tanpa catatan': { total: 0, percentage: 0 },
},
jenis_tagihan_daily: {
GUP: {
percentage: 0,
total: 0,
},
LS: {
percentage: 0,
total: 0,
},
PTUP: {
percentage: 0,
total: 0,
},
},
jenis_tagihan_yearly: {
GUP: {
percentage: 0,
total: 0,
},
LS: {
percentage: 0,
total: 0,
},
PTUP: {
percentage: 0,
total: 0,
},
},
},
])
const [dataKetetapan, setDataKetetapan] = useState([])
const [dataPrgoress, setDataPrgoress] = useState([])
useEffect(() => {
HomepageGet()
.then((res) => {
setData([res.data])
setDataKetetapan(res.data.monitoring_ketepatan)
setDataPrgoress(res.data.monitoring_progress)
})
.catch((err) => {
setData(err)
console.log('err homepage get', err)
})
}, [])
const handleCari = () => {
CekTagihan(cekTagihan)
.then((res) => setDataCekTagihan(res.data))
.catch((err) => console.log(err))
}
const items = [
{ label: 'Pengajuan tagihan' },
{ label: 'Berkas telah diverifikasi' },
{ label: 'Berkas telah divalidasi' },
{ label: 'Berkas telah diapprove' },
{ label: 'Berkas disetujui bendahara' },
{ label: 'Berkas disetujui PPSPM' },
{ label: 'SPM dikirim', className: 'last-dor' },
]
const headerGroup = (
<ColumnGroup>
<Row>
<Column header='No SPP' rowSpan={2} />
<Column header='Unit Kerja' rowSpan={2} />
<Column header='Progress' colSpan={6} />
</Row>
<Row>
<Column header='PPK' />
<Column header='Verifikasi' />
<Column header='Rekomendasi' />
<Column header='Persetujuan' />
<Column header='PPSPM' />
</Row>
</ColumnGroup>
)
return (
<div className='landing-page'>
<Head>
<title>E-Verifikasi</title>
</Head>
<div className='flex items-center 2xl:px-60 md:px-20 py-3 justify-between border-b-2 mx-3'>
<div className='pl-3'>
<Image alt='logo' src={'/img/e-verif-title.png'} width={511 / 6} height={540 / 6} />
</div>
<div className='title font-bebas 2xl:text-3xl py-2 md:text-xl text-hitam text-lg text-center'>
<p className='tracking-wide text-3xl'>SISTEM APLIKASI</p>
<p className='tracking-wide text-3xl'>Penyelesaian Tagihan dan Pertanggungjawaban Keuangan</p>
</div>
<div className='hidden md:block'>
{token ? (
<Link href={'/dashboard'}>
<Button label='Dashboard' className='h-8' />
</Link>
) : (
<Link href={'/login'}>
<Button label='Login' className='h-8' />
</Link>
)}
</div>
</div>
<LandingPageLayout>
<Panel
headerTemplate={() => {
return (
<div className='bg-gradient-to-r from-orange3 to-yellow rounded-t p-2'>
<p>Cek Tagihan</p>
</div>
)
}}
toggleable
className='md:hidden mb-1'
>
<div className='mb-5 p-2'>
<InputText
value={cekTagihan}
onChange={(e) => setCekTagihan(e.target.value)}
placeholder='Masukkan nomor SPP'
style={{ marginBottom: '10px', width: '100%' }}
/>
<Button
label='Cari tagihan'
icon='pi pi-search'
className='p-button-sm'
style={{ width: '100%' }}
onClick={() => handleCari()}
/>
</div>
{Object.keys(dataCekTagihan).length > 0 && (
<React.Fragment>
<div className='tracking-doc p-2'>
<div className='rounded-t border-b-2 border-orange pl-1 mb-3 font-semibold text-xl pb-1'>
Tracking Dokumen
</div>
<Steps model={items} className='custom-step' activeIndex={parseInt(dataCekTagihan.detail.tahapan)} />
</div>
<div className='detail-doc p-2'>
<div className='rounded-t border-b-2 border-orange pl-1 mb-3 font-semibold text-xl pb-1'>
Detail Dokumen
</div>
<div className='text-sm'>
<p>
No SPP: <span className='font-semibold'>{dataCekTagihan.detail.no_spp}</span>
</p>
<p>
Nama tagihan: <span className='font-semibold'>{dataCekTagihan.detail.nama_tagihan}</span>
</p>
<p>
Nama unit: <span className='font-semibold'>{dataCekTagihan.detail.nama_unit}</span>
</p>
</div>
</div>
</React.Fragment>
)}
</Panel>
{/* YTD DOKUMEN */}
<Panel
headerTemplate={() => {
return (
<div className='bg-gray-200 rounded-t p-1'>
<p>Year to Date</p>
</div>
)
}}
toggleable
>
<div className='grid grid-cols-4 gap-3 p-5'>
<div className='satu bg-logo-orange1 flex items-center justify-around p-1 rounded'>
<div className='kiri'>
<p className='text-sm'>Jumlah Dokumen</p>
<div className='flex gap-3'>
<p className='text-lg font-semibold'>
{data.length > 0 && Object.keys(data[0].status_tagihan_ytd).length > 0
? data[0].status_tagihan_ytd['Ditolak/dikembalikan'].total +
data[0].status_tagihan_ytd['Disetujui dengan catatan'].total +
data[0].status_tagihan_ytd['Disetujui tanpa catatan'].total
: 0}
</p>
</div>
</div>
<div className='kanan'>
<FaFileLines color='#D85610' className='text-4xl opacity-50' />
</div>
</div>
<div className='dua bg-logo-pink1 flex items-center justify-around p-1 rounded'>
<div className='kiri'>
<p className='text-sm'>Dikembalikan</p>
<div className='flex gap-3'>
<p className='text-lg font-semibold'>
{data.length > 0 && data[0].status_tagihan_ytd['Ditolak/dikembalikan'].total}
</p>
<p className='text-lg font-semibold'>
({data.length > 0 && data[0].status_tagihan_ytd['Ditolak/dikembalikan'].percentage}%)
</p>
</div>
</div>
<div className='kanan'>
<FaFileArrowUp color='#D81432' className='text-4xl opacity-50' />
</div>
</div>
<div className='tiga bg-logo-kuning1 flex items-center justify-around p-1 rounded'>
<div className='kiri'>
<p className='text-sm'>Dengan Catatan</p>
<div className='flex gap-3'>
<p className='text-lg font-semibold'>
{data.length > 0 && data[0].status_tagihan_ytd['Disetujui dengan catatan'].total}
</p>
<p className='text-lg font-semibold'>
({data.length > 0 && data[0].status_tagihan_ytd['Disetujui dengan catatan'].percentage}%)
</p>
</div>
</div>
<div className='kanan'>
<FaFileSignature color='#DC980C' className='text-4xl opacity-50' />
</div>
</div>
<div className='empat bg-logo-biru1 flex items-center justify-around p-1 rounded'>
<div className='kiri'>
<p className='text-sm'>Disetujui</p>
<div className='flex gap-3'>
<p className='text-lg font-semibold'>
{data.length > 0 && data[0].status_tagihan_ytd['Disetujui tanpa catatan'].total}
</p>
<p className='text-lg font-semibold'>
({data.length > 0 && data[0].status_tagihan_ytd['Disetujui tanpa catatan'].percentage}%)
</p>
</div>
</div>
<div className='kanan'>
<FaFileCircleCheck color='#3666A0' className='text-4xl opacity-50' />
</div>
</div>
</div>
</Panel>
{/* TODAY DOKUMEN */}
<Panel
headerTemplate={() => {
return (
<div className='bg-gray-200 rounded-t p-1 text-sm'>
<p>Today</p>
</div>
)
}}
toggleable
>
<div className='grid grid-cols-4 gap-3 p-5'>
<div className='satu bg-logo-orange1 flex items-center justify-around p-1 rounded'>
<div className='kiri'>
<p className='text-sm'>Jumlah Dokumen</p>
<div className='flex gap-3'>
<p className='text-lg font-semibold'>
{data[0].status_tagihan_daily['Ditolak/dikembalikan'].total +
data[0].status_tagihan_daily['Disetujui dengan catatan'].total +
data[0].status_tagihan_daily['Disetujui tanpa catatan'].total}
</p>
</div>
</div>
<div className='kanan'>
<FaFileLines color='#D85610' className='text-4xl opacity-50' />
</div>
</div>
<div className='dua bg-logo-pink1 flex items-center justify-around p-1 rounded'>
<div className='kiri'>
<p className='text-sm'>Dikembalikan</p>
<div className='flex gap-3'>
<p className='text-lg font-semibold'>{data[0].status_tagihan_daily['Ditolak/dikembalikan'].total}</p>
<p className='text-lg font-semibold'>
({data[0].status_tagihan_daily['Ditolak/dikembalikan'].percentage}
%)
</p>
</div>
</div>
<div className='kanan'>
<FaFileArrowUp color='#D81432' className='text-4xl opacity-50' />
</div>
</div>
<div className='tiga bg-logo-kuning1 flex items-center justify-around p-1 rounded'>
<div className='kiri'>
<p className='text-sm'>Dengan Catatan</p>
<div className='flex gap-3'>
<p className='text-lg font-semibold'>
{data[0].status_tagihan_daily['Disetujui dengan catatan'].total}
</p>
<p className='text-lg font-semibold'>
({data[0].status_tagihan_daily['Disetujui dengan catatan'].percentage}
%)
</p>
</div>
</div>
<div className='kanan'>
<FaFileSignature color='#DC980C' className='text-4xl opacity-50' />
</div>
</div>
<div className='empat bg-logo-biru1 flex items-center justify-around p-1 rounded'>
<div className='kiri'>
<p className='text-sm'>Disetujui</p>
<div className='flex gap-3'>
<p className='text-lg font-semibold'>
{data[0].status_tagihan_daily['Disetujui tanpa catatan'].total}
</p>
<p className='text-lg font-semibold'>
({data[0].status_tagihan_daily['Disetujui tanpa catatan'].percentage}
%)
</p>
</div>
</div>
<div className='kanan'>
<FaFileCircleCheck color='#3666A0' className='text-4xl opacity-50' />
</div>
</div>
</div>
</Panel>
{/* YTD ALL TAGIHAN */}
<Panel
headerTemplate={() => {
return (
<div className='bg-gray-200 rounded-t p-1 text-sm'>
<p>Year to Date</p>
</div>
)
}}
toggleable
>
<div className='grid grid-cols-3 gap-3 p-5'>
<div className='satu bg-logo-orange1 flex items-center justify-around p-1 rounded flex-col'>
<p className='text-sm'>Tagihan LS</p>
<div className='flex gap-3'>
<p className='text-lg font-semibold'>{data[0].jenis_tagihan_yearly.LS.total}</p>
<p className='text-lg font-semibold'>
({data[0].jenis_tagihan_yearly.LS.percentage}
%)
</p>
</div>
</div>
<div className='dua bg-logo-pink1 flex items-center justify-around p-1 rounded flex-col'>
<p className='text-sm'>Tagihan GU</p>
<div className='flex gap-3'>
<p className='text-lg font-semibold'>{data[0].jenis_tagihan_yearly.GUP.total}</p>
<p className='text-lg font-semibold'>
({data[0].jenis_tagihan_yearly.GUP.percentage}
%)
</p>
</div>
</div>
<div className='tiga bg-logo-kuning1 flex items-center justify-around p-1 rounded flex-col'>
<p className='text-sm'>Tagihan TUP</p>
<div className='flex gap-3'>
<p className='text-lg font-semibold'>{data[0].jenis_tagihan_yearly.PTUP.total}</p>
<p className='text-lg font-semibold'>
({data[0].jenis_tagihan_yearly.PTUP.percentage}
%)
</p>
</div>
</div>
</div>
</Panel>
{/* TODAY ALL TAGIHAN */}
<Panel
headerTemplate={() => {
return (
<div className='bg-gray-200 rounded-t p-1 text-sm'>
<p>Today</p>
</div>
)
}}
toggleable
>
<div className='grid grid-cols-3 gap-3 p-3'>
<div className='satu bg-logo-orange1 flex items-center justify-around p-1 rounded flex-col'>
<p className='text-sm'>Tagihan LS</p>
<div className='flex gap-3'>
<p className='text-lg font-semibold'>{data[0].jenis_tagihan_daily.LS.total}</p>
<p className='text-lg font-semibold'>
({data[0].jenis_tagihan_daily.LS.percentage}
%)
</p>
</div>
</div>
<div className='dua bg-logo-pink1 flex items-center justify-around p-1 rounded flex-col'>
<p className='text-sm'>Tagihan GU</p>
<div className='flex gap-3'>
<p className='text-lg font-semibold'>{data[0].jenis_tagihan_daily.GUP.total}</p>
<p className='text-lg font-semibold'>
({data[0].jenis_tagihan_daily.GUP.percentage}
%)
</p>
</div>
</div>
<div className='tiga bg-logo-kuning1 flex items-center justify-around p-1 rounded flex-col'>
<p className='text-sm'>Tagihan TUP</p>
<div className='flex gap-3'>
<p className='text-lg font-semibold'>{data[0].jenis_tagihan_daily.PTUP.total}</p>
<p className='text-lg font-semibold'>
({data[0].jenis_tagihan_daily.PTUP.percentage}
%)
</p>
</div>
</div>
</div>
</Panel>
{/* MONITORING PROGRESS PENYELESAIAN DOKUMEN */}
<Panel
headerTemplate={() => {
return (
<div className='bg-logo-biru1 rounded-t p-1 text-sm text-white'>
<p>Monitoring Progress Penyelesaian Dokumen</p>
</div>
)
}}
toggleable
>
<DataTable
value={dataPrgoress}
headerColumnGroup={headerGroup}
tableStyle={{ minWidth: '100%' }}
size='small'
stripedRows={true}
className='p-5'
>
<Column field='no_spp' />
<Column field='unit' />
<Column field='ppk' />
<Column field='verifikasi' />
<Column field='rekomendasi' />
<Column field='persetujuan' />
<Column field='ppspm' />
</DataTable>
</Panel>
{/* MONITORING KETEPATAN PENGAJUAN DOKUMEN */}
<Panel
headerTemplate={() => {
return (
<div className='bg-logo-biru1 rounded-t p-1 text-sm text-white'>
<p>Monitoring Ketepatan Pengajuan Dokumen</p>
</div>
)
}}
toggleable
>
<DataTable
value={dataKetetapan}
tableStyle={{ minWidth: '100%' }}
size='small'
stripedRows={true}
className='p-5'
>
<Column header='No SPP' field='no_spp' />
<Column header='No Tagihan' field='no_tagihan' />
<Column header='Jenis Tagihan' field='jenis_tagihan' />
<Column header='Unit Kerja' field='unit_kerja' />
<Column header='Tanggal Selesai Kegiatan' field='tangga_selesai_kegiatan' />
<Column header='Tanggal Dokumen Masuk' field='tanggal_dokumen_masuk' />
<Column header='Keterangan' field='keterangan' />
</DataTable>
</Panel>
</LandingPageLayout>
</div>
)
}
export const getServerSideProps = async (ctx) => {
const token = ctx.req.cookies.token || null
return {
props: {
token,
},
}
}