Colmado
Key features
Transactional checkout: 15-min stock hold with server expiresAt, 30 s sweeper and double-sell lock (409 with per-item detail)
Receipt outside the web: invoice with downloadable/printable QR SVG + simulated email on payment
Orders with state machine Reserved → Paid → Preparing → Shipped → Delivered, live timeline and cancellation with stock release
Totals always computed server-side: cart (subtotal + shipping), order.totalCents == Σ lines, list stock == detail stock
Shopkeeper panel with real KPIs and SVG charts of daily sales and top products with axes, dates and tooltips
Catalog with categories, search, deals and reviews (1 per user per product) + favorites
Description
The classic neighborhood store, now online. The neighbor browses the catalog by category (Pantry, Bakery, Fruit & Veg, Home) with search, deals, last units and sorting by price, novelty or rating; adds to the cart (persistent per user, quantities clamped 1..stock) and checks out with address and simulated payment. The order enters a real transactional cycle: on confirmation, stock is held for 15 minutes with server-calculated expiresAt, a sweeper (30 s) cancels expired pending orders and releases stock, the double-sell lock (FOR UPDATE + 409 with per-item detail) prevents overselling, and payment generates an invoice with downloadable/printable QR SVG + simulated email (EmailLog table). Order states advance in real time (Reserved → Paid → Preparing → Shipped → Delivered) and the customer sees them instantly with a timeline; pending or paid orders can be cancelled with stock release. The shopkeeper (admin role) runs the counter: incoming orders with state changes, real KPIs (orders today, paid revenue, active holds, low stock) and SVG charts of daily sales (14 days, axes, dates and tooltips) and top products. Reviews (1 per user per product) and favorites. Login with email or username, persistent JWT. Angular 22 + NestJS 11 + SQLite.
Technologies used
Angular
TypeScript
SQLite