NAM Builders Supply Corp was running a building-supply business on spreadsheets. Quotations were typed by hand, sales lived in one workbook and inventory in another, and putting a single report in front of management meant a week of chasing files across departments. I joined as an IT intern for a 500-hour internship and built the company its first real system.
What I built
I replaced the spreadsheet workflow with one platform covering quotations, sales entry, the sales ledger, products and stock, finance, logistics, and bulk imports. It is now used daily by staff to run over ₱1M in monthly sales operations. The goal was never to digitise the spreadsheets — it was to make the numbers agree with each other for the first time.

Quotation to sale
The core workflow moves a quotation through drafting and approval into a confirmed sale, deducting stock as it goes. Quotations print in the company's existing formal document format, so staff did not have to change how they present to clients, and a quote can be converted partially when a client only takes some of the line items. Deliveries carry their own DR numbers through logistics, and finance tracks receivables against payment status.

Numbers that reconcile
On top of the operational data I built a reporting layer: an executive view with cross-filtering drilldowns by company, category, and account manager. The hard part was trust, not charts. I wrote the pricing and margin logic — income, markup and margin solvers, withholding tax, and the formal-document arithmetic — as a unit-tested calculation engine, so that what the dashboard shows reconciles with what finance calculates by hand.
Re-architecting on Postgres
The system shipped first in PHP and MySQL. I later re-architected it as a React and TypeScript single-page app on Supabase, which meant moving years of live production data without losing any of it. I wrote the migration myself: a converter that reads the legacy MySQL dump, scrubs currency-formatted values back into numerics, normalises malformed and zero dates, and corrects timezone handling that would otherwise have shifted historical records by a day. A Legacy Restore screen inside the app lets that import be re-run and checked rather than trusted blindly.
Who can see what
Several departments touch the same record, so access is a first-class feature rather than a checkbox. Roles and per-privilege gates are defined in the database and enforced by row-level security, account managers are assigned to the companies they handle, sessions are limited to one active login per account, and an activity log records who changed what. The frontend only ever holds the publishable key.
I finished the internship with a full handover — per-module technical documentation plus training, so staff could run their own reporting without me. The system stayed in daily use after I left, which is the part I judge it by.
