diff --git a/README.md b/README.md index 668a6a2..4021f7c 100644 --- a/README.md +++ b/README.md @@ -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. diff --git a/leeCSV.class b/leeCSV.class new file mode 100644 index 0000000..7d8c065 Binary files /dev/null and b/leeCSV.class differ diff --git a/leeCSV.java b/leeCSV.java new file mode 100644 index 0000000..e3935fa --- /dev/null +++ b/leeCSV.java @@ -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); + + + + } +} \ No newline at end of file