diff --git a/README.md b/README.md index 668a6a2..31ab12f 100644 --- a/README.md +++ b/README.md @@ -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 +... +``` \ No newline at end of file diff --git a/reporte_transacciones.py b/reporte_transacciones.py new file mode 100644 index 0000000..7f2a000 --- /dev/null +++ b/reporte_transacciones.py @@ -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()