Sistema de punto de venta para terminal (TUI) construido con Bun, Ink, Zustand y Drizzle ORM.
- Gestión de ventas y tickets
- Inventario con códigos de barras
- Impresión térmica de tickets (incluye banner desde imagen)
- Reportes de ventas
- Autenticación de empleados
- Soporte para diferentes unidades (pza, kg, lt, ml, etc.)
- Interfaz CLI para importación/exportación de productos
- Bun (última versión)
- Node.js 22+
- Impresora térmica (opcional)
# Instalar dependencias
npm install
# Inicializar base de datos
bun run seedEl sistema usa SQLite como motor de base de datos (archivo pos.db), gestionado con Drizzle ORM.
| Tabla | Descripción |
|---|---|
products |
Catálogo de productos (sku, name, price, stock, etc.) |
sales |
Registro de ventas/tickets |
users |
Usuarios del sistema (username, pin, role) |
config |
Configuración del negocio |
# Agregar usuario con rol cashier (por defecto)
pos.exe add user juan 1234
# Agregar usuario admin
pos.exe add user juan 1234 --role admin| Rol | Descripción |
|---|---|
admin |
Acceso completo al sistema |
cashier |
Usuario de caja (predeterminado) |
bun run devpos.exe --help # Mostrar ayuda
pos.exe --version # Mostrar versión
pos.exe import products # Importar productos desde CSV
pos.exe export products # Exportar productos a CSV
pos.exe seed # Insertar productos de ejemplo
pos.exe add user <username> <pin> [--role] # Agregar usuario
pos.exe config get # Ver configuración
pos.exe config set <key> <value> # Actualizar configuraciónsku,name,price,cost,category,stock,barcode,unittype,unitqty,minstock
001,Producto 1,10.50,5.00,BEB,100,123456789,pza,1,10
002,Producto 2,25.00,12.00,ALI,50,987654321,kg,1,5| Campo | Requerido | Descripción |
|---|---|---|
| sku | ✅ | Código único |
| name | ✅ | Nombre del producto |
| price | ✅ | Precio de venta |
| cost | ❌ | Costo |
| category | ❌ | Categoría (default: GEN) |
| stock | ❌ | Stock inicial (default: 0) |
| minStock | ❌ | Stock mínimo (default: 5) |
| unitType | ❌ | pza, kg, g, lt, ml, m, cm (default: pza) |
| unitQty | ❌ | Cantidad por unidad |
| barcode | ❌ | Código de barras |
# Importar productos
pos.exe import products productos.csv
# Simular importación (sin guardar)
pos.exe import products productos.csv --dry-run| Tecla | Acción |
|---|---|
| Tab | Cambiar panel |
| ↑↓←→ | Navegar |
| Enter | Seleccionar/Pagar |
| 1-4 | Alternativas de navegación |
| / | Buscar productos |
| R | Ver reportes |
| L | Cerrar sesión |
| Ctrl+Q | Salir |
| Tecla | Acción |
|---|---|
| + | Aumentar cantidad |
| - | Disminuir cantidad |
| d | Eliminar item |
El sistema de impresión ya utiliza los datos del negocio desde la base de datos (nombre, RFC, dirección) y puede imprimir un banner desde assets/banner.png.
Editar config.json junto al ejecutable:
{
"printer": {
"type": "epson",
"interface": "printer:NOMBRE",
"width": 48,
"characterSet": "PC850"
},
"template": {
"header": {
"enabled": true
}
},
"options": {
"printCopies": 1,
"cut": true
}
}| Tipo | Ejemplo | Descripción |
|---|---|---|
| USB | printer:NOMBRE |
Impresora USB (Windows) |
| Red | tcp://192.168.1.100:9100 |
Impresora de red |
| Ancho | Caracteres | Tipo |
|---|---|---|
| 32 | 32 caracteres | 58mm |
| 48 | 48 caracteres | 80mm |
# Compilar executable
bun build src/app.tsx --compile --outfile pos.exeEl ejecutable pos.exe queda en el directorio del proyecto. Los comandos CLI funcionan directamente con el ejecutable.
Repositorio: https://github.com/avalontm/openpos.git
Licencia MIT - Copyright (c) 2026 avalontm
Proyecto desarrollado por AvalonTM


