Componentes: Lauana M. Paz Ferreira, Nicoly F. de Vargas e Agatha dos S. Floriani.
Objetivos: Desenvolver um chatbot em Python para a Prefeitura que automatize atendimentos, organize e direcione demandas com geração de protocolos, mantenha histórico rastreável e assegure a proteção de dados conforme a LGPD, proporcionando agilidade, eficiência e redução da sobrecarga presencial.
Metodologia de desenvolvimento: A metodologia utiliza Python com POO, organizando o sistema em classes para gestão de dados e registros de atendimentos com geração automática de protocolos. Funções auxiliares realizam validações, estruturam a interação e garantem persistência em arquivos JSON.
import json
import os
from datetime import datetime, time
# FUNÇÃO: Verificar horário de expediente
def verificar_horario():
agora = datetime.now().time()
periodo_manha_inicio = time(7, 30)
periodo_manha_fim = time(11, 30)
periodo_tarde_inicio = time(13, 0)
periodo_tarde_fim = time(17, 0)
dentro_manha = periodo_manha_inicio <= agora <= periodo_manha_fim
dentro_tarde = periodo_tarde_inicio <= agora <= periodo_tarde_fim
return dentro_manha or dentro_tarde
# CORES E ESTILO
RESET = "\033[0m"
AZUL = "\033[94m"
CINZA = "\033[90m"
VERDE = "\033[92m"
AMARELO = "\033[93m"
def color(texto, cor):
return f"{cor}{texto}{RESET}"
# CLASSE: Cidadao
class Cidadao:
def __init__(self, nome, cpf, telefone):
self.nome = nome
self._cpf = cpf
self.telefone = telefone
@property
def cpf(self):
return self._cpf
# CLASSE: Atendimento
class Atendimento:
contador = 0
def __init__(self, cidadao, setor, opcao, dentro_expediente):
Atendimento.contador += 1
self.cidadao = cidadao
self.setor = setor
self.opcao = opcao
self.horario = datetime.now().strftime("%d/%m/%Y %H:%M:%S")
self.protocolo = f"P-{Atendimento.contador:03d}"
self.expediente = "Dentro do expediente" if dentro_expediente else "Fora do expediente"
# Salvar no JSON
def salvar(self):
dados = {
"protocolo": self.protocolo,
"nome": self.cidadao.nome,
"cpf": self.cidadao.cpf,
"telefone": self.cidadao.telefone,
"setor": self.setor,
"opcao": self.opcao,
"horario": self.horario,
"situacao_expediente": self.expediente
}
try:
lista = json.load(open("atendimentos.json", "r", encoding="utf-8"))
except:
lista = []
lista.append(dados)
json.dump(lista, open("atendimentos.json", "w", encoding="utf-8"), indent=4, ensure_ascii=False)
# INTERFACE DE TELAS
def limpar_tela():
os.system("cls" if os.name == "nt" else "clear")
def titulo(texto):
print("\n" + color("═" * 60, AZUL))
print(color(f" {texto.center(58)} ", AZUL))
print(color("═" * 60, AZUL))
def linha():
print(color("─" * 60, CINZA))
# MENU DE SETORES
def menu():
setores = {
"1": ("Saúde", ["Consulta", "Vacinação"]),
"2": ("Educação", ["Matrícula", "Merenda"]),
"3": ("RH", ["Folha de pagamento", "Férias"]),
}
print(color("\n📋 SETORES DISPONÍVEIS", AZUL))
linha()
for k, (setor, _) in setores.items():
print(f"[{k}] {setor}")
linha()
s = input("Escolha o setor: ")
if s in setores:
setor, opcoes = setores[s]
print(color("\n📌 OPÇÕES DISPONÍVEIS", AZUL))
linha()
for i, o in enumerate(opcoes, 1):
print(f"[{i}] {o}")
print(f"[{len(opcoes)+1}] Outro problema")
linha()
o = input("Escolha a opção: ")
if o.isdigit() and 1 <= int(o) <= len(opcoes):
return setor, opcoes[int(o) - 1]
else:
return setor, "Atendimento humano"
return None, None
# PROGRAMA PRINCIPAL
def main():
limpar_tela()
titulo("SISTEMA DE ATENDIMENTO MUNICIPAL 🏛")
# Verificação inicial do horário
dentro_horario = verificar_horario()
if not dentro_horario:
print(color("\n⚠ AVISO IMPORTANTE", AMARELO))
print("🕒 Horário do atendimento humano:")
print("➡ 07:30 às 11:30")
print("➡ 13:00 às 17:00")
print(color("\n❗ Você está FORA do expediente.", AMARELO))
print("O atendimento humano está indisponível no momento.")
print("Seu registro será processado no próximo horário válido.\n")
linha()
resposta = input("Aceita os termos da LGPD? (s/n): ").lower()
if resposta != "s":
print(color("\n❌ É preciso aceitar os termos para continuar.", AMARELO))
return
limpar_tela()
titulo("DADOS DO CIDADÃO 👤")
nome = input("Nome completo: ")
cpf = input("CPF: ")
tel = input("Telefone: ")
cidadao = Cidadao(nome, cpf, tel)
limpar_tela()
titulo("ESCOLHA O SETOR 🏢")
setor, opcao = menu()
if not setor:
print(color("\n❌ Setor inválido. Atendimento encerrado.", AMARELO))
return
atendimento = Atendimento(cidadao, setor, opcao, dentro_horario)
atendimento.salvar()
limpar_tela()
titulo("ATENDIMENTO REGISTRADO ✔")
print(f"{'Campo':<20} | {'Informação':<35}")
linha()
print(f"{'Protocolo':<20} | {atendimento.protocolo:<35}")
print(f"{'Nome':<20} | {cidadao.nome:<35}")
print(f"{'CPF':<20} | {cidadao.cpf:<35}")
print(f"{'Telefone':<20} | {cidadao.telefone:<35}")
print(f"{'Setor':<20} | {setor:<35}")
print(f"{'Solicitação':<20} | {opcao:<35}")
print(f"{'Data/Hora':<20} | {atendimento.horario:<35}")
print(f"{'Expediente':<20} | {atendimento.expediente:<35}")
linha()
print(color("✔ Dados armazenados com segurança conforme a LGPD.", VERDE))
print(color("═" * 60, AZUL))
# MENSAGEM FINAL
print(color("\n🤖 Obrigada por usar o PrefeituraBot!", VERDE))
print("Em breve um atendente entrará em contato para ajudar com sua solicitação ou responder suas dúvidas. Ou caso esteja fora do expediente, no próximo turno você será atendido")
print(color("Tenha um ótimo dia! 🌟\n", AZUL))
# Rodar o sistema
if __name__ == "__main__":
main()