Branding, Excel watermark, live run progress, and uv #1

Merged
Vasanth merged 1 commits from branding-and-run-progress into main 2026-10-28 10:28:59 +00:00
Owner

Summary

Branding on both pages, a logo watermark in the Excel reports, a live run animation with plain-language messages, and uv instead of requirements.txt.

 <login.html>
+  eCare logo (top-left) + favicon
   owl + sign-in card
+  Waystar | Aquilaehr logos under the card

 <index.html> (Reports page)
-  <h1>
+  eCare logo + <h1>
   Run card
+    run progress: Waystar lane ─┐
+                  Aquilaehr lane ┴─> Excel sheet (fills, then check mark)
+    plain-language activity list (built from the run log in the browser)
-    <pre> raw log
+    <details> Technical log </details>
 consolidate.write_xlsx
-  pandas + openpyxl
+  pandas + xlsxwriter        # only engine that can set a sheet background
+  set_background(static/report-watermark.png) on Summary + Reconciliation
   freeze header, autofilter, column widths, mm/dd/yyyy, "$" charges  (unchanged)
-requirements.txt
+pyproject.toml + uv.lock
 Dockerfile
-  pip install -r requirements.txt
+  pip install uv==0.11.28     # from PyPI, not ghcr.io (registry pulls get reset on Dokploy)
+  uv sync --frozen

/status also returns locations (the location count) so the progress bars know the total. mek_recon.py output is unchanged; the friendly wording is only on the web page.

Evidence

  • Before: no logos on either page; reports had no watermark; a run showed only a raw monospace log.
    After:
    • uv run consolidate.py rebuilt every report. Checked the generated .xlsx files: both sheets have the background picture, header frozen at A2, autofilter set, DOS mm/dd/yyyy, Charges "$"#,##0.00.
    • uv run app.py starts; login page loads with all three logos.
    • Reports page checked in the browser at 1280px and 375px with simulated run logs: ready → signing in → downloading (both lanes) → building Excel → done, plus partial-failure and stopped runs. No horizontal scroll on mobile.
    • Activity list wording checked against every message mek_recon.py and consolidate.py print, including login timeout tracebacks and "close these files in Excel first".
  • Not tested: a real end-to-end run against Waystar/Aquilaehr, and the Docker build (no Docker on the dev PC).

Merge Danger

Door: two-way

Revert the commit to go back. No data or schema changes; reports are regenerated on every run.

Blast Radius: deploy

The Dockerfile now installs dependencies with uv. If the uv install or uv sync --frozen fails on the Dokploy server, the new image won't build (the running container stays up). Watch the first deploy.

## Summary Branding on both pages, a logo watermark in the Excel reports, a live run animation with plain-language messages, and uv instead of `requirements.txt`. ```diff <login.html> + eCare logo (top-left) + favicon owl + sign-in card + Waystar | Aquilaehr logos under the card <index.html> (Reports page) - <h1> + eCare logo + <h1> Run card + run progress: Waystar lane ─┐ + Aquilaehr lane ┴─> Excel sheet (fills, then check mark) + plain-language activity list (built from the run log in the browser) - <pre> raw log + <details> Technical log </details> ``` ```diff consolidate.write_xlsx - pandas + openpyxl + pandas + xlsxwriter # only engine that can set a sheet background + set_background(static/report-watermark.png) on Summary + Reconciliation freeze header, autofilter, column widths, mm/dd/yyyy, "$" charges (unchanged) ``` ```diff -requirements.txt +pyproject.toml + uv.lock Dockerfile - pip install -r requirements.txt + pip install uv==0.11.28 # from PyPI, not ghcr.io (registry pulls get reset on Dokploy) + uv sync --frozen ``` `/status` also returns `locations` (the location count) so the progress bars know the total. `mek_recon.py` output is unchanged; the friendly wording is only on the web page. ## Evidence - **Before:** no logos on either page; reports had no watermark; a run showed only a raw monospace log. **After:** - `uv run consolidate.py` rebuilt every report. Checked the generated `.xlsx` files: both sheets have the background picture, header frozen at A2, autofilter set, DOS `mm/dd/yyyy`, Charges `"$"#,##0.00`. - `uv run app.py` starts; login page loads with all three logos. - Reports page checked in the browser at 1280px and 375px with simulated run logs: ready → signing in → downloading (both lanes) → building Excel → done, plus partial-failure and stopped runs. No horizontal scroll on mobile. - Activity list wording checked against every message `mek_recon.py` and `consolidate.py` print, including login timeout tracebacks and "close these files in Excel first". - **Not tested:** a real end-to-end run against Waystar/Aquilaehr, and the Docker build (no Docker on the dev PC). ## Merge Danger **Door:** two-way Revert the commit to go back. No data or schema changes; reports are regenerated on every run. **Blast Radius:** deploy The Dockerfile now installs dependencies with uv. If the uv install or `uv sync --frozen` fails on the Dokploy server, the new image won't build (the running container stays up). Watch the first deploy.
Vasanth added 1 commit 2026-10-28 09:32:13 +00:00
- Login and Reports pages: eCare logo, Waystar and Aquilaehr logos (light
  versions for the dark pages), eCare favicon.
- Excel reports: faded eCare/Waystar/Aquila watermark as the sheet
  background on both sheets. Report writer moves to xlsxwriter, the only
  engine that can set a sheet background.
- Reports page: animated run progress (both download lanes piped into the
  Excel sheet) and a plain-language activity feed built from the run log;
  the raw log stays under "Technical log". /status now returns the
  location count.
- Dependencies move from requirements.txt to pyproject.toml + uv.lock;
  Dockerfile installs uv from PyPI and runs uv sync --frozen.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Vasanth requested review from Murugeswaran 2026-10-28 09:32:27 +00:00
Murugeswaran left a comment
Owner

Approving. I read the full diff (except the binary logos and uv.lock contents) and found nothing blocking.

Checked and fine

  • consolidate.py: the openpyxl -> xlsxwriter swap keeps freeze header, autofilter, width cap, mm/dd/yyyy dates and $ charges. Empty reports are handled. No other openpyxl usage remains.
  • Dockerfile/uv: uv==0.11.28 and xlsxwriter==3.3.0 exist on PyPI. .venv/ is in .dockerignore. PATH makes gunicorn and sys.executable resolve to the venv. UV_PYTHON_DOWNLOADS=never is fine with python:3.12-slim. Pins match the old requirements.txt.
  • index.html: the log regexes match what mek_recon.py and consolidate.py actually print. Log text is rendered with textContent / text nodes, not innerHTML, so remote location or error text cannot inject markup.
  • /status adding locations is safe. login.html changes are branding only.

Minor comments (non-blocking)

  1. process_steps.md still says python mek_recon.py / python consolidate.py (lines 7, 9, 86). With requirements.txt removed, following those commands gives import errors. Please update to uv run ..., as the code docstrings already do.
  2. The progress bars count OK/FAIL lines from the last 300 log lines returned by /status. A failed download's error text can be many lines (Playwright call log), so with enough failures early OK lines could drop out of the window and the counts could go backwards. Display-only. Counting OK/FAIL server-side and returning the numbers would avoid it.

Not verified
Docker build and a real end-to-end run against Waystar/Aquilaehr were not tested (per the PR description), and I did not run the code. Please watch the first Dokploy deploy.

Approving. I read the full diff (except the binary logos and uv.lock contents) and found nothing blocking. **Checked and fine** - consolidate.py: the openpyxl -> xlsxwriter swap keeps freeze header, autofilter, width cap, mm/dd/yyyy dates and $ charges. Empty reports are handled. No other openpyxl usage remains. - Dockerfile/uv: uv==0.11.28 and xlsxwriter==3.3.0 exist on PyPI. .venv/ is in .dockerignore. PATH makes gunicorn and sys.executable resolve to the venv. UV_PYTHON_DOWNLOADS=never is fine with python:3.12-slim. Pins match the old requirements.txt. - index.html: the log regexes match what mek_recon.py and consolidate.py actually print. Log text is rendered with textContent / text nodes, not innerHTML, so remote location or error text cannot inject markup. - /status adding `locations` is safe. login.html changes are branding only. **Minor comments (non-blocking)** 1. process_steps.md still says `python mek_recon.py` / `python consolidate.py` (lines 7, 9, 86). With requirements.txt removed, following those commands gives import errors. Please update to `uv run ...`, as the code docstrings already do. 2. The progress bars count OK/FAIL lines from the last 300 log lines returned by /status. A failed download's error text can be many lines (Playwright call log), so with enough failures early OK lines could drop out of the window and the counts could go backwards. Display-only. Counting OK/FAIL server-side and returning the numbers would avoid it. **Not verified** Docker build and a real end-to-end run against Waystar/Aquilaehr were not tested (per the PR description), and I did not run the code. Please watch the first Dokploy deploy.
Vasanth merged commit f6759109da into main 2026-10-28 10:28:59 +00:00
Sign in to join this conversation.
No Reviewers
No labels
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: automation-tools/MEK-Charge-Reconciliation#1