Componentes: Ana Julia Urbanek Fernandes, Laura Oliveira Amante, Larissa Dums, Gustavo Maia.
Objetivos: O objetivo deste projeto é desenvolver um sistema de gestão para farmácias, permitindo o gerenciamento eficiente de pessoas, funcionários e medicamentos, com foco em organização e controle de estoque. O sistema oferece cadastro de clientes e funcionários, controle de login para acesso seguro, registro detalhado de medicamentos, movimentação de estoque com histórico rastreável e consulta de disponibilidade. Além disso, conta com relatórios claros e uma interface intuitiva, facilitando o uso. Destina-se a pequenos e médios estabelecimentos farmacêuticos, visando agilizar operações, reduzir erros e melhorar o atendimento.
Metodologia de desenvolvimento: A metodologia utilizada foi baseada no desenvolvimento incremental e iterativo, com foco na criação de um sistema funcional e adaptável. O projeto foi dividido em módulos independentes, como gerenciamento de pessoas, medicamentos e estoque, utilizando programação orientada a objetos (POO) para organização e manutenção do código. A cada etapa, foram realizados testes e validações, garantindo a funcionalidade e corrigindo possíveis erros. A interface foi projetada para ser intuitiva e simples, facilitando a interação do usuário. Além disso, o processo incluiu documentação e coleta de feedback para melhorias contínuas.
class Pessoa:
lista_cadastro = [] # Atributo para armazenar as pessoas cadastradas
def __init__(self, cpf, nome, endereco, data_nascimento):
self.__cpf = cpf
self.__nome = nome
self.__endereco = endereco
self.__data_nascimento = data_nascimento
@classmethod
def encontra_pessoa(cls):
cpf = input("Digite o CPF da pessoa que deseja buscar: ")
for p in cls.lista_cadastro:
if p.__cpf == cpf:
print(f"Pessoa encontrada: \nCPF: {p.__cpf}\nNome: {p.__nome}\nEndereço: {p.__endereco}\nData de Nascimento: {p.__data_nascimento}")
return
print("Pessoa não encontrada.")
@classmethod
def cadastro_pessoas(cls):
while True:
cpf = input("Digite o CPF (somente números): ")
if len(str(cpf)) != 11 or not cpf.isdigit():
print("Digite um CPF válido (11 números).")
continue
nome = input("Digite o nome: ")
endereco = input("Digite o endereço (RUA, NÚMERO): ")
data_nascimento = input("Digite a data de nascimento (DD/MM/AAAA): ")
pessoa = Pessoa(cpf, nome, endereco, data_nascimento)
cls.lista_cadastro.append(pessoa)
print(f"Pessoa cadastrada com sucesso: {nome}.")
break
class Funcionario(Pessoa):
lista_funcionarios = [] # Atributo para armazenar os funcionários cadastrados
def __init__(self, cpf, nome, endereco, data_nascimento, cargo, salario):
super().__init__(cpf, nome, endereco, data_nascimento)
self.__cargo = cargo
self.__salario = salario
@classmethod
def cadastrar_funcionario(cls):
print("\n--- Cadastro de Funcionário ---")
Pessoa.cadastro_pessoas()
pessoa = Pessoa.lista_cadastro.pop() # Remove a pessoa recém-cadastrada da lista geral
cargo = input("Digite o cargo do funcionário: ")
while True:
try:
salario = float(input("Digite o salário do funcionário: R$ "))
if salario <= 0:
print("O salário deve ser maior que zero.")
else:
break
except ValueError:
print("Digite um valor numérico válido para o salário.")
funcionario = Funcionario(pessoa._Pessoa__cpf, pessoa._Pessoa__nome, pessoa._Pessoa__endereco,
pessoa._Pessoa__data_nascimento, cargo, salario)
cls.lista_funcionarios.append(funcionario)
print(f"Funcionário {funcionario._Pessoa__nome} cadastrado com sucesso!\n")
def login_funcionario():
"""
Tela de login dos funcionários.
Retorna True para login bem-sucedido, False para voltar à tela inicial.
"""
while True:
print("\n--- Tela de Login ---")
if not Funcionario.lista_funcionarios:
print("Nenhum funcionário cadastrado. Cadastre o primeiro funcionário.")
Funcionario.cadastrar_funcionario()
return True # Primeira vez, o sistema vai direto ao menu principal.
cpf = input("Digite o CPF para acessar o sistema ou 'voltar' para sair: ")
if cpf.lower() == 'voltar':
return False # Permite voltar à tela inicial.
for func in Funcionario.lista_funcionarios:
if func._Pessoa__cpf == cpf:
print(f"Bem-vindo, {func._Pessoa__nome}!")
return True # Login bem-sucedido, vai ao menu.
print("Funcionário não encontrado. Tente novamente.")
class Medicamento:
def __init__(self, nome, miligrama, laboratorio, tarja, vencimento, lote,
forma_apresentacao, quantidade_embalagem, preco, classe_terapeutica,
unidade_medida, data_fabricacao, status):
self.nome = nome
self.miligrama = miligrama
self.laboratorio = laboratorio
self.tarja = tarja
self.vencimento = vencimento
self.lote = lote
self.forma_apresentacao = forma_apresentacao
self.quantidade_embalagem = quantidade_embalagem
self.preco = preco
self.classe_terapeutica = classe_terapeutica
self.unidade_medida = unidade_medida
self.data_fabricacao = data_fabricacao
self.status = status
self.estoque = 0 # Inicializando o estoque
def __str__(self):
return (f"Medicamento: {self.nome}\n"
f"Forma de Apresentação: {self.forma_apresentacao}\n"
f"Laboratório: {self.laboratorio}\n"
f"Tarja: {self.tarja}\n"
f"Vencimento: {self.vencimento}\n"
f"Lote: {self.lote}\n"
f"Quantidade na Embalagem: {self.quantidade_embalagem}\n"
f"Preço: R${self.preco:.2f}\n"
f"Classe Terapêutica: {self.classe_terapeutica}\n"
f"Unidade de Medida: {self.unidade_medida}\n"
f"Data de Fabricação: {self.data_fabricacao}\n"
f"Status: {self.status}\n"
f"Estoque: {self.estoque} unidades")
# Método para cadastrar um novo medicamento, pedindo os dados ao usuário
@classmethod
def cadastrar_medicamento(cls):
nome = input("Nome do medicamento: ")
miligrama = int(input("Quantidade de miligrama (ex: 500): "))
laboratorio = input("Nome do laboratório: ")
tarja = input("Tarja (ex: Vermelha, Preta, etc.): ")
vencimento = input("Data de vencimento (ex: 12/2025): ")
lote = input("Número do lote: ")
forma_apresentacao = input("Forma de apresentação (ex: Comprimido, Xarope, etc.): ")
quantidade_embalagem = int(input("Quantidade por embalagem (ex: 20, 30): "))
preco = float(input("Preço do medicamento: R$"))
classe_terapeutica = input("Classe terapêutica (ex: Analgésico, Antibiótico, etc.): ")
unidade_medida = input("Unidade de medida (ex: mg, ml): ")
data_fabricacao = input("Data de fabricação (ex: 01/2024): ")
status = input("Status (ex: Disponível, Indisponível): ")
return cls(nome, miligrama, laboratorio, tarja, vencimento, lote, forma_apresentacao,
quantidade_embalagem, preco, classe_terapeutica, unidade_medida,
data_fabricacao, status)
@staticmethod
def consulta_medicamentos_disponiveis(lista_medicamentos):
print("\n--- Medicamentos Disponíveis ---")
encontrados = False
for med in lista_medicamentos:
if med.status.lower() == "disponível":
print(med)
print("-----------------------------")
encontrados = True
if not encontrados:
print("Nenhum medicamento disponível.\n")
def menu_principal():
"""
Menu principal do sistema, acessado após login bem-sucedido.
"""
from datetime import datetime
medicamentos = []
relatorios_movimentacao = []
while True:
print("\n--- Menu Principal ---")
print("1. Cadastrar pessoa")
print("2. Encontrar pessoa")
print("3. Cadastrar novo medicamento")
print("4. Adicionar estoque")
print("5. Retirar do estoque")
print("6. Exibir medicamentos cadastrados")
print("7. Relatório de movimentação do estoque")
print("8. Voltar à tela de login")
print("9. Sair do sistema")
escolha = input("Escolha uma opção: ")
if escolha == '1':
Pessoa.cadastro_pessoas()
elif escolha == '2':
Pessoa.encontra_pessoa()
elif escolha == '3':
medicamento = Medicamento.cadastrar_medicamento()
medicamentos.append(medicamento)
print(f"{medicamento.nome} cadastrado com sucesso!\n")
elif escolha == '4': # Adicionar estoque
nome = input("Digite o nome do medicamento: ")
encontrado = False
for med in medicamentos:
if med.nome.lower() == nome.lower():
quantidade = int(input(f"Quantas unidades de {med.nome} deseja adicionar? "))
movimentacao = Movimentacao("Entrada", quantidade, med, datetime.now())
movimentacao.processar_movimentacao()
relatorios_movimentacao.append(movimentacao)
encontrado = True
break
if not encontrado:
print("Medicamento não encontrado.\n")
elif escolha == '5': # Retirar do estoque
nome = input("Digite o nome do medicamento: ")
encontrado = False
for med in medicamentos:
if med.nome.lower() == nome.lower():
quantidade = int(input(f"Quantas unidades de {med.nome} deseja retirar? "))
movimentacao = Movimentacao("Saída", quantidade, med, datetime.now())
movimentacao.processar_movimentacao()
relatorios_movimentacao.append(movimentacao)
encontrado = True
break
if not encontrado:
print("Medicamento não encontrado.\n")
elif escolha == '6':
if medicamentos:
print("\n--- Medicamentos Cadastrados ---")
for med in medicamentos:
print(med)
print("-----------------------------")
else:
print("Nenhum medicamento cadastrado.\n")
elif escolha == '7':
if relatorios_movimentacao:
print("\n--- Relatório de Movimentação ---")
for mov in relatorios_movimentacao:
print(mov)
print("-----------------------------")
else:
print("Nenhuma movimentação registrada.\n")
elif escolha == '8':
print("Voltando à tela de login...")
return # Retorna para a função `iniciar_sistema`
elif escolha == '9':
print("Saindo do sistema...")
break
else:
print("Opção inválida. Tente novamente.")
def iniciar_sistema():
"""
Função principal para iniciar o sistema.
Garante que o fluxo volte à tela de login, se necessário.
"""
while True:
if login_funcionario(): # Acesso ao sistema após validação
menu_principal()
else:
print("Retornando à tela inicial...")
# Iniciar o sistema
iniciar_sistema()