Skip to content

Repository files navigation

Payments Management System

Sistema de gestión de pagos para una empresa con múltiples equipos, roles y tipos de gasto. Incluye alta, listado y consulta analítica de pagos únicos y recurrentes, autenticación con JWT, auditoría de operaciones y consultas de negocio complejas.

El proyecto está estructurado siguiendo los principios de Clean Architecture: separación de responsabilidades en capas independientes, inversión de dependencias mediante interfaces, y aislamiento del dominio respecto a la infraestructura.


Stack técnico

  • .NET 8 — plataforma
  • C# — lenguaje
  • ASP.NET Core Web API — capa de presentación REST
  • Entity Framework Core — ORM y migraciones
  • SQL Server — base de datos relacional
  • JWT Bearer — autenticación stateless
  • Swagger / OpenAPI — documentación interactiva de la API

Arquitectura

La solución está compuesta por 6 proyectos independientes, cada uno con una responsabilidad clara. Las dependencias entre capas van de fuera hacia adentro: la infraestructura y la presentación dependen del dominio, no al revés.

┌───────────────────────────────────────────────────────────┐
│                      WebApi                               │
│   Controllers REST + JWT + Swagger + Program.cs (DI)      │
└───────────────────────────────────────────────────────────┘
                          │
                          ▼
┌───────────────────────────────────────────────────────────┐
│                   LogicaAplicacion                        │
│         Implementación de Casos de Uso (CU...)            │
└───────────────────────────────────────────────────────────┘
                          │
                          ▼
┌───────────────────────────────────────────────────────────┐
│                     CasosDeUso                            │
│    Interfaces de Casos de Uso (ICU...) + DTOs             │
└───────────────────────────────────────────────────────────┘
                          │
                          ▼
┌───────────────────────────────────────────────────────────┐
│                    LogicaNegocio                          │
│   Entidades + Value Objects + Interfaces de Repositorios  │
└───────────────────────────────────────────────────────────┘
                          ▲
                          │
┌───────────────────────────────────────────────────────────┐
│                 LogicaAccesoDatos                         │
│   Repositorios EF + EmpresaContexto + Migrations          │
└───────────────────────────────────────────────────────────┘

┌───────────────────────────────────────────────────────────┐
│                 ExcepcionesPropias                        │
│    Custom exceptions consumibles desde cualquier capa     │
└───────────────────────────────────────────────────────────┘

Descripción de cada proyecto

Proyecto Responsabilidad
LogicaNegocio Núcleo del dominio: entidades, value objects, interfaces de repositorio. No depende de nada externo.
CasosDeUso Contratos (interfaces) de casos de uso y DTOs de entrada/salida.
LogicaAplicacion Implementación de los casos de uso. Orquesta entidades y repositorios.
LogicaAccesoDatos Implementación de repositorios con Entity Framework Core, contexto de BD y migraciones.
WebApi Endpoints REST, autenticación JWT, Swagger, inyección de dependencias.
ExcepcionesPropias Custom exceptions específicas del dominio.

Dominio

El sistema modela una empresa con las siguientes entidades:

Entidades principales

  • Usuario — pertenece a un equipo y tiene un rol. Contiene información de autenticación (email + password).
  • Rol — Administrador, Gerente, Empleado.
  • Equipo — Desarrollo, Ventas, Soporte, Marketing, General.
  • Pago (clase base abstracta) — tiene monto, método de pago, tipo de gasto y usuario responsable.
    • PagoUnico — pago puntual con fecha y comprobante.
    • PagoRecurrente — pago con fecha de inicio y fin de vigencia.
  • TipoGasto — categoría del gasto (Insumos, Transporte, Marketing, Servicios, etc.).
  • MetodoPago — Efectivo, Crédito, Débito, Transferencia.
  • Auditoria — registro de operaciones críticas (ALTA_PAGO, LOGIN, MOD_USUARIO, etc.).

Value Objects

  • Password — encapsula la contraseña con validaciones de dominio (longitud mínima, complejidad, etc.). Ejemplo de patrón DDD.

Herencia

Pago es una clase abstracta con dos implementaciones concretas (PagoUnico, PagoRecurrente). Se aplican estrategias de mapeo de herencia en Entity Framework (Table Per Hierarchy).


Casos de uso implementados

El sistema expone 14 casos de uso organizados por dominio funcional:

Autenticación y usuarios

  • CULoginUsuario — login con validación de credenciales, retorna JWT.
  • CUAltaUsuario — registro de nuevos usuarios.
  • CUResetPasswordUsuario — reset de contraseña.

Gestión de Tipos de Gasto (CRUD completo)

  • CUAltaTipoGasto, CUBajaTipoGasto, CUActualizarTipoGasto
  • CUListarTipoGasto, CUObtenerTipoGasto

Pagos

  • CUAltaPago — alta polimórfica de pagos únicos o recurrentes.
  • CUListarPagosDeUsuario — pagos por usuario.
  • CUListadoMensualPagos — reporte mensual consolidado.

Consultas de negocio complejas

  • CUEquiposConPagosUnicosMayorMonto — equipos cuyos pagos únicos superan un monto dado.
  • CUUsuariosConPagoUnicoMayorA — usuarios con al menos un pago único mayor a un umbral.

Auditoría

  • CUAuditoria — registro de operaciones críticas.

Endpoints REST

La API está documentada con Swagger. Al levantar el proyecto WebApi, se accede a la UI en:

https://localhost:{puerto}/swagger

Los controladores son:

  • /api/Usuario — login, alta, reset password.
  • /api/TipoGasto — CRUD de tipos de gasto.
  • /api/Pago — alta y consultas de pagos.

Todos los endpoints (excepto login) requieren autenticación JWT.


Autenticación con JWT

  • Login expone un JWT firmado con clave simétrica (HMAC).
  • Los endpoints protegidos requieren header Authorization: Bearer {token}.
  • Swagger UI está integrado con esquema de seguridad para probar endpoints protegidos directamente.

Persistencia

  • Entity Framework Core con SQL Server.
  • Code First con migrations — el esquema se genera y actualiza desde el código.
  • Repositorios genéricos — interfaz base IRepositorio<T> con métodos comunes y repositorios específicos por entidad.
  • Inyección de dependencias — todos los repositorios y casos de uso se registran como Scoped en Program.cs.

Estructura del proyecto

payments-management-system/
├── PaymentsManagementSystem.sln
├── LogicaNegocio/
│   ├── EntidadesNegocio/       # Usuario, Equipo, Rol, Pago, PagoUnico, ...
│   ├── ValueObjects/           # Password
│   ├── InterfaceEntidades/     # IValidable
│   └── InterfaceRepositorio/   # IRepositorio<T>, IRepositorioUsuario, ...
├── CasosDeUso/
│   ├── InterfaceCasosUso/      # ICUAltaPago, ICULoginUsuario, ...
│   └── DTOs/                   # PagoDTO, LoginDTO, UsuarioAltaDTO, ...
├── LogicaAplicacion/
│   └── CasosUso/               # CUAltaPago, CULoginUsuario, ...
├── LogicaAccesoDatos/
│   ├── EmpresaContexto.cs      # DbContext
│   ├── Repositorios/           # RepositorioPagoEF, RepositorioUsuarioEF, ...
│   ├── Migrations/             # Migraciones EF Core
│   └── ScriptsSQL/             # Seeds SQL alternativos
├── WebApi/
│   ├── Controllers/            # PagoWebAPIController, UsuarioController, ...
│   ├── Token/                  # ManejadorToken (JWT)
│   ├── Program.cs              # Configuración de DI, autenticación, Swagger
│   └── appsettings.json        # ConnectionString
├── ExcepcionesPropias/         # Custom exceptions
└── ScriptsSQL/
    └── 00_schema.sql

Puntos técnicos destacados

Aplicación real de SOLID

  • S (Single Responsibility): cada caso de uso hace una sola cosa.
  • O (Open/Closed): nuevos casos de uso se agregan sin modificar los existentes.
  • L (Liskov): PagoUnico y PagoRecurrente son sustituibles por Pago.
  • I (Interface Segregation): interfaces específicas para cada repositorio.
  • D (Dependency Inversion): la lógica depende de interfaces, no de implementaciones concretas.

Inyección de dependencias

Todas las dependencias se inyectan via constructor. Program.cs centraliza el registro en el contenedor de DI de ASP.NET Core.

DTOs y separación de contratos

Los DTOs mantienen la API desacoplada del modelo de dominio interno. Ninguna entidad de negocio se expone directamente a través de los endpoints.

Auditoría transversal

Las operaciones críticas se registran en la tabla Auditoria mediante el caso de uso CUAuditoria, invocado desde los demás casos de uso.


Cómo ejecutarlo

Requisitos

  • .NET 8 SDK
  • SQL Server (Express o superior)
  • Visual Studio 2022 o VS Code + C# Dev Kit

Pasos

  1. Clonar el repositorio:

    git clone https://github.com/brunodevcore/payments-management-system.git
    cd payments-management-system
  2. Ajustar la cadena de conexión en WebApi/appsettings.json según tu servidor SQL Server local.

  3. Aplicar las migraciones para generar la base de datos:

    dotnet ef database update --project LogicaAccesoDatos --startup-project WebApi
  4. (Opcional) Ejecutar los scripts de seed en LogicaAccesoDatos/ScriptsSQL/ para poblar datos de prueba.

  5. Levantar el proyecto WebApi:

    dotnet run --project WebApi
  6. Abrir Swagger en el navegador:

    https://localhost:{puerto}/swagger
    

Autor

Bruno Rivero — Desarrollador Backend Junior · Montevideo, Uruguay

About

Payments management system with Clean Architecture — .NET 8, ASP.NET Core Web API, Entity Framework, JWT, SQL Server

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Contributors

Languages