diff --git a/.bandit b/.bandit new file mode 100644 index 0000000..072a8cc --- /dev/null +++ b/.bandit @@ -0,0 +1,11 @@ +[bandit] +exclude_dirs = __pycache__,migrations,htmlcov,staticfiles,.git,.venv,.mypy_cache,venv,tests +verbose = True +debug = True +format = json +output_file = bandit_debug_report.json + +[tool:bandit] +# Configurações específicas do Bandit +severity = all +confidence = all \ No newline at end of file diff --git a/.coveragerc b/.coveragerc new file mode 100644 index 0000000..867025e --- /dev/null +++ b/.coveragerc @@ -0,0 +1,28 @@ +[run] +source = . +omit = + */migrations/* + */__pycache__/* + */tests/* + */test_*.py + manage.py + sga/wsgi.py + sga/asgi.py + sga/settings*.py + api/* + venv/* + .venv/* + staticfiles/* + static/* + analyze_bandit_ci.py + run_bandit_separate.py + +[report] +exclude_lines = + pragma: no cover + def __repr__ + raise AssertionError + raise NotImplementedError + if __name__ == .__main__.: + class .*\bProtocol\): + @(abc\.)?abstractmethod \ No newline at end of file diff --git a/.github/workflows/django.yml b/.github/workflows/django.yml index dcb44d7..c13a343 100644 --- a/.github/workflows/django.yml +++ b/.github/workflows/django.yml @@ -37,7 +37,7 @@ jobs: run: | python -m pip install --upgrade pip pip install -r requirements.txt - pip install coverage + pip install coverage pytest pytest-django - name: Run Database Migrations env: @@ -55,16 +55,31 @@ jobs: DJANGO_SETTINGS_MODULE: sga.settings DATABASE_URL: postgres://testuser:testpass@postgres:5432/testdb run: | - coverage run --source='.' manage.py test --settings=sga.settings_test + coverage run --source=. --omit="bandit_Rodar.py,bandit_analisar.py,test_fluxocompleto2.py" manage.py test tests --pattern="*test*.py" --settings=sga.tests.settings_test coverage report coverage html + - name: Run Integration Test with HTML Report + env: + DJANGO_SETTINGS_MODULE: sga.settings + DATABASE_URL: postgres://testuser:testpass@postgres:5432/testdb + run: | + echo "Running complete integration test with HTML report generation..." + python test_fluxocompleto2.py + echo "Integration test completed successfully" + - name: Upload Coverage Report uses: actions/upload-artifact@v4 with: name: coverage-report path: htmlcov/ + - name: Upload Integration Test Report + uses: actions/upload-artifact@v4 + with: + name: integration-test-report + path: relatorio_teste_real.html + lint: runs-on: ubuntu-latest steps: @@ -99,17 +114,23 @@ jobs: pip install -r requirements.txt pip install safety bandit mypy - name: Run Safety Scan - uses: pyupio/safety-action@v1 - with: - api-key: ${{ secrets.SAFETY_API_KEY }} + run: safety scan . + env: + SAFETY_API_KEY: ${{ secrets.SAFETY_API_KEY }} - name: Run Bandit Security Linter run: | - bandit -r . --exclude venv,.git,__pycache__,.mypy_cache,staticfiles,node_modules -f html -o bandit-report.html || true + echo "Running Bandit security analysis using separate script..." + python bandit_Rodar.py + echo "Bandit analysis completed successfully" + + - name: Analyze Bandit Results + run: | + python bandit_analisar.py - name: Run MyPy Type Checking run: mypy . - name: Upload Bandit Report uses: actions/upload-artifact@v4 with: - name: bandit-report - path: bandit-report.html + name: bandit-reports + path: bandit_report.html diff --git a/.gitignore b/.gitignore index 4b0a466..e193f9c 100644 --- a/.gitignore +++ b/.gitignore @@ -180,5 +180,188 @@ cython_debug/ .cursorignore .cursorindexingignore -# Copilot Instructions -.github/copilot-instructions.md \ No newline at end of file +# Backup files +*.bak +*.backup +*~ + +# Development and testing artifacts +*.pyc +*.pyo +*.pyd +__pycache__/ +*.so +*.dll +*.dylib + +# Database and media files +*.sqlite3 +*.db +/media/ +staticfiles/ +staticfiles_build/ + +# Environment and configuration +.env +.env.* +settings/local.py +settings/production.py +settings/staging.py + +# Logs and debugging +*.log +logs/ +debug.log +django_debug.log +gunicorn.log +celery.log + +# IDE and editors +.vscode/ +.idea/ +*.swp +*.swo +*~ +.DS_Store +Thumbs.db + +# Testing and coverage +.coverage +.coverage.* +coverage.xml +htmlcov/ +.pytest_cache/ +.tox/ +.nox/ +.cache/ + +# Type checking +.mypy_cache/ +.dmypy.json +dmypy.json +.pytype/ + +# Linting and formatting +.ruff_cache/ + +# Security reports (generated by CI/CD) +bandit_*.json +bandit_report.html +safety-report.json +security_scan_*.json + +# Node.js (for frontend assets) +node_modules/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Docker and containers +.dockerignore +docker-compose.override.yml + +# Deployment and build artifacts +build/ +dist/ +*.egg-info/ +.eggs/ + +# Secrets and certificates +secrets.json +keys/ +*.key +*.pem +*.crt +*.p12 +*.pfx +*.cer + +# OS generated files +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db +desktop.ini + +# Temporary files +*.tmp +*.temp +.tmp/ +temp/ + +# Jupyter notebooks checkpoints +.ipynb_checkpoints/ + +# VS Code extensions and settings +.vscode/extensions.json +.vscode/settings.json + +# Cursor AI editor +.cursorignore +.cursorindexingignore + +# GitHub Copilot +.github/copilot-instructions.md + +# Additional Django specific +# Uncomment if you want to ignore migrations in development +# */migrations/ + +# Redis dumps +dump.rdb + +# Celery beat schedule +celerybeat-schedule +celerybeat.pid + +# Sentry config +.sentryclirc + +# AWS credentials +.aws/ + +# Google Cloud +.gcloud/ + +# Azure +.azure/ + +# Terraform +*.tfstate +*.tfvars + +# Ansible +*.retry + +# Vagrant +.vagrant/ + +# VirtualBox +*.vbox +*.vbox-prev + +# VMware +*.vmx +*.vmxf +*.vmdk +*.nvram + +# Serverless frameworks +.serverless/ + +# Local development overrides +docker-compose.override.yml +docker-compose.local.yml + +# Documentation and planning files +ROTEIRO_PI2.md +roteiro_*.md +planning_*.md +notes_*.md +ROTEIRO_TESTES.md + +# Generated test reports +relatorio_teste_real.html \ No newline at end of file diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 0000000..5cbcff5 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,11 @@ +{ + "recommendations": [ + "ms-python.python", + "ms-python.flake8", + "ms-python.mypy-type-checker", + "batisteo.vscode-django", + "bradlc.vscode-tailwindcss", + "esbenp.prettier-vscode", + "ms-vscode.vscode-json" + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..137a3e2 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,30 @@ +{ + "files.associations": { + "*.html": "html", + "**/templates/**/*.html": "django-html", + "**/templates/**": "django-html" + }, + "emmet.includeLanguages": { + "django-html": "html" + }, + "html.validate.scripts": false, + "html.validate.styles": false, + "css.validate": false, + "python.linting.enabled": true, + "python.linting.pylintEnabled": false, + "python.linting.flake8Enabled": true, + "python.linting.mypyEnabled": true, + "files.exclude": { + "**/__pycache__": true, + "**/*.pyc": true, + "**/staticfiles/": true, + "**/htmlcov/": true, + "**/.coverage": true + }, + "search.exclude": { + "**/staticfiles/": true, + "**/htmlcov/": true, + "**/__pycache__": true, + "**/*.pyc": true + } +} \ No newline at end of file diff --git a/README.md b/README.md index 1d9bec0..454152e 100644 --- a/README.md +++ b/README.md @@ -1,58 +1,70 @@ -# Sistema de Gerenciamento de Atendimento (SGA) - ILSL +# Sistema de Gerenciamento de Atendimento (SGA) - ILSL Este projeto visa informatizar e otimizar o fluxo de atendimento de pacientes no Instituto Lauro de Souza Lima, em Bauru - SP, tornando o processo mais eficiente, seguro e humanizado para profissionais e pacientes. -## Índice +## Como Funciona -- [Visão Geral](#visão-geral) -- [Funcionalidades](#funcionalidades) -- [Instalação](#instalação) -- [Testes](#testes) -- [Como Contribuir](#como-contribuir) -- [Próximos Passos e Melhorias Futuras](#próximos-passos-e-melhorias-futuras) -- [Licença](#licença) +### Fluxo de Atendimento ---- +1. **📋 Cadastro do Paciente** + - Recepcionista cadastra paciente com dados pessoais e agendamento + - Sistema valida CPF e dados automaticamente -## Visão Geral +2. **🎫 Chegada e Fila de Espera** + - Paciente chega e é direcionado para o guichê + - Recebe senha de acordo com o tipo de atendimento -O SGA foi desenvolvido em Python (Django), com o objetivo de gerenciar de forma integrada o fluxo de pacientes, organização de filas, agendamento e comunicação entre equipe médica e pacientes. Ele tem como foco principal: +3. **📢 Chamada Automática** + - Guichê ou profissional de saúde chama próximo paciente via painel + - Sistema envia notificação automática via SMS/WhatsApp + - Paciente é direcionado para o guichê ou sala correta -- Gerenciamento eletrônico da fila de espera. -- Redução de atrasos e aumento da organização interna. -- Melhoria da comunicação com os pacientes. +4. **👨⚕️ Atendimento** + - Profissional confirma início do atendimento + - Sistema registra horário de entrada na consulta ---- +5. **✅ Finalização** + - Profissional confirma fim do atendimento + - Sistema registra horário de saída e atualiza displays -## Funcionalidades - -### Implementadas - -- **Cadastro de Pacientes:** Permite cadastrar novos pacientes no sistema com validação completa de dados -- **Gerenciamento de Fila de Espera:** Organização automática da ordem de atendimento com prioridade -- **Controle de Entrada e Saída:** Registro preciso do momento em que cada paciente entra/saí da consulta -- **Histórico de Atendimentos:** Armazena o histórico completo dos atendimentos para consultas futuras -- **Sistema de Chamadas:** Integração WhatsApp para chamada automática de pacientes -- **Displays TV:** Painéis de acompanhamento em tempo real para pacientes e profissionais -- **Relatórios Avançados:** Geração de relatórios detalhados para análise de desempenho -- **Controle de Acesso:** Sistema robusto de permissões por função (administrador, recepcionista, profissional, guichê) -- **Segurança Avançada:** - - Proteções CSRF, validação de CPF completa - - Proteção contra XSS (Cross-Site Scripting) - - Proteção contra SQL Injection - - Bloqueio automático contra força bruta - - Sanitização completa de entrada -- **Interface Responsiva:** Design moderno e intuitivo para desktop e dispositivos móveis -- **Integração Contínua:** CI/CD com GitHub Actions, testes automatizados com PostgreSQL -- **Cobertura de Testes Completa:** 193 testes incluindo segurança e API Twilio +### Displays em Tempo Real ---- +- **TV do Guichê:** Mostra fila atual e próximos pacientes +- **TV das Salas:** Exibe paciente atual e sala de destino +- **Painel do Administrador:** Controle total do sistema + +## Funcionalidades Principais + +### 👥 Gestão de Usuários +- **Administrador:** Controle total, relatórios e configurações +- **Recepcionista:** Cadastro de pacientes e gerenciamento de filas +- **Profissional de Saúde:** Chamada de pacientes e controle de consultas +- **Guichê:** Atendimento inicial e distribuição de senhas + +### 📊 Monitoramento em Tempo Real +- Status online/offline dos funcionários (bolinhas coloridas) +- Displays atualizados automaticamente a cada 5 segundos + +### 📋 Relatórios e Analytics +- Relatório HTML detalhado de testes de integração +- Logs visuais categorizados por etapas (Recepcionista, Guichê, Profissional) +- Estatísticas de cobertura e performance dos testes + +### 📱 Comunicação Integrada +- Notificações automáticas via SMS/WhatsApp para guichê e profissionais de saúde +- Relatório visual de testes com logs detalhados das notificações ## Instalação -### 1. Clone o repositório +### Pré-requisitos +- Python 3.11+ +- PostgreSQL (produção) ou SQLite (desenvolvimento) +- Git + +### Passos Rápidos ```bash +# 1. Clone o repositório git clone https://github.com/lack0fcode/python-sga-LSL-Univesp.git cd python-sga-LSL-Univesp ``` @@ -75,98 +87,89 @@ source venv/bin/activate # Linux/Mac ```bash pip install -r requirements.txt -``` -### 5. Rode o servidor localmente +# 3. Configure o banco de dados +python manage.py migrate -```bash +# 4. Crie um superusuário +python manage.py createsuperuser + +# 5. Rode o servidor python manage.py runserver ``` -O sistema estará disponível em http://127.0.0.1:8000/ - ---- - -## Testes - -O projeto possui **188 testes automatizados** que cobrem as funcionalidades principais do sistema, incluindo testes de segurança abrangentes e validações completas. - -### Executando os Testes +Acesse http://127.0.0.1:8000/ e faça login! -Para executar os testes, use o comando: +## Testes e Qualidade +### Executando Testes ```bash -python manage.py test --settings=sga.settings_test -``` - -**Nota:** Os testes utilizam SQLite em memória para desenvolvimento local (rápido e isolado), mas PostgreSQL no GitHub Actions (igual ao ambiente de produção). - -### Cobertura dos Testes - -- ✅ Testes de autenticação e autorização -- ✅ Testes de cadastro e gerenciamento de pacientes -- ✅ Testes de fila de atendimento no guichê -- ✅ Testes de painel e ações do profissional de saúde -- ✅ Testes de integração WhatsApp para chamadas de pacientes -- ✅ Testes de displays TV para acompanhamento em tempo real -- ✅ Testes de relatórios e histórico de chamadas -- ✅ Testes de validação de formulários e segurança -- ✅ Testes de API endpoints -- ✅ Testes de controle de acesso e permissões -- ✅ **Testes de Segurança Avançada:** - - Proteção contra XSS (Cross-Site Scripting) - - Proteção contra SQL Injection - - Proteção contra força bruta (bloqueio de conta) - - Validações de entrada sanitizadas - -### Integração Contínua (CI/CD) +# Testes completos +python manage.py test --settings=sga.tests.settings_test -O projeto utiliza GitHub Actions para integração contínua: +# Com cobertura (excluindo arquivos de análise) +coverage run --source=. --omit="bandit_Rodar.py,bandit_analisar.py,test_fluxocompleto2.py" manage.py test tests --pattern="*test*.py" --settings=sga.tests.settings_test +coverage report -- **Testes Automatizados:** Executados em PostgreSQL (ambiente idêntico à produção) -- **Análise de Segurança:** Verificação com Bandit e Safety -- **Linting:** Validação de código com Flake8 e Black -- **Cobertura:** Relatórios detalhados de cobertura de testes - -### Arquitetura de Testes - -O sistema de testes foi projetado para máxima eficiência e confiabilidade: +# Teste de fluxo completo com relatório HTML +python test_fluxocompleto2.py +``` -- **Desenvolvimento Local:** SQLite in-memory (rápido, ~6 segundos para 188 testes) -- **CI/CD:** PostgreSQL (igual à produção, captura diferenças de comportamento) -- **APIs Externas:** Mocks completos (Twilio) para evitar custos e dependências -- **Segurança:** Testes ativos de vulnerabilidades (XSS, SQL injection, força bruta) -- **Cobertura:** 100% das funcionalidades críticas testadas - ---- +### Qualidade do Código +- ✅ **195 testes automatizados** cobrindo funcionalidades críticas +- ✅ **96% de cobertura** de testes automatizados +- ✅ **Análise de segurança** com Bandit e Safety +- ✅ **Linting** com Flake8 e Black +- ✅ **Type checking** com MyPy +- ✅ **CI/CD** automatizado no GitHub Actions +- ✅ **Workflow completo** com testes, linting e segurança +- ✅ **Relatórios automáticos** de cobertura e análise de segurança ## Segurança -O sistema implementa **múltiplas camadas de segurança** com validações ativas: - -### 🛡️ **Proteções Implementadas:** - -- **Proteção CSRF:** Todas as views estão protegidas contra ataques CSRF -- **Validação de CPF:** Validação completa com cálculo de dígitos verificadores -- **Controle de Acesso:** Sistema de permissões baseado em funções (administrador, recepcionista, profissional de saúde, guichê) -- **Proteção XSS:** Validação ativa contra scripts maliciosos em formulários -- **Proteção SQL Injection:** Django ORM com prepared statements (proteção nativa) -- **Bloqueio de Força Bruta:** Contas bloqueadas após 4 tentativas de login falhidas -- **Sanitização de Entrada:** Validação rigorosa de todos os dados de entrada -- **Configurações de Produção:** Headers de segurança, SSL/TLS obrigatório, configurações controladas por variáveis de ambiente - ---- - -Contribuições são muito bem-vindas! Siga os passos abaixo: - -1. Faça um fork deste repositório. -2. Crie uma branch para sua feature (`git checkout -b minha-feature`). -3. Commit suas mudanças (`git commit -m 'Minha nova feature'`). -4. Faça um push para a branch (`git push origin minha-feature`). -5. Abra um Pull Request. +### Proteções Implementadas +- 🔒 **Autenticação robusta** com bloqueio contra força bruta +- 🛡️ **Validação completa** de CPF e dados pessoais +- 🔐 **Controle de acesso** por funções (Admin, Recepcionista, Profissional, Guichê) +- 🚫 **Proteção contra ataques** XSS, CSRF, SQL Injection +- 📱 **Sanitização** completa de todas as entradas + +## Tecnologias Utilizadas + +- **Backend:** Python 3.11+ com Django 4.2 +- **Banco de Dados:** PostgreSQL (produção) / SQLite (desenvolvimento) +- **Frontend:** HTML5, CSS3, JavaScript (jQuery, Bootstrap) +- **APIs:** Twilio (SMS/WhatsApp) +- **Testes:** pytest, Coverage.py, unittest.mock +- **Qualidade:** Black, Flake8, MyPy, Bandit, Safety +- **CI/CD:** GitHub Actions +- **Relatórios:** HTML dinâmico com estatísticas visuais + +## Como Contribuir + +1. **Fork** o projeto +2. **Clone** sua fork: `git clone https://github.com/SEU_USERNAME/python-sga-LSL-Univesp.git` +3. **Crie uma branch** para sua feature: `git checkout -b minha-feature` +4. **Faça suas mudanças** seguindo os padrões do projeto +5. **Execute os testes:** `python manage.py test --settings=sga.tests.settings_test` +6. **Commit suas mudanças:** `git commit -m 'feat: descrição da feature'` +7. **Push para sua branch:** `git push origin minha-feature` +8. **Abra um Pull Request** + +### Padrões de Commit +- `feat:` para novas funcionalidades +- `fix:` para correções de bugs +- `docs:` para documentação +- `refactor:` para refatoração de código +- `test:` para testes + +## Suporte + +Para dúvidas ou problemas: +- 🐛 **Issues:** [GitHub Issues](https://github.com/lack0fcode/python-sga-LSL-Univesp/issues) +- 📖 **Documentação:** Este README e comentários no código --- -## Licença - -Este projeto está sob a licença MIT. Veja o arquivo `LICENSE` para mais detalhes. +**Instituto Lauro de Souza Lima - Bauru/SP** +*Sistema desenvolvido para otimizar o atendimento médico e melhorar a experiência de pacientes e profissionais.* diff --git a/administrador/templates/administrador/cadastrar_funcionario.html b/administrador/templates/administrador/cadastrar_funcionario.html index d407012..6cc0fc2 100644 --- a/administrador/templates/administrador/cadastrar_funcionario.html +++ b/administrador/templates/administrador/cadastrar_funcionario.html @@ -1,20 +1,245 @@ {% extends 'base.html' %} +{% load static %} {% block content %} -
Preencha o formulário abaixo para cadastrar um novo funcionário:
- - {% if messages %} - {% for message in messages %} - - {% endfor %} - {% endif %} +Adicione um novo funcionário ao sistema SGA
+Lista de todos os funcionários cadastrados:
- - {% if funcionarios %} -| CPF | -Nome | -Função | -Ações | -
|---|
| + CPF + | ++ Nome Completo + | ++ Função + | ++ Status + | ++ Ações + | +
|---|---|---|---|---|
| + {{ funcionario.cpf|slice:":3" }}.{{ funcionario.cpf|slice:"3:6" }}.{{ funcionario.cpf|slice:"6:9" }}-{{ funcionario.cpf|slice:"9:" }} + | +
+
+
+
+
+
+
+ {{ funcionario.first_name|first }}{{ funcionario.last_name|first }}
+
+
+
+ {% if funcionario.id in usuarios_online_ativos_ids %}
+
+ {% elif funcionario.id in usuarios_online_inativos_ids %}
+
+ {% else %}
+
+ {% endif %}
+
+
+
+
+ {{ funcionario.first_name }} {{ funcionario.last_name }}
+
+
+ {{ funcionario.email|default:"Sem email" }}
+
+ |
+ + + {{ funcionario.get_funcao_display|default:funcionario.funcao|title }} + + | ++ + {% if funcionario.is_active %}Ativo{% else %}Inativo{% endif %} + + | +
+
+
+
+ Editar
+
+
+
+ |
+
Nenhum funcionário cadastrado.
- {% endif %} +Comece cadastrando o primeiro funcionário do sistema.
+ + + Cadastrar Primeiro Funcionário + +| Severity | +Confidence | +Issue | +File | +Line | +Description | +
|---|---|---|---|---|---|
| {issue['issue_severity']} | +{issue['issue_confidence']} | +{issue['test_id']} | +{issue['filename']} | +{issue['line_number']} | +{issue['issue_text']} | +
All scanned files passed the security analysis.
+Generated on: """ + + timestamp + + """
+Gerencie as senhas e atendimentos do seu guichê
+Selecione os tipos de senha que deseja atender:
+ +Selecione os tipos de senha que deseja atender e defina as proporções:
-Nenhuma senha gerada hoje.
+Nenhuma senha gerada hoje.
+Nenhuma chamada registrada.
+Nenhuma chamada registrada.
+Escolha o guichê que você irá operar
+{{ form.guiche.errors.0 }}
+ {% endif %} + {% if form.guiche.help_text %} +{{ form.guiche.help_text }}
+ {% endif %} +Lista de pacientes para atendimento:
+Gerencie seus pacientes e atendimentos
+Nenhum paciente agendado para você.
+Você não tem pacientes agendados para atendimento no momento.
+Nenhuma chamada registrada.
+Nenhuma chamada registrada.
+Preencha o formulário abaixo para cadastrar um novo paciente:
+Preencha o formulário abaixo para cadastrar um novo paciente no sistema.
+{{ form.nome_completo.errors.0 }}
+ {% endif %} +{{ form.cartao_sus.errors.0 }}
+ {% endif %} +{{ form.horario_agendamento.errors.0 }}
+ {% endif %} +{{ form.profissional_saude.errors.0 }}
+ {% endif %} +{{ form.tipo_senha.errors.0 }}
+ {% endif %} +{{ form.telefone_celular.help_text }}
+ {% endif %} + {% if form.telefone_celular.errors %} +{{ form.telefone_celular.errors.0 }}
+ {% endif %} +{{ form.observacoes.errors.0 }}
+ {% endif %} +
-
-
-