Continuing Education Hours Tracker

ANALife Services AuthorityNational Calculator Authority›Continuing Education Hours Tracker

.calc-container { max-width: 640px; margin: 2rem 0; padding: 1.5rem; background: #fff; border: 1px solid #ddd; border-radius: 8px; box-shadow: 0 1px 3px rgba(0,0,0,0.06); font-family: system-ui, -apple-system, sans-serif; } .calc-container h3 { font-family: Georgia, serif; font-size: 1.15rem; color: #1a1a1a; margin-bottom: 1rem; padding-bottom: 0.5rem; border-bottom: 2px solid var(--ac, #3d5a80); } .calc-row { display: flex; align-items: center; gap: 0.75rem; margin-bottom: 0.75rem; flex-wrap: wrap; } .calc-row label { min-width: 160px; font-size: 0.9rem; color: #333; font-weight: 500; } .calc-row input[type="number"], .calc-row select { flex: 1; min-width: 120px; max-width: 200px; padding: 0.5rem 0.6rem; border: 1px solid #ccc; border-radius: 4px; font-size: 0.9rem; font-family: system-ui, sans-serif; color: #1a1a1a; background: #fafaf8; } .calc-row input:focus, .calc-row select:focus { outline: none; border-color: var(--ac, #3d5a80); box-shadow: 0 0 0 2px rgba(26,74,138,0.12); } .calc-row .unit { font-size: 0.82rem; color: #888; min-width: 30px; } .calc-btn { display: inline-block; margin-top: 0.5rem; padding: 0.55rem 1.5rem; background: var(--ac, #3d5a80); color: #fff; border: none; border-radius: 4px; font-size: 0.9rem; font-weight: 600; cursor: pointer; font-family: system-ui, sans-serif; } .calc-btn:hover { opacity: 0.9; } .calc-result { margin-top: 1.25rem; padding: 1rem 1.25rem; background: #f0f6fc; border-left: 3px solid var(--ac, #3d5a80); border-radius: 0 6px 6px 0; display: none; } .calc-result.visible { display: block; } .calc-result-label { font-size: 0.78rem; text-transform: uppercase; letter-spacing: 0.06em; color: #666; margin-bottom: 0.25rem; } .calc-result-value { font-size: 1.6rem; font-weight: 700; color: var(--ac, #3d5a80); } .calc-result-detail { font-size: 0.85rem; color: #555; margin-top: 0.5rem; line-height: 1.5; } .calc-note { margin-top: 1rem; font-size: 0.8rem; color: #888; font-style: italic; } .calc-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 0.75rem; margin-top: 0.75rem; } .calc-grid-item { padding: 0.6rem 0.8rem; background: #f8f9fa; border-radius: 4px; border: 1px solid #eee; } .calc-grid-item .label { font-size: 0.75rem; color: #888; text-transform: uppercase; letter-spacing: 0.04em; } .calc-grid-item .value { font-size: 1.1rem; font-weight: 600; color: #1a1a1a; } @media (max-width: 720px) { .calc-row { flex-direction: column; align-items: flex-start; gap: 0.3rem; } .calc-row label { min-width: auto; } .calc-row input[type="number"], .calc-row select { max-width: 100%; width: 100%; } .calc-grid { grid-template-columns: 1fr; } } .calc-chart { margin: 1rem 0; text-align: center; } .calc-chart svg { max-width: 100%; height: auto; } .calc-chart-legend { display: flex; flex-wrap: wrap; justify-content: center; gap: 0.6rem 1.2rem; margin-top: 0.6rem; font-size: 0.8rem; color: #555; } .calc-chart-legend span { display: inline-flex; align-items: center; gap: 0.3rem; } .calc-chart-legend i { display: inline-block; width: 10px; height: 10px; border-radius: 2px; font-style: normal; } .calc-related { max-width: 640px; margin: 2rem 0 1rem; padding: 1.25rem 1.5rem; background: #f8f9fa; border: 1px solid #e8e8e8; border-radius: 8px; } .calc-related h3 { font-family: Georgia, serif; font-size: 1rem; color: #1a1a1a; margin: 0 0 0.75rem; padding-bottom: 0.4rem; border-bottom: 2px solid var(--ac, #3d5a80); } .calc-related-list { list-style: none; padding: 0; margin: 0 0 0.75rem; display: grid; grid-template-columns: 1fr 1fr; gap: 0.4rem 1.5rem; } .calc-related-list li a { font-size: 0.88rem; color: var(--ac, #3d5a80); text-decoration: none; } .calc-related-list li a:hover { text-decoration: underline; } .calc-browse-all { margin: 0.5rem 0 0; font-size: 0.9rem; font-weight: 600; } .calc-browse-all a { color: var(--ac, #3d5a80); text-decoration: none; } .calc-browse-all a:hover { text-decoration: underline; } @media (max-width: 720px) { .calc-related-list { grid-template-columns: 1fr; } }

Continuing Education Hours Tracker

Track your completed continuing education (CE) hours and determine how many more you need to meet your contractor license renewal requirements.

Total CE Hours Required per Renewal Cycle

CE Hours Already Completed

Required Safety/OSHA Hours (subset of total)

Safety/OSHA Hours Completed

Required Law/Code Hours (subset of total)

Law/Code Hours Completed

Months Until License Renewal

Average Hours per CE Course

Calculate CE Status

function conCalc() { var resultDiv = document.getElementById('con-result');

var requiredHours = parseFloat(document.getElementById('con-required-hours').value); var completedHours = parseFloat(document.getElementById('con-completed-hours').value); var safetyRequired = parseFloat(document.getElementById('con-safety-hours').value); var safetyCompleted = parseFloat(document.getElementById('con-safety-completed').value); var lawRequired = parseFloat(document.getElementById('con-law-hours').value); var lawCompleted = parseFloat(document.getElementById('con-law-completed').value); var renewalMonths = parseFloat(document.getElementById('con-renewal-months').value); var hoursPerCourse = parseFloat(document.getElementById('con-hours-per-course').value);

// Validation if (isNaN(requiredHours) || requiredHours safetyRequired) { resultDiv.innerHTML = 'Safety hours completed cannot exceed safety hours required.

'; return; } if (!isNaN(lawRequired) && !isNaN(lawCompleted) && lawCompleted > lawRequired) { resultDiv.innerHTML = 'Law/code hours completed cannot exceed law/code hours required.

'; return; } if (!isNaN(safetyRequired) && safetyRequired > requiredHours) { resultDiv.innerHTML = 'Required safety hours cannot exceed total required CE hours.

'; return; } if (!isNaN(lawRequired) && lawRequired > requiredHours) { resultDiv.innerHTML = 'Required law/code hours cannot exceed total required CE hours.

'; return; } if (isNaN(renewalMonths) || renewalMonths = requiredHours;

// Safety sub-requirement var safetyReqSet = !isNaN(safetyRequired) && safetyRequired > 0; var safetyCompSet = !isNaN(safetyCompleted) && safetyCompleted >= 0; var safetyGap = safetyReqSet ? Math.max(0, safetyRequired - (safetyCompSet ? safetyCompleted : 0)) : 0; var safetyPct = safetyReqSet ? Math.min(100, ((safetyCompSet ? safetyCompleted : 0) / safetyRequired) * 100) : null; var isSafetyMet = safetyReqSet ? safetyGap === 0 : true;

// Law/code sub-requirement var lawReqSet = !isNaN(lawRequired) && lawRequired > 0; var lawCompSet = !isNaN(lawCompleted) && lawCompleted >= 0; var lawGap = lawReqSet ? Math.max(0, lawRequired - (lawCompSet ? lawCompleted : 0)) : 0; var lawPct = lawReqSet ? Math.min(100, ((lawCompSet ? lawCompleted : 0) / lawRequired) * 100) : null; var isLawMet = lawReqSet ? lawGap === 0 : true;

// Effective remaining (must satisfy all sub-requirements too) // Total remaining = max of general gap vs sum of unmet sub-requirements var subGapTotal = safetyGap + lawGap; var effectiveRemaining = Math.max(remainingHours, subGapTotal);

// Courses needed var coursesNeeded = Math.ceil(effectiveRemaining / hoursPerCourse);

// Monthly pace needed var monthlyPaceNeeded = renewalMonths > 0 ? effectiveRemaining / renewalMonths : null; var coursesPerMonth = renewalMonths > 0 ? Math.ceil(coursesNeeded / renewalMonths) : null;

// Overall compliance status var allMet = isGeneralMet && isSafetyMet && isLawMet;

// Progress bar color
var barColor = completionPct ✔ Requirements Met'
'✘ Requirements Not Yet Met';

var html = '### CE Hours Summary ' + statusBadge + ' ';

// Progress bar html += ''; html += ''; html += 'Overall Progress' + completionPct.toFixed(1) + '%'; html += ''; html += ''; html += '';

html += 'CategoryRequiredCompletedRemainingStatus';

// General row html += 'General CE Hours' + requiredHours.toFixed(1) + ' hrs' + completedHours.toFixed(1) + ' hrs' + remainingHours.toFixed(1) + ' hrs' + (isGeneralMet ? '✔' : '✘') + '';

// Safety row if (safetyReqSet) { var sc = safetyCompSet ? safetyCompleted : 0; html += 'Safety / OSHA' + safetyRequired.toFixed(1) + ' hrs' + sc.toFixed(1) + ' hrs' + safetyGap.toFixed(1) + ' hrs' + (isSafetyMet ? '✔' : '✘') + ''; }

// Law row if (lawReqSet) { var lc = lawCompSet ? lawCompleted : 0; html += 'Law / Code' + lawRequired.toFixed(1) + ' hrs' + lc.toFixed(1) + ' hrs' + lawGap.toFixed(1) + ' hrs' + (isLawMet ? '✔' : '✘') + ''; }

html += '';

// Key metrics html += ''; html += '' + effectiveRemaining.toFixed(1) + 'Total Hours Still Needed'; html += '' + coursesNeeded + 'Courses Needed (@ ' + hoursPerCourse.toFixed(1) + ' hrs each)';

if (renewalMonths > 0) { html += '' + monthlyPaceNeeded.toFixed(1) + 'Hours/Month Required'; html += '' + coursesPerMonth + 'Courses/Month Required'; }

html += '';

// Renewal urgency note if (renewalMonths > 0 && !allMet) { if (renewalMonths

#### Formulas Used

Remaining General Hours = max(0, Required Hours − Completed Hours)

Remaining Safety Hours = max(0, Safety Required − Safety Completed)

Remaining Law/Code Hours = max(0, Law Required − Law Completed)

Effective Hours Remaining = max(General Remaining, Safety Gap + Law/Code Gap)

Courses Needed = ⌈ Effective Hours Remaining ÷ Avg Hours per Course ⌉

Monthly Pace Required = Effective Hours Remaining ÷ Months Until Renewal

Completion % = (Completed Hours ÷ Required Hours) × 100

#### Assumptions & References

More Calculators

References