From ed5b6662f9bc255d1f7b81637e7b03d88c460607 Mon Sep 17 00:00:00 2001 From: shashi kumar Date: Thu, 31 Jul 2025 23:48:49 +0530 Subject: [PATCH] adding report module --- report/reports.py | 122 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 report/reports.py diff --git a/report/reports.py b/report/reports.py new file mode 100644 index 0000000..0ffcaa4 --- /dev/null +++ b/report/reports.py @@ -0,0 +1,122 @@ +import os +import pandas as pd +from reportlab.lib.pagesizes import A4 +from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, Image, PageBreak +from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle +from reportlab.lib.enums import TA_CENTER, TA_LEFT +from reportlab.lib import colors +from reportlab.lib.units import inch + +EXCEL_PATH = "Old FINAL Data_MIS.xlsx" +OUTPUT_DIR = "reports" +LOGO_PATH = "logo.png" +SIGN1_PATH = "sign1.png" +SIGN2_PATH = "sign2.png" + +TEST_GROUPS = { + "Lipid Profile Test ~ Clinical Chemistry ~ Blood (Serum)-Red": { + "S.TOTAL CHOLESTEROL": "<200 mg/dL", + "S.TRIGLYCERIDES": "40 to 160 mg/dL", + "Direct HDL": "35 to 60 mg/dL", + "LDL": "75 to 130 mg/dL", + "VLDL": "10 to 32 mg/dL", + "TOTAL CHOLESTEROL/HDL RATIO": "3 to 5", + "LDL/HDL RATIO": "1.5 to 3.5", + "NON HDL CHOLESTEROL*": "" + }, + "LFT (Liver Function Test) ~ Clinical Chemistry ~ Blood (Serum)-Red": { + "Total Bilirubin": "<2 mg/dL", + "Direct Bilirubin": "0.1 to 0.4 mg/dL", + "Indirect Bilirubin": "<0.8 mg/dL", + "SGOT": "<31 U/L", + "SGPT": "<34 U/L", + "SGOT/SGPTRatio": "", + "Alkaline Phosphatase": "42 to 98 U/L", + "S.GGT": "<30 U/L", + "Total Proteins": "6 to 8.5 gm/dL", + "Albumin": "3.5 to 5.5 gm/dL", + "Globulin": "2.5 to 3.5 gm/dL", + "A/G Ratio": "1 to 1.8" + }, + "TFT (Thyroid Function Test) ~ Clinical Chemistry ~ Blood (Serum)-Red": { + "T3 (Triiodothyronine)": "0.87 to 1.78 ng/ml", + "T4 (Thyroxine)": "3.2 to 12.6 ug/dl", + "TSH-Thyrotropin Stimulating Hormon": "0.35 to 5.5 uIU/ml" + }, + "CBC / Platelets": { + "Platelet Count": "1.50 – 4.00 Lakh/comm." + } +} + +INTERPRETATIONS = { + "Lipid Profile": "The results of your lipid panel are reported for each type of cholesterol and triglycerides...", + "LFT": "These tests help detect liver disease, differentiate liver disorders, assess liver damage, and monitor treatment...", + "TFT": "TSH reference ranges vary by age. Assay results should be interpreted only in context of clinical status...", + "CBC / Platelets": "Method: PLT-Electrical impedance. Low platelets - risk of bleeding. High platelets - risk of thrombosis." +} + +FOOTER = "CORE Diagnostics (Central Reference Lab) - Gurugram
406, Udyog Vihar, Phase III, Gurugram, Haryana - 122016" + +def generate_page(doc, story, data_row, title, tests, interpretation): + styles = getSampleStyleSheet() + centered = ParagraphStyle(name='Centered', parent=styles['Normal'], alignment=TA_CENTER) + lefted = ParagraphStyle(name='Lefted', parent=styles['Normal'], alignment=TA_LEFT) + + if os.path.exists(LOGO_PATH): + story.append(Image(LOGO_PATH, width=6.5*inch, height=1*inch)) + story.append(Paragraph(f"{title}", centered)) + story.append(Spacer(1, 12)) + + info = [["Name", data_row['Name'], "Age", str(data_row['Age'])], + ["Gender", data_row['GENDER'], "Location", data_row['Location']]] + table = Table(info, colWidths=[100, 150, 100, 150]) + table.setStyle(TableStyle([("GRID", (0,0), (-1,-1), 0.5, colors.black)])) + story.append(table) + story.append(Spacer(1, 16)) + + story.append(Table([["Parameter", "Result", "Reference"]], colWidths=[220, 120, 140], + style=[("BACKGROUND", (0,0), (-1,0), colors.grey), ("TEXTCOLOR", (0,0), (-1,0), colors.white)])) + + for test, ref in tests.items(): + val = str(data_row.get(test, "")).strip() + if val and val.lower() != "nan": + story.append(Table([[test, val, ref]], colWidths=[220, 120, 140], + style=[("GRID", (0,0), (-1,-1), 0.25, colors.grey)])) + + story.append(Spacer(1, 20)) + story.append(Paragraph("Interpretation:", styles["Heading5"])) + story.append(Paragraph(interpretation, lefted)) + story.append(Spacer(1, 30)) + + sig_table = Table([[Image(SIGN1_PATH, width=1.5*inch, height=0.5*inch), Image(SIGN2_PATH, width=1.5*inch, height=0.5*inch)], + [Paragraph("Dr. Bhavna Jaiswal
MBBS, MD, DPB
Consultant Pathologist", centered), + Paragraph("Dr. Rahul Sharma
PhD Microbiologist", centered)]], + colWidths=[3*inch, 3*inch]) + story.append(sig_table) + story.append(Spacer(1, 20)) + story.append(Paragraph(FOOTER, centered)) + story.append(PageBreak()) + +def generate_report(data_row): + name_slug = data_row['Name'].replace(" ", "_") + output_path = os.path.join(OUTPUT_DIR, f"Report_{name_slug}.pdf") + story = [] + doc = SimpleDocTemplate(output_path, pagesize=A4, rightMargin=30, leftMargin=30, topMargin=30, bottomMargin=30) + + for group_name, tests in TEST_GROUPS.items(): + interpretation = next((v for k,v in INTERPRETATIONS.items() if k.lower() in group_name.lower()), "") + generate_page(doc, story, data_row, group_name, tests, interpretation) + + doc.build(story) + print(f"✅ Generated: {output_path}") + +def main(): + if not os.path.exists(OUTPUT_DIR): + os.makedirs(OUTPUT_DIR) + df = pd.read_excel(EXCEL_PATH) + df.columns = df.columns.str.strip() + for _, row in df.iterrows(): + generate_report(row) + +if __name__ == "__main__": + main()