Calculates equitable overload compensation for college instructors based on institutional policies, enrollment thresholds, and regular teaching load limits. Compensation is awarded only for credit hours that exceed the regular load and meet minimum enrollment criteria. When enrollment is below a specified threshold, pay is prorated accordingly. The package prioritizes compensation from high-enrollment courses, or optionally from low-enrollment courses for fairness, depending on user-defined strategy. Includes tools for flexible policy settings, instructor filtering, and produces clean, audit-ready summary tables suitable for payroll and administrative reporting.
catool (Compensation Analysis Tool) is an R package that calculates fair and transparent overload pay for college instructors. It analyzes course schedules and applies institutional policy rules to determine qualified credit hours and compensation—prorated when needed.
# Install from GitHub
# install.packages("remotes")
remotes::install_github("dawit3000/catool")
Your course schedule data must include:
| Column | Description |
|---|---|
INSTRUCTOR |
Instructor’s name (e.g., “Smith, C”) |
ENRLD |
Enrollment in each course |
HRS |
Credit hours assigned per course |
Optional: SUBJ, DEPARTMENT, COLLEGE, and PROGRAM for advanced
filtering.
📂 Sample input: The
schedule.csv
file provides a realistic example of course schedule data used by the
package. It includes columns such as SUBJ, CRN, INSTRUCTOR,
DEPARTMENT, and COLLEGE.
library(catool)
schedule <- data.frame(
INSTRUCTOR = c("al-Abdul", "baxter", "Smith, Courtney"),
ENRLD = c(12, 7, 4),
HRS = c(3, 3, 3)
)
# Analyze one instructor
ol_comp(get_instructor_schedule("baxter", schedule))
# Apply one instructor with a custom policy
ol_comp(get_instructor_schedule("Smith", schedule),
L = 4, U = 9, rate_per_cr = 2500 / 3, reg_load = 12)
# Summarize full schedule (payroll-ready summary of all instructors)
ol_comp_summary(schedule)
# Filter by subject
filter_schedule(schedule, subject_pattern = "MATH|STAT")
filter_schedule(schedule, subject_pattern = "^MATH|^STAT") # Prefix match
# Filter by department
filter_schedule(schedule, department_pattern = "Business")
# Filter by instructor
get_instructor_schedule("davis", schedule)
# List all instructors
get_unique_instructors(schedule)
The ol_comp_summary() function returns a clean tibble with:
QHRS: Qualified credit hours above regular load, eligible for payPAY: Calculated compensation per rowTYPE: "PRO" where ENRLD < 10, blank otherwiseSUMMARY: Instructor headers, notes, and totalsNote: Pay is never per-course—only on qualified credit hours.
Default institutional policy:
Regular teaching load = 12 credit hours
Courses with ENRLD < 4 are excluded
Qualified credit hours beyond regular load are paid at $2,500 / 3
per hour
For ENRLD < 10, pay is prorated:
$$ \text{Compensation} = \left(\frac{\text{ENRLD}}{10}\right) \times \text{rate per CR} \times \text{qualified CR} $$
Overload hours are counted starting with the least-enrolled eligible courses
You can specify how regular teaching load is assigned when determining overload pay:
favor_institution = TRUE → Favor institutional interest →
Assign high-enrollment courses to regular load first → Leaves
low-enrollment courses for compensation → Results in less total
pay
favor_institution = FALSE → Favor instructor interest → Assign
low-enrollment courses to regular load first → Leaves
high-enrollment courses for compensation → Results in more total
pay
This option is supported in both ol_comp() and ol_comp_summary()
functions.