/* eslint-disable react-hooks/exhaustive-deps */ /* eslint-disable @typescript-eslint/no-explicit-any */ 'use client' import PendapatanAsliDesa from '@/app/admin/(dashboard)/_state/ekonomi/PADesa' import apbdes from '@/app/admin/(dashboard)/_state/landing-page/apbdes' import colors from '@/con/colors' import { ActionIcon, BackgroundImage, Box, Center, Container, Group, Loader, Paper, Progress, SimpleGrid, Stack, Table, Text, Title } from '@mantine/core' import { IconDownload } from '@tabler/icons-react' import { Link } from 'next-view-transitions' import { useEffect, useState } from 'react' import { useProxy } from 'valtio/utils' import BackButton from '../../(pages)/desa/layanan/_com/BackButto' function Page() { const state = useProxy(apbdes) const paDesaState = useProxy(PendapatanAsliDesa.ApbDesa) const [loading, setLoading] = useState(false) useEffect(() => { const loadData = async () => { try { setLoading(true) await state.findMany.load() await paDesaState.findMany.load() } catch (error) { console.error(error) } finally { setLoading(false) } } loadData() }, []) const dataAPBDes = state.findMany.data || [] return ( Anggaran Pendapatan & Belanja Desa (APBDes) Laporan transparansi APBDes Desa Darmasaba sebagai bentuk keterbukaan dan akuntabilitas pengelolaan anggaran desa. {loading ? (
Sedang memuat data APBDes...
) : dataAPBDes.length === 0 ? (
Belum ada data APBDes tersedia Data akan ditampilkan jika sudah diunggah oleh admin desa
) : ( {dataAPBDes.map((v: any, k: number) => ( {v.name} {v.jumlah} ))} )}
) } function DetailAPBDesaTable() { // 🔹 Dummy data const data = { tahun: 2024, pendapatan: [ { id: 1, nama: 'Pendapatan Asli Desa', anggaran: 32000000, realisasi: 6500000 }, { id: 2, nama: 'Dana Desa', anggaran: 125000000, realisasi: 120000000 }, { id: 3, nama: 'Bagi Hasil Pajak dan Retribusi', anggaran: 10000000, realisasi: 9000000 }, ], belanja: [ { id: 1, nama: 'Belanja Pegawai', anggaran: 80000000, realisasi: 75000000 }, { id: 2, nama: 'Belanja Barang & Jasa', anggaran: 50000000, realisasi: 42000000 }, ], pembiayaan: [ { id: 1, nama: 'Penerimaan Pembiayaan', anggaran: 15000000, realisasi: 15000000 }, { id: 2, nama: 'Pengeluaran Pembiayaan', anggaran: 10000000, realisasi: 8000000 }, ], }; const formatRupiah = (value: number) => new Intl.NumberFormat('id-ID', { minimumFractionDigits: 2, style: 'decimal', }).format(value); // 🔹 Helper buat render satu kategori (Pendapatan, Belanja, Pembiayaan) const renderSection = (title: string, items: any[]) => { const totalAnggaran = items.reduce((sum, i) => sum + Number(i.anggaran || 0), 0); const totalRealisasi = items.reduce((sum, i) => sum + Number(i.realisasi || 0), 0); const totalSelisih = totalAnggaran - totalRealisasi; const totalPersen = totalAnggaran ? (totalRealisasi / totalAnggaran) * 100 : 0; return ( {title.toUpperCase()} Uraian Anggaran (Rp) Realisasi (Rp) Lebih/(Kurang) (Rp) Persentase (%) {items.map((item, index) => { const selisih = Number(item.anggaran) - Number(item.realisasi); const persen = item.anggaran ? (item.realisasi / item.anggaran) * 100 : 0; return ( {`${index + 1}. ${item.nama}`} {formatRupiah(item.anggaran)} {formatRupiah(item.realisasi)} {formatRupiah(selisih)} {persen.toFixed(2)} ); })} Total {title} {formatRupiah(totalAnggaran)} {formatRupiah(totalRealisasi)} {formatRupiah(totalSelisih)} {totalPersen.toFixed(2)}
); }; return ( APB Desa Tahun {data.tahun} {renderSection('Pendapatan', data.pendapatan)} {renderSection('Belanja', data.belanja)} {renderSection('Pembiayaan', data.pembiayaan)} ); } function APBDesaProgress() { const data = { tahun: 2024, pendapatan: [ { id: 1, nama: 'Pendapatan Asli Desa', anggaran: 32000000, realisasi: 6500000 }, { id: 2, nama: 'Dana Desa', anggaran: 125000000, realisasi: 120000000 }, { id: 3, nama: 'Bagi Hasil Pajak dan Retribusi', anggaran: 10000000, realisasi: 9000000 }, ], belanja: [ { id: 1, nama: 'Belanja Pegawai', anggaran: 80000000, realisasi: 75000000 }, { id: 2, nama: 'Belanja Barang & Jasa', anggaran: 50000000, realisasi: 42000000 }, ], pembiayaan: [ { id: 1, nama: 'Penerimaan Pembiayaan', anggaran: 15000000, realisasi: 15000000 }, { id: 2, nama: 'Pengeluaran Pembiayaan', anggaran: 10000000, realisasi: 8000000 }, ], }; const formatRupiah = (value: number) => new Intl.NumberFormat('id-ID', { style: 'currency', currency: 'IDR', minimumFractionDigits: 2, }).format(value); const calcProgress = (items: any[]) => { const anggaran = items.reduce((sum, i) => sum + i.anggaran, 0); const realisasi = items.reduce((sum, i) => sum + i.realisasi, 0); const persen = anggaran ? (realisasi / anggaran) * 100 : 0; return { anggaran, realisasi, persen }; }; const pendapatan = calcProgress(data.pendapatan); const belanja = calcProgress(data.belanja); const pembiayaan = calcProgress(data.pembiayaan); const renderProgress = (label: string, dataset: any) => ( {label} {formatRupiah(dataset.realisasi)} | {formatRupiah(dataset.anggaran)} ); return ( Grafik APB Desa Tahun {data.tahun} {renderProgress('Pendapatan Desa', pendapatan)} {renderProgress('Belanja Desa', belanja)} {renderProgress('Pembiayaan Desa', pembiayaan)} ); } export default Page