Sistema de punto de venta desktop entregado y usado en producción por Optiver, una óptica en Medellín. Automatiza el ciclo completo de venta: carrito con control de stock en tiempo real, emisión de facturas PDF con logo institucional, y un sistema de fidelización propio con puntos escalonados por monto de compra — todo desarrollado en 2 meses durante el primer año de programación.
🚀 Impacto y Números
- Cliente real entregado: Aplicación en producción para Optiver (óptica, Medellín)
- ~3,100 LOC en 22 clases Java con 7 vistas FXML y 7 módulos funcionales
- 2 meses de desarrollo como proyecto de primer año — sin tutoriales de referencia directa
- 0 dependencias de internet: aplicación 100% offline con MySQL local
⚡ Cómo está construido
Generación programática de facturas PDF
- Apache PDFBox (bajo nivel): layout manual con
PDPageContentStream— posicionamiento de texto por coordenadas absolutas, trazado de tablas con líneas vectoriales, carga del logo desde el classpath del JAR - Conversión de monto a letras: algoritmo recursivo propio que convierte hasta 999,999,999 COP a texto en español (“doscientos cincuenta y tres mil pesos”) — problema algorítmico no trivial resuelto autónomamente
- Ruta configurable: directorio de guardado en
resources/ruta.txt, sin recompilar
Sistema de fidelización por referidos
- Escala de bonificación real: 1% en compras $180K–$300K COP, 1.5% en $300K–$700K, 2% en más de $700K
- Validaciones de integridad: el referido no puede ser el mismo cliente activo; requiere confirmación de “trabajo completo” antes de otorgar puntos; canje valida puntos disponibles vs. costo del premio en tiempo real
Arquitectura MVC con JavaFX
- Navegación SPA-style:
MainControllercarga vistas dinámicamente conFXMLLoadere inyecta contexto de usuario entre controllers — usuarios con roles distintos ven módulos distintos - Queries parametrizadas: 100% de operaciones con
PreparedStatementen 5 DAOs especializados — SQL Injection prevenido por construcción ObservableList+ListChangeListener: sincronización reactiva entre tablas y formularios sin eventos manuales
🛠️ Stack
Core: Java 17, JavaFX 17, FXML Libs: Apache PDFBox 2.x, MySQL Connector/J 8 DB: MySQL 8 (JOINs entre 4 tablas: venta, cliente, usuario, detalle) Tools: Apache Ant, NetBeans IDE Patterns: MVC, DAO (JDBC puro), Observer (JavaFX), Composition
💼 Lo que este proyecto demuestra
Este proyecto demuestra que puedo:
- ✅ Entregar software a un cliente real con requerimientos concretos de negocio — no solo una demo de portfolio
- ✅ Integrar librerías no triviales de forma autónoma (PDFBox con layout de bajo nivel)
- ✅ Implementar lógica de negocio real: escala de puntos, validaciones de integridad, control de stock
- ✅ Aplicar MVC y DAO correctamente desde etapas muy tempranas de aprendizaje
Diferenciador clave: Fue requerido, construido y entregado a un negocio que lo usó en producción. La factura PDF con la conversión de montos a texto es la evidencia más clara de que el problema se resolvió de verdad, no en un sandbox.








