`;
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 = `
`;
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');
});
Order Fraud Analysis Report
| 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'} |
