Avg. Fuel Efficiency: ${fuelEff} km/L
`;
};
renderPerformanceAnalytics = () => {
const fuelData = vehicles.map(v => {
const vTrips = tripLogs.filter(t => t.vehicleId === v.id);
const totalDist = vTrips.reduce((s,t)=>s+t.dist, 0); const totalFuel = vTrips.reduce((s,t)=>s+t.fuel, 0);
return totalFuel > 0 ? totalDist / totalFuel : 0;
});
renderChart('fleet-fuel-chart', 'bar', { labels: vehicles.map(v => v.id), datasets: [{ label: 'km/L', data: fuelData, backgroundColor: 'rgba(8, 145, 178, 0.7)' }] }, { responsive: true, maintainAspectRatio: false, indexAxis: 'y' });
const driverScores = vehicles.map(v => ({ name: v.driver, score: (100 - (tripLogs.filter(t=>t.vehicleId===v.id).reduce((s,t)=>s+(t.braking || 0),0) * 5)).toFixed(0) })).sort((a,b) => b.score - a.score);
document.getElementById('fleet-driver-tbody').innerHTML = driverScores.map(d => `
| ${d.name} | ${d.score} |
`).join('');
const today = new Date('2025-06-30');
document.getElementById('fleet-maint-tbody').innerHTML = vehicles.sort((a,b) => new Date(a.nextMaint) - new Date(b.nextMaint)).map(v => {
const isOverdue = new Date(v.nextMaint) < today;
return `
| ${v.id} | ${new Date(v.nextMaint).toLocaleDateString()} | ${isOverdue ? 'OVERDUE' : 'Upcoming'} |
`;
}).join('');
};
renderManagementUI = () => {
elements.vehicleTbody.innerHTML = vehicles.map(v => `
| ${v.id} | ${v.driver} | |
`).join('');
elements.tripTbody.innerHTML = tripLogs.map(t => `
| ${t.vehicleId} | ${t.dist} km | ${t.fuel} L | |
`).join('');
document.getElementById('add-trip-vehicle').innerHTML = vehicles.map(v => `
`).join('');
};
window.fleetDownloadPDF = (contentId) => {
html2canvas(document.getElementById(contentId), { scale: 2 }).then(canvas => {
const pdf = new jspdf.jsPDF({ orientation: 'landscape', unit: 'pt', format: 'a4' });
pdf.addImage(canvas.toDataURL('image/png'), 'PNG', 40, 40, pdf.internal.pageSize.getWidth() - 80, 0);
pdf.save(`Fleet_${contentId.split('-')[0]}_Report.pdf`);
});
};
initialize();
});