CODEZEROINTERACTIVE

Chapter 9 / 15

Parte 24 — MiniFinance del capítulo

Condiciones con if, else y elif, validaciones, decisiones de menú y reglas para MiniFinance.

Lesson 2552%

25 / 26 lessons in this chapter

Parte 24 — MiniFinance del capítulo

1 / 1 in this part

Current chapter

Chapter 9 — Condiciones: enseñar al programa a tomar decisiones

Self-paced

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

python terminal
# 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:

python terminal
total_ingresos = 0
total_gastos = 0
cantidad_gastos = 0

Si el usuario selecciona una sola opción, solo puede realizar una acción.

Por ejemplo:

  1. Registra un ingreso.
  2. El programa muestra el resultado.
  3. 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:

python terminal
int(input(...))

Si el usuario escribe:

text terminal
hola

en 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.