import { useEffect, useMemo, useState } from 'react'; import { CheckCircle2 } from 'lucide-react'; import { AIDecisionCard, Button, Card, formatINR, Input, MultiSelect, RupeeAmount, SelectField, } from '../'; import { LookupField } from '../form'; import type { LookupValue } from '../form'; import { useQuery, useZino } from '../../api/provider'; import { decisionToCard } from '../../api/adapters'; import { fieldFromSchema } from '../../api/schema'; import { ACTIVITIES } from '../../api/config'; import type { ActivityBodyProps } from './types'; import type { LeadRecord } from '../../api/types'; const F = ACTIVITIES.RECOMMEND_PRODUCT.fields; function indicativePremium(sum: number, freq: string): number { const base = Math.round(sum * 0.00142); switch (freq) { case 'monthly': return Math.round((base / 12) * 1.04); case 'half_yearly': return Math.round((base / 2) * 1.02); case 'quarterly': return Math.round((base / 4) * 1.03); default: return base; } } function toRiderValues(raw: LeadRecord['riders']): string[] { if (!raw) return []; if (Array.isArray(raw)) return raw as string[]; return String(raw) .split(',') .map((s) => s.trim()) .filter(Boolean); } export function RecommendBody({ instanceId, record, onSuccess }: ActivityBodyProps) { const { client } = useZino(); const schemaQ = useQuery(() => client.formSchema(ACTIVITIES.RECOMMEND_PRODUCT.uid, instanceId), [instanceId]); const productField = useMemo(() => fieldFromSchema(schemaQ.data, F.product), [schemaQ.data]); const freqOptions = useMemo(() => fieldFromSchema(schemaQ.data, F.premiumFrequency)?.options ?? [], [schemaQ.data]); const riderOptions = useMemo(() => fieldFromSchema(schemaQ.data, F.riders)?.options ?? [], [schemaQ.data]); const [product, setProduct] = useState(null); const [sum, setSum] = useState(2000000); const [freq, setFreq] = useState('annual'); const [premium, setPremium] = useState(0); const [premiumTouched, setPremiumTouched] = useState(false); const [riders, setRiders] = useState(['critical_illness', 'accidental_death']); const [notes, setNotes] = useState(''); useEffect(() => { if (!record) return; setProduct((record.recommended_product as LookupValue) ?? null); setSum(record.sum_assured || 2000000); setFreq(record.premium_frequency || 'annual'); setRiders(toRiderValues(record.riders)); setNotes(record.recommendation_notes || ''); setPremiumTouched(false); if (record.premium_amount) { setPremium(record.premium_amount); setPremiumTouched(true); } }, [record]); const computed = indicativePremium(sum, freq); const effectivePremium = premiumTouched ? premium : computed; const [submitting, setSubmitting] = useState(false); const [result, setResult] = useState<{ ok: boolean; msg: string } | null>(null); const incomeMultiple = record?.annual_income ? (sum / record.annual_income).toFixed(1) : '—'; async function submit() { if (!product) { setResult({ ok: false, msg: 'Pick a product from the catalogue.' }); return; } setSubmitting(true); setResult(null); try { const res = await client.performActivity(instanceId, ACTIVITIES.RECOMMEND_PRODUCT.uid, { [F.product]: product, [F.sumAssured]: sum, [F.premiumAmount]: effectivePremium, [F.premiumFrequency]: freq, [F.riders]: riders, [F.notes]: notes, }); setResult({ ok: true, msg: 'Recommendation submitted — lead advanced to Product Recommended.' }); onSuccess?.(res); } catch (e) { setResult({ ok: false, msg: e instanceof Error ? e.message : ((e as { message?: string })?.message ?? 'Submit failed') }); } finally { setSubmitting(false); } } return (
{result && (
{result.ok && } {result.msg}
)}
{productField && ( )} setSum(Number(e.target.value) || 0)} /> { setPremium(Number(e.target.value) || 0); setPremiumTouched(true); }} />