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