TESTING PLAYBOOK

ABC Education Module — Testing Playbook

Master the 8 sub-systems (Admin, Profiles, Courses, Enrollment, Grades/Attendance, Financial, Portal, Specialized Programs) with comprehensive testing strategies covering 89 features, 32+ business rules, and real-world scenario testing.

The Business

The Education module transforms how chapters deliver vocational training programs. It provides comprehensive tooling for managing modules, courses, instructors, students, attendance, grades, payments, and specialized training programs (OJT, correspondence, company-led). Chapters can now run professional education programs with full financial tracking and portal self-service for students and companies.
🎓 What Is the Education Module and Why It Matters

Chapters historically relied on spreadsheets and manual processes to manage education and training. This approach was error-prone, lacked accountability, and provided no member/student visibility into schedules, grades, or payments. The Education module formalizes the entire lifecycle: from curriculum design (modules, courses, crafts, levels) through registration, attendance tracking, grading, and payment collection.

What It Does: Chapter staff define work processes (OJT requirements) and modules (classroom curriculum), organize them by craft and level, create courses with schedules and instructors, enroll students, track attendance and grades, manage payments (student/company split), and issue invoices. Students and companies use the portal to register, view courses, submit OJT hours, and pay invoices.

Business Value: (1) Professional delivery—standardized curriculum and transparent grading; (2) Student/Company engagement—self-service portal increases participation; (3) Financial control—split payments and payment plans; (4) Data-driven decisions—reporting on attendance, completion, OJT progress; (5) Regulatory compliance—audit trails and historical records for state/program requirements.

🏗️ The 8 Sub-Systems: Core Education Architecture

The Education module is organized into 8 interdependent sub-systems. Each supports specific operational functions and links to others:

1. Admin Setup & Configuration

School years, semesters, lookup tables, module CRUD, work process CRUD, craft definitions, location management, document requests. Foundation for all other systems.

2. Profile Management

Instructor and student profiles with specializations, portal access, craft enrollments, company associations. Enables access control and student/instructor relationships.

3. Course & Curriculum Management

Course CRUD, module assignment, class schedule generation, course copying. Central hub for defining what and when students learn.

4. Student Course Enrollment

Add/browse/transfer/withdraw enrollments, level promotions, split utilities. Manages who takes what course and when.

5. Attendance, Grades & Performance

Session-based attendance recording, assignment/grade entry, performance evaluations. Tracks academic progress per student per course.

6. Financial Operations

Course pricing, payment responsibility (student/company/split), payment plans, invoicing, payment tracking. Revenue and collections management.

7. Portal Experience

Student/instructor/company portals: course catalog, registration, attendance snapshots, OJT submission, payment. Member-facing self-service.

8. Specialized Programs & Communications

OJT tracking, correspondence training, company-led training, mass communications, reporting (Metabase). Advanced features for specialized delivery modes.

👥 Key User Roles and Permissions

Chapter Staff (3 Levels): L1 (View Only) — browse, export, no changes. L2 (Edit) — modify modules, courses, enrollments, grades; cannot change permissions/settings. L3 (Admin) — full CRUD, all settings, mass communications, document requests.

Instructors: View assigned courses, record attendance/grades, performance evals. Cannot cancel classes or see financials. Portal access optional (chapter-controlled).

Students: Portal access. Browse courses, register (if enabled), view own courses, submit OJT hours monthly, pay invoices, download documents. Cannot see other students' data.

Companies: Portal access. View associated students' courses/OJT/training, verify OJT submissions, pay company-responsible invoices, download documents.

QA Focus for The Business Section

Understand the end-to-end journey: An instructor teaches a course, students enroll, they attend classes, instructors record grades, students may work OJT with their companies, systems generate invoices, students/companies pay via portal. Every sub-system must work in concert. Test holistically, not in isolation.

How It Works

A detailed technical walkthrough of the 8 sub-systems, their interdependencies, and the workflows that bind them together.
⚙️ Sub-System 1: Admin Setup & Configuration

School Year & Semester Management: Chapters define a school year (e.g., FY2026 Jan-Dec). Within it, semesters can be created/enabled/disabled. Cannot delete school years with active courses. Selector on all browse screens drives context for courses, enrollments, etc.

Module Management: Module ID + Name (unique), Hours (decimal), Level (Core/1-5), NCCER Edition tracking, Craft Association, Status. Bulk creation and edit supported. Cannot delete if assigned to active courses.

Work Process (OJT) Management: Work Process ID + Name (unique), Required Hours (whole numbers), Craft Association, Status. Tracks on-the-job training requirements per craft. Cannot reduce hours below max recorded student hours.

Craft Management: Craft Name, Description, Number of Levels, Status. Assign modules and work processes. Cannot delete if students enrolled. Serves as organizational spine for entire module.

Location Management: 3 types (Physical, Company, Virtual), each with different fields. Used for class scheduling and address resolution. Cannot delete/inactivate if active courses assigned.

Lookup Tables & Chapter Defaults: Attendance Types (e.g., Present, Absent, Makeup), Student Types, Level Notes, Assignment Types. Customizable per chapter.

👤 Sub-System 2: Profile Management

Instructor Profiles: Link to existing Individual, add Craft Specializations, enable/disable Portal Access (chapter controls via invite/remove), Status (Active/Inactive). Inactive instructors cannot be assigned to new courses. Section-based editing (main, courses, notes tabs). Change history tracked.

Student Profiles: Link to Individual (auto-create or link existing), Company Association (single primary + optionals), Craft Enrollment (per craft: Level, OJT flag, Correspondence flag, Company-Led flag + Lead Company). Portal Access managed by chapter. Status (Active/Inactive). All changes logged with user and timestamp.

Company Association Rules: A student has ONE primary company (for OJT verification routing, invoicing) and can have optional associations. Changing primary company routes ALL OJT submissions (past and future) to new company.

📚 Sub-System 3: Course & Curriculum Management

Course Creation (4-Section Wizard): (1) Course Info—Name (unique per school year), Description, Craft/Level, School Year, Semester, Capacity. (2) Location & Instructors—select location (Physical/Company/Virtual) with address or company fields, assign instructors. (3) Capacity & Registration—Capacity (warn but allow over-enrollment), Registration open/close dates, auto-decline if over. (4) Pricing & Payment—Member/Non-Member tuition, Payment Policy (Pay During Registration vs Pay By Date), Late Fees.

Module Assignment: Two-pane interface: available modules (left) vs assigned modules (right). Drag to add/remove, reorder by drag. Shows Module ID, Name, Hours, Level per module.

Class Schedule Generation: Specify date range or class count, system generates class sessions. Support for holidays/breaks (blackout dates). Editable grid shows Class#, Date, Start/End Time, Hours, Assigned Module. Manually adjustable.

Course Copying: Single or bulk utility. Options: copy modules (always), copy schedule (optional), copy instructors (optional). Copy rules ensure clean inheritance.

📝 Sub-System 4: Student Course Enrollment

Add Enrollment (Bulk): Select course, select students, set payment responsibility (Student/Company/Split % or $), select payment plan if applicable, confirm. Post-save: system generates invoices, sends confirmation emails to student/company if payer.

Browse Enrollments: Filter by course, student, status, school year. Columns: Student, Course, Enrollment Date, Status, Attendance %, Grade, Payment Status. Quick actions: view, transfer, withdraw.

Transfer Enrollment: Select target course, effective date, attendance handling (copy forward, reset, or manual). Validates capacity, resolves pricing. Posts new invoice if pricing differs.

Level Promotion (Bulk): Select craft, current level, target level. Process in reverse order (4→5 first, then 3→4, etc). Validates candidates, updates Craft Enrollment Status. If promoting to max level, set Status to Graduated/Completed.

📊 Sub-System 5: Attendance, Grades & Performance

Attendance Recording: Session-based (per class date). Select session, record Present/Absent/Makeup for each student. Makeup resets Hours Absent to zero. History view shows all attendance entries and edits. Summary shows total hours present, absent, percentage.

Grade Entry: Create assignments (by module/date), enter grades per student (percentage 0-100 or Pass/Fail). Optional retake handling. Multiple grade entries per student allowed. Summary shows current grade, all assignment grades, retake results.

Performance Evaluations: Module-based pass/fail evaluations. Select module, select session, record Pass/Fail per student. History and module summary tracked.

💰 Sub-System 6: Financial Operations

Payment Responsibility: Three models: (1) Student Pays—full amount to student invoice. (2) Company Pays—full amount to company invoice. (3) Split—percentage, dollar amount, or fee-specific split. Resolves at enrollment and stored with enrollment for downstream invoicing.

Payment Plans: Installment schedule, auto-draft option, first payment requirement. Applies ONLY to student portion; company pays in full or per its split. Monthly installments generate separate invoices.

Invoice Generation: Triggers on enrollment (immediately or by payment policy date). Split invoices: separate student and company invoices from same enrollment. Payment plan invoices: one per installment. Includes due date, payment instructions, course details.

Payment Tracking: Browse invoices, filter by status (open, past due, paid). Mark paid manually or via gateway. Send unpaid reminders. Past-due balance blocks new registrations.

🌐 Sub-System 7: Portal Experience

Student Portal: Course Catalog (browse open courses, filters, pricing resolution—member vs non-member based on auth). Register Now (capacity check, pricing display, payment options: Pay Now / Add to Cart / Request Invoice). My Courses (current/past toggle). View Course (read-only, shows schedule, modules, attendance/grade summaries). Invoices (open/history, installment invoices, company-responsible portions hidden). OJT Submission (monthly, per work process, save draft or submit, company verification). Documents (download/upload requests).

Instructor Portal: My Courses (assigned courses only). View Course (read-only, no finance). Student Profile Snapshot (constrained read-only, no PII beyond name/company).

Company Portal: My Students (with course snapshot, attendance, grade, financial responsibility). View Student (read-only, courses, OJT, training, company-responsible balance only). OJT Verification (approve/adjust/reject monthly submissions). Invoices (company portion only). Documents (download/upload).

🚀 Sub-System 8: Specialized Programs & Communications

OJT (On-The-Job Training): Flag students per craft (requires active company association). Browse participants, record monthly submissions (hours per work process, company verifies). Approval, rejection, or adjustment with comments. Student portal: monthly submission interface, approval history. Company portal: verification interface.

Correspondence Training: Flag students per craft. Browse participants, record module completions (edition, hours, completion date, grade). View progress per craft/level, export. Self-paced curriculum tracking.

Company-Led Training: Flag students per craft + select Lead Company. Browse, record completions, view progress. Company delivers training outside classroom.

Mass Communications: L3-only. Target by course, craft, location, session date. Compose email/text with auto-context injection. Send with confirmation modal. Log all communications for audit.

Reporting (Metabase): Curated reports: attendance, grades, OJT progress, enrollment/capacity, company summaries. Export-capable. Ongoing expansion of reports as needs emerge.

QA Focus for How It Works

Map your test cases to these 8 sub-systems. Understand dependencies: Admin Setup enables Profiles, which enable Enrollment, which drives Financials and Portal. Test workflows end-to-end across sub-systems. Verify data flows correctly (e.g., enrollment creates invoice with correct payment responsibility, student pays via portal).

Glossary

Essential terminology for the Education module. Understand these terms to communicate clearly with stakeholders and avoid testing errors.
📖 Core Concepts

School Year & Semester

School Year: Academic calendar period (e.g., FY2026 Jan-Dec). Context for all courses and enrollments. Selector drives browse screen results.

Semester: Subdivision of school year (Spring, Fall, etc.). Courses assigned to semesters. Can be enabled/disabled per chapter preference.

Craft & Level

Craft: Trade classification (e.g., HVAC, Electrical, Plumbing). Chapters organize modules, work processes, and students by craft. Each craft supports 1-6 levels.

Level: Progression tier within craft (Core, Level 1, Level 2, etc.). Modules and courses assigned to levels. Determines prerequisite structure.

Module

Module: Curriculum unit (e.g., "Safety Fundamentals," "Wiring Practices"). Has ID, Name, Hours, Level, Craft association, NCCER edition. Assigned to courses. Used in correspondence training. Multiple versions track NCCER updates.

Work Process (OJT)

Work Process: On-the-job training requirement. Has ID, Name, Required Hours, Craft association. Students log monthly hours against work processes. Company verifies submissions.

Course

Course: Class offering. Has Name (unique per school year), Description, Craft/Level, Capacity, Location, Instructors, Schedule, Modules, Pricing, Payment Policy. Students enroll; instructors teach.

Location

Location: Physical, Company, or Virtual venue. Used for scheduling and student logistics. Physical/Company have address fields; Virtual has link.

💼 Financial Terminology

Payment Responsibility

Student Pays: 100% to student invoice. Company portion = $0.

Company Pays: 100% to company invoice. Student portion = $0.

Split Payment: Percentage-based, dollar-amount-based, or fee-specific split. Student pays their portion; company pays theirs. Separate invoices issued.

Payment Policy

Pay During Registration: Student must pay (or arrange payment) immediately upon enrollment to complete registration.

Pay By Date: Invoice generated with future due date. Student has grace period to pay (customizable reminders).

Payment Plan

Payment Plan: Installment schedule for student balance only (company cannot use plans). E.g., 3 monthly installments of $500 each. Auto-draft option available. First payment may be required upfront.

Invoice

Invoice: Bill issued to student or company for course fees. Generated immediately (Pay During) or by due date (Pay By Date). Split invoices issued separately. Payment plan invoices issued per installment.

🎓 Training & Attendance Terminology

Attendance

Attendance Type: Present, Absent, Makeup (custom per chapter). Recorded per class session. Makeup resets Hours Absent. Tracked hours (present, absent) and percentages.

OJT (On-The-Job Training)

OJT: Work-based learning. Student logs monthly hours by work process (per craft). Company verifies (approve, adjust, reject). Required active company association. State/program-mandated in some jurisdictions.

Correspondence Training

Correspondence Training: Self-paced, non-classroom curriculum (e.g., online modules, textbook study). Chapter staff flag students per craft, record module completions with grades and hours. Tracked per craft/level.

Company-Led Training

Company-Led Training: Training delivered by the student's employer. Chapter staff flag students per craft, select Lead Company, record completions. Company trains; chapter tracks.

🔐 Access & Permission Terminology

Chapter Staff Levels

L1 (View Only): Browse, filter, export. No create/edit/delete. Read-only access to all data.

L2 (Edit): Modify modules, courses, enrollments, grades. Cannot change settings or permissions.

L3 (Admin): Full CRUD. Change all settings, permissions, mass communications, document requests. Chapter owner/director typical role.

Portal Access

Portal Access: Enables instructor/student/company to log into member portal and access education screens (My Courses, Register, OJT, etc.). Chapter staff manage via invite/remove.

QA Focus for Glossary

Use this glossary as a reference during testing and bug reporting. Precise terminology prevents miscommunication. E.g., "Module" ≠ "Course" (module is curriculum unit; course is offering). "Payment Responsibility" ≠ "Payment Policy" (responsibility = who pays; policy = when payment due).

Test Strategy

Comprehensive testing approach for Education module covering functional, integration, regression, and real-world scenario testing.
🎯 Testing Philosophy & Approach

End-to-End Workflows First: Test complete journeys before isolated features. Example: "Admin setup school year → define craft → create module → add course → enroll student → record attendance → generate invoice → student pays via portal." This validates sub-system integration.

Sub-System Coverage: Allocate testing effort to all 8 sub-systems proportionally. Admin Setup (15%), Profiles (10%), Courses (15%), Enrollment (15%), Attendance/Grades (10%), Financial (15%), Portal (10%), Specialized (10%).

User Persona Testing: Test as each role: Chapter L1/L2/L3, Instructor, Student, Company. Each has different data visibility and action rights. Verify access control is correct.

Data Integrity Focus: Validate calculations (fees, splits, totals), state consistency (e.g., enrollment status, payment status), and audit trails (change history is complete and accurate).

Business Rule Validation: Cross-reference all 32+ business rules (see Business Rules & Gotchas section). Every rule must be tested in context (e.g., "Cannot delete course with active enrollments").

🔍 Test Environment & Test Data Requirements

Prerequisite Configurations: School year (FY2026), 2-3 semesters enabled, location (Physical, Company, Virtual) created, chapter settings configured (portal enabled, payment responsibility selection enabled/disabled per test scenario).

Core Master Data: 3-5 Crafts (HVAC, Electrical, Plumbing, etc.), 15-20 Modules per craft (span Core/1-5 levels), 3-5 Work Processes per craft, 3 Locations (1 Physical, 1 Company, 1 Virtual).

Personnel: 5-10 Instructors (assign to 2+ crafts), 20-30 Students (span crafts, some with company association, some without), 5 Companies (varied dues levels, active/inactive).

Courses: Create 8-10 courses (2-3 per school year/craft/semester combination). Vary: location type (physical/company/virtual), capacity (small/medium/large/at-capacity), pricing (member/non-member), payment policy (Pay During/By Date).

Test User Accounts: Chapter staff (L1, L2, L3), Instructor, Student, Company users. Ensure email addresses are valid (for testing automated emails).

📋 Test Categories & Coverage Matrix

Functional Testing: Per sub-system CRUD operations (Create, Read, Update, Delete). E.g., for Courses: Add course (all 4 sections), view course details, edit course info/instructors/schedule, copy course, delete course. Verify all fields display/save correctly.

Integration Testing: Cross-sub-system workflows. E.g., Enrollment flow: (1) Create course with modules/schedule/pricing (Courses subsystem), (2) Enroll student (Enrollment subsystem), (3) Verify invoice generated (Financial subsystem), (4) Verify student can view course in portal (Portal subsystem).

Business Rule Testing: Validate each rule (see Business Rules section). E.g., "Cannot reduce work process hours below max recorded student hours"—create a student with recorded OJT hours, attempt to reduce work process hours, expect error or warning.

Regression Testing: Use checklists per sub-system (Regression Checklists section) before each release. Spot-check critical paths to catch unintended side effects.

Permission/Access Control Testing: Verify L1/L2/L3 visibility and action rights. Confirm inactive instructors/students cannot be assigned. Verify data isolation (student A cannot see student B's data).

Email & Notification Testing: Verify automated emails are sent on enrollment, payment, OJT status changes. Check email content (course name, due date, payment amount, OJT status) is correct. Verify email log is maintained.

🎬 Test Execution Sequence & Priorities

Phase 1 (Admin Setup): School year, semesters, lookup tables, craft/level definitions, module CRUD, work process CRUD. Duration: 2-3 days. Critical foundation; blocks downstream testing.

Phase 2 (Profiles & Config): Instructor/student add/edit, company association, craft enrollment, location management. Duration: 2-3 days. Enables course creation and enrollment.

Phase 3 (Courses): Course CRUD (all 4 sections), module assignment, schedule generation, copy course. Duration: 2-3 days. Prerequisite for enrollment testing.

Phase 4 (Enrollment & Academic): Add/browse/transfer/withdraw enrollment, attendance, grades, performance, level promotion. Duration: 3-4 days. Core student lifecycle.

Phase 5 (Financial): Pricing, payment responsibility, payment plans, invoicing, payment tracking. Duration: 2-3 days. Revenue-critical; test thoroughly.

Phase 6 (Portal): Student registration, My Courses, OJT submission, Instructor My Courses, Company My Students, payment. Duration: 3-4 days. Member-facing; high visibility.

Phase 7 (Specialized): OJT verification, correspondence training, company-led training, mass communications. Duration: 2-3 days. Advanced features; often last to stabilize.

Phase 8 (Integration & Regression): Run scenario tests and full regression checklists. Duration: 3-5 days. Pre-release validation.

QA Focus for Test Strategy

This is a complex module with high financial and operational impact. Invest in thorough testing. Test as chapter staff would—school year setup first, then profiles, then courses, then enrollments. Test as members would—browse catalog, register, pay, check portal. Verify invoices are correct (frequent payment dispute source). Test edge cases (capacity overages, payment plan math, split payments).

Business Rules & Gotchas

The 32+ business rules that drive Education module behavior. Understanding these is critical to effective testing and bug reporting. Organized by sub-system.
⚙️ Admin Setup Rules
  • School Year Immutability: Cannot modify or delete school years that have active courses. Must inactivate all courses first.
  • Module ID Uniqueness: Module ID must be unique across entire system. Duplicate IDs rejected on save.
  • Module Hours Flexibility: Hours can be decimal (e.g., 3.5 hours) but must be ≥ 0.
  • NCCER Edition Tracking: Module version history preserved when updating edition. New version does NOT lose student completion history.
  • Work Process Hours Immutability: Cannot reduce required hours below the maximum hours ANY student has recorded for that work process. System must track max-recorded and enforce lower bound.
  • Cascade Delete Prevention: Cannot delete modules, work processes, crafts, or locations if they have active associations or student history. UI must warn and block delete attempt.
  • Craft Level Count Consistency: Craft's "Number of Levels" field must match number of actual levels in system (1-6). Changing this cascades to level promotion logic.
  • Location Type Immutability: Location type (Physical/Company/Virtual) cannot be changed after creation. Recreate if type incorrect.
👤 Profile Management Rules
  • Instructor Status: Inactive instructors cannot be assigned to NEW courses. Existing assignments remain but cannot add more.
  • Student-Individual Link: Student must link to existing Individual OR auto-create new Individual on save. No orphaned students.
  • Duplicate Email Detection: System detects duplicate individual emails on student creation, shows modal for confirmation (linking vs new).
  • Company Association Routing: Student's PRIMARY company determines OJT verification routing. Changing primary company routes ALL OJT submissions (historical + future) to new company.
  • Craft Enrollment Requirement: To flag a student for OJT/Correspondence/Company-Led, they must have that craft assigned in Craft Enrollment section.
  • Lead Company Requirement: Company-Led training requires Lead Company selection. Must be one of student's active company associations.
  • Portal Access Independence: Portal access is independent of individual membership status. Chapter staff explicitly grant/revoke.
📚 Course Management Rules
  • Course Name Uniqueness: Course name must be unique within school year. Same name allowed in different school years.
  • Capacity Warnings: System warns if enrollment exceeds capacity but allows over-enrollment. No hard block.
  • Instructor Inactivity: Inactive instructors cannot be assigned to NEW courses.
  • Schedule Consistency: Class sessions must fall within course date range (implicit from schedule generation).
  • Module Hours Summation: Total course hours = sum of assigned module hours. Display running total during module assignment.
  • Delete Prevention: Cannot delete course with active enrollments. Must withdraw all students or inactivate course first.
  • Copy Rules: Modules always copied when course copied. Instructors/schedule/pricing optionally copied per user selection.
📝 Enrollment Rules
  • Duplicate Enrollment Prevention: Student cannot be enrolled in same course twice (same school year/semester). System blocks duplicate.
  • Payment Responsibility Persistence: Payment responsibility stored WITH enrollment, not looked up later. If payment responsibility settings change, existing enrollments unaffected.
  • Level Promotion Order: Bulk level promotions process in reverse order (highest level first: 4→5, then 3→4, etc). Validates all candidates before processing any.
  • Max-Level Graduation: Promoting student to maximum level for craft sets Craft Enrollment Status to Graduated/Completed.
  • Transfer Capacity Validation: Transfer to target course validates capacity at time of transfer. If target is at capacity, warn but allow (same logic as enrollment).
  • Withdraw Attendance Handling: Withdraw can copy forward attendance to future course, reset, or manual entry. Clear semantics needed.
📊 Attendance & Grades Rules
  • Attendance Uniqueness: One attendance record per student per session. Editing updates existing; no duplicates.
  • Makeup Resets Absence: Recording "Makeup" attendance resets Hours Absent for that session to zero, regardless of prior entry.
  • Percentage Calculation: Attendance % = Total Hours Present / (Total Hours Present + Total Hours Absent). Makeup hours counted as present.
  • Grade Range Validation: Percentage grades must be 0-100. Pass/Fail recorded as binary. No negative grades.
  • Retake Handling: Multiple grades per student allowed. Retake logic (best score, most recent, or manual selection) defined per chapter policy.
  • Performance Evaluation Scope: Pass/Fail evaluations are module-based (not assignment-based). One evaluation per student per module per course.
💰 Financial Rules
  • Pricing Resolution: Member vs Non-Member pricing determined by AUTHENTICATED login, not user self-selection. Portal auto-resolves based on login context.
  • Payment Responsibility Immutability (at enrollment): Payment responsibility set at enrollment and stored. Later changes to default responsibility do not affect existing enrollments.
  • Split Payment Calculation: Three split models: (1) Percentage-based (e.g., 60% student, 40% company). (2) Dollar-amount-based (e.g., $500 student, $300 company). (3) Fee-specific (e.g., tuition split, facility fee student-only). Math must be precise; no rounding errors.
  • Payment Plan Scope: Payment plans apply ONLY to student balance. Company portion (if any) paid in full or per split terms, not installments.
  • First Payment Requirement: Payment plan may require first installment at enrollment (chapter configurable). If required and not paid, enrollment not confirmed.
  • Invoice Generation Timing: Pay During Registration: invoice generated immediately upon enrollment. Pay By Date: invoice generated at specified due date or upon enrollment (configurable).
  • Split Invoices: Split payment enrollments generate TWO invoices: one to student, one to company. Invoice amounts match split calculation.
  • Late Fees: Late fees applied to unpaid invoices after due date. Fee amount set in course pricing policy (e.g., $25 per month overdue). Test late fee calculation.
  • Past-Due Blocking: Student with past-due balance > threshold cannot register for new courses. Threshold configurable per chapter.
🌐 Portal & Access Rules
  • Portal Registration Enable/Disable: If chapter disables portal course registration, "Register Now" button hidden; show "Contact Chapter" instead.
  • Payment Responsibility Selection: If chapter disables student payment responsibility selection in portal, default to Student Pays. Staff can override later in chapter site.
  • Student Data Isolation: Students cannot see other students' courses, grades, attendance, OJT submissions, or payments. Portal enforces this in queries/UI.
  • Company Data Isolation: Companies see only their associated students. Cannot see other companies' students or payments.
  • Instructor Limitations: Instructors cannot cancel courses, see finance data, or edit enrollment status. Read-only view of roster + attendance/grades entry.
  • Invoice Visibility (Portal): Student sees only student-portion invoices. Company-responsible portion hidden from student view. Company sees only company-portion invoices.
  • OJT Portal Eligibility: Student sees OJT submission interface ONLY if: (1) Primary craft flagged for OJT = Yes, (2) Craft has work processes defined, (3) Student has active company association, (4) Chapter enables OJT in portal.
🚀 Specialized Programs Rules
  • OJT Company Association Required: To flag student for OJT, student MUST have active company association. Unflag or update company before flagging.
  • OJT Company Change Routing: If student's primary company changes, ALL OJT submissions (past and future, verified and pending) route to new company. This is a gotcha—test it.
  • OJT Monthly Submission Lock: Once a month is approved by company, student cannot resubmit for that month. If rejected, student can resubmit.
  • OJT Adjustment vs Approval: Company can approve without changes OR adjust hours + add comment. System flags adjusted submissions separately from approved-without-change.
  • Correspondence Craft Scope: Correspondence training flagging is PER CRAFT. Student can have Correspondence=Yes for one craft and No for another.
  • Correspondence Historical Records: Unflagging a student for correspondence does NOT delete historical records. "Include Historical" checkbox in browse shows unflagged students with history.
  • Company-Led Lead Company Binding: Lead Company for company-led training must be one of student's active companies. If company association removed, Lead Company also removed.
  • Mass Communications L3-Only: Only L3 chapter staff can create/send mass communications. L1/L2 cannot access.
QA Focus for Business Rules & Gotchas

Create a test case for EACH rule. Use rule ID (e.g., "Rule 6: Work Process Hours Immutability") in your test case naming. If a bug is found, reference the rule in the Jira ticket ("Violates Rule 6"). This cross-linking helps prioritize critical vs minor issues. Some gotchas are easy to miss (e.g., "Changing company routes ALL OJT submissions to new company")—test these explicitly.

Scenario Thinking

Real-world "what if" scenarios that test multiple sub-systems in concert. Use these to design integration test cases and stress-test edge cases.
🎬 Scenario 1: Student Joins Mid-Semester, Completes Course, Pays Installments

Setup: Course is running (Week 3 of 12). Student enrolls late. Payment responsibility = Student Pays. Payment plan = 3 monthly installments.

Actions: (1) Enroll student → system generates payment plan invoices (3 months, adjusted prorata for partial month?). (2) Instructor records attendance for past sessions—does system retroactively mark student absent or skip past sessions? (3) Student receives first invoice, pays via portal. (4) One month later, second installment due—verify reminder email sent. (5) Student completes course, final invoice issued (if any balance).

Validations: Invoice amounts are correct (prorata logic if applicable). Payment plan dates are correct. Attendance percentage calculated correctly (present weeks vs total weeks, excluding sessions before enrollment?). Email reminders sent on schedule. Grade/completion visible in portal after course ends.

🎬 Scenario 2: Split Payment — Student + Company Responsibility, Company Changes Mid-Course

Setup: Course enrolled. Payment responsibility = 60% Student, 40% Company. Company = ABC Plumbing. Student has active association with ABC Plumbing and XYZ Electrical.

Actions: (1) Enroll student → split invoices generated ($600 student, $400 company). (2) Student pays their portion via portal. (3) Midway through course, student changes primary company from ABC Plumbing to XYZ Electrical. (4) What happens to the existing $400 company invoice? Does it route to XYZ? Or stay with ABC?

Validations: Understand the business rule: does company change affect outstanding invoices (no, they're already issued) or only future invoices? Test the actual implementation. Verify company portal shows correct invoices (ABC sees their $400 from old enrollment, XYZ sees invoices for new enrollments).

🎬 Scenario 3: OJT Submission Path When Company Association Changes

Setup: Student flagged for OJT. Primary company = ABC Plumbing. Student has submitted January and February OJT hours. January approved, February pending company review. March submission due.

Actions: (1) Student changes primary company from ABC to XYZ Electrical. (2) What routing happens to February (pending) submission? January (already approved)? (3) Where does March submission route?

Validations: Business rule states: ALL OJT submissions (past and future, verified and pending) route to NEW company. Test that February routing changes to XYZ. Verify XYZ sees February pending. Verify January history is preserved but no longer actionable (already approved). Verify March routes to XYZ from submission.

🎬 Scenario 4: Course Over Capacity — Enrollment, Waitlist, or Auto-Decline?

Setup: Course capacity = 20. Currently 20 students enrolled. New student attempts to enroll via portal (if enabled) or chapter staff manually enrolls.

Actions: (1) Attempt enrollment when at capacity. (2) System shows what? Warning? Error? Confirmation dialog? (3) If allowed (business rule says warn but allow), enrollment completes, course now has 21 students. (4) In portal, does "Register Now" become "Waitlist" or still allow direct enrollment?

Validations: Understand the implementation: does system have waitlist functionality or just warn? If warning, does it clearly state capacity will be exceeded? If portal enrollment is auto-decline when full, test that. If allow, test invoice is still generated and student enrolled.

🎬 Scenario 5: Module Deleted, Course References Module (Should Fail)

Setup: Course "Electrical Fundamentals" has modules: Safety, Wiring, Circuits. Course is active (students enrolled, classes scheduled).

Actions: (1) Chapter staff attempts to delete module "Wiring" from system. System should detect "Wiring" is assigned to active course and block delete.

Validations: Verify delete is blocked with error message naming the course(s) that reference the module. Verify module remains in course and can still be taught. Verify no orphaned module references.

🎬 Scenario 6: Payment Plan Math — Rounding, Remainders, Partial Months

Setup: Course tuition = $1,000. Student enrolls with 3-month payment plan. Enrollment date = March 15 (mid-month).

Actions: (1) System generates payment plan invoices. (2) Are installments equal ($333.33 each) or prorated for partial month? (3) Do rounding differences accumulate (e.g., first two months $333.33, third month $333.34)?

Validations: Understand business requirement for partial month handling. Test with multiple scenarios: (a) enrollment mid-month, (b) enrollment on 1st of month, (c) enrollment on last day of month. Verify total of all installments = total tuition (within penny). Verify no negative amounts.

🎬 Scenario 7: Craft Deleted, Students Enrolled in That Craft (Should Fail)

Setup: Craft "HVAC" has courses and students enrolled.

Actions: (1) Chapter staff attempts to delete craft "HVAC". (2) System should block deletion due to active student enrollments in HVAC courses.

Validations: Verify delete is blocked with error naming the courses/students. Option to inactivate craft instead (read-only, no new enrollments). Verify data integrity—no orphaned craft references.

🎬 Scenario 8: Portal Registration → Payment Plan → Installment Email Cadence

Setup: Student portal registration enabled. Course pricing = $900, payment policy = Pay During Registration. Student selects payment plan (3 months, $300/month).

Actions: (1) Student completes registration with payment plan. (2) First invoice issued immediately (due now). (3) Email confirmation sent. (4) 30 days later, second invoice due. Verify reminder email sent N days before (configurable, e.g., 5 days). (5) Student pays via portal. (6) 60 days from enrollment, third invoice due. (7) Verify email sequence and amounts.

Validations: Email timing is correct (not early, not late). Email content includes course name, due date, amount, payment link. Portal shows all 3 invoices in correct state (paid, past due, future). Late fees applied if payment overdue.

QA Focus for Scenario Thinking

These scenarios represent real situations chapter staff and members will encounter. Use them to design integration test cases that exercise multiple sub-systems. If a scenario reveals a gap in understanding (e.g., "What happens if..."?), ask the product team to clarify before testing. Document clarifications so future QA understands the rules.

Regression Checklists

Sub-system-specific regression checklists. Use these before every release to verify critical functionality. Check off items as you test them.
⚙️ Admin Setup & Configuration Regression
  • School Year CRUD (create, browse, edit, delete) works correctly
  • Cannot delete school year with active courses
  • Semester enable/disable toggles correctly
  • Module CRUD all fields (ID, Name, Hours, Level, Craft, Edition, Status) save/display correctly
  • Module ID uniqueness validated (reject duplicates)
  • Bulk module creation saves multiple modules and applies shared craft association
  • Cannot delete module assigned to active course
  • Work Process CRUD all fields save/display correctly
  • Work Process ID uniqueness validated
  • Cannot reduce work process hours below max recorded student hours
  • Craft CRUD (Name, Description, Levels, Status) works
  • Cannot delete craft with active student enrollments
  • Module assignment to craft (by level) persists and displays
  • Work process assignment to craft persists and displays
  • Location CRUD all fields (Name, Phone, Address/Company/Virtual link, Contact, Notes, Status) save/display
  • Cannot delete/inactivate location with active course assignments
  • Lookup tables customizable per chapter (Attendance Types, Student Types, etc.)
  • Chapter-defined defaults apply system-wide
👤 Profile Management Regression
  • Instructor browse, filters (status, craft, portal access) work correctly
  • Instructor add (link individual, craft specializations, portal invite) completes
  • Inactive instructor cannot be assigned to new courses
  • Instructor change history logged (field, old/new value, user, timestamp)
  • Portal access invite/remove toggles correctly
  • Student browse, filters (status, craft, company) work correctly
  • Student add (link/create individual, company association, craft enrollment) completes
  • Duplicate email detection shows modal on student creation
  • Student craft enrollment flags (OJT, Correspondence, Company-Led) persist
  • Lead Company requirement enforced for Company-Led flag
  • Primary company association selected and stored
  • Student change history logged completely
  • Portal access grant/revoke works for students
  • Company profile students tab shows active students count and list
  • Active Students filter (per company browse) works correctly
📚 Course Management Regression
  • Course browse, filters (school year, craft, semester, location, status) work
  • Course add (all 4 sections: info, location, capacity, pricing) completes and saves
  • Course name uniqueness validated (within school year)
  • Course edit (overview tab sections) updates all fields correctly
  • Module assignment (two-pane interface, drag to add/remove) works
  • Module order persists after drag reorder
  • Class schedule generation (date range or class count) creates sessions
  • Holiday/break handling (blackout dates) respected in schedule generation
  • Schedule grid editable (date, time, hours, module per class)
  • Single course copy (select options: modules, instructors, schedule) works
  • Bulk course copy utility copies multiple courses with correct options
  • Cannot delete course with active enrollments
  • Course change history logged for all edits
  • Capacity summary displays (current/max enrollment count)
📝 Enrollment Regression
  • Browse enrollments (filters: course, student, status) shows all records
  • Add enrollment (bulk select students, payment responsibility) completes
  • Payment responsibility options (Student, Company, Split) all work
  • Payment plan selection (if applicable) stores correctly with enrollment
  • Duplicate enrollment prevention (same student, same course, same year)
  • Confirmation emails sent on enrollment (to student and/or company per responsibility)
  • View enrollment shows read-only summary with quick actions
  • Transfer enrollment (select target course, effective date) validates capacity
  • Withdraw enrollment completes (attendance handling options)
  • Split Students utility rebalances over-capacity courses
  • Level Promotion bulk utility (select craft/level, validate candidates, reverse-order processing) works
  • Promotion to max level sets craft enrollment status to Graduated/Completed
  • Enrollment status (Active, Completed, Withdrawn, Pending) displays correctly
📊 Attendance, Grades & Performance Regression
  • Session selection (date picker) displays available class dates
  • Attendance recording (Present/Absent/Makeup) saves per student per session
  • Makeup attendance resets Hours Absent to zero
  • Attendance history shows all entries and edits
  • Attendance percentage calculated correctly (present vs total hours)
  • Assignment creation (name, module, date) works
  • Grade entry (percentage or pass/fail) saves per student per assignment
  • Percentage grades validated (0-100 range)
  • Retake logic (multiple grades per student) works correctly
  • Course grade summary shows current grade or overall pass/fail
  • Performance evaluation (module-based, pass/fail) records per student per module
  • Performance history shows evaluation entries and company comments
💰 Financial Operations Regression
  • Course pricing (member/non-member tuition, late fees) saves correctly
  • Payment policy (Pay During / Pay By Date) selection works
  • Payment responsibility (Student/Company/Split %) resolves correctly at enrollment
  • Split payment invoices generated separately (student and company)
  • Payment plan (installments, auto-draft, first payment required) options configurable
  • Payment plan invoices generated per installment with correct dates/amounts
  • Invoice generation triggered correctly (enrollment, due date, payment plan)
  • Invoice display includes course name, amount, due date, payment instructions
  • Browse invoices (filters: student, company, status) shows all records
  • Invoice status (Open, Paid, Past Due) displays and updates correctly
  • Manual payment recording marks invoice as paid
  • Payment reminders sent (N days before due, configurable)
  • Late fees calculated and added to overdue invoices
  • Past-due balance threshold blocks new registrations (if configured)
  • Unpaid invoice email can be sent from browse invoices
🌐 Portal Experience Regression
  • Student portal course catalog displays open courses with filtering
  • Pricing displays member rate if authenticated member, non-member rate if not
  • Register Now button appears (if registration enabled), shows payment options
  • Payment options (Pay Now / Add to Cart / Request Invoice) work correctly
  • Capacity validation on registration entry (allow but warn if over)
  • Payment responsibility selection shows (if enabled) with correct options
  • Payment plan selection works (if applicable)
  • Confirmation page and email sent after registration
  • Student My Courses shows current and past toggle
  • Student View Course (read-only) shows schedule, modules, attendance summary, grades, documents
  • Student Invoices tab shows open and history, installment invoices, company portions hidden
  • Instructor My Courses shows assigned courses only
  • Instructor View Course (read-only, no finance) accessible
  • Instructor Student Profile Snapshot (constrained, no PII/finance) accessible
  • Company My Students shows associated students with snapshot data
  • Company View Student (read-only) shows courses, OJT, training, company-responsible balance
  • Company Invoices shows company portion only
  • Data isolation verified (student A cannot see student B, company A cannot see company B)
🚀 Specialized Programs Regression
  • OJT flag (per craft) on student profile saves correctly
  • OJT eligible students (active company required) shown in browse
  • Student OJT submission (monthly, per work process) interface accessible in portal
  • OJT month selection prevents future months and locks approved months
  • Student can save draft or submit for company verification
  • Company OJT verification (approve, adjust, reject) options all work
  • Adjustment requires comment; rejection requires reason
  • OJT submission routing to primary company works
  • Changing primary company routes all OJT submissions (past and pending) to new company
  • Correspondence flag (per craft) saves; unflag does not delete history
  • Correspondence browse shows eligible students; Include Historical checkbox works
  • Record Correspondence completion (module, date, grade, hours) works
  • View Correspondence Progress (per craft/level) displays correctly; export works
  • Company-Led flag (with Lead Company) saves
  • Company-Led browse shows eligible students; Include Historical checkbox works
  • Record Company-Led completion works
  • View Company-Led Progress displays correctly; export works
  • Mass Communications (L3 only) compose, target, send, history works
  • Metabase reports accessible and export-capable
QA Focus for Regression Checklists

Before every release, run through these checklists systematically. Allocate 1-2 hours per sub-system. Check off items as you test them. If an item fails, open a bug immediately and note the failure in the checklist for reporting. These checklists are your "safety net"—they catch unintended side effects and prevent regressions.

Environment & Data Setup

Prerequisites and test data required for comprehensive Education module testing. Invest in good setup; it pays dividends in test efficiency.
🗄️ Test Database & Master Data

School Years & Semesters: Create 2-3 school years (FY2025, FY2026, FY2027). For each, create 2-3 semesters (Spring, Fall) in both enabled and disabled states for testing filtering/defaults.

Crafts (3-5): Create: HVAC, Electrical, Plumbing, Carpentry, Masonry. Each with 3-6 levels (Core/1-5). Span different level structures to test flexibility.

Modules (15-20 per craft): Create diverse modules: "Safety Fundamentals" (Core), "Basic Wiring" (Levels 1-2), "Advanced Circuits" (Level 3-5). Include varied hours (decimal and whole), NCCER editions, status (active/inactive).

Work Processes (3-5 per craft): Create: "Installation OJT," "Maintenance OJT," "Service OJT." Varied required hours (100-500+). Different statuses.

Locations (3): One Physical (with address), One Company (ABC Plumbing), One Virtual (Zoom link). Include realistic contact info.

Instructors (5-10): Create with varied specializations (multiple crafts per instructor). Vary status (active/inactive). Ensure some have portal access, some don't.

Students (20-30): Create diverse cohorts: (a) students with company association (for OJT testing), (b) students without company (non-OJT eligible), (c) students linked to multiple companies. Vary craft/level. Active and inactive statuses.

Companies (5): Create: ABC Plumbing (dues=Gold), XYZ Electrical (dues=Silver), etc. Vary dues levels (Bronze/Silver/Gold/Platinum). Include active and archived.

👤 User Accounts & Roles

Chapter Staff (L1, L2, L3): Create 3 test accounts: qa-l1@test.abc, qa-l2@test.abc, qa-l3@test.abc. Assign Education module permissions per level. Use for phase testing (L1 browse, L2 edit, L3 admin features).

Instructor Portal User: Create qa-instructor@test.abc with portal access. Verify Instructor portal screens accessible only to this account.

Student Portal Users (3-5): Create qa-student1@test.abc, qa-student2@test.abc, etc. Enroll in test courses. Verify Student portal screens show only their data.

Company Portal Users (2): Create qa-company-abc@test.abc (ABC Plumbing), qa-company-xyz@test.abc (XYZ Electrical). Verify Company portal shows only their students.

Limited Access User: Create qa-no-edu@test.abc with NO Education permissions. Verify Education module is not accessible (UI hidden, API blocked).

📧 Email & Communications Setup

Email Test Account: Set up a test mailbox (qa-education@test.abc) to receive automated Education emails (enrollment confirmation, payment reminder, OJT status, etc.). Subscribe this address to all outbound emails for testing.

Email Template Verification: Confirm all Education email templates are configured: enrollment confirmation (student and company variants), payment reminder (student and company), payment plan installment, OJT status (approved/adjusted/rejected), mass communications. Each template should include context-specific info (course name, due date, amount, etc.).

SMTP Configuration: Verify SMTP settings in test environment match production. Test email sending by triggering a manual email (e.g., Unpaid Invoice Email from browse invoices).

⚙️ Chapter Settings Configuration

Portal Course Registration: Create test scenarios with registration enabled and disabled. Verify UI shows "Register Now" vs "Contact Chapter" accordingly.

Payment Responsibility Selection (Portal): Configure settings with selection enabled and disabled. Test portal registration with both configurations.

OJT in Portal: Configure OJT enabled and disabled. Verify OJT menu appears/disappears for eligible students.

Payment Plan Configuration: Define 2-3 payment plan templates (e.g., 3 months, 4 months, 6 months with/without auto-draft). Use in course pricing and enrollment testing.

Past-Due Blocking Threshold: Set threshold (e.g., $100 balance blocks registration). Test with enrollments exceeding/below threshold.

📋 Test Environment Checklist
  • Database seeded with 2-3 school years, semesters enabled/disabled
  • 3-5 crafts created with 1-6 levels each
  • 15-20 modules per craft created and assigned to crafts
  • 3-5 work processes per craft created
  • 3 locations (Physical, Company, Virtual) created with realistic data
  • 5-10 instructors created with craft specializations
  • 20-30 students created with varied company associations
  • 5 companies created with varied dues levels
  • Chapter staff test accounts (L1, L2, L3) created with correct permissions
  • Instructor, student, and company portal test accounts created
  • Email test mailbox configured and linked to system
  • Email templates verified and tested (enrollment, payment, OJT)
  • SMTP configuration tested (send/receive works)
  • Chapter settings configured (portal registration, payment responsibility, OJT, payment plans)
  • Payment plan templates defined
  • Lookup tables customized (Attendance Types, Student Types, etc.)
  • Smoke test: Create course, enroll student, record attendance, generate invoice, student pays via portal
🔄 Test Data Maintenance & Refresh

Data Preservation: Maintain a "baseline" set of 20-30 stable test records (courses, enrollments, modules, crafts) that remain unchanged throughout testing cycle. These serve as reference data for regression checklists.

Throwaway Data: Use a separate set of "test" records for destructive testing (e.g., deleting courses, transferring enrollments, withdrawing students, archiving companies). These can be reset/recreated between test cycles.

Between Test Cycles: After a full test cycle, optionally reset throwaway data (delete test courses, unenroll test students) to ensure clean state for next cycle. Preserve baseline data and all audit trails (change history).

Data Documentation: Maintain a test data spreadsheet (master list of crafts, modules, courses, students, companies with IDs and key attributes). Future QA can use this to understand what data represents what scenario.

QA Focus for Environment & Data Setup

Invest 1-2 days in comprehensive setup before test execution. A well-organized test environment with clean, documented data prevents blockers during testing. Coordinate with DBAs or DevOps to seed bulk data efficiently. Document all setup steps so future QA can replicate the environment. Verify prerequisites before declaring environment "ready" (checklist all items above).