diff --git a/AtendimentoService.py b/AtendimentoService.py new file mode 100644 index 0000000..37b3bd3 --- /dev/null +++ b/AtendimentoService.py @@ -0,0 +1,70 @@ +from datetime import datetime +from flask import session + +class AtendimentoService: + + def __init__(self, fila, historico): + self.fila = fila + self.historico = historico + + # CONTROLE DE SESSÃO + + def get_atual(self): + return session.get('paciente_atual') + + def set_atual(self, paciente): + if paciente: + session['paciente_atual'] = paciente + else: + session.pop('paciente_atual', None) + + def get_anterior(self): + return session.get('paciente_anterior') + + def set_anterior(self, paciente): + if paciente: + session['paciente_anterior'] = paciente + else: + session.pop('paciente_anterior', None) + + + + def chamar_proximo(self): + + atual = self.get_atual() + proximo = self.fila.dequeue() + + if not proximo: + raise ValueError("Fila vazia") + + atendimento = { + **proximo, + "hora_atendimento": datetime.now().strftime("%H:%M:%S"), + "data_atendimento": datetime.now().strftime("%d/%m/%Y") + } + + self.historico.push(atendimento) + + self.set_anterior(atual) + self.set_atual(proximo) + + + def voltar_anterior(self): + + atual = self.get_atual() + anterior = self.get_anterior() + + if not atual and not anterior: + raise ValueError("Não há paciente anterior") + + + if atual: + self.fila.add_first(atual) + self.historico.pop() + + self.set_atual(anterior) + + if self.historico.size < 2: + self.set_anterior(None) + else: + self.set_anterior(self.historico.peek().prev.data) \ No newline at end of file diff --git a/TriagemService.py b/TriagemService.py new file mode 100644 index 0000000..0224e3f --- /dev/null +++ b/TriagemService.py @@ -0,0 +1,34 @@ +from datetime import datetime + +class TriagemService: + + PRIORIDADES_VALIDAS = ["normal", "urgente", "emergência"] + + def processar_dados(self, dados): + + try: + idade = int(dados.get('idade')) + except: + raise ValueError("Idade inválida") + + prioridade = dados.get('prioridade', 'normal') + + if prioridade not in self.PRIORIDADES_VALIDAS: + prioridade = "normal" + + paciente = { + 'nome': dados.get('nome'), + 'cpf': dados.get('cpf'), + 'idade': idade, + 'contato': dados.get('contato'), + 'prioridade': prioridade, + 'sintomas': dados.get('sintomas', ''), + 'hora_cadastro': datetime.now().strftime('%H:%M:%S'), + 'data_cadastro': datetime.now().strftime('%d/%m/%Y') + } + + + if not all([paciente['nome'], paciente['cpf'], paciente['contato']]): + raise ValueError("Preencha todos os campos obrigatórios") + + return paciente \ No newline at end of file diff --git a/__pycache__/estrutura_dados.cpython-313.pyc b/__pycache__/estrutura_dados.cpython-313.pyc index 5443a83..8e215ab 100644 Binary files a/__pycache__/estrutura_dados.cpython-313.pyc and b/__pycache__/estrutura_dados.cpython-313.pyc differ diff --git a/app.py b/app.py index e0f2927..941cdf1 100644 --- a/app.py +++ b/app.py @@ -1,191 +1,154 @@ from flask import Flask, render_template, request, redirect, url_for, jsonify, session from datetime import datetime -from estrutura_dados import PriorityQueue, Stack + +# Estruturas de dados +from estrutura_dados.priority_queue import PriorityQueue +from estrutura_dados.stack import Stack + +# Serviços +from services.triagem_service import TriagemService +from services.atendimento_service import AtendimentoService app = Flask(__name__) -app.secret_key = 'sua_chave_secreta_aqui_mude_em_producao' +app.secret_key = "sua_chave_secreta_aqui" -# Instâncias globais (em produção, usar banco de dados) +# Instâncias globais fila_atendimento = PriorityQueue() historico_atendimentos = Stack() -def get_paciente_atual(): - """Retorna paciente atual da sessão""" - return session.get('paciente_atual') - -def set_paciente_atual(paciente): - """Define paciente atual na sessão""" - if paciente: - session['paciente_atual'] = paciente - else: - session.pop('paciente_atual', None) - -def get_paciente_anterior(): - """Retorna paciente anterior da sessão""" - return session.get('paciente_anterior') +# Serviços +triagem_service = TriagemService() +atendimento_service = AtendimentoService(fila_atendimento, historico_atendimentos) -def set_paciente_anterior(paciente): - """Define paciente anterior na sessão""" - if paciente: - session['paciente_anterior'] = paciente - else: - session.pop('paciente_anterior', None) +# PÁGINA PRINCIPAL - -@app.route('/') +@app.route("/") def index(): - """Tela principal - fila de atendimento""" - paciente_atual = get_paciente_atual() - paciente_anterior = get_paciente_anterior() + paciente_atual = atendimento_service.get_atual() + paciente_anterior = atendimento_service.get_anterior() fila = fila_atendimento.to_list() - - return render_template('index.html', - paciente_atual=paciente_atual, - paciente_anterior=paciente_anterior, - fila=fila, - total_fila=len(fila), - total_historico=historico_atendimentos.size) + return render_template( + "index.html", + paciente_atual=paciente_atual, + paciente_anterior=paciente_anterior, + fila=fila, + total_fila=len(fila), + total_historico=historico_atendimentos.size + ) + + +# ZERAR SISTEMA (TESTES) -@app.route('/zerar') +@app.route("/zerar") def zerar(): - """Zera fila e histórico (para testes)""" global fila_atendimento, historico_atendimentos + fila_atendimento = PriorityQueue() historico_atendimentos = Stack() - set_paciente_atual(None) - set_paciente_anterior(None) - return redirect(url_for('index')) -@app.route('/historico') + atendimento_service.set_atual(None) + atendimento_service.set_anterior(None) + + return redirect(url_for("index")) + + +# HISTÓRICO + +@app.route("/historico") def historico(): - """Tela de histórico de atendimentos""" historico_list = historico_atendimentos.get_history() - - return render_template('historico.html', - historico=historico_list, - total_fila=fila_atendimento.size, - total_historico=len(historico_list)) + + return render_template( + "historico.html", + historico=historico_list, + total_fila=fila_atendimento.size, + total_historico=len(historico_list) + ) -@app.route('/cadastro') +# CADASTRO DE PACIENTE + +@app.route("/cadastro") def cadastro(): - """Tela de cadastro de paciente""" - return render_template('cadastro.html', - total_fila=fila_atendimento.size, - total_historico=historico_atendimentos.size) + return render_template( + "cadastro.html", + total_fila=fila_atendimento.size, + total_historico=historico_atendimentos.size + ) + -@app.route('/adicionar_paciente', methods=['POST']) +# ADICIONAR PACIENTE + +@app.route("/adicionar_paciente", methods=["POST"]) def adicionar_paciente(): - """Adiciona paciente à fila""" try: - paciente = { - 'nome': request.form.get('nome'), - 'cpf': request.form.get('cpf'), - 'idade': int(request.form.get('idade')), - 'contato': request.form.get('contato'), - 'prioridade': request.form.get('prioridade', 'normal'), - 'sintomas': request.form.get('sintomas', ''), - 'hora_cadastro': datetime.now().strftime('%H:%M:%S'), - 'data_cadastro': datetime.now().strftime('%d/%m/%Y') + dados = { + "nome": request.form.get("nome"), + "cpf": request.form.get("cpf"), + "idade": request.form.get("idade"), + "contato": request.form.get("contato"), + "prioridade": request.form.get("prioridade", "normal"), + "sintomas": request.form.get("sintomas", "") } - print(paciente) - - # Validações básicas - if not all([paciente['nome'], paciente['cpf'], paciente['idade'], paciente['contato']]): - return jsonify({'success': False, 'message': 'Preencha todos os campos obrigatórios'}), 400 - + + paciente = triagem_service.processar_dados(dados) + fila_atendimento.enqueue(paciente) - print(fila_atendimento.to_list()) - return redirect(url_for('index')) - + + return redirect(url_for("index")) + except Exception as e: - return jsonify({'success': False, 'message': str(e)}), 400 + return jsonify({"success": False, "message": str(e)}), 400 -@app.route('/chamar_proximo', methods=['POST']) +# CHAMAR PRÓXIMO + +@app.route("/chamar_proximo", methods=["POST"]) def chamar_proximo(): - """Chama próximo paciente da fila""" try: - # Salvar paciente atual no histórico se existir - paciente_atual = get_paciente_atual() - - # Pegar próximo da fila - proximo = fila_atendimento.dequeue() - - if proximo: - print('Chamando próximo paciente:', proximo) - atendimento = { - **proximo, - 'hora_atendimento': datetime.now().strftime('%H:%M:%S'), - 'data_atendimento': datetime.now().strftime('%d/%m/%Y') - } - historico_atendimentos.push(atendimento) - print('colocou no histórico:', atendimento) - set_paciente_anterior(paciente_atual) - print('anterior setado como:', paciente_atual) - set_paciente_atual(proximo) - print('atual setado como:', proximo) - return jsonify({'success': True}) - else: - return jsonify({'success': False, 'message': 'Fila vazia'}), 400 - + atendimento_service.chamar_proximo() + return jsonify({"success": True}) + except Exception as e: - return jsonify({'success': False, 'message': str(e)}), 400 + return jsonify({"success": False, "message": str(e)}), 400 + +# VOLTAR AO ANTERIOR -@app.route('/voltar_anterior', methods=['POST']) +@app.route("/voltar_anterior", methods=["POST"]) def voltar_anterior(): - """Volta para o paciente anterior""" try: - paciente_anterior = get_paciente_anterior() - paciente_atual = get_paciente_atual() - - if not paciente_anterior and not paciente_atual: - return jsonify({'success': False, 'message': 'Não há paciente anterior'}), 400 - - paciente_atual = get_paciente_atual() - - # Retorna paciente atual para a fila - if paciente_atual: - fila_atendimento.add_first(paciente_atual) - historico_atendimentos.pop() # Remove do histórico - print(f"removido histórico: {paciente_atual}") - print(paciente_atual) - - # Restaura paciente anterior - set_paciente_atual(paciente_anterior) - print('atual setado como:', paciente_anterior) - - set_paciente_anterior(None if historico_atendimentos.size < 2 else historico_atendimentos.peek().prev.data) - print('anterior setado como:', None if historico_atendimentos.size < 2 else historico_atendimentos.peek()) - - return jsonify({'success': True}) - + atendimento_service.voltar_anterior() + return jsonify({"success": True}) + except Exception as e: - return jsonify({'success': False, 'message': str(e)}), 400 + return jsonify({"success": False, "message": str(e)}), 400 + +# API – Fila -@app.route('/api/fila') +@app.route("/api/fila") def api_fila(): - """API para obter fila atualizada""" return jsonify({ - 'fila': fila_atendimento.to_list(), - 'total': fila_atendimento.size + "fila": fila_atendimento.to_list(), + "total": fila_atendimento.size }) -@app.route('/api/status') +# API – Status + +@app.route("/api/status") def api_status(): - """API para status geral do sistema""" return jsonify({ - 'paciente_atual': get_paciente_atual(), - 'total_fila': fila_atendimento.size, - 'total_historico': historico_atendimentos.size + "paciente_atual": atendimento_service.get_atual(), + "total_fila": fila_atendimento.size, + "total_historico": historico_atendimentos.size }) +# EXECUTAR -if __name__ == '__main__': +if __name__ == "__main__": app.run(debug=True, port=5000) \ No newline at end of file