README.md

# TP1 - Ledger

**Ledger es un sistema de libro contables que registra transacciones de
diferentes monedas entre usuarios. El sistema se basa en archivos CSV, funcionando como una base de datos accesible.**


## Compilación

### Compilar el proyecto
```
mix compile
```

### Crear ejecutable escript
```
mix escript.build
```


## Ejecución

### Usar el ejecutable
```
./ledger balance -c1=userA
```


## Estructura de archivos

### Archivo de monedas (monedas.csv)
Función: Actúa como el registro maestro de las monedas disponibles y su valor de referencia en USD.

Formato: Cada línea representa una moneda.

Estructura:
```
nombre_moneda;precio_usd
```

Ejemplo:
```text
BTC;55000
ETH;3000
ARS;0.0012
USDT;1
EUR;1.18
```

### Archivo de transacciones(transacciones.csv)
Función: Registra immutablemente toda actividad financiera en el sistema. Cada línea es una transacción.

Formato: Cada línea representa una transacción única.

Estructura:

```
id_transaccion;timestamp;moneda_origen;moneda_destino;monto;cuenta_origen;cuenta_destino;tipo
```

* id_transaccion es un identificador unico por transaccion
* fecha_hora indica en que momento se realizo la transaccion
* moneda_origen y moneda_destino indican en que moneda esta el valor de la
cuenta de origen y destino, respectivamente
* monto indica el monto de la transaccion
* cuenta_origen y cuenta_destino son los identificadores unicos de las cuentas
de origen y destino, respectivamente
* tipo indica el tipo de transaccion, y este puede ser:
  * transferencia : una transaccion que transfiere un monto de una cuenta a otra
  * swap : una transaccion que convierte un monto en una moneda a otra
  * alta_cuenta : una transaccion que crea una cuenta y fija su valor inicial

Ejemplo:
```
1;1754937004;USDT;USDT;100.50;userA;userB;transferencia
2;1755541804;BTC;USDT;0.1;userB;;swap
3;1756751404;BTC;;50000;userC;;alta_cuenta
```


## Comando balance

### Para mostrar el balance de una cuenta:
```
./ledger balance -c1=userA
```
El subcomando balance calculará el balance de una cuenta. En
este subcomando, el flag -c1 es obligatorio. Si no se completa el flag -m se listan los balances de todas las monedas de esa cuenta.

Ejemplos:
```
./ledger balance -c1=867
```
Lista por terminal el balance de todas las monedas de la cuenta 867.

```
./ledger balance -c1=867 -m=BTC
```
Lista por terminal el balance la cuenta 867 convertido a BTC.


### Flags disponibles:
 * **-c1:** especifica la cuenta origen (obligatorio)

 * **-t:** archivo transacciones input (si no se completa toma por default
transacciones.csv )

  * **-m:** moneda a utilizar para el cálculo (si no se completa se listan los balances de todas las monedas de esa cuenta)

  * **-o:** archivo output (si no se completa se imprimen por terminal)


## Comando transacciones

### Para listar transacciones entre cuentas:
```
./ledger transacciones -c1=userA -c2=userB
```

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

Ejemplos:
```
./ledger transacciones
```
Lista por terminal todas las transacciones del archivo transacciones.csv


```
./ledger transacciones -t=transac.csv -c1=345 -o=result.csv
```
Lista todas las transacciones del archivo transac.csv que fueron realizadas desde la cuenta 345 y las almacena en el archivo result.csv

### Flags disponibles:
 * **- c1:** especifica la cuenta origen (si no se completa, toma todas las cuentas)

  * **- c2:** especifica la cuenta destino (si no se completa, toma todas las cuentas)

 * **- t:** archivo transacciones input (si no se completa toma por default
transacciones.csv )

  * **- o:** archivo output (si no se completa se imprimen por terminal)

## Tests

### Para ejecutar los tests:
```
mix test
```

## Validaciones y errores chequeados
 En caso de encontrar una incosistencia, se muestra por pantalla la tupla {:error, <nro linea>} . Por ejemplo si la línea 45 no cuenta con el formato indicado, de devolverá {:error, 45} , de la misma manera si una transacción se realiza en una moneda no existente, si un monto es negativo, etc. 

### Errores de cuenta

* Cuenta no dada de alta previo a realizar una transacción con ella
* Cuenta proporcionada por un flag no existe
* Cuenta intenta realizar un swap o transferencia con un monto mayor al que posee

### Errores de monedas

* Moneda proporcionada por un flag no existe en el archivo monedas.csv
* Moneda origen o moneda destino no existe en el archivo monedas.csv
* Moneda origen y moneda destino no coinciden al realizar una transferencia

### Errores de comandos

* No se proporciona ningún comando
* El comando proporcionado no es válido

### Errores de archivos

* Fallo al leer el archivo
* El archivo de transacciones o monedas está vacío

### Errores de montos

* Se intenta transferir un monto inválido (negativo o cero)