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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
node_modules
100 changes: 34 additions & 66 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,66 +1,34 @@
# Reto Técnico: Procesamiento de Transacciones Bancarias (CLI)

## Objetivo:

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

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

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

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.
# Resolucion para los balances

Este pequeño script en Node.js permite leer un archivo `.csv` con las transacciones bancarias, generando el resumen que muestra lo siguiente:

- El balance final (Créditos - Débitos)
- La transacción de mayor monto
- El conteo de Créditos y Débitos

---

## Requerimientos

- Tener **Node.js** y **npm** instalados

---

## Instalación

3. Instala las dependencias (solo use nodemon):

```bash
npm install

---

## Uso

4. Ejecutamos el programa

```bash
npm run dev

5. Una vez ejecutado el comando podremos visualizar el resultado
![image](https://github.com/user-attachments/assets/98d3a041-5aea-43b4-ac4e-6fc0f19fd745)
91 changes: 91 additions & 0 deletions index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,91 @@
// - Balance Final
// - Transacción de Mayor Monto
// - Conteo de Créditos y Débitos

const fs = require('fs')
const path = require('path');

// RUTA DEL CSV
const archivo = process.argv[2] || 'data.csv'
const ruta = path.resolve(process.cwd(), archivo);

// PASAR CSV A ARRAY
function leerArchivo(rutaArchivo) {
let data;

try {
data = fs.readFileSync(rutaArchivo, 'utf8');
}
catch {
console.error(`error: noo se encontro "${rutaArchivo}"`);
process.exit(1)
}

const [header, ...filas] = data.trim().split('\n'); // 18,Débito,385.45
const columnas = header.split(',').map(c => c.trim()); // id,tipo,monto

return filas.map(line => { // 18,Debito,385.45
const valores = line.split(',').map(v => v.trim()); // [ "18", "Debito", "385.45" ]
const obj = {};

columnas.forEach ((col, i) => { // id:0,tipo:1,monto:2
obj[col] = valores[i] // id : 18 , tipo: debito , monto : 385.45
});

return {
id: Number(obj.id), // 18
tipo: obj.tipo, // debito
monto: Number(obj.monto) // 385.45
};
});

}

function procesarLogica(transacciones) {
let sumaCredito = 0, sumDebito = 0;
let mayor = {
id: null, monto: -Infinity
}

const conteo = {
'Crédito': 0, 'Débito': 0
};

for (const t of transacciones) {
// Si es que no exite pasa este indice
if (!(t.tipo in conteo)) continue;
// COntamos cada tarjeta
conteo[t.tipo]++;

//
t.tipo === 'Crédito' ?
sumaCredito += t.monto :
sumDebito += t.monto;

if (t.monto > mayor.monto) {
mayor = { id: t.id, monto: t.monto };
}

}

return {
balance: sumaCredito - sumDebito,
mayor,
conteo
};
}


function mostrarInformacion({ balance, mayor, conteo }) {
console.log("***************************")
console.log('* Reporte de Transacciones *');
console.log("**********************************************************")
console.log(`* Balance Final: ${balance.toFixed(2)}`);
console.log(`* Transacción de Mayor Monto: ID ${String(mayor.id).padStart(3)} — ${mayor.monto.toFixed(2)}`);
console.log(`* Conteo de Transacciones: Crédito: ${String(conteo['Crédito']).padStart(2)} Débito: ${String(conteo['Débito']).padStart(2)}`);
console.log("**********************************************************")
}

const transacciones = leerArchivo(ruta);
const reporte = procesarLogica(transacciones);
mostrarInformacion(reporte);
Loading