export function formatRupiah(value: number): string { const formatted = Math.abs(value).toLocaleString('id-ID'); return `${value < 0 ? '-' : ''}Rp ${formatted}`; } /** Format angka mentah (string digit) jadi ribuan ber-titik, misal "50000" -> "50.000" */ export function formatRibuan(raw: string): string { if (!raw) return ''; const n = Number(raw); if (!Number.isFinite(n)) return raw; return n.toLocaleString('id-ID'); } export function formatRupiahShort(value: number): string { if (Math.abs(value) >= 1_000_000) { const juta = value / 1_000_000; return `Rp ${juta.toLocaleString('id-ID', { maximumFractionDigits: 1 })} jt`; } if (Math.abs(value) >= 1_000) { const ribu = value / 1_000; return `Rp ${ribu.toLocaleString('id-ID', { maximumFractionDigits: 1 })} rb`; } return formatRupiah(value); } export function formatDate(iso: string): string { const d = new Date(iso); return d.toLocaleDateString('id-ID', { day: 'numeric', month: 'short', year: 'numeric', }); } export function formatDateTime(iso: string): string { const d = new Date(iso); const date = d.toLocaleDateString('id-ID', { day: 'numeric', month: 'short' }); const time = d.toLocaleTimeString('id-ID', { hour: '2-digit', minute: '2-digit', }); return `${date} ยท ${time}`; } export function todayLabel(): string { return new Date().toLocaleDateString('id-ID', { weekday: 'long', day: 'numeric', month: 'long', year: 'numeric', }); } /** Kunci minggu ISO sederhana: tanggal Senin (YYYY-MM-DD) */ export function isoWeekKey(d: Date): string { const date = new Date(d); const day = date.getDay() || 7; // Senin=1, ..., Minggu=7 date.setDate(date.getDate() - (day - 1)); date.setHours(0, 0, 0, 0); return date.toISOString().slice(0, 10); } export function shiftWeekKey(key: string, deltaWeeks: number): string { const monday = new Date(`${key}T00:00:00Z`); monday.setUTCDate(monday.getUTCDate() + deltaWeeks * 7); return monday.toISOString().slice(0, 10); }