Transaction Module: App de Escritorio para Transferencias
Proyecto de gestión de transferencias bancarias con JavaFX, arquitectura hexagonal y metodologías ágiles Scrum por el Equipo Lagartijas.
Jala University — Capstone Cohort 6 | ES.CO.CSSD-125.GA.T1.26.M2
Transaction Module
Aplicación de Escritorio para Transferencias Bancarias
Equipo Scrum: Lagartijas
Alexis Frene (SM) · Samuel Achi · Jonathan Ruviño · Leonardo Santucho · Karem Huacota (PO)
Junio 2026
Ciclo de Vida de Desarrollo de Software (SDLC)
Marco estructurado de fases que guía la creación, entrega y mantenimiento de software con calidad y trazabilidad.
Requisitos
Relevamiento y análisis de necesidades
Diseño
Arquitectura, casos de uso, modelos
Desarrollo
Codificación iterativa en sprints
Pruebas
JUnit 5, Mockito, JaCoCo
Despliegue
JAR empaquetado vía GitLab CI
Mantenimiento
Backlog refinado, mejoras continuas
Scrum organiza cada fase en sprints semanales sobre el ciclo SDLC.
¿Qué es Transaction Module?
Problema que resuelve
Falta de una interfaz de escritorio unificada para gestionar transferencias bancarias
Procesos manuales propensos a errores sin validación automática
Solución
App JavaFX que centraliza transferencias propias, a terceros y otros bancos
Generación de QR y comprobantes PDF en tiempo real
Cuenta
Origen y destino de fondos
Beneficiario
Destinatario registrado y validado
Transacción
Operación atómica ACID con trazabilidad
Código QR
Transferencia rápida sin datos manuales
Cliente bancario que opera desde escritorio
4P's del Módulo
Personas
<li style="margin-bottom: 12px; padding-left: 5px;"><span style="color: #4A4A4A;"><strong style="color: #1B4332;">Cliente bancario</strong> (usuario final)</span></li> <li style="margin-bottom: 12px; padding-left: 5px;"><span style="color: #4A4A4A;"><strong style="color: #1B4332;">Sistema bancario externo</strong> (integración)</span></li> <li style="margin-bottom: 12px; padding-left: 5px;"><span style="color: #4A4A4A;"><strong style="color: #1B4332;">Desarrolladores</strong> (Equipo Lagartijas)</span></li> <li style="margin-bottom: 12px; padding-left: 5px;"><span style="color: #4A4A4A;"><strong style="color: #1B4332;">Product Owner:</strong> Karem Huacota</span></li> <li style="margin-bottom: 12px; padding-left: 5px;"><span style="color: #4A4A4A;"><strong style="color: #1B4332;">Stakeholders académicos</strong></span></li>
Producto
<li style="margin-bottom: 12px; padding-left: 5px;"><span style="color: #4A4A4A;"><strong style="color: #1B4332;">Transferencias:</strong> propias, terceros, otros bancos</span></li> <li style="margin-bottom: 12px; padding-left: 5px;"><span style="color: #4A4A4A;"><strong style="color: #1B4332;">Generación</strong> de QR y comprobantes PDF</span></li> <li style="margin-bottom: 12px; padding-left: 5px;"><span style="color: #4A4A4A;"><strong style="color: #1B4332;">Historial</strong> de transacciones filtrable</span></li> <li style="margin-bottom: 12px; padding-left: 5px;"><span style="color: #4A4A4A;"><strong style="color: #1B4332;">Atributos:</strong> seguridad, confiabilidad, disponibilidad, usabilidad</span></li>
Proceso
<li style="margin-bottom: 12px; padding-left: 5px;"><span style="color: #4A4A4A;"><strong style="color: #1B4332;">Marco Scrum</strong>, sprints semanales</span></li> <li style="margin-bottom: 12px; padding-left: 5px;"><span style="color: #4A4A4A;"><strong style="color: #1B4332;">Ceremonias:</strong> Planning (lun), Daily, Review (jue), Retro (vie)</span></li> <li style="margin-bottom: 12px; padding-left: 5px;"><span style="color: #4A4A4A;"><strong style="color: #1B4332;">Merge Requests obligatorios</strong> con code review</span></li> <li style="margin-bottom: 12px; padding-left: 5px;"><span style="color: #4A4A4A;"><strong style="color: #1B4332;">Ramas</strong> feature/US-XX por historia de usuario</span></li>
Proyecto
<li style="margin-bottom: 12px; padding-left: 5px;"><span style="color: #4A4A4A;"><strong style="color: #1B4332;">Objetivo:</strong> módulo entregable en v1.0.0</span></li> <li style="margin-bottom: 12px; padding-left: 5px;"><span style="color: #4A4A4A;"><strong style="color: #1B4332;">Alcance:</strong> 6 épicas, 9 semanas</span></li> <li style="margin-bottom: 12px; padding-left: 5px;"><span style="color: #4A4A4A;"><strong style="color: #1B4332;">Stack:</strong> Java 17, Maven, MySQL, GitLab CI</span></li> <li style="margin-bottom: 12px; padding-left: 5px;"><span style="color: #4A4A4A;"><strong style="color: #1B4332;">Entregables:</strong> JAR, wiki, pipeline CI verde</span></li>
Requerimientos del Módulo
Arquitectura del Sistema
Funcionales
REQ-1:
Gestión de beneficiarios (crear, editar, eliminar)
REQ-2:
Transferencias propias, a terceros y otros bancos
REQ-3:
Historial filtrable por fecha, tipo y estado
REQ-4:
Generación y lectura de códigos QR
REQ-5:
Restricciones de montos y límites por operación
REQ-6:
Seguridad: autenticación y autorización de usuario
No Funcionales
REQ-7:
Rendimiento — respuesta < 1.5 segundos por operación
REQ-8:
Disponibilidad — 99.99 % de uptime del sistema
REQ-9:
Integridad — transacciones ACID en MySQL 8.0
REQ-10:
Usabilidad — interfaz intuitiva con JavaFX + AtlantaFX
NOTA
Stack técnico garantiza REQ-7 a REQ-10 desde el diseño.
Casos de Uso (CU)
Actor principal: Cliente Bancario (salvo CU-01)
CU-01
Seguridad
Sistema / Usuario
Autenticar y autorizar acceso
Credenciales inválidas → bloqueo
CU-02
Beneficiarios
Cliente
Registrar, editar y eliminar destinatarios
CBU duplicado → aviso de error
CU-03
Transferencia
Cliente
Ejecutar transferencia con confirmación
Saldo insuficiente → rechazo con mensaje
CU-04
Historial
Cliente
Consultar y filtrar transacciones
Sin resultados → mensaje informativo
CU-05
Código QR
Cliente
Generar QR para transferencia rápida
QR expirado → regenerar
CU-06
Restricciones
Sistema
Validar límites y bloqueos de monto
Límite superado → rechazo automático
Hoja de Ruta — 9 Semanas
Backlog v1 aprobado
Arquitectura definida
Pipeline verde
Demo Sprint 1
Demo Sprint 2
Demo Sprint 3
Demo Sprint 4–5
v1.0.0 Release
S1 – S2
Relevamiento de requisitos y backlog inicial
S3
Refinamiento de backlog y diseño técnico
S4: Sprint 0
Setup, CI/CD, módulo commons
S5: Sprint 1
Épica Beneficiarios (13 pts)
S6: Sprint 2
Transferencias propias y terceros
S7: Sprint 3
Transferencias otros bancos + QR
S8: Sprint 4–5
Historial, comprobantes, seguridad
S9
Pruebas finales, corrección bugs, entrega
Fase de Planificación
Fase de Desarrollo
Pruebas & Release
Backlog del Producto
Épicas: Beneficiarios · Transferencias · Historial · QR · Restricciones · Seguridad
Total work items: 78+
Puntos confirmados: ~70 pts
Proyecto de Título — Scrum Team
Backlog del Sprint
Sprint 1: 21–24 Abril 2026
Completar la Épica #43 — Gestión de Beneficiarios
Historia
Puntos
Responsable
#47 Crear beneficiario
5 pts
@leoSan2024
#46 Validación de datos
2 pts
@leoSan2024
#44 Ver lista beneficiarios
3 pts
@alexis-frene
#48 Eliminar beneficiario
1 pt
@JonathanR6
#45 Editar beneficiario
2 pts
@SamuelIsaacAchiSerrudo
Total Sprint 1: 13 pts
Reforzar manejo de ramas Git
Refinar historias antes del sprint
Identificar dependencias bloqueantes
Cierre formal el viernes
Sprints 2–5 (resumen)
Sprint 2
Transferencias propias y a terceros
Sprint 3
Transferencia a otros bancos + QR
Sprint 4
Historial + comprobantes PDF
Sprint 5
Seguridad, validaciones, correcciones
Refinamiento del Backlog del Producto
JALA UNIVERSITY — ESTÁNDARES Y PROCEDIMIENTOS
Flujo de Trabajo — Gitflow
Crear rama desde <span style="font-family: monospace; background: rgba(0,0,0,0.05); padding: 2px 6px; border-radius: 4px; font-weight: 600;">develop</span>: <strong style="color: #2D6A4F;">feature/US-XX-nombre</strong>
Commits pequeños y descriptivos
Push al repositorio GitLab
Abrir Merge Request con descripción
Code review por al menos 1 compañero
Squash & merge aprobado
Eliminar rama fusionada
Prohibido hacer push directo a main
trazabilidad total por historia de usuario y reducción de conflictos
Wiki y Arquitectura del Sistema
Wiki GitLab
Documentación centralizada del proyecto
Home
4P's del módulo
Casos de uso (CU-01 a CU-06)
Épicas y REQ-1 a REQ-6
Scrum Meetings por sprint
Documentación del módulo
Uploads de imágenes y diagramas
C4 Model: docs/c4/*.puml
Context diagram
Container diagram
Component diagram
Arquitectura Monolítica Modular
Un solo proceso Java (.jar), módulos lógicos internos
Aplicación Desktop (.jar)
Presentation Layer
(JavaFX / FXML)
Application Layer
(Use Cases)
Domain Layer
(Entities, Value Objects)
Infrastructure Layer
(JPA, MySQL, ZXing, PDF)
Comparte BD MySQL y JVM
Sin red entre módulos
≠ Microservicios
No hay servicios independientes ni comunicación HTTP entre módulos
Dependencia commons-module
(Account, User, Bank) publicado como paquete Maven GitLab
Patrones de Diseño
Hexagonal (Ports & Adapters)
Dominio aislado de la infraestructura — fácil de testear y reemplazar adaptadores
Value Object (DDD) + Inmutabilidad
@Value de Lombok: clase inmutable, sin setters
add/subtract/negate validan misma divisa
IllegalArgumentException si se mezclan divisas
Modelo expresivo — evita estados inválidos
Pruebas Unitarias
MoneyTest — JUnit 5
9 casos de prueba | Patrón AAA
<span style="color: #D4AF37;">@Test</span> <span style="color: #8CD025;">void</span> add_sameCurrency_returnsSum() { <span style="color: #888888;">// Arrange</span> Money a = <span style="color: #D4AF37;">new</span> Money(<span style="color: #D4AF37;">new</span> BigDecimal(<span style="color: #E6DB74;">"100"</span>), USD); Money b = <span style="color: #D4AF37;">new</span> Money(<span style="color: #D4AF37;">new</span> BigDecimal(<span style="color: #E6DB74;">"50"</span>), USD); <span style="color: #888888;">// Act</span> Money result = a.add(b); <span style="color: #888888;">// Assert</span> assertEquals(<span style="color: #D4AF37;">new</span> BigDecimal(<span style="color: #E6DB74;">"150"</span>), result.getAmount()); }
<li style="font-size: 19px; color: #333333; display: flex; align-items: flex-start; gap: 15px; font-weight: 500;"><div style="width: 10px; height: 10px; background-color: #1B4332; border-radius: 50%; margin-top: 6px; flex-shrink: 0;"></div>add / subtract con misma moneda</li> <li style="font-size: 19px; color: #333333; display: flex; align-items: flex-start; gap: 15px; font-weight: 500;"><div style="width: 10px; height: 10px; background-color: #1B4332; border-radius: 50%; margin-top: 6px; flex-shrink: 0;"></div>negate con positivo y negativo</li> <li style="font-size: 19px; color: #333333; display: flex; align-items: flex-start; gap: 15px; font-weight: 500;"><div style="width: 10px; height: 10px; background-color: #1B4332; border-radius: 50%; margin-top: 6px; flex-shrink: 0;"></div>suma con cero — resultado idéntico</li> <li style="font-size: 19px; color: #333333; display: flex; align-items: flex-start; gap: 15px; font-weight: 500;"><div style="width: 10px; height: 10px; background-color: #1B4332; border-radius: 50%; margin-top: 6px; flex-shrink: 0;"></div>subtract con resultado negativo</li> <li style="font-size: 19px; color: #333333; display: flex; align-items: flex-start; gap: 15px; font-weight: 500;"><div style="width: 10px; height: 10px; background-color: #1B4332; border-radius: 50%; margin-top: 6px; flex-shrink: 0;"></div>add con distinta moneda → <span style="color: #D4AF37; font-family: 'Fira Code', monospace; font-size: 17px; line-height: 1.5; padding: 0 6px; background: rgba(212, 175, 55, 0.1); border-radius: 4px;">IllegalArgumentException</span></li>
GenerateQrUseCaseImplTest — JUnit 5 + Mockito
@Mock de QrGeneratorPort | Stub + Assert
<span style="color: #D4AF37;">@Mock</span> QrGeneratorPort qrPort; <span style="color: #D4AF37;">@BeforeEach</span> <span style="color: #8CD025;">void</span> setUp() { openMocks(<span style="color: #D4AF37;">this</span>); } <span style="color: #D4AF37;">@Test</span> <span style="color: #8CD025;">void</span> generate_validRequest_returnsQrData() { when(qrPort.generate(any())) .thenReturn(<span style="color: #D4AF37;">new</span> <span style="color: #8CD025;">byte</span>[]{1,2,3}); QrResult result = useCase.execute(request); assertNotNull(result.getQrId()); assertArrayEquals(<span style="color: #D4AF37;">new</span> <span style="color: #8CD025;">byte</span>[]{1,2,3}, result.getQrBytes()); }
<li style="font-size: 19px; color: #333333; display: flex; align-items: center; gap: 15px; font-weight: 500;"><div style="width: 10px; height: 10px; background-color: #1B4332; border-radius: 50%; flex-shrink: 0;"></div><span style="font-family: 'Fira Code', monospace; font-size: 17px; color: #1B4332; background: rgba(27, 67, 50, 0.08); padding: 2px 6px; border-radius: 4px;">assertNotNull</span> sobre qrId generado</li> <li style="font-size: 19px; color: #333333; display: flex; align-items: center; gap: 15px; font-weight: 500;"><div style="width: 10px; height: 10px; background-color: #1B4332; border-radius: 50%; flex-shrink: 0;"></div><span style="font-family: 'Fira Code', monospace; font-size: 17px; color: #1B4332; background: rgba(27, 67, 50, 0.08); padding: 2px 6px; border-radius: 4px;">assertEquals</span> sobre campos propagados</li> <li style="font-size: 19px; color: #333333; display: flex; align-items: center; gap: 15px; font-weight: 500;"><div style="width: 10px; height: 10px; background-color: #1B4332; border-radius: 50%; flex-shrink: 0;"></div><span style="font-family: 'Fira Code', monospace; font-size: 17px; color: #1B4332; background: rgba(27, 67, 50, 0.08); padding: 2px 6px; border-radius: 4px;">assertArrayEquals</span> sobre bytes del QR</li>
Cobertura medida con JaCoCo — reportes publicados en GitLab CI
CI/CD — Pipeline GitLab
Imagen: maven:3.9.6-eclipse-temurin-17 | Cache: .m2/repository por rama
BUILD
build-job
mvn clean compile
target/classes/
LINT
lint-job
mvn checkstyle:check
allow_failure: true
TEST
test-job
mvn test
target/surefire-reports/*.xml (JUnit XML publicados en GitLab)
PACKAGE
package-job
mvn package -DskipTests
transaction-module-${CI_COMMIT_SHORT_SHA}.jar
expire_in: 1 month
Cierre y Conclusiones
Logros del Proyecto
6 épicas completadas en 9 semanas
Sprint 1 entregado: 13 pts, Épica Beneficiarios
78+ work items gestionados en backlog
Módulo entregable en versión v1.0.0
Pipeline CI en verde (build, lint, test, package)
Cobertura de pruebas medida con JaCoCo
Arquitectura hexagonal con Value Objects DDD
Wiki GitLab documentada con C4 y ceremonias
Trabajo Futuro
Notificaciones SMS y push para transferencias
Paginación y filtros avanzados en historial
Pago con QR mediante cámara nativa
Escaneo QR embebido en la aplicación
Panel administrativo de restricciones
Integración con más bancos externos
Gracias — Equipo Lagartijas | Repositorio: GitLab | Wiki: GitLab Pages
Alexis Frene · Samuel Achi · Jonathan Ruviño · Leonardo Santucho · Karem Huacota
¿Preguntas?
- java
- javafx
- arquitectura-hexagonal
- banca
- scrum
- desarrollo-de-software
- testing