DOT D&A binder: add driver enrollment guidance + Form G roster

Customers (the DER) had no concrete how-to for onboarding/enrolling drivers or
what information to collect. Add:
- Section 1 'Enrolling a driver (new-hire onboarding)' subsection: exact info to
  collect, the onboarding sequence (collect info, sign Forms A/B, Clearinghouse
  query, prior-employer inquiry, add to C-TPA pool, pre-employment test, wait for
  MRO negative), and a driver-removal note.
- Form G — Driver Enrollment & Covered-Employee Roster: per-driver enrollment
  block (name, DOB, SSN last4, CDL #/state, contact, hire date, test result,
  Clearinghouse/prior-employer status) plus a roster table for the covered pool.
- TOC, email, and handler text updated A-F -> A-G.
This commit is contained in:
justin 2026-06-02 21:39:50 -05:00
parent 7c79cc9a08
commit b569a32f3a
3 changed files with 110 additions and 4 deletions

View file

@ -15,7 +15,7 @@ program under the applicable DOT testing regulation:
6. Violations, SAP access, return-to-duty / follow-up
7. EAP / rehab / treatment resources
8. Recordkeeping instructions + retention schedule
9. All required compliance forms (Forms A-F), each on its own page
9. All required compliance forms (Forms A-G), each on its own page
10. The regulations (citations + how to read the actual rule text)
(+ optional state Drug-Free Workplace addendum)
@ -424,7 +424,7 @@ def generate_da_binder(
"**Section 7 — EAP, Rehab & Treatment Resources.** Employee Assistance "
"Program information and treatment referrals.",
"**Section 8 — Recordkeeping.** What to keep, where, and for how long.",
"**Section 9 — Required Forms (A-F).** Every form you need, ready to "
"**Section 9 — Required Forms (A-G).** Every form you need, ready to "
"use, each on its own page.",
"**Section 10 — The Regulations.** Citations and how to read the actual "
"rule text.",
@ -510,6 +510,56 @@ def generate_da_binder(
"Make sure selected employees proceed to collection immediately.",
"Maintain the confidential records file and produce it on audit.",
])
b.h3("Enrolling a driver (new-hire onboarding)")
b.body(
"Every covered employee must be enrolled in your testing program and "
"random pool, and must pass a pre-employment drug test, **before** they "
"first perform safety-sensitive functions. Use Form G to capture each "
"driver's information and add them to your roster. Follow this sequence "
"for every new hire:")
enroll = [
"**Collect the driver's information** (Form G): full legal name, date "
"of birth, the last four digits of the SSN (or the full SSN if your "
"C-TPA requires it for lab matching), CDL number and state, address, "
"phone, email, hire date, and position.",
"**Have the driver sign Form A** (policy acknowledgment) and **Form B** "
"(pre-employment consent and prior-employer release).",
]
if meta.get("clearinghouse"):
enroll.append(
"**Run the FMCSA Clearinghouse pre-employment full query** (with "
"the driver's electronic consent in the Clearinghouse) and confirm "
"the driver is **not prohibited**.")
enroll.append(
"**Request the prior-employer DOT testing history** for the past "
"three years (Form B); for CDL drivers the Clearinghouse covers "
"violations on/after 1/6/2020 — still request manual records for "
"the period before that.")
else:
enroll.append(
"**Request the prior-employer DOT testing history** for the past "
"two years (Form B) and document the inquiry.")
enroll += [
"**Add the driver to your C-TPA roster / random pool.** Send Form G to "
f"{provider_name} (or enter it in their portal) so the driver is in the "
"next random selection. Do this on or before the hire date.",
"**Send the driver for the pre-employment drug test** at an approved "
"collection site. The site uses the federal chain-of-custody form "
"(CCF) — you do not supply it. Give the driver the collection site "
"name, address, hours, and any donor pass/authorization your C-TPA "
"issues.",
"**Wait for the MRO-verified negative result** before letting the "
"driver perform any safety-sensitive function. Keep the negative "
"result and all enrollment records in the driver's confidential file.",
]
b.numbered(enroll)
b.body(
"**Removing a driver:** when a covered employee leaves or stops "
"performing safety-sensitive functions, notify your C-TPA to remove "
"them from the random pool and note the departure on your roster "
"(Form G). Keep their records for the required retention period "
"(Section 8).")
b.page_break()
# ── Section 2 — Written policy ──────────────────────────────────────────
@ -895,6 +945,7 @@ def generate_da_binder(
"**Form D** — Reasonable-Suspicion Observation Record.",
"**Form E** — Post-Accident Testing Decision Worksheet.",
"**Form F** — Supervisor Training Completion Record.",
"**Form G** — Driver Enrollment & Covered-Employee Roster.",
])
_form_a(b, carrier_name, meta)
@ -903,6 +954,7 @@ def generate_da_binder(
_form_d(b, carrier_name)
_form_e(b, carrier_name)
_form_f(b, carrier_name)
_form_g(b, carrier_name, meta, provider_name)
# ── Section 10 — Regulations ───────────────────────────────────────────
b.page_break()
@ -1201,6 +1253,60 @@ def _form_f(b, carrier_name):
"reasonable-suspicion testing decision.")
def _form_g(b, carrier_name, meta, provider_name):
_form_header(b, "G", "Driver Enrollment & Covered-Employee Roster")
b.body(
f"Complete one enrollment block for each covered employee of "
f"{carrier_name or 'the Company'} and add them to the roster below. "
f"Send the information to {provider_name} so the employee is placed in "
"the random pool, and keep this form in your records. Enroll a driver "
"**before** they perform any safety-sensitive function.")
b.h3("New-driver enrollment")
for label in [
"Full legal name:",
"Date of birth: SSN (last 4): ____ ____",
"CDL number: CDL state:",
"Address:",
"Phone: Email:",
"Position / job title:",
"Hire date: Date added to random pool:",
]:
b.fill_line(label + " " + "_" * max(4, 58 - len(label)), gap=15)
b.spacer(4)
for label in [
"Pre-employment drug test result: [ ] Negative [ ] Pending "
"[ ] Positive/Refusal (do NOT place on duty)",
]:
b.fill_line(label, gap=8)
if meta.get("clearinghouse"):
b.fill_line(
"Clearinghouse pre-employment full query: [ ] Not prohibited "
"[ ] Prohibited Date run: ____________", gap=8)
b.fill_line(
"Prior-employer DOT testing history requested: [ ] Yes [ ] No "
"[ ] No prior DOT employer", gap=8)
b.fill_line(
"Forms collected: [ ] Form A (policy ack.) [ ] Form B "
"(consent/inquiry)", gap=12)
b.h3("Covered-employee roster")
b.body(
"Keep this roster current. Add each new hire and mark the date a "
"departing employee was removed from the random pool.", italic=True)
b.table(
["Employee name", "CDL # / state", "Position", "Added to pool",
"Removed (date)"],
[["", "", "", "", ""] for _ in range(9)],
[2.0, 1.4, 1.1, 1.0, 1.1],
alt=False,
)
b.small(
"Retain enrollment records and the negative pre-employment result in "
"each driver's confidential file. Notify your C-TPA promptly of every "
"addition and removal so your random rate stays accurate.")
# ── Misc helpers ────────────────────────────────────────────────────────────
def _covered_count(cdl_drivers, owner_operators) -> str:
try:

View file

@ -859,7 +859,7 @@ def _send_instant_delivery(
"testing policy, step-by-step instructions for your Designated "
"Employer Representative, supervisor reasonable-suspicion training "
"materials, SAP and treatment resources, a recordkeeping schedule, "
"and every form you need (Forms A–F).",
"and every form you need (Forms A–G).",
"<strong>What to do next:</strong> open the document, fill in the "
"blanks (DER name, testing provider, effective date), have it "
"reviewed by your counsel if you wish, then sign the policy, give a "

View file

@ -7,7 +7,7 @@ automatically (no admin step). DOCX is used so the carrier and its counsel
can review and adapt the program before adopting it. The binder bundles the
written testing policy, program-management instructions, supervisor-training
materials and access, EAP / rehab / SAP resources, regulation citations,
random-testing instructions, all required forms (A-F, each on its own page),
random-testing instructions, all required forms (A-G, each on its own page),
and recordkeeping guidance.
Policy variant (DOT operating administration) selection: