TP2 - Ledger

Ledger es un sistema de libro contables que registra transacciones de diferentes monedas entre usuarios.

Comandos de configuración y desarrollo

Iniciar contenedor Docker

make docker

Inicializar proyecto

Comando completo

make init

Comandos individuales

make deps
make compile
make escript

Inicializar bases de datos

Base de desarrollo

make db-start

Resettear bases de datos

Base de desarrollo

make db-reset

Base de tests

make test-db-reset

Ejecutar tests

make test

Ejecución

Usar el ejecutable

./ledger balance -c1=userA

Componentes principales

El sistema está compuesto por 3 entidades principales que se almacenan en la base de datos:

Usuarios

Almacena la información de los usuarios del sistema. La entidad tiene id (numérico), nombre de usuario (string), fecha de nacimiento (date), fecha de creación de usuario, fecha de edición del usuario.

- id            
- nombre   
- fecha_nacimiento   
- timestamps           -- Fechas de creación y modificación         

Validaciones:

Monedas

Almacena la información de las monedas del sistema. La entidad tiene id (numerico), nombre de moneda (string), precio en dolares (float), fecha de creación de moneda, fecha de edición de moneda.

- id         
- nombre  
- precio_usd   
- timestamps           -- Fechas de creación y modificación          

Validaciones:

Transacciones

Almacena la información de las transacciones del sistema. La entidad tiene id (numerico), tipo (string), cuenta origen (foreign key a usuarios), cuenta destino (foreign key a usuarios), moneda origen (foreign_key a monedas), moneda destino (foreign key a monedas), monto (float), precio al momento de la transacción de la moneda origen, precio al momento de la transacción de la moneda destino, timestamps.

- id                     -- Identificador único
- tipo                   -- Tipo: "alta", "transferencia", "swap"
- cuenta_origen_id (FK)→usuarios.id
- cuenta_destino_id (FK)→usuarios.id -- nil para altas
- moneda_origen_id (FK)→monedas.id
- moneda_destino_id (FK)→monedas.id  -- nil para altas/transferencias
- monto               
- precio_moneda_origen 
- precio_moneda_destino
- timestamps             -- Fechas de creación y modificación        

Validaciones:

Comandos de Usuario

Crear usuario

./ledger crear_usuario -n=<nombre-de-usuario> -b=<fecha-nacimiento>

Editar usuario

./ledger editar_usuario -id=<id-usuario> -n=<nuevo-nombre-de-usuario>

Borrar usuario

./ledger borrar_usuario -id=<id-usuario>

Ver usuario

./ledger ver_usuario -id=<id-usuario> -out=<archivo-de-salida.txt>

Comandos de Moneda

Crear moneda

./ledger crear_moneda -n=<nombre-de-moneda> -p=<precio-respecto-dolar>

Editar moneda

./ledger editar_moneda -id=<id-moneda> -p=<nuevo-precio-respecto-dolar>

Borrar moneda

./ledger borrar_moneda -id=<id-moneda>

Ver moneda

./ledger ver_moneda -id=<id-moneda> -out=<archivo-de-salida.txt>

Comandos de Transacción

Alta cuenta

./ledger alta_cuenta -u=<id-usuario> -m=<id-moneda> -a=<monto>

Realizar transferencia

/ledger realizar_transferencia -o=<id-usuario-origen> -d=<id-usuario-destino> -
m=<id-moneda> -a=<monto>

Realizar swap

./ledger realizar_swap -u=<id-usuario> -mo=<id-moneda-origen> -md=<id-moneda-destino> -a=<monto>

Deshacer transacción

./ledger deshacer_transaccion -id=<id-transaccion>

Ver transacción

./ledger ver_transaccion -id=<id-transaccion> -out=<archivo-de-salida.txt>

Balance

El comando balance calculará el balance de una cuenta.

./ledger balance -c1=<id-usuario> -m=<id-moneda> -out=<archivo-de-salida.txt>
./ledger balance -c1=867 -m=BTC -out=result.txt

Lista el balance del usuario 867 convertido a BTC y lo almacena en el archivo result.txt.

Transacciones

El subcomando transacciones listará por pantalla todas las transacciones que cumplen con los flags propuestos.

./ledger transacciones -c1=<id-usuario-origen> -c2=<id-usuario-destino> -out=<archivo-de-salida.txt>

Ejemplos:

./ledger transacciones

Lista por salida estándar todas las transacciones del sistema.

./ledger transacciones -t=transac.csv -c1=345 -out=result.txt

Lista todas las transacciones del sistema que fueron realizadas desde la cuenta con id 345 y las almacena en el archivo result.txt

Errores

En caso de encontrar una incosistencia, se muestra el error con el siguiente formato:

{:error, <comando>: <descripción del error>} 

Por ejemplo si se quiere dar de alta un usuario con un nombre que ya está en uso, se muestra:

{:error, crear_usuario: El nombre ya está en uso}

Docs