diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d70d452 --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +# Node.js dependencies +node_modules/ + +# Logs +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Environment variables +.env + +# OS-specific files +.DS_Store +Thumbs.db diff --git a/README.md b/README.md index 668a6a2..8233601 100644 --- a/README.md +++ b/README.md @@ -1,66 +1,29 @@ -# Reto Técnico: Procesamiento de Transacciones Bancarias (CLI) +# Reto Técnico: Procesamiento de Transacciones Bancarias (CLI -## 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 es una aplicación de línea de comandos (CLI) que procesa un archivo CSV con transacciones bancarias y genera un reporte con el balance final, la transacción de mayor monto y el conteo de transacciones por tipo. -- **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. - -- **Conteo de Transacciones:** - Número total de transacciones para cada tipo ("Crédito" y "Débito"). - ---- - -## 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 +1. Instala las dependencias: + ```bash + npm install ``` -3. **Salida del Programa:** - La aplicación debe mostrar el reporte final en la terminal. - Ejemplo de salida: - +2. Ejecuta la aplicación: + ```bash + npm start ``` - 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) +## Enfoque y Solución -5. **README del Proyecto:** - Incluye un archivo `README.md` con la siguiente estructura: +- Se utiliza `csv-parser` para leer y procesar el archivo CSV. +- Se calculan los valores requeridos en tiempo real mientras se leen las filas del archivo. +- El reporte se muestra en la terminal al finalizar el procesamiento. - - **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. +## Estructura del Proyecto -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. +- `index.js`: Script principal que procesa el archivo CSV y genera el reporte. +- `data.csv`: Archivo de entrada con las transacciones bancarias. +- `package.json`: Archivo de configuración del proyecto y dependencias. diff --git a/index.js b/index.js new file mode 100644 index 0000000..57d9d70 --- /dev/null +++ b/index.js @@ -0,0 +1,38 @@ +const fs = require('fs'); +const path = require('path'); +const csv = require('csv-parser'); + +const filePath = path.join(__dirname, 'data.csv'); + +let balance = 0; +let maxTransaction = { id: null, monto: 0 }; +let transactionCount = { creditCard: 0, debitCard: 0 }; + +fs.createReadStream(filePath) + .pipe(csv()) + .on('data', (row) => { + const { id, tipo, monto } = row; + const amount = parseFloat(monto); + + if (tipo === 'Crédito') { + balance += amount; + transactionCount.creditCard++; + } else if (tipo === 'Débito') { + balance -= amount; + transactionCount.debitCard++; + } + + if (amount > maxTransaction.monto) { + maxTransaction = { id, monto: amount }; + } + }) + .on('end', () => { + console.log('Reporte de Transacciones'); + console.log('---------------------------------------------'); + console.log(`Balance Final: ${balance.toFixed(2)}`); + console.log(`Transacción de Mayor Monto: ID ${maxTransaction.id} - ${maxTransaction.monto.toFixed(2)}`); + console.log(`Conteo de Transacciones: Crédito: ${transactionCount.creditCard} Débito: ${transactionCount.debitCard}`); + }) + .on('error', (err) => { + console.error('Error al leer el archivo:', err.message); + }); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..8a09ea9 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,26 @@ +{ + "name": "interbank-academy-25", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "interbank-academy-25", + "version": "1.0.0", + "dependencies": { + "csv-parser": "^3.0.0" + } + }, + "node_modules/csv-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/csv-parser/-/csv-parser-3.2.0.tgz", + "integrity": "sha512-fgKbp+AJbn1h2dcAHKIdKNSSjfp43BZZykXsCjzALjKy80VXQNHPFJ6T9Afwdzoj24aMkq8GwDS7KGcDPpejrA==", + "bin": { + "csv-parser": "bin/csv-parser" + }, + "engines": { + "node": ">= 10" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..1a81b1e --- /dev/null +++ b/package.json @@ -0,0 +1,12 @@ +{ + "name": "interbank-academy-25", + "version": "1.0.0", + "description": "Procesamiento de Transacciones Bancarias (CLI)", + "main": "index.js", + "scripts": { + "start": "node index.js" + }, + "dependencies": { + "csv-parser": "^3.0.0" + } +}