← Volver a Mis Proyectos

Split It

Java CleanCode BillSplitter Algorithms RestaurantTech
📢 Nota informativa: Este desarrollo está finalizado en su versión inicial (MVP), pero sigue sujeto a actualizaciones y mejoras continuas (ver hoja de ruta).
Ver en GitHub Ver Tests JUnit
💡

¿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.

SplitIt.java
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:

1. Captura & Sanitización

LectorConsola.java

Validación de tipos, rangos positivos y manejo robusto de excepciones ante entradas no numéricas.

2. Motor Financiero

Ticket.java (BigDecimal)

Cálculo de impuestos (IVA/IGIC) y porcentajes de propina sin pérdida de precisión de punto flotante.

3. Balanceo de Céntimos

Penny Distribution

Algoritmo compensador que asigna el remanente (+0.01 €) asegurando que el total cuadre al milímetro.

4. Suite de Cobertura

TicketTest.java

Tests JUnit 5 para escenarios extremos: divisiones periódicas, 1 a 200 comensales y propinas límite.

S

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.

T

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.

A

Acción

Diseñé e implementé una arquitectura orientada a objetos en Java con las siguientes características clave:

  1. Tipado financiero preciso: Sustituí los tipos primitivos flotantes genéricos (como double) por BigDecimal con escala 2 y modos de redondeo explícitos (RoundingMode.HALF_UP y RoundingMode.DOWN), eliminando cualquier error de precisión aritmética en el cálculo de impuestos y propinas.
  2. 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.
  3. 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.

R

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.