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/Dockerfile b/Dockerfile new file mode 100644 index 0000000..78ad520 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,23 @@ +FROM python:3.11-slim + +ENV PYTHONDONTWRITEBYTECODE 1 +ENV PYTHONUNBUFFERED 1 + +WORKDIR /app + +RUN apt-get update \ + && apt-get install -y --no-install-recommends build-essential libpq-dev gcc \ + && rm -rf /var/lib/apt/lists/* + +COPY requirements-docker.txt /app/requirements-docker.txt + +RUN python -m pip install --upgrade pip setuptools wheel \ + && pip install -r /app/requirements-docker.txt + +COPY . /app + +RUN chmod +x /app/entrypoint.sh || true + +EXPOSE 8000 + +ENTRYPOINT ["/app/entrypoint.sh"] 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/READMEimplementation.md b/READMEimplementation.md new file mode 100644 index 0000000..847d008 --- /dev/null +++ b/READMEimplementation.md @@ -0,0 +1,293 @@ +# Implementação em Produção - SGA LSL Univesp + +## Pré-requisitos +- Servidor Linux com Docker e Docker Compose instalados +- PostgreSQL (via Docker) +- Porta 80 disponível para Nginx + +## Passo a Passo + +### 1. Clonagem e Configuração Inicial + +- Adicione os arquivos do sistema no diretório do servidor (Por ex. /home/user/python-sga-lsl-univesp) +- Entre no diretório (cd /caminho/do/sistema) + +```bash +# No diretório do projeto (onde está entrypoint.sh) +chmod +x entrypoint.sh +``` + +### 2. Configuração do Ambiente (.env) +Edite o arquivo `.env` com valores seguros para produção: + +```env +POSTGRES_USER=sga_prod_user +POSTGRES_PASSWORD=SuaSenhaSuperSeguraAqui123! +POSTGRES_DB=sga_prod_db +SECRET_KEY=SuaSecretKeySuperSeguraDePeloMenos50CaracteresAqui +DEBUG=0 +DATABASE_URL=postgres://sga_prod_user:SuaSenhaSuperSeguraAqui123!@db:5432/sga_prod_db + +# Superuser para produção +DJANGO_SUPERUSER_USERNAME=admin_cpf # CPF válido sem máscara +DJANGO_SUPERUSER_EMAIL=admin@seudominio.com +DJANGO_SUPERUSER_PASSWORD=SenhaSuperSeguraParaAdmin +``` + +**Recomendações de Segurança:** +- Use senhas fortes e únicas (mínimo 16 caracteres, com letras, números e símbolos) +- Mantenha o `DEBUG=0` em produção +- Use um `SECRET_KEY` gerado aleatoriamente (pode usar `openssl rand -hex 32`) +- Restrinja acesso ao arquivo `.env` (chmod 600) +- Considere usar variáveis de ambiente do sistema em vez de arquivo `.env` para maior segurança + +### 3. Build e Inicialização +```bash +# Build das imagens +docker-compose -f docker-compose.prod.yml build + +# Inicialização (cria banco, superuser, guichês) +docker-compose -f docker-compose.prod.yml up -d +``` + +### 4. Verificação +Acesse `http://seu-servidor` e faça login com o superuser configurado. + +Sugestão de fluxo inicial após o primeiro login: + +- **Login do administrador:** faça login usando as credenciais do superuser definidas no arquivo `.env` (campo `DJANGO_SUPERUSER_USERNAME` e `DJANGO_SUPERUSER_PASSWORD`). +- **Ajuste do perfil:** após o login, acesse a interface de administrador e edite suas próprias informações de contato/perfil para que constem corretamente no sistema. +- **Cadastrar funcionários:** comece a adicionar os funcionários no sistema pela interface de administração. Recomendamos chamar cada funcionário até o computador do administrador para que o próprio funcionário preencha ou confirme seus dados na tela — a interface é responsiva e também pode ser usada a partir de um smartphone caso prefira levar o dispositivo até o funcionário. +- **Informar acesso aos funcionários:** depois de criar a conta, informe ao funcionário a URL que ele deve digitar no navegador para acessar o sistema (ex.: `http://seu-servidor/` ou `http://seu-servidor/login`). + +- **IMPORTANTE:** Esses passos garantem que o cadastro seja feito com supervisão e que cada funcionário saiba imediatamente como acessar a aplicação. + +- **Preparar as tvs:** Cada tv tem uma url especifica (`http://seu-servidor/guiche/tv1` e `http://seu-servidor/profissional_saude/tv2`). +Instale os cabos hdmi em quaisquer computadores proximos (maximo 10m de distancia) ou alguma outra solução para que as tvs tenham acesso remoto a algum computador para exibirem a interface web (É possivel testar o navegador da própria TV caso seja Smart). +Esses endpoints nao precisam de login. + +### 5. Configuração para Iniciar Automaticamente no Boot + +#### Opção 1: Usando systemd (Recomendado) +Crie um serviço systemd: + +```bash +sudo nano /etc/systemd/system/sga.service +``` + +Conteúdo do arquivo: +```ini +[Unit] +Description=SGA LSL Univesp +Requires=docker.service +After=docker.service + +[Service] +Type=oneshot +RemainAfterExit=yes +WorkingDirectory=/caminho/para/python-sga-LSL-Univesp +ExecStart=/usr/bin/docker-compose -f docker-compose.prod.yml up -d +ExecStop=/usr/bin/docker-compose -f docker-compose.prod.yml down +TimeoutStartSec=0 + +[Install] +WantedBy=multi-user.target +``` + +Habilite e inicie: +```bash +sudo systemctl daemon-reload +sudo systemctl enable sga.service +sudo systemctl start sga.service +``` + +#### Opção 2: Usando cron (@reboot) +Adicione ao crontab do root: +```bash +sudo crontab -e +``` + +Adicione a linha: +```cron +@reboot cd /caminho/para/python-sga-LSL-Univesp && /usr/bin/docker-compose -f docker-compose.prod.yml up -d +``` + +### 6. Manutenção +- **Logs:** `docker-compose -f docker-compose.prod.yml logs -f` +- **Backup do banco:** Use volumes Docker ou scripts externos +- **Atualizações:** Pare o serviço, atualize o código, rebuild e reinicie + +### 7. Segurança Adicional + +#### Firewall e Restrição de Acesso +Para garantir que apenas dispositivos autorizados (ex.: rede do hospital) acessem a aplicação, configure restrições por IP no Nginx e no firewall do servidor. + +##### Opção 1: Restrição no Nginx (Recomendado para Controle Fino) +Edite o arquivo `nginx.conf` e adicione as linhas `allow` e `deny` no bloco `server`: + +```nginx +server { + listen 80; + server_name localhost; + + # Restringir acesso por IP (ajuste a sub-rede do hospital) + allow 192.168.1.0/24; # Permite sub-rede específica (ex.: rede interna do hospital) + deny all; # Bloqueia todos os outros IPs + + location / { + proxy_pass http://django; + # ... resto da configuração + } + # ... outras locations +} +``` + +- Substitua `192.168.1.0/24` pela sub-rede real da rede do hospital (ex.: `10.0.0.0/8` para redes privadas). +- Após editar, reinicie o Nginx: `docker-compose -f docker-compose.prod.yml restart nginx`. + +##### Opção 2: Firewall no Servidor (ufw - Ubuntu/Debian) +Use `ufw` para restringir acesso na porta do Nginx (padrão 80, ou mude para outra como 8080 no `docker-compose.prod.yml`). + +Instale e configure o ufw (se não estiver instalado): +```bash +sudo apt update +sudo apt install ufw +sudo ufw enable +``` + +Permita apenas a sub-rede específica: +```bash +sudo ufw allow from 192.168.1.0/24 to any port 80 # Permite sub-rede na porta 80 +sudo ufw deny 80 # Bloqueia todos os outros na porta 80 +``` + +- Ajuste a sub-rede e porta conforme necessário. +- Verifique o status: `sudo ufw status`. +- Isso adiciona uma camada extra de segurança além do Nginx. + +#### Outras Medidas de Segurança +- **HTTPS**: Configure SSL no Nginx para criptografar o tráfego (use Let's Encrypt ou certificado próprio). +- **Monitoramento**: Monitore logs do Nginx e Docker regularmente: `docker-compose -f docker-compose.prod.yml logs -f nginx`. +- **Atualizações**: Mantenha Docker, Nginx, Django e dependências atualizadas para patches de segurança. +- **Backup**: Faça backups regulares do banco de dados (use volumes Docker ou ferramentas como `pg_dump`). + +### 8. HTTPS / Certificados (Passo-a-passo) + +Para produção recomendamos usar HTTPS para criptografar o tráfego mesmo em redes internas. Abaixo estão 3 opções com passos concretos. + +Opção A — Self-signed (rápido, gera aviso no navegador) + +1. Gere certificados no servidor (ex.: dentro do diretório `nginx/ssl` no repo): + +```bash +mkdir -p nginx/ssl +openssl req -x509 -nodes -days 365 \ + -newkey rsa:2048 \ + -keyout nginx/ssl/nginx.key \ + -out nginx/ssl/nginx.crt \ + -subj "/CN=sga.hospital.local" +``` + +2. Monte os arquivos no serviço `nginx` do `docker-compose.prod.yml` (exemplo): + +```yaml +services: + nginx: + volumes: + - ./nginx.conf:/etc/nginx/nginx.conf:ro + - ./nginx/ssl:/etc/nginx/ssl:ro + - staticfiles:/app/staticfiles + ports: + - "443:443" + - "80:80" +``` + +3. Adicione um bloco `server` em `nginx.conf` para TLS (exemplo): + +```nginx +server { + listen 443 ssl; + server_name sga.hospital.local; + + ssl_certificate /etc/nginx/ssl/nginx.crt; + ssl_certificate_key /etc/nginx/ssl/nginx.key; + + ssl_protocols TLSv1.2 TLSv1.3; + ssl_ciphers HIGH:!aNULL:!MD5; + + location / { + proxy_pass http://django; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + location /static/ { alias /app/staticfiles/; } + location /media/ { alias /app/media/; } +} + +server { + listen 80; + server_name sga.hospital.local; + return 301 https://$host$request_uri; +} +``` + +4. Reinicie o nginx container: + +```bash +docker-compose -f docker-compose.prod.yml up -d --no-deps --build nginx +# ou +docker-compose -f docker-compose.prod.yml restart nginx +``` + +Nota: navegadores mostrarão aviso de certificado não confiável. Use apenas para testes ou quando for aceitável confiar manualmente. + +Opção B — mkcert (boa para LAN gerenciada) + +- `mkcert` cria um CA local e pode gerar certificados confiáveis se você instalar a CA em todas as máquinas clientes (TI do hospital pode distribuir a CA via políticas): + +1. Instale `mkcert` (veja docs: https://github.com/FiloSottile/mkcert). +2. No host de administração gere os certificados: + +```bash +mkcert -install +mkcert sga.hospital.local 192.168.1.10 +# Isso gera algo como sga.hospital.local+IP.pem e key file +``` + +3. Monte as chaves em `nginx` como no passo A e reinicie. Instale a CA raiz `mkcert` nos navegadores/hosts clientes (TI). + +Opção C — Let's Encrypt (melhor se tiver domínio público) + +1. Se seu servidor tem um domínio público válido (`sga.hospital.example`) e aponta para o IP, use `certbot`: + +```bash +sudo apt update +sudo apt install certbot +sudo certbot certonly --standalone -d sga.hospital.example +``` + +2. Monte `/etc/letsencrypt/live/sga.hospital.example/fullchain.pem` e `privkey.pem` no container `nginx` (somente se terminar TLS no container). Use `certbot renew` em cron/systemd timer. + +Firewall e HSTS +- Após habilitar HTTPS, ajuste o `ufw` para permitir apenas a sub-rede hospitalar nas portas 443/80: + +```bash +sudo ufw allow from 192.168.1.0/24 to any port 443 +sudo ufw deny 443 +``` + +- Cuidado com HSTS: só ative `add_header Strict-Transport-Security` quando tiver certificados confiáveis e controle sobre os clientes (HSTS impede acesso HTTP por período configurado). + +### 9. Desinstalação completa + +- Caso tenha interesse em desinstalar completamente o sistema rode o comando + +```bash +docker-compose -f docker-compose.prod.yml down -v +``` +(Use com cuidado, remove também todos os dados do Banco de dados) + +--- diff --git a/administrador/templates/administrador/alterar_senha_funcionario.html b/administrador/templates/administrador/alterar_senha_funcionario.html new file mode 100644 index 0000000..8956851 --- /dev/null +++ b/administrador/templates/administrador/alterar_senha_funcionario.html @@ -0,0 +1,63 @@ +{% extends 'base.html' %} +{% load static %} + +{% block content %} +
Altere a senha do funcionário selecionado: {{ funcionario.first_name }} {{ funcionario.last_name }} (CPF: {{ funcionario.cpf }})
+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
+Editando: {{ funcionario.first_name }} {{ funcionario.last_name }} — CPF: {{ funcionario.cpf }}
+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 %} + + | ++ + | +
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:
-{{ senha.observacoes }}
+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
+{{ paciente.observacoes }}
+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 %} +
-
-
-