75 lines
12 KiB
Python
75 lines
12 KiB
Python
from pathlib import Path
|
|
import json,csv
|
|
R=Path(__file__).resolve().parent.parent;P=R/'storage/app/private/investmoz-v2/portal-audit';O=R/'outputs/investmoz-internal-designation-20261011'
|
|
m=json.loads((O/'manifesto.json').read_text(encoding='utf-8'));rev=m['delta_sha256'][:12]
|
|
text=f'''# Atribuição interna da equipa Tempo — delta {rev}
|
|
|
|
A Tempo Lda define as funções da sua equipa. A designação expressa pelo responsável é o fundamento da atribuição interna de Aurora. Não é necessário apresentar comprovativos de Promotor externo nem atribuir gestão empresarial para operar o portal. As exigências de representação e documentos dos blocos anteriores passam a aplicar-se exclusivamente aos pedidos externos; não às três designações internas confirmadas.
|
|
|
|
## Causa e correção
|
|
|
|
O delta anterior `41a5ce778932` separava a administração do workflow, mas recusava todo grant direto de Promotor com HTTP 422 e exigia `memberships.officer` para criar em nome de uma organização. Essa associação também permitia alterar o país mestre e atuar no Balcão da empresa. Era uma limitação da implementação, não uma regra imposta por uma entidade externa. O pacote anterior é preservado como referência e não foi aplicado.
|
|
|
|
O novo delta reutiliza Fortify, a dupla de titulares, `organizations`, `portal_role_assignments`, a política existente e a auditoria. Acrescenta uma modalidade de atribuição interna aos papéis já existentes; não cria um sétimo perfil, identidade ou cadastro paralelo. O vínculo de operação fica no grant e no contexto auditado da oportunidade, sem inserir memberships administrativas.
|
|
|
|
## Designações já decididas
|
|
|
|
| Pessoa | Papel e vínculo | Âmbito |
|
|
| --- | --- | --- |
|
|
| Aurora Chachuaio — Aurora.chachuaio@tempo.co.mz | Promotor interno da operação do portal, vinculada à Tempo Lda; não é gestora empresarial | Seis categorias base; criar e desenvolver oportunidades operadas por si, preservando o promotor real |
|
|
| Palmira Uamusse — Palmira.matsinhe@tempo.co.mz | Validador interno | Seis categorias, todas as organizações; revisão independente, sem representação empresarial automática |
|
|
| Mario Melembe — mario.melembe@tempo.co.mz | Publicador interno | Seis categorias, todas as organizações; catálogo público somente após aprovação independente e autorização de divulgação |
|
|
|
|
Dados da entidade, já confirmados: Tempo Lda; NUIT 400993114; contacto original +258 868010880, normalizado +258868010880; Director Geral Osmane Nala; proprietária e operadora do Portal InvesteMoz. O formulário permite um responsável autenticado conservar ou reutilizar a mesma organização. Denominação e NUIT ficam em `organizations`; contacto, diretor, função e origem ficam no snapshot versionado da auditoria ligado ao mesmo ID, pois o schema existente não tem esses campos. Não é declaração de certificação oficial nem criação de conta do diretor.
|
|
|
|
Aurora opera a oportunidade em nome do promotor identificado: `opportunities.organization_id` e `canonical.promoter_id` continuam a identificar esse promotor; o contexto da operação identifica separadamente Tempo/autor. A nova interface exige selecionar o promotor real e não preenche Tempo automaticamente. Autorização de divulgação, condições semânticas e documentos aplicáveis à própria oportunidade continuam independentes do grant da funcionária.
|
|
|
|
## Provas por critério
|
|
|
|
Doze ensaios HTTP/persistência passaram em PostgreSQL QA isolada 55441. Incluem cadastro único e alias comma reconciliado com preservação do país/proveniência; repetição da mesma operação; rejeição de conteúdo divergente; grants internos dos três papéis sem pedido externo/documentos/memberships; contacto/MFA e autoatribuição; revogação e invalidação de sessão; seis rascunhos incompletos com promotor real preservado; acumulação de papéis sem editar/submeter oportunidade alheia; COUNTRY02 mantido e operações fechadas durante a preparação.
|
|
|
|
Chromium: login/MFA normal → dashboard → administração → organização → grants internos → repetição sem duplicações → atualização → nova sessão/MFA → recuperação. A entrada do Promotor foi ensaiada em QA com abertura temporária apenas nessa árvore: dashboard → Nova oportunidade → seleção expressa de promotor sintético distinto da Tempo → guardar → atualizar → recuperar. Três grants, três eventos de grant, um cadastro da operadora, zero pedidos externos e zero memberships. A flag operacional QA voltou a OFF. Provas anteriores válidas foram reaproveitadas; A/B e C37 não foram repetidos nem reabertos.
|
|
|
|
As duas falhas de rótulos encontradas no primeiro ensaio foram corrigidas com nomes acessíveis explícitos, inclusive quando o formulário conserva valores entre atribuições. O primeiro ensaio de criação devolveu HTTP 422 «Contrato especializado indisponível»: o controlador QA tinha aberto só o gate de perfis, mantendo o gate dos contratos desligado. O ensaio passou a habilitar conjuntamente perfis, dashboard e contratos apenas na árvore sintética, restaurando as três flags depois. Não era uma recusa da designação interna nem uma exigência de comprovativos externos. A disponibilização administrativa desta candidata continua independente desses gates operacionais.
|
|
|
|
## Procedimento único para eventual disponibilização
|
|
|
|
1. Conferir o manifesto `{m['delta_sha256']}`, ZIP `{m['package']}` e SHA-256 `{m['package_sha256']}`; comparar os 16 hashes anteriores com o destino. Há {len(m['assets'])} recursos compilados. Conferir a leitura do destino e a validade do backup/restauro correspondente antes da intervenção. Qualquer divergência exige parar antes de escrever.
|
|
2. Após autorização desta revisão, disponibilizar ficheiros e recursos com a administração OFF e operações OFF. Conservar recursos anteriores; trocar o manifesto de produção por último. Não modificar chaves, HTTPS, cookies, serviços, limites PHP, documentos ou vendor. Zero migrations/tabelas/colunas novas; não reaplicar 030000/040000/050000 nem instalar 190000.
|
|
3. Habilitar somente `PORTAL_PROFILE_ADMINISTRATION_ENABLED=true`, mantendo COUNTRY02 ON, workflow e demais pacotes OFF. Preservar o modo atual sem cache; não gerar chave. Se for necessário recarregar PHP, utilizar o controlo normal do Laragon e conferir os vhosts.
|
|
4. Cada pessoa cria a própria conta em `https://portal-investidor.test/register`, confirma o contacto e configura MFA. Isso já é independente do workflow. Entrega efetiva do email de confirmação continua por verificar com a própria pessoa; não foi demonstrada por um envio nesta preparação.
|
|
5. Um titular 2 ou 13, com MFA recente, abre **Gestão de perfis**, `https://portal-investidor.test/perfis/gestao`, conserva/cadastra Tempo com os dados confirmados e usa **Atribuir função interna do portal**. Seleciona conta, papel, vínculo Tempo, seis categorias, âmbito global de Palmira/Mario e fundamento da designação. Não exige comprovativos de Promotor externo para Aurora e não cria representação de gestão empresarial para nenhum deles.
|
|
6. Conferir grants/auditoria/recuperação e independência. Abertura dos fluxos é uma ação separada, depois da atribuição dos acessos reais e da revisão do âmbito completo correspondente. Essa abertura deve considerar conjuntamente `PORTAL_PROFILE_ACCESS_ENABLED`, `PORTAL_OPPORTUNITY_DASHBOARD_ACCESS_ENABLED` e `PORTAL_OPPORTUNITY_SPECIALIZED_DRAFTS_ENABLED`, mantendo as quatro categorias experimentais OFF. Não abrir só perfis e deixar os contratos indisponíveis. O primeiro processo legítimo demonstrará o processamento documental no destino, separado de QA. Não criar uma oportunidade ou organização fictícia no ativo.
|
|
|
|
## Reversão e limites
|
|
|
|
Contenção: desabilitar a administração mantendo operações OFF e COUNTRY02 ON. Preservar organizações, grants, colunas e auditoria; revogação de acessos somente pela ação autenticada com motivo. Repor os 16 ficheiros e manifesto anteriores conforme hashes/backup, preservando recursos antigos, HTTPS, sessões, cifragem e serviços estabilizados. Não restaurar a base inteira nem eliminar cadastros automaticamente; restauro completo exige decisão própria.
|
|
|
|
Não foram alterados código, flags, serviços ou dados ativos. As pessoas reais ainda precisam de concluir registo, contacto/MFA e grants autenticados. O delta não fecha o workflow completo, acervo/legado, mapas, ACL individual/restauração, variantes experimentais, ofertas, competências modulares, SLA ou 190000. COUNTRY02, A/B e C37 mantêm os estados anteriores.
|
|
|
|
## Matriz existente
|
|
|
|
`AUD-PROFILE-01`, `AUD-PROFILE-03` e `AUD-PROFILE-31` recebem as provas e a precedência desta decisão interna; estados globais parciais e referências anteriores são preservados. Não criar requisitos nem segunda matriz por mudar a modalidade de elegibilidade da equipa.
|
|
'''
|
|
(O/'procedimento-e-evidencias.md').write_text(text,encoding='utf-8')
|
|
marker='<!-- internal-tempo-designation-20261011-'+rev+' -->'
|
|
block=f'''{marker}
|
|
## Regra definida pela proprietária: equipa interna Tempo — 11/10/2026
|
|
|
|
Aurora atua na operação do portal, não na gestão empresarial. A designação interna expressa pelo responsável é suficiente como fundamento do grant; **não exigir representação/comprovativos de Promotor externo para Aurora**. Palmira/Mario continuam transversais às seis categorias, sem memberships corporativas automáticas. As exigências históricas de representação e comprovativos abaixo aplicam-se aos pedidos externos, não às designações internas confirmadas. A Tempo define estas funções; a restrição genérica anterior era uma limitação de código.
|
|
|
|
Delta anterior 41a5ce778932 preservado; novo delta QA `{rev}`: cadastro mestre da operadora reutilizável, grant interno autenticado/auditado/idempotente sem documentos externos ou poderes de empresa, promotor real separado do operador e impedimentos de autoria/acumulação preservados. Doze provas HTTP/persistência; Chromium com três grants, atualização/nova sessão e entrada do Promotor pelo dashboard para criar/guardar/recuperar rascunho de promotor real distinto. Bundle de produção gerado em QA; zero alterações ativas.
|
|
|
|
Restam contas próprias/contacto/MFA, disponibilização autorizada da nova revisão e grants reais. Administração pode abrir independentemente do workflow; não acrescentar dependência documental externa para os funcionários. Workflow ativo OFF e COUNTRY02 ON; A/B/C37 preservados. Procedimento/limites: `outputs/investmoz-internal-designation-20261011/procedimento-e-evidencias.md`; manifesto e provas no mesmo diretório.
|
|
|
|
'''
|
|
for relative in ['docs/investmoz/v2/auditoria-portal/backlog.md','docs/investmoz/v2/auditoria-portal/perfis-v1-reconciliacao.md']:
|
|
f=R/relative;old=f.read_text(encoding='utf-8');assert marker not in old;f.write_text(block+old,encoding='utf-8')
|
|
csv.field_size_limit(10_000_000)
|
|
with (R/'docs/investmoz/v2/auditoria-portal/matriz-requisitos.csv').open(encoding='utf-8-sig',newline='') as f:rows=list(csv.reader(f))
|
|
headers=rows[0];c=headers.index('Evidência funcional')
|
|
common=f'Decisão prevalente da proprietária em 11/10/2026: Aurora é Promotor interno de operação do portal, não gestora empresarial; designação interna do responsável, sem comprovativos de Promotor externo ou memberships administrativas. Novo delta QA {rev}, preservando 41a5ce778932. Doze critérios HTTP/persistência e Chromium com três grants internos idempotentes/auditados, atualização, nova sessão/MFA e dashboard → rascunho com promotor real distinto → guardar → recuperar. Zero pedidos externos/memberships no ensaio. COUNTRY02 ON, workflow ativo OFF, A/B/C37 preservados; sem alterações ativas. Contas/contacto/MFA próprios, disponibilização autorizada e grants reais pendentes. outputs/investmoz-internal-designation-20261011/procedimento-e-evidencias.md'
|
|
updates={r[0]:{'Evidência funcional':r[c]+'\n\n'+common} for r in rows[1:] if r[0] in ['AUD-PROFILE-01','AUD-PROFILE-03','AUD-PROFILE-31']};assert len(updates)==3
|
|
(P/'internal-designation-matrix-baseline.json').write_text(json.dumps({'rows':rows,'updates':updates},ensure_ascii=False),encoding='utf-8')
|
|
print(json.dumps({'result':'QA_revision_procedure_and_matrix_update_prepared','revision':rev,'matrix_cells_prepared':3,'active_changes':0}))
|