Files
Investidor-V2/tools/portal-investor-consolidation-docs.py
T
nala 6ddafc95ba
tests / ci (push) Canceled after 0s
oportunidades 4
2026-10-10 07:03:59 +02:00

100 lines
10 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""Supplement the existing audit documents and a capability map, without a second audit matrix."""
from pathlib import Path
import json
import re
root = Path(__file__).resolve().parent.parent
docs = root / 'docs/investmoz/v2/auditoria-portal'
private = root / 'storage/app/private/investmoz-v2/portal-audit'
source = json.loads((private / 'assistant-source-full.json').read_text(encoding='utf-8'))
runtime = json.loads((private / 'investor-consolidation-runtime.json').read_text(encoding='utf-8'))
proposal = docs / 'proposta-consolidacao-percurso.md'
text = proposal.read_text(encoding='utf-8').replace('Emóvel', 'Em móvel')
for number in range(22, 41):
text = text.replace('§' + str(number) + ' /', 'P' + str(number) + ' /')
proposal.write_text(text, encoding='utf-8')
paragraphs = {p['paragraph']: p['text'] for p in source['parts'][0]['paragraphs']}
stages = []
for line in text.splitlines():
if not line.startswith('|'):
continue
cells = [x.strip() for x in line.strip().strip('|').split('|')]
if len(cells) != 5:
continue
code = re.search(r'\bS(\d{2})\b', cells[0])
paragraph = re.search(r'P(\d+)\s*/', cells[1])
if not code or not paragraph:
continue
number = int(code.group(1))
stages.append({'stage_id': 'S' + code.group(1), 'phase': 1 if number <= 4 else 2 if number <= 7 else 3 if number <= 11 else 4 if number <= 15 else 5,
'source': {'sha256': source['sha256'], 'part': 'word/document.xml', 'paragraph': int(paragraph.group(1)), 'text': paragraphs[int(paragraph.group(1))]},
'diagram_mapping': cells[1].split('/', 1)[1].strip(), 'capabilities': cells[2], 'applicability_dependencies_result': cells[3],
'audit_requirement_refs': cells[4], 'proposed': True, 'runtime_definition_prepared': True, 'integrated_ui_demonstrated': False})
assert [s['stage_id'] for s in stages] == ['S%02d' % i for i in range(1, 20)]
assert [s['source']['paragraph'] for s in stages] == list(range(22, 41))
mapping = {'kind': 'capability_map_not_a_parallel_requirement_matrix', 'source_sha256': source['sha256'], 'runtime_read_only_capture': runtime['captured_at'],
'stage_count': 19, 'phase_count': 5, 'structural_implementation_approved': True, 'active_writes': 0, 'stages': stages,
'qa_scenarios': {'A': {'land_needed': False, 'external_funding_needed': False, 'status': 'api_persistence_demonstrated_integrated_ui_pending'},
'B': {'land_needed': True, 'external_funding_needed': True, 'status': 'api_persistence_demonstrated_integrated_ui_pending'}}}
(docs / 'proposta-percurso-19-etapas.json').write_text(json.dumps(mapping, indent=2, ensure_ascii=False), encoding='utf-8')
updates = {
'relatorio-executivo.md': '''## Consolidação do percurso — aprovação QA e execução parcial
O estado atual inclui a [proposta fundamentada](proposta-consolidacao-percurso.md), baseada na leitura integral do DOCX solicitado e do seu fluxograma: cinco fases e 19 etapas, vinculadas aos IDs da mesma matriz. O texto tem 19 etapas; a imagem tem 17 blocos numerados e decisões separadas. Os roteiros E0–E11, sete grupos de orientação e outro roteiro com 14 atividades permanecem identificados por versão.
PostgreSQL/PostGIS e CRM externo desativado foram confirmados por leitura efetiva. O complemento não reinicia inventário: acrescenta um original e um anexo, ficando 525 ficheiros + 61 anexos = 586 registos. A matriz conserva 3.354 requisitos/linhas e 5.830 linhas de origem; estados não mudam por proposta. Os 381 testes/5.046 asserções do lote 3 abaixo são históricos desse lote; a nova regressão fica em consolidation-regression.log/XML.
C24: corrigido o encaminhamento do dossier para o draft específico do simulador, sem partilha de dados pessoais ou permissão do gestor. Regressão red→green: 16 testes de orientação/285 asserções; UI pendente. Execução I1–I3 aprovada em QA. Código/modelo/motor preparados e API/persistência A/B demonstradas; aceitação na interface ainda pendente. A extensão foi instalada apenas na cópia QA restaurada, sem conversão de roteiros anteriores. Ver execucao-percurso-i1-i3.md; a aprovação não autoriza a base ativa. Nenhuma escrita ativa.
''',
'backlog.md': '''## Prioridades organizadas em torno do percurso do investidor
Consultar a [proposta de consolidação](proposta-consolidacao-percurso.md) e a correspondência das 19 etapas aos IDs da matriz. Execução QA aprovada; código e API/persistência preparados, aceitação visual pendente.
1. **I0/P0–P1, já autorizado:** falhas de ações/recuperação, países/origem por formulário, cartografia por consumidor e contexto correto; C24 corrigido em QA, visual pendente. Nenhuma dependência de aprovação da consolidação para estes reparos.
2. **I1, QA autorizada e parcial:** painel composto com projeto atual, etapas, pendências/documentos/resultados e próxima ação. Preservar URLs e funções da gestão. Aceitação: UI completa e autorização por origem.
3. **I2, QA autorizada e parcial:** dados mestres e prefill consentido, resultados/contexto por ID/versão, nova sessão e alternância A/B sem contaminação. Aceitação inclui conflitos e ausência de sobrescrita; C25 permite rascunhos independentes por dossier; API/persistência demonstradas, interface pendente.
4. **I3, QA autorizada e parcial:** definição configurável/versionada das 19 etapas, aplicabilidade triestado, dependências por ação e estados separados. Reutilizar QuestionnaireVersion, investor_journeys/journey_steps, tasks e eventos. A/B completos na interface são condição de fecho; migration nova executada exclusivamente na cópia QA; nenhuma migration ativa.
5. **I4:** licenças/terra/financiamento/execução e monitoria conforme evidências e âmbito, sem integrações externas obrigatórias. Workflow e contratos especializados mantidos. Educação permanece depois das falhas prioritárias, sem nova jornada iniciada.
Ativação de recursos/cartografia continua separada; não inclui automaticamente o futuro motor. Backup/compatibilidade/rollback deverão ser renovados após alterações estruturais. As quatro decisões humanas anteriores e a aceitação oficial permanecem preservadas.
''',
'plano-ativacao.md': '''## Limite do plano face à consolidação proposta
Este plano cobre os recursos e importação identificados na auditoria; **não autoriza a ativação do painel/modelo/motor das 19 etapas na base ativa**. A [proposta](proposta-consolidacao-percurso.md) recebeu aprovação expressa de I1–I3 somente em QA. Código/API/persistência e interface devem manter estados separados. I0, correções existentes, continua autorizado.
A alteração pontual C24 reutiliza uma URL de draft já existente e não instala schema. Cenários A/B não foram demonstrados. Depois de qualquer mudança estrutural aprovada, preparar preview de migrations/contagens/órfãos, preservar snapshots e renovar backup/restauro/compatibilidade antes do ato autenticado. Reversão pós-uso nunca apaga decisões, vínculos, consentimentos, documentos ou auditoria.
'''
}
for name, addition in updates.items():
file = docs / name
content = file.read_text(encoding='utf-8')
marker = '## Consolidação do percurso — aprovação QA e execução parcial' if name == 'relatorio-executivo.md' else '## Prioridades organizadas em torno do percurso do investidor' if name == 'backlog.md' else '## Limite do plano face à consolidação proposta'
if marker not in content:
title, rest = content.split('\n', 1)
file.write_text(title + '\n\n' + addition + rest.lstrip(), encoding='utf-8')
case = '''
## C24 — orientação abre o simulador sem identificar o draft ligado — P1
Passos anteriores: criar dossier ligado a um draft do dono; consultar orientação; abrir ação financeira/plano quando a conta tem outro draft corrente. Esperado: recuperar exatamente a origem associada, preservando dono/versão. Observado na reprodução de servidor: href genérico /simulador-fiscal, apesar de existir simulation_id autorizado; destino pode escolher outro draft corrente. Causa: InvestorGuidance::view descartava o identificador na ação; SimulationForm já suporta ?draft=ID e API por ID.
Correção pontual: actions.simulator, actions.plan e recomendação financeira usam ?draft=ID somente se context confirmou disponibilidade/autorização; gestor permanece sem leitura do draft privado. QA: teste primeiro falhou no href genérico; depois 16 testes de orientação/285 asserções passaram, incluindo duas origens do mesmo dono, recuperação específica e gestor 404. Provas: consolidation-context-red.log, consolidation-context-green.log/XML. Link preparado e API/persistência demonstrados; clique/resultado visual pendentes. Nenhuma mudança de navegação/modelo/motor estrutural ou escrita ativa.
'''
file = docs / 'casos-reproducao.md'
if '## C24 ' not in file.read_text(encoding='utf-8'):
file.write_text(file.read_text(encoding='utf-8') + case, encoding='utf-8')
notice = '''
## Execução I1–I3 autorizada em QA
Foi lido integralmente o documento de assistente por etapas. A [proposta](auditoria-portal/proposta-consolidacao-percurso.md) organiza cinco fases/19 etapas e cenários A/B, com dados mestres, estados/permissões, reutilização, compatibilidade e reversão. I1–I3 têm execução QA aprovada; modelo/motor/rotas preparados atrás de flag, API/persistência A/B demonstradas e aceitação visual pendente. Nenhuma escrita ativa. Correções anteriores de países/cartografia permanecem em I0. C24 corrige somente o link para o draft associado, demonstrado em API/QA e ainda sem clique visual. A proposta complementa a mesma matriz, não a substitui.
'''
for name in ['gestao-oportunidades-dashboard.md', 'backlog-mestre.md']:
file = docs.parent / name
if '## Execução I1–I3 autorizada em QA' not in file.read_text(encoding='utf-8'):
file.write_text(file.read_text(encoding='utf-8') + notice, encoding='utf-8')
print(json.dumps({'stages': len(stages), 'phases': 5, 'parallel_matrix': False, 'structural_changes_qa': True, 'qa_scenarios_demonstrated': False}))