Files
Investidor-V2/docs/investmoz/runbook.md
T
nala 250ac35fd1
tests / ci (push) Canceled after 0s
first commit
2026-09-28 10:01:09 +02:00

72 lines
4.8 KiB
Markdown

# Execução, migração de dados e rollback
## Pré-requisitos
PHP 8.4.1+ para o composer.lock instalado; composer.json declara ^8.3. Runtime compatível com composer.lock, pdo_pgsql, dependências Composer, PostgreSQL/PostGIS. Referência: PostgreSQL 16 com PostGIS 3.4 ou superior compatível; confirmar no servidor.
Usar base isolada terminada em _test. Configurar DB_CONNECTION=pgsql, DB_DATABASE=investmoz_test, DB_HOST, DB_PORT, DB_USERNAME e DB_PASSWORD no ambiente seguro; nunca versionar credenciais.
O administrador pode provisionar postgis/pgcrypto antes; caso contrário a conta de migrations necessita dessa capacidade.
## Comandos Artisan
Os ficheiros já estão criados. Para futuras alterações:
php artisan make:migration descricao_da_alteracao
php artisan migrate --pretend
php artisan migrate --seed
php artisan migrate:status
Apenas numa base de desenvolvimento descartável:
php artisan migrate:fresh --seed
php artisan migrate:rollback
php artisan migrate --seed
Idempotência é assegurada pelo ledger migrations; não se usa IF NOT EXISTS para esconder deriva de tabelas. Extensões partilhadas usam IF NOT EXISTS. Funções próprias investmoz_* usam CREATE OR REPLACE porque migrate:fresh remove tabelas, mas conserva funções PostgreSQL.
Cada migration usa a transacção gerida pelo Laravel, sem BEGIN/COMMIT embutidos. Uma falha deixa o ficheiro pendente, preservando os anteriores.
## Testes
php artisan config:clear
php artisan test
php artisan test --configuration=phpunit.investmoz.xml
python tools/investmoz/validate.py
python tools/investmoz/generate.py --source "caminho/do/documento.docx" --check
O ensaio dedicado exige INVESTMOZ_SCHEMA_TESTS=1 e base terminada em _test; executa migrate:fresh e elimina dados dessa base.
As novas migrations rejeitam SQLite explicitamente. A suite principal deve usar PostgreSQL.
Testes estáticos não equivalem a execução PostgreSQL/PostGIS. Desempenho usa EXPLAIN sem limiar inventado.
## MySQL -> PostgreSQL
1. Inventariar versão, charset, collation, contagens, moedas, fusos e ligações da origem real.
2. Obter snapshot e backup com restauração verificada e manifesto SHA-256.
3. Criar destino vazio e executar migrations sem seeds de demonstração.
4. Preservar IDs bigint do legado; atribuir UUID às novas entidades com mapa persistente origem/ID/UUID. Resolver P-08 antes de mapear opportunities para projects/CRM.
5. Transportar decimais como strings, sem float. Normalizar datas com fuso aprovado; colocar zero dates e datas inválidas em quarentena.
6. Validar JSON e geometrias 2D SRID 4326; recusar correcções geográficas silenciosas.
7. Importar por dependências em lotes transaccionais; deduplicar por source_system/external_id e comparar version_no atomicamente.
8. Guardar checkpoint na transacção do lote; não colocar dados pessoais nos logs.
9. Reconciliar contagens, somas, hashes canónicos, duplicados, órfãos e geometrias; tolerâncias ainda pendentes.
10. Ajustar sequences bigint com setval após verificar MAX(id); guardar origem para reversão.
11. Ensaiar corte, deltas e restauro antes de transferir tráfego. Esta entrega não executa importação.
## Rollback
down remove triggers, índices avançados, FKs/checks/PKs e tabelas em ordem inversa, depois funções próprias. Não remove extensões nem usa DROP CASCADE.
Reverter tabelas POPULADAS destrói os seus dados, mesmo sem CASCADE. Não é reversão sem perda.
Antes de rollback fora do ensaio: suspender escritores, exportar tabelas, verificar restauração separada e guardar ledger. Preferir migration compensatória.
Num upgrade, migrate:rollback reverte o lote novo. Após migrate:fresh, todas as migrations podem pertencer ao mesmo lote; rollback pode remover também o legado.
RESTRICT deve bloquear dependências externas; não contornar com CASCADE. Manter aplicação compatível com o esquema restaurado.
Rollback de esquema não reconverte automaticamente dados para MySQL.
## Fontes técnicas
https://www.postgresql.org/docs/16/ddl-constraints.html
https://postgis.net/docs/ST_IsValid.html
https://postgis.net/docs/ST_IsEmpty.html
## Checklist para cada ambiente
Consultar validation.md para as evidencias do ensaio local ja executado. Os itens seguintes devem ser repetidos no ambiente de destino.
- [x] Reconciliação autorizada e migrations históricas preservadas.
- [x] Catálogo, dicionário e SQL gerados da mesma representação.
- [x] UUID novos, FKs compatíveis, decimais, geometrias e índices explícitos.
- [x] Contactos N:N e documentos tipados.
- [x] Extensões preservadas no rollback.
- [x] Lacunas documentadas e fora do DDL.
- [ ] migrate:fresh --seed e rollback confirmados em PostgreSQL/PostGIS.
- [ ] Suite da aplicação executada em PostgreSQL.
- [ ] Matriz de permissões, importação real, reconciliação e restauro validados.
- [ ] Desempenho confirmado com volume e SLO aprovados.