52 lines
4.0 KiB
Python
52 lines
4.0 KiB
Python
"""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/recuperadas': '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}))
|