Recent Fraud Transactions
| ID | Cardholder | Amount | Type | Location |
${transactionRows}
`;
const ctx = getElem('fraudTypeChart').getContext('2d');
const chartLabels = Object.keys(currentData.typeCounts);
const chartData = Object.values(currentData.typeCounts);
if (fraudTypeChart) fraudTypeChart.destroy();
fraudTypeChart = new Chart(ctx, {
type: 'bar',
data: {
labels: chartLabels,
datasets: [{
label: '# of Incidents',
data: chartData,
backgroundColor: '#3B82F6',
}]
},
options: { responsive: true, maintainAspectRatio: false, indexAxis: 'y' }
});
downloadSection.classList.remove('hidden');
showTab(1);
};
analyzeBtn.addEventListener('click', analyzeFraud);
// --- PDF DOWNLOAD ---
const downloadPDF = () => {
if (!currentData) return;
const { jsPDF } = window.jspdf;
const pdf = new jsPDF({ orientation: 'portrait', unit: 'pt', format: 'a4' });
const btnText = getElem('pdf-btn-text');
const btnSpinner = getElem('pdf-btn-spinner');
btnText.classList.add('hidden');
btnSpinner.classList.remove('hidden');
downloadPdfBtn.disabled = true;
try {
const pageWidth = pdf.internal.pageSize.getWidth();
const margin = 40;
let y = margin;
pdf.setFont('helvetica', 'bold');
pdf.setFontSize(22);
pdf.text("Credit Card Fraud Activity Report", pageWidth / 2, y, { align: 'center' });
y += 15;
pdf.setFont('helvetica', 'normal');
pdf.setFontSize(10);
pdf.text(`Report Date: ${today.toLocaleDateString('en-US')}`, pageWidth / 2, y, { align: 'center' });
y += 35;
pdf.autoTable({
startY: y,
theme: 'grid',
head: [['Metric', 'Value']],
body: [
['Total Fraudulent Transactions', `${currentData.totalTransactions}`],
['Total Amount Lost', { content: `$${currentData.totalAmount.toLocaleString('en-US')}`, styles: {textColor: '#DC2626', fontStyle: 'bold'} }],
['Most Common Fraud Type', `${currentData.mostCommonType}`],
],
didDrawPage: (data) => { y = data.cursor.y; }
});
y += 20;
pdf.setFont('helvetica', 'bold');
pdf.text("Detailed Fraud Incidents", margin, y);
y += 15;
const tableData = currentData.transactions.map(t => [t.id, t.name, `$${t.amount.toFixed(2)}`, t.type, t.location]);
pdf.autoTable({
startY: y,
head: [['Transaction ID', 'Cardholder', 'Amount', 'Fraud Type', 'Location']],
body: tableData,
theme: 'striped',
headStyles: { fillColor: [29, 78, 216] }, // blue-700
});
pdf.save(`Fraud-Activity-Report.pdf`);
} catch(e) { console.error("PDF Generation failed:", e); }
finally {
btnText.classList.remove('hidden');
btnSpinner.classList.remove('hidden');
downloadPdfBtn.disabled = false;
}
};
downloadPdfBtn.addEventListener('click', downloadPDF);
initialize();
});