`;
techs[tech].forEach(entry => {
const desc = escapeHtml(entry.beskrivelse || entry.description || 'Ingen beskrivelse');
const status = entry.entry_status || entry.status || 'kladde';
let cssClass = 'time-v1-entry-kladde';
if (status === 'afventer' || status === 'pending') cssClass = 'time-v1-entry-pending';
if (status === 'godkendt' || status === 'billed' || status === 'approved' || entry.fakturerbar_tid_min > 0) cssClass = 'time-v1-entry-godkendt';
const startObj = new Date(entry.start_tid);
let durationMin = 30; // default length
if (entry.faktisk_tid_min) {
durationMin = parseInt(entry.faktisk_tid_min);
} else if (entry.original_hours || entry.timer) {
durationMin = Math.round(parseFloat(entry.original_hours || entry.timer) * 60);
}
let startH = startObj.getHours();
let startM = startObj.getMinutes();
if (startH < START_HOUR) {
durationMin -= ((START_HOUR * 60) - (startH * 60 + startM));
startH = START_HOUR;
startM = 0;
}
let topPx = ((startH - START_HOUR) + (startM / 60)) * HOUR_HEIGHT;
let heightPx = (durationMin / 60) * HOUR_HEIGHT;
if (topPx < 0) topPx = 0;
if (topPx + heightPx > TOTAL_HOURS * HOUR_HEIGHT) {
heightPx = (TOTAL_HOURS * HOUR_HEIGHT) - topPx;
}
if (heightPx > 5 && topPx < TOTAL_HOURS * HOUR_HEIGHT) {
const endObj = new Date(startObj.getTime() + durationMin * 60000);
const timeStr = `${startObj.getHours().toString().padStart(2,'0')}:${startObj.getMinutes().toString().padStart(2,'0')} - ${endObj.getHours().toString().padStart(2,'0')}:${endObj.getMinutes().toString().padStart(2,'0')}`;
html += `
`;
}
});
html += `