diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..c5f3f6b
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,3 @@
+{
+ "java.configuration.updateBuildConfiguration": "interactive"
+}
\ No newline at end of file
diff --git a/README.md b/README.md
index 668a6a2..c6d72d0 100644
--- a/README.md
+++ b/README.md
@@ -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**.
diff --git a/reto-ibk/pom.xml b/reto-ibk/pom.xml
new file mode 100644
index 0000000..e48ae7c
--- /dev/null
+++ b/reto-ibk/pom.xml
@@ -0,0 +1,16 @@
+
+
+ 4.0.0
+
+ com.mycompany
+ reto-ibk
+ 1.0-SNAPSHOT
+
+
+ 17
+ 17
+
+
+
\ No newline at end of file
diff --git a/reto-ibk/src/main/java/com/mycompany/Main.java b/reto-ibk/src/main/java/com/mycompany/Main.java
new file mode 100644
index 0000000..5c268bc
--- /dev/null
+++ b/reto-ibk/src/main/java/com/mycompany/Main.java
@@ -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 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]);
+ }
+}
\ No newline at end of file
diff --git a/reto-ibk/src/main/java/model/Transaction.java b/reto-ibk/src/main/java/model/Transaction.java
new file mode 100644
index 0000000..8ac8685
--- /dev/null
+++ b/reto-ibk/src/main/java/model/Transaction.java
@@ -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;
+ }
+}
diff --git a/reto-ibk/src/main/java/reader/CSVReader.java b/reto-ibk/src/main/java/reader/CSVReader.java
new file mode 100644
index 0000000..1042a42
--- /dev/null
+++ b/reto-ibk/src/main/java/reader/CSVReader.java
@@ -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 leerCSV(String fileName) {
+
+ // Creación de lista vacía donde se guardarán las transacciones
+ List 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;
+ }
+
+}
diff --git a/reto-ibk/src/main/java/service/TransactionService.java b/reto-ibk/src/main/java/service/TransactionService.java
new file mode 100644
index 0000000..8733a3b
--- /dev/null
+++ b/reto-ibk/src/main/java/service/TransactionService.java
@@ -0,0 +1,84 @@
+package service;
+import model.Transaction;
+import java.util.List;
+
+/**
+ * Clase para la lógica del negocio.
+ */
+
+public class TransactionService {
+
+ /**
+ * @param transactions lista con los datos de transacción: id, tipo, monto.
+ */
+
+ private List transactions;
+
+ /**
+ * Constructor para recibir como parámetro una lista de objetos @param transactions .
+ */
+
+ public TransactionService(List transactions) {
+ this.transactions = transactions;
+ }
+
+ /**
+ * Método para calcular el balance final: suma de Créditos - suma de Débitos.
+ */
+
+ public double calcularBalanceFinal() {
+ // Variables de conteo de montos
+ double credito = 0.0;
+ double debito = 0.0;
+
+ for (Transaction t : transactions) {
+ if (t.getTipo().equalsIgnoreCase("Crédito")) {
+ credito += t.getMonto();
+ } else if (t.getTipo().equalsIgnoreCase("Débito")) {
+ debito += t.getMonto();
+ }
+ }
+
+ return credito - debito;
+ }
+
+ /**
+ * Método para retornar la transacción con el monto más alto.
+ */
+
+ public Transaction obtenerTransaccionMayorMonto() {
+ // Variable que guardará la transacción más alta
+ Transaction mayor = null;
+
+ for (Transaction t : transactions) {
+ if (mayor == null || t.getMonto() > mayor.getMonto()) {
+ mayor = t;
+ }
+ }
+
+ return mayor;
+ }
+
+ /**
+ * Método para contar la cantidad total de transacciones por tipo.
+ * @return Arreglo con [créditos, débitos]
+ */
+
+ public int[] contarTransaccionesTipo() {
+ // Variables que guardarán el conteo de transacciones por tipo
+ int credito = 0;
+ int debito = 0;
+
+ for (Transaction t : transactions) {
+ if (t.getTipo().equalsIgnoreCase("Crédito")) {
+ credito++;
+ } else if (t.getTipo().equalsIgnoreCase("Débito")) {
+ debito++;
+ }
+ }
+
+ // Se retorna un arreglo con los contadores
+ return new int[]{credito, debito};
+ }
+
+}
diff --git a/reto-ibk/target/classes/com/mycompany/Main.class b/reto-ibk/target/classes/com/mycompany/Main.class
new file mode 100644
index 0000000..1984006
Binary files /dev/null and b/reto-ibk/target/classes/com/mycompany/Main.class differ
diff --git a/reto-ibk/target/classes/model/Transaction.class b/reto-ibk/target/classes/model/Transaction.class
new file mode 100644
index 0000000..5defb45
Binary files /dev/null and b/reto-ibk/target/classes/model/Transaction.class differ
diff --git a/reto-ibk/target/classes/reader/CSVReader.class b/reto-ibk/target/classes/reader/CSVReader.class
new file mode 100644
index 0000000..2d27670
Binary files /dev/null and b/reto-ibk/target/classes/reader/CSVReader.class differ
diff --git a/reto-ibk/target/classes/service/TransactionService.class b/reto-ibk/target/classes/service/TransactionService.class
new file mode 100644
index 0000000..d7a688c
Binary files /dev/null and b/reto-ibk/target/classes/service/TransactionService.class differ