diff --git a/scripts/document_gen/templates/dot_da_binder_generator.py b/scripts/document_gen/templates/dot_da_binder_generator.py index 72b30bf..b958923 100644 --- a/scripts/document_gen/templates/dot_da_binder_generator.py +++ b/scripts/document_gen/templates/dot_da_binder_generator.py @@ -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: diff --git a/scripts/workers/job_server.py b/scripts/workers/job_server.py index 4066fcb..4806f33 100644 --- a/scripts/workers/job_server.py +++ b/scripts/workers/job_server.py @@ -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).", "What to do next: 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 " diff --git a/scripts/workers/services/dot_drug_alcohol.py b/scripts/workers/services/dot_drug_alcohol.py index b186c19..4094348 100644 --- a/scripts/workers/services/dot_drug_alcohol.py +++ b/scripts/workers/services/dot_drug_alcohol.py @@ -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: