Real-Time Phishing & Scam Order Identifier

Real-Time Phishing & Scam Order Identifier

Analyze orders against customizable risk rules to flag suspicious activity.

Configure your orders and risk rules, then click "Analyze Orders" to see the fraud report.

No orders to analyze. Please add orders in the configuration tab.

`; downloadPdfBtn.disabled = true; return; } const riskStyles = { 'High': { bg: 'bg-red-100', text: 'text-red-800', border: 'border-red-500' }, 'Medium': { bg: 'bg-yellow-100', text: 'text-yellow-800', border: 'border-yellow-500' }, 'Low': { bg: 'bg-green-100', text: 'text-green-800', border: 'border-green-500' } }; analyzedOrders.forEach(order => { const styles = riskStyles[order.riskLevel]; const card = document.createElement('div'); card.className = `bg-white border-l-4 ${styles.border} rounded-r-lg shadow-md p-5 space-y-3`; card.innerHTML = `

Order ${order.orderId}

${order.email}

${order.riskLevel} Risk

Risk Factors:

    ${order.reasons.length > 0 ? order.reasons.map(r => `
  • ${r}
  • `).join('') : '
  • None Detected
  • '}
`; resultsContainer.appendChild(card); }); downloadPdfBtn.disabled = false; }; // --- CORE LOGIC --- const analyzeOrderRisk = (order, rules) => { let score = 0; let reasons = []; // Rule 1: High value order if (order.value >= rules.highValueThreshold) { score += 50; reasons.push(`High order value ($${order.value.toFixed(2)})`); } // Rule 2: Disposable email domain const emailDomain = order.email.split('@')[1]; if (emailDomain && rules.disposableDomains.includes(emailDomain.toLowerCase())) { score += 40; reasons.push(`Disposable email domain (${emailDomain})`); } // Rule 3: Risky address keywords const addressLower = order.address.toLowerCase(); if (rules.riskyAddressKeywords.some(keyword => addressLower.includes(keyword))) { score += 30; reasons.push('Address contains risky keywords (e.g., P.O. Box)'); } let riskLevel = 'Low'; if (score >= 70) riskLevel = 'High'; else if (score >= 30) riskLevel = 'Medium'; return { ...order, riskLevel, reasons }; }; // --- UI & EVENT HANDLERS --- const switchTab = (tabId) => { currentTab = tabId; Object.values(tabPanes).forEach(pane => pane.classList.add('hidden')); tabPanes[tabId].classList.remove('hidden'); Object.values(tabButtons).forEach(btn => btn.classList.replace('tab-active', 'tab-inactive')); tabButtons[tabId].classList.replace('tab-inactive', 'tab-active'); updateNavButtons(); }; const navigateTabs = (direction) => { const currentIndex = tabs.indexOf(currentTab); const newIndex = direction === 'next' ? currentIndex + 1 : currentIndex - 1; if (newIndex >= 0 && newIndex < tabs.length) switchTab(tabs[newIndex]); }; const updateNavButtons = () => { const currentIndex = tabs.indexOf(currentTab); prevBtn.disabled = currentIndex === 0; nextBtn.disabled = currentIndex === tabs.length - 1; prevBtn.classList.toggle('opacity-50', prevBtn.disabled); nextBtn.classList.toggle('opacity-50', nextBtn.disabled); }; const handleScanOrders = () => { scanOrdersBtnSpinner.classList.remove('hidden'); scanOrdersBtnText.textContent = 'Analyzing...'; scanOrdersBtn.disabled = true; setTimeout(() => { const rules = { highValueThreshold: parseFloat(document.getElementById('high-value-threshold').value) || 99999, disposableDomains: document.getElementById('disposable-domains').value.split('\n').map(d => d.trim().toLowerCase()).filter(Boolean), riskyAddressKeywords: document.getElementById('risky-address-keywords').value.split(',').map(k => k.trim().toLowerCase()).filter(Boolean) }; const analyzedOrders = orders.map(order => analyzeOrderRisk(order, rules)); renderScanResults(analyzedOrders); switchTab('dashboard'); scanOrdersBtnSpinner.classList.add('hidden'); scanOrdersBtnText.textContent = 'Analyze Orders'; scanOrdersBtn.disabled = false; }, 500); }; const handlePdfDownload = () => { const rules = { highValueThreshold: parseFloat(document.getElementById('high-value-threshold').value), disposableDomains: document.getElementById('disposable-domains').value.split('\n').map(d => d.trim().toLowerCase()), riskyAddressKeywords: document.getElementById('risky-address-keywords').value.split(',').map(k => k.trim().toLowerCase()) }; const analyzedOrders = orders.map(order => analyzeOrderRisk(order, rules)); if(analyzedOrders.length === 0) return; let pdfHtml = `

Order Fraud Analysis Report

${analyzedOrders.map(order => ` `).join('')}
Order ID Risk Level Details & Risk Factors
${order.orderId} ${order.riskLevel} Email: ${order.email}
Value: $${order.value.toFixed(2)}
Factors: ${order.reasons.length > 0 ? order.reasons.join(', ') : 'None'}
`; pdfRenderContainer.innerHTML = pdfHtml; html2canvas(pdfRenderContainer, { scale: 2 }).then(canvas => { const imgData = canvas.toDataURL('image/png'); const { jsPDF } = window.jspdf; const pdf = new jsPDF({ orientation: 'portrait', unit: 'pt', format: 'a4' }); const pdfWidth = pdf.internal.pageSize.getWidth(); const pdfHeight = (canvas.height * pdfWidth) / canvas.width; pdf.addImage(imgData, 'PNG', 0, 0, pdfWidth, pdfHeight); pdf.save('Fraud-Analysis-Report.pdf'); }); }; // --- EVENT LISTENERS --- window.switchTab = switchTab; window.navigateTabs = navigateTabs; scanOrdersBtn.addEventListener('click', handleScanOrders); downloadPdfBtn.addEventListener('click', handlePdfDownload); addOrderBtn.addEventListener('click', () => { const newOrder = { id: nextId++, orderId: `US-NEW-${nextId}`, email: 'new@example.com', address: '123 New Address', value: 0.00 }; orders.push(newOrder); renderConfigTable(); }); configTableBody.addEventListener('input', e => { if (e.target.classList.contains('config-input')) { const id = parseInt(e.target.closest('tr').dataset.id); const prop = e.target.dataset.prop; const order = orders.find(o => o.id === id); if (order) { const value = e.target.type === 'number' ? parseFloat(e.target.value) || 0 : e.target.value; order[prop] = value; } } }); configTableBody.addEventListener('click', e => { if (e.target.classList.contains('remove-row-btn')) { const idToRemove = parseInt(e.target.closest('tr').dataset.id); orders = orders.filter(o => o.id !== idToRemove); renderConfigTable(); } }); // --- INITIALIZATION --- renderConfigTable(); updateNavButtons(); switchTab('dashboard'); });
Scroll to Top