diff --git a/docs/investmoz/simulations/l1-foreign-digital-delivery-20261025.json b/docs/investmoz/simulations/l1-foreign-digital-delivery-20261025.json new file mode 100644 index 00000000..5a913e51 --- /dev/null +++ b/docs/investmoz/simulations/l1-foreign-digital-delivery-20261025.json @@ -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 + } + } +} diff --git a/docs/investmoz/simulations/l1-foreign-digital-readonly-rollback-20261025.patch b/docs/investmoz/simulations/l1-foreign-digital-readonly-rollback-20261025.patch new file mode 100644 index 00000000..22ad480b --- /dev/null +++ b/docs/investmoz/simulations/l1-foreign-digital-readonly-rollback-20261025.patch @@ -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,book:DigitalBook):string{return JSON.stringify({version:digitalVersion,scope:acquisitionScope(draft),location:draft.selection_labels??{},rows:book.rows});} + export function digitalCurrent(draft:Record,book:DigitalBook):boolean{return!!book.result&&book.result.sourceKey===key(draft,book);} +-export function recordDigital(draft:Record,book:DigitalBook):DigitalBook{ ++export function recordDigital(draft:Record,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,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,book:ForeignOperationBook):boolean{try{return!!book.result&&book.result.sourceKey===key(draft,book);}catch{return false;}} +-export function recordForeignOperations(draft:Record,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,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):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.']];}} diff --git a/resources/js/components/simulation-digital.tsx b/resources/js/components/simulation-digital.tsx index 8b8c81cd..0bcb9df8 100644 --- a/resources/js/components/simulation-digital.tsx +++ b/resources/js/components/simulation-digital.tsx @@ -9,6 +9,7 @@ export function SimulationDigital({draft,onChange}:{draft:Record return
Bens e serviços digitais — natureza, localização e obrigações

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.

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.

+

Cobertura digital deste incremento: 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.

{digitalSource}

{error&&

{error}

} {book.rows.map(row=>
{row.description||'Operação digital por identificar'} — {row.period||'mês por indicar'}