Colmado
Características principales
Checkout transaccional: retención de stock 15 min con expiresAt en servidor, sweeper cada 30 s y bloqueo de doble venta (409 con detalle por ítem)
Comprobante fuera de la web: factura con QR SVG descargable e imprimible + email simulado al pagar
Pedidos con máquina de estados Reservado → Pagado → Preparando → Enviado → Entregado, línea de tiempo en vivo y cancelación con liberación de stock
Totales siempre calculados en el servidor: carrito (subtotal + envío), order.totalCents == Σ líneas, stock lista == detalle
Panel de tendero con KPIs reales y gráficos SVG de ventas por día y top productos con ejes, fechas y tooltips
Catálogo con categorías, búsqueda, ofertas y reseñas (1 por usuario y producto) + favoritos
Descripción
La tienda de barrio de toda la vida, online. El vecino explora el catálogo por categorías (Despensa, Panadería, Frutería, Hogar) con búsqueda, ofertas, últimas unidades y orden por precio, novedad o valoración; añade al carrito (persistente por usuario, cantidades con clamp 1..stock) y hace checkout con dirección y pago simulado. El pedido entra en un ciclo transaccional real: al confirmar, el stock queda retenido 15 minutos con expiresAt calculado EN SERVIDOR, un sweeper (30 s) cancela los pendientes vencidos y libera el stock, el bloqueo de doble venta (FOR UPDATE + 409 con detalle por ítem) impide vender más de lo disponible, y al pagar se genera factura con QR SVG descargable e imprimible + email simulado (tabla EmailLog). Los estados del pedido avanzan en tiempo real (Reservado → Pagado → Preparando → Enviado → Entregado) y el cliente los ve al instante con línea de tiempo; puede cancelar pendiente o pagado con liberación de stock. El tendero (rol admin) gestiona el mostrador: pedidos entrantes con cambio de estado, KPIs reales (pedidos hoy, ingresos pagados, retenciones activas, stock bajo) y gráficos SVG de ventas por día (14 días, ejes, fechas y tooltips) y top productos. Reseñas (1 por usuario y producto) y favoritos. Login con email o usuario, JWT persistente. Angular 22 + NestJS 11 + SQLite.
Tecnologías utilizadas
Angular
TypeScript
SQLite