Sistema de punto de venta local. Funciona sin internet. Una venta en menos de 2 segundos.
- Python 3.11 o superior
- Node.js 18 o superior
- pip (incluido con Python)
cd pyfix-pos/backend
pip install -r requirements.txt
uvicorn main:app --host 127.0.0.1 --port 8765 --reloadEl API queda disponible en: http://127.0.0.1:8765
Documentacion interactiva: http://127.0.0.1:8765/docs
En otra terminal:
cd pyfix-pos/frontend
npm install
npm run devLa UI queda disponible en: http://localhost:5173
Con backend y frontend corriendo en sus terminales, abre una tercera terminal:
cd pyfix-pos/electron
npm install
npm startElectron abre la ventana del POS. Al cerrar la ventana, el proceso Python se termina automaticamente.
- Abre http://localhost:5173/products
- Completa el formulario: Nombre, Precio, Stock inicial
- Haz click en "Guardar Producto"
- El producto aparece en la tabla
curl -X POST http://127.0.0.1:8765/api/products \
-H "Content-Type: application/json" \
-d '{"name": "Gaseosa 350ml", "price": 2500, "cost_price": 1800, "stock": 50}'- Abre http://localhost:5173 (pagina POS)
- Escribe el nombre del producto en el buscador
- Haz click en el producto para agregarlo al carrito
- Ajusta la cantidad con los botones + y -
- Haz click en "COBRAR"
- El mensaje de confirmacion muestra el ID de la venta y el total
- El stock se descuenta automaticamente
# Primero obtener el ID del producto
curl http://127.0.0.1:8765/api/products
# Luego crear la venta (reemplaza PRODUCT_ID con el id real)
curl -X POST http://127.0.0.1:8765/api/sales \
-H "Content-Type: application/json" \
-d '{"items": [{"product_id": "PRODUCT_ID", "quantity": 2}]}'pyfix-pos/
├── backend/ Backend Python (FastAPI + SQLite)
│ ├── main.py Punto de entrada FastAPI, CORS, startup
│ ├── database.py Conexion SQLite con WAL mode y PRAGMAs de velocidad
│ ├── models/ Modelos SQLAlchemy (tablas)
│ │ ├── product.py Tabla products
│ │ ├── sale.py Tabla sales
│ │ └── sale_item.py Tabla sale_items
│ ├── routers/ Endpoints REST
│ │ ├── products.py GET/POST/PUT /api/products
│ │ └── sales.py POST/GET /api/sales
│ ├── schemas/ Schemas Pydantic (validacion entrada/salida)
│ │ ├── product.py
│ │ └── sale.py
│ └── requirements.txt Dependencias Python
│
├── frontend/ UI React (Vite)
│ ├── index.html HTML base
│ ├── vite.config.js Config Vite, puerto 5173
│ ├── package.json
│ └── src/
│ ├── main.jsx Punto de entrada React
│ ├── App.jsx Router y navegacion
│ ├── components/ Componentes reutilizables
│ │ ├── ProductSearch.jsx Buscador de productos con debounce
│ │ ├── Cart.jsx Lista del carrito con +/-
│ │ ├── CheckoutButton.jsx Boton cobrar
│ │ └── ProductForm.jsx Formulario crear producto
│ ├── pages/
│ │ ├── POS.jsx Pantalla principal de venta
│ │ └── Products.jsx Gestion de productos
│ ├── services/
│ │ └── api.js Llamadas al backend (fetch)
│ └── store/
│ └── cartStore.js Estado del carrito (hook useState)
│
└── electron/ App escritorio
├── main.js Proceso principal: arranca Python, abre ventana
└── package.json
| Metodo | Endpoint | Descripcion |
|---|---|---|
| GET | /api/products?q= | Lista productos activos, filtra por nombre o barcode |
| POST | /api/products | Crear producto |
| PUT | /api/products/{id} | Actualizar producto |
| POST | /api/sales | Crear venta (descuenta stock atomicamente) |
| GET | /api/sales?date=today | Ventas del dia |
| GET | /health | Estado del servidor |
SQLite en backend/pyfix_local.db. Se crea automaticamente al iniciar el backend.
Configuracion de rendimiento aplicada:
- WAL mode: lecturas y escrituras simultaneas sin bloqueos
- cache_size 64MB: consultas frecuentes en memoria
- mmap 256MB: acceso directo a archivo sin syscalls
- synchronous=NORMAL: durabilidad sin fsync en cada escritura
- temp_store=MEMORY: tablas temporales en RAM