Componentes: Alyne Urbanski, Guilherme Dalagnol, Letícia Lourenço Rocha, Sabrina Fernandes
Objetivos: O trabalho tem como objetivo a criação de um sistema de controle de gastos para estudantes, visto que muitos estudantes hoje em dia não controlam seus gastos, gastam mais do que recebem e não se organizam mensalmente. Com esse programa os estudantes podem cadastrar seus gastos, separar por categoria, excluir algum valor e determinar um limite de gasto.
Metodologia de desenvolvimento: Utilizamos uma metodologia colaborativa e informal, baseada na comunicação contínua por WhatsApp e encontros presenciais. O desenvolvimento foi feito de forma integrada utilizando o Visual Studio Code e a linguagem Python, com todos os membros se ajudando ao longo do processo.
#Importando biblioteca para leitura e gravação de arquivos:
import pickle
#Importando biblioteca para verificar se o arquivo existe.
import os.path
#Importando biblioteca para datas
import datetime
"""
Programa em python desenvolvido para controlar as finanças do estudantes
"""
#Definindo Classes
class Gasto:
def __init__(self, valor, categoria, desc, data=None):
self.__valor = valor
self.__categoria = categoria
self.__desc = desc
self.__data = data or datetime.date.today()
#Método para retornar uma formatação das informações
def res(self):
return f"{self.__data} - R${self.__valor:.2f} - {self.__categoria}: {self.__desc}"
def get_valor(self):
return self.__valor
def get_data(self):
return self.__data
def get_categoria(self):
return self.__categoria
def get_desc(self):
return self.__desc
#Subclasse de 'Gasto'
class GastoVariavel(Gasto):
def __init__(self, valor, categoria, desc, data, evento):
super().__init__(valor, categoria, desc, data)
self.evento = evento
#Subclasse de 'Gasto'
class GastoFixo(Gasto):
def __init__(self, valor, categoria, desc, data, freq):
super().__init__(valor, categoria, desc, data)
self.freq = freq
class Programa: #Criando Objetos, inserindo em listas e gravando arquivos...
CadastrarDespesa = [] #Criando uma Lista para cadastrar despesas
def __init__(self): #Apresentando menu
self.lerArquivo('file.dat')
self.limiteMensal = None
while True: #Menu
print("________________________________________________")
print("| CADASTRAR DESPESAS |")
print("| |")
print("| 1 - Adicionar novo gasto |")
print("| 2 - Listar todos os gastos |")
print("| 3 - Excluir gasto |")
print("| 4 - Definir/Verificar limite Mensal |")
print("| 5 - Total de gastos do mês |")
print("| 6 - Sair |")
print("________________________________________________")
opt = int(input("Escolha uma opção: "))
if opt == 1: #Adicionar gasto
self.adicionarGasto()
elif opt == 2: #Listar gastos
self.listarGasto()
elif opt == 3: #Verificar gastos
self.excluirGasto()
elif opt == 4: #Definir / Verificar limite mensal
self.verificarGasto()
elif opt == 5: #Total gastos mensal
self.gastoMensal()
elif opt == 6: #Termina o programa
self.gravarArquivo('file.dat')
break
else:
print("\nDigite uma opção válida!")
# Método para ler o arquivo
def lerArquivo(self, filename):
if os.path.isfile(filename): # Se arquivo já existe
with open(filename, 'rb') as file: # Abre o arquivo
Programa.CadastrarDespesa = pickle.load(file) # Carrega os dados
# Método para gravar o arquivo
def gravarArquivo(self, filename):
with open(filename, 'wb') as file:
pickle.dump(Programa.CadastrarDespesa, file)
file.close()
print("Arquivo '%s' gravado!" % filename)
print("Programa encerrado!")
#Criar Objetos gastos e insere na lista 'CadastrarDespesa'
def adicionarGasto(self):
print("________________________________________")
while True:
valor = float(input("Valor do gasto('0 p/sair'): R$ "))
if valor == 0:
break
categoria = input("Categoria: ")
descricao = input("Descrição: ")
data = input("Data (DD-MM-YYYY) ou Enter para hoje: ")
if data:
try:
dia, mes, ano = map(int, data.split('-'))
data = datetime.date(ano, mes, dia)
except ValueError:
print("Data em inválida ou em formato incompátivel. Utilizando a data atual.")
data = datetime.date.today()
else:
data = datetime.date.today()
while True:
tipo = input("Tipo (f p/ fixo ou v p/ variavel): ").lower()
if tipo in("v","f"):
break
print("Opção Inválida!")
if tipo == "f":
freq = input("Frequência: ")
gasto = GastoFixo(valor, categoria, descricao, data, freq)
else:
evento = input("Evento relacionado: ")
gasto = GastoVariavel(valor, categoria, descricao, data, evento)
Programa.CadastrarDespesa.append(gasto)
print("Despesa adicionada com sucesso!")
def listarGasto(self):
if not Programa.CadastrarDespesa:
print("Nenhum gasto cadastrado.")
else:
for i, gasto in enumerate(Programa.CadastrarDespesa):
print(f"{i+1}) {gasto.res()}")
def excluirGasto(self):
if not Programa.CadastrarDespesa:
print("Nenhum gasto cadastrado!")
return
print("\nGastos cadastrados:")
for i, gasto in enumerate(Programa.CadastrarDespesa):
print(f"{i+1}) {gasto.res()}")
try:
idx = int(input("\nDigite o número do gasto a excluir (0 para cancelar): "))
if idx == 0:
print("Operação cancelada!")
return
if 1 <= idx <= len(Programa.CadastrarDespesa):
gasto = Programa.CadastrarDespesa[idx-1]
confirmar = input(f"Confirma a exclusão de: {gasto.res()}? (s/n): ").strip().lower()
if confirmar == 's':
del Programa.CadastrarDespesa[idx-1]
print("Gasto exlcuído com sucesso.")
else:
print("Exclusão cancelada.")
else:
print("Número inválido.")
except ValueError:
print("Número de Gasto inválido. Digite um número.")
def verificarGasto(self):
if self.limiteMensal is None:
try:
self.limiteMensal = float(input("Defina o limite mensal de gastos: R$ "))
print("Limite mensal definido em: R$%.2f" % self.limiteMensal)
except:
print("Valor indeferido. Operacão finalizada.")
return
hoje = datetime.date.today()
mes_atual = hoje.month
ano_atual = hoje.year
total = 0
for gasto in Programa.CadastrarDespesa:
data = gasto.get_data()
if data.month == mes_atual and data.year == ano_atual:
total += gasto.get_valor()
print(f"\nGastos no mês atual({mes_atual:02d}): R${total:.2f}")
print("\nLimite mensal: R$%.2f" % self.limiteMensal)
if total > self.limiteMensal:
print("Você ultrapassou o limite de gastos!")
else:
rest = self.limiteMensal - total
print("Você ainda possui R$%.2f disponível neste mês"% rest)
def gastoMensal(self):
try:
mes = int(input("Digite o mês (1-12): "))
ano = int(input("Digite o ano: "))
except ValueError:
print("Valores inválidos. Tente novamente.")
return
encontrados = []
total = 0
for gasto in Programa.CadastrarDespesa:
data = gasto.get_data()
if data.month == mes and data.year == ano:
encontrados.append(gasto)
total += gasto.get_valor()
if not encontrados:
print(f"Nenhum gasto encontrado para {mes:02d}/{ano}.")
else:
print(f"\nGastos em {mes:02d}/{ano}:")
for i, gasto in enumerate(encontrados):
print(f"{i+1}) {gasto.res()}")
print(f"\nTotal no Mês: R${total:.2f}")
if __name__ == "__main__":
Programa()