Think of yourself a experienced teacher about medical coding. Teach me this pdf in easy, memorable, understandable, fast and accurate way please with relevant examples
cd /home/daytona/workspace/attachments/efb849ba-53ef-4603-88b7-e8bdc64add8b && python3 -c " import pdfplumber with pdfplumber.open('ICD-10-CM-Guidelines.pdf') as pdf: print(f'Total pages: {len(pdf.pages)}') # Extract first 15 pages to understand structure for i in range(min(15, len(pdf.pages))): text = pdf.pages[i].extract_text() if text: print(f'--- PAGE {i+1} ---') print(text[:2000]) print() "
cd /home/daytona/workspace/attachments/efb849ba-53ef-4603-88b7-e8bdc64add8b && python3 -c " import pdfplumber with pdfplumber.open('ICD-10-CM-Guidelines.pdf') as pdf: # Extract pages 15-50 (general guidelines + chapter specific) for i in range(14, 55): text = pdf.pages[i].extract_text() if text: print(f'--- PAGE {i+1} ---') print(text[:1800]) print() " 2>&1 | head -500
cd /home/daytona/workspace/attachments/efb849ba-53ef-4603-88b7-e8bdc64add8b && python3 -c " import pdfplumber with pdfplumber.open('ICD-10-CM-Guidelines.pdf') as pdf: # Extract key chapter-specific pages 55-120 (neoplasms, hypertension, injury, obstetrics, outpatient) for i in range(30, 60): text = pdf.pages[i].extract_text() if text: print(f'--- PAGE {i+1} ---') print(text[:1500]) print() " 2>&1 | head -400
cd /home/daytona/workspace/attachments/efb849ba-53ef-4603-88b7-e8bdc64add8b && python3 -c " import pdfplumber with pdfplumber.open('ICD-10-CM-Guidelines.pdf') as pdf: # Hypertension, AMI, injuries, obstetrics, outpatient pages 50-80 for i in range(48, 80): text = pdf.pages[i].extract_text() if text: print(f'--- PAGE {i+1} ---') print(text[:1500]) print() " 2>&1 | head -450
cd /home/daytona/workspace/attachments/efb849ba-53ef-4603-88b7-e8bdc64add8b && python3 -c " import pdfplumber with pdfplumber.open('ICD-10-CM-Guidelines.pdf') as pdf: # Pages 80-120: injuries, burns, Z codes, Section II, III, IV (outpatient) for i in range(79, 120): text = pdf.pages[i].extract_text() if text: print(f'--- PAGE {i+1} ---') print(text[:1400]) print() " 2>&1 | head -450
cd /home/daytona/workspace/attachments/efb849ba-53ef-4603-88b7-e8bdc64add8b && python3 -c " import pdfplumber with pdfplumber.open('ICD-10-CM-Guidelines.pdf') as pdf: # Pages 100-120: Section II (principal diagnosis), Section III, Section IV (outpatient) for i in range(99, 120): text = pdf.pages[i].extract_text() if text: print(f'--- PAGE {i+1} ---') print(text[:1600]) print() "
What is this document? The official rulebook (CMS + NCHS) for assigning diagnosis codes in the U.S. healthcare system. Required under HIPAA. 120 pages broken into 4 Sections + an Appendix. Let's break it down like a story.
| Section | What It Covers | Setting |
|---|---|---|
| Section I | Conventions + General Rules + Chapter-Specific Rules | All settings |
| Section II | How to pick the PRINCIPAL diagnosis | Inpatient only |
| Section III | How to report ADDITIONAL diagnoses | Inpatient only |
| Section IV | Coding rules for OUTPATIENT/office visits | Outpatient only |
| Appendix I | Present on Admission (POA) reporting | Inpatient billing |
β οΈ Rule #1: NEVER code from the Index alone. Always confirm in the Tabular List. The Tabular List has 7th characters, laterality, and instructional notes the Index doesn't always show.
A 0 9 . 0 1 2 A
β β β β β β βββ 7th character (encounter type)
β β β β βββ΄ββ 5th & 6th characters (specificity)
β β β βββββββ 4th character (subcategory)
β βββ΄ββββββββ 2nd & 3rd characters (category)
βββββββββββββββ 1st character (always a letter = chapter)
T14.90XA - the X holds the 6th position so A can be the 7th character.| Abbreviation | Meaning | Use It When... |
|---|---|---|
| NEC | "Not Elsewhere Classifiable" = Other specified | You know what it is, but no specific code exists |
| NOS | "Not Otherwise Specified" = Unspecified | Documentation doesn't give enough detail |
Memory trick: NEC = "Not Enough Code for this" (use it when you know what's wrong but no exact code fits). NOS = "Not On Sheet" (the chart doesn't say).
| Note | Meaning | Memory Trick | Rule |
|---|---|---|---|
| Excludes1 | "NOT CODED HERE" | Excludes1 = "1 code only, never together" | These two codes can NEVER be used together (they represent the same thing) |
| Excludes2 | "Not included here" | Excludes2 = "2 codes OK if both conditions exist" | The excluded condition is separate - you CAN use both codes |
Example: Code F45.8 (somatoform disorders) has an Excludes1 for sleep teeth grinding (G47.63) - because teeth grinding IS included under F45.8. But if the patient has psychogenic dysmenorrhea AND sleep teeth grinding (two clearly unrelated things), you CAN use both codes as an exception.
Example: Diabetic neuropathy
E11.40- Type 2 diabetes with diabetic neuropathy (etiology - the root cause)G63- Polyneuropathy in diseases classified elsewhere (manifestation)The Tabular List signals this with:
- "Use additional code" at the etiology code
- "Code first" at the manifestation code
| Word | What It Really Means |
|---|---|
| "and" in a title | Means "and" OR "or" |
| "with" in a title/index | Means "associated with" or "due to" - a causal relationship is assumed |
| "see" | Mandatory redirect - go look there |
| "see also" | Optional redirect - there might be more info |
"With" example (huge in practice!): A patient has diabetes AND CKD. The word "with" in the classification means you assume the diabetes caused the CKD - you do NOT need the provider to explicitly document this link. Code:E11.65(Type 2 DM with hyperglycemia) +N18.xfor the CKD stage.
Patient comes in with chest pain - provider hasn't figured out why. Code:R07.9(chest pain, unspecified). If provider diagnoses GERD, code only the GERD - chest pain is integral to it.
Patient has acute and chronic sinusitis: Code acute sinusitis first, then chronic sinusitis.
K57.21= Diverticulitis of large intestine with perforation and abscess with bleeding. One code. Done.
Old burn scar on arm: CodeL90.5(scar) first, thenT22.x xxS(burn sequela) second.
Inpatient discharge says "probable pneumonia" β Code the pneumonia
Office visit note says "possible GERD" β Code the heartburn/symptoms, NOT the GERD
| Situation | Code |
|---|---|
| HIV confirmed with illness / AIDS | B20 |
| HIV positive, NO symptoms | Z21 |
| Inconclusive HIV serology | R75 |
| Testing for HIV | Z11.4 |
| Negative test result / counseling | Z71.7 |
| PrEP visit | Z29.81 |
Golden Rules for HIV:
- Code ONLY confirmed cases
- Once a patient has an HIV-related illness, ALWAYS use B20 going forward
- HIV on antiretrovirals β still B20, add Z79.899 for long-term drug use
- HIV + pregnancy β Chapter 15 code goes FIRST (O98.7-), then B20
| Scenario | Sequence |
|---|---|
| Simple sepsis | Infection code first (e.g., A41.9) |
| Severe sepsis | Infection β R65.2- β organ dysfunction codes |
| Septic shock | Infection β R65.21 (severe sepsis with septic shock) |
| Sepsis from post-op wound | T81.41-T81.49 β T81.44 (post-op sepsis) β R65.2 if severe |
| Localized infection (e.g., pneumonia) that causes sepsis on admission | Systemic infection first, pneumonia second |
| Localized infection admitted first, THEN sepsis develops | Pneumonia first, then sepsis codes |
β οΈ Septic shock can NEVER be the principal diagnosis. The underlying infection always leads.
A41.02 MRSA sepsis). Do NOT add B95.62 separately.B95.62Z22.322| Treatment directed at... | Principal Dx |
|---|---|
| Primary malignancy | Primary malignancy (e.g., C34.11) |
| Secondary/metastatic site | Secondary site (e.g., C78.01 secondary lung) |
| Chemo/radiation/immunotherapy | Z51.0 or Z51.11/Z51.12 FIRST, then malignancy |
| Anemia from malignancy | Malignancy FIRST, then D63.0 |
| Dehydration from chemo | Dehydration FIRST, then malignancy |
| Previously excised primary, no evidence of disease | Z85.x (personal history) |
Memory trick: "What's in the spotlight today? That's what goes first."
| Medication | Z code to add |
|---|---|
| Insulin | Z79.4 |
| Oral hypoglycemic | Z79.84 |
| Injectable non-insulin (e.g., GLP-1) | Z79.85 |
| Combination | Code |
|---|---|
| HTN alone | I10 |
| HTN + heart disease | I11.- (assumed related by "with" rule) |
| HTN + CKD | I12.- + N18.x for CKD stage |
| HTN + heart disease + CKD | I13.- + I50.- if HF + N18.x |
| HTN + stroke | I60-I69 FIRST, then HTN code |
| Secondary HTN | Underlying cause FIRST, then I15.- |
| Elevated BP, no HTN diagnosis | R03.0 |
| Resistant HTN | Specific HTN code first, then I1A.0 |
Hypertension + Heart Disease = always assumed related. The classification presumes causation. You do NOT need the doctor to write "hypertension caused the heart failure."
Golden Rule: Chapter 15 codes ALWAYS have sequencing priority over all other chapters.
| Character | Meaning |
|---|---|
| A | Initial encounter (active treatment) |
| D | Subsequent encounter (routine healing) |
| S | Sequela (late effect) |
Fracture characters are more complex (A/B/C for open/closed types, D/E/F/G/H/J/K for healing stages)
| Situation | Classification | Sequence |
|---|---|---|
| Drug correctly prescribed, correctly given, bad reaction | Adverse effect | Nature of reaction FIRST, then T code with 5th/6th char "5" |
| Drug incorrectly prescribed, overdose, wrong drug, drug + alcohol | Poisoning | Poisoning T code FIRST (intent: accidental/intentional/assault/undetermined), then manifestations |
| Taking LESS than prescribed | Underdosing | T code with char "6", + noncompliance Z91.12-/Z91.13- |
| Harmful non-drug substance (cleaning products, etc.) | Toxic effect | Toxic effect code FIRST, then manifestations |
Mnemonic: "Correct = Adverse, Wrong = Poisoning, Less = Underdosing"
| Category | Examples |
|---|---|
| Contact/Exposure | Z20.822 (COVID exposure), Z20.821 (Zika exposure) |
| Status codes | Z21 (HIV+), Z66 (DNR), Z87.310 (hx osteoporosis fracture) |
| History | Z85.- (personal hx malignancy), Z86.73 (hx TIA) |
| Screening | Z11.52 (COVID screen), Z12.31 (mammogram) |
| Immunization | Z23 (vaccine), Z28.3 (underimmunized status) |
| Social determinants | Z59.0- (homelessness), Z59.41 (food insecurity) |
Some Z codes can ONLY be principal/first-listed (e.g., Z34, Z38, Z51.0, Z51.1-, Z40).
Key word: "after study" - you use what you know at DISCHARGE, not at admission.
Was the patient admitted for a specific condition? β Code that condition
Two conditions equally responsible? β Either one can be principal
Symptoms work-up finds a diagnosis? β Code the diagnosis (not the symptoms)
Complications of surgery? β Code the complication
Uncertain diagnosis ("probable pneumonia")? β Code it as if confirmed (inpatient rule!)
Original plan not carried out? β Still code the original reason for admission
Rule: Old conditions from previous episodes with NO bearing on the current stay = do NOT report. Exception: "Uncertain" additional diagnoses (probable/suspected) in inpatient = code them.
| Topic | Inpatient (Sec II) | Outpatient (Sec IV) |
|---|---|---|
| Uncertain diagnoses | Code as if confirmed | Do NOT code - use symptoms instead |
| First-listed diagnosis | Principal Dx = reason for admission | First-listed = main reason for service |
| Abnormal test results | Can code abnormal findings | Code confirmed diagnoses only when report available |
| Signs/symptoms | Drop when diagnosis confirmed | Use if no confirmed diagnosis |
| Indicator | Meaning |
|---|---|
| Y | Yes, present on admission |
| N | No, developed after admission |
| U | Unknown / unclear documentation |
| W | Clinically undetermined |
| Blank | Exempt from POA reporting |
Common pitfall: Hypertension, diabetes, asthma = always Y (chronic conditions are always present on admission even if first diagnosed during the stay).
| Rule | Remember It As |
|---|---|
| Alphabetic Index β Tabular List | "Look it up, then check it out" |
| Excludes1 | "1 code only - they're the same thing" |
| Excludes2 | "2 codes OK - they're different things" |
| Etiology/manifestation | "Root cause first, effect second" |
| "With" in classification | "Assume they're related - no doc needed" |
| Inpatient uncertain dx | "Probable = code it" |
| Outpatient uncertain dx | "Probable = DON'T code it - use symptoms" |
| Septic shock | "Never principal dx - infection always leads" |
| Chapter 15 (OB) | "Always wins the sequencing race" |
| Principal dx definition | "Responsible AFTER study = at discharge, not admission" |
| Adverse vs. Poisoning | "Correct drug, bad reaction = adverse; wrong/too much = poisoning" |
| AMI within 4 weeks | "Use I22 WITH I21" |
| HIV with illness | "Always B20" |
| HIV positive, no symptoms | "Z21" |
| POA = N | "Happened during the stay = hospital pays" |
| Code | Condition |
|---|---|
| B20 | HIV disease (with illness/AIDS) |
| Z21 | Asymptomatic HIV positive status |
| A41.9 | Sepsis, unspecified organism |
| R65.21 | Severe sepsis with septic shock |
| U07.1 | COVID-19 |
| U07.0 | Vaping-related disorder |
| U09.9 | Post-COVID condition |
| I10 | Essential hypertension |
| I1A.0 | Resistant hypertension |
| I21.4 | NSTEMI |
| E11.- | Type 2 diabetes mellitus |
| O80 | Normal uncomplicated delivery |
| Z37.- | Outcome of delivery (always secondary) |
| Z38.- | Liveborn infant (always principal on newborn record) |
Make a pdf of it
ls /home/daytona/workspace/ && mkdir -p /home/daytona/workspace/icd10-guide
~/icd10-guide/build_pdf.py
from reportlab.lib.pagesizes import letter
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import inch
from reportlab.lib import colors
from reportlab.platypus import (
SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
HRFlowable, PageBreak, KeepTogether
)
from reportlab.lib.enums import TA_LEFT, TA_CENTER, TA_JUSTIFY
from reportlab.platypus.tableofcontents import TableOfContents
from reportlab.pdfgen import canvas
OUTPUT = "/home/daytona/workspace/icd10-guide/ICD10CM_Study_Guide.pdf"
# ββ Colors ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
NAVY = colors.HexColor("#1a3c5e")
TEAL = colors.HexColor("#0d7377")
GOLD = colors.HexColor("#e8a020")
LGRAY = colors.HexColor("#f5f7fa")
MGRAY = colors.HexColor("#dde3ea")
RED = colors.HexColor("#c0392b")
GREEN = colors.HexColor("#1a7a4a")
WHITE = colors.white
BLACK = colors.black
# ββ Styles βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
styles = getSampleStyleSheet()
def make_style(name, parent="Normal", **kw):
s = ParagraphStyle(name, parent=styles[parent], **kw)
styles.add(s)
return s
cover_title = make_style("CoverTitle", fontSize=32, textColor=WHITE,
alignment=TA_CENTER, leading=40, fontName="Helvetica-Bold")
cover_sub = make_style("CoverSub", fontSize=16, textColor=GOLD,
alignment=TA_CENTER, leading=22, fontName="Helvetica")
cover_small = make_style("CoverSmall", fontSize=11, textColor=MGRAY,
alignment=TA_CENTER, leading=16, fontName="Helvetica")
h1_style = make_style("H1Style", fontSize=18, textColor=WHITE,
fontName="Helvetica-Bold", alignment=TA_LEFT,
leading=24, spaceAfter=6)
h2_style = make_style("H2Style", fontSize=13, textColor=NAVY,
fontName="Helvetica-Bold", leading=18,
spaceBefore=10, spaceAfter=4,
borderPad=4)
h3_style = make_style("H3Style", fontSize=11, textColor=TEAL,
fontName="Helvetica-Bold", leading=16,
spaceBefore=8, spaceAfter=3)
body_style = make_style("BodyStyle", fontSize=9.5, textColor=BLACK,
fontName="Helvetica", leading=14,
spaceAfter=4, alignment=TA_JUSTIFY)
bullet_style = make_style("BulletStyle", fontSize=9.5, textColor=BLACK,
fontName="Helvetica", leading=14,
spaceAfter=2, leftIndent=18,
bulletIndent=6)
code_style = make_style("CodeStyle", fontSize=8.5, textColor=NAVY,
fontName="Courier", leading=13,
leftIndent=20, spaceAfter=3,
backColor=LGRAY)
tip_style = make_style("TipStyle", fontSize=9, textColor=GREEN,
fontName="Helvetica-Oblique", leading=13,
leftIndent=12, spaceAfter=4)
warn_style = make_style("WarnStyle", fontSize=9, textColor=RED,
fontName="Helvetica-BoldOblique", leading=13,
leftIndent=12, spaceAfter=4)
mnem_style = make_style("MnemStyle", fontSize=9.5, textColor=colors.HexColor("#5b2d8e"),
fontName="Helvetica-Bold", leading=14,
leftIndent=12, spaceAfter=4)
# ββ Helpers ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
def section_header(title, subtitle=""):
"""Navy bar with white title for major sections."""
inner = [Paragraph(title, h1_style)]
if subtitle:
inner.append(Paragraph(subtitle, make_style(
f"SH_{title[:8]}", fontSize=10, textColor=MGRAY,
fontName="Helvetica", leading=14, alignment=TA_LEFT)))
t = Table([[inner]], colWidths=[7.0*inch])
t.setStyle(TableStyle([
("BACKGROUND", (0,0), (-1,-1), NAVY),
("LEFTPADDING", (0,0), (-1,-1), 12),
("RIGHTPADDING", (0,0), (-1,-1), 12),
("TOPPADDING", (0,0), (-1,-1), 10),
("BOTTOMPADDING",(0,0), (-1,-1), 10),
("ROUNDEDCORNERS", (0,0), (-1,-1), [6,6,6,6]),
]))
return [t, Spacer(1, 8)]
def h2(text):
return [Paragraph(text, h2_style), HRFlowable(width="100%", thickness=1.5,
color=TEAL, spaceAfter=4)]
def h3(text):
return [Paragraph(text, h3_style)]
def body(text):
return [Paragraph(text, body_style)]
def bullet(items):
return [Paragraph(f"β’ {i}", bullet_style) for i in items]
def tip(text):
return [Paragraph(f"π‘ {text}", tip_style)]
def warn(text):
return [Paragraph(f"β οΈ {text}", warn_style)]
def mnem(text):
return [Paragraph(f"π§ Mnemonic: {text}", mnem_style)]
def code(text):
return [Paragraph(text, code_style)]
def spacer(h=6):
return [Spacer(1, h)]
def make_table(headers, rows, col_widths=None):
data = [headers] + rows
if col_widths is None:
col_widths = [7.0*inch / len(headers)] * len(headers)
t = Table(data, colWidths=col_widths, repeatRows=1)
style = [
("BACKGROUND", (0,0), (-1,0), NAVY),
("TEXTCOLOR", (0,0), (-1,0), WHITE),
("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"),
("FONTSIZE", (0,0), (-1,0), 9),
("FONTNAME", (0,1), (-1,-1), "Helvetica"),
("FONTSIZE", (0,1), (-1,-1), 8.5),
("ROWBACKGROUNDS",(0,1), (-1,-1), [WHITE, LGRAY]),
("ALIGN", (0,0), (-1,-1), "LEFT"),
("VALIGN", (0,0), (-1,-1), "MIDDLE"),
("TOPPADDING", (0,0), (-1,-1), 5),
("BOTTOMPADDING", (0,0), (-1,-1), 5),
("LEFTPADDING", (0,0), (-1,-1), 7),
("RIGHTPADDING", (0,0), (-1,-1), 7),
("GRID", (0,0), (-1,-1), 0.4, MGRAY),
("LINEBELOW", (0,0), (-1,0), 1.5, TEAL),
]
t.setStyle(TableStyle(style))
return [t, Spacer(1, 8)]
def highlight_box(text, bg=LGRAY, border=TEAL):
p = Paragraph(text, ParagraphStyle("hb", parent=styles["Normal"],
fontSize=9.5, leading=14, leftIndent=8, rightIndent=8))
t = Table([[p]], colWidths=[7.0*inch])
t.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), bg),
("LEFTPADDING", (0,0),(-1,-1), 10),
("RIGHTPADDING", (0,0),(-1,-1), 10),
("TOPPADDING", (0,0),(-1,-1), 8),
("BOTTOMPADDING",(0,0),(-1,-1), 8),
("LINEAFTER", (0,0),(0,-1), 3, border),
("LINEBEFORE", (0,0),(0,-1), 3, border),
]))
return [t, Spacer(1,6)]
# ββ Page template with header/footer βββββββββββββββββββββββββββββββββββββββββ
def on_page(canvas_obj, doc):
canvas_obj.saveState()
w, h = letter
# Header bar
canvas_obj.setFillColor(NAVY)
canvas_obj.rect(0, h-28, w, 28, fill=1, stroke=0)
canvas_obj.setFillColor(WHITE)
canvas_obj.setFont("Helvetica-Bold", 9)
canvas_obj.drawString(0.5*inch, h-18, "ICD-10-CM Official Guidelines FY 2025 β Study Guide")
canvas_obj.setFont("Helvetica", 8)
canvas_obj.setFillColor(GOLD)
canvas_obj.drawRightString(w-0.5*inch, h-18, "Prepared for Medical Coding Students")
# Footer
canvas_obj.setFillColor(MGRAY)
canvas_obj.rect(0, 0, w, 22, fill=1, stroke=0)
canvas_obj.setFillColor(NAVY)
canvas_obj.setFont("Helvetica", 8)
canvas_obj.drawCentredString(w/2, 7, f"Page {doc.page}")
canvas_obj.restoreState()
# ββ Build story βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
def build():
doc = SimpleDocTemplate(
OUTPUT,
pagesize=letter,
leftMargin=0.75*inch, rightMargin=0.75*inch,
topMargin=0.65*inch, bottomMargin=0.45*inch,
title="ICD-10-CM Guidelines Study Guide FY2025",
author="Orris Medical Coding Tutor",
)
story = []
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# COVER PAGE
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
story.append(Spacer(1, 1.2*inch))
cover_bg = Table([[""]], colWidths=[7.0*inch], rowHeights=[3.4*inch])
cover_bg.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), NAVY),
("ROUNDEDCORNERS",(0,0),(-1,-1),[10,10,10,10]),
]))
cover_content = [
Spacer(1, 0.3*inch),
Paragraph("ICD-10-CM Official Guidelines", cover_title),
Paragraph("FY 2025 β Complete Study Guide", cover_sub),
Spacer(1, 0.2*inch),
Paragraph("Easy Β· Memorable Β· Accurate Β· Fast", cover_small),
Spacer(1, 0.1*inch),
Paragraph("October 1, 2024 β September 30, 2025", cover_small),
Spacer(1, 0.3*inch),
Paragraph("All 4 Sections + Present on Admission (POA)", cover_small),
]
story.extend(cover_content)
story.append(Spacer(1, 0.5*inch))
gold_bar = Table([[Paragraph(
"For Medical Coding Students, CPC Candidates & Healthcare Professionals",
ParagraphStyle("gb", fontSize=10, textColor=NAVY,
fontName="Helvetica-Bold", alignment=TA_CENTER))
]], colWidths=[7.0*inch])
gold_bar.setStyle(TableStyle([
("BACKGROUND", (0,0),(-1,-1), GOLD),
("TOPPADDING", (0,0),(-1,-1), 10),
("BOTTOMPADDING",(0,0),(-1,-1), 10),
]))
story.append(gold_bar)
story.append(PageBreak())
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# BIG PICTURE TABLE
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
story.extend(section_header("The Big Picture", "4 Sections You Must Know"))
story.extend(make_table(
["Section", "What It Covers", "Setting"],
[
["Section I", "Conventions + General Rules + Chapter-Specific Guidelines", "All settings"],
["Section II", "Selecting the PRINCIPAL diagnosis", "Inpatient only"],
["Section III", "Reporting ADDITIONAL diagnoses", "Inpatient only"],
["Section IV", "Coding rules for OUTPATIENT / office visits", "Outpatient only"],
["Appendix I", "Present on Admission (POA) reporting", "Inpatient billing"],
],
col_widths=[1.0*inch, 4.2*inch, 1.8*inch]
))
story.extend(highlight_box(
"<b>Core principle:</b> Code what the documentation supports, at the highest level of "
"specificity, in the correct order. When in doubt β query the provider."
))
story.append(Spacer(1, 10))
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# SECTION I-A CONVENTIONS
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
story.extend(section_header("Section I-A: Conventions", "The Grammar Rules of ICD-10-CM"))
# Two books
story.extend(h2("1. The Two Books β Always Use Together"))
story.extend(body(
"The <b>Alphabetic Index</b> is your starting point β look up the condition by name. "
"The <b>Tabular List</b> is your verification step β confirm and finalize the code. "
"You MUST use both every time."
))
story.extend(warn("Never code from the Alphabetic Index alone. The Tabular List contains "
"7th characters, laterality, instructional notes, and excludes that the Index may not show."))
# Code structure
story.extend(h2("2. Code Structure β Think of It Like a ZIP Code"))
story.extend(code(" A 0 9 . 0 1 2 A"))
story.extend(code(" β ββ 7th character (encounter type: A/D/S)"))
story.extend(code(" β βββββ 5th & 6th characters (specificity)"))
story.extend(code(" β βββββββββ 4th character (subcategory)"))
story.extend(code(" β βββββββββββββ 2nd & 3rd (category detail)"))
story.extend(code(" βββββββββββββββ 1st character = ALWAYS a letter (= chapter)"))
story.extend(spacer(4))
story.extend(make_table(
["Level", "Characters", "Example"],
[
["Category", "3 chars", "J44 β COPD"],
["Subcategory", "4-5 chars", "J44.1 β COPD with acute exacerbation"],
["Full code", "up to 7", "S52.501A β fracture, radius, initial encounter"],
],
col_widths=[2.0*inch, 1.8*inch, 3.2*inch]
))
story.extend(body(
"<b>Placeholder X:</b> If a code needs a 7th character but is only 5 characters long, "
"insert <b>X</b> to fill empty positions. Example: <font name='Courier'>T14.90XA</font> β "
"the X occupies position 6 so A can be the 7th character."
))
# NEC / NOS
story.extend(h2("3. Abbreviations β Only 2 to Memorize"))
story.extend(make_table(
["Abbreviation", "Full Meaning", "Use When..."],
[
["NEC", "Not Elsewhere Classifiable = Other Specified",
"You know what it is, but no specific code exists"],
["NOS", "Not Otherwise Specified = Unspecified",
"Documentation doesn't give enough detail"],
],
col_widths=[1.0*inch, 2.6*inch, 3.4*inch]
))
story.extend(mnem("NEC = 'Not Enough Code for this' (specific condition, no exact code). "
"NOS = 'Not On Sheet' (chart doesn't say enough)."))
# Excludes
story.extend(h2("4. The Two EXCLUDES Notes β Critical Distinction"))
story.extend(make_table(
["Note", "Meaning", "Rule", "Memory Trick"],
[
["Excludes1", "NOT CODED HERE",
"These two codes NEVER appear together (same concept)",
"1 code only β they're the same thing"],
["Excludes2", "Not included here",
"Patient CAN have both conditions β use both codes if appropriate",
"2 codes OK β they're different things"],
],
col_widths=[0.9*inch, 1.4*inch, 2.8*inch, 1.9*inch]
))
story.extend(tip("Exception to Excludes1: If the two conditions are clearly unrelated "
"(e.g., psychogenic dysmenorrhea + sleep teeth grinding), both codes may be assigned."))
# Etiology/Manifestation
story.extend(h2("5. Etiology / Manifestation Convention"))
story.extend(body(
"When a disease causes a complication in another body system, code the "
"<b>underlying disease (etiology) FIRST</b>, then the <b>manifestation</b>."
))
story.extend(highlight_box(
"<b>Example β Diabetic neuropathy:</b><br/>"
"1. <font name='Courier'>E11.40</font> β Type 2 DM with diabetic neuropathy (etiology)<br/>"
"2. <font name='Courier'>G63</font> β Polyneuropathy in diseases classified elsewhere (manifestation)<br/><br/>"
"Signals in the Tabular List: <b>\"Use additional code\"</b> at the etiology; "
"<b>\"Code first\"</b> at the manifestation."
))
# Key words
story.extend(h2("6. Key Words with Special Meanings"))
story.extend(make_table(
["Word in Classification", "What It Really Means"],
[
['"and" in a title', 'Means "and" OR "or"'],
['"with" in title/index', 'Means "associated with" / "due to" β causal relationship is ASSUMED'],
['"see"', 'Mandatory redirect β go there now'],
['"see also"', 'Optional redirect β additional info may exist'],
['"Code also"', 'Two codes may be needed; no sequencing direction given'],
['Default code', 'Code next to main term; used when no further info in the record'],
],
col_widths=[2.5*inch, 4.5*inch]
))
story.extend(highlight_box(
'<b>"With" rule β huge in practice:</b> A patient has diabetes AND CKD. The word "with" '
'in the classification means you ASSUME the diabetes caused the CKD. No explicit provider '
'documentation linking them is required. Code: E11.65 + N18.x for the CKD stage.'
))
story.append(PageBreak())
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# SECTION I-B GENERAL CODING GUIDELINES
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
story.extend(section_header("Section I-B: General Coding Guidelines"))
story.extend(h2("The Step-by-Step Coding Process"))
for step in [
"1. Find the main term in the Alphabetic Index",
"2. Review subterms and nonessential modifiers",
"3. Note any cross-references (see, see also)",
"4. Go to the Tabular List to verify the code",
"5. Read ALL instructional notes (includes, excludes, code first, use additional)",
"6. Assign the most specific code supported by documentation",
]:
story.extend(bullet([step[3:]])) # strip leading number + period + space already embedded
story.extend(h2("The Most Important General Rules"))
rules = [
("Signs & Symptoms", "Code them ONLY when no confirmed diagnosis has been established.",
"Patient has chest pain β no diagnosis yet β R07.9 (chest pain). "
"Once provider documents GERD, drop the chest pain (it is integral)."),
("Acute vs. Chronic", "When both exist at the same indentation level in the Index, "
"code BOTH and sequence ACUTE first.",
"Patient has acute and chronic sinusitis: code acute first, then chronic."),
("Combination Code", "When ONE code fully captures two diagnoses or a diagnosis + complication, "
"use only that single code.",
"K57.21 = Diverticulitis of large intestine with perforation and abscess with bleeding. Done."),
("Sequela (Late Effects)", "No time limit. Sequence: nature of the sequela FIRST, "
"then the sequela code (7th char S) SECOND.",
"Old burn scar: L90.5 (scar) first, then T22.xxxS (burn sequela) second."),
("Laterality", "Specify left/right. If bilateral but no bilateral code exists, "
"assign two separate codes.",
"Bilateral cataracts each treated in separate encounters: use bilateral code until "
"first eye fully resolved, then unilateral code."),
("Impending / Threatened", "If it HAPPENED β code confirmed. If it did NOT happen β "
"look up 'impending/threatened' in the Index; if no entry, code the underlying condition.",
"Threatened MI that resolved: code underlying angina, not the threatened MI."),
]
for title, rule_text, ex in rules:
story.extend(h3(title))
story.extend(body(rule_text))
story.extend(highlight_box(f"<b>Example:</b> {ex}", bg=colors.HexColor("#eef7f0"), border=GREEN))
# Uncertain diagnosis comparison
story.extend(h2("Uncertain Diagnosis β Inpatient vs. Outpatient (Most Tested Rule!)"))
story.extend(make_table(
["Setting", "Rule", "Example"],
[
["INPATIENT", "Code uncertain diagnoses AS IF confirmed\n(probable, suspected, likely, possible, rule out, consistent with)",
'"Probable pneumonia" at discharge β Code the pneumonia'],
["OUTPATIENT", "Do NOT code uncertain diagnoses.\nCode signs & symptoms instead.",
'"Possible GERD" in office note β Code heartburn (R12), not GERD'],
],
col_widths=[1.2*inch, 3.4*inch, 2.4*inch]
))
story.append(PageBreak())
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# SECTION I-C CHAPTER-SPECIFIC GUIDELINES
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
story.extend(section_header("Section I-C: Chapter-Specific Guidelines", "The High-Yield Chapters"))
# ββ Chapter 1: HIV ββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
story.extend(h2("Chapter 1 β Infections (A00-B99)"))
story.extend(h3("HIV β The Most Rule-Heavy Topic"))
story.extend(make_table(
["Situation", "Code"],
[
["HIV confirmed with illness / AIDS", "B20"],
["HIV positive, NO symptoms", "Z21"],
["Inconclusive HIV serology", "R75"],
["Testing for HIV", "Z11.4"],
["Negative result / counseling only", "Z71.7"],
["HIV pre-exposure prophylaxis (PrEP)", "Z29.81"],
["HIV managed on antiretrovirals", "B20 + Z79.899"],
["HIV + pregnancy (any trimester)", "O98.7- FIRST, then B20"],
],
col_widths=[4.5*inch, 2.5*inch]
))
story.extend(bullet([
"Code ONLY confirmed HIV cases (provider statement is sufficient β no lab required)",
"Once a patient ever has an HIV-related illness, always use B20 going forward",
"Chapter 15 codes ALWAYS take sequencing priority over B20 in pregnant patients",
]))
# Sepsis
story.extend(h3("Sepsis β The Most Complex Sequencing Topic"))
story.extend(mnem("INFECTION FIRST β everything else follows"))
story.extend(make_table(
["Scenario", "Sequencing Order"],
[
["Simple sepsis", "Infection code (e.g., A41.9)"],
["Severe sepsis", "Infection β R65.2- β organ dysfunction codes"],
["Septic shock", "Infection β R65.21 (severe sepsis with septic shock)"],
["Sepsis from post-op wound", "T81.41-49 β T81.44 β R65.2 if severe"],
["Localized infection causing sepsis on admit", "Systemic infection first, localized infection second"],
["Admit for pneumonia, sepsis develops later", "Pneumonia first, then sepsis codes"],
],
col_widths=[3.5*inch, 3.5*inch]
))
story.extend(warn("Septic shock can NEVER be the principal diagnosis. The underlying infection always leads."))
# MRSA
story.extend(h3("MRSA"))
story.extend(make_table(
["Situation", "Code Strategy"],
[
["MRSA infection WITH combination code (e.g., MRSA sepsis)",
"Use combination code ONLY (e.g., A41.02). Do NOT add B95.62."],
["MRSA infection WITHOUT combination code (e.g., wound infection)",
"Code the infection + B95.62 (MRSA as cause of disease)"],
["MRSA colonization (nasal swab positive, no illness)",
"Z22.322"],
],
col_widths=[3.5*inch, 3.5*inch]
))
# COVID
story.extend(h3("COVID-19 (U07.1)"))
story.extend(bullet([
"Code only confirmed cases (provider statement sufficient β no positive test required)",
"U07.1 is always principal/first-listed when COVID is the reason for the encounter",
"List manifestations (pneumonia J12.82, ARDS J80, acute resp failure J96.0-) as additional codes",
"Suspected/possible COVID β code the symptoms instead (fever, cough, dyspnea)",
"Post-COVID condition β code specific symptoms + U09.9",
"COVID exposure, asymptomatic β Z20.822",
"Vaping disorder β U07.0, always principal",
]))
story.append(PageBreak())
# ββ Chapter 2: Neoplasms ββββββββββββββββββββββββββββββββββββββββββββββββββ
story.extend(h2("Chapter 2 β Neoplasms (C00-D49)"))
story.extend(mnem("Spotlight rule: What are we treating TODAY? That goes first."))
story.extend(make_table(
["Treatment Directed At...", "Principal/First-Listed Dx"],
[
["Primary malignancy", "Primary malignancy (e.g., C34.11)"],
["Secondary/metastatic site only", "Secondary site (e.g., C78.01 secondary lung met)"],
["Chemo, radiation, immunotherapy", "Z51.0 / Z51.11 / Z51.12 FIRST, then malignancy"],
["Anemia from malignancy", "Malignancy FIRST, then D63.0"],
["Dehydration from chemo", "Dehydration (E86.0) FIRST, then malignancy"],
["Previously excised, no evidence", "Z85.x (personal history of malignancy)"],
["Malignancy in transplanted organ", "T86.- FIRST, then C80.2 + specific malignancy code"],
],
col_widths=[3.5*inch, 3.5*inch]
))
# ββ Chapter 4: Diabetes βββββββββββββββββββββββββββββββββββββββββββββββββββ
story.extend(h2("Chapter 4 β Diabetes Mellitus (E08-E13)"))
story.extend(make_table(
["Key Rule", "Details"],
[
["Default type", "If type NOT documented β assume Type 2 (E11.-)"],
["Insulin used, type unknown", "Still E11.- + Z79.4 (long-term insulin use)"],
['"With" rule', "DM + CKD = assumed related. No explicit documentation needed."],
["Multiple codes", "Assign as many E11.x codes as needed for all associated conditions"],
],
col_widths=[2.5*inch, 4.5*inch]
))
story.extend(make_table(
["Medication", "Z Code to Add"],
[
["Insulin", "Z79.4"],
["Oral hypoglycemic (e.g., metformin)", "Z79.84"],
["Injectable non-insulin (e.g., GLP-1)", "Z79.85"],
],
col_widths=[3.5*inch, 3.5*inch]
))
story.append(PageBreak())
# ββ Chapter 9: Cardiovascular βββββββββββββββββββββββββββββββββββββββββββββ
story.extend(h2("Chapter 9 β Cardiovascular (I00-I99)"))
story.extend(h3("Hypertension"))
story.extend(make_table(
["Combination", "Code"],
[
["HTN alone", "I10"],
["HTN + heart disease", "I11.- (assumed related β no documentation needed)"],
["HTN + CKD", "I12.- + N18.x (add CKD stage)"],
["HTN + heart disease + CKD", "I13.- + I50.- (if HF) + N18.x"],
["HTN + stroke/cerebrovascular disease", "I60-I69 FIRST, then HTN code"],
["Secondary hypertension", "Underlying cause FIRST, then I15.-"],
["Elevated BP, no HTN diagnosis", "R03.0"],
["Resistant hypertension", "Specific HTN code first + I1A.0"],
["Controlled or uncontrolled HTN", "Still I10-I15 (hypertension is hypertension)"],
],
col_widths=[3.5*inch, 3.5*inch]
))
story.extend(tip("HTN + Heart Disease = always assumed related. The classification presumes causation. "
"No provider note linking them is required."))
story.extend(h3("Acute Myocardial Infarction (AMI)"))
story.extend(make_table(
["Type", "Code Range"],
[
["STEMI (site-specific)", "I21.0-I21.2"],
["STEMI (unspecified site)", "I21.3"],
["NSTEMI", "I21.4"],
["Subsequent AMI within 4 weeks", "I22.- USED WITH I21.-"],
["AMI + CAD at same encounter", "AMI sequences first (acute event takes priority)"],
],
col_widths=[3.5*inch, 3.5*inch]
))
# ββ Chapter 10: Respiratory βββββββββββββββββββββββββββββββββββββββββββββββ
story.extend(h2("Chapter 10 β Respiratory System (J00-J99)"))
story.extend(bullet([
"COPD + acute exacerbation vs. COPD + infection β these are different codes, do not confuse them",
"VAP (Ventilator-Associated Pneumonia) = J95.851 β ONLY when provider explicitly documents VAP + add organism code",
"COVID-19 (U07.1) = always principal; list respiratory manifestations after",
"Vaping disorder (U07.0) = always principal",
]))
# ββ Chapter 15: OB βββββββββββββββββββββββββββββββββββββββββββββββββββββββ
story.extend(h2("Chapter 15 β Obstetrics (O00-O9A)"))
story.extend(warn("Chapter 15 codes ALWAYS have sequencing priority over all other chapters."))
story.extend(make_table(
["Situation", "Rule"],
[
["Routine prenatal, no complications", "Z34.- (supervision of normal pregnancy) as first-listed"],
["Diabetes in pregnancy", "O24.- FIRST, then E08-E13"],
["HIV in pregnancy", "O98.7- FIRST, then B20"],
["Normal uncomplicated delivery", "O80"],
["Outcome of delivery", "Z37.- always secondary; NEVER on newborn record"],
["Trimester character", "Assign based on when complication developed, NOT discharge trimester"],
],
col_widths=[3.0*inch, 4.0*inch]
))
story.append(PageBreak())
# ββ Chapter 19: Injuries / Adverse / Poisoning βββββββββββββββββββββββββββ
story.extend(h2("Chapter 19 β Injury, Poisoning & External Causes"))
story.extend(h3("7th Character for Injuries"))
story.extend(make_table(
["7th Char", "Meaning", "Use When..."],
[
["A", "Initial encounter", "Active treatment of the injury"],
["D", "Subsequent encounter", "Routine healing β follow-up visits"],
["S", "Sequela", "Late effects after healing is complete"],
],
col_widths=[0.8*inch, 2.0*inch, 4.2*inch]
))
story.extend(h3("Adverse Effect vs. Poisoning vs. Underdosing"))
story.extend(mnem("Correct = Adverse | Wrong/Too Much = Poisoning | Too Little = Underdosing"))
story.extend(make_table(
["Situation", "Classification", "Sequencing"],
[
["Drug correctly prescribed and given β bad reaction",
"Adverse Effect",
"Nature of reaction FIRST, then T code (5th/6th char = 5)"],
["Wrong drug, overdose, prescription error, drug + alcohol",
"Poisoning",
"Poisoning T code FIRST (with intent), then manifestations"],
["Taking less than prescribed (patient's own decision)",
"Underdosing",
"T code (char 6) + noncompliance Z91.12- or Z91.13-"],
["Harmful non-drug substance (bleach, venom, etc.)",
"Toxic Effect",
"Toxic effect code FIRST, then associated manifestations"],
],
col_widths=[2.2*inch, 1.5*inch, 3.3*inch]
))
# ββ Chapter 20: External causes ββββββββββββββββββββββββββββββββββββββββββ
story.extend(h2("Chapter 20 β External Causes (V00-Y99)"))
story.extend(bullet([
"NEVER a principal or first-listed diagnosis",
"Captures: HOW (cause) + WHY (intent) + WHERE (Y92 place) + WHAT activity (Y93)",
"Intent unknown β default to ACCIDENTAL",
"Terrorism β Y38.- (only when FBI officially designates it)",
"Assign as many external cause codes as needed to fully explain the event",
]))
# Z codes
story.extend(h2("Chapter 21 β Z Codes (Z00-Z99)"))
story.extend(body("Z codes are reasons for encounters that are not diseases β they provide context."))
story.extend(make_table(
["Category", "Examples"],
[
["Contact/Exposure", "Z20.822 COVID exposure; Z20.821 Zika exposure"],
["Status codes", "Z21 (HIV+); Z66 (DNR); Z87.310 (hx osteoporosis fracture)"],
["History", "Z85.- (personal hx malignancy); Z86.73 (hx TIA)"],
["Screening", "Z11.52 (COVID screen); Z12.31 (mammogram)"],
["Immunization status", "Z23 (vaccine encounter); Z28.3 (underimmunized)"],
["Social determinants", "Z59.0- (homelessness); Z59.41 (food insecurity)"],
["Long-term drug use", "Z79.4 (insulin); Z79.84 (oral hypoglycemics)"],
],
col_widths=[2.2*inch, 4.8*inch]
))
story.extend(highlight_box(
"<b>Z codes that can ONLY be principal/first-listed include:</b> Z00, Z01, Z02, Z34, Z38, Z39, "
"Z40, Z51.0, Z51.1-, Z33.2, Z42, and others. Know these for the exam."
))
story.append(PageBreak())
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# SECTION II
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
story.extend(section_header("Section II: Selecting the Principal Diagnosis", "Inpatient Only"))
story.extend(highlight_box(
'<b>Definition:</b> "The condition established AFTER STUDY to be chiefly responsible for '
'occasioning the admission of the patient to the hospital for care." β UHDDS<br/><br/>'
'<b>Key words: "after study"</b> = you use what you know at DISCHARGE, not at admission.'
))
story.extend(h2("Decision Framework"))
story.extend(make_table(
["Situation", "Principal Dx Rule"],
[
["Single clear reason for admission", "Code that condition"],
["Two conditions equally responsible", "Either may be principal β use circumstances"],
["Workup reveals a diagnosis (not just symptoms)", "Code the diagnosis (not the symptoms)"],
["Complication of surgery/medical care", "Code the complication"],
["Uncertain diagnosis ('probable', 'suspected')", "Code AS IF confirmed (inpatient rule)"],
["Original treatment plan not carried out", "Still code the original reason for admission"],
["Rehab admission", "Code the condition being rehabilitated"],
["Admission from outpatient surgery with complication", "Code the complication as principal"],
["Comparative diagnoses ('either GERD or angina')", "Code both as confirmed; sequence per circumstances"],
],
col_widths=[3.0*inch, 4.0*inch]
))
story.append(PageBreak())
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# SECTION III
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
story.extend(section_header("Section III: Additional Diagnoses", "Inpatient Only"))
story.extend(body("Report a condition as an additional diagnosis if it required ANY of the following:"))
story.extend(make_table(
["Criterion", "Notes"],
[
["Clinical evaluation", "Provider assessed or monitored the condition"],
["Therapeutic treatment", "Medication, procedure, or intervention given for it"],
["Diagnostic procedures", "Tests ordered specifically for this condition"],
["Extended length of stay", "Patient stayed longer because of this condition"],
["Increased nursing care/monitoring","More intensive nursing was needed because of it"],
],
col_widths=[2.5*inch, 4.5*inch]
))
story.extend(warn("Old conditions from previous episodes with NO bearing on the current stay = do NOT report."))
story.extend(tip("Uncertain additional diagnoses (probable/suspected) in INPATIENT = code them as if confirmed."))
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# SECTION IV
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
story.extend(section_header("Section IV: Outpatient Coding Rules"))
story.extend(h2("Key Differences from Inpatient"))
story.extend(make_table(
["Topic", "Inpatient (Sec II)", "Outpatient (Sec IV)"],
[
["Uncertain diagnoses", "Code as if confirmed", "Do NOT code β use signs/symptoms"],
["First dx label", '"Principal diagnosis"', '"First-listed diagnosis"'],
["Abnormal test results","Can code abnormal findings", "Code confirmed dx only when final report available"],
["Chronic diseases", "Code if treated/monitored", "Can code EVERY visit they are managed"],
["Same-day surgery", "Inpatient principal rules", "Reason for surgery = first-listed, even if not performed"],
],
col_widths=[1.8*inch, 2.6*inch, 2.6*inch]
))
story.extend(highlight_box(
"<b>Outpatient surgery rule:</b> Code the REASON for surgery as first-listed, "
"even if the surgery was not performed due to a contraindication."
))
story.append(PageBreak())
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# APPENDIX I β POA
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
story.extend(section_header("Appendix I: Present on Admission (POA)", "Inpatient Billing"))
story.extend(body(
"POA indicates whether a condition was present when the inpatient admission order was written. "
"It is assigned to all principal and secondary diagnoses on the UB-04/837I claim form."
))
story.extend(make_table(
["Indicator", "Meaning"],
[
["Y", "YES β present at the time of inpatient admission"],
["N", "NO β not present; developed after admission"],
["U", "UNKNOWN β documentation unclear"],
["W", "Clinically undetermined β provider cannot determine"],
["Blank", "Exempt from POA reporting"],
],
col_widths=[1.0*inch, 6.0*inch]
))
story.extend(highlight_box(
"<b>Why it matters:</b> Conditions that are POA = N may be classified as hospital-acquired "
"complications (HACs). Hospitals are NOT reimbursed for preventable complications they caused."
))
story.extend(h2("Key POA Assignment Rules"))
story.extend(make_table(
["Situation", "Assign"],
[
["Condition explicitly documented as present on admission", "Y"],
["Chronic conditions (hypertension, diabetes, asthma)", "Y (always pre-existing)"],
["Condition develops during outpatient encounter before admit", "Y"],
["Condition develops during inpatient hospitalization", "N"],
["Uncertain/possible dx present since admission symptoms", "Y"],
["Uncertain/possible dx based on post-admission findings", "N"],
["Documentation unclear whether present on admission", "U"],
["Provider clinically cannot determine", "W"],
],
col_widths=[4.5*inch, 2.5*inch]
))
story.append(PageBreak())
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
# MASTER CHEAT SHEET
# ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
story.extend(section_header("Master Memory Cheat Sheet", "Quick Reference for Exams & Practice"))
story.extend(make_table(
["Rule", "Remember It As"],
[
["Always use Index + Tabular List together", '"Look it up, then check it out"'],
["Excludes1", '"1 code only β they are the same thing"'],
["Excludes2", '"2 codes OK β they are different things"'],
["Etiology/manifestation", '"Root cause first, effect second"'],
['"With" in classification', '"Assume they are related β no documentation needed"'],
["Inpatient uncertain diagnosis", '"Probable = code it"'],
["Outpatient uncertain diagnosis", '"Probable = do NOT code it β use symptoms"'],
["Septic shock", '"Never principal dx β infection always leads"'],
["Chapter 15 obstetrics", '"Always wins the sequencing race"'],
["Principal diagnosis definition", '"Responsible AFTER study = at discharge, not admission"'],
["Adverse vs. Poisoning", '"Correct drug bad reaction = adverse; wrong/too much = poisoning"'],
["AMI within 4 weeks", '"Use I22 WITH I21"'],
["HIV with illness", '"Always B20"'],
["HIV positive, no symptoms", '"Z21"'],
["POA = N", '"Happened during the stay = hospital pays"'],
["Default diabetes type", '"No type documented = Type 2 (E11.-)"'],
["External cause codes", '"Never principal β always supporting info"'],
],
col_widths=[3.5*inch, 3.5*inch]
))
story.extend(h2("High-Yield Codes to Know"))
story.extend(make_table(
["Code", "Condition"],
[
["B20", "HIV disease (with illness / AIDS)"],
["Z21", "Asymptomatic HIV positive status"],
["A41.9", "Sepsis, unspecified organism"],
["R65.21", "Severe sepsis with septic shock"],
["U07.1", "COVID-19"],
["U07.0", "Vaping-related disorder"],
["U09.9", "Post-COVID condition, unspecified"],
["I10", "Essential hypertension"],
["I1A.0", "Resistant hypertension"],
["I21.4", "NSTEMI"],
["E11.-", "Type 2 diabetes mellitus"],
["O80", "Normal uncomplicated delivery"],
["Z37.-", "Outcome of delivery (always secondary on maternal record)"],
["Z38.-", "Liveborn infant (always principal on newborn record)"],
["Z85.-", "Personal history of malignant neoplasm"],
["Z79.4", "Long-term (current) use of insulin"],
],
col_widths=[1.2*inch, 5.8*inch]
))
story.append(Spacer(1, 0.3*inch))
footer_note = Table([[
Paragraph(
"ICD-10-CM Official Guidelines FY 2025 | Study Guide prepared by Orris Medical Coding Tutor | "
"For educational purposes. Always refer to the official CMS/NCHS guidelines for clinical use.",
ParagraphStyle("fn", fontSize=7.5, textColor=colors.gray,
fontName="Helvetica-Oblique", alignment=TA_CENTER))
]], colWidths=[7.0*inch])
footer_note.setStyle(TableStyle([
("TOPPADDING", (0,0),(-1,-1), 8),
("BOTTOMPADDING",(0,0),(-1,-1), 8),
("LINEABOVE", (0,0),(-1,0), 0.5, MGRAY),
]))
story.append(footer_note)
# ββ Build βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
doc.build(story, onFirstPage=on_page, onLaterPages=on_page)
print(f"PDF created: {OUTPUT}")
if __name__ == "__main__":
build()
cd /home/daytona/workspace/icd10-guide && python3 build_pdf.py 2>&1
~/icd10-guide/build_pdf.py
Successfully replaced 1 instance(s) of the string in '/home/daytona/workspace/icd10-guide/build_pdf.py'
cd /home/daytona/workspace/icd10-guide && python3 build_pdf.py 2>&1
ls -lh /home/daytona/workspace/icd10-guide/ICD10CM_Study_Guide.pdf
ICD10CM Study Guide
PDF Document Β· PDF