<aside>

Contenido

  1. Introducción
  2. Stack tecnológico
  3. Arquitectura de Software
  4. Esquema / Diseño de Base de Datos
  5. Integración RabbitMQ
  6. ms-clientes → Microservicio (Cliente, Persona)
  7. ms-cuentas → Microservicio (Cuenta, Movimientos)
  8. Comunicación entre microservicios
  9. Seguridad
  10. Pruebas unitarias
  11. Pruebas de integración
  12. Buenas prácticas de desarrollo
  13. Documentación API
  14. Despliegue en Docker
  15. CI/CD → AWS EC2
  16. Probar solución

</aside>

<aside>

API REST

Ambos microservicios exponen APIs REST con versionado /api/v1/ y documentación interactiva con Swagger OpenAPI.

Se incluyé el archivo Devsu-Prueba-Tecnica.postman_collection.json

El endpoint más relevante:

GET /api/v1/reportes?clienteId={uuid}&fechaInicio=2026-03-01&fechaFin=2026-03-14

**Response body:

{
    "cliente": "Araceli Arreguin Chavez",
    "fechaInicio": "01/03/2026",
    "fechaFin": "31/03/2026",
    "totalMovimientos": 5,
    "resumenGeneral": {
        "totalDepositos": 800.00,
        "totalRetiros": 1200.00,
        "cantidadDepositos": 2,
        "cantidadRetiros": 3
    },
    "cuentas": [
        {
            "numeroCuenta": "888777",
            "tipoCuenta": "CORRIENTE",
            "saldoInicial": 2000.00,
            "saldoDisponible": 1600.00,
            "estado": true,
            "totalMovimientos": 5,
            "resumen": {
                "totalDepositos": 800.00,
                "totalRetiros": 1200.00,
                "cantidadDepositos": 2,
                "cantidadRetiros": 3
            },
            "movimientos": [
                {
                    "fecha": "16/03/2026 08:34:08",
                    "tipoMovimiento": "RETIRO",
                    "movimiento": -400.00,
                    "saldoDisponible": 1600.00
                },
                {
                    "fecha": "16/03/2026 08:34:08",
                    "tipoMovimiento": "DEPOSITO",
                    "movimiento": 300.00,
                    "saldoDisponible": 2000.00
                },
                {
                    "fecha": "16/03/2026 08:32:11",
                    "tipoMovimiento": "RETIRO",
                    "movimiento": -300.00,
                    "saldoDisponible": 1700.00
                },
                {
                    "fecha": "16/03/2026 08:32:11",
                    "tipoMovimiento": "DEPOSITO",
                    "movimiento": 500.00,
                    "saldoDisponible": 2000.00
                },
                {
                    "fecha": "16/03/2026 08:31:15",
                    "tipoMovimiento": "RETIRO",
                    "movimiento": -500.00,
                    "saldoDisponible": 1500.00
                }
            ]
        },
        {
            "numeroCuenta": "888999",
            "tipoCuenta": "AHORROS",
            "saldoInicial": 7000.00,
            "saldoDisponible": 7000.00,
            "estado": true,
            "totalMovimientos": 0,
            "resumen": {
                "totalDepositos": 0,
                "totalRetiros": 0,
                "cantidadDepositos": 0,
                "cantidadRetiros": 0
            },
            "movimientos": []
        }
    ]
}**

Respuestas de error estandarizadas

Todos los errores siguen la misma estructura JSON mediante GlobalExceptionHandler:

{
  "timestamp": "14/03/2026 15:30:45",
  "status": 400,
  "error": "Bad Request",
  "message": "Saldo no disponible",
  "path": "/api/v1/movimientos"
}

</aside>