René Cano
Todos los proyectos

Núm. 12

Ventas e inventario

Punto de venta e inventario en Streamlit

Mi rol
Autor único
Periodo
Nov 2025

El problema

Un negocio pequeño necesita registrar ventas, saber qué tiene en existencia y entregar un ticket, sin pagar un sistema de punto de venta. Quise resolverlo con una app web sencilla sobre una base de datos real.

Qué construí

Lo hice solo, en 10 commits del 2 al 23 de noviembre de 2025.

  • Una app Streamlit con 7 módulos: panel principal, ventas, productos, compras, gastos, reportes y configuración.
  • Login con contraseñas en bcrypt, cookie de sesión firmada con expiración y 2 roles, administrador y cajero. Un modo kiosco oculta compras, gastos, reportes y configuración a quien no es administrador.
  • Ventas con carrito, IVA configurable y ticket en PDF generado con ReportLab.
  • Compras que actualizan existencias y costo (último o promedio ponderado), registro de gastos, reportes por periodo con gráficas, exportación a CSV y un respaldo en ZIP de 7 tablas.
  • Acceso a PostgreSQL con SQLAlchemy y transacciones con commit o rollback automático.

Arquitectura

Diagrama de arquitectura: el administrador o el cajero inician sesión con bcrypt y una cookie firmada; la app Streamlit muestra 7 módulos según el rol; la app lee y escribe productos, ventas, compras y gastos en PostgreSQL, genera tickets en PDF con ReportLab y exporta reportes en CSV y un respaldo en ZIP.

Resultados

No hay métricas de uso que reportar. Lo verificable es el código: los flujos de venta, compra y reporte, y el control de acceso por rol.

Límites conocidos

  • Todo vive en un solo app.py de 2,363 líneas. Separar datos, dominio e interfaz es lo primero que haría.
  • El esquema de la base se creó a mano y no está en el repositorio (init_db no hace nada), así que no se puede levantar desde cero sin reconstruirlo.
  • No hay tests.
  • El README presenta el login como opcional o en progreso, aunque ya está implementado.

Links