Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
108 changes: 59 additions & 49 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,66 +1,76 @@
# Reto Técnico: Procesamiento de Transacciones Bancarias (CLI)
# Documentación del Programa de Análisis de Transacciones de Interbank

## Objetivo:
## Introducción

Desarrolla una aplicación de línea de comandos (CLI) que procese un archivo CSV con transacciones bancarias y genere un reporte que incluya:
Este proyecto implementa un analizador de transacciones financieras que procesa datos de un archivo CSV. Su propósito principal es calcular un balance financiero al sumar los créditos y restar los débitos, además de proporcionar estadísticas sobre las transacciones como el número total de cada tipo y la transacción de mayor monto.

- **Balance Final:**
Suma de los montos de las transacciones de tipo "Crédito" menos la suma de los montos de las transacciones de tipo "Débito".
## Instrucciones de Ejecución

- **Transacción de Mayor Monto:**
Identificar el ID y el monto de la transacción con el valor más alto.
Para ejecutar el programa debe tener en cuenta lo siguiente:

- **Conteo de Transacciones:**
Número total de transacciones para cada tipo ("Crédito" y "Débito").
- El archivo a leer debe llamarse data.csv y debe estar en el mismo directorio de esta aplicacion
- Para ejecutar digite en su linea de comandos: java leecsv.java

---
### Requisitos Previos

## Instrucciones
- JDK 8 o superior instalado
- Un archivo CSV llamado `data.csv` en el mismo directorio que el programa con el formato: `ID,Tipo,Monto`

1. **Repositorio Base:**
Clona o haz un fork del repositorio base disponible en:
`https://github.com/codeableorg/interbank-academy-25`
### Formato del Archivo CSV

2. **Entrada de Datos:**
La aplicación deberá leer un archivo CSV. Ejemplo de contenido:
El programa espera un archivo CSV con la siguiente estructura:

```
id,tipo,monto
1,Crédito,100.00
2,Débito,50.00
3,Crédito,200.00
4,Débito,75.00
5,Crédito,150.00
```
```
ID,Tipo,Monto
1,Crédito,1000.00
2,Débito,500.00
```

3. **Salida del Programa:**
La aplicación debe mostrar el reporte final en la terminal.
Ejemplo de salida:
Donde:

```
Reporte de Transacciones
---------------------------------------------
Balance Final: 325.00
Transacción de Mayor Monto: ID 3 - 200.00
Conteo de Transacciones: Crédito: 3 Débito: 2
```
- **ID**: Identificador único de la transacción (número entero)
- **Tipo**: Puede ser "Crédito" o "Débito" (con tildes)
- **Monto**: Valor numérico de la transacción (punto como separador decimal)

4. **Lenguaje de Programación:**
Utiliza el lenguaje de tu preferencia. Opciones recomendadas:
## Enfoque y Solución

- Python
- Java
- C#
- JavaScript (Node.js)
El programa adopta un enfoque directo de procesamiento de datos en un solo paso:

5. **README del Proyecto:**
Incluye un archivo `README.md` con la siguiente estructura:
1. **Lectura de Datos**: Utiliza `BufferedReader` para leer el archivo CSV línea por línea, aplicando el patrón try-with-resources para garantizar el cierre adecuado de recursos.

- **Introducción:** Breve descripción del reto y su propósito.
- **Instrucciones de Ejecución:** Cómo instalar dependencias y ejecutar la aplicación.
- **Enfoque y Solución:** Lógica implementada y decisiones de diseño.
- **Estructura del Proyecto:** Archivos y carpetas principales.
2. **Procesamiento por Línea**: Para cada línea, se separan los valores utilizando la coma como delimitador y se procesan según el tipo de transacción:

6. **Documentación y Calidad del Código:**
- Código bien documentado y fácil de leer.
- Comentarios explicando pasos clave y lógica del programa.
- Si es "Crédito", se suma al acumulador de créditos
- Si es "Débito", se suma al acumulador de débitos

3. **Análisis Paralelo**: Durante el mismo recorrido del archivo, se identifican estadísticas adicionales:

- Se cuenta el número de transacciones de cada tipo
- Se identifica la transacción con el monto más alto y se guarda su ID

4. **Cálculo de Balance**: Una vez procesado todo el archivo, se calcula el balance final como la diferencia entre la suma de créditos y la suma de débitos.

5. **Presentación de Resultados**: Se muestra un reporte formateado con el balance final, la transacción de mayor monto y el conteo de transacciones por tipo.

### Decisiones de Diseño

- **Eficiencia de Procesamiento**: Se realiza un único recorrido del archivo para extraer toda la información necesaria, optimizando el rendimiento.

## Estructura del Proyecto

El proyecto tiene una estructura simple con los siguientes componentes:

```
/
├── leeCSV.java # Archivo principal que contiene el código fuente
├── data.csv # Archivo de datos de entrada en formato CSV
└── README.md # Este archivo de documentación
```

### Descripción de Componentes

- **leeCSV.java**: Contiene la clase principal con el método `main()` que ejecuta todo el proceso de análisis de transacciones.

- **data.csv**: Archivo de datos que debe estar presente en el mismo directorio que el programa con el formato especificado.

El diseño minimalista facilita su uso inmediato sin necesidad de configuraciones complejas o dependencias externas.
Binary file added leeCSV.class
Binary file not shown.
67 changes: 67 additions & 0 deletions leeCSV.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
// Importamos las librerías necesarias
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

/**
*
* @author Paul
*/
public class leeCSV {

public static void main(String[] args) throws FileNotFoundException, IOException {

// Definimos el nombre del archivo CSV a leer
String nomArchivo = "data.csv";
// Definimos las variables que usaremos para almacenar los datos
double balance, sumaCreditos=0, sumaDebitos=0, transaccionDeMayorMonto=0;

int nroTransaccionesCredito=0, nroTransaccionesDebito=0, idTransaccionMayorMonto=0;

// Leer el archivo CSV linea por linea
// Se asume que el archivo tiene el siguiente formato:
// ID,Tipo,Monto
try (BufferedReader br = new BufferedReader(new FileReader(nomArchivo))) {
String linea;
// revisa si hemos llegado al final del archivo
while ((linea = br.readLine()) != null) {
// Separa la linea en partes usando la coma como delimitador
// y guarda cada parte en un arreglo de String
String[] valores = linea.split(",");
// Comparamos el tipo de transacción y sumamos el monto correspondiente
if (valores[1].equals("Crédito")){
nroTransaccionesCredito+=1;
sumaCreditos+= Double.parseDouble(valores[2]);
}
if (valores[1].equals("Débito")){
nroTransaccionesDebito+=1;
sumaDebitos+=Double.parseDouble(valores[2]);
}
// Comparamos el monto de la transacción con el monto mayor
// y guardamos el ID de la transacción mayor
try{
if (Double.parseDouble(valores[2]) > transaccionDeMayorMonto){
transaccionDeMayorMonto = Double.parseDouble(valores[2]);
idTransaccionMayorMonto = Integer.parseInt(valores[0]);
}
}catch (NumberFormatException e){}
}
}catch (IOException e) {
e.printStackTrace();
}

// Calcular el balance final
// El balance es la suma de los créditos menos la suma de los débitos
balance = sumaCreditos - sumaDebitos;
//Imprimir el reporte
System.out.println("Reporte de Transacciones");
System.out.println("---------------------------------------");
System.out.println("Balance Final: " + String.format("%.2f", balance));
System.out.println("Transacción de mayor monto: ID "+ idTransaccionMayorMonto + " Monto: " + String.format("%.2f", transaccionDeMayorMonto));
System.out.println("Conteo de Transacciones: Credito: " + nroTransaccionesCredito + " Débito: " + nroTransaccionesDebito);



}
}