diff --git a/README.md b/README.md index 668a6a2..e65a050 100644 --- a/README.md +++ b/README.md @@ -1,66 +1,71 @@ # 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 implementa una aplicación de línea de comandos (CLI) que procesa un archivo CSV con transacciones bancarias y genera un reporte que incluye: -- **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". +- **Balance Final**: Suma de los montos de las transacciones de tipo "Crédito" menos las de tipo "Débito". +- **Transacción de Mayor Monto**: Identifica 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"). -- **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"). +El propósito de este reto es demostrar habilidades en el procesamiento de datos, lógica algorítmica y desarrollo de aplicaciones CLI utilizando buenas prácticas de programación. --- -## 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. +## **Instrucciones de Ejecución** + +### **Requisitos** +- Python 3.6 o superior instalado en tu sistema. +- Acceso a un terminal o línea de comandos. + +### **Pasos para Ejecutar la Aplicación** + +1. **Clonar el Repositorio** + Clona este repositorio en tu máquina local usando el siguiente comando: + ```bash + git clone https://github.com/codeableorg/interbank-academy-25.git + +2. **Navegar al Directorio del Proyecto** +Ingresa al directorio del proyecto: + cd interbank-academy-25 + +3. **Instalar Dependencias (si las hay)** +Este proyecto no requiere dependencias externas adicionales, ya que utiliza la biblioteca estándar de Python. Si se agregan dependencias en el futuro, se pueden instalar con: + pip install -r requirements.txt +4. **Ejecutar la Aplicación** +Asegúrate de que el archivo data.csv esté presente en la raíz del proyecto. Luego, ejecuta el programa con el siguiente comando: + python main.py +5. **Ver el Reporte** +El reporte se mostrará directamente en la terminal. Por ejemplo: +Reporte de Transacciones +Balance Final: 10985.85 +Transacción de Mayor Monto: ID 222 - 499.69 +Conteo de Transacciones: Crédito: 508 Débito: 492 + +### **Enfoque y Solución** +El proyecto sigue un enfoque modular y legible: + + - Lectura del CSV: Se usa la biblioteca csv para convertir cada fila en un diccionario. + + - Balance Final: Se suman créditos y se restan débitos. + + - Mayor Monto: Se identifica con max(). + + - Conteo por Tipo: Uso de comprensiones de listas. + +- Decisiones de Diseño: + + - Modularidad para facilitar mantenimiento + + - Manejo de errores para mayor robustez + + - Escalabilidad para futuras mejoras + +### **Estructura del Proyecto** + +interbank-academy-25/ +│ +├── main.py # Código principal +├── data.csv # Archivo con transacciones de ejemplo +├── README.md # Documentación del proyecto +└── requirements.txt # Dependencias (actualmente vacío) diff --git a/main.py b/main.py new file mode 100644 index 0000000..8945bd8 --- /dev/null +++ b/main.py @@ -0,0 +1,73 @@ +import csv + +def read_transactions(file_path): + """ + Lee el archivo CSV y devuelve una lista de transacciones. + Cada transacción es un diccionario con las claves 'id', 'tipo' y 'monto'. + """ + transactions = [] + try: + with open(file_path, mode='r', encoding='utf-8') as file: + reader = csv.DictReader(file) + for row in reader: + transaction = { + 'id': int(row['id']), + 'tipo': row['tipo'], + 'monto': float(row['monto']) + } + transactions.append(transaction) + except FileNotFoundError: + print(f"Error: El archivo '{file_path}' no fue encontrado.") + exit(1) + except Exception as e: + print(f"Error al leer el archivo: {e}") + exit(1) + return transactions + +def calculate_balance(transactions): + """ + Calcula el balance final sumando los créditos y restando los débitos. + """ + credit_total = sum(t['monto'] for t in transactions if t['tipo'] == 'Crédito') + debit_total = sum(t['monto'] for t in transactions if t['tipo'] == 'Débito') + return credit_total - debit_total + +def find_highest_transaction(transactions): + """ + Encuentra la transacción con el monto más alto. + Devuelve una tupla con el ID y el monto. + """ + highest = max(transactions, key=lambda t: t['monto']) + return highest['id'], highest['monto'] + +def count_transaction_types(transactions): + """ + Cuenta el número de transacciones por tipo ('Crédito' y 'Débito'). + """ + credit_count = sum(1 for t in transactions if t['tipo'] == 'Crédito') + debit_count = sum(1 for t in transactions if t['tipo'] == 'Débito') + return credit_count, debit_count + +def generate_report(transactions): + """ + Genera el reporte final basado en las transacciones. + """ + balance_final = calculate_balance(transactions) + highest_id, highest_amount = find_highest_transaction(transactions) + credit_count, debit_count = count_transaction_types(transactions) + + print("Reporte de Transacciones") + print("---------------------------------------------") + print(f"Balance Final: {balance_final:.2f}") + print(f"Transacción de Mayor Monto: ID {highest_id} - {highest_amount:.2f}") + print(f"Conteo de Transacciones: Crédito: {credit_count} Débito: {debit_count}") + +if __name__ == "__main__": + # Ruta al archivo CSV + file_path = 'data.csv' + + # Leer y procesar las transacciones + transactions = read_transactions(file_path) + + # Generar el reporte + generate_report(transactions) \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..e69de29