← All projects

Purchasing data · Data engineering

Supplier catalog imports

A CSV import tool for supplier catalogs. Review price and part changes, correct rejected rows, then approve the batch without overwriting a newer catalog version.

Local application and operations rehearsal completed

Four staged part changes from a recorded synthetic catalog import.
Four staged part changes from a recorded synthetic catalog import.

Implementation

Supplier CSVs are retained with their source digest, parsed with an explicit monetary locale, and staged separately from the current catalog. The review shows added, changed, unchanged, missing and rejected rows.

Approval checks the catalog version and review digest inside the write transaction. Competing reviews become stale; a fault during application rolls back the entire batch. Repeating a successful request returns the original result.

The dark browser interface includes role-based controls, original CSV and JSON report downloads, paginated reviews, and a catalog preview.

Checked online SQLite snapshots, restore into a new directory, and a periodic backup command are included. An executed operations rehearsal covers abrupt process exits, recovery and rejected inputs.

Inputs and assumptions

  • Included ACME and EURO supplier records are synthetic. Missing source rows remain in the catalog.
  • Item identity is supplier plus normalized part number. USD, EUR and GBP prices use integer cents; EA, BOX, KG and M units are explicit.
  • Python 3.12 and local SQLite storage. SQLite serializes writers; the earlier PostgreSQL deployment plan is not included.

Results

Recorded results for the included reference case
Database and HTTP tests passed20
Largest synthetic import100,000 rows
100,000-row stage time, recorded host9.8779 s
100,000-row commit time, recorded host2.4308 s
Operational checks passed14 / 14
Report figures (2)
Executed browser review after applying the sample ACME update.
Executed browser review after applying the sample ACME update.
Recorded stage and commit times for synthetic CSV imports. Shared execution host; not a service capacity benchmark.
Recorded stage and commit times for synthetic CSV imports. Shared execution host; not a service capacity benchmark.

Open the full report ↗

Verification

20 database and HTTP tests pass, including concurrent approvals, response retries, rollback after a row write, rejected CSVs and role checks. The sample workflow was also exercised in a browser. A separate operations rehearsal passes 14 expected-outcome checks, including process crashes, checked snapshots, restore and a finite backup schedule.

python tests.py
python evidence.py
python operations_rehearsal.py
Download the verification record ↓

Additional scenarios

14 outcomes checked through executed synthetic operations. The report lists the expected and observed outcomes for each check.

Read the validation report ↗

Project files

The ZIP contains the source, inputs, results, and instructions. These files are also available individually.

Download project ZIP · 154 KB
Archive checksum

SHA-256

b3a23d60407494c1e54ba0787f17399ab7118b37c4b8bbad4b3117bfae00b178
Original project scopeArchived brief PDF ↗

Run locally

Python 3.12+ / SQLite via Python standard library

Extract the ZIP and open a terminal in the supplier-catalog-imports folder. The README includes setup and usage details.

python app.py --seed --port 8011
# Open http://127.0.0.1:8011
python tests.py
python evidence.py
python build_report.py
python operations_rehearsal.py

Limits

  • Localhost-only reference app with fixed demo accounts and one-hour in-memory sessions. No production identity provider or TLS listener.
  • Files are limited to 16 MiB and 100,000 rows. Parsing and diff storage are memory-bound; paginated review still loads the complete stored diff. Timings are measurements of this host, not capacity guarantees.
  • No supplier API, automatic deletion, currency conversion or unattended import. Process-crash recovery and corrupted-snapshot rejection were executed; physical disk failure and power-loss behavior remain outside the model.