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.
- .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
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 │
└───────────────────────────────────────────────────────────┘
| 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. |
El sistema modela una empresa con las siguientes entidades:
- 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.).
- Password — encapsula la contraseña con validaciones de dominio (longitud mínima, complejidad, etc.). Ejemplo de patrón DDD.
Pago es una clase abstracta con dos implementaciones concretas (PagoUnico, PagoRecurrente). Se aplican estrategias de mapeo de herencia en Entity Framework (Table Per Hierarchy).
El sistema expone 14 casos de uso organizados por dominio funcional:
CULoginUsuario— login con validación de credenciales, retorna JWT.CUAltaUsuario— registro de nuevos usuarios.CUResetPasswordUsuario— reset de contraseña.
CUAltaTipoGasto,CUBajaTipoGasto,CUActualizarTipoGastoCUListarTipoGasto,CUObtenerTipoGasto
CUAltaPago— alta polimórfica de pagos únicos o recurrentes.CUListarPagosDeUsuario— pagos por usuario.CUListadoMensualPagos— reporte mensual consolidado.
CUEquiposConPagosUnicosMayorMonto— equipos cuyos pagos únicos superan un monto dado.CUUsuariosConPagoUnicoMayorA— usuarios con al menos un pago único mayor a un umbral.
CUAuditoria— registro de operaciones críticas.
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.
- 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.
- 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
ScopedenProgram.cs.
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
- 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):
PagoUnicoyPagoRecurrenteson sustituibles porPago. - I (Interface Segregation): interfaces específicas para cada repositorio.
- D (Dependency Inversion): la lógica depende de interfaces, no de implementaciones concretas.
Todas las dependencias se inyectan via constructor. Program.cs centraliza el registro en el contenedor de DI de ASP.NET Core.
Los DTOs mantienen la API desacoplada del modelo de dominio interno. Ninguna entidad de negocio se expone directamente a través de los endpoints.
Las operaciones críticas se registran en la tabla Auditoria mediante el caso de uso CUAuditoria, invocado desde los demás casos de uso.
- .NET 8 SDK
- SQL Server (Express o superior)
- Visual Studio 2022 o VS Code + C# Dev Kit
-
Clonar el repositorio:
git clone https://github.com/brunodevcore/payments-management-system.git cd payments-management-system -
Ajustar la cadena de conexión en
WebApi/appsettings.jsonsegún tu servidor SQL Server local. -
Aplicar las migraciones para generar la base de datos:
dotnet ef database update --project LogicaAccesoDatos --startup-project WebApi
-
(Opcional) Ejecutar los scripts de seed en
LogicaAccesoDatos/ScriptsSQL/para poblar datos de prueba. -
Levantar el proyecto WebApi:
dotnet run --project WebApi
-
Abrir Swagger en el navegador:
https://localhost:{puerto}/swagger
Bruno Rivero — Desarrollador Backend Junior · Montevideo, Uruguay
- LinkedIn: linkedin.com/in/brunorivero-dev
- GitHub: github.com/brunodevcore
- Email: bruno.erre@outlook.com