Files
Investidor-V2/tools/portal-audit-legacy-polish.py
T
nala 20971d523f
tests / ci (push) Canceled after 0s
oportunidades 6
2026-10-10 21:17:46 +02:00

52 lines
4.0 KiB
Python
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""Polish the new report block only; never rewrite historical sources or the matrix."""
import csv
import hashlib
import json
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
DOC = ROOT / 'docs/investmoz/v2/auditoria-portal'
PRIVATE = ROOT / 'storage/app/private/investmoz-v2/portal-audit'
fixes = {'sem substituirI0': 'mantendo I0', 'mesmosIDs': 'mesmos IDs', 'os50': 'os 50', 'nãoimportados': 'não importados',
'GOVERNADOR-in.gif404': 'GOVERNADOR-in.gif (404)', 'outroslinks': 'outros links', 'comfundamentoou': 'com fundamento ou',
'módulosQA': 'módulos QA', 'nohistóricoQA49': 'ausência de histórico QA49', 'provaHTTP': 'prova HTTP',
'decisões/external/publicação': 'decisões externas/aprovação/publicação', 'compromissosSLA': 'compromissos SLA',
'Plano global030000': 'Plano global 030000', '1artigo+1imagem': '1 artigo +1 imagem', '3associações': '3 associações',
'0oportunidades ou geometrias criadaspeloartigo': '0 oportunidades ou geometrias criadas pelo artigo',
'0contas/dossiersQAtransferidos': '0 contas/dossiers QA transferidos', 'noopssehash/ID': 'reutilização se hash/ID',
'Reversão:ocultar': 'Reversão: ocultar', 'BackupQA': 'Backup QA', 'biblioteca existente; associação': 'biblioteca existente; associação',
'sóaplicaQA': 'só aplica QA', 'mesmo comflagtrue': 'mesmo com flag true', 'publicadas/recupe­radas': 'publicadas/recuperadas'}
for name in ['backlog.md', 'relatorio-executivo.md', 'plano-ativacao.md', 'casos-reproducao.md']:
path = DOC / name
text = path.read_text(encoding='utf-8')
begin = text.index('<!-- qa-legacy-20261010:begin -->')
end = text.index('<!-- qa-legacy-20261010:end -->')
block = text[begin:end]
for source, replacement in fixes.items(): block = block.replace(source, replacement)
text = text[:begin] + block + text[end:]
path.write_text(text, encoding='utf-8')
path = DOC / 'legado-piloto-qa.md'
text = path.read_text(encoding='utf-8')
if '## Verificação final deste lote' not in text:
text += '''
## Verificação final deste lote
Leitura ativa renovada em10/10/2026, com transação READ ONLY: zero documentos do legado, piloto indisponível e bundle ativo inalterado. Ausentes exatamente as extensões `2026_10_09_030000_extend_opportunity_resources`, `2026_10_10_040000_create_portal_profile_authorization` e `2026_10_09_190000_prepare_investor_path`. Os190000 fiscal(03/10) eBalcão-base(07/10) instalados não substituem09/190000. Recibo `legacy-active-readonly.json`.
Persistência: um documento por hash; publicação e revisões documentais auditadas; ClamAV1.5.4 registado nos dois originais. Dossier criado e dossier continuado têm uma referência e um evento cada; projeto independente conserva zero referências/eventos. `legacy-persistence-qa.json`.
Restauro QA renovado em10/10/2026: **295 tabelas e81 ficheiros, zero ausentes**, base de restauro distinta `profile_restore_20261010_133520_test:55441`. Ensaio QA, sem substituir backup da futura base ativa/candidata. Recibo `profile-installation-backup-qa.json`. Build QA, TypeScript e análise estática passaram; oito testes específicos da biblioteca/percurso passaram, além dos ensaios HTTP por critério. Candidata não fixada nem ativação autorizada.
'''
path.write_text(text, encoding='utf-8')
sources = DOC / 'inventario-fontes.csv'
rows = list(csv.DictReader(sources.open(encoding='utf-8-sig')))
for row in rows:
if row['Exemplar/caminho'].replace('\\', '/').endswith('/legado-piloto-qa.md'):
data = path.read_bytes(); sha = hashlib.sha256(data).hexdigest()
if row['SHA256'] != sha:
row['Edição/versão identificada'] += ' | exemplar anterior SHA256=' + row['SHA256']
row['SHA256'] = sha; row['Bytes'] = str(len(data))
with sources.open('w', encoding='utf-8-sig', newline='') as f:
w = csv.DictWriter(f, fieldnames=list(rows[0])); w.writeheader(); w.writerows(rows)
print(json.dumps({'reports_updated': 5, 'matrix_preserved': True}))