diff --git a/README.md b/README.md index bc8c673..aacbf0e 100644 --- a/README.md +++ b/README.md @@ -21,6 +21,7 @@ Extracts and organizes documents from FileCabinet CS (Thomson Reuters) using GUI | `fccs_reorganize.py` | Step 3: Parse filenames and rebuild folder structure | | `fccs_verify.py` | Step 4 (optional): Compare manifests against exported files | | `fccs_check.py` | Utility: Interactively check if specific drawers exported completely | +| `fccs_report.py` | Utility: Generate a clean client-facing HTML progress report (issues only) | | `fccs_dump_controls.py` | Utility: Dump control identifiers of an on-screen dialog | ## Setup Per Engagement @@ -115,10 +116,18 @@ Drawer ID(s): 08097 18430 > Note: because page-splitting means the number of files can't be mapped one-to-one to documents, completeness is judged by document *presence* (is each manifest document represented by at least one exported file), not by exact file counts. +**Client-facing progress report:** For a clean summary to share with the client, generate an HTML report of outstanding work only: + +``` +python fccs_report.py +``` + +This runs the same document-level check as `fccs_verify.py` but writes a self-contained, print-friendly HTML file (`report_html`, default `C:\Migration\progress_report.html`) that lists **only** the drawers with missing documents, each with the client name and the specific documents still outstanding. Fully-migrated drawers are omitted (a headline shows how many are done). Drawers with no manifest or in `crashed.txt` are excluded since they reflect internal tooling state, not client-facing progress. Open it in any browser and print to PDF to send. + ## Config Reference All scripts read from `config.ini` (or specify `--config path\to\config.ini`). -- **`[paths]`** -- backup_dir, export_dir, output_dir, drawer_id_file, completed_file, ignore_file, crashed_file, log_file, verify_report, screenshot_dir, manifest_dir, folder_list +- **`[paths]`** -- backup_dir, export_dir, output_dir, drawer_id_file, completed_file, ignore_file, crashed_file, log_file, verify_report, report_html, screenshot_dir, manifest_dir, folder_list - **`[timeouts]`** -- nav_timeout, dialog_timeout, progress_appear, progress_finish, settle, confirm_timeout - **`[controls]`** -- FCCS window class names and button titles (rarely need changing) diff --git a/__pycache__/fccs_config.cpython-313.pyc b/__pycache__/fccs_config.cpython-313.pyc index c2e53a7..4c11bb3 100644 Binary files a/__pycache__/fccs_config.cpython-313.pyc and b/__pycache__/fccs_config.cpython-313.pyc differ diff --git a/__pycache__/fccs_report.cpython-313.pyc b/__pycache__/fccs_report.cpython-313.pyc new file mode 100644 index 0000000..97fd8a9 Binary files /dev/null and b/__pycache__/fccs_report.cpython-313.pyc differ diff --git a/config.ini b/config.ini index d2e3ecf..6adb962 100644 --- a/config.ini +++ b/config.ini @@ -9,6 +9,7 @@ ignore_file = C:\Migration\ignore.txt crashed_file = C:\Migration\crashed.txt log_file = C:\Migration\run_log.txt verify_report = C:\Migration\verify_report.txt +report_html = C:\Migration\progress_report.html screenshot_dir = C:\Migration\screenshots manifest_dir = C:\Migration\manifests folder_list = fccs_folders.txt diff --git a/fccs_config.py b/fccs_config.py index 1a29108..a8921b9 100644 --- a/fccs_config.py +++ b/fccs_config.py @@ -229,6 +229,25 @@ def exported_doc_name(filename): return stem[anchors[-1].end():] +def client_name_from_files(files): + """Best-effort client name from a drawer's export filenames, or None. + + Filenames are '{drawer}_{client}_{folder}_{MM-DD-YYYY}_{doc}.ext', so the + client name is the second underscore-delimited token. Client names carry + commas/spaces but not underscores; the most common value across the drawer's + files is returned to shrug off any oddball filename. + """ + counts = {} + for f in files: + parts = f.split("_") + if len(parts) >= 2 and parts[1].strip(): + name = parts[1].strip() + counts[name] = counts.get(name, 0) + 1 + if not counts: + return None + return max(counts, key=counts.get) + + def index_files_by_drawer(export_dir): """Map each export file to its leading drawer-ID token (before first '_'). diff --git a/fccs_report.py b/fccs_report.py new file mode 100644 index 0000000..121430c --- /dev/null +++ b/fccs_report.py @@ -0,0 +1,209 @@ +""" +Utility: Generate a client-facing progress report (HTML). + +Runs the same document-level completeness check as fccs_verify.py, but produces +a clean, self-contained HTML file listing ONLY the drawers with outstanding +items and, for each, the specific documents still missing from the export. It's +meant as a "check-in progress" document you can send to the client. + +Drawers that are fully exported, that have no manifest, or that only appear in +crashed.txt are intentionally left out — the report shows outstanding work, not +internal tooling state. A headline shows how many drawers are fully migrated so +the overall progress is clear. + +Output goes to `report_html` (default C:\\Migration\\progress_report.html). + +USAGE +----- + python fccs_report.py +""" + +import os +import sys +import html +from datetime import datetime + +from fccs_config import ( + parse_args, load_config, + evaluate_drawer, index_files_by_drawer, client_name_from_files, +) + + +PAGE_TEMPLATE = """ + +
+ + +