'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;