Made byBobr AI

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.

#java#javafx#arquitectura-hexagonal#banca#scrum#desarrollo-de-software#testing
Watch
Pitch
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
Made byBobr AI

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.
1
Requisitos
Relevamiento y análisis de necesidades
2
Diseño
Arquitectura, casos de uso, modelos
3
Desarrollo
Codificación iterativa en sprints
4
Pruebas
JUnit 5, Mockito, JaCoCo
5
Despliegue
JAR empaquetado vía GitLab CI
6
Mantenimiento
Backlog refinado, mejoras continuas
¿Por qué aplica? Scrum organiza cada fase en sprints semanales sobre el ciclo SDLC.
Made byBobr AI

¿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
Público objetivo:Cliente bancario que opera desde escritorio
Made byBobr AI
Transaction Module Framework

4P's del Módulo

1

Personas

  • Cliente bancario (usuario final)
  • Sistema bancario externo (integración)
  • Desarrolladores (Equipo Lagartijas)
  • Product Owner: Karem Huacota
  • Stakeholders académicos
2

Producto

  • Transferencias: propias, terceros, otros bancos
  • Generación de QR y comprobantes PDF
  • Historial de transacciones filtrable
  • Atributos: seguridad, confiabilidad, disponibilidad, usabilidad
3

Proceso

  • Marco Scrum, sprints semanales
  • Ceremonias: Planning (lun), Daily, Review (jue), Retro (vie)
  • Merge Requests obligatorios con code review
  • Ramas feature/US-XX por historia de usuario
4

Proyecto

  • Objetivo: módulo entregable en v1.0.0
  • Alcance: 6 épicas, 9 semanas
  • Stack: Java 17, Maven, MySQL, GitLab CI
  • Entregables: JAR, wiki, pipeline CI verde
Made byBobr AI
Arquitectura del Sistema

Requerimientos del Módulo

Funcionales
1
REQ-1: Gestión de beneficiarios (crear, editar, eliminar)
2
REQ-2: Transferencias propias, a terceros y otros bancos
3
REQ-3: Historial filtrable por fecha, tipo y estado
4
REQ-4: Generación y lectura de códigos QR
5
REQ-5: Restricciones de montos y límites por operación
6
REQ-6: Seguridad: autenticación y autorización de usuario
No Funcionales
7
REQ-7: Rendimiento — respuesta < 1.5 segundos por operación
8
REQ-8: Disponibilidad — 99.99 % de uptime del sistema
9
REQ-9: Integridad — transacciones ACID en MySQL 8.0
10
REQ-10: Usabilidad — interfaz intuitiva con JavaFX + AtlantaFX
NOTA
Stack técnico garantiza REQ-7 a REQ-10 desde el diseño.
Made byBobr AI

Casos de Uso (CU)

Actor principal: Cliente Bancario (salvo CU-01)

CU-01

Seguridad

Actor: Sistema / Usuario
Objetivo: Autenticar y autorizar acceso
Flujo Alt: Credenciales inválidas → bloqueo
CU-02

Beneficiarios

Actor: Cliente
Objetivo: Registrar, editar y eliminar destinatarios
Flujo Alt: CBU duplicado → aviso de error
CU-03

Transferencia

Actor: Cliente
Objetivo: Ejecutar transferencia con confirmación
Flujo Alt: Saldo insuficiente → rechazo con mensaje
CU-04

Historial

Actor: Cliente
Objetivo: Consultar y filtrar transacciones
Flujo Alt: Sin resultados → mensaje informativo
CU-05

Código QR

Actor: Cliente
Objetivo: Generar QR para transferencia rápida
Flujo Alt: QR expirado → regenerar
CU-06

Restricciones

Actor: Sistema
Objetivo: Validar límites y bloqueos de monto
Flujo Alt: Límite superado → rechazo automático
Made byBobr AI

Hoja de Ruta — 9 Semanas

Hito
Backlog v1 aprobado
Hito
Arquitectura definida
Hito
Pipeline verde
Hito
Demo Sprint 1
Hito
Demo Sprint 2
Hito
Demo Sprint 3
Hito
Demo Sprint 4–5
Hito
v1.0.0 Release
1
2
3
4
5
6
7
8
9
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
Made byBobr AI

Backlog del Producto

Épicas: Beneficiarios · Transferencias · Historial · QR · Restricciones · Seguridad

ID Título Prioridad Pts Épica
#44 Ver lista beneficiarios Must 3 Beneficiarios
#45 Editar beneficiario Should 2 Beneficiarios
#46 Validación de datos Must 2 Beneficiarios
#47 Crear beneficiario Must 5 Beneficiarios
#48 Eliminar beneficiario Must 1 Beneficiarios
#50 Ver detalle de cuenta Should 1 Beneficiarios
#52 Buscar beneficiario Should 3 Beneficiarios
#12 Transferencia propia Must 3 Transferencias
#19 Transferencia a tercero Must 3 Transferencias
#21 Confirmar transacción Must 3 Transferencias
#23 Reintentar fallo Should 3 Transferencias
ID Título Prioridad Pts Épica
#27 Ingresar monto Must 3 Transferencias
#28 Seleccionar cuenta origen Must 3 Transferencias
#30 Comprobante PDF Should 3 Comprobantes
#31 Historial de transacciones Must 3 Historial
#33 Transferencia otros bancos Must 8 Transferencias
#35 Generación de QR Must - QR
#36 Lectura de QR Should 3 QR
#38 Validar límites Must 3 Restricciones
#66 Seguridad autenticación Must 3 Seguridad
#70 Panel de restricciones Could 2 Restricciones
#73-78 Items adicionales S / C - Historial / QR
Total work items: 78+
Puntos confirmados: ~70 pts
Made byBobr AI
Proyecto de Título — Scrum Team
Backlog del Sprint

Sprint 1: 21–24 Abril 2026

Sprint Goal
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
!
Retrospectiva del Sprint
  • 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
Made byBobr AI

Refinamiento del Backlog del Producto

Definición de
Preparado (Ready)

Listas y selects poblados con datos reales
Campos con tipo de dato correcto
Botón "Volver/Cancelar" presente
Criterios de validación aprobados por PO
Sin bloqueantes técnicos identificados

Definición de
Terminado (Done)

Código revisado por al menos 1 compañero
Criterios de aceptación cumplidos
Mensajes de UI claros y sin hardcodeos
Modal de confirmación donde aplica
Migración SQL creada y ejecutada
Pruebas ejecutadas; demo en Sprint Review

Criterios de Aceptación
(ejemplos)

US-027 Monto
Solo numérico, >0, ≤ saldo
US-021 Confirmar
Resumen completo + código de transacción + saldos antes/después
US-023 Reintentar
Máx. 3 intentos; bloqueo + sugerencia de soporte al 3.er fallo
Estimaciones con Planning Pokerescala Fibonacci: 1, 2, 3, 5, 8 Historia > 5 pts → dividir (Ejemplo: #33 = 8 pts.)
Made byBobr AI
JALA UNIVERSITY — ESTÁNDARES Y PROCEDIMIENTOS

Flujo de Trabajo — Gitflow

Modelo de Ramas
TIEMPO / FLUJO main PROTEGIDA — solo merge desde release o hotfix hotfix/ release/ develop feature/US-XX-nombre
Pasos del Ciclo de Vida
1
Crear rama desde develop: feature/US-XX-nombre
2
Commits pequeños y descriptivos
3
Push al repositorio GitLab
4
Abrir Merge Request con descripción
5
Code review por al menos 1 compañero
6
Squash & merge aprobado
7
Eliminar rama fusionada
!
Prohibido hacer push directo a main
BENEFICIO: trazabilidad total por historia de usuario y reducción de conflictos
Made byBobr AI

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

Module
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
Made byBobr AI

Patrones de Diseño

Hexagonal (Ports & Adapters)

Adapters (Infraestructura)
QrGeneratorAdapter (ZXing)
inyectado vía TransactionBeanConfig
Ports (Interfaces)
GenerateQrUseCase
(entrada)
QrGeneratorPort
(salida)
Domain
GenerateQrUseCaseImpl
Adapter Port UseCase
Dominio aislado de la infraestructura — fácil de testear y reemplazar adaptadores

Value Object (DDD) + Inmutabilidad

@Value  // Lombok
public class Money {
  BigDecimal amount;
  Currency currency;
  
  public Money add(Money other) {
    validate(other); // misma moneda
    return new Money(amount.add(other.amount), currency);
  }
}
@Value de Lombok: clase inmutable, sin setters
add/subtract/negate validan misma divisa
IllegalArgumentException si se mezclan divisas
Modelo expresivo — evita estados inválidos
Made byBobr AI

Pruebas Unitarias

MoneyTest — JUnit 5
9 casos de prueba | Patrón AAA
@Test
void add_sameCurrency_returnsSum() {
  // Arrange
  Money a = new Money(new BigDecimal("100"), USD);
  Money b = new Money(new BigDecimal("50"), USD);
  // Act
  Money result = a.add(b);
  // Assert
  assertEquals(new BigDecimal("150"), result.getAmount());
}
  • add / subtract con misma moneda
  • negate con positivo y negativo
  • suma con cero — resultado identico
  • subtract con resultado negativo
  • add con distinta moneda: IllegalArgumentException
GenerateQrUseCaseImplTest — JUnit 5 + Mockito
@Mock de QrGeneratorPort | Stub + Assert
@Mock QrGeneratorPort qrPort;

@BeforeEach
void setUp() { openMocks(this); }

@Test
void generate_validRequest_returnsQrData() {
  when(qrPort.generate(any()))
    .thenReturn(new byte[]{1,2,3});

  QrResult result = useCase.execute(request);

  assertNotNull(result.getQrId());
  assertArrayEquals(new byte[]{1,2,3},
                    result.getQrBytes());
}
  • assertNotNull sobre qrId generado
  • assertEquals sobre campos propagados
  • assertArrayEquals sobre bytes del QR
Cobertura medida con JaCoCo — reportes publicados en GitLab CI
Made byBobr AI

CI/CD — Pipeline GitLab

Imagen: maven:3.9.6-eclipse-temurin-17 | Cache: .m2/repository por rama

BUILD
LINT
TEST
PACKAGE
Stage
BUILD
Job:
build-job
Comando:
mvn clean compile
Artefacto:
target/classes/
Stage
LINT
Job:
lint-job
Comando:
mvn checkstyle:check
Nota:
allow_failure: true
Stage
TEST
Job:
test-job
Comando:
mvn test
Reportes:
target/surefire-reports/*.xml (JUnit XML publicados en GitLab)
Stage
PACKAGE
Job:
package-job
Comando:
mvn package -DskipTests
Artefacto:
transaction-module-${CI_COMMIT_SHORT_SHA}.jar
Retención:
expire_in: 1 month
.gitlab-ci.yml
stages: [build, lint, test, package]

build-job:
  stage: build
  script: mvn clean compile
  artifacts:
    paths: [target/classes]
Made byBobr AI

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?
Made byBobr AI
Bobr AI

DESIGNER-MADE
PRESENTATION,
GENERATED FROM
YOUR PROMPT

Create your own professional slide deck with real images, data charts, and unique design in under a minute.

Generate For Free

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) &nbsp;·&nbsp; Samuel Achi &nbsp;·&nbsp; Jonathan Ruviño &nbsp;·&nbsp; Leonardo Santucho &nbsp;·&nbsp; 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 &amp; 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?