Reporting · Automation
eReports Healthcare Reporting Toolkit
A Python desktop toolkit that consolidates recurring spreadsheet, text, CSV, and PDF reporting workflows into one interface with shared data-processing modules.
- Role
- Data reporting analyst — sole builder of operational reporting automation
- Duration
- ongoing development across multiple reporting cycles
- Data scale
- 10+ monthly Excel and PDF operational reports; fixed-width text exports from legacy billing systems
- Stack
- Python
- CustomTkinter
- pandas
- openpyxl
- XlsxWriter
- pdfplumber
- PyInstaller
Impact
80%
reduction in manual reporting time
vs. prior manual preparation of 10+ monthly Excel and PDF operational reports
Problem
Operational reporting in a high-volume billing environment does not fail in one spectacular way. It fails in repetition. Every month the same exports arrive from practice management systems — fixed-width text files, CSV dumps, PDF statements — and the same transformations get applied by hand: merge aging with billing dates, categorise encounters by status, split a roster file by provider, pull deposit lines into Excel, consolidate financial PDFs into a year-over-year workbook. Each task is small. Together they consume days.
Before consolidation, staff maintained a folder of one-off scripts and manual checklists. Encoding mismatches silently corrupted columns. A deposit import used different date parsing than the aging merge. Provider splits were copy-paste exercises on files too large for Excel to open comfortably. The organisation needed one place to run trusted transformations with consistent output naming and logging — not another macro workbook that only one person understood.
Approach
I built eReports as a modular desktop application: a CustomTkinter shell with a sidebar of reporting tools, each backed by an isolated Python module. The UI handles file selection, output paths, and progress feedback; the modules contain the data logic and can be invoked independently for testing.
Aging pipeline reads patient and claim exports, merges billing data, assigns status classifications, and writes a multi-sheet workbook — data, aging analysis, primary and secondary work queues, recently billed, and inquiries.
Practice management categorisation modules parse text and CSV exports from two common system families, normalise column names, map insurance references, and produce status summaries with claim grouping.
Deposit import converts fixed-width deposit text into structured Excel using openpyxl and XlsxWriter for dependable workbook output.
Financial consolidation scans folders for PDFs and CSVs, extracts monthly billed and collection figures, and aggregates by year into one workbook using pdfplumber for PDF tables.
Utilities include large-file CSV splitting with encoding detection, provider- based splitting against a roster, and generic fixed-width-to-CSV conversion for legacy exports.
Deployment access control sits at launch — authenticated access before the dashboard opens — and configuration persists in a user-specific app data directory. A PyInstaller spec packages a distributable Windows bundle for analysts who do not manage Python environments.
# Shared pattern: read with explicit encoding detection before pandas assumes UTF-8.
encoding = detect_encoding(path)
df = pd.read_csv(path, encoding=encoding, dtype=str)
What I found
Consolidating ten or more monthly reports behind one UI reduced manual reporting time by about eighty percent compared with the prior workflow of separate scripts, manual Excel steps, and ad hoc PDF copying. The gain came less from any single clever algorithm and more from eliminating context switching: one login, one output naming convention, one log file, repeatable modules.
Data quality improved because encoding and delimiter detection ran the same way every time. Large files that previously crashed desktop Excel were split or processed in pandas with explicit dtypes, which cut down silent date coercion and leading-zero drops on member IDs. New analysts could run a categorisation report from the menu without inheriting a tribal-knowledge checklist.
The modular layout also made maintenance tractable. When a practice management vendor changed an export column, I updated one module without touching unrelated reports — a property the old macro workbook did not have.
What I'd do differently
The UI and modules share little formal contract beyond convention. I would define a narrow interface — input schema, required columns, output workbook structure — and validate inputs before processing so failures surface as readable errors instead of mid-pipeline stack traces in the log pane.
I would add automated tests around the highest-risk transforms: aging status classification, insurance mapping tables, and PDF table extraction. Those are where a silent logic change costs the most. I would also separate deployment access control from the reporting code entirely; it solved a distribution problem but couples security policy to an app that should be forkable as open tooling.
Finally, several modules still assume Windows path conventions and desktop Excel as the review surface. A second pass would target plain CSV or Parquet outputs and a thin CLI for scheduled runs, which would make the same logic usable in a nightly job without the GUI.
Source code
Repository for this demonstration project.
View repository →