/* eslint-disable @typescript-eslint/no-explicit-any */ import { Paper, Title, Progress, Stack, Text, Group, Box, rem } from '@mantine/core' import { IconArrowUpRight, IconArrowDownRight } from '@tabler/icons-react' import { APBDes, APBDesItem, SummaryData } from '../types/apbdes' interface SummaryProps { title: string data: APBDesItem[] icon?: React.ReactNode } function Summary({ title, data, icon }: SummaryProps) { if (!data || data.length === 0) return null const totalAnggaran = data.reduce((sum, i) => sum + i.anggaran, 0) // Hitung total realisasi dari realisasiItems (konsisten dengan RealisasiTable) const totalRealisasi = data.reduce((sum, i) => { if (i.realisasiItems && i.realisasiItems.length > 0) { return sum + i.realisasiItems.reduce((sumReal, real) => sumReal + (real.jumlah || 0), 0) } return sum }, 0) const persentase = totalAnggaran > 0 ? (totalRealisasi / totalAnggaran) * 100 : 0 const formatRupiah = (angka: number) => { return new Intl.NumberFormat('id-ID', { style: 'currency', currency: 'IDR', minimumFractionDigits: 0, maximumFractionDigits: 0, }).format(angka) } const getProgressColor = (persen: number) => { if (persen >= 100) return 'teal' if (persen >= 80) return 'blue' if (persen >= 60) return 'yellow' return 'red' } const getStatusMessage = (persen: number) => { if (persen >= 100) { return { text: 'Realisasi mencapai 100% dari anggaran', color: 'teal' } } if (persen >= 80) { return { text: 'Realisasi baik, mendekati target', color: 'blue' } } if (persen >= 60) { return { text: 'Realisasi cukup, perlu ditingkatkan', color: 'yellow' } } return { text: 'Realisasi rendah, perlu perhatian khusus', color: 'red' } } const statusMessage = getStatusMessage(persentase) return ( {icon} {title} {persentase >= 100 ? ( ) : persentase < 60 ? ( ) : null} {persentase.toFixed(1)}% Realisasi: {formatRupiah(totalRealisasi)} {' '}/ Anggaran: {formatRupiah(totalAnggaran)} {persentase >= 100 && '✓ '}{statusMessage.text} ) } interface GrafikRealisasiProps { apbdesData: APBDes } export default function GrafikRealisasi({ apbdesData }: GrafikRealisasiProps) { const items = apbdesData?.items || [] const tahun = apbdesData?.tahun || new Date().getFullYear() const pendapatan = items.filter((i: APBDesItem) => i.tipe === 'pendapatan') const belanja = items.filter((i: APBDesItem) => i.tipe === 'belanja') const pembiayaan = items.filter((i: APBDesItem) => i.tipe === 'pembiayaan') return ( GRAFIK REALISASI APBDes {tahun} 💰 } /> 💸 } /> 📊 } /> ) }