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
121 changes: 63 additions & 58 deletions README.md
Original file line number Diff line number Diff line change
@@ -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)
73 changes: 73 additions & 0 deletions main.py
Original file line number Diff line number Diff line change
@@ -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)
Empty file added requirements.txt
Empty file.