DOT D&A binder: add Section 11 — Practical Guidance for the Administrator

Adds the real-world know-how a first-time DER needs beyond the bare regs:
- Owner-operators / one-driver companies (must use a consortium; cannot self-test
  or self-select) — the most misunderstood case.
- Audits & penalties: what the new-entrant safety audit asks for and the
  consequences of no program (civil penalties, failed audit, out-of-service).
- Problem test results: dilute, shy bladder, cancelled test, split-specimen.
- Prescriptions / marijuana / CBD (marijuana prohibited regardless of state law;
  CBD trap; route medical questions to the MRO).
- What counts as a refusal (treated as a positive).
- Costs & timeline expectations.
- DER do's and don'ts (act same-day, keep records separate/confidential, never
  tip off a random selection, don't interpret results yourself).
This commit is contained in:
justin 2026-06-02 21:42:55 -05:00
parent b569a32f3a
commit 501e417584

View file

@ -17,6 +17,8 @@ program under the applicable DOT testing regulation:
8. Recordkeeping instructions + retention schedule
9. All required compliance forms (Forms A-G), each on its own page
10. The regulations (citations + how to read the actual rule text)
11. Practical guidance for the administrator (owner-operators, audits/
penalties, problem results, marijuana/CBD, refusals, costs, do's & don'ts)
(+ optional state Drug-Free Workplace addendum)
Output is **DOCX** so an attorney or the carrier can review and edit it. Each
@ -428,6 +430,10 @@ def generate_da_binder(
"use, each on its own page.",
"**Section 10 — The Regulations.** Citations and how to read the actual "
"rule text.",
"**Section 11 — Practical Guidance for the Administrator.** Real-world "
"answers: owner-operators, audits and penalties, problem test results, "
"prescriptions/marijuana/CBD, what counts as a refusal, costs, and the "
"DER's do's and don'ts.",
])
if state_dfwp:
b.body(
@ -985,6 +991,9 @@ def generate_da_binder(
"counsel review this program before adoption. Questions: "
"compliance@performancewest.com.")
# ── Section 11 — Practical guidance for the administrator ───────────────
_section_practical_guidance(b, meta, company, random_rate)
# ── Optional state DFWP addendum ───────────────────────────────────────
if state_dfwp:
b.page_break()
@ -1019,6 +1028,152 @@ def generate_da_binder(
return str(out)
# ── Section 11 — Practical guidance ─────────────────────────────────────────
def _section_practical_guidance(b, meta, company, random_rate):
b.page_break()
b.h1("Section 11 — Practical Guidance for the Administrator")
b.body(
"The regulations tell you what to do; this section covers the real-"
"world questions a program administrator runs into. It is practical "
"guidance, not legal advice — when a situation is serious or unclear, "
"call your C-TPA/MRO or counsel.")
b.h2("Owner-operators and one-driver companies")
b.body(
"This is the most misunderstood situation. If you are an owner-operator "
"or a one-driver carrier, you are **both the employer and the covered "
"employee** — and you may **not** test yourself or run your own random "
"selection.")
b.bullets([
"You **must** join a consortium (C-TPA). The consortium puts you in a "
"pool with other drivers and does the random selection for you, so the "
"selection is genuinely random and out of your hands.",
"You cannot be your own DER for results handling in a way that defeats "
"the rule; the C-TPA/MRO handles results and notifies you.",
"You still need a pre-employment negative, you are still subject to "
"random/post-accident/reasonable-suspicion (someone else must observe "
"for reasonable suspicion), and you still keep all records.",
"When you add a driver, you become the employer for that driver and "
"take on full DER duties for them.",
])
b.h2("Audits, penalties, and the new-entrant safety audit")
b.body(
"A new motor carrier typically gets a **new-entrant safety audit** in "
"its first 12 months, and any carrier can be audited later. The "
"auditor will ask to see your testing program. Have these ready:")
b.bullets([
"Your written policy and signed employee acknowledgments (Form A).",
"Proof of consortium/C-TPA enrollment and your random-selection records "
"and annual rate calculation.",
"Pre-employment negative results for every driver before they drove.",
"Supervisor training certificates (Form F).",
"Any post-accident, reasonable-suspicion, return-to-duty, and follow-up "
"records.",
])
if meta.get("clearinghouse"):
b.bullets([
"FMCSA Clearinghouse: proof of pre-employment full queries and "
"annual limited queries on every CDL driver, and that you reported "
"any violations.",
])
b.body(
"**Why this matters:** missing or no testing program is one of the most "
"common automatic safety-audit failures. It can lead to civil "
"penalties, a failed new-entrant audit (revoked operating authority), "
"and drivers placed **out of service**. A driver who tests positive, "
"refuses, or is 'prohibited' may not operate a CMV.")
b.h2("Problem test results — what to do")
b.body("Not every test comes back a clean negative. Know these:")
b.bullets([
"**Dilute (negative-dilute):** usually you may (and sometimes must) "
"direct an immediate recollection under your policy — follow the MRO's "
"instruction. A positive-dilute is treated as a positive.",
"**Shy bladder / insufficient specimen:** the collector follows a set "
"procedure (water, up to three hours). If the employee still cannot "
"provide enough, the MRO refers them for a medical evaluation; an "
"unexplained failure is a **refusal**.",
"**Cancelled test:** a test cancelled for a fatal/correctable flaw is "
"neither positive nor negative; the MRO/C-TPA will tell you whether a "
"recollection is required (for pre-employment, return-to-duty, and "
"follow-up tests, a recollection is required).",
"**Split-specimen request:** an employee may, within 72 hours of being "
"told of a verified positive/adulterated/substituted result, request "
"that the split (Bottle B) be tested at a second lab — at their cost. "
"Do not remove this right; the MRO handles it.",
])
b.h2("Prescriptions, marijuana, and CBD")
b.bullets([
"**Marijuana is prohibited** for safety-sensitive employees under "
"federal law **regardless of state legalization** or a state medical-"
"marijuana card. A marijuana positive is a violation.",
"**CBD is a trap.** CBD products are unregulated and may contain enough "
"THC to cause a positive. Using CBD is **not** a valid medical "
"explanation to the MRO. Warn your drivers in writing.",
"**Legitimate prescriptions:** the MRO — not you — evaluates whether a "
"prescription explains a positive. Drivers should keep prescriptions "
"current and tell the MRO (not the employer) if contacted. A driver "
"must not perform safety-sensitive duty on any medication a prescriber "
"has warned against.",
"Do not ask drivers to disclose their medications to you; that can "
"create ADA/privacy problems. Route medical questions to the MRO.",
])
b.h2("What counts as a refusal")
b.body(
"A refusal is treated exactly like a verified positive and triggers the "
"full return-to-duty process. Refusals include:")
b.bullets([
"Failing to appear for a test within a reasonable time, or leaving the "
"collection site before the process is complete.",
"Failing to provide a specimen (without a valid medical reason), or "
"failing the shy-bladder/insufficient-specimen evaluation.",
"Refusing to be observed for a directly observed (return-to-duty or "
"follow-up) collection.",
"Adulterating, substituting, or tampering with a specimen, or admitting "
"the specimen was altered.",
"Failing or declining to take a second test the employer or collector "
"directs.",
])
b.body(
"Document the time and circumstances (Form C is useful here) and treat "
"it as a violation — do not let the employee continue safety-sensitive "
"work.")
b.h2("Costs and timeline — set expectations")
b.bullets([
"Typical out-of-pocket costs: consortium/C-TPA enrollment and per-"
"driver annual fees, the per-test collection/lab/MRO fee, and "
"supervisor training. Your provider can give you current pricing.",
"A pre-employment result is usually back within a couple of business "
"days (longer if the MRO must investigate a non-negative).",
"After a violation, the SAP and return-to-duty process is typically "
"weeks to months and is generally at the employee's expense; you are "
"not required to return anyone to duty.",
])
b.h2("DER do's and don'ts")
b.bullets([
"**Do** act on a positive/refusal the **same day** — remove the "
"employee from safety-sensitive duty immediately.",
"**Do** keep D&A records **separate and confidential** — not in the "
"general personnel file, and not shared with people who don't need to "
"know.",
"**Do** keep your consortium roster current; an out-of-date roster "
"skews your random rate and fails audits.",
"**Don't** warn or 'tip off' a randomly selected employee, delay their "
"collection, or let them go home first.",
"**Don't** accept a home/instant test or a non-DOT test in place of a "
"DOT-required test.",
"**Don't** try to interpret results yourself — the MRO verifies; you "
"act on what the MRO/C-TPA reports.",
"**When in doubt, call** your C-TPA, MRO, or counsel before acting. "
"Questions: compliance@performancewest.com.",
])
# ── Header / footer ─────────────────────────────────────────────────────────
def _add_header_footer(doc, meta, carrier_name):
section = doc.sections[0]