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
97 changes: 31 additions & 66 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,66 +1,31 @@
# 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.
# Reporte de Transacciones Bancarias

## Introducción
Aplicación CLI que procesa transacciones bancarias desde un archivo CSV y genera un reporte con balance final, transacción de mayor monto y conteo por tipo de transacción (Crédito/Débito).

## Instrucciones de Ejecución
No requiere dependencias externas, solo Python 3.

```bash
# Asegúrate de tener un archivo data.csv en el mismo directorio
python reporte_transacciones.py
```

## Enfoque y Solución
- Lectura del archivo CSV usando el módulo csv de Python
- Procesamiento de datos en memoria para calcular métricas
- Diseño modular con funciones independientes para cada cálculo
- Manejo básico de errores para archivos inexistentes o formato incorrecto
- Enfoque simple sin dependencias externas

## Estructura del Proyecto
- `reporte_transacciones.py`: Script principal con toda la lógica
- `data.csv`: Archivo de datos de ejemplo

El formato del CSV debe ser:
```
id,tipo,monto
1,Crédito,100.00
2,Débito,50.00
...
```
114 changes: 114 additions & 0 deletions reporte_transacciones.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
"""
Aplicación CLI para procesar transacciones bancarias desde un archivo CSV y generar un reporte con balance final, transacción de mayor monto y conteo por tipo.
"""

import csv
import os

def leer_archivo_csv(nombre_archivo):
"""
Lee un archivo CSV y devuelve una lista de diccionarios con los datos.

Args:
nombre_archivo: Ruta al archivo CSV a leer

Returns:
Lista de diccionarios con los datos del archivo CSV
"""
try:
with open(nombre_archivo, 'r', encoding='utf-8') as archivo:
lector = csv.DictReader(archivo)
return list(lector)
except FileNotFoundError:
print(f"Error: No se encontró el archivo '{nombre_archivo}'")
return []
except Exception as e:
print(f"Error al leer el archivo: {e}")
return []

def calcular_balance_final(transacciones):
"""
Calcula el balance final sumando los créditos y restando los débitos.

Args:
transacciones: Lista de transacciones

Returns:
Balance final
"""
balance = 0.0
for transaccion in transacciones:
monto = float(transaccion['monto'])
if transaccion['tipo'] == 'Crédito':
balance += monto
elif transaccion['tipo'] == 'Débito':
balance -= monto
return balance

def encontrar_transaccion_mayor_monto(transacciones):
"""
Encuentra la transacción con el mayor monto.

Args:
transacciones: Lista de transacciones

Returns:
Tupla con el ID y el monto de la transacción de mayor monto
"""
if not transacciones:
return "", 0.0

transaccion_mayor = max(transacciones, key=lambda t: float(t['monto']))
return transaccion_mayor['id'], float(transaccion_mayor['monto'])

def contar_transacciones_por_tipo(transacciones):
"""
Cuenta el número de transacciones por tipo.

Args:
transacciones: Lista de transacciones

Returns:
Diccionario con el conteo de transacciones por tipo
"""
conteo = {"Crédito": 0, "Débito": 0}
for transaccion in transacciones:
tipo = transaccion['tipo']
if tipo in conteo:
conteo[tipo] += 1
return conteo

def generar_reporte(transacciones):
"""
Genera y muestra el reporte de transacciones.

Args:
transacciones: Lista de transacciones
"""
balance_final = calcular_balance_final(transacciones)
id_mayor, monto_mayor = encontrar_transaccion_mayor_monto(transacciones)
conteo = contar_transacciones_por_tipo(transacciones)

print("Reporte de Transacciones")
print("---------------------------------------------")
print(f"Balance Final: {balance_final:.2f}")
print(f"Transacción de Mayor Monto: ID {id_mayor} - {monto_mayor:.2f}")
print(f"Conteo de Transacciones: Crédito: {conteo['Crédito']} Débito: {conteo['Débito']}")

def main():
"""Función principal del programa."""
# Por defecto, leer el archivo data.csv
archivo_csv = "data.csv"

# Comprobar si el archivo existe
if not os.path.exists(archivo_csv):
print(f"Error: No se encontró el archivo '{archivo_csv}'")
return

# Leer transacciones y generar reporte
transacciones = leer_archivo_csv(archivo_csv)
if transacciones:
generar_reporte(transacciones)

if __name__ == "__main__":
main()