Bulk Document Upload
Drop a multi-file packet, a ZIP, or a scanner feed — VCPMS creates a tracked set, splits PDFs into sub-documents, and drives each one through the AI intake pipeline. Reviewers handle only the exceptions.
Features • 2026Overview
Staff-side bulk intake replaces single-document uploads for high-volume scenarios — mailed receipt packets, faxed treatment plans, scanner feeds, and ZIP archives. The feature introduces the InDocumentSet WorkItem as a batch container that orchestrates splitting, OCR, classification, field extraction, and routing to the correct target WorkItem (VcClaim, FrClaim, ExpenseBill, etc.).
App.InDocumentSet.EnableBulkUpload.
When disabled, documents go through the legacy single-file intake path.
End-to-End Flow
From upload to close, every document traverses the orchestrator — per-doc stage status is
written to RoutingResultJson so the batch workspace reflects real-time progress.
Terminal states are Closed (all docs resolved), Failed
(set-level exhaustion), or ReviewRequired (awaiting reviewer action).
What You Can Upload
- Individual files — multi-select PDF / TIFF / PNG / JPG / DOCX.
- Drag-and-drop packets — drop 10–60 files at once.
- ZIP archives — server-side extraction preserves source filenames.
- Scanner feed — adapter interface shipped; specific scanner integrations phased in.
- Multi-page scans — the splitter auto-detects sub-document boundaries.
The Pipeline
Each uploaded set enters a Hangfire-backed orchestrator that drives the set through five stages (Splitting → Classifying → Extracting → Routing, plus the starting Received state). The user sees real-time progress in the batch workspace.
Received → Splitting → Classifying → Extracting → Routing →
(ReviewRequired | Closed | Failed)
| Stage | What It Does | Configurable |
|---|---|---|
| Split | Breaks multi-page PDFs into sub-documents. Strategies: Separator Page, AI Boundary Detection, Hybrid (AI first, separator fallback), None. | Per-tenant default + per-rule override. |
| OCR | Text extraction via Azure Document Intelligence. Skipped when AI is off. | Gated by App.InDocumentOCR feature. |
| Classify | Assigns InDocumentType with a 0–100 confidence. (v1: the AI classifier does not populate InDocumentCategory; reviewers pick the subcategory in the UI when needed.) |
See the Document Classification page. |
| Extract | Pulls identifier fields (claim #, victim name, DOB, service date, provider TIN). Strategies: QueryFields, CustomModel, Regex, Layered, None. | Per-rule ExtractionStrategy + ExtractionConfigJson. |
| Route | Looks up candidate target WorkItems using a DSL query; ranks by score; auto-links only on unambiguous unique match above threshold. | Per-rule identifier keys + thresholds + RequireUniqueMatchToAutoLink. |
Review Workflow
Documents that don't auto-link land in a reviewer queue with a ranked candidate list. Two layout modes:
- Focused (two-pane) — document on the left, routing form on the right.
- Overview (three-column) — doc list / preview / routing form.
Each review surfaces a matched-rule chip so reviewers see which routing rule triggered the extraction. Actions: approve the top candidate, pick a different candidate, manual-link to any WorkItem, reject, or reprocess.
No-Match Behavior
When no candidate passes the threshold the rule's NoMatchBehavior decides what happens:
- ParkForReview — (default) reviewer picks the target manually.
- AutoCreateDraftWorkItem — system creates a draft WorkItem pre-filled from extracted fields.
- Reject — document moves to Rejected state with a reason.
Reprocess
Any document or whole set can be reprocessed — prior routing results snapshot into
an append-only history on RoutingResultJson, so you can see how classification
and scoring evolved across attempts. Useful when rules are updated or AI features are toggled.
Reliability & AI Off
-
AI disabled → splitter / OCR / classifier / extractor stages are marked
Skipped; docs land in review withRequiresReviewReason = AiDisabledand fields empty-editable. The bulk upload UI still works as a manual-intake drop zone. -
Azure DI transient failure → per-stage retry up to
AiFailureRetryCount, thenAiFailed. The pipeline continues; other docs in the set are unaffected. -
No matching rule →
ConfigNotFound; reviewer classifies and routes manually.
Permissions
VBO-only, granular:
Pages_BulkDocumentIntake_UploadPages_BulkDocumentIntake_ReviewPages_BulkDocumentIntake_AssignPages_BulkDocumentIntake_ReprocessPages_BulkDocumentIntake_MetricsPages_InDocumentRoutingRules_*(Create / Edit / Delete / Test)
Metrics Dashboard
Six widgets at /app/main/vcp/bulk-intake/metrics:
- Throughput (docs/day)
- Auto-link rate
- Time to close
- Review-required reasons breakdown
- Classification confidence distribution
- Current reviewer load
Related
- Document Classification — the AI classifier behind stage 3.
- Admin Guide — creating routing rules via the three-step wizard.
- Communication — set-level notifications (ReviewRequired, Closed, Failed).