diff --git a/README.md b/README.md index 668a6a2..68409f4 100644 --- a/README.md +++ b/README.md @@ -1,66 +1,41 @@ # 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 reto técnico consiste en procesar un archivo CSV que contiene información de transacciones bancarias y mostrar un reporte con los siguientes datos: +- balance final +- ID y transacción de mayor monto +- Número total de transacciones por tipo de transacción, débito o crédito. -- **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". +## Instrucciones de ejecución: -- **Transacción de Mayor Monto:** - Identificar el ID y el monto de la transacción con el valor más alto. +Ejecutar el programa con Python y pasar como argumento el archivo que contiene la información de transacciones. -- **Conteo de Transacciones:** - Número total de transacciones para cada tipo ("Crédito" y "Débito"). +- En Windows: python reporte_transacciones.py data.csv +- En Linux: python3 reporte_transacciones.py data.csv ---- +## Enfoque y solución: -## Instrucciones +La solución ha sido desarrollada usando el lenguaje de programación Python. -1. **Repositorio Base:** - Clona o haz un fork del repositorio base disponible en: - `https://github.com/codeableorg/interbank-academy-25` +1. **Lógica de implementación** -2. **Entrada de Datos:** - La aplicación deberá leer un archivo CSV. Ejemplo de contenido: + La lógica de implementación consiste en leer y extraer la información del archivo csv. Luego se decidió trabajar con centavos para el procesamiento de los montos de las transacciones con el fin de evitar errores de precisión con los decimales. Finalmente se muestran los resultados requeridos convertidos en formato moneda, dinero real. - ``` - 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: + El procesamiento consiste en leer fila por fila el contenido del archivo csv y extraer por cada fila el id, tipo y monto de cada transacción. En cada lectura se extrae información y se van realizando operaciones con cada valor extraído: + - Se van sumando los montos según el tipo de transacción y se va contabilizando si la transacción fue "Crédito" o "Débito". + - Se va comparando cada monto con el monto de la fila o transacción anterior para encontrar el monto mayor de todas las transacciones. + +2. **Decisiones de diseño** - ``` - 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 - ``` + - Se eligió trabajar en centavos haciendo conversiones para mejorar la precisión del resultado de balance final. + - Se decidió pasar el archivo csv como argumento para mayor flexibilidad durante la ejecución en la terminal. + - Se organizó el código en funciones para una mayor legibilidad. -4. **Lenguaje de Programación:** - Utiliza el lenguaje de tu preferencia. Opciones recomendadas: +## Estructura del proyecto - - Python - - Java - - C# - - JavaScript (Node.js) +El archivo principal es reporte_transacciones.py que contiene toda la implementación del proyecto. -5. **README del Proyecto:** - Incluye un archivo `README.md` con la siguiente estructura: +Es necesario pasar como argumento el archivo csv que contiene la información de las transacciones. - - **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. diff --git a/reporte_transacciones.py b/reporte_transacciones.py new file mode 100644 index 0000000..1e0bbdc --- /dev/null +++ b/reporte_transacciones.py @@ -0,0 +1,62 @@ +import sys +import csv + +# Convierte un monto de dinero real (moneda) a centavos +def convertir_a_centavos(monto): + return int(round(monto * 100)) + +# Convierte un monto de centavos a dinero real (moneda) +def convertir_a_moneda(centavos): + return centavos / 100 + +#Funcion para procesar el contenido del archivo csv +def procesar_transacciones(archivo): + + # Inicializacion de variables + total_debitos_cent = 0 # Total acumulado de los montos debito en centavos + total_creditos_cent = 0 # Total acumulado de los montos credito en centavos + monto_mayor_cent = 0 # Monto mayor en centavos + cantidad_creditos = 0 + cantidad_debitos = 0 + id_monto_mayor = None + + # Lectura del archivo csv + with open(archivo, newline='', encoding='utf-8') as csvfile: + lector = csv.reader(csvfile) + next(lector) # Se salta la primera fila, el encabezado + + # Extraccion de informacion fila por fila + for fila in lector: + id = fila[0] + tipo = fila[1] + monto = float(fila[2]) + monto_centavos = convertir_a_centavos(monto) # Se convierte el monto a centavos para evitar errores de precision con decimales + + # Suma de montos en centavos por tipo de transaccion + if tipo == 'Crédito': + total_creditos_cent += monto_centavos + cantidad_creditos += 1 # Conteo de transacciones por tipo + elif tipo == 'Débito': + total_debitos_cent += monto_centavos # Conteo de transacciones por tipo + cantidad_debitos += 1 + + # Calculo de transaccion de monto mayor + if monto_centavos > monto_mayor_cent: + monto_mayor_cent = monto_centavos + id_monto_mayor = id + + # Mostrar reporte de resultados + print("Reporte de Transacciones") + print("-----------------------------------------------------") + print("Balance Final: ", convertir_a_moneda(total_creditos_cent-total_debitos_cent)) # Se convierte el balance final en dinero real debido a que esta en centavos + print("Transacción de Mayor Monto: ID ",id_monto_mayor," - ", convertir_a_moneda(monto_mayor_cent)) # Se convierte el monto mayor en dinero real debido a que esta en centavos + print("Conteo de Transacciones: Crédito: ", cantidad_creditos, " Débito: ", cantidad_debitos) + +if __name__ == "__main__": + #Se verifica que se pase el archivo csv como argumento + if len(sys.argv) < 2: + print("Uso Windows: python reporte_transacciones.py data.csv") + print("Uso Linux: python3 reporte_transacciones.py data.csv") + else: + archivo = sys.argv[1] + procesar_transacciones(archivo)#Se llama a la funcion para procesar el archivo \ No newline at end of file