${order.productName}
${order.supplier || 'N/A'}
|
${order.status === 'Canceled' ? '-' : formatCurrency(profit)} |
|
`;
ordersTableBody.innerHTML += row;
});
};
const addOrder = (e) => {
e.preventDefault();
const newOrder = {
id: nextOrderId++,
productName: e.target.elements['product-name'].value,
supplier: e.target.elements['supplier'].value,
salePrice: parseFloat(e.target.elements['sale-price'].value),
productCost: parseFloat(e.target.elements['product-cost'].value),
shippingCost: parseFloat(e.target.elements['shipping-cost'].value),
status: 'Pending'
};
state.orders.unshift(newOrder);
e.target.reset();
renderAll();
};
const removeOrder = (id) => {
state.orders = state.orders.filter(o => o.id !== id);
renderAll();
};
window.removeOrder = removeOrder;
const updateOrderStatus = (id, newStatus) => {
const order = state.orders.find(o => o.id === id);
if(order) order.status = newStatus;
renderAll();
};
window.updateOrderStatus = updateOrderStatus;
const handleDownloadPdf = () => {
const pdfContentEl = document.getElementById('pdf-content');
if (!pdfContentEl) return;
// Populate PDF
document.getElementById('pdf-timestamp').textContent = new Date().toLocaleString('en-US');
document.getElementById('pdf-summary-revenue').textContent = summaryRevenueEl.textContent;
document.getElementById('pdf-summary-costs').textContent = summaryCostsEl.textContent;
document.getElementById('pdf-summary-profit').textContent = summaryProfitEl.textContent;
document.getElementById('pdf-summary-margin').textContent = summaryMarginEl.textContent;
const pdfTableContainer = document.getElementById('pdf-table-container');
let tableHTML = `
| Product |
Supplier |
Status |
Sale Price |
Total Cost |
Profit |
`;
state.orders.forEach(order => {
const totalCost = order.productCost + order.shippingCost;
const profit = order.salePrice - totalCost;
tableHTML += `
| ${order.productName} |
${order.supplier} |
${order.status} |
${formatCurrency(order.salePrice)} |
${formatCurrency(totalCost)} |
${order.status === 'Canceled' ? '-' : formatCurrency(profit)} |
`;
});
tableHTML += '
';
pdfTableContainer.innerHTML = tableHTML;
pdfContentEl.classList.remove('hidden');
html2canvas(pdfContentEl, { scale: 2 }).then(canvas => {
pdfContentEl.classList.add('hidden');
const imgData = canvas.toDataURL('image/png');
const pdf = new jsPDF({ orientation: 'landscape', unit: 'pt', format: 'a4' });
const pdfWidth = pdf.internal.pageSize.getWidth();
const margin = 40;
const imgWidth = pdfWidth - (margin * 2);
const imgHeight = (canvas.height * imgWidth) / canvas.width;
pdf.addImage(imgData, 'PNG', margin, margin, imgWidth, imgHeight);
pdf.save('dropshipping-order-report.pdf');
}).catch(err => {
console.error("Error generating PDF:", err);
pdfContentEl.classList.add('hidden');
});
};
const formatCurrency = (val) => new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(val);
// --- Event Listeners & Initial Load ---
addOrderForm.addEventListener('submit', addOrder);
pdfBtn.addEventListener('click', handleDownloadPdf);
// Sample Data
const sampleOrders = [
{ productName: 'Ergonomic Office Chair', supplier: 'Comfort Seating Co.', salePrice: 299.99, productCost: 150.00, shippingCost: 25.00, status: 'Delivered'},
{ productName: 'Wireless Mechanical Keyboard', supplier: 'TechGear', salePrice: 129.50, productCost: 70.00, shippingCost: 10.00, status: 'Shipped'},
{ productName: '4K Ultra-Wide Monitor', supplier: 'Vision Displays', salePrice: 799.00, productCost: 550.00, shippingCost: 40.00, status: 'Pending'},
{ productName: 'Noise-Cancelling Headphones', supplier: 'SoundWave Audio', salePrice: 199.00, productCost: 95.00, shippingCost: 0.00, status: 'Canceled'}
];
sampleOrders.forEach(o => {
state.orders.push({id: nextOrderId++, ...o});
});
renderAll();
});