docs(iva): prepare joint foreign and limited digital delivery after restore
tests / ci (push) Canceled after 0s

This commit is contained in:
2026-10-25 01:27:21 +02:00
parent de4b25bbd7
commit df43aeb1e5
3 changed files with 201 additions and 0 deletions
@@ -0,0 +1,180 @@
{
"status": "ready_after_fresh_authenticated_preflight_and_verified_backup_restore",
"candidate": "de4b25bbd73f8c0d34549e455ade5639d37cd801",
"accepted_candidates": [
"e4c490b3",
"de4b25bb"
],
"base_installed": "e8b5ae43add95be3a7fd437e4488befce76c0a97",
"coverage_complete_branches": {
"AUD-SIM-L1-P002": [
"goods",
"services",
"listed_services",
"foreign_transport_portion"
],
"AUD-SIM-L1-P121": [
"web",
"software_service",
"information",
"media",
"teaching",
"analogous"
],
"AUD-SIM-L1-P130": [
"software_asset",
"content_asset",
"data_asset",
"crypto_asset",
"ebook_asset",
"profile_asset",
"access_asset",
"other_asset"
]
},
"coverage_label": "Três ramos no âmbito demonstrado: P002 enquadramento potencial; P121/P130 natureza/localização/responsável, rascunho/histórico/relatório. Não representa cobertura digital integral.",
"digital_coverage_integral": false,
"digital_formalities_not_automated": [
"Modelos da declaração mensal e do mapa de retenções25(7)",
"Formalidades/procedimentos de entrega e pagamento26(4) ainda não cotejados",
"Submissão, pagamento ou cálculo de imposto/dedução não executados neste incremento"
],
"digital_documentary_limits": {
"procedure": "Modelos/formalidades de25(7)/26(4) não cotejados neste incremento. A pesquisa oficial delimitada encontrou anúncio governamental de30/09/2026, não o texto normativo de execução. Isto não declara inexistência de regulamentação nem bloqueia classificação e preparação. Nenhum modelo, taxa de retenção, aprovador ou formulário inventado.",
"official_notice": "https://portaldogoverno.gov.mz/governo-introduz-alteracoes-nos-regulamentos-fiscais-para-reforcar-eficiencia-tributaria/",
"next_action": "Cotejar texto publicado e modelos aplicáveis antes de automatizar formalidades/submissão; manter preparação, localização e atribuição legal demonstrada.",
"P104": "Mantém pendência de escolha da taxa/data; conversão condicionada preservada, sem dependência efectiva destes percursos.",
"P084_P085": "Preparação/simulação condicionada preservadas; benefícios não encerrados."
},
"UI_delta_from_QA": "Texto explícito de cobertura limitada e formalidades não automatizadas, pedido pela Tempo; nenhuma alteração de regra ou cálculo.",
"branch_count_complete": 3,
"digital_treatment_count": 14,
"digital_examples": 46,
"P002_examples": 7,
"runtime_delta": [
{
"path": "resources/js/lib/iva-digital.ts",
"sha256_LF": "623165a4e36e161776fea115ee7f8b9b61b4e5766831daa404badf8397eae271"
},
{
"path": "resources/js/components/simulation-digital.tsx",
"sha256_LF": "5bf44510481d1739e0a81f0326c14c8e2f477ac9a7e02b694c3b3173a92dcd78"
},
{
"path": "resources/js/lib/iva-foreign-operations.ts",
"sha256_LF": "b2735b9071aac41f9ddf0ae0c81d3943c870adccfa315ec01432388fec4a7de8"
},
{
"path": "resources/js/components/simulation-foreign-operations.tsx",
"sha256_LF": "5276d81afd97cd40df63973fcfdca27d80903464af078f67deb3e45c7bb90948"
},
{
"path": "resources/js/components/simulation-monthly-iva.tsx",
"sha256_LF": "19269934dc83f2cb3c36b1677f0bcdf066dc0ffd2af889730bd92acb54532587"
},
{
"path": "resources/js/lib/project-dossier.ts",
"sha256_LF": "f0428b411146e030bbf952428faffab6ac26178d09aa3a6437daa9363bc75a46"
},
{
"path": "resources/js/lib/iva-currency-events.ts",
"sha256_LF": "fa99e217e96bc6601ebfe0ac48a8ad3395ce85d57218c23888e6eece5a7405fa"
}
],
"counts_before": {
"delivered": 120,
"QA": 3,
"functional_pending": 9,
"documentary": 1,
"total": 133
},
"counts_current": {
"delivered": 120,
"QA": 3,
"functional_pending": 9,
"documentary": 1,
"total": 133
},
"counts_after_delivery": {
"delivered": 123,
"QA": 0,
"functional_pending": 9,
"documentary": 1,
"total": 133
},
"QA_proofs_reused": [
"iva-l1-foreign-operations-qa-20261025.json",
"iva-l1-digital-qa-20261025.json"
],
"authorization": "Tempo solicita uma única disponibilização P002/P121/P130 no âmbito demonstrado, com alterações concorrentes preservadas e somente delta instalado conferido.",
"preservation": "120 fechos, P104 condicionado, P084/P085 parciais, dados, históricos, permissões e acessos preservados. P104 não encerrado.",
"scope": "Natureza digital, localização e responsável; gravação, recuperação, histórico e relatório. Não calcula taxa/base/IVA/dedução/campo11 ou totais; não envia declaração nem inicia pagamento. Software/acesso/licenciamento não decidem natureza apenas pelo título.",
"P104_closure": false,
"limits": "L1 aberto; P001 apenas05/06; P084/P085 benefícios pendentes; bebidas L2/L3; Estatísticas/IA adiadas.",
"containment": "l1-foreign-digital-readonly-rollback-20261025.patch; conferir sem aplicar: suspende apenas novas versões P002/digital, preservando leitores/histórico/outros ramos.",
"authenticated_preflight": {
"installed": {
"status": "installed",
"commit": "e8b5ae43add95be3a7fd437e4488befce76c0a97",
"release": "/var/www/investmoz-homologacao/releases/e8b5ae43add95be3a7fd437e4488befce76c0a97-7ad802df",
"previous_release": "/var/www/investmoz-homologacao/releases/92eaa93570b96561a0d2ab60787b7af8171c9529-d4d7a2a2",
"database_migrations": 0,
"content_imports": 0
},
"current_link": "/var/www/investmoz-homologacao/releases/e8b5ae43add95be3a7fd437e4488befce76c0a97-7ad802df",
"release_revision": {
"commit": "e8b5ae43add95be3a7fd437e4488befce76c0a97",
"branch": "main",
"built_at": "2026-10-24T23:06:53.694897+00:00",
"manifest_sha256": "8679ad3c79f08e7a9505fcff3d72821c924048cb8188c80bb0ad1332adedf248"
},
"service": "ExecMainStatus=0\nActiveState=inactive\nSubState=dead\n",
"configuration_keys": [
"repository",
"branch",
"target_url",
"legacy_root",
"state_root",
"release_root",
"current_link",
"shared_assets",
"php",
"schema_contract",
"ci_environment",
"postgis_image",
"test_database",
"qa_port",
"retention",
"webhook_secret_file"
],
"safe_paths": {
"repository": "nala/Investidor-V2",
"release_root": "/var/www/investmoz-homologacao/releases",
"postgis_image": "postgis/postgis@sha256:01a6a70e41e6c4467c8f55f6063555ed72db2d6662cd0d571040d42eadaeb6f6"
},
"pipeline_sha256": "adec1c17654f3a8658b83b134f1e75f95391b235738552721906c3236e388604"
},
"backup_restore": {
"backup": {
"stage": "/var/backups/investmoz-l1-foreign-digital-delivery-20261025/backup",
"target": {
"database": "teste_investidor",
"port": 5432
},
"tables": 174,
"files_verified": 369,
"dump_sha256": "4325b559ab0e7e4a2904a4dc2235b79260a04095e401a3d0231b46e64afb16a9",
"files_sha256": "d69622a7179b7bfdfc4599714a9093f47f28c6fcc96b38d1856cfbd38775ef4b",
"restore_verified": false
},
"restore": {
"restore_verified": true,
"tables_verified": 174,
"container_network": "none",
"database": "l1_foreign_digital_restore_20261024",
"port": 55441,
"source_dump_sha256": "4325b559ab0e7e4a2904a4dc2235b79260a04095e401a3d0231b46e64afb16a9",
"active_database_writes": 0
}
}
}
@@ -0,0 +1,20 @@
--- a/resources/js/lib/iva-digital.ts
+++ b/resources/js/lib/iva-digital.ts
@@ -76,7 +76,7 @@
}
function key(draft:Record<string,unknown>,book:DigitalBook):string{return JSON.stringify({version:digitalVersion,scope:acquisitionScope(draft),location:draft.selection_labels??{},rows:book.rows});}
export function digitalCurrent(draft:Record<string,unknown>,book:DigitalBook):boolean{return!!book.result&&book.result.sourceKey===key(draft,book);}
-export function recordDigital(draft:Record<string,unknown>,book:DigitalBook):DigitalBook{
+export function recordDigital(draft:Record<string,unknown>,book:DigitalBook):DigitalBook{throw new Error('Novas versões P121/P130 temporariamente suspensas; dados, histórico e relatórios conservados.');
if(!book.rows.length||new Set(book.rows.map(r=>r.id)).size!==book.rows.length)throw new Error('Identifique operações distintas; originais conservados.');
const result:DigitalCalculation={version:digitalVersion,revision:(book.result?.revision??0)+1,calculatedAt:new Date().toISOString(),opportunity:acquisitionScope(draft),sourceKey:key(draft,book),source:digitalSource,inputs:structuredClone(book.rows),rows:book.rows.map(evaluateDigital)};
const next={...book,result,history:[...(book.history??[]),...(book.result?[book.result]:[])]};saveDigitalBook(draft,next);return next;
--- a/resources/js/lib/iva-foreign-operations.ts
+++ b/resources/js/lib/iva-foreign-operations.ts
@@ -46,5 +46,5 @@
}
function key(draft:Record<string,unknown>,book:ForeignOperationBook):string{return JSON.stringify({version:foreignOperationVersion,scope:acquisitionScope(draft),location:draft.selection_labels??{},rows:book.rows,dependencies:book.rows.map(row=>({source:foreignSources(draft,row.sourceKind).find(s=>s.id===row.sourceRowId),event:row.eventRowId?foreignEvents(draft).find(e=>e.id===row.eventRowId):null}))});}
export function foreignOperationCurrent(draft:Record<string,unknown>,book:ForeignOperationBook):boolean{try{return!!book.result&&book.result.sourceKey===key(draft,book);}catch{return false;}}
-export function recordForeignOperations(draft:Record<string,unknown>,book:ForeignOperationBook):ForeignOperationBook{if(!book.rows.length||new Set(book.rows.map(r=>r.id)).size!==book.rows.length)throw new Error('Indique identidades distintas;originais conservados.');const result:ForeignOperationCalculation={version:foreignOperationVersion,revision:(book.result?.revision??0)+1,calculatedAt:new Date().toISOString(),opportunity:acquisitionScope(draft),sourceKey:key(draft,book),source:foreignOperationSource,inputs:structuredClone(book.rows),rows:book.rows.map(r=>evaluateForeignOperation(draft,r))};const next={...book,result,history:[...(book.history??[]),...(book.result?[book.result]:[])]};saveForeignOperationBook(draft,next);return next;}
+export function recordForeignOperations(draft:Record<string,unknown>,book:ForeignOperationBook):ForeignOperationBook{throw new Error('Novas versões P002 temporariamente suspensas; dados, histórico e relatórios conservados.');if(!book.rows.length||new Set(book.rows.map(r=>r.id)).size!==book.rows.length)throw new Error('Indique identidades distintas;originais conservados.');const result:ForeignOperationCalculation={version:foreignOperationVersion,revision:(book.result?.revision??0)+1,calculatedAt:new Date().toISOString(),opportunity:acquisitionScope(draft),sourceKey:key(draft,book),source:foreignOperationSource,inputs:structuredClone(book.rows),rows:book.rows.map(r=>evaluateForeignOperation(draft,r))};const next={...book,result,history:[...(book.history??[]),...(book.result?[book.result]:[])]};saveForeignOperationBook(draft,next);return next;}
export function foreignOperationReportRows(draft:Record<string,unknown>):Array<[string,string,string,string]>{try{const b=foreignOperationBook(draft),r=b.result;if(!r)return[];return r.inputs.map((row,i)=>{const line=r.rows[i];return['IVA mensal',`P002 — ${line.source?.period??'Período indeterminado'} — ${row.id}`,`${line.source?.description??'Origem por escolher'};${line.reason};dedução/IVA:Indeterminados`,`${r.opportunity};${foreignOperationCurrent(draft,b)?'Resultado actual':'Origens/entradas alteradas;resultado histórico conservado'};versão${r.revision};${r.calculatedAt};${r.source};localização${row.sourceKind}/${row.sourceRowId},versão${line.source?.revision??'indeterminada'};${line.source?.reason??''};operação${line.source?.operationRef??''};âmbito origem${line.source?.scope??''};parcela${row.territorialPart};evento${row.eventRowId||'Sem associação necessária'},${line.event?JSON.stringify(line.event):'Não apurado por esta análise'};hipótese interna${row.hypotheticalTaxable},fundamento${row.hypotheticalRef};exclusão19(2)${row.excluded19_2};âmbito${row.scope};factos${row.evidence};sem base/IVA/dedução/campo11/totaisModeloA.`];});}catch{return[['IVA mensal','P002','Dados não recuperáveis','Originais preservados;sem classificação por defeito.']];}}
@@ -9,6 +9,7 @@ export function SimulationDigital({draft,onChange}:{draft:Record<string,unknown>
return<details className="space-y-3 rounded border p-3"><summary>Bens e serviços digitais — natureza, localização e obrigações</summary>
<p>Distinga o activo transmitido da funcionalidade prestada. O nome comercial, a moeda, a nacionalidade ou um servidor não determinam sozinhos o tratamento. Reutilize as referências da operação e os documentos disponíveis.</p>
<p>Localização não concede isenção nem calcula IVA ou dedução. A identificação do responsável não apresenta uma declaração nem inicia pagamento. As formalidades remetidas para regulamentação ficam assinaladas.</p>
<p><strong>Cobertura digital deste incremento:</strong> identificação da natureza, localização, responsável, rascunho, histórico e relatório. As formalidades regulamentares ainda não cotejadas — modelos da declaração e do mapa de retenções, procedimentos de entrega e pagamento — não estão automatizadas. Não representa cobertura digital integral nem calcula imposto ou dedução.</p>
<p>{digitalSource}</p>{error&&<p role="alert">{error}</p>}
<button type="button" className="underline" onClick={()=>save({...book,rows:[...book.rows,newDigitalRow(crypto.randomUUID())]})}>Acrescentar operação digital</button>
{book.rows.map(row=><details key={row.id} className="rounded border p-3"><summary>{row.description||'Operação digital por identificar'} — {row.period||'mês por indicar'}</summary><div className="grid gap-3 md:grid-cols-2">