Parte 24 — MiniFinance del capítulo
Objetivo de esta versión
MiniFinance podrá:
- Validar datos básicos.
- Asignar valores predeterminados.
- Interpretar la moneda.
- Evitar porcentajes inválidos.
- Evitar divisiones entre cero.
- Clasificar el estado del presupuesto.
- Clasificar una meta de ahorro.
- Procesar una opción de menú.
- Registrar un ingreso.
- Registrar un gasto.
- Rechazar operaciones inválidas.
- Mostrar mensajes específicos.
Código completo
# Configuración de la aplicación
NOMBRE_APLICACION = "MINIFINANCE"
VERSION = "0.5"
# Encabezado
print("=" * 44)
print(f" {NOMBRE_APLICACION}")
print("=" * 44)
print(f"Versión: {VERSION}")
print()
# Información del usuario
nombre_usuario = input(
"Nombre del usuario: "
).strip()
if not nombre_usuario:
nombre_usuario = "Usuario"
nombre_cuenta = input(
"Nombre de la cuenta: "
).strip()
if not nombre_cuenta:
nombre_cuenta = "Cuenta principal"
moneda = input(
"Moneda, por ejemplo CRC, USD o JPY: "
).strip().upper()
if moneda == "CRC":
nombre_moneda = "Colones"
elif moneda == "USD":
nombre_moneda = "Dólares"
elif moneda == "JPY":
nombre_moneda = "Yenes"
else:
print(
"Moneda no reconocida. "
"Se utilizará CRC."
)
moneda = "CRC"
nombre_moneda = "Colones"
# Estado de la cuenta
respuesta_activa = input(
"¿La cuenta está activa? "
).strip().lower()
if (
respuesta_activa == "si"
or respuesta_activa == "sí"
or respuesta_activa == "s"
):
cuenta_activa = True
elif (
respuesta_activa == "no"
or respuesta_activa == "n"
):
cuenta_activa = False
else:
print(
"Respuesta no reconocida. "
"La cuenta se marcará como inactiva."
)
cuenta_activa = False
# Información financiera
print()
print("Información financiera")
print()
saldo_inicial = int(
input("Saldo inicial: ")
)
if saldo_inicial < 0:
print(
"El saldo inicial no puede ser negativo. "
"Se utilizará cero."
)
saldo_inicial = 0
presupuesto_mensual = int(
input("Presupuesto mensual: ")
)
if presupuesto_mensual < 0:
print(
"El presupuesto no puede ser negativo. "
"Se utilizará cero."
)
presupuesto_mensual = 0
meta_ahorro = int(
input("Meta de ahorro: ")
)
if meta_ahorro < 0:
print(
"La meta no puede ser negativa. "
"Se utilizará cero."
)
meta_ahorro = 0
# Estado inicial
saldo_actual = saldo_inicial
total_ingresos = 0
total_gastos = 0
cantidad_ingresos = 0
cantidad_gastos = 0
datos_modificados = False
# Menú
print()
print("=" * 44)
print(" MENÚ")
print("=" * 44)
print()
print("1. Ver saldo")
print("2. Registrar ingreso")
print("3. Registrar gasto")
print("4. Ver resumen")
print("5. Salir")
print()
opcion = input(
"Selecciona una opción: "
).strip()
# Procesar opción
if opcion == "1":
print()
print(f"Saldo actual: {saldo_actual} {moneda}")
elif opcion == "2":
ingreso = int(
input("Monto del ingreso: ")
)
if not cuenta_activa:
print(
"No puedes registrar movimientos "
"en una cuenta inactiva."
)
elif ingreso <= 0:
print(
"El ingreso debe ser mayor que cero."
)
else:
saldo_actual += ingreso
total_ingresos += ingreso
cantidad_ingresos += 1
datos_modificados = True
print("Ingreso registrado correctamente.")
print(
f"Nuevo saldo: "
f"{saldo_actual} {moneda}"
)
elif opcion == "3":
gasto = int(
input("Monto del gasto: ")
)
if not cuenta_activa:
print(
"No puedes registrar movimientos "
"en una cuenta inactiva."
)
elif gasto <= 0:
print(
"El gasto debe ser mayor que cero."
)
elif gasto > saldo_actual:
print("Saldo insuficiente.")
else:
saldo_actual -= gasto
total_gastos += gasto
cantidad_gastos += 1
datos_modificados = True
print("Gasto registrado correctamente.")
print(
f"Nuevo saldo: "
f"{saldo_actual} {moneda}"
)
elif opcion == "4":
print()
print("=" * 44)
print(" RESUMEN")
print("=" * 44)
print()
print(f"Usuario: {nombre_usuario}")
print(f"Cuenta: {nombre_cuenta}")
print(
f"Moneda: {nombre_moneda} "
f"({moneda})"
)
print(f"Cuenta activa: {cuenta_activa}")
print()
print(
f"Saldo inicial: "
f"{saldo_inicial} {moneda}"
)
print(
f"Total de ingresos: "
f"{total_ingresos} {moneda}"
)
print(
f"Total de gastos: "
f"{total_gastos} {moneda}"
)
print(
f"Saldo actual: "
f"{saldo_actual} {moneda}"
)
print()
if cantidad_gastos > 0:
promedio_gastos = (
total_gastos / cantidad_gastos
)
print(
f"Promedio de gastos: "
f"{round(promedio_gastos, 2)} "
f"{moneda}"
)
else:
print(
"Promedio de gastos: "
"no disponible"
)
if total_ingresos > 0:
porcentaje_gastado = (
total_gastos / total_ingresos
) * 100
print(
f"Porcentaje gastado: "
f"{round(porcentaje_gastado, 2)} %"
)
else:
print(
"Porcentaje gastado: "
"no disponible"
)
print()
if presupuesto_mensual <= 0:
print(
"Presupuesto: no configurado"
)
else:
porcentaje_presupuesto = (
total_gastos / presupuesto_mensual
) * 100
print(
f"Presupuesto mensual: "
f"{presupuesto_mensual} {moneda}"
)
print(
f"Presupuesto utilizado: "
f"{round(porcentaje_presupuesto, 2)} %"
)
if porcentaje_presupuesto >= 100:
print(
"Estado del presupuesto: "
"agotado o superado"
)
elif porcentaje_presupuesto >= 80:
print(
"Estado del presupuesto: "
"casi agotado"
)
elif porcentaje_presupuesto >= 50:
print(
"Estado del presupuesto: "
"uso moderado"
)
else:
print(
"Estado del presupuesto: "
"bajo control"
)
print()
if meta_ahorro <= 0:
print("Meta de ahorro: no configurada")
else:
progreso_meta = (
saldo_actual / meta_ahorro
) * 100
print(
f"Meta de ahorro: "
f"{meta_ahorro} {moneda}"
)
print(
f"Progreso: "
f"{round(progreso_meta, 2)} %"
)
if saldo_actual >= meta_ahorro:
cantidad_adicional = (
saldo_actual - meta_ahorro
)
print("Estado de la meta: alcanzada")
print(
f"Cantidad adicional: "
f"{cantidad_adicional} {moneda}"
)
else:
dinero_faltante = (
meta_ahorro - saldo_actual
)
print(
f"Dinero faltante: "
f"{dinero_faltante} {moneda}"
)
if progreso_meta >= 75:
print(
"Estado de la meta: "
"muy cerca"
)
elif progreso_meta >= 50:
print(
"Estado de la meta: "
"más de la mitad"
)
elif progreso_meta > 0:
print(
"Estado de la meta: "
"en progreso"
)
else:
print(
"Estado de la meta: "
"sin comenzar"
)
elif opcion == "5":
print("Cerrando MiniFinance...")
else:
print("La opción seleccionada no es válida.")
# Estado final
print()
if datos_modificados:
print(
"Existen cambios pendientes de guardar."
)
else:
print(
"No se realizaron cambios financieros."
)
print()
input("Presiona Enter para cerrar...")Una limitación importante
Al iniciar el programa:
total_ingresos = 0
total_gastos = 0
cantidad_gastos = 0Si el usuario selecciona una sola opción, solo puede realizar una acción.
Por ejemplo:
- Registra un ingreso.
- El programa muestra el resultado.
- El programa termina.
No puede regresar al menú.
Tampoco puede registrar varios ingresos y gastos durante la misma sesión.
Resolveremos esto con bucles.
Otra limitación importante
Este código todavía utiliza:
int(input(...))Si el usuario escribe:
holaen lugar de un número, el programa se detendrá con ValueError.
Las condiciones pueden rechazar números negativos o cero después de convertirlos.
Pero no pueden proteger por sí solas una conversión que falla.
Ese problema se resolverá cuando aprendamos manejo de errores.