Kindly prepare best sop pdf for biomedical waste with nhm logo and hospital name - SDH dwarka hospital
NHM National Health Mission logo PNG download official
mkdir -p /tmp/workspace/bmw-sop && ls /tmp/workspace/
cd /tmp/workspace/bmw-sop && python3 << 'EOF' import requests # Download NHM logo from iconape (SVG/PNG) urls = [ ("https://iconape.com/wp-content/files/tx/264217/svg/264217.svg", "nhm_logo.svg"), ("https://www.clipartmax.com/png/middle/145-1452518_national-rural-health-mission-logo-vector.png", "nhm_logo.png"), ] for url, fname in urls: try: r = requests.get(url, timeout=10, headers={"User-Agent": "Mozilla/5.0"}) if r.status_code == 200: with open(fname, "wb") as f: f.write(r.content) print(f"Downloaded {fname}: {len(r.content)} bytes") else: print(f"Failed {url}: {r.status_code}") except Exception as e: print(f"Error {url}: {e}") EOF
cd /tmp/workspace/bmw-sop && python3 << 'PYEOF' from PIL import Image import io # Verify image img = Image.open("nhm_logo.png") print(f"NHM logo size: {img.size}, mode: {img.mode}") img.save("nhm_logo_converted.png") print("Saved nhm_logo_converted.png") PYEOF
cat > /tmp/workspace/bmw-sop/generate_sop.py << 'PYEOF' from reportlab.lib.pagesizes import A4 from reportlab.lib import colors from reportlab.lib.units import cm, mm from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle from reportlab.lib.enums import TA_CENTER, TA_LEFT, TA_JUSTIFY, TA_RIGHT from reportlab.platypus import ( SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, HRFlowable, Image as RLImage, PageBreak, KeepTogether ) from reportlab.pdfgen import canvas from reportlab.platypus import BaseDocTemplate, Frame, PageTemplate from reportlab.lib.colors import HexColor, white, black from datetime import datetime import os OUTPUT = "/tmp/workspace/bmw-sop/BMW_SOP_SDH_Dwarka.pdf" LOGO_PATH = "/tmp/workspace/bmw-sop/nhm_logo_converted.png" # ── Colours ────────────────────────────────────────────────────────────────── DARK_GREEN = HexColor("#1a5c2a") MED_GREEN = HexColor("#2e7d32") LIGHT_GREEN = HexColor("#e8f5e9") ORANGE = HexColor("#e65100") LIGHT_ORANGE = HexColor("#fff3e0") BLUE = HexColor("#0d47a1") LIGHT_BLUE = HexColor("#e3f2fd") RED = HexColor("#c62828") YELLOW_BG = HexColor("#fffde7") GREY_BG = HexColor("#f5f5f5") HEADER_BG = HexColor("#1b5e20") TABLE_HDR = HexColor("#2e7d32") PAGE_W, PAGE_H = A4 # ── Styles ──────────────────────────────────────────────────────────────────── styles = getSampleStyleSheet() def S(name, **kw): base = styles.get(name, styles["Normal"]) return ParagraphStyle(name + str(id(kw)), parent=base, **kw) title_style = S("Normal", fontSize=16, fontName="Helvetica-Bold", textColor=white, alignment=TA_CENTER, spaceAfter=2) subtitle_style= S("Normal", fontSize=11, fontName="Helvetica-Bold", textColor=LIGHT_GREEN, alignment=TA_CENTER, spaceAfter=2) hospital_style= S("Normal", fontSize=13, fontName="Helvetica-Bold", textColor=LIGHT_GREEN, alignment=TA_CENTER, spaceAfter=4) sop_title = S("Normal", fontSize=14, fontName="Helvetica-Bold", textColor=DARK_GREEN, alignment=TA_CENTER, spaceAfter=6, spaceBefore=6) h1 = S("Normal", fontSize=12, fontName="Helvetica-Bold", textColor=white, spaceBefore=8, spaceAfter=4) h2 = S("Normal", fontSize=11, fontName="Helvetica-Bold", textColor=DARK_GREEN, spaceBefore=6, spaceAfter=3) body = S("Normal", fontSize=9.5, fontName="Helvetica", leading=14, spaceAfter=3, alignment=TA_JUSTIFY) body_bold = S("Normal", fontSize=9.5, fontName="Helvetica-Bold", leading=14, spaceAfter=3) bullet_style = S("Normal", fontSize=9.5, fontName="Helvetica", leading=14, leftIndent=14, spaceAfter=2, bulletIndent=4, bulletFontName="Helvetica") small_italic = S("Normal", fontSize=8.5, fontName="Helvetica-Oblique", textColor=HexColor("#555555"), spaceAfter=2) table_hdr_st = S("Normal", fontSize=9, fontName="Helvetica-Bold", textColor=white, alignment=TA_CENTER) table_cell = S("Normal", fontSize=9, fontName="Helvetica", leading=12, alignment=TA_LEFT) table_cell_c = S("Normal", fontSize=9, fontName="Helvetica", leading=12, alignment=TA_CENTER) footer_style = S("Normal", fontSize=8, fontName="Helvetica-Oblique", textColor=HexColor("#555555"), alignment=TA_CENTER) warning_style = S("Normal", fontSize=9.5, fontName="Helvetica-Bold", textColor=RED, alignment=TA_CENTER) # ── Section heading helper ──────────────────────────────────────────────────── def section_heading(text, bg=TABLE_HDR): data = [[Paragraph(text, h1)]] t = Table(data, colWidths=[PAGE_W - 4*cm]) t.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,-1), bg), ("TOPPADDING", (0,0), (-1,-1), 5), ("BOTTOMPADDING", (0,0), (-1,-1), 5), ("LEFTPADDING", (0,0), (-1,-1), 10), ("RIGHTPADDING", (0,0), (-1,-1), 10), ("ROUNDEDCORNERS", [4]), ])) return t def info_box(rows, col_widths, header_row=True, alt_color=LIGHT_GREEN): style_cmds = [ ("GRID", (0,0), (-1,-1), 0.5, HexColor("#cccccc")), ("FONTSIZE", (0,0), (-1,-1), 9), ("TOPPADDING", (0,0), (-1,-1), 4), ("BOTTOMPADDING", (0,0), (-1,-1), 4), ("LEFTPADDING", (0,0), (-1,-1), 6), ("RIGHTPADDING", (0,0), (-1,-1), 6), ("VALIGN", (0,0), (-1,-1), "MIDDLE"), ] if header_row: style_cmds += [ ("BACKGROUND", (0,0), (-1,0), TABLE_HDR), ("TEXTCOLOR", (0,0), (-1,0), white), ("FONTNAME", (0,0), (-1,0), "Helvetica-Bold"), ("ALIGN", (0,0), (-1,0), "CENTER"), ] for i in range(1, len(rows)): bg = LIGHT_GREEN if i % 2 == 0 else white style_cmds.append(("BACKGROUND", (0,i), (-1,i), bg)) t = Table(rows, colWidths=col_widths) t.setStyle(TableStyle(style_cmds)) return t def colour_box(text, bg=LIGHT_ORANGE, txt_color=ORANGE): p = Paragraph(text, S("Normal", fontSize=9.5, fontName="Helvetica-Bold", textColor=txt_color, alignment=TA_CENTER, spaceBefore=0, spaceAfter=0)) t = Table([[p]], colWidths=[PAGE_W - 4*cm]) t.setStyle(TableStyle([ ("BACKGROUND", (0,0), (-1,-1), bg), ("TOPPADDING", (0,0), (-1,-1), 6), ("BOTTOMPADDING", (0,0), (-1,-1), 6), ("LEFTPADDING", (0,0), (-1,-1), 10), ("RIGHTPADDING", (0,0), (-1,-1), 10), ("BOX", (0,0), (-1,-1), 1, txt_color), ])) return t # ── Canvas callbacks (header/footer on each page) ──────────────────────────── def on_page(canvas_obj, doc): w, h = PAGE_W, PAGE_H # top colour bar canvas_obj.setFillColor(HEADER_BG) canvas_obj.rect(0, h - 25*mm, w, 25*mm, fill=1, stroke=0) # logo try: canvas_obj.drawImage(LOGO_PATH, 12*mm, h - 22*mm, width=38*mm, height=16*mm, preserveAspectRatio=True, mask="auto") except Exception: pass # Hospital name in header canvas_obj.setFillColor(white) canvas_obj.setFont("Helvetica-Bold", 11) canvas_obj.drawCentredString(w/2, h - 10*mm, "SDH DWARKA HOSPITAL") canvas_obj.setFont("Helvetica", 8) canvas_obj.drawCentredString(w/2, h - 15*mm, "Under National Health Mission | Govt. of NCT of Delhi") # SOP tag top-right canvas_obj.setFont("Helvetica-Bold", 8) canvas_obj.setFillColor(LIGHT_GREEN) canvas_obj.drawRightString(w - 12*mm, h - 10*mm, "Biomedical Waste SOP") canvas_obj.drawRightString(w - 12*mm, h - 16*mm, f"Rev. 1.0 | {datetime.now().strftime('%B %Y')}") # bottom footer canvas_obj.setFillColor(HEADER_BG) canvas_obj.rect(0, 0, w, 12*mm, fill=1, stroke=0) canvas_obj.setFillColor(white) canvas_obj.setFont("Helvetica", 7.5) canvas_obj.drawCentredString( w/2, 5*mm, "SOP-BMW-001 | SDH Dwarka Hospital | NHM Delhi | " f"Confidential | Page {canvas_obj.getPageNumber()}" ) canvas_obj.setFillColor(ORANGE) canvas_obj.rect(0, 11*mm, w, 1.2*mm, fill=1, stroke=0) def on_first_page(canvas_obj, doc): on_page(canvas_obj, doc) # ── Build content ───────────────────────────────────────────────────────────── story = [] sp = lambda n=1: Spacer(1, n*mm) # ─ COVER / Title area (below header which is painted by on_page) ─ story += [ sp(32), colour_box("STANDARD OPERATING PROCEDURE", bg=DARK_GREEN, txt_color=white), sp(3), colour_box("BIOMEDICAL WASTE MANAGEMENT", bg=ORANGE, txt_color=white), sp(4), Paragraph("SDH DWARKA HOSPITAL", S("Normal", fontSize=18, fontName="Helvetica-Bold", textColor=DARK_GREEN, alignment=TA_CENTER)), Paragraph("Sub-District Hospital, Dwarka Sector-12, New Delhi - 110078", S("Normal", fontSize=10, fontName="Helvetica", textColor=HexColor("#444"), alignment=TA_CENTER)), sp(4), ] # Meta info box meta = [ [Paragraph("<b>Document No.</b>", table_cell), Paragraph("SOP-BMW-001", table_cell), Paragraph("<b>Version</b>", table_cell), Paragraph("1.0", table_cell)], [Paragraph("<b>Effective Date</b>", table_cell), Paragraph(datetime.now().strftime("%d %B %Y"), table_cell), Paragraph("<b>Review Date</b>", table_cell), Paragraph("Annual", table_cell)], [Paragraph("<b>Prepared By</b>", table_cell), Paragraph("Hospital Infection Control Committee", table_cell), Paragraph("<b>Approved By</b>", table_cell), Paragraph("Medical Superintendent", table_cell)], [Paragraph("<b>Applicable To</b>", table_cell), Paragraph("All departments generating biomedical waste", table_cell), Paragraph("<b>Classification</b>", table_cell), Paragraph("Controlled Document", table_cell)], ] cw = [(PAGE_W-4*cm)/4] * 4 t = Table(meta, colWidths=cw) t.setStyle(TableStyle([ ("GRID", (0,0), (-1,-1), 0.5, HexColor("#aaaaaa")), ("FONTSIZE", (0,0), (-1,-1), 9), ("TOPPADDING", (0,0), (-1,-1), 5), ("BOTTOMPADDING", (0,0), (-1,-1), 5), ("LEFTPADDING", (0,0), (-1,-1), 6), ("RIGHTPADDING", (0,0), (-1,-1), 6), ("BACKGROUND", (0,0), (0,-1), LIGHT_GREEN), ("BACKGROUND", (2,0), (2,-1), LIGHT_GREEN), ("VALIGN", (0,0), (-1,-1), "MIDDLE"), ])) story += [t, sp(5)] story += [ colour_box( "⚠ This document must be read, understood and followed by ALL hospital staff handling biomedical waste.", bg=LIGHT_ORANGE, txt_color=ORANGE), sp(3), colour_box( "Bio-Medical Waste (Management and Handling) Rules 2016 | CPCB Guidelines | MoHFW Protocols", bg=LIGHT_BLUE, txt_color=BLUE), PageBreak(), ] # ─ 1. PURPOSE ─ story += [ sp(4), section_heading("1. PURPOSE"), sp(2), Paragraph( "This Standard Operating Procedure (SOP) establishes a systematic framework for the " "safe collection, segregation, transportation, storage, treatment, and disposal of " "biomedical waste (BMW) generated at SDH Dwarka Hospital. The objective is to protect " "patients, healthcare workers, waste handlers, and the general public from exposure to " "infectious and hazardous materials, and to ensure compliance with the Bio-Medical " "Waste Management Rules, 2016 as amended.", body), sp(3), ] # ─ 2. SCOPE ─ story += [ section_heading("2. SCOPE"), sp(2), Paragraph("This SOP applies to:", body_bold), ] scope_items = [ "All wards, OPD, OT, labour room, ICU, dialysis unit, dental unit, laboratory, radiology, pharmacy and any other area within SDH Dwarka Hospital.", "All permanent, contractual, and outsourced staff involved in patient care or waste handling.", "Third-party agencies contracted for BMW collection and disposal.", "Visitors and students during their tenure at the hospital.", ] for item in scope_items: story.append(Paragraph(f"• {item}", bullet_style)) story.append(sp(3)) # ─ 3. DEFINITIONS ─ story += [ section_heading("3. KEY DEFINITIONS"), sp(2), ] defn_rows = [ [Paragraph("<b>Term</b>", table_hdr_st), Paragraph("<b>Definition</b>", table_hdr_st)], [Paragraph("Biomedical Waste (BMW)", table_cell_c), Paragraph("Any waste generated during diagnosis, treatment or immunisation of human beings or animals, or in research activities thereof, or in the production or testing of biologicals.", table_cell)], [Paragraph("Segregation", table_cell_c), Paragraph("The process of sorting waste into predefined colour-coded categories at the point of generation.", table_cell)], [Paragraph("Cytotoxic Waste", table_cell_c), Paragraph("Waste containing cytotoxic drugs (genotoxic); requires special handling and incineration.", table_cell)], [Paragraph("CBWTF", table_cell_c), Paragraph("Common Bio-Medical Waste Treatment Facility - authorised off-site treatment plant.", table_cell)], [Paragraph("SPCB/DPCC", table_cell_c), Paragraph("Delhi Pollution Control Committee - state regulatory authority for BMW authorisation.", table_cell)], [Paragraph("HCF", table_cell_c), Paragraph("Health Care Facility - any establishment generating BMW.", table_cell)], [Paragraph("PPE", table_cell_c), Paragraph("Personal Protective Equipment - gloves, mask, gown, goggles, boots.", table_cell)], ] story += [info_box(defn_rows, [(PAGE_W-4*cm)*0.28, (PAGE_W-4*cm)*0.72]), sp(3)] # ─ 4. COLOUR CODING ─ story += [ section_heading("4. COLOUR-CODED SEGREGATION SYSTEM (BMW Rules 2016)"), sp(2), Paragraph( "All BMW MUST be segregated at the point of generation using the four-colour system " "mandated under Schedule I of BMW Management Rules 2016:", body), sp(2), ] cc_rows = [ [Paragraph("<b>Bag / Container Colour</b>", table_hdr_st), Paragraph("<b>Waste Category</b>", table_hdr_st), Paragraph("<b>Treatment / Disposal</b>", table_hdr_st), Paragraph("<b>Examples</b>", table_hdr_st)], [Paragraph("🟡 YELLOW BAG", S("Normal", fontSize=9, fontName="Helvetica-Bold", textColor=HexColor("#795500"), alignment=TA_CENTER)), Paragraph("Cat. 1, 2, 3, 6\nHuman anatomical / animal waste / soiled waste / solid chemical waste", table_cell), Paragraph("Incineration / Deep burial (Cat.1,2) | Pre-treatment + secure landfill (Cat.6)", table_cell), Paragraph("Body parts, blood-soaked items, used bandages, expired cytotoxic drugs", table_cell)], [Paragraph("🔴 RED BAG / CONTAINER", S("Normal", fontSize=9, fontName="Helvetica-Bold", textColor=HexColor("#c62828"), alignment=TA_CENTER)), Paragraph("Cat. 3\nContaminated/recyclable waste", table_cell), Paragraph("Autoclaving / Microwaving / Chemical treatment → recycling", table_cell), Paragraph("Tubing, IV bottles, catheters, non-sharp plastic", table_cell)], [Paragraph("🔵 BLUE / WHITE\nPUNCTURE-PROOF CONTAINER", S("Normal", fontSize=9, fontName="Helvetica-Bold", textColor=BLUE, alignment=TA_CENTER)), Paragraph("Cat. 4\nWaste sharps (used)", table_cell), Paragraph("Autoclaving / Dry heat sterilisation → shredding → metal recycler", table_cell), Paragraph("Needles, syringes, lancets, broken glass ampules, scalpels", table_cell)], [Paragraph("⚫ BLACK BAG", S("Normal", fontSize=9, fontName="Helvetica-Bold", textColor=HexColor("#212121"), alignment=TA_CENTER)), Paragraph("Cat. 7\nGeneral solid waste (non-BMW)", table_cell), Paragraph("Municipal solid waste (MSW) disposal", table_cell), Paragraph("Wrappers, food waste, paper, packaging", table_cell)], [Paragraph("☢ RADIOACTIVE\nLEAD CONTAINER", S("Normal", fontSize=9, fontName="Helvetica-Bold", textColor=HexColor("#6a1a6a"), alignment=TA_CENTER)), Paragraph("Radioactive waste (if applicable)", table_cell), Paragraph("AERB guidelines; stored until safe decay", table_cell), Paragraph("Radio-isotopes used in nuclear medicine", table_cell)], ] cc_col_w = [(PAGE_W-4*cm)*x for x in [0.20, 0.28, 0.27, 0.25]] t = Table(cc_rows, colWidths=cc_col_w) t.setStyle(TableStyle([ ("GRID", (0,0), (-1,-1), 0.5, HexColor("#bbbbbb")), ("FONTSIZE", (0,0), (-1,-1), 8.5), ("TOPPADDING", (0,0), (-1,-1), 5), ("BOTTOMPADDING", (0,0), (-1,-1), 5), ("LEFTPADDING", (0,0), (-1,-1), 5), ("RIGHTPADDING", (0,0), (-1,-1), 5), ("VALIGN", (0,0), (-1,-1), "MIDDLE"), ("BACKGROUND", (0,0), (-1,0), TABLE_HDR), ("BACKGROUND", (0,1), (-1,1), HexColor("#fffde7")), ("BACKGROUND", (0,2), (-1,2), HexColor("#ffebee")), ("BACKGROUND", (0,3), (-1,3), HexColor("#e3f2fd")), ("BACKGROUND", (0,4), (-1,4), HexColor("#efebe9")), ("BACKGROUND", (0,5), (-1,5), HexColor("#f3e5f5")), ])) story += [t, sp(3)] # ─ 5. SEGREGATION PROCEDURE ─ story += [ section_heading("5. WASTE SEGREGATION PROCEDURE"), sp(2), ] seg_steps = [ ("Step 1: Point of Generation", [ "Place the appropriate colour-coded bag/container in a pedal-operated bin at the point of waste generation BEFORE starting any procedure.", "Never segregate waste after it has been mixed — cross-contamination renders the entire batch as Category 1 (highest risk).", "Waste bags must NOT be filled beyond 3/4 (75%) capacity.", ]), ("Step 2: Labelling", [ "All bags must be labelled with: Name of HCF, Department, Date, Waste category.", "Pre-printed tie-tags or stickers approved by the Infection Control Committee shall be used.", "Do NOT write with marker pens directly on bio-hazard bags (ink may bleed).", ]), ("Step 3: Tying / Sealing", [ "Use the neck-lock tie or cable tie provided — never use staple pins or tape alone.", "For sharps containers: close the lid firmly once 3/4 full; do NOT re-open.", "Double-bag yellow bags containing anatomical/cytotoxic waste.", ]), ("Step 4: Transport from Ward", [ "Collect waste using the designated BMW trolley (leak-proof, covered, colour-coded).", "Transport ONLY via the designated BMW corridor or service lift — never through patient/visitor areas.", "Timing: rounds at 6 AM, 12 PM, 6 PM (or as per hospital schedule).", "Waste handler must wear full PPE (heavy-duty gloves, mask, apron, boots).", ]), ] for title, points in seg_steps: story.append(Paragraph(title, h2)) for pt in points: story.append(Paragraph(f"• {pt}", bullet_style)) story.append(sp(1)) story.append(sp(2)) # ─ 6. SHARPS MANAGEMENT ─ story += [ section_heading("6. SHARPS MANAGEMENT (HIGH-PRIORITY)"), sp(2), colour_box("NEVER RECAP NEEDLES | NEVER OVERFILL SHARPS CONTAINERS | " "NEEDLE-STICK INJURY IS PREVENTABLE", bg=HexColor("#ffebee"), txt_color=RED), sp(2), ] sharps_rules = [ "Use single-handed scoop technique or a needle-cutter/hub cutter for needle removal.", "Place used sharps directly into the Blue puncture-proof sharps container at the point of use.", "Sharps containers must be rigid, puncture-resistant, leak-proof, and tamper-evident.", "Close sharps container at 3/4 full; seal, label, and send to BMW storage area.", "Do NOT carry unprotected sharps; do NOT bend, break or manipulate used needles.", "Report needle-stick/sharp injuries IMMEDIATELY to Casualty Medical Officer and Infection Control Nurse.", "Post-exposure prophylaxis (PEP): Report within 2 hours for HIV PEP eligibility assessment.", ] for rule in sharps_rules: story.append(Paragraph(f"▶ {rule}", bullet_style)) story.append(sp(3)) # ─ 7. BMW STORAGE AREA ─ story += [ section_heading("7. BIOMEDICAL WASTE STORAGE AREA - REQUIREMENTS"), sp(2), Paragraph("SDH Dwarka Hospital shall maintain a designated BMW Storage Area (also called Dhabbri/Dustbin Room) meeting the following standards:", body), sp(2), ] storage_rows = [ [Paragraph("<b>Parameter</b>", table_hdr_st), Paragraph("<b>Requirement</b>", table_hdr_st)], [Paragraph("Location", table_cell_c), Paragraph("Separate, restricted, well-ventilated area away from patient zones and food areas", table_cell)], [Paragraph("Signage", table_cell_c), Paragraph("Biohazard symbol displayed prominently; 'Authorised Personnel Only' sign", table_cell)], [Paragraph("Flooring", table_cell_c), Paragraph("Impervious, easy-to-clean; drainage provision with effluent treatment", table_cell)], [Paragraph("Access", table_cell_c), Paragraph("Lockable; key held by senior nursing officer / waste supervisor only", table_cell)], [Paragraph("Maximum Storage Time", table_cell_c), Paragraph("Yellow & Red bag: 48 hours | Sharps: till CBWTF collection (max 7 days)", table_cell)], [Paragraph("Refrigeration", table_cell_c), Paragraph("Required if anatomical waste stored > 24 hours (maintain ≤ 8°C)", table_cell)], [Paragraph("Pest Control", table_cell_c), Paragraph("Anti-rodent / anti-insect measures; monthly fumigation record maintained", table_cell)], [Paragraph("Cleaning", table_cell_c), Paragraph("Storage area disinfected daily with 1% sodium hypochlorite solution", table_cell)], [Paragraph("CCTV/Record", table_cell_c), Paragraph("All BMW handed over to CBWTF must be weighed and entry made in BMW logbook", table_cell)], ] story += [info_box(storage_rows, [(PAGE_W-4*cm)*0.28, (PAGE_W-4*cm)*0.72]), sp(3)] # ─ 8. CBWTF HANDOVER ─ story += [ section_heading("8. HANDOVER TO CBWTF / AUTHORISED TRANSPORTER"), sp(2), ] cbwtf_steps = [ "Verify the CBWTF vehicle has a valid DPCC authorisation before accepting waste.", "Weigh each category of waste separately using calibrated weighing scale; record in the BMW Logbook.", "Issue a signed manifest (Form 3 / e-manifest as per DPCC) for every consignment.", "Retain copy of manifest for minimum 3 years for inspection by DPCC.", "CBWTF representative must sign the handover register with date, time, and quantity.", "Report any non-collection by CBWTF to Infection Control Committee and DPCC within 24 hours.", "Monthly BMW quantity data to be submitted on CPCB's online portal (HCF module).", ] for step in cbwtf_steps: story.append(Paragraph(f"• {step}", bullet_style)) story.append(sp(3)) # ─ 9. LIQUID WASTE ─ story += [ section_heading("9. LIQUID / CHEMICAL WASTE MANAGEMENT"), sp(2), ] liq_rows = [ [Paragraph("<b>Waste Type</b>", table_hdr_st), Paragraph("<b>Handling Protocol</b>", table_hdr_st)], [Paragraph("Blood / body fluids (bulk)", table_cell_c), Paragraph("Pre-treat with 1% hypochlorite (contact 30 min) then discharge to ETP / hospital drain connected to STP", table_cell)], [Paragraph("Lab chemicals (non-hazardous)", table_cell_c), Paragraph("Dilute to permissible limits; drain via plumbed sink connected to ETP", table_cell)], [Paragraph("Fixer / developer (X-ray)", table_cell_c), Paragraph("Collect in labelled containers; hand over to authorised silver-recovery agency", table_cell)], [Paragraph("Mercury waste", table_cell_c), Paragraph("Collect in sealed container; hand over to authorised DPCC hazardous waste transporter; DO NOT drain", table_cell)], [Paragraph("Cytotoxic liquid waste", table_cell_c), Paragraph("Double-bag; yellow cat. — incineration only; wear double gloves + N95 mask", table_cell)], ] story += [info_box(liq_rows, [(PAGE_W-4*cm)*0.27, (PAGE_W-4*cm)*0.73]), sp(3)] # ─ 10. PPE ─ story += [ section_heading("10. PERSONAL PROTECTIVE EQUIPMENT (PPE) PROTOCOL"), sp(2), ] ppe_rows = [ [Paragraph("<b>Activity</b>", table_hdr_st), Paragraph("<b>Minimum PPE Required</b>", table_hdr_st)], [Paragraph("Waste collection from wards", table_cell_c), Paragraph("Heavy-duty gloves, face mask (surgical), gown/apron, closed shoes", table_cell)], [Paragraph("Sharps handling", table_cell_c), Paragraph("Cut-resistant heavy-duty gloves, face shield, N95 mask, full gown, safety boots", table_cell)], [Paragraph("BMW storage area cleaning", table_cell_c), Paragraph("Heavy-duty gloves, N95 mask, face shield, gown, waterproof boots", table_cell)], [Paragraph("Cytotoxic waste handling", table_cell_c), Paragraph("Double gloves (chemotherapy grade), N95 mask, face shield, chemo-gown, boots", table_cell)], [Paragraph("Radioactive waste (if any)", table_cell_c), Paragraph("Lead apron, dosimeter badge, as per AERB/Radiation Safety Officer instructions", table_cell)], [Paragraph("COVID / Isolation ward", table_cell_c), Paragraph("Double gloves, N95/FFP2, face shield, full body cover, boot covers; buddy system for doffing", table_cell)], ] story += [info_box(ppe_rows, [(PAGE_W-4*cm)*0.32, (PAGE_W-4*cm)*0.68]), sp(3)] # ─ 11. SPILL MANAGEMENT ─ story += [ section_heading("11. BMW SPILL MANAGEMENT"), sp(2), colour_box("IN CASE OF SPILL: STOP → SECURE AREA → PPE → DECONTAMINATE → DOCUMENT → REPORT", bg=LIGHT_ORANGE, txt_color=ORANGE), sp(2), ] spill_steps = [ ("STOP and alert nearby personnel; do not allow anyone without PPE to enter the spill zone.", ""), ("Don PPE: heavy-duty gloves, mask, gown, face shield, boots.", ""), ("Contain the spill: apply absorbent material (paper towels/dry sand) over liquids; cover solids with a box/container.", ""), ("Disinfect: pour 1% sodium hypochlorite over the area; allow 30-minute contact time.", ""), ("Clean up absorbed material with a scoop/dustpan (never bare hands); place in yellow bag.", ""), ("Wash the area again with detergent and water; dry.", ""), ("Remove PPE safely; wash hands with soap and water for at least 20 seconds.", ""), ("Document in Spill Register: date, time, location, type of waste, action taken, staff involved.", ""), ("Report to Infection Control Nurse and Medical Superintendent within 1 hour.", ""), ] for i, (step, _) in enumerate(spill_steps, 1): story.append(Paragraph(f"<b>Step {i}:</b> {step}", bullet_style)) story.append(sp(3)) # ─ 12. NSI ─ story += [ section_heading("12. NEEDLE-STICK / SHARPS INJURY PROTOCOL"), sp(2), colour_box("IMMEDIATE ACTION REQUIRED — DO NOT DELAY", bg=HexColor("#ffebee"), txt_color=RED), sp(2), ] nsi_rows = [ [Paragraph("<b>Time</b>", table_hdr_st), Paragraph("<b>Action</b>", table_hdr_st)], [Paragraph("0 – 2 min", table_cell_c), Paragraph("Allow wound to bleed freely; wash with soap and water for 5 minutes; do NOT suck wound; apply antiseptic", table_cell)], [Paragraph("< 2 hours", table_cell_c), Paragraph("Report to Casualty MO / Occupational Health Nurse; complete NSI Reporting Form; blood sample from source patient (with consent)", table_cell)], [Paragraph("< 2 hours (HIV)", table_cell_c), Paragraph("PEP counselling and initiation if source patient HIV+/unknown; ART Centre contact", table_cell)], [Paragraph("Within 24 hrs", table_cell_c), Paragraph("Hepatitis B immunoglobulin (if unvaccinated); baseline HBsAg, HCV, HIV serology", table_cell)], [Paragraph("6 weeks / 3 mths / 6 mths", table_cell_c), Paragraph("Follow-up serology; PEP compliance check; counselling", table_cell)], [Paragraph("Documentation", table_cell_c), Paragraph("Record in NSI Register; submit to Infection Control Committee monthly; report to DPCC if required", table_cell)], ] story += [info_box(nsi_rows, [(PAGE_W-4*cm)*0.22, (PAGE_W-4*cm)*0.78]), sp(3)] # ─ 13. TRAINING ─ story += [ section_heading("13. TRAINING AND AWARENESS"), sp(2), ] train_items = [ "All new staff (medical, nursing, housekeeping, lab, OT) must receive BMW induction training within 7 days of joining.", "Refresher training: at minimum annually and after any BMW-related incident.", "Training must cover: segregation, colour codes, PPE donning/doffing, spill management, NSI protocol, CBWTF handover.", "Training attendance register to be maintained; records retained for 3 years.", "Posters and quick-reference cards in Hindi and English must be displayed in all departments.", "Annual BMW audit to be conducted by Hospital Infection Control Committee (HICC).", "Training to be documented and submitted to DPCC on request.", ] for item in train_items: story.append(Paragraph(f"✔ {item}", bullet_style)) story.append(sp(3)) # ─ 14. RECORDS ─ story += [ section_heading("14. RECORDS AND DOCUMENTATION"), sp(2), ] rec_rows = [ [Paragraph("<b>Record</b>", table_hdr_st), Paragraph("<b>Frequency</b>", table_hdr_st), Paragraph("<b>Custodian</b>", table_hdr_st), Paragraph("<b>Retention</b>", table_hdr_st)], [Paragraph("BMW Logbook (weight/category)", table_cell), Paragraph("Each CBWTF collection", table_cell_c), Paragraph("Waste Supervisor", table_cell_c), Paragraph("5 years", table_cell_c)], [Paragraph("CBWTF Manifests (Form 3)", table_cell), Paragraph("Each consignment", table_cell_c), Paragraph("Administrative Officer", table_cell_c), Paragraph("3 years", table_cell_c)], [Paragraph("NSI Register", table_cell), Paragraph("Per incident", table_cell_c), Paragraph("Infection Control Nurse", table_cell_c), Paragraph("5 years", table_cell_c)], [Paragraph("Spill Register", table_cell), Paragraph("Per incident", table_cell_c), Paragraph("Head Nurse / Ward In-charge", table_cell_c), Paragraph("3 years", table_cell_c)], [Paragraph("Training Register", table_cell), Paragraph("Per session", table_cell_c), Paragraph("HICC Chairperson", table_cell_c), Paragraph("3 years", table_cell_c)], [Paragraph("Monthly BMW Report (CPCB portal)", table_cell), Paragraph("Monthly", table_cell_c), Paragraph("Nodal Officer BMW", table_cell_c), Paragraph("Online / 3 years", table_cell_c)], [Paragraph("Annual BMW Audit Report", table_cell), Paragraph("Annually", table_cell_c), Paragraph("Medical Superintendent", table_cell_c), Paragraph("5 years", table_cell_c)], ] story += [info_box(rec_rows, [(PAGE_W-4*cm)*0.38, (PAGE_W-4*cm)*0.18, (PAGE_W-4*cm)*0.24, (PAGE_W-4*cm)*0.20]), sp(3)] # ─ 15. RESPONSIBILITIES ─ story += [ section_heading("15. ROLES AND RESPONSIBILITIES"), sp(2), ] resp_rows = [ [Paragraph("<b>Designation</b>", table_hdr_st), Paragraph("<b>Key BMW Responsibility</b>", table_hdr_st)], [Paragraph("Medical Superintendent", table_cell_c), Paragraph("Overall accountability; authorisation renewal with DPCC; approval of SOP; resource allocation", table_cell)], [Paragraph("HICC Chairperson / CMO", table_cell_c), Paragraph("Policy oversight; monthly review of BMW data; investigation of incidents", table_cell)], [Paragraph("Nodal Officer BMW", table_cell_c), Paragraph("Day-to-day management; CBWTF coordination; CPCB portal reporting; training schedule", table_cell)], [Paragraph("Head Nurses / Sister In-charge", table_cell_c), Paragraph("Ensure correct segregation in their ward; supervise ward boys; report non-compliance", table_cell)], [Paragraph("Doctors / Residents", table_cell_c), Paragraph("Segregate waste at point of care; safe sharps disposal; NSI reporting", table_cell)], [Paragraph("Lab / OT / Radiology In-charge", table_cell_c), Paragraph("Department-specific BMW compliance; chemical waste management; monthly reporting to Nodal Officer", table_cell)], [Paragraph("Housekeeping / Waste Handlers", table_cell_c), Paragraph("Correct collection, transport, and storage; PPE use at all times; spill management; report to supervisor immediately", table_cell)], [Paragraph("Security / Gate Staff", table_cell_c), Paragraph("Verify CBWTF authorisation before allowing waste vehicle entry; do not allow unauthorised removal of BMW", table_cell)], ] story += [info_box(resp_rows, [(PAGE_W-4*cm)*0.30, (PAGE_W-4*cm)*0.70]), sp(3)] # ─ 16. NON-COMPLIANCE ─ story += [ section_heading("16. NON-COMPLIANCE AND PENALTIES"), sp(2), Paragraph( "Non-compliance with this SOP, the BMW Management Rules 2016, or DPCC directives may result in:", body), ] nc_items = [ "Show-cause notice and suspension of hospital BMW authorisation by DPCC.", "Monetary penalties: up to ₹1 lakh per violation per day under Environment Protection Act 1986.", "Prosecution under Solid Waste Management Rules / EP Act / Indian Penal Code as applicable.", "Internal disciplinary action against responsible staff as per service rules.", "Non-compliance incidents to be mandatorily reported to HICC and recorded.", ] for item in nc_items: story.append(Paragraph(f"⚠ {item}", bullet_style)) story.append(sp(3)) # ─ 17. REFERENCES ─ story += [ section_heading("17. REFERENCES AND LEGAL BASIS"), sp(2), ] ref_items = [ "Bio-Medical Waste Management Rules, 2016 (MoEF&CC, Government of India) as amended 2018 & 2019.", "CPCB Guidelines for Management of Healthcare Waste, 2019.", "MoHFW Standard Treatment Workflow for Infection Prevention & Control, 2020.", "Delhi Pollution Control Committee (DPCC) Bio-Medical Waste Authorisation Conditions.", "WHO Safe Management of Wastes from Health-Care Activities (Blue Book), 2nd Ed. 2014.", "National Accreditation Board for Hospitals (NABH) Infection Control Standards, 5th Ed.", "AERB Safety Manual (Radioactive Waste) — applicable to Nuclear Medicine Unit.", "Occupational Safety, Health and Working Conditions Code, 2020 (GoI).", ] for ref in ref_items: story.append(Paragraph(f"[{ref_items.index(ref)+1}] {ref}", bullet_style)) story.append(sp(3)) # ─ 18. REVIEW ─ story += [ section_heading("18. SOP REVIEW SCHEDULE"), sp(2), Paragraph( "This SOP shall be reviewed annually or whenever there is a change in applicable legislation, " "DPCC authorisation conditions, hospital infrastructure, or following a major BMW incident. " "The revised version shall be approved by the Medical Superintendent and distributed to all departments.", body), sp(3), ] # ─ Signature Block ─ story += [ HRFlowable(width=PAGE_W - 4*cm, thickness=1.5, color=DARK_GREEN, spaceAfter=6), ] sig_data = [ [Paragraph("<b>Prepared By</b>", S("Normal", fontSize=9, fontName="Helvetica-Bold", textColor=DARK_GREEN, alignment=TA_CENTER)), Paragraph("<b>Reviewed By</b>", S("Normal", fontSize=9, fontName="Helvetica-Bold", textColor=DARK_GREEN, alignment=TA_CENTER)), Paragraph("<b>Approved By</b>", S("Normal", fontSize=9, fontName="Helvetica-Bold", textColor=DARK_GREEN, alignment=TA_CENTER))], [Paragraph("Hospital Infection Control Committee\nSDH Dwarka Hospital", table_cell_c), Paragraph("HICC Chairperson / CMO\nSDH Dwarka Hospital", table_cell_c), Paragraph("Medical Superintendent\nSDH Dwarka Hospital", table_cell_c)], [Paragraph("Signature: ___________________", table_cell_c), Paragraph("Signature: ___________________", table_cell_c), Paragraph("Signature: ___________________", table_cell_c)], [Paragraph(f"Date: {datetime.now().strftime('%d/%m/%Y')}", table_cell_c), Paragraph(f"Date: {datetime.now().strftime('%d/%m/%Y')}", table_cell_c), Paragraph(f"Date: {datetime.now().strftime('%d/%m/%Y')}", table_cell_c)], ] sig_t = Table(sig_data, colWidths=[(PAGE_W-4*cm)/3]*3) sig_t.setStyle(TableStyle([ ("GRID", (0,0), (-1,-1), 0.5, HexColor("#cccccc")), ("FONTSIZE", (0,0), (-1,-1), 9), ("TOPPADDING", (0,0), (-1,-1), 6), ("BOTTOMPADDING", (0,0), (-1,-1), 6), ("VALIGN", (0,0), (-1,-1), "MIDDLE"), ("BACKGROUND", (0,0), (-1,0), LIGHT_GREEN), ])) story += [sig_t, sp(2)] story += [ colour_box( "SOP-BMW-001 v1.0 | SDH Dwarka Hospital | NHM Delhi | " f"Generated: {datetime.now().strftime('%d %B %Y')} | CONFIDENTIAL", bg=LIGHT_GREEN, txt_color=DARK_GREEN), ] # ── Build PDF ────────────────────────────────────────────────────────────────── doc = SimpleDocTemplate( OUTPUT, pagesize=A4, topMargin=3.0*cm, bottomMargin=1.8*cm, leftMargin=2.0*cm, rightMargin=2.0*cm, title="SOP - Biomedical Waste Management - SDH Dwarka Hospital", author="SDH Dwarka Hospital / NHM Delhi", subject="Biomedical Waste SOP", creator="Orris AI", ) doc.build(story, onFirstPage=on_first_page, onLaterPages=on_page) print(f"PDF created: {OUTPUT}") import os; print(f"File size: {os.path.getsize(OUTPUT)/1024:.1f} KB") PYEOF
python3 /tmp/workspace/bmw-sop/generate_sop.py
BMW SOP SDH Dwarka
PDF Document · PDF
| Section | Content |
|---|---|
| Cover Page | NHM logo, SDH Dwarka Hospital name, document metadata (Doc No., Version, Effective Date, Prepared/Approved By) |
| 1. Purpose | Scope and regulatory basis |
| 2. Scope | All departments, all staff categories |
| 3. Definitions | BMW, CBWTF, DPCC, PPE, etc. |
| 4. Colour Coding | Full 4-colour system table per BMW Rules 2016 (Yellow/Red/Blue/Black + Radioactive) |
| 5. Segregation | Step-by-step: point of generation → labelling → tying → ward transport |
| 6. Sharps Management | No-recap rule, PEP, needle-cutter protocol |
| 7. Storage Area | Requirements: flooring, access, max storage time, refrigeration, daily disinfection |
| 8. CBWTF Handover | Manifest/Form 3, weighing, DPCC reporting, CPCB portal |
| 9. Liquid/Chemical Waste | Blood, X-ray fixer, mercury, cytotoxic liquids |
| 10. PPE Protocol | Per activity (ward collection, sharps, cytotoxic, COVID ward) |
| 11. Spill Management | 9-step protocol with decontamination and documentation |
| 12. Needle-Stick Injury | Time-based action table, PEP eligibility, follow-up serology |
| 13. Training | Induction, refresher, records, posters |
| 14. Records & Documentation | 7 registers with custodians and retention periods |
| 15. Roles & Responsibilities | MS to housekeeping staff |
| 16. Non-Compliance | DPCC penalties, EP Act provisions |
| 17. References | BMW Rules 2016, CPCB, WHO, NABH, AERB |
| 18. Review Schedule | Annual review trigger conditions |
| Signature Block | Prepared/Reviewed/Approved signature spaces |
Kindly prepare best sop pdf for biomedical waste with nhm logo and hospital name - SDH dwarka hospital
ls -lh /tmp/workspace/bmw-sop/ 2>/dev/null && echo "EXISTS" || echo "NOT FOUND"
BMW SOP SDH Dwarka
PDF Document · PDF