Continuing Education Hours Tracker
ANA›Life Services Authority›National 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
- Drink Cost Calculator
- Proof Conversion Calculator
- Wine Aging Estimator
- Cocktail Recipe Scaler
- Bar Inventory Cost Calculator
- Distillation Yield Calculator