'use client';
import colors from '@/con/colors';
import { Box, Paper, Progress, Stack, Text, Title } from '@mantine/core';
import { APBDesData } from './types';
function formatRupiah(value: number) {
return new Intl.NumberFormat('id-ID', {
style: 'currency',
currency: 'IDR',
minimumFractionDigits: 2,
}).format(value);
}
interface APBDesProgressProps {
apbdesData: APBDesData;
}
function APBDesProgress({ apbdesData }: APBDesProgressProps) {
// Return null if apbdesData is not available yet
if (!apbdesData) {
return (
Grafik Pelaksanaan APBDes
Tidak ada data APBDes tersedia.
);
}
const items = Array.isArray(apbdesData.items) ? apbdesData.items : [];
// Show message if no items exist
if (items.length === 0) {
return (
Grafik Pelaksanaan APBDes Tahun {apbdesData.tahun || 'N/A'}
Tidak ada rincian anggaran tersedia untuk tahun ini.
);
}
const sortedItems = [...items].sort((a, b) => a.kode.localeCompare(b.kode));
// Kelompokkan berdasarkan tipe
const pendapatanItems = sortedItems.filter(item => item.tipe === 'pendapatan');
const belanjaItems = sortedItems.filter(item => item.tipe === 'belanja');
const pembiayaanItems = sortedItems.filter(item => item.tipe === 'pembiayaan');
// Items without a type (should be filtered out from calculations)
const untypedItems = sortedItems.filter(item => !item.tipe);
if (untypedItems.length > 0) {
console.warn(`Found ${untypedItems.length} items without a type. These will be excluded from calculations.`);
}
// Hitung total per kategori
const calcTotal = (items: { anggaran: number; realisasi: number }[]) => {
const anggaran = items.reduce((sum, item) => sum + item.anggaran, 0);
// Use realisasi field (already mapped from totalRealisasi in transformAPBDesData)
const realisasi = items.reduce((sum, item) => sum + (item.realisasi || 0), 0);
const persen = anggaran > 0 ? (realisasi / anggaran) * 100 : 0;
return { anggaran, realisasi, persen };
};
const pendapatan = calcTotal(pendapatanItems);
const belanja = calcTotal(belanjaItems);
const pembiayaan = calcTotal(pembiayaanItems);
// Render satu progress bar
const renderProgress = (label: string, dataset: { realisasi: number; anggaran: number; persen: number }) => {
const isPembiayaan = label.includes('Pembiayaan');
return (
{label}
{formatRupiah(dataset.realisasi)} | {formatRupiah(dataset.anggaran)}
);
};
return (
Grafik Pelaksanaan APBDes Tahun {apbdesData.tahun || 'N/A'}
Realisasi | Anggaran
{renderProgress('Pendapatan Desa', pendapatan)}
{renderProgress('Belanja Desa', belanja)}
{renderProgress('Pembiayaan Desa', pembiayaan)}
);
}
export default APBDesProgress;