-
Notifications
You must be signed in to change notification settings - Fork 4k
/
mouredev.py
143 lines (100 loc) · 3.7 KB
/
mouredev.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
import os
MONTHS = [
"Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio",
"Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"
]
def show_menu():
print("\nPlanificador de objetivos:")
print("1. Añadir objetivo")
print("2. Calcular el plan detallado")
print("3. Guardar la planificación")
print("4. Salir")
class Goal:
def __init__(self, goal_name: str, amount: int, units: str, limit: int):
self.goal_name = goal_name
self.amount = amount
self.units = units
self.limit = limit
def request_goal() -> Goal:
goal_name = input("Meta: ")
while True:
try:
amount = int(input("Cantidad: "))
if amount <= 0:
print("La cantidad debe ser un número positivo.")
continue
break
except:
print("Por favor, introduce un número entero válido.")
units = input("Unidades: ")
while True:
try:
limit = int(input("Plazo en meses (máximo 12): "))
if limit <= 0 or limit > len(MONTHS):
print("El plazo debe ser un número entre 1 y 12 (meses).")
continue
break
except:
print("Por favor, introduce un número entre 1 y 12 (meses).")
return Goal(goal_name, amount, units, limit)
def calculate_detailed_plan(goals: list[Goal]) -> dict:
plan = {month: [] for month in range(1, len(MONTHS) + 1)}
for goal in goals:
month_amount = goal.amount / goal.limit
for month in range(1, goal.limit + 1):
plan[month].append(
Goal(goal.goal_name, round(month_amount, 2), goal.units, goal.amount))
return plan
def show_detailed_plan(plan: dict):
for month in range(1, len(MONTHS) + 1):
if not plan[month]:
# No hay objetivos en este mes
break
print(f"\n{MONTHS[month - 1]}: ")
for index, goal in enumerate(plan[month], start=1):
print(
f"[ ] {index}. {goal.goal_name} ({
goal.amount} {goal.units}/mes). Total: {goal.limit}.")
def save_detailed_plan(plan: dict):
file_path = os.path.join(os.path.dirname(
os.path.abspath(__file__)), "plan.txt")
with open(file_path, "w", encoding="utf-8") as file:
file.write("Plan detallado\n")
for month in range(1, len(MONTHS) + 1):
if not plan[month]:
# No hay objetivos en este mes
break
file.write(f"\n{MONTHS[month - 1]}:\n")
for index, goal in enumerate(plan[month], start=1):
file.write(
f"[ ] {index}. {goal.goal_name} ({
goal.amount} {goal.units}/mes). Total: {goal.limit}.\n")
print(f"Plan guardado con éxito en {file_path}")
goals = []
while True:
show_menu()
option = input("Elige una opción: ")
if option == "1":
if len(goals) >= 10:
print("Has alcanzado el número máximo de objetivos (10).")
else:
goal = request_goal()
goals.append(goal)
print("Objetivo añadido con éxito.")
elif option == "2":
if len(goals) == 0:
print("No hay objetivos añadidos.")
else:
plan = calculate_detailed_plan(goals)
show_detailed_plan(plan)
elif option == "3":
if len(goals) == 0:
print("No hay objetivos para guardar.")
else:
plan = calculate_detailed_plan(goals)
save_detailed_plan(plan)
elif option == "4":
print("Saliendo del planificador.")
break
else:
print("Opción inválida. Elige una opción entre 1 y 4.")