Split It
¿Por qué el nombre «Split It»?
El nombre Split It (del inglés "to split", dividir o repartir) fue seleccionado para otorgar al proyecto una identidad moderna y técnica. Transmite de manera inmediata su propósito funcional: la división equitativa, precisa y transparente de cuentas y facturas gastronómicas, alejándose de nombres genéricos y posicionándolo como una solución de software enfocada en negocio.
Cargando simulador de cuentas Split It Java..._
Simular Cuenta · Reiniciar — Haz clic en los botones de control inferiores para interactuar con la consola.
Pipeline de Precisión Decimal & Arqueo Cero
Flujo de ejecución desacoplado que garantiza la exactitud en el centimaje mediante tipos monetarios seguros y algoritmos de balanceo:
LectorConsola.java
Validación de tipos, rangos positivos y manejo robusto de excepciones ante entradas no numéricas.
Ticket.java (BigDecimal)
Cálculo de impuestos (IVA/IGIC) y porcentajes de propina sin pérdida de precisión de punto flotante.
Penny Distribution
Algoritmo compensador que asigna el remanente (+0.01 €) asegurando que el total cuadre al milímetro.
TicketTest.java
Tests JUnit 5 para escenarios extremos: divisiones periódicas, 1 a 200 comensales y propinas límite.
Situación
Dividir una factura de restaurante de forma justa y rápida entre varios comensales, aplicando un porcentaje de propina correcto, suele requerir cálculos manuales propensos a errores. Para el Grupo Gastronómico Rivas, el redondeo inconsistente generaba desajustes en el arqueo diario de la caja y pérdidas de tiempo en el servicio al cliente al calcular los desgloses en mesas de gran volumen.
Tarea
Crear una aplicación de consola en Java 25 ágil y precisa que capture de manera dinámica los datos de la factura, aplique los incrementos correspondientes (impuesto IGIC/IVA y propina sobre base neta) y genere un desglose limpio con un formato que imite un ticket físico real, asegurando un cuadre exacto de caja de 0.00 € sin pérdida de céntimos.
Acción
Diseñé e implementé una arquitectura orientada a objetos en Java con las siguientes características clave:
- Tipado financiero preciso: Sustituí los tipos primitivos flotantes genéricos (como
double) porBigDecimalcon escala 2 y modos de redondeo explícitos (RoundingMode.HALF_UPyRoundingMode.DOWN), eliminando cualquier error de precisión aritmética en el cálculo de impuestos y propinas. - Algoritmo de Compensación de Redondeo (Penny Distribution): Desarrollé una lógica matemática en la división que calcula el pago base redondeando hacia abajo y distribuye de forma secuencial los céntimos residuales sobrantes (+0.01 €) entre los primeros comensales, garantizando que la suma de los pagos individuales coincida exactamente con el total facturado.
- Separación de Responsabilidades y Pruebas: Modularicé el código en paquetes limpios: validación segura de entradas de consola (
LectorConsola), formateo visual del ticket corporativo (TicketImpresor) y cálculos de negocio encapsulados (Ticket). Diseñé pruebas unitarias completas con JUnit 5 (TicketTest.java) para verificar las reglas y el algoritmo de redondeo.
Resultado
Garanticé un 100% de precisión decimal y un arqueo de caja exacto (Diferencia de 0,00 €) en todas las pruebas unitarias y validaciones de ejecución de la aplicación. La solución agiliza la gestión de cobro en mesas reduciendo el tiempo de cálculo de minutos a segundos y está implementada de forma nativa sin dependencias externas para una máxima compatibilidad.
🧪 Calidad de Código & Automatización (JUnit 5)
Para garantizar la estabilidad y la precisión matemática del núcleo de cálculo de facturas, implementé un suite completo de pruebas unitarias automatizadas con JUnit 5:
- Algoritmo de Compensación de Redondeo: Verificación de que la suma de los pagos de cada comensal coincida exactamente con el total facturado, distribuyendo el céntimo sobrante de forma secuencial.
- Cálculo de Impuestos y Propinas: Validación de la aplicación estricta del IVA (21%) e IGIC (7%) y de que las propinas autorizadas (0%, 5%, 10% o 15%) se apliquen únicamente sobre el importe neto sin impuestos.
- Seguridad frente a Desbordamiento: Pruebas automáticas de límites del sistema (límites de 1 a 200 comensales y un tope de 1.000.000,00 € para la base imponible).
🏷️ ¿Por qué Split It?
El cambio de nombre responde a una evolución de diseño del software, buscando una identidad que resulte funcional y descriptiva:
- Acción inmediata: El nombre es un imperativo directo. Indica al usuario exactamente qué hace la aplicación (dividir/repartir) en el momento en que lee el título.
- Fonética memorable: Es corto (dos sílabas), fácil de pronunciar y tiene un ritmo marcado que lo hace sonar como una herramienta profesional y moderna.
- Claridad absoluta: No necesita explicación. En el ecosistema de aplicaciones, la simplicidad gana: elimina la fricción entre el usuario y la utilidad de tu programa desde el primer segundo.
🔄 Refactorización Estructurada & Autoaprendizaje
La solución inicial utilizaba un script lineal plano y tipos primitivos de coma flotante (double), que causaban pérdidas de precisión por redondeo flotante de la JVM. Refactoricé la aplicación hacia una arquitectura orientada a objetos modular para separar la captura de inputs (LectorConsola), el formateo visual (TicketImpresor) y el cálculo de negocio (Ticket). Para estructurar el algoritmo de reparto de céntimos residuales y diseñar el suite de pruebas en JUnit 5, utilicé la Inteligencia Artificial como un tutor y evaluador técnico, lo que me permitió dominar aserciones y afianzar conceptos clave de programación financiera.
🚀 Próximo Paso con Kotlin: Actualmente me encuentro inmerso en el aprendizaje de Kotlin, lenguaje con el cual tengo planificado realizar la segunda parte de este desarrollo, portando el motor de cálculo a una aplicación nativa para Android.
🗺️ Estado y Hoja de Ruta del Proyecto
Planificación estructurada y entregas incrementales para este desarrollo.
Iteración 1: Motor Secuencial & CLI Completado
Desarrollo del núcleo en Java: captura y validación estricta de datos con BigDecimal, aplicación del algoritmo de compensación de redondeo y suite de pruebas unitarias automatizadas con JUnit 5.
Iteración 2: Versión Móvil Android Siguiente Paso
Migración de la lógica secuencial a una aplicación nativa para Android (Java/Kotlin) con interfaz móvil minimalista. Esta segunda parte del proyecto se desarrollará aprovechando mi aprendizaje en curso de Kotlin para enriquecer el perfil multiplataforma.