// Shared Zakat calculation core — Nisab check + 2.5% (1/40) on qualifying // wealth held above threshold. Nisab is entered as a value, not a live gold // price feed — matches the app's "manual entry only" philosophy already // established for Asset Registry / Faraid. const ZAKAT_RATE = 0.025; // Rough starting points, NOT live prices — the app has no gold/silver price // feed (manual entry only, matching the rest of the app). These exist so a // new user isn't staring at a blank/zero Nisab field; they must still verify // today's actual 85g-gold-equivalent value before relying on the result. export const CURRENCY_BY_JURISDICTION = { MY: 'RM', SG: 'SGD', UK: 'GBP' }; export const DEFAULT_NISAB_BY_JURISDICTION = { MY: 24000, SG: 8000, UK: 5000 }; export function zakatableWealth(fields) { const gross = (Number(fields.cash) || 0) + (Number(fields.gold) || 0) + (Number(fields.silver) || 0) + (Number(fields.businessAssets) || 0) + (Number(fields.investments) || 0) + (Number(fields.otherZakatable) || 0); const deductible = Number(fields.deductibleLiabilities) || 0; return Math.max(0, gross - deductible); } export function zakatDue(fields) { const wealth = zakatableWealth(fields); const nisab = Number(fields.nisabThreshold) || 0; if (nisab <= 0 || wealth < nisab) return 0; return wealth * ZAKAT_RATE; } export function meetsNisab(fields) { const nisab = Number(fields.nisabThreshold) || 0; return nisab > 0 && zakatableWealth(fields) >= nisab; }