R

เคจเคฎเคธเฅเคคเฅ‡, Ramesh Sharma!

๐Ÿ“ Kathmandu | ๐Ÿ“ž 9841234567 | โœ‰๏ธ ramesh@example.com

Customer since: 2079 โœ… KYC Verified
+ Buy New Policy
๐Ÿ“„
-
Active Policies
Loading...
๐Ÿ“‹
-
Total Claims
๐Ÿ’ฐ
-
Annual Premium
๐Ÿ”„
-
Renewals Due
This month

Quick Actions

Recent Policies

View All โ†’
let allClaims = []; // ---- Section Navigation ---- function showSection(name, navItem) { document.querySelectorAll('[id^="section-"]').forEach(s => s.classList.add('hidden')); const target = document.getElementById(`section-${name}`); if (target) target.classList.remove('hidden'); if (navItem) { document.querySelectorAll('.sidebar-nav-item').forEach(i => i.classList.remove('active')); navItem.classList.add('active'); } else { // Find and activate the matching nav item document.querySelectorAll('.sidebar-nav-item').forEach(item => { if (item.getAttribute('href') === `#${name}`) { item.classList.add('active'); } }); } // Close mobile sidebar document.getElementById('sidebar')?.classList.remove('open'); document.getElementById('sidebarOverlay')?.classList.remove('open'); window.scrollTo({ top: 0, behavior: 'smooth' }); } // ---- Load Data ---- async function loadDashboardData() { try { const [policiesData, claimsData] = await Promise.all([ API.get('policies', { limit: 20 }), API.get('claims', { limit: 20 }) ]); allPolicies = policiesData.data || []; allClaims = claimsData.data || []; updateStats(); renderRecentPolicies(); renderPoliciesList(); renderClaimsList(); renderRenewalsList(); renderDocumentsList(); // Update badges document.getElementById('policyBadge').textContent = allPolicies.filter(p => p.status === 'active').length; document.getElementById('claimsBadge').textContent = allClaims.filter(c => c.status === 'pending' || c.status === 'under-review').length; } catch(e) { console.error('Failed to load dashboard data:', e); } } function updateStats() { const activePolicies = allPolicies.filter(p => p.status === 'active'); const totalPremium = activePolicies.reduce((sum, p) => sum + (p.premium || 0), 0); const expiredSoon = allPolicies.filter(p => { if (!p.end_date) return false; const end = new Date(p.end_date); const diff = (end - new Date()) / (1000 * 60 * 60 * 24); return diff > 0 && diff <= 30; }); document.getElementById('totalPolicies').textContent = activePolicies.length; document.getElementById('totalClaims').textContent = allClaims.length; document.getElementById('totalPremium').textContent = `NPR ${totalPremium.toLocaleString()}`; document.getElementById('renewalDue').textContent = expiredSoon.length; document.getElementById('policiesChange').textContent = `${allPolicies.length} total policies`; } function policyCardHTML(pol) { const catColors = { health: '#0e9f6e', life: '#1a3a6b', motor: '#e85d26', travel: '#7e3af2', home: '#1c64f2', crop: '#c27803' }; const color = catColors[pol.category] || '#1a3a6b'; const icon = categoryIcons[pol.category] || '๐Ÿ›ก๏ธ'; const daysLeft = pol.end_date ? Math.floor((new Date(pol.end_date) - new Date()) / (1000*60*60*24)) : null; return `
${icon}

${pol.product_name}

${statusBadge(pol.status)} ${daysLeft !== null && daysLeft <= 30 && pol.status === 'active' ? `โš ๏ธ Expires in ${daysLeft} days` : ''}
Policy: ${pol.policy_number}
${pol.insurer_name}Insurer
NPR ${pol.sum_insured.toLocaleString()}Sum Insured
NPR ${pol.premium.toLocaleString()}/yrPremium
${formatDate(pol.end_date)}Expiry Date
${pol.status === 'expired' ? `` : ''} ${pol.status === 'active' ? `` : ''}
`; } function renderRecentPolicies() { const container = document.getElementById('recentPolicies'); const recent = allPolicies.slice(0, 2); if (!recent.length) { container.innerHTML = `
๐Ÿ“„

No policies yet

Browse and buy your first insurance plan

Browse Plans
`; return; } container.innerHTML = recent.map(policyCardHTML).join(''); } function renderPoliciesList(filterStatus = 'all') { const container = document.getElementById('policiesList'); const filtered = filterStatus === 'all' ? allPolicies : allPolicies.filter(p => p.status === filterStatus); if (!filtered.length) { container.innerHTML = `
๐Ÿ“„

No policies found

`; return; } container.innerHTML = filtered.map(policyCardHTML).join(''); } function filterPolicies(status, btn) { document.querySelectorAll('#section-policies .filter-chip').forEach(c => c.classList.remove('active')); btn?.classList.add('active'); renderPoliciesList(status); } function renderClaimsList() { const container = document.getElementById('claimsList'); if (!allClaims.length) { container.innerHTML = `
๐Ÿ“‹

No claims submitted yet

In case of an emergency, file a claim and our team will help.

`; return; } const statusSteps = { pending: 1, 'under-review': 2, approved: 3, settled: 4, rejected: 1 }; container.innerHTML = allClaims.map(claim => `

${claim.customer_name} โ€” ${claim.category.toUpperCase()}

${statusBadge(claim.status)}
Policy: ${claim.policy_number} | Insurer: ${claim.insurer_name}
${claim.description}
NPR ${claim.claim_amount.toLocaleString()}
Claimed
${claim.settled_amount > 0 ? `
โœ… Settled: NPR ${claim.settled_amount.toLocaleString()}
` : ''}
${claim.status !== 'rejected' ? `
Claim Progress
${['Filed', 'Reviewing', 'Approved', 'Settled'].map((step, i) => `
${i < statusSteps[claim.status] ? 'โœ“' : i+1}
${step}
`).join('')}
` : `
โŒ Claim rejected. Please contact our helpline for assistance: 01-5970971
`}
${claim.status === 'pending' || claim.status === 'under-review' ? `` : ''}
`).join(''); } function renderRenewalsList() { const container = document.getElementById('renewalsList'); const expiring = allPolicies.filter(p => p.status === 'expired' || (p.end_date && (new Date(p.end_date) - new Date()) / (1000*60*60*24) <= 60)); if (!expiring.length) { container.innerHTML = `
โœ…

All policies are up to date

No renewals due at this time

`; return; } container.innerHTML = expiring.map(pol => policyCardHTML(pol)).join(''); } function renderDocumentsList() { const container = document.getElementById('documentsList'); container.innerHTML = allPolicies.map(pol => `
๐Ÿ“„

${pol.product_name} โ€” Policy Document

Policy No: ${pol.policy_number} | ${pol.insurer_name}
Issued: ${formatDate(pol.start_date)} | Valid till: ${formatDate(pol.end_date)}
`).join('') || `
๐Ÿ“

No documents yet

`; } // ---- Submit Claim ---- async function submitClaim(e) { e.preventDefault(); const btn = e.target.querySelector('button[type=submit]'); btn.textContent = 'Submitting...'; btn.disabled = true; try { await API.create('claims', { policy_number: document.getElementById('claimPolicyNo').value, customer_name: 'Ramesh Sharma', insurer_id: document.getElementById('claimInsurer').value, insurer_name: document.getElementById('claimInsurer').options[document.getElementById('claimInsurer').selectedIndex].text, category: document.getElementById('claimCategory').value, claim_amount: parseInt(document.getElementById('claimAmount').value), settled_amount: 0, status: 'pending', filed_date: document.getElementById('claimDate').value || new Date().toISOString().split('T')[0], settled_date: '', description: document.getElementById('claimDesc').value }); showToast('โœ… Claim submitted successfully! Reference ID sent to your phone.', 'success'); document.getElementById('claimForm').reset(); showSection('claims', null); await loadDashboardData(); } catch(err) { showToast('โŒ Failed to submit claim. Please try again.', 'error'); } finally { btn.textContent = '๐Ÿ“ค Submit Claim'; btn.disabled = false; } }