02Side project
Bee Media Book Inventory
Warehouse stock control with a storefront style public catalog.
- For
- Freelance, for a book publisher
- Role
- Full stack, built with one collaborator
- Period
- 2026
Illustration redrawn for this portfolio. Not a screenshot, no client data.
- 1
- entry point for every stock change
- 57
- automated tests, run in CI
- 6
- report types with CSV export
- 2
- roles: owner and warehouse admin
Context
An inventory system for a publisher's book warehouse: every stock movement audited, bulk imports from spreadsheets, and a public catalog customers can browse to check availability.
The publisher's book data lived in spreadsheets. They needed stock control a warehouse admin could run from a phone, reports the owner could trust, and a public catalog where customers can check availability themselves.
It is a deliberately boring stack: server rendered Laravel and Blade with Tailwind, no SPA. The interesting parts are the rules: one guarded path for every stock change, and imports that survive messy real world spreadsheets.
Stack
- Laravel 13
- PHP 8.3
- Blade
- Tailwind CSS 4
- Vite
- MySQL
- ZXing
- PhpSpreadsheet
- Docker
- GitHub Actions
Interactive
Try to oversell
A simplified model of the stock service. The direction comes from the movement type, every change leaves an audit row, and stock can never drop below zero.
Current stock
copies of "Cerita Anak Nusantara"
Audit trail
No movements yet. Record one, then try to sell more than you have.
Movement type
Quantity
What I built
- 01
One way to move stock
Every movement goes through a single service that runs in a transaction, locks the book row, derives the direction from the movement type and refuses anything that would push stock below zero. Each change leaves an audit row with the previous and new stock.
- 02
Public catalog
Storefront style pages with search, filters, curated collections, an admin managed highlight carousel, galleries and synopses, each showing live stock availability.
- 03
Imports that survive real spreadsheets
CSV and Excel imports map Indonesian headers to columns, detect the header row, skip section rows and upsert by ISBN with a hashed fallback key. Each run writes a log with per row errors.
- 04
Cover images from Drive links
A queued job downloads covers from public Google Drive links, then compresses them for display while keeping the originals intact.
- 05
ISBN scanning in the browser
The stock movement form opens the phone camera and reads the ISBN barcode with ZXing, so the admin never types a 13 digit number.
- 06
Reports and exports
Current stock, low stock, movements, inventory value and more, previewed in the browser and streamed as CSV so large exports do not exhaust memory.
- 07
Tests, CI and deploy
57 feature and unit tests run on every push with GitHub Actions. The app ships as Docker containers behind Nginx on a small VPS, with a written deployment guide.