Skip to content

Commit 2c3a015

Browse files
authored
Merge pull request mouredev#7615 from Giulianovfz/main
mouredev#50 - Python
2 parents edeb28b + dca6862 commit 2c3a015

File tree

1 file changed

+238
-0
lines changed
  • Roadmap/50 - PLANIFICADOR DE OBJETIVOS DE AÑO NUEVO/python

1 file changed

+238
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,238 @@
1+
"""
2+
* EJERCICIO:
3+
* El nuevo año está a punto de comenzar...
4+
* ¡Voy a ayudarte a planificar tus propósitos de nuevo año!
5+
*
6+
* Programa un gestor de objetivos con las siguientes características:
7+
* - Permite añadir objetivos (máximo 10)
8+
* - Calcular el plan detallado
9+
* - Guardar la planificación
10+
*
11+
* Cada entrada de un objetivo está formado por (con un ejemplo):
12+
* - Meta: Leer libros
13+
* - Cantidad: 12
14+
* - Unidades: libros
15+
* - Plazo (en meses): 12 (máximo 12)
16+
*
17+
* El cálculo del plan detallado generará la siguiente salida:
18+
* - Un apartado para cada mes
19+
* - Un listado de objetivos calculados a cumplir en cada mes
20+
* (ejemplo: si quiero leer 12 libros, dará como resultado
21+
* uno al mes)
22+
* - Cada objetivo debe poseer su nombre, la cantidad de
23+
* unidades a completar en cada mes y su total. Por ejemplo:
24+
*
25+
* Enero:
26+
* [ ] 1. Leer libros (1 libro/mes). Total: 12.
27+
* [ ] 2. Estudiar Git (1 curso/mes). Total: 1.
28+
* Febrero:
29+
* [ ] 1. Leer libros (1 libro/mes). Total: 12.
30+
* ...
31+
* Diciembre:
32+
* [ ] 1. Leer libros (1 libro/mes). Total: 12.
33+
*
34+
* - Si la duración es menor a un año, finalizará en el mes
35+
* correspondiente.
36+
*
37+
* Por último, el cálculo detallado debe poder exportarse a .txt
38+
* (No subir el fichero)
39+
"""
40+
import os
41+
42+
43+
class Planificador:
44+
45+
def __init__(self):
46+
self.objetivos = {}
47+
self.planificacion = []
48+
49+
def agregar_objetivos(self, numero_objetivos):
50+
contador = 1
51+
52+
while 11 > numero_objetivos > 0:
53+
54+
numero_objetivos -= 1
55+
print(f"""\n| Ingresando el objetivo {
56+
contador} |""", end=f'\n{"¯"*28}')
57+
58+
meta = input('\n\t• Ingresa la meta: ')
59+
60+
try:
61+
cantidad = int(input('\n\t• Ingresa la cantidad: '))
62+
except ValueError:
63+
print('\nIngresa sólo números\n')
64+
65+
unidades = input('\n\t• Ingresa las unidades: ')
66+
67+
try:
68+
plazo = int(
69+
input('\n\t• Ingresa el plazo(en meses y máximo 12): '))
70+
except ValueError:
71+
print('\nIngresa sólo números\n')
72+
73+
if plazo > 12:
74+
print(
75+
'\nNo puedes ingresar más de 12 meses, ingresa todos los datos nuevamente\n')
76+
numero_objetivos += 1
77+
78+
else:
79+
self.objetivos.update(
80+
{f"objetivo{contador}": {"Meta": meta,
81+
"Cantidad": cantidad,
82+
"Unidades": unidades,
83+
"Plazo": plazo}
84+
})
85+
contador += 1
86+
87+
def calcular_plan(self):
88+
"""
89+
Calcula el plan de objetivos y los muestra en la terminal
90+
"""
91+
if self.objetivos:
92+
objetivos = [objetivo[1] for objetivo in self.objetivos.items()]
93+
mes_plazo = [objetivo[1]['Plazo']
94+
for objetivo in self.objetivos.items()]
95+
96+
max_mes = max(mes_plazo)
97+
98+
meses = ["Enero",
99+
"Febrero",
100+
"Marzo",
101+
"Abril",
102+
"Mayo",
103+
"Junio",
104+
"Julio",
105+
"Agosto",
106+
"Septiembre",
107+
"Octubre",
108+
"Noviembre",
109+
"Diciembre"
110+
]
111+
112+
for valor_mes in range(0, max_mes):
113+
114+
mes = meses[valor_mes]
115+
self.planificacion.append([mes])
116+
117+
print(f'\n\n{mes} {"—"*(11 - len(mes))}|{"—"*60}\n')
118+
119+
for ciclo, dato in enumerate(objetivos, 1):
120+
121+
if dato['Plazo'] >= (valor_mes + 1):
122+
123+
cantidad_mensual = dato['Cantidad'] / \
124+
dato['Plazo'] if dato['Cantidad'] > 1 else dato['Cantidad']
125+
126+
cantidad_total = f'{dato['Plazo']} {
127+
"Meses" if dato['Plazo'] > 1 else "Mes"}'
128+
129+
objetivo_mes = f'[ ] {ciclo}. {dato['Meta']} ({cantidad_mensual} {
130+
dato['Unidades']}/mes). Cantidad total: {cantidad_total}'
131+
132+
self.planificacion[valor_mes].append(objetivo_mes)
133+
134+
print(f'{" "*12}{objetivo_mes}')
135+
else:
136+
print(
137+
'\n\tDebes agregar los objetivos para realizar el calculo del plan detallado\n')
138+
139+
def exportar_planificacion(self):
140+
"""
141+
Acá se guarda el archivo en plan_detallado.txt con
142+
el contenido de los objetivos
143+
"""
144+
if self.planificacion:
145+
nombre_archivo = "plan_detallado.txt"
146+
ruta = os.path.join(os.path.dirname(__file__), nombre_archivo)
147+
148+
with open(ruta, "w", encoding="utf-8") as archivo:
149+
print('\n\tComenzado la exportación del archivo')
150+
151+
archivo.write('\t\t\tPlanificación de objetivos\n')
152+
for mes_planificado in self.planificacion:
153+
for planificacion in mes_planificado:
154+
155+
if mes_planificado[0] == planificacion:
156+
archivo.write(f"""\n\n{planificacion} {
157+
"—"*(11 - len(planificacion))}|{"—"*60}\n""")
158+
else:
159+
archivo.write(f'\n{" "*12}{planificacion}')
160+
161+
print(f'\n\tSe realizo con exito la exportación del plan detallado, busca el archivo: {
162+
nombre_archivo}')
163+
else:
164+
print(
165+
'\n\tPara exportar, primero debes realizar el calculo de la planificación\n')
166+
167+
168+
def cantidad_objetivos(ciclo):
169+
170+
while ciclo:
171+
172+
try:
173+
objetivos = input(
174+
'\n• Ingresa la cantidad de Objetivos(Máximo 10): ')
175+
176+
except ValueError:
177+
print('\nSolo puedes ingresar números\n')
178+
179+
if objetivos.isdigit():
180+
n_objetivo = int(objetivos)
181+
182+
if n_objetivo > 10:
183+
print('\nRecuerda solo puedes ingresar 10 objetivos\n')
184+
185+
elif n_objetivo < 0:
186+
print('\nNo puedes ingresar números negativos\n')
187+
else:
188+
ciclo = False
189+
return n_objetivo
190+
191+
192+
def menu():
193+
194+
opciones = [
195+
"1. Ingresar objetivo",
196+
"2. Calcular la planificación",
197+
"3. Exportar la planifición a un archivo .txt",
198+
"4. Salir"
199+
]
200+
201+
print('\n\n\tPlanificado de objetivos de año nuevo\n')
202+
for opcion in opciones:
203+
print(f'\t{opcion}')
204+
205+
try:
206+
n_opcion = int(input('\nIngresa una opción del menu: '))
207+
208+
except ValueError:
209+
n_opcion = '_'
210+
211+
return n_opcion
212+
213+
214+
def main():
215+
216+
plan = Planificador()
217+
218+
print('\n\tBienvenidos al Gestor de Objetivos del año nuevo')
219+
220+
while True:
221+
n_opcion = menu()
222+
223+
match n_opcion:
224+
case 1:
225+
c_objetivo = cantidad_objetivos(True)
226+
plan.agregar_objetivos(c_objetivo)
227+
case 2:
228+
plan.calcular_plan()
229+
case 3:
230+
plan.exportar_planificacion()
231+
case 4:
232+
break
233+
case _:
234+
print('\n\tError, Opción no encontrada, ingresa sólo números del menú\n')
235+
236+
237+
if __name__ == '__main__':
238+
main()

0 commit comments

Comments
 (0)