Back to portfolio
Muhamed Malkoč
02 / Featured project

Smart Document Processing

A full-stack system for uploading messy business documents, extracting structured fields and guiding users through validation and review.

RoleFull-stack architecture & implementation
Project typeTechnical assessment / independent case study
View source on GitHub
The challenge

Uploaded documents arrive in different formats and often contain incomplete or inconsistent data. The system needed to preserve the original submission, extract what it could, explain validation failures and remain extensible for more advanced parsers.

The approach

I built a pipeline that stores upload metadata and processing status, routes files to format-specific parsers, normalizes extracted fields and records validation details instead of discarding invalid documents. An Angular dashboard then lets users review, correct and revalidate the extracted data.

What I built

Core implementation

01

Format-specific parsing

CSV, text and text-based PDF inputs are mapped into a shared extracted-document structure through isolated parsing responsibilities.

02

Validation as data

Missing fields, invalid totals, dates, line items and duplicate document numbers are returned and persisted as structured results.

03

Human review workflow

The Angular interface exposes document status, editable extracted fields, line items and validation feedback for correction and revalidation.

04

Traceable processing

Each upload retains its original name, file type, status, extracted payload and validation outcome, while dashboard totals are grouped by currency.

Engineering judgment

Key decisions

  1. Persisted invalid documents so failures remain inspectable and can be reprocessed later.
  2. Separated file upload, parsing and validation responsibilities.
  3. Used JSON fields for evolving extracted payloads while keeping core document metadata relational.
  4. Kept the OCR service isolated; image extraction still requires final pipeline integration before it should be treated as complete.
Next iteration

What I would improve

Interested in how I approach product and engineering problems?

Let’s talk →