Asset Depreciation Dashboard

Book Value Over Time

Annual Depreciation Expense

Asset Name Purchase Date Initial Cost ($) Salvage Value ($) Useful Life (Yrs) Actions

Please add an asset or select one to view its depreciation schedule.

'; if(charts.bookValue) charts.bookValue.destroy(); if(charts.expense) charts.expense.destroy(); return; } let schedule = []; let bookValue = asset.cost; let accumulatedDep = 0; const life = asset.life; const salvage = asset.salvage; for (let year = 1; year <= life; year++) { let depreciationExpense = 0; const beginningBookValue = bookValue; if (bookValue <= salvage) { // Stop depreciating if book value is at or below salvage depreciationExpense = 0; } else if (method === 'straight-line') { depreciationExpense = (asset.cost - salvage) / life; } else if (method === 'double-declining') { const rate = 2 / life; depreciationExpense = beginningBookValue * rate; } // Adjust expense to not go below salvage value if (beginningBookValue - depreciationExpense < salvage) { depreciationExpense = beginningBookValue - salvage; } accumulatedDep += depreciationExpense; bookValue -= depreciationExpense; schedule.push({ year, beginningBookValue, depreciationExpense, accumulatedDep, endingBookValue: bookValue }); } renderScheduleTable(schedule); renderCharts(schedule); } // --- RENDER FUNCTIONS --- function renderScheduleTable(schedule) { const container = document.getElementById('depreciation-schedule-container'); let tableHTML = `
${schedule.map(row => ` `).join('')}
Year Beginning Book Value Depreciation Expense Accumulated Depreciation Ending Book Value
${row.year} ${formatCurrency(row.beginningBookValue)} ${formatCurrency(row.depreciationExpense)} ${formatCurrency(row.accumulatedDep)} ${formatCurrency(row.endingBookValue)}
`; container.innerHTML = tableHTML; } function renderCharts(schedule) { const labels = schedule.map(row => `Year ${row.year}`); const bookValueData = schedule.map(row => row.endingBookValue); const expenseData = schedule.map(row => row.depreciationExpense); // Book Value Line Chart const bvCtx = document.getElementById('book-value-chart').getContext('2d'); if (charts.bookValue) charts.bookValue.destroy(); charts.bookValue = new Chart(bvCtx, { type: 'line', data: { labels, datasets: [{ label: 'Book Value', data: bookValueData, borderColor: '#0369a1', tension: 0.1 }] }, options: { responsive: true, maintainAspectRatio: false } }); // Expense Bar Chart const exCtx = document.getElementById('depreciation-expense-chart').getContext('2d'); if (charts.expense) charts.expense.destroy(); charts.expense = new Chart(exCtx, { type: 'bar', data: { labels, datasets: [{ label: 'Depreciation Expense', data: expenseData, backgroundColor: '#0ea5e9' }] }, options: { responsive: true, maintainAspectRatio: false } }); } function updateAssetSelector() { const selectedId = parseInt(assetSelect.value); assetSelect.innerHTML = assetsData.map(a => ``).join(''); // Preserve selection if possible if (assetsData.some(a => a.id === selectedId)) { assetSelect.value = selectedId; } } function renderAssetManagerTable() { const tbody = document.querySelector('#assets-table tbody'); tbody.innerHTML = assetsData.map(asset => ` `).join(''); } // --- DATA MANIPULATION (CRUD) --- window.add_updateAsset = (id, key, value) => { const asset = assetsData.find(a => a.id === id); if(asset) asset[key] = value; renderAll(); }; window.add_addAsset = () => { const newAsset = { id: Date.now(), name: 'New Asset', date: new Date().toISOString().split('T')[0], cost: 10000, salvage: 1000, life: 5 }; assetsData.push(newAsset); renderAll(); }; window.add_removeAsset = (id) => { assetsData = assetsData.filter(a => a.id !== id); renderAll(); }; // --- INITIALIZATION & SAMPLE DATA --- function initialize() { assetsData = [ { id: 1, name: 'Company Vehicle', date: '2023-01-15', cost: 35000, salvage: 5000, life: 5 }, { id: 2, name: 'High-End Computer', date: '2024-03-20', cost: 4500, salvage: 300, life: 3 }, { id: 3, name: 'Office Machinery', date: '2022-07-01', cost: 150000, salvage: 15000, life: 10 } ]; assetSelect.addEventListener('change', calculateAndRenderSchedule); methodSelect.addEventListener('change', calculateAndRenderSchedule); renderAll(); } // --- PDF DOWNLOAD --- document.getElementById('add-download-pdf-btn').addEventListener('click', () => { const container = document.getElementById('add-tab-0'); const assetName = assetSelect.options[assetSelect.selectedIndex].text; html2canvas(container, { scale: 2 }).then(canvas => { const { jsPDF } = window.jspdf; const imgData = canvas.toDataURL('image/png'); const pdf = new jsPDF({ orientation: 'l', unit: 'mm', format: 'a4' }); pdf.text(`Depreciation Report for: ${assetName}`, 15, 15); const pdfWidth = pdf.internal.pageSize.getWidth(); const pdfHeight = pdf.internal.pageSize.getHeight(); const ratio = canvas.width / canvas.height; let imgWidth = pdfWidth - 20; let imgHeight = imgWidth / ratio; if(imgHeight > pdfHeight - 30) { imgHeight = pdfHeight - 30; imgWidth = imgHeight * ratio; } pdf.addImage(imgData, 'PNG', 10, 20, imgWidth, imgHeight); pdf.save(`${assetName}-Depreciation-Report.pdf`); }); }); initialize(); });
Scroll to Top