# Proteção da base de dados O Git guarda o código versionado, não os registos do MySQL nem os ficheiros enviados pelos utilizadores. ## Testes Executar `php vendor/phpunit/phpunit/phpunit` ou `php artisan test`. O bootstrap dos testes ignora a configuração em cache do site, remove DB_URL e força SQLite em memória. A classe base bloqueia outra ligação antes de RefreshDatabase. Não executar `migrate:fresh`, `db:wipe` ou `migrate:refresh` na base usada pela clínica. ## Cópias locais Executar `php artisan database:backup` antes de alterações à base. O script `iniciar-demonstracao.ps1` faz isso automaticamente depois de verificar o MySQL e antes de iniciar o servidor/túnel. Se a cópia falhar, o script interrompe o arranque. Iniciar por outro meio não dispara esta cópia. As cópias completas SQL e os respetivos SHA-256 ficam em `storage/app/private/database-backups`, fora da pasta pública e do Git. Nenhuma cópia anterior é apagada automaticamente. Ficheiros `.partial` representam operações incompletas e não devem ser usados para restauro. Estas cópias não incluem uploads nem `.env`. ## Destino atual: Google Drive Atualizado em 24/09/2026: a automação diária às 18h envia os ficheiros encriptados para a conta `makombeconsultoriomedico@gmail.com`, pasta https://drive.google.com/drive/folders/1IXpQpWyiTr0JxTJXY8kSREuJ0PRrZ44M. O envio usa a integração Google Drive do Codex, sem depender do OneDrive. Requer computador, Codex, MySQL e Internet disponíveis, além da integração autorizada. A automação verifica conta, nome, tamanho e pasta de destino; compara checksum remoto quando disponível. O primeiro envio foi confirmado por metadata (tamanho e pasta); o conector não expôs checksum remoto. O recibo fica em `storage/framework/encrypted-backup/google-drive-receipt.json`. As cópias anteriores do OneDrive foram preservadas. A chave continua fora da nuvem. ## Configuração anterior no OneDrive ## Avisos dentro do sistema Falhas de geração guardam automaticamente um alerta local em `storage/framework/encrypted-backup/failure-alert.json`. Nas falhas de envio/autenticação/verificação, a automação executa `php artisan backup:report-failure --stage=upload`. O sino de notificações entrega o aviso apenas a administradores, sem repetir o mesmo evento para o mesmo utilizador e respeitando a marcação como lido. O texto não inclui credenciais nem erros internos. Se a base estiver indisponível, o alerta aguarda o próximo acesso com o sistema operacional. O alerta regista uma falha passada; não é apagado por um backup posterior. Se o computador/Codex não executar a tarefa, esta implementação não deteta por si só a ausência dessa execução. Configurado em 24/09/2026: automação diária do Codex às 18h (Africa/Maputo), nesta tarefa. Requer o computador e o Codex disponíveis, MySQL ativo e OneDrive sincronizado. O script é `scripts/backup-encriptado.php`; destino: `C:/Users/HP/OneDrive/MAKOMBE-Backups`. A automação avisa em caso de falha. Não é uma tarefa do Agendador do Windows e não deve ser considerada um serviço independente do Codex. Inclui SQL completo, `.env` e ficheiros de `storage/app/private` e `storage/app/public`, excluindo cópias anteriores. Utiliza AES-256-GCM, verifica a desencriptação e a integridade da cópia antes de a finalizar. Mantém versões com nomes únicos, sem apagar as anteriores. A existência local do ficheiro não confirma a sincronização na nuvem. Monitorizar o espaço disponível. A chave está em `storage/framework/encrypted-backup/recovery.key`, fora do OneDrive, da pasta pública e do Git. Guardar uma segunda cópia num dispositivo externo seguro ou cofre de credenciais com suporte a ficheiros. Não partilhar a chave na conversa nem guardá-la junto dos backups. Sem esta chave os backups não podem ser recuperados. O script para se a chave estiver ausente. Para verificar um backup, sem alterar a base: ```powershell & C:\xampp\php\php.exe -d memory_limit=512M scripts/backup-encriptado.php --verify="CAMINHO_DO_BACKUP.enc" --key="CAMINHO_DA_CHAVE" ``` Para recuperar o ZIP, acrescentar `--export-zip="CAMINHO_LOCAL_NOVO.zip"`. Esse ZIP contém dados sem encriptação: mantê-lo fora do OneDrive/pasta pública. Inspecionar o `manifest.json`, importar o SQL primeiro numa base separada e verificar os ficheiros antes de substituir qualquer base existente. A exportação recusa sobrescrever ficheiros. Nunca restaurar diretamente sobre a base da clínica sem preservar o estado atual. Uma cópia no mesmo computador não protege contra avaria ou perda do equipamento. Confirmar sincronização no OneDrive e guardar a chave fora do computador. Não enviar dados clínicos nem credenciais para o GitHub.