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
3 changes: 3 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
{
"java.configuration.updateBuildConfiguration": "interactive"
}
165 changes: 107 additions & 58 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,66 +1,115 @@
# Reto Técnico: Procesamiento de Transacciones Bancarias (CLI)
# 🏦 Reto IBK: Procesador de Transacciones en Java

## Objetivo:
Este proyecto Java permite leer un archivo CSV con transacciones bancarias, contar cuántas son de tipo **Crédito** y **Débito**, y generar un pequeño reporte por consola.

Desarrolla una aplicación de línea de comandos (CLI) que procese un archivo CSV con transacciones bancarias y genere un reporte que incluya:
---

## 📁 Estructura del proyecto

```
reto-ibk/
├── src/
│ └── main/
│ └── java/
│ ├── com/
│ │ └── mycompany/
│ │ ├── Main.java
│ ├── model/
│ │ └── Transaction.java
│ ├── reader/
│ │ └── CSVReader.java
│ └─── service/
│ └── TransactionService.java
├── README.md
├── data.csv
└── pom.xml
```

---

## 🧠 ¿Qué hace el programa?

1. Lee el archivo `data.csv` desde `src/main/resources/`.
2. Procesa las transacciones con los campos:
- `id`: identificador numérico
- `tipo`: `"Crédito"` o `"Débito"`
- `monto`: cantidad en formato decimal
3. Cuenta cuántas transacciones hay de cada tipo.
4. Muestra los resultados por consola.

---

## 💻 Ejemplo de uso

Archivo `data.csv`:

```
id,tipo,monto
1,Crédito,500.00
2,Débito,200.00
3,Crédito,300.00
```

Salida esperada en consola:

```
Reporte de Transacciones
---------------------------------------------
Balance Final: 600
Transacción de Mayor Monto: ID 3 - 300.00
Conteo de Transacciones: Crédito: 2 Débito: 1
```

---

## ⚙️ Tecnologías utilizadas

- Java 11+
- Maven
- VS Code (u otro IDE)

- **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".
---

## 🚀 Cómo ejecutar el proyecto

1. Clona el repositorio:

```bash
git clone https://github.com/pcrisho/interbank-academy-25.git

cd interbank-academy-25
```

- **Transacción de Mayor Monto:**
Identificar el ID y el monto de la transacción con el valor más alto.
2. Compila el proyecto:

- **Conteo de Transacciones:**
Número total de transacciones para cada tipo ("Crédito" y "Débito").
```bash
mvn clean compile
```

3. Ejecuta el proyecto:

```bash
mvn exec:java -Dexec.mainClass="com.mycompany.Main"
```

> Asegúrate de que el archivo `data.csv` exista.

---

## Instrucciones

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

2. **Entrada de Datos:**
La aplicación deberá leer un archivo CSV. Ejemplo de contenido:

```
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
```

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

```
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
```

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

- Python
- Java
- C#
- JavaScript (Node.js)

5. **README del Proyecto:**
Incluye un archivo `README.md` con la siguiente estructura:

- **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.

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.
## 📌 Notas adicionales

- El código omite líneas inválidas del CSV y muestra errores por consola.
- Se puede adaptar fácilmente para procesar otros tipos de datos financieros.

---

## Puntos por mejorar

- Pueden aplicarse validaciones más estrictas
- Se puede adaptar fácilmente para procesar otros tipos de datos financieros.

---

## ✍️ Autor

Proyecto desarrollado como parte del programa **INTERBANK ACADEMY 2025**.
16 changes: 16 additions & 0 deletions reto-ibk/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.mycompany</groupId>
<artifactId>reto-ibk</artifactId>
<version>1.0-SNAPSHOT</version>

<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
</properties>

</project>
38 changes: 38 additions & 0 deletions reto-ibk/src/main/java/com/mycompany/Main.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.mycompany;

import model.Transaction;
import service.TransactionService;
import reader.CSVReader;

import java.util.List;

/**
* Clase principal del programa: ejecuta el flujo de carga y reporte.
*/
public class Main {
public static void main(String[] args) {
String nombreArchivo = "data.csv";

// Leer transacciones desde el archivo CSV
List<Transaction> transacciones = CSVReader.leerCSV(nombreArchivo);

if (transacciones.isEmpty()) {
System.out.println("No se encontraron transacciones válidas.");
return;
}

// Procesar con TransactionService
TransactionService servicio = new TransactionService(transacciones);

double balance = servicio.calcularBalanceFinal();
Transaction mayor = servicio.obtenerTransaccionMayorMonto();
int[] conteo = servicio.contarTransaccionesTipo();

// Mostrar reporte
System.out.println("Reporte de Transacciones");
System.out.println("---------------------------------------------");
System.out.printf("Balance Final: %.2f\n", balance);
System.out.printf("Transacción de Mayor Monto: ID %d - %.2f\n", mayor.getId(), mayor.getMonto());
System.out.printf("Conteo de Transacciones: Crédito: %d Débito: %d\n", conteo[0], conteo[1]);
}
}
46 changes: 46 additions & 0 deletions reto-ibk/src/main/java/model/Transaction.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package model;

/**
* Clase para representar una transacción bancaria con id, tipo y monto.
*/

public class Transaction {

private int id;
private String tipo;
private double monto;

/**
* Constructor para crear una nueva transacción.
* @param id Identificador único de la transacción.
* @param tipo Tipo de transacción: "Crédito" o "Débito".
* @param monto Monto de la transacción, debe ser positivo.
*/

public Transaction(int id, String tipo, double amount) {
// Restricción en caso el tipo de transacción sea inválido
if (!tipo.equalsIgnoreCase("Crédito") && !tipo.equalsIgnoreCase("Débito")) {
throw new IllegalArgumentException("Tipo de transacción inválido: " + tipo + "!");
}
// Restricción en caso el monto sea inválido
if (amount < 0) {
throw new IllegalArgumentException("El monto no puede ser negativo");
}
this.id = id;
this.tipo = tipo;
this.monto = amount;
}

// Métodos getters
public int getId() {
return id;
}

public String getTipo() {
return tipo;
}

public double getMonto() {
return monto;
}
}
62 changes: 62 additions & 0 deletions reto-ibk/src/main/java/reader/CSVReader.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package reader;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import model.Transaction;

/**
* Clase para leer un archivo CSV y convertirlo en una lista de transacciones.
*/

public class CSVReader {

/**
* Método para leer el archivo CSV y retorna una lista de objetos Transaction.
* @param fileName nombre del archivo (data.csv)
*/
public static List<Transaction> leerCSV(String fileName) {

// Creación de lista vacía donde se guardarán las transacciones
List<Transaction> transactions = new ArrayList<>();

try (BufferedReader br = new BufferedReader(new FileReader(fileName))) {
String linea;
boolean esPrimeraLinea = true;

while ((linea = br.readLine()) != null) {
if (esPrimeraLinea) {
esPrimeraLinea = false; // omitir encabezado
continue;
}

// Divide la línea usando la coma como separador, lo que genera un arreglo con los 3 valores esperados: id, tipo y monto.
String[] fila = linea.split(",");

if (fila.length != 3) continue; // línea inválida

try {
int id = Integer.parseInt(fila[0].trim()); // en un entero (id)
String tipo = fila[1].trim(); // en un string (tipo)
double monto = Double.parseDouble(fila[2].trim()); // en un número decimal (monto)

// Crea un objeto Transaction con los datos leídos y lo agrega a la lista.
Transaction t = new Transaction(id, tipo, monto);
transactions.add(t);

} catch (Exception e) {
System.err.println("Línea inválida: " + linea + " → " + e.getMessage());
// Continúa con la siguiente línea
}
}
} catch (IOException e) {
System.err.println("Error al leer el archivo: " + e.getMessage());
}

return transactions;
}

}
Loading