Sistema completo de gestión financiera desarrollado en Elixir para el manejo de cuentas, monedas y transacciones. Ledger permite realizar operaciones CRUD sobre usuarios, monedas y transacciones, además de consultar balances y generar reportes.
Para iniciar el sistema en su carpeta personal usar:
make init- Características
- Requisitos
- Configuración
- Uso
- Operaciones Disponibles
- Ejemplos de Uso
- Comandos útiles (Makefile)
- Manejo de Errores
- Características de Seguridad
- ✅ Crear usuarios con validación de edad (mayores de 18 años)
- ✅ Editar nombres de usuario
- ✅ Consultar información de usuarios
- ✅ Eliminar usuarios (solo si no tienen transacciones)
- ✅ Crear monedas con precio en USD
- ✅ Actualizar precios de monedas
- ✅ Consultar información de monedas
- ✅ Eliminar monedas (solo si no han sido utilizadas)
- ✅ Alta de cuenta: Registrar una moneda en la cuenta de un usuario
- ✅ Transferencias: Transferir fondos entre cuentas
- ✅ Swaps: Intercambiar una moneda por otra
- ✅ Deshacer transacciones: Revertir la última transacción
- ✅ Consultar detalles de transacciones
- ✅ Calcular balances por cuenta y moneda
- ✅ Conversión automática entre monedas
- ✅ Listar transacciones con filtros avanzados
- ✅ Exportar resultados a CSV o mostrar en consola
- 🔒 Validación exhaustiva de datos con Ecto
- 💾 Persistencia en PostgreSQL
- 📊 Manejo de decimales precisos para cálculos financieros
- 🎨 Salida formateada en tablas ANSI para consola
- 📁 Importación/exportación de datos en CSV
- 🔄 Altas automáticas de monedas cuando es necesario
⚠️ Validación de fondos suficientes antes de transacciones- 🔙 Sistema de deshacer transacciones con validación de orden
- Elixir: 1.14 o superior
- Erlang/OTP: 24 o superior
- PostgreSQL: 14 o superior
- Docker (opcional): Para ejecutar PostgreSQL en contenedor
El proyecto usa diferentes archivos de configuración según el entorno:
- Desarrollo:
config/dev.exs - Testing:
config/test.exs - Producción:
config/runtime.exs
Edita config/dev.exs para ajustar la conexión a PostgreSQL:
config :ledger, Ledger.Repo,
username: "postgres",
password: "postgres",
hostname: "localhost",
database: "ledger_dev",
port: 5432./ledger <operación> [flags]| Flag | Descripción |
|---|---|
-id |
ID de registro |
-n |
Nombre |
-b |
Fecha de nacimiento (YYYY-MM-DD) |
./ledger crear_usuario -n=alice -b=1995-06-15./ledger editar_usuario -id=1 -n=alice_updated./ledger ver_usuario -id=1./ledger borrar_usuario -id=5| Flag | Descripción |
|---|---|
-id |
ID de registro |
-n |
Nombre |
-p |
Precio en USD |
./ledger crear_moneda -n=USD -p=1.0000
./ledger crear_moneda -n=EUR -p=1.08
./ledger crear_moneda -n=BTC -p=45000.00./ledger editar_moneda -id=1 -p=1.05./ledger ver_moneda -id=1./ledger borrar_moneda -id=5| Flag | Descripción |
|---|---|
-id |
ID de registro |
-u |
Usuario |
-o |
Cuenta origen |
-d |
Cuenta destino |
-m |
Moneda |
-mo |
Moneda origen |
-md |
Moneda destino |
-a |
Monto |
./ledger alta_cuenta -u=1 -m=1 -a=1000
# Usuario 1 da de alta la moneda 1 con 1000 unidades./ledger realizar_transferencia -o=1 -d=2 -m=1 -a=100
# Transferir 100 unidades de moneda 1 del usuario 1 al usuario 2./ledger realizar_swap -u=1 -mo=1 -md=2 -a=50
# Usuario 1 intercambia 50 unidades de moneda 1 por moneda 2./ledger ver_transaccion -id=10./ledger deshacer_transaccion -id=15| Flag | Descripción |
|---|---|
-m |
Moneda |
-c1 |
Cuenta origen |
-c2 |
Cuenta destino |
-t |
Archivo de entrada CSV |
-o |
Archivo de salida CSV |
# Balance en todas las monedas
./ledger balance -c1=alice
# Balance en USD específicamente
./ledger balance -c1=alice -m=USD
# Guardar balance en archivo CSV
./ledger balance -c1=alice -o=balance_alice.csv# Todas las transacciones de una cuenta
./ledger transacciones -c1=alice -c2=alice
# Transferencias de alice a bob
./ledger transacciones -c1=alice -c2=bob
# Transacciones en USD
./ledger transacciones -m=USD
# Desde archivo CSV
./ledger transacciones -t=data/transacciones.csv -c1=alice
# Guardar en archivo
./ledger transacciones -c1=alice -o=trans_output.csv# 1. Crear usuarios
./ledger crear_usuario -n=alice -b=1995-06-15
./ledger crear_usuario -n=bob -b=1998-03-20
./ledger crear_usuario -n=charlie -b=1992-11-10
# 2. Crear monedas
./ledger crear_moneda -n=USD -p=1.0000
./ledger crear_moneda -n=EUR -p=1.0800
./ledger crear_moneda -n=BTC -p=45000.0000
# 3. Dar de alta monedas en cuentas (depósito inicial)
./ledger alta_cuenta -u=1 -m=1 -a=5000 # Alice: 5000 USD
./ledger alta_cuenta -u=1 -m=2 -a=2000 # Alice: 2000 EUR
./ledger alta_cuenta -u=2 -m=1 -a=3000 # Bob: 3000 USD
# 4. Transferencias
./ledger realizar_transferencia -o=1 -d=2 -m=1 -a=500
# Alice transfiere 500 USD a Bob
# 5. Swap de monedas
./ledger realizar_swap -u=1 -mo=1 -md=2 -a=1000
# Alice intercambia 1000 USD por EUR
# 6. Consultar balances
./ledger balance -c1=alice
# Ver balance completo de Alice
./ledger balance -c1=alice -m=USD
# Ver balance de Alice en USD
# 7. Ver historial de transacciones
./ledger transacciones -c1=alice -c2=alice
# Todas las transacciones de Alice
# 8. Exportar reportes
./ledger balance -c1=alice -o=reporte_alice.csv
./ledger transacciones -c1=alice -o=historial_alice.csv
# 9. Deshacer última transacción (si es necesario)
./ledger deshacer_transaccion -id=10# Consultar transacciones desde archivo CSV
./ledger transacciones -t=data/transacciones.csv -c1=alice -m=USD -o=resultado.csv
# Consultar balance usando archivo de transacciones
./ledger balance -c1=alice -t=data/transacciones.csv -m=EURLedger- Orquestador principal del sistemaArgumentos- Validación de argumentos CLILedger.Usuario- Gestión de usuariosLedger.Moneda- Gestión de monedasLedger.Transaccion- Gestión de transaccionesEstructuras.Balance- Cálculo de balancesEstructuras.Transaccion- Consultas de transaccionesCSVManager- Manejo de archivos CSVHerramientas- Utilidades y helpers
make init # Iniciar el proyecto
make docker-up # Iniciar PostgreSQL
make docker-down # Detener PostgreSQL
make psql-dev # Entrar a la terminal de psql de la base de datos del proyecto
make psql-test # Entrar a la terminal de psql de la base de datos test
make test # Correr los tests
make reload # Reinicia la base de datos Después de ejecutar make reload, la base de datos se reiniciará. Para poblar la base de datos con datos de prueba, copiar y pegar los siguientes comandos en la terminal:
./ledger crear_usuario -n=usuario1 -b=2003-07-14
./ledger crear_usuario -n=usuario2 -b=2001-05-09
./ledger crear_usuario -n=usuario3 -b=1999-12-02
./ledger crear_usuario -n=usuario4 -b=2005-03-28
./ledger crear_usuario -n=usuario5 -b=2000-10-17
./ledger crear_moneda -n=USD -p=1.0000
./ledger crear_moneda -n=LUM -p=0.5823
./ledger crear_moneda -n=ARKA -p=2.1390
./ledger crear_moneda -n=VEX -p=0.9417
./ledger crear_moneda -n=ORIN -p=3.2745
./ledger alta_cuenta -u=1 -m=1 -a=10000
./ledger alta_cuenta -u=1 -m=2 -a=5000
./ledger alta_cuenta -u=2 -m=1 -a=7500
./ledger alta_cuenta -u=2 -m=3 -a=0.5
./ledger alta_cuenta -u=3 -m=2 -a=8000
./ledger alta_cuenta -u=3 -m=1 -a=12000
./ledger realizar_transferencia -o=1 -d=2 -m=1 -a=1500
./ledger realizar_transferencia -o=2 -d=3 -m=1 -a=2000
./ledger realizar_transferencia -o=1 -d=3 -m=2 -a=1000
./ledger realizar_swap -u=1 -mo=1 -md=2 -a=2000
./ledger realizar_transferencia -o=3 -d=1 -m=1 -a=3000
./ledger alta_cuenta -u=1 -m=3 -a=0.25
./ledger realizar_swap -u=2 -mo=1 -md=3 -a=1000
./ledger realizar_transferencia -o=3 -d=2 -m=2 -a=2500
./ledger realizar_transferencia -o=1 -d=2 -m=3 -a=0.1El sistema implementa validaciones exhaustivas en todas las operaciones:
- ❌ Flags inválidos para la operación
- ❌ Flags duplicados
- ❌ Flags sin valor asignado
- ❌ Operación no válida (con sugerencias inteligentes)
- ❌ Flags obligatorios faltantes
- ❌ Usuario menor de 18 años
- ❌ Username duplicado
- ❌ Username muy corto/largo (5-20 caracteres)
- ❌ Eliminar usuario con transacciones
- ❌ Nombre duplicado
- ❌ Nombre no en mayúsculas
- ❌ Nombre incorrecto (3-4 caracteres)
- ❌ Precio negativo
- ❌ Eliminar moneda usada en transacciones
- ❌ Fondos insuficientes
- ❌ Monedas iguales en swap
- ❌ Cuentas iguales en transferencia
- ❌ Moneda no dada de alta en cuenta
- ❌ Deshacer transacción que no es la última
- ❌ Balances negativos
./ledger balanc -c1=alice
# Error: "Quisiste decir balance"
./ledger balance -c1=alice -c2=bob
# Error: "En la operacion de balance el flag -c2 no esta permitido"- ✅ Validación de tipos de datos con Ecto
- ✅ Constraints de base de datos (unique, foreign keys)
- ✅ Validación de edad (mayores de 18)
- ✅ Validación de fondos suficientes
- ✅ Prevención de eliminación de datos referenciados
- ✅ Validación de formato de datos (fechas, decimales)
- ✅ Manejo seguro de operaciones concurrentes con transacciones DB