Bomprice: keeping purchasing decisions tied to the source
Origin
A parts list is rarely ready to buy. One spreadsheet can mix per-board quantities, build totals, alternative manufacturers, supplier prices, and rows that should not be fitted. I built Bomprice around the work needed to turn that file into a reviewed purchasing plan.
Overview
Bomprice is an authenticated workspace for electronics purchasing. Buyers import a bill of materials, resolve parts and quantities, compare supplier offers, prepare purchasing documents, and reconcile deliveries. Each stage builds on decisions made in the previous work.
My role covers the React workspace, NestJS backend, project data model, quote jobs, shared calculations, and agent workflows. MPN owns the component catalog, Quote collects supplier offers, and shared services provide identity and exchange rates. Bomprice owns the buyer's project and decisions.
The hardest failures were often quiet ones: a saved project losing an alternative, an export restoring an old import preview, or a quote retry replacing offers that had already arrived. I treated preserving the meaning of the buyer's work as part of the product.
Constraints
A plausible table can hide a wrong part, wrong quantity, or lost decision.
A quantity may mean parts per board or the total for a particular build. Several columns can describe different build sizes. A manufacturer name beside an MPN belongs to that candidate; moving the values independently can invent a component the file never contained.
Implementation
I separated source evidence, draft work, confirmed decisions, and supplier observations, then made their transitions explicit.
The browser reads CSV and XLSX through shared import packages. Bomprice keeps the selected worksheet's values, ordered columns, and mappings. Source rows retain their file identity, sheet, and physical row position, so a later review can return to the actual input.
Real workbooks drove the adapter beyond a single MPN column. It keeps manufacturer and part-number pairs together, recognizes explicit alternative columns, and leaves conflicting pair labels for manual mapping. Several build-total columns remain a buyer's choice. A missing manufacturer stays missing. The stored data can rebuild a single-sheet workbook, but it does not preserve the original formulas, formatting, or other sheets.
Features
Prepare and reconcile the handoff
Generate quote requests, purchase documents, and reports from confirmed project data. Match supplier documents and received quantities against those decisions.
Continue through the browser or an assistant
Use saved projects and portable files to resume work. Agent previews and commits use the same calculations and project-version checks as the workspace.
Review the import before it becomes the project
Inspect the worksheet and column mapping, keep alternative manufacturer and MPN pairs together, and resolve unclear quantities before applying the rows.
Compare offers against the actual purchase
See price, stock, pack sizes, and required quantity in the same decision. An offer needs enough stock and a usable price for the quantity that must be bought.
Results
The work connects a messy source table to saved purchasing decisions and the documents that follow them.
- Manufacturer and MPN candidates keep their identity through approval, rejection, restore, and save/reopen.
- A stale, unedited import preview can no longer overwrite later committed rows during export.
- The controlled 49-row quote replay submitted 49 changed project rows instead of 1,019 repeated row updates. Supplier latency was outside that measurement.
- Quote observation can resume an accepted request, retain partial offers, and reject mismatched or outdated results before attaching them.
- Browser and agent workflows share quantity and purchasing rules, while supplier documents remain evidence for reviewed decisions.
What mattered
The important question is where a value became a decision. Bomprice keeps that boundary visible across import, quoting, purchasing, and delivery review. Faster parsing or more supplier offers help only if the buyer can still explain the resulting part, quantity, and price.