Offline Windows desktop app that replaces the CollectingQualityPartPullInfo VBA
macro. Drop a week's worth of daily QC "Quality Part Pull" files (or whole
month/week folders) onto it; it reads each file's QC Form sheet, normalizes
messy operator dates/times, validates every row, catches duplicates, and
consolidates everything into a per-year SQLite store you can search and export to
.xlsx/.csv.
Fully offline — the only network call is the manual update check. Built on the same Electron stack as jdot-utilities (same window shell, same standard auto-updater); SQLite is the source of truth, xlsx/csv are exports.
New here? End-user instructions live in docs/USER_GUIDE.md.
- Reads file contents, not filenames. Date/time/data come from inside each
QC Formsheet — no rename dance, no fragile "resume from last row" logic. - Handles a whole month/week folder at once, streamed file-by-file with a live progress bar (thousands of files won't exhaust memory or look frozen).
- Tolerant date/time parsing.
8:30 am,830,0830,1345,5/1/2026,05-01-26,May 1, Excel serials — all normalized. Anything unclear is flagged, not silently mangled; the filename is a fallback. - Duplicate detection you control. Two rows are duplicates only when all of the configured key fields match (Settings → Duplicate-match fields). Content hashing means re-dropping the same file is harmless.
- Nothing enters the store silently. Invalid / ambiguous / duplicate rows go to the Review queue; you fix inline and approve — or set an acceptance policy to auto-allow duplicates/ambiguous rows (tagged so you can see them).
- See and search your data, and export a date range (last/this week, month, YTD, custom) with a live in-range count.
- Import — drag-drop files or folders (or the Choose buttons). Live progress; a summary of committed / held / to-review / total when done.
- Review — flagged rows as editable cards showing the actual problem messages. Sort (issue severity, date, part number, forge order, …) and filter (by text or issue type); duplicates are highlighted. Approve (records "no corrections" / "corrected") or Reject (kept, restorable). Auto-allowed rows never appear here.
- Data — live stats, a searchable browser of committed rows (with a Review column showing each row's disposition and duplicate highlighting), and date-range export to xlsx/csv with an Include allowed duplicates toggle.
- Settings — active year, source sheet, validation rules, import behavior (auto-commit, filename fallback), review acceptance (auto-allow duplicate/ambiguous, duplicate-match fields), store folder + journal mode, a Store health integrity check, update check, and a guarded database reset.
src/main/
main.js Electron app + IPC + standard updater + launch integrity check
preload.js contextBridge API
db.js SQLite store (files / batches / rows); migrations; queries
settings.js default rules + user overrides (deep-merge)
pipeline/
readXlsx.js read the QC Form sheet (exceljs, lazy-required)
parseDateTime.js tolerant date/time normalization (confidence tiers)
validate.js rule engine (ok / warn / reject)
dedup.js file hash + configurable row key
classify.js review-acceptance disposition (pure, tested)
importBatch.js orchestrates a full drop -> classified rows (streamed)
exportYear.js date-range xlsx / csv export
src/renderer/ Import · Review · Data · Settings (index.html + renderer.js + styles.css)
config/defaultRules.json validation + behavior defaults (editable in Settings)
test/ pipeline · import · reject-button · acceptance suites
npm install # installs deps; postinstall rebuilds better-sqlite3 for Electron
npm test # pure-node suites: parse/validate/dedup, import streaming,
# reject-button guard, acceptance policy (no Electron needed)
npm start # launch the app
npm run dist # build the Windows NSIS installer -> dist/Requires Node 22+. Building the .exe must happen on Windows (the native
better-sqlite3 binary) — CI (.github/workflows/build.yml) does this on
windows-2022.
This repo is public and hosts both the source and the GitHub Releases the updater reads. Push a version tag to cut a release:
git tag v1.2.0 && git push origin v1.2.0CI builds the Windows installer and publishes it (installer + latest.yml +
.blockmap) as a Release on this repo, using the built-in GITHUB_TOKEN — no
personal access token and no separate feed repo needed. A manual
workflow_dispatch run builds a test installer as a downloadable artifact without
publishing.
The installed app checks for updates only when you click Settings → Check for updates (no background calls).
| Field | Rule | On failure |
|---|---|---|
| Date | parseable; within active year ±1 | reject / ambiguous → Review |
| Time | parseable 00:00–23:59 | reject → Review |
| Shift | in {1, 2, 3} | reject → Review |
| Press Line | in {1, 3, 4, 5, 7, 9, 11} | reject → Review |
| Forge Order | 5–9 digits (optional FO prefix) |
warn (still imports) |
| Part Number | e.g. NN-NNN-NN, NNNNN-NN |
warn (still imports) |
| Heat Code | 3–4 letters | warn (still imports) |
| Initials | 2–4 letters, optional | warn if present & odd |
| Duplicate | all configured key fields match, or same file hash | → Review (or auto-allowed, tagged) |
Set Store folder in Settings to a network path (e.g. P:\...\QCPull) so the
qcpull.db and its exports live on the share and whoever runs the app that week
writes to the same year store. On a network share the database automatically uses
a rollback journal instead of WAL (WAL needs real shared memory).