Componentes: Bruno Eduardo Luy, Maria Eduarda Neppel, Bernardo Elias Luy, Matheus Kauan Dums.
Objetivos: O objetivo do projeto, além de aumentar nosso conhecimentos em OO, era conseguir simular com certa eficiência um consultório médico, apesar de ter diversos parâmetros que poderíamos aprimorar para entregar um trabalho de maior relevância e utilização real. Acreditamos que o objetivo de simular um Consultório, com novos médicos, novos pacientes, agendamento de consulta, e poder excluir ou desmarcar qualquer parâmetro citado anteriormente, foi atingido com sucesso!
Metodologia de desenvolvimento: A metodologia foi iterativa e incremental. Fizemos funções separadas, testando elas em suas partes do código, para assim unir elas e alcançar o objetivo esperado, utilizando tratamento de erros para garantir o resultado que queríamos.
import time
from colorama import Fore, init
import json
import os
init()
# Classe Pessoa
class Pessoa:
def __init__(self, nome, cpf):
self.nome = nome
self.cpf = cpf
def __str__(self):
return f"{self.nome} || CPF: {self.cpf} "
# Classe NovoPaciente
class NovoPaciente(Pessoa):
def __init__(self, nome, cpf, idade):
super().__init__(nome, cpf)
self.idade = idade
def __str__(self):
return Fore.BLUE + f"{self.nome}" + Fore.CYAN + f" | " + Fore.BLUE + f"CPF: {self.cpf}" + Fore.CYAN + ' | ' + Fore.BLUE + f" Idade: {self.idade}"
# Classe NovoMedico
class NovoMedico(Pessoa):
def __init__(self, nome, cpf, especialidade, crm):
super().__init__(nome, cpf)
self.especialidade = especialidade
self.crm = crm
def __str__(self):
return Fore.BLUE + f"Dr(a) {self.nome}" + Fore.CYAN + " - " + Fore.BLUE + f"{self.especialidade}" + Fore.CYAN + ' | ' + Fore.BLUE + f"CPF: {self.cpf}" + Fore.CYAN + ' | ' + Fore.BLUE + F"CRM: {self.crm}"
# Classe AgendarConsulta
class AgendarConsulta:
def __init__(self, data, horario, medico, paciente):
self.data = data
self.horario = horario
self.medico = medico
self.paciente = paciente
self.status = "Confirmada"
def cancelar(self):
self.status = "Cancelada"
def __str__(self):
if self.status == "Confirmada":
status_cor = Fore.GREEN
elif self.status == "Cancelada":
status_cor = Fore.RED
else:
status_cor = Fore.YELLOW
return (
Fore.CYAN + f"Consulta: " + Fore.BLUE + f"{self.data}" + Fore.CYAN + " às " + Fore.BLUE + f"{self.horario}\n" +
Fore.CYAN + f"Médico: " + Fore.BLUE + f"{self.medico}\n" +
Fore.CYAN + f"Paciente: " + Fore.BLUE + f"{self.paciente}\n" +
Fore.CYAN + f"Status: " + status_cor + f"{self.status}"
)
#Sistema Geral que faz o Funcionamento
class SistemaGeral():
def __init__(self):
self.medicos = []
self.pacientes = []
self.consultas = []
self.carregar_dados()
# def adicionarPaciente
def cadastro_de_Paciente(self):
nome = input(Fore.BLUE + "Nome do Paciente: " + Fore.GREEN)
cpf = input(Fore.BLUE + "CPF do Paciente: " + Fore.GREEN)
idade = int(input(Fore.BLUE + "Idade do Paciente: " + Fore.GREEN))
self.pacientes.append(NovoPaciente(nome, cpf, idade))
print(Fore.BLUE + "Paciente Cadastrado com Sucesso!")
# def ListarPacientes
def listarPacientes(self):
if self.pacientes:
for i, paciente in enumerate(self.pacientes, start=1):
print(Fore.CYAN + f"[{i}] {paciente}")
else:
print(Fore.CYAN + "Nenhum Paciente Cadastrado!")
# def adicionarMedico
def cadastro_de_Medico(self):
nome = input(Fore.BLUE + "Nome do Médico: " + Fore.GREEN)
cpf = input(Fore.BLUE + "CPF do Médico: " + Fore.GREEN)
especialidade = input(Fore.BLUE + "Especialidade do Médico: " + Fore.GREEN)
crm = input(Fore.BLUE + "CRM: " + Fore.GREEN)
self.medicos.append(NovoMedico(nome, cpf, especialidade, crm))
print(Fore.BLUE + "Médico Cadastrado com Sucesso!")
# def ListarMedicos
def listarMedicos(self):
if self.medicos:
for i, medico in enumerate(self.medicos, start=1):
print(Fore.CYAN + f"[{i}] {medico}")
else:
print(Fore.CYAN + "Nenhum Médico Cadastrado!")
# def marcarConsulta
def marcarConsulta(self):
self.listarMedicos()
try:
medico_index = int(input(Fore.BLUE + "Escolha um Médico pelo índice: " + Fore.GREEN))-1
if medico_index < 0 or medico_index >= len(self.medicos):
raise IndexError(Fore.RED + "Número de Médico inválido!")
self.listarPacientes()
paciente_index = int(input(Fore.BLUE + "Escolha um Paciente pelo índice: " + Fore.GREEN)) - 1
if paciente_index < 0 or paciente_index >= len(self.pacientes):
raise IndexError(Fore.RED + "Número de Paciente inválido!")
data = input(Fore.BLUE + "Data da Consulta (DD/MM/AAAA): " + Fore.GREEN)
hora = input(Fore.BLUE + "Hora da Consulta (HH:MM): " + Fore.GREEN)
consulta = AgendarConsulta(
data, hora, self.medicos[medico_index], self.pacientes[paciente_index])
self.consultas.append(consulta)
print(Fore.BLUE + "Consulta Agendada com Sucesso!")
print()
except ValueError:
print(Fore.RED + "Entrada Inválida. Certifique-se de digitar um número.")
print()
except IndexError as e:
print(e)
print()
# def ListarConsultas
def listarConsultas(self):
if self.consultas:
for consulta in self.consultas:
print(consulta)
print()
else:
print(Fore.RED + "Nenhuma consulta esta agendada!")
def excluirPaciente(self):
if self.pacientes:
print(Fore.CYAN + "Pacientes no Sistema: ")
for i, paciente in enumerate(self.pacientes, start=1):
print(Fore.CYAN + f"{i}." + Fore.BLUE + f" {paciente}")
try:
print()
paciente_index = int(input(Fore.BLUE + "Escolha pelo índice: "+ Fore.GREEN))-1
if paciente_index < 0 or paciente_index >= len(self.pacientes):
raise IndexError(Fore.RED + "Número do Paciente inválido.")
del self.pacientes[paciente_index]
print(Fore.BLUE + "Paciente Excluído com Sucesso!")
except ValueError:
print(Fore.RED + "Entrada Inválida. Por favor, insira um número.")
except IndexError as e:
print(e)
else:
print(Fore.BLUE + "Nenhum Paciente no Sistema!")
def excluirMédico(self):
if self.medicos:
print(Fore.CYAN + "Médicos no Sistema: ")
for i, medico in enumerate(self.medicos, start=1):
print(Fore.CYAN + f"{i}." + Fore.BLUE + f" {medico}")
try:
print()
medico_index = int(input(Fore.BLUE + "Escolha pelo índice: "+ Fore.GREEN))-1
if medico_index < 0 or medico_index >= len(self.medicos):
raise IndexError(Fore.RED + "Número do Médico inválido.")
del self.medicos[medico_index]
print(Fore.BLUE + "Médico Excluído com Sucesso!")
except ValueError:
print(Fore.RED + "Entrada Inválida. Por favor, insira um número.")
except IndexError as e:
print(e)
else:
print(Fore.BLUE + "Nenhum Médico no Sistema!")
def cancelarConsultas(self):
if self.consultas:
print(Fore.BLUE + "Consultas Agendadas:")
for i, consulta in enumerate(self.consultas, start=1):
print(Fore.CYAN+ f"{i}. " + Fore.BLUE + f"{consulta}")
try:
consulta_index = int(input(Fore.BLUE + "Escolha pelo índice: "+ Fore.GREEN))-1
if consulta_index < 0 or consulta_index >= len(self.consultas):
raise IndexError(Fore.RED + "Número de Consulta inválido.")
self.consultas[consulta_index].cancelar()
print(Fore.BLUE + "Consulta Cancelada com Sucesso!")
del self.consultas[consulta_index]
except ValueError:
print(Fore.RED + "Entrada Inválida. Por favor, insira um número.")
except IndexError as e:
print(e)
else:
print(Fore.BLUE + "Nenhuma Consulta Agendada!")
def salvar_dados(self):
dados = {
"medicos": [medico.__dict__ for medico in self.medicos],
"pacientes": [paciente.__dict__ for paciente in self.pacientes],
"consultas": [
{
"data": consulta.data,
"horario": consulta.horario,
"medico": consulta.medico.__dict__,
"paciente": consulta.paciente.__dict__,
"status": consulta.status,
}
for consulta in self.consultas
],
}
with open("dados.json", "w") as arquivo:
json.dump(dados, arquivo, indent=4)
print("Dados salvos com sucesso!")
def carregar_dados(self):
if not os.path.exists("dados.json"):
return
try:
with open("dados.json", "r") as arquivo:
dados = json.load(arquivo)
self.medicos = [NovoMedico(**medico) for medico in dados.get("medicos", [])]
self.pacientes = [NovoPaciente(**paciente) for paciente in dados.get("pacientes", [])]
self.consultas = [
AgendarConsulta(
consulta["data"],
consulta["horario"],
NovoMedico(**consulta["medico"]),
NovoPaciente(**consulta["paciente"]),
)
for consulta in dados.get("consultas", [])
]
print(Fore.CYAN + "Dados carregados com sucesso!")
except Exception as e:
print(f"Erro ao carregar os dados: {e}")
# def Menu geral
def menu(self):
while True:
time.sleep(3)
print(Fore.CYAN + "=-"*20)
print(Fore.BLUE + "Menu")
print(Fore.CYAN + "1." + Fore.BLUE + " Cadastrar Paciente")
print(Fore.CYAN + "2." + Fore.BLUE + " Cadastrar Médico")
print(Fore.CYAN + "3." + Fore.BLUE + " Lista de Pacientes")
print(Fore.CYAN + "4." + Fore.BLUE + " Lista de Médicos")
print(Fore.CYAN + "5." + Fore.BLUE + " Marcar Consulta")
print(Fore.CYAN + "6." + Fore.BLUE + " Listar Consultas")
print(Fore.CYAN + "7." + Fore.BLUE + " Excluir Paciente")
print(Fore.CYAN + "8." + Fore.BLUE + " Excluir Médico")
print(Fore.CYAN + "9." + Fore.BLUE + " Cancelar Consulta")
print(Fore.CYAN + "10." + Fore.BLUE + " Sair")
print()
try:
escolha = int(input("Escolha de acordo com o menu: " + Fore.GREEN))
if escolha == 1:
print(Fore.CYAN + "=-"*20)
print()
self.cadastro_de_Paciente()
elif escolha == 2:
print(Fore.CYAN + "=-"*20)
print()
self.cadastro_de_Medico()
elif escolha == 3:
print(Fore.CYAN + "=-"*20)
print()
self.listarPacientes()
elif escolha == 4:
print(Fore.CYAN + "=-"*20)
print()
self.listarMedicos()
elif escolha == 5:
print(Fore.CYAN + "=-"*20)
print()
self.marcarConsulta()
elif escolha == 6:
print(Fore.CYAN + "=-"*20)
print()
self.listarConsultas()
elif escolha == 7:
print(Fore.CYAN + "=-"*20)
print()
self.excluirPaciente()
elif escolha == 8:
print(Fore.CYAN + "=-"*20)
print()
self.excluirMédico()
elif escolha == 9:
print(Fore.CYAN + "=-"*20)
print()
self.cancelarConsultas()
elif escolha == 10:
print(Fore.CYAN + "=-"*20)
print()
print(Fore.BLUE + "Saindo do programa...")
self.salvar_dados()
break
else:
print(Fore.RED + "Opção Inválida!")
except ValueError as e:
print(Fore.RED + f"Por favor, um número Inteiro! {e}")
#main para rodar o código
def main():
sistema = SistemaGeral()
sistema.menu()
if __name__ == "__main__":
main()