Tell me about ECHS

Searching the Web

ECHS Ex-Servicemen Contributory Health Scheme India details 2024 2025

Here is a comprehensive overview of ECHS - Ex-Servicemen Contributory Health Scheme:

What is ECHS?

The Ex-Servicemen Contributory Health Scheme (ECHS) is a government healthcare programme launched on 1 April 2003 by the Ministry of Defence, Government of India. It provides cashless and "capless" (no monetary cap) quality medical care to retired Indian Armed Forces personnel and their families - modeled on the Central Government Health Scheme (CGHS) for civilians.

Who is Eligible?

Primary Beneficiaries:
  • All Ex-Servicemen (ESM) pensioners who served in the regular Army, Navy, or Air Force
  • Disability pensioners and family pensioners
Dependents covered:
  • Spouse (husband/wife)
  • Legitimate children
  • Wholly dependent parents (income below Rs. 9,000/month, excluding Dearness Allowance)
Twin conditions to qualify:
  1. Must hold ESM (Ex-Serviceman) status
  2. Must be a pensioner
Pre-existing medical conditions do not bar enrolment.

Contribution (One-Time Payment)

Unlike regular insurance premiums, ECHS requires only a one-time contribution based on the rank held:
Rank CategoryApproximate Contribution
JCOs/Other RanksRs. 30,000
Officers (lower ranks)Moderate range
Senior Officers (Col and above)Up to Rs. 1,20,000
After this one-time payment, all treatment is fully funded by the Government of India.

Benefits & Coverage

ServiceWhat It Provides
ECHS PolyclinicsOutpatient consultations, basic diagnostics, emergency care, referrals
Empanelled HospitalsCashless inpatient/outpatient care, surgeries, advanced diagnostics
MedicinesFree at polyclinics and empanelled hospitals; outside purchase with reimbursement if unavailable
Specialist CareReferrals to specialists, including super-specialty treatments
Key features:
  • No monetary cap on treatment costs
  • Cashless transactions at all network facilities
  • Covers consultations, diagnostics, inpatient care, pharmacy, and specialized treatments
  • Network of polyclinics, Service hospitals, and private empanelled hospitals across India

ECHS Smart Card

Beneficiaries receive a plastic smart card used to access all ECHS facilities. Card types include:
  • Normal Card (standard)
  • PMR & SSCO Card
  • White Card - for persons with disabilities (PwD)
  • War Disabilities Card / EC & WWII Card
As of June 2025, all dependent beneficiaries above 18 years (excluding spouse) must complete Annual Validation via Aadhaar-based authentication.
Card printing costs (revised rates): Rs. 172.50 for a 64KB fresh smart card.

How to Access Treatment

  1. Visit parent ECHS Polyclinic - first point of contact for all medical needs
  2. Get referred to an empanelled hospital for specialist care or inpatient treatment
  3. Show ECHS Smart Card for cashless treatment at empanelled facilities
  4. For emergencies, direct admission at empanelled hospitals is permitted

E-SeHAT Tele-Consultation

ECHS also provides E-SeHAT (Electronic - Service Health Assistance & Tele-consultation) - an online tele-consultation service for beneficiaries who cannot travel to facilities. (Note: As of mid-2025, this service was undergoing technical upgrades by CDAC.)

Grievance Redressal

If you face any problem at an empanelled hospital (denial of beds, poor service, cash demands, substandard treatment), the Director, Regional Centre is the first point of contact. Issues can also be emailed to: jditechs1[at]echs[dot]gov[dot]in

Official Website

The official ECHS portal is echs.gov.in, where beneficiaries can apply for cards, check empanelled hospitals, and access the latest circulars.

In summary, ECHS is a robust welfare scheme that ensures India's military veterans and their families receive lifelong, high-quality healthcare without financial burden, backed by a wide network of hospitals across the country.

Give me a format of ECHS file I want to see a complete hospital file which contains all documentation work which tells me how I can make a ECHS file in Hospital

Asking for Preferences
Searching the Web

ECHS inpatient IPD hospital file documents required empanelled hospital checklist 2024

Searching the Web

ECHS IPD admission file format documents list claim submission empanelled hospital

Reading File
Running Command

mkdir -p /tmp/workspace/echs-ipd-file && ls /tmp/workspace/echs-ipd-file/

Writing File

~/echs-ipd-file/build_echs_file.py

from reportlab.lib.pagesizes import A4
from reportlab.lib import colors
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import mm, cm
from reportlab.platypus import (
    SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle,
    HRFlowable, PageBreak, KeepTogether
)
from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_RIGHT, TA_JUSTIFY
from reportlab.pdfgen import canvas
from reportlab.platypus.flowables import Flowable
import datetime

OUTPUT = "/tmp/workspace/echs-ipd-file/ECHS_IPD_Hospital_File.pdf"

# ─── Page numbering canvas ────────────────────────────────────────────────────
class NumberedCanvas(canvas.Canvas):
    def __init__(self, *args, **kwargs):
        canvas.Canvas.__init__(self, *args, **kwargs)
        self._saved_page_states = []

    def showPage(self):
        self._saved_page_states.append(dict(self.__dict__))
        self._startPage()

    def save(self):
        num_pages = len(self._saved_page_states)
        for state in self._saved_page_states:
            self.__dict__.update(state)
            self.draw_page_number(num_pages)
            canvas.Canvas.showPage(self)
        canvas.Canvas.save(self)

    def draw_page_number(self, page_count):
        self.setFont("Helvetica", 8)
        self.setFillColor(colors.HexColor('#555555'))
        self.drawRightString(
            A4[0] - 20*mm, 12*mm,
            f"Page {self._pageNumber} of {page_count}"
        )
        # footer line
        self.setStrokeColor(colors.HexColor('#003366'))
        self.setLineWidth(0.5)
        self.line(20*mm, 18*mm, A4[0]-20*mm, 18*mm)
        self.drawString(20*mm, 12*mm, "ECHS IPD Hospital File  |  CONFIDENTIAL MEDICAL RECORD")

# ─── Styles ───────────────────────────────────────────────────────────────────
styles = getSampleStyleSheet()

def style(name, **kwargs):
    base = styles[name]
    ns = ParagraphStyle(name + "_custom", parent=base, **kwargs)
    return ns

NAVY   = colors.HexColor('#003366')
GOLD   = colors.HexColor('#CC9900')
LGRAY  = colors.HexColor('#F2F4F7')
MGRAY  = colors.HexColor('#CCCCCC')
DGRAY  = colors.HexColor('#555555')
WHITE  = colors.white
RED    = colors.HexColor('#CC0000')

heading1   = style('Heading1', fontSize=14, textColor=NAVY, spaceAfter=4,
                   spaceBefore=10, fontName='Helvetica-Bold', alignment=TA_LEFT)
heading2   = style('Heading2', fontSize=11, textColor=NAVY, spaceAfter=3,
                   spaceBefore=8, fontName='Helvetica-Bold')
heading3   = style('Heading3', fontSize=9.5, textColor=NAVY, spaceAfter=2,
                   spaceBefore=6, fontName='Helvetica-Bold')
normal     = style('Normal', fontSize=9, leading=13, spaceAfter=2)
small      = style('Normal', fontSize=8, leading=11, textColor=DGRAY)
label      = style('Normal', fontSize=8.5, fontName='Helvetica-Bold', textColor=NAVY)
center_big = style('Normal', fontSize=18, fontName='Helvetica-Bold',
                   textColor=NAVY, alignment=TA_CENTER, spaceAfter=4)
center_med = style('Normal', fontSize=13, fontName='Helvetica-Bold',
                   textColor=NAVY, alignment=TA_CENTER, spaceAfter=3)
center_sm  = style('Normal', fontSize=9, alignment=TA_CENTER, textColor=DGRAY)
red_note   = style('Normal', fontSize=8.5, textColor=RED, fontName='Helvetica-Bold')
italic_sm  = style('Normal', fontSize=8, fontName='Helvetica-Oblique', textColor=DGRAY)

# ─── Helper: blank field row ──────────────────────────────────────────────────
def field_row(label_text, width1=60*mm, width2=110*mm, height=7*mm):
    data = [[Paragraph(label_text, label), '']]
    t = Table(data, colWidths=[width1, width2])
    t.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (0,0), LGRAY),
        ('BACKGROUND', (1,0), (1,0), WHITE),
        ('BOX',        (0,0), (-1,-1), 0.5, MGRAY),
        ('INNERGRID',  (0,0), (-1,-1), 0.5, MGRAY),
        ('VALIGN',     (0,0), (-1,-1), 'MIDDLE'),
        ('TOPPADDING', (0,0), (-1,-1), 2),
        ('BOTTOMPADDING',(0,0),(-1,-1), 2),
        ('LEFTPADDING',(0,0),(-1,-1), 4),
        ('MINROWHEIGHT',(0,0),(-1,-1), height),
    ]))
    return t

def two_fields(l1, l2, w=85*mm):
    data = [[Paragraph(l1, label), '', Paragraph(l2, label), '']]
    t = Table(data, colWidths=[w-20*mm, w-20*mm, w-20*mm, w-20*mm])
    t.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (0,0), LGRAY),
        ('BACKGROUND', (2,0), (2,0), LGRAY),
        ('BOX',        (0,0), (-1,-1), 0.5, MGRAY),
        ('INNERGRID',  (0,0), (-1,-1), 0.5, MGRAY),
        ('VALIGN',     (0,0), (-1,-1), 'MIDDLE'),
        ('TOPPADDING', (0,0), (-1,-1), 2),
        ('BOTTOMPADDING',(0,0),(-1,-1), 2),
        ('LEFTPADDING',(0,0),(-1,-1), 4),
        ('MINROWHEIGHT',(0,0),(-1,-1), 7*mm),
    ]))
    return t

def section_header(title):
    data = [[Paragraph(title, style('Normal', fontSize=10, fontName='Helvetica-Bold',
                                    textColor=WHITE, alignment=TA_LEFT))]]
    t = Table(data, colWidths=[170*mm])
    t.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,-1), NAVY),
        ('TOPPADDING', (0,0), (-1,-1), 4),
        ('BOTTOMPADDING',(0,0),(-1,-1), 4),
        ('LEFTPADDING', (0,0), (-1,-1), 6),
    ]))
    return t

def checkbox_row(items):
    """Row of labelled checkboxes: items = list of strings"""
    n = len(items)
    w = 170*mm / n
    data = [[Paragraph(f"☐  {it}", small) for it in items]]
    t = Table(data, colWidths=[w]*n)
    t.setStyle(TableStyle([
        ('BOX',       (0,0), (-1,-1), 0.5, MGRAY),
        ('INNERGRID', (0,0), (-1,-1), 0.5, MGRAY),
        ('VALIGN',    (0,0), (-1,-1), 'MIDDLE'),
        ('TOPPADDING',(0,0),(-1,-1), 3),
        ('BOTTOMPADDING',(0,0),(-1,-1), 3),
        ('LEFTPADDING',(0,0),(-1,-1), 4),
    ]))
    return t

def lines_block(n=3, label_text=''):
    rows = []
    if label_text:
        rows.append([Paragraph(label_text, label), ''])
    for _ in range(n):
        rows.append(['', ''])
    t = Table(rows, colWidths=[40*mm, 130*mm])
    ts = [
        ('BOX', (0,0), (-1,-1), 0.5, MGRAY),
        ('INNERGRID', (0,0), (-1,-1), 0.5, MGRAY),
        ('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
        ('TOPPADDING', (0,0), (-1,-1), 2),
        ('BOTTOMPADDING', (0,0), (-1,-1), 2),
        ('LEFTPADDING', (0,0), (-1,-1), 4),
        ('MINROWHEIGHT', (0,0), (-1,-1), 7*mm),
    ]
    if label_text:
        ts.append(('BACKGROUND', (0,0), (0,0), LGRAY))
        ts.append(('SPAN', (0,0), (0, n)))
    t.setStyle(TableStyle(ts))
    return t

def tall_field(label_text, rows=4):
    data = [[Paragraph(label_text, label)]]
    for _ in range(rows):
        data.append([''])
    t = Table(data, colWidths=[170*mm])
    t.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (0,0), LGRAY),
        ('BOX',        (0,0), (-1,-1), 0.5, MGRAY),
        ('INNERGRID',  (0,0), (-1,-1), 0.5, MGRAY),
        ('VALIGN',     (0,0), (-1,-1), 'TOP'),
        ('TOPPADDING', (0,0), (-1,-1), 3),
        ('BOTTOMPADDING',(0,0),(-1,-1), 3),
        ('LEFTPADDING',(0,0),(-1,-1), 4),
        ('MINROWHEIGHT',(0,1),(-1,-1), 8*mm),
    ]))
    return t

def sig_block():
    data = [[
        Paragraph('Signature of Treating Doctor', small),
        Paragraph('Date', small),
        Paragraph('Stamp / Seal', small),
    ]]
    for _ in range(3):
        data.append(['', '', ''])
    t = Table(data, colWidths=[60*mm, 50*mm, 60*mm])
    t.setStyle(TableStyle([
        ('BOX',       (0,0), (-1,-1), 0.5, MGRAY),
        ('INNERGRID', (0,0), (-1,-1), 0.5, MGRAY),
        ('VALIGN',    (0,0), (-1,-1), 'MIDDLE'),
        ('BACKGROUND',(0,0), (-1,0), LGRAY),
        ('TOPPADDING',(0,0), (-1,-1), 2),
        ('BOTTOMPADDING',(0,0),(-1,-1), 2),
        ('LEFTPADDING',(0,0),(-1,-1), 4),
        ('MINROWHEIGHT',(0,1),(-1,-1), 8*mm),
    ]))
    return t

# ═══════════════════════════════════════════════════════════════════════════════
#  BUILD DOCUMENT
# ═══════════════════════════════════════════════════════════════════════════════
doc = SimpleDocTemplate(
    OUTPUT,
    pagesize=A4,
    topMargin=22*mm, bottomMargin=28*mm,
    leftMargin=20*mm, rightMargin=20*mm,
    title="ECHS IPD Hospital File",
    author="ECHS Empanelled Hospital",
)
story = []

# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# COVER PAGE
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
story.append(Spacer(1, 20*mm))

# Title banner
banner_data = [[Paragraph(
    'EX-SERVICEMEN CONTRIBUTORY HEALTH SCHEME',
    style('Normal', fontSize=16, fontName='Helvetica-Bold',
          textColor=WHITE, alignment=TA_CENTER))]]
banner = Table(banner_data, colWidths=[170*mm])
banner.setStyle(TableStyle([
    ('BACKGROUND', (0,0), (-1,-1), NAVY),
    ('TOPPADDING', (0,0), (-1,-1), 10),
    ('BOTTOMPADDING', (0,0), (-1,-1), 10),
]))
story.append(banner)

story.append(Spacer(1, 3*mm))

sub_banner_data = [[Paragraph(
    'Ministry of Defence, Government of India',
    style('Normal', fontSize=10, fontName='Helvetica',
          textColor=WHITE, alignment=TA_CENTER))]]
sub_banner = Table(sub_banner_data, colWidths=[170*mm])
sub_banner.setStyle(TableStyle([
    ('BACKGROUND', (0,0), (-1,-1), GOLD),
    ('TOPPADDING', (0,0), (-1,-1), 5),
    ('BOTTOMPADDING', (0,0), (-1,-1), 5),
]))
story.append(sub_banner)

story.append(Spacer(1, 12*mm))
story.append(Paragraph("INPATIENT DEPARTMENT (IPD)", center_big))
story.append(Paragraph("COMPLETE HOSPITAL FILE", center_big))
story.append(Spacer(1, 4*mm))
story.append(HRFlowable(width="100%", thickness=2, color=NAVY))
story.append(Spacer(1, 4*mm))
story.append(Paragraph("Standard Documentation Package for ECHS Empanelled Hospitals", center_med))
story.append(Spacer(1, 12*mm))

# Cover info table
cover_info = [
    [Paragraph("HOSPITAL NAME:", label), ''],
    [Paragraph("ECHS EMPANELMENT NO.:", label), ''],
    [Paragraph("REGIONAL CENTRE:", label), ''],
    [Paragraph("FILE / ADMISSION NO.:", label), ''],
    [Paragraph("DATE OF ADMISSION:", label), ''],
    [Paragraph("PATIENT NAME:", label), ''],
    [Paragraph("ECHS CARD NO.:", label), ''],
]
t = Table(cover_info, colWidths=[70*mm, 100*mm])
t.setStyle(TableStyle([
    ('BACKGROUND', (0,0), (0,-1), LGRAY),
    ('BOX',        (0,0), (-1,-1), 1, NAVY),
    ('INNERGRID',  (0,0), (-1,-1), 0.5, MGRAY),
    ('VALIGN',     (0,0), (-1,-1), 'MIDDLE'),
    ('TOPPADDING', (0,0), (-1,-1), 4),
    ('BOTTOMPADDING',(0,0),(-1,-1), 4),
    ('LEFTPADDING',(0,0),(-1,-1), 6),
    ('MINROWHEIGHT',(0,0),(-1,-1), 9*mm),
]))
story.append(t)

story.append(Spacer(1, 10*mm))
story.append(Paragraph(
    "This file contains all mandatory documentation as per ECHS SOP for Online Bill Processing "
    "(ECHS/CO/SOP). All pages must be numbered, signed, and stamped by the treating doctor and "
    "Hospital Medical Record Department before submission to the Regional Centre / UTIITSL portal.",
    italic_sm))
story.append(Spacer(1, 8*mm))
story.append(Paragraph("CONFIDENTIAL MEDICAL RECORD - FOR OFFICIAL USE ONLY", 
    style('Normal', fontSize=9, fontName='Helvetica-Bold', 
          textColor=RED, alignment=TA_CENTER)))
story.append(PageBreak())

# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# PAGE 2: FILE INDEX / TABLE OF CONTENTS
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
story.append(Paragraph("FILE INDEX", heading1))
story.append(HRFlowable(width="100%", thickness=1.5, color=NAVY))
story.append(Spacer(1, 4*mm))

index_data = [
    [Paragraph('S.No', label), Paragraph('Document', label),
     Paragraph('Page No.', label), Paragraph('Checked (✓)', label)],
    ['1', 'Cover Sheet & File Index', '', ''],
    ['2', 'ECHS Smart Card Photocopy', '', ''],
    ['3', 'Referral Form from Polyclinic / Emergency Certificate', '', ''],
    ['4', 'Patient Registration & Admission Case Note', '', ''],
    ['5', 'Consent Forms (General + Procedure-specific)', '', ''],
    ['6', 'Clinical Assessment / History & Physical Examination', '', ''],
    ['7', 'Vital Signs Chart', '', ''],
    ['8', 'Drug Administration Chart', '', ''],
    ['9', 'Investigation Reports (Lab, Imaging - chronological)', '', ''],
    ['10', 'Specialist Consultation Notes', '', ''],
    ['11', 'Operation / Procedure Notes (if applicable)', '', ''],
    ['12', 'Implant Invoice + Barcode Sticker (if applicable)', '', ''],
    ['13', 'Prior Approval Letter from ECHS (if applicable)', '', ''],
    ['14', 'Discharge Summary', '', ''],
    ['15', 'Final Bill – Summary + Itemized Breakup', '', ''],
    ['16', 'MRP Certificate (countersigned by Polyclinic/RC)', '', ''],
    ['17', 'MOA Copy covering period of hospitalization + Annexure-II', '', ''],
    ['18', 'Death Summary (if applicable)', '', ''],
]
idx_t = Table(index_data, colWidths=[12*mm, 105*mm, 25*mm, 28*mm])
idx_t.setStyle(TableStyle([
    ('BACKGROUND', (0,0), (-1,0), NAVY),
    ('TEXTCOLOR',  (0,0), (-1,0), WHITE),
    ('FONTNAME',   (0,0), (-1,0), 'Helvetica-Bold'),
    ('FONTSIZE',   (0,0), (-1,-1), 8.5),
    ('ROWBACKGROUNDS', (0,1), (-1,-1), [WHITE, LGRAY]),
    ('BOX',        (0,0), (-1,-1), 1, NAVY),
    ('INNERGRID',  (0,0), (-1,-1), 0.5, MGRAY),
    ('VALIGN',     (0,0), (-1,-1), 'MIDDLE'),
    ('TOPPADDING', (0,0), (-1,-1), 3),
    ('BOTTOMPADDING',(0,0),(-1,-1), 3),
    ('LEFTPADDING',(0,0),(-1,-1), 4),
    ('MINROWHEIGHT',(0,1),(-1,-1), 8*mm),
]))
story.append(idx_t)
story.append(Spacer(1, 6*mm))
story.append(Paragraph(
    "Note: Pages must be numbered sequentially on each page. All documents to be uploaded on "
    "UTIITSL portal in PDF format AND submitted in physical form to the Regional Centre.",
    italic_sm))
story.append(PageBreak())

# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# PAGE 3: ECHS CARD PLACEHOLDER
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
story.append(section_header("DOCUMENT 2: ECHS SMART CARD PHOTOCOPY"))
story.append(Spacer(1, 4*mm))
story.append(Paragraph(
    "Attach a clear photocopy of the ECHS Smart Card (front & back) of the primary beneficiary.",
    normal))
story.append(Spacer(1, 3*mm))
box_data = [['FRONT OF ECHS CARD'], ['(Affix Photocopy Here)']]
card_box = Table(box_data, colWidths=[170*mm])
card_box.setStyle(TableStyle([
    ('BOX',        (0,0), (-1,-1), 1, NAVY),
    ('INNERGRID',  (0,0), (-1,-1), 0.5, MGRAY),
    ('BACKGROUND', (0,0), (0,0), LGRAY),
    ('FONTNAME',   (0,0), (0,0), 'Helvetica-Bold'),
    ('ALIGN',      (0,0), (-1,-1), 'CENTER'),
    ('VALIGN',     (0,0), (-1,-1), 'MIDDLE'),
    ('MINROWHEIGHT',(0,1),(0,1), 35*mm),
    ('TOPPADDING', (0,0), (-1,-1), 4),
]))
story.append(card_box)
story.append(Spacer(1, 5*mm))
back_box = Table([['BACK OF ECHS CARD'], ['(Affix Photocopy Here)']], colWidths=[170*mm])
back_box.setStyle(TableStyle([
    ('BOX',        (0,0), (-1,-1), 1, NAVY),
    ('INNERGRID',  (0,0), (-1,-1), 0.5, MGRAY),
    ('BACKGROUND', (0,0), (0,0), LGRAY),
    ('FONTNAME',   (0,0), (0,0), 'Helvetica-Bold'),
    ('ALIGN',      (0,0), (-1,-1), 'CENTER'),
    ('VALIGN',     (0,0), (-1,-1), 'MIDDLE'),
    ('MINROWHEIGHT',(0,1),(0,1), 35*mm),
    ('TOPPADDING', (0,0), (-1,-1), 4),
]))
story.append(back_box)
story.append(Spacer(1, 4*mm))
story.append(field_row("Verified by (Name & Designation):"))
story.append(Spacer(1, 2*mm))
story.append(two_fields("Date of Verification:", "ECHS Card Number:"))
story.append(PageBreak())

# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# PAGE 4: REFERRAL FORM
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
story.append(section_header("DOCUMENT 3: REFERRAL FORM / EMERGENCY CERTIFICATE"))
story.append(Spacer(1, 4*mm))
story.append(Paragraph("SECTION A: POLYCLINIC REFERRAL DETAILS", heading2))
story.append(field_row("Name of Parent Polyclinic:"))
story.append(Spacer(1, 1*mm))
story.append(field_row("Polyclinic Address:"))
story.append(Spacer(1, 1*mm))
story.append(two_fields("Referral No.:", "Referral Date:"))
story.append(Spacer(1, 1*mm))
story.append(field_row("Referred By (MO/Specialist Name & Designation):"))
story.append(Spacer(1, 1*mm))
story.append(field_row("Referred To (Hospital Name):"))
story.append(Spacer(1, 1*mm))
story.append(field_row("Department / Specialty Referred To:"))
story.append(Spacer(1, 1*mm))
story.append(Paragraph("Referral Valid For:", heading3))
story.append(checkbox_row(['Indoor Treatment (IPD)', 'Day Care', 'Investigation Only', 'OPD Consultation (max 6)']))
story.append(Spacer(1, 1*mm))
story.append(field_row("Referral Valid Up To (Date):"))
story.append(Spacer(1, 1*mm))
story.append(tall_field("Brief Clinical History / Provisional Diagnosis:", rows=4))
story.append(Spacer(1, 1*mm))
story.append(tall_field("Specific Treatment / Procedure / Investigation Required:", rows=3))
story.append(Spacer(1, 3*mm))
story.append(sig_block())
story.append(Spacer(1, 5*mm))
story.append(HRFlowable(width="100%", thickness=0.5, color=MGRAY))
story.append(Spacer(1, 3*mm))
story.append(Paragraph("SECTION B: EMERGENCY CERTIFICATE (Fill ONLY for Emergency Admissions)", heading2))
story.append(Paragraph(
    "This is to certify that the above-named patient presented to our Emergency Department "
    "on ___________ at __________ hrs and required immediate/emergency hospitalization. "
    "Delay in admission would have been life-threatening / risked serious aggravation of condition.",
    style('Normal', fontSize=9, leading=13)))
story.append(Spacer(1, 3*mm))
story.append(field_row("Reason for Emergency (brief):"))
story.append(Spacer(1, 3*mm))
story.append(sig_block())
story.append(PageBreak())

# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# PAGE 5: ADMISSION CASE NOTE
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
story.append(section_header("DOCUMENT 4: PATIENT REGISTRATION & ADMISSION CASE NOTE"))
story.append(Spacer(1, 4*mm))
story.append(Paragraph("SECTION A: PATIENT DETAILS", heading2))
story.append(field_row("Patient Full Name:"))
story.append(Spacer(1, 1*mm))
story.append(two_fields("Date of Birth:", "Age / Sex:"))
story.append(Spacer(1, 1*mm))
story.append(field_row("Address:"))
story.append(Spacer(1, 1*mm))
story.append(two_fields("Mobile No.:", "Aadhar No.:"))
story.append(Spacer(1, 1*mm))
story.append(field_row("ECHS Card No.:"))
story.append(Spacer(1, 1*mm))
story.append(Paragraph("Beneficiary Type:", heading3))
story.append(checkbox_row([
    'Primary Beneficiary (ESM)', 'Spouse', 'Dependent Child', 'Dependent Parent'
]))
story.append(Spacer(1, 2*mm))
story.append(Paragraph("SECTION B: PRIMARY BENEFICIARY (ESM) DETAILS", heading2))
story.append(field_row("Name of ESM:"))
story.append(Spacer(1, 1*mm))
story.append(two_fields("Rank:", "Service / Regt. / Corps:"))
story.append(Spacer(1, 1*mm))
story.append(two_fields("Army/Navy/Air Force No.:", "Date of Retirement:"))
story.append(Spacer(1, 2*mm))
story.append(Paragraph("SECTION C: ADMISSION DETAILS", heading2))
story.append(two_fields("Date of Admission:", "Time of Admission:"))
story.append(Spacer(1, 1*mm))
story.append(two_fields("Ward / Bed No.:", "Admitting Doctor:"))
story.append(Spacer(1, 1*mm))
story.append(field_row("Admission Type:"))
story.append(checkbox_row(['Planned (with Referral)', 'Emergency', 'Transferred from Another Hospital']))
story.append(Spacer(1, 1*mm))
story.append(field_row("Presenting Complaint:"))
story.append(Spacer(1, 2*mm))
story.append(Paragraph("SECTION D: WARD ENTITLEMENT", heading2))
story.append(checkbox_row(['General Ward', 'Semi-Private', 'Private Room']))
story.append(Spacer(1, 1*mm))
story.append(Paragraph(
    "Note: Ward entitlement is as per rank of primary beneficiary. "
    "Officers (Colonel and above) – Private Room; JCOs – Semi-Private; Other Ranks – General Ward.",
    italic_sm))
story.append(Spacer(1, 3*mm))
story.append(sig_block())
story.append(PageBreak())

# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# PAGE 6: CONSENT FORMS
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
story.append(section_header("DOCUMENT 5: CONSENT FORMS"))
story.append(Spacer(1, 4*mm))
story.append(Paragraph("FORM A: GENERAL CONSENT FOR TREATMENT", heading2))
story.append(Paragraph(
    "I, __________________________________, the patient / legally authorized representative "
    "of the patient __________________________________, hereby voluntarily give consent for "
    "examination, diagnosis, and treatment by the medical staff at "
    "__________________________________ Hospital. I understand the general nature of the "
    "proposed treatment and acknowledge that the hospital has explained the risks, benefits, "
    "and alternatives to my satisfaction.",
    style('Normal', fontSize=9, leading=14, spaceAfter=4)))
story.append(Spacer(1, 3*mm))
story.append(two_fields("Patient/Guardian Signature:", "Relation to Patient:"))
story.append(Spacer(1, 1*mm))
story.append(two_fields("Date:", "Witness Signature:"))
story.append(Spacer(1, 5*mm))
story.append(HRFlowable(width="100%", thickness=0.5, color=MGRAY))
story.append(Spacer(1, 4*mm))
story.append(Paragraph("FORM B: CONSENT FOR SURGICAL PROCEDURE / ANAESTHESIA", heading2))
story.append(Paragraph("(Complete only if surgical or invasive procedure is planned)", italic_sm))
story.append(Spacer(1, 2*mm))
story.append(field_row("Name of Procedure / Surgery:"))
story.append(Spacer(1, 1*mm))
story.append(field_row("Performing Surgeon:"))
story.append(Spacer(1, 1*mm))
story.append(field_row("Anaesthetist:"))
story.append(Spacer(1, 1*mm))
story.append(field_row("Type of Anaesthesia:"))
story.append(checkbox_row(['General Anaesthesia', 'Spinal / Epidural', 'Local / Regional', 'Sedation', 'No Anaesthesia']))
story.append(Spacer(1, 2*mm))
story.append(Paragraph(
    "I have been explained the nature of the above procedure, possible complications, "
    "alternative treatments, and consequences of non-intervention. I consent to the "
    "procedure and any modifications that the surgeon may deem necessary during the operation.",
    style('Normal', fontSize=9, leading=14, spaceAfter=4)))
story.append(Spacer(1, 3*mm))
story.append(two_fields("Patient/Guardian Signature:", "Relation to Patient:"))
story.append(Spacer(1, 1*mm))
story.append(two_fields("Date & Time:", "Witness Signature:"))
story.append(PageBreak())

# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# PAGE 7: HISTORY & PHYSICAL EXAMINATION
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
story.append(section_header("DOCUMENT 6: CLINICAL ASSESSMENT – HISTORY & PHYSICAL EXAMINATION"))
story.append(Spacer(1, 4*mm))
story.append(Paragraph("SECTION A: CHIEF COMPLAINT & HISTORY", heading2))
story.append(tall_field("Chief Complaint (with duration):", rows=3))
story.append(Spacer(1, 1*mm))
story.append(tall_field("History of Present Illness:", rows=5))
story.append(Spacer(1, 1*mm))
story.append(tall_field("Past Medical / Surgical History:", rows=3))
story.append(Spacer(1, 1*mm))
story.append(tall_field("Drug History / Allergies:", rows=2))
story.append(Spacer(1, 1*mm))
story.append(tall_field("Family History:", rows=2))
story.append(Spacer(1, 2*mm))
story.append(Paragraph("SECTION B: PHYSICAL EXAMINATION", heading2))

vitals_data = [
    [Paragraph('Parameter', label), Paragraph('On Admission', label),
     Paragraph('After 24 hrs', label), Paragraph('Normal Range', label)],
    ['Blood Pressure (mmHg)', '', '', '100/60 – 140/90'],
    ['Pulse Rate (per min)', '', '', '60 – 100'],
    ['Respiratory Rate (per min)', '', '', '14 – 20'],
    ['Temperature (°F)', '', '', '97.8 – 99.1'],
    ['SpO2 (%)', '', '', '95 – 100'],
    ['Random Blood Sugar (mg/dL)', '', '', '70 – 140'],
    ['Height (cm) / Weight (kg)', '', '', '—'],
    ['BMI', '', '', '18.5 – 24.9'],
]
vt = Table(vitals_data, colWidths=[55*mm, 38*mm, 38*mm, 39*mm])
vt.setStyle(TableStyle([
    ('BACKGROUND', (0,0), (-1,0), NAVY),
    ('TEXTCOLOR',  (0,0), (-1,0), WHITE),
    ('FONTNAME',   (0,0), (-1,0), 'Helvetica-Bold'),
    ('FONTSIZE',   (0,0), (-1,-1), 8.5),
    ('ROWBACKGROUNDS', (0,1), (-1,-1), [WHITE, LGRAY]),
    ('BOX',        (0,0), (-1,-1), 1, NAVY),
    ('INNERGRID',  (0,0), (-1,-1), 0.5, MGRAY),
    ('VALIGN',     (0,0), (-1,-1), 'MIDDLE'),
    ('TOPPADDING', (0,0), (-1,-1), 3),
    ('BOTTOMPADDING',(0,0),(-1,-1), 3),
    ('LEFTPADDING',(0,0),(-1,-1), 4),
    ('MINROWHEIGHT',(0,1),(-1,-1), 7.5*mm),
]))
story.append(vt)
story.append(Spacer(1, 2*mm))
story.append(tall_field("Systemic Examination Findings:", rows=5))
story.append(Spacer(1, 2*mm))
story.append(tall_field("Provisional Diagnosis / Diagnosis:", rows=2))
story.append(Spacer(1, 3*mm))
story.append(sig_block())
story.append(PageBreak())

# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# PAGE 8: DRUG ADMINISTRATION CHART
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
story.append(section_header("DOCUMENT 8: DRUG ADMINISTRATION CHART"))
story.append(Spacer(1, 4*mm))
story.append(two_fields("Patient Name:", "Admission No.:"))
story.append(Spacer(1, 2*mm))

drug_header = [
    [Paragraph(h, label) for h in
     ['S.No', 'Drug Name & Dose', 'Route', 'Frequency', 'Start Date',
      'Stop Date', 'Given By', 'Remarks']]
]
drug_rows = [['', '', '', '', '', '', '', ''] for _ in range(12)]
drug_data = drug_header + drug_rows
dw = [10*mm, 45*mm, 16*mm, 20*mm, 20*mm, 20*mm, 20*mm, 19*mm]
dt = Table(drug_data, colWidths=dw)
dt.setStyle(TableStyle([
    ('BACKGROUND', (0,0), (-1,0), NAVY),
    ('TEXTCOLOR',  (0,0), (-1,0), WHITE),
    ('FONTNAME',   (0,0), (-1,0), 'Helvetica-Bold'),
    ('FONTSIZE',   (0,0), (-1,-1), 8),
    ('ROWBACKGROUNDS', (0,1), (-1,-1), [WHITE, LGRAY]),
    ('BOX',        (0,0), (-1,-1), 1, NAVY),
    ('INNERGRID',  (0,0), (-1,-1), 0.5, MGRAY),
    ('VALIGN',     (0,0), (-1,-1), 'MIDDLE'),
    ('TOPPADDING', (0,0), (-1,-1), 2),
    ('BOTTOMPADDING',(0,0),(-1,-1), 2),
    ('LEFTPADDING',(0,0),(-1,-1), 3),
    ('MINROWHEIGHT',(0,1),(-1,-1), 8*mm),
]))
story.append(dt)
story.append(Spacer(1, 4*mm))
story.append(Paragraph(
    "Note: All drugs administered must be cross-checked with ECHS-approved formulary. "
    "Non-formulary drugs require prior approval. All drug orders must be signed by the "
    "prescribing doctor. This chart to be submitted with the final bill.",
    italic_sm))
story.append(Spacer(1, 3*mm))
story.append(sig_block())
story.append(PageBreak())

# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# PAGE 9: INVESTIGATION REPORTS CHECKLIST
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
story.append(section_header("DOCUMENT 9: INVESTIGATION REPORTS – CHRONOLOGICAL LOG"))
story.append(Spacer(1, 3*mm))
story.append(Paragraph(
    "All investigation reports must be arranged in chronological order and attached below this sheet. "
    "Each report must bear the hospital stamp and the ordering doctor's signature.",
    normal))
story.append(Spacer(1, 3*mm))

inv_header = [[Paragraph(h, label) for h in
               ['S.No', 'Investigation Name', 'Date Ordered', 'Date Reported', 'Result / Finding', 'Attached (✓)']]]
inv_rows = [['', '', '', '', '', ''] for _ in range(16)]
inv_data = inv_header + inv_rows
iw = [10*mm, 55*mm, 25*mm, 25*mm, 40*mm, 15*mm]
it = Table(inv_data, colWidths=iw)
it.setStyle(TableStyle([
    ('BACKGROUND', (0,0), (-1,0), NAVY),
    ('TEXTCOLOR',  (0,0), (-1,0), WHITE),
    ('FONTNAME',   (0,0), (-1,0), 'Helvetica-Bold'),
    ('FONTSIZE',   (0,0), (-1,-1), 8),
    ('ROWBACKGROUNDS', (0,1), (-1,-1), [WHITE, LGRAY]),
    ('BOX',        (0,0), (-1,-1), 1, NAVY),
    ('INNERGRID',  (0,0), (-1,-1), 0.5, MGRAY),
    ('VALIGN',     (0,0), (-1,-1), 'MIDDLE'),
    ('TOPPADDING', (0,0), (-1,-1), 2),
    ('BOTTOMPADDING',(0,0),(-1,-1), 2),
    ('LEFTPADDING',(0,0),(-1,-1), 3),
    ('MINROWHEIGHT',(0,1),(-1,-1), 8*mm),
]))
story.append(it)
story.append(Spacer(1, 4*mm))
story.append(sig_block())
story.append(PageBreak())

# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# PAGE 10: OPERATION / PROCEDURE NOTES
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
story.append(section_header("DOCUMENT 11: OPERATION / PROCEDURE NOTES"))
story.append(Paragraph("(Complete only if a surgical / invasive procedure was performed)", italic_sm))
story.append(Spacer(1, 4*mm))
story.append(two_fields("Date of Surgery:", "OT No.:"))
story.append(Spacer(1, 1*mm))
story.append(two_fields("Start Time:", "End Time:"))
story.append(Spacer(1, 1*mm))
story.append(field_row("Name of Procedure / Surgery:"))
story.append(Spacer(1, 1*mm))
story.append(field_row("Primary Surgeon:"))
story.append(Spacer(1, 1*mm))
story.append(field_row("Assistant Surgeon(s):"))
story.append(Spacer(1, 1*mm))
story.append(field_row("Anaesthetist:"))
story.append(Spacer(1, 1*mm))
story.append(field_row("Scrub Nurse / Technician:"))
story.append(Spacer(1, 1*mm))
story.append(field_row("Type of Anaesthesia Given:"))
story.append(Spacer(1, 1*mm))
story.append(tall_field("Pre-operative Diagnosis:", rows=2))
story.append(Spacer(1, 1*mm))
story.append(tall_field("Post-operative Diagnosis:", rows=2))
story.append(Spacer(1, 1*mm))
story.append(tall_field("Procedure Details (Step-by-step operative notes):", rows=7))
story.append(Spacer(1, 1*mm))
story.append(tall_field("Intra-operative Findings:", rows=3))
story.append(Spacer(1, 1*mm))
story.append(tall_field("Blood Loss / Transfusion:", rows=2))
story.append(Spacer(1, 1*mm))
story.append(tall_field("Implants Used (Name, Brand, Size, Lot/Batch No.):", rows=3))
story.append(Spacer(1, 1*mm))
story.append(Paragraph(
    "Intraoperative photographs must be attached. Implant barcode sticker and invoice mandatory.",
    red_note))
story.append(Spacer(1, 3*mm))
story.append(sig_block())
story.append(PageBreak())

# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# PAGE 11: DISCHARGE SUMMARY
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
story.append(section_header("DOCUMENT 14: DISCHARGE SUMMARY"))
story.append(Spacer(1, 4*mm))
story.append(Paragraph("SECTION A: PATIENT DETAILS", heading2))
story.append(field_row("Patient Name:"))
story.append(Spacer(1, 1*mm))
story.append(two_fields("ECHS Card No.:", "Age / Sex:"))
story.append(Spacer(1, 1*mm))
story.append(two_fields("Date of Admission:", "Date of Discharge:"))
story.append(Spacer(1, 1*mm))
story.append(two_fields("Ward / Bed No.:", "Total Days Admitted:"))
story.append(Spacer(1, 1*mm))
story.append(field_row("Treating Consultant:"))
story.append(Spacer(1, 2*mm))
story.append(Paragraph("SECTION B: CLINICAL DETAILS", heading2))
story.append(tall_field("Admission Diagnosis:", rows=2))
story.append(Spacer(1, 1*mm))
story.append(tall_field("Final Diagnosis (ICD-10 Code if available):", rows=2))
story.append(Spacer(1, 1*mm))
story.append(tall_field("Summary of Treatment Given:", rows=5))
story.append(Spacer(1, 1*mm))
story.append(tall_field("Surgery / Procedures Performed (with dates):", rows=3))
story.append(Spacer(1, 1*mm))
story.append(tall_field("Significant Investigation Findings:", rows=3))
story.append(Spacer(1, 2*mm))
story.append(Paragraph("SECTION C: DISCHARGE DETAILS", heading2))
story.append(Paragraph("Condition at Discharge:", heading3))
story.append(checkbox_row(['Recovered', 'Improved', 'Stable', 'LAMA', 'Transferred', 'Expired (→ attach Death Summary)']))
story.append(Spacer(1, 1*mm))
story.append(tall_field("Discharge Medications (Name, Dose, Frequency, Duration):", rows=5))
story.append(Spacer(1, 1*mm))
story.append(tall_field("Follow-up Instructions / Diet / Activity Advice:", rows=3))
story.append(Spacer(1, 1*mm))
story.append(two_fields("Next Follow-up Date:", "Polyclinic / Clinic:"))
story.append(Spacer(1, 3*mm))
story.append(sig_block())
story.append(PageBreak())

# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# PAGE 12: FINAL BILL
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
story.append(section_header("DOCUMENT 15: FINAL BILL – SUMMARY & ITEMIZED BREAKUP"))
story.append(Spacer(1, 4*mm))
story.append(Paragraph("PART A: BILL SUMMARY", heading2))
story.append(two_fields("Patient Name:", "ECHS Card No.:"))
story.append(Spacer(1, 1*mm))
story.append(two_fields("Admission No.:", "Date of Admission / Discharge:"))
story.append(Spacer(1, 1*mm))
story.append(field_row("CGHS Rate Package Code (if applicable):"))
story.append(Spacer(1, 2*mm))

bill_summary = [
    [Paragraph('Head of Charges', label), Paragraph('Amount (Rs.)', label),
     Paragraph('CGHS / ECHS Rate (Rs.)', label), Paragraph('Difference', label)],
    ['Room / Bed Charges', '', '', ''],
    ['Nursing Charges', '', '', ''],
    ['Doctor Consultation Fees', '', '', ''],
    ['OT / Procedure Charges', '', '', ''],
    ['Anaesthesia Charges', '', '', ''],
    ['Medicines & Consumables', '', '', ''],
    ['Implants / Prosthetics', '', '', ''],
    ['Lab / Pathology Charges', '', '', ''],
    ['Radiology / Imaging Charges', '', '', ''],
    ['Physiotherapy', '', '', ''],
    ['Ambulance Charges', '', '', ''],
    ['Other Charges', '', '', ''],
    [Paragraph('TOTAL', style('Normal', fontSize=9, fontName='Helvetica-Bold')),
     '', '', ''],
    ['GST (if applicable @5%)', '', '', ''],
    [Paragraph('GRAND TOTAL', style('Normal', fontSize=9, fontName='Helvetica-Bold',
                                     textColor=NAVY)), '', '', ''],
]
bw = [70*mm, 33*mm, 37*mm, 30*mm]
bt = Table(bill_summary, colWidths=bw)
bt.setStyle(TableStyle([
    ('BACKGROUND', (0,0), (-1,0), NAVY),
    ('TEXTCOLOR',  (0,0), (-1,0), WHITE),
    ('FONTNAME',   (0,0), (-1,0), 'Helvetica-Bold'),
    ('FONTSIZE',   (0,0), (-1,-1), 8.5),
    ('ROWBACKGROUNDS', (0,1), (-1,-2), [WHITE, LGRAY]),
    ('BACKGROUND', (0,-1), (-1,-1), colors.HexColor('#E8F0F7')),
    ('BACKGROUND', (0,-3), (-1,-3), colors.HexColor('#E8F0F7')),
    ('BOX',        (0,0), (-1,-1), 1, NAVY),
    ('INNERGRID',  (0,0), (-1,-1), 0.5, MGRAY),
    ('VALIGN',     (0,0), (-1,-1), 'MIDDLE'),
    ('TOPPADDING', (0,0), (-1,-1), 3),
    ('BOTTOMPADDING',(0,0),(-1,-1), 3),
    ('LEFTPADDING',(0,0),(-1,-1), 4),
    ('MINROWHEIGHT',(0,1),(-1,-1), 7.5*mm),
]))
story.append(bt)
story.append(Spacer(1, 3*mm))
story.append(Paragraph(
    "Note: Bills must be at CGHS/ECHS approved rates. Any charge exceeding the approved "
    "rate requires prior approval from Regional Centre. GST certificate to be attached.",
    italic_sm))
story.append(Spacer(1, 3*mm))
story.append(sig_block())
story.append(PageBreak())

# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# PAGE 13: MRP CERTIFICATE
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
story.append(section_header("DOCUMENT 16: MRP CERTIFICATE"))
story.append(Spacer(1, 4*mm))
story.append(Paragraph(
    "CERTIFICATE BY EMPANELLED HOSPITAL",
    style('Normal', fontSize=11, fontName='Helvetica-Bold',
          textColor=NAVY, alignment=TA_CENTER)))
story.append(Spacer(1, 4*mm))
story.append(Paragraph(
    "This is to certify that all drugs and consumables supplied to ECHS beneficiary "
    "<b>_______________________________</b> (ECHS Card No: <b>_______________</b>) "
    "during the period of hospitalization from <b>____________</b> to <b>____________</b> "
    "have been charged at or below Maximum Retail Price (MRP) as printed on the packaging. "
    "No drug / item has been charged above MRP.",
    style('Normal', fontSize=9.5, leading=14)))
story.append(Spacer(1, 8*mm))
story.append(two_fields("Signature of Hospital Authority:", "Designation:"))
story.append(Spacer(1, 1*mm))
story.append(two_fields("Date:", "Hospital Seal:"))
story.append(Spacer(1, 8*mm))
story.append(HRFlowable(width="100%", thickness=0.5, color=MGRAY))
story.append(Spacer(1, 4*mm))
story.append(Paragraph("COUNTERSIGNATURE BY POLYCLINIC / REGIONAL CENTRE", heading2))
story.append(Spacer(1, 2*mm))
story.append(two_fields("Countersigned by (Name):", "Designation:"))
story.append(Spacer(1, 1*mm))
story.append(field_row("Polyclinic / Regional Centre:"))
story.append(Spacer(1, 1*mm))
story.append(two_fields("Date:", "Stamp / Seal:"))
story.append(PageBreak())

# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# PAGE 14: SUBMISSION CHECKLIST
# ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
story.append(section_header("FINAL SUBMISSION CHECKLIST – ECHS IPD CLAIM"))
story.append(Spacer(1, 4*mm))
story.append(Paragraph(
    "Before submitting the bill to UTIITSL portal and Regional Centre, verify ALL items below.",
    normal))
story.append(Spacer(1, 3*mm))

chk_data = [
    [Paragraph('S.No', label), Paragraph('Checklist Item', label),
     Paragraph('Done ✓', label), Paragraph('Remarks', label)],
    ['1', 'ECHS Smart Card photocopy attached', '', ''],
    ['2', 'Referral form from Polyclinic attached (or Emergency Cert)', '', ''],
    ['3', 'Admission Case Note completed and signed', '', ''],
    ['4', 'Patient consent forms signed and attached', '', ''],
    ['5', 'History & Physical Examination form completed', '', ''],
    ['6', 'Vital signs chart attached', '', ''],
    ['7', 'Drug administration chart completed', '', ''],
    ['8', 'Investigation reports attached in chronological order', '', ''],
    ['9', 'Specialist consultation notes attached', '', ''],
    ['10', 'Operation notes attached (if surgery done)', '', ''],
    ['11', 'Intraoperative photographs attached (if surgery done)', '', ''],
    ['12', 'Implant invoice + barcode sticker attached (if implant used)', '', ''],
    ['13', 'Prior approval letter attached (if required)', '', ''],
    ['14', 'Discharge Summary completed, signed, and stamped', '', ''],
    ['15', 'Final Bill (Summary + Itemized) prepared at CGHS rates', '', ''],
    ['16', 'MRP Certificate prepared and countersigned by Polyclinic/RC', '', ''],
    ['17', 'MOA copy (valid for hospitalization period) with Annexure-II', '', ''],
    ['18', 'All pages numbered sequentially', '', ''],
    ['19', 'All pages stamped with hospital seal', '', ''],
    ['20', 'Bill uploaded on UTIITSL portal in PDF format', '', ''],
    ['21', 'Physical copy dispatched to Regional Centre', '', ''],
    ['22', 'Claim ID / Reference No. noted for tracking', '', ''],
    ['23', 'GST breakup included (if applicable)', '', ''],
    ['24', 'Death Summary attached (if patient expired)', '', ''],
]
cw2 = [10*mm, 100*mm, 20*mm, 40*mm]
ct = Table(chk_data, colWidths=cw2)
ct.setStyle(TableStyle([
    ('BACKGROUND', (0,0), (-1,0), NAVY),
    ('TEXTCOLOR',  (0,0), (-1,0), WHITE),
    ('FONTNAME',   (0,0), (-1,0), 'Helvetica-Bold'),
    ('FONTSIZE',   (0,0), (-1,-1), 8.5),
    ('ROWBACKGROUNDS', (0,1), (-1,-1), [WHITE, LGRAY]),
    ('BOX',        (0,0), (-1,-1), 1, NAVY),
    ('INNERGRID',  (0,0), (-1,-1), 0.5, MGRAY),
    ('VALIGN',     (0,0), (-1,-1), 'MIDDLE'),
    ('TOPPADDING', (0,0), (-1,-1), 3),
    ('BOTTOMPADDING',(0,0),(-1,-1), 3),
    ('LEFTPADDING',(0,0),(-1,-1), 4),
    ('MINROWHEIGHT',(0,1),(-1,-1), 8*mm),
]))
story.append(ct)
story.append(Spacer(1, 5*mm))
story.append(Paragraph(
    "Claim submission: Upload on UTIITSL portal (echs.gov.in) → Login as Hospital → "
    "Bill/Medical Processing. Also submit physical file to the Regional Centre.",
    italic_sm))
story.append(Spacer(1, 4*mm))
story.append(field_row("Claim ID (after online submission):"))
story.append(Spacer(1, 1*mm))
story.append(two_fields("Submitted By (Name):", "Designation:"))
story.append(Spacer(1, 1*mm))
story.append(two_fields("Date of Online Submission:", "Date of Physical Submission:"))
story.append(Spacer(1, 3*mm))
story.append(sig_block())

# ─── BUILD ────────────────────────────────────────────────────────────────────
doc.build(story, canvasmaker=NumberedCanvas)
print(f"PDF created: {OUTPUT}")
Running Command

cd /tmp/workspace/echs-ipd-file && python build_echs_file.py

Running Command

ls -lh /tmp/workspace/echs-ipd-file/ECHS_IPD_Hospital_File.pdf

Your complete ECHS IPD Hospital File is ready. Download it here:

ECHS IPD Hospital File

PDF Document · PDF


What's Inside the File (14 Pages)

The file follows the official ECHS SOP for Online Bill Processing and includes all mandatory documents in the correct sequence:
#DocumentPurpose
1Cover SheetHospital details, patient ID, admission info
2File Index / Table of ContentsTrack all 18 documents with page numbers
3ECHS Smart Card Photocopy SlotPaste front & back of card here
4Referral Form + Emergency CertificatePolyclinic referral OR emergency justification
5Patient Registration & Admission Case NoteDemographics, ESM details, ward entitlement
6Consent Forms (General + Surgical)Mandatory before any treatment or procedure
7Clinical History & Physical ExaminationChief complaint, vitals table, systemic exam
8Drug Administration ChartAll drugs with dose, route, frequency, dates
9Investigation Reports LogChronological list of all lab/imaging reports
10Operation / Procedure NotesDetailed OT notes + implant/photograph requirements
11Discharge SummaryDiagnosis, treatment, discharge condition, follow-up
12Final Bill (Summary + Itemized)CGHS-rate breakup with GST column
13MRP CertificateHospital + Polyclinic countersignature
14Final Submission Checklist24-point checklist before UTIITSL portal upload

How to Use This File

  1. Print the file and keep one copy per patient admission
  2. Fill each form as the patient progresses through admission → treatment → discharge
  3. Number every page sequentially (mandatory per ECHS SOP)
  4. Stamp every page with the hospital seal
  5. Upload scanned PDF to the UTIITSL portal → Login as Hospital → Bill/Medical Processing
  6. Send physical copy to your Regional Centre ECHS office
  7. Note the Claim ID from the portal for tracking
This is a shared conversation. Sign in to Orris to start your own chat.