docs(iva): prepare G3 delivery with fresh backup restore and compatible rollback
tests / ci (push) Canceled after 0s

This commit is contained in:
2026-10-24 17:01:08 +02:00
parent 0dc2d64b20
commit 6eefe4b332
3 changed files with 267 additions and 0 deletions
@@ -7791,5 +7791,129 @@
"P001": "05/06only",
"L1_complete": false,
"accepted_tests_repeated": false
},
"iva_l1_g3_delivery_preparation_20261024": {
"status": "ready_backup_restore_verified_not_installed",
"candidate": "0dc2d64b20ae3d6879e0154f5507b3fdc6031733",
"base_remote_main": "ccdecbd8d74596e729f03381d3b37ca22ce5800e",
"coverage": {
"group": "G3",
"branches": [
"P038",
"P039",
"P040",
"P041",
"P042",
"P043",
"P045"
],
"scope": "cessation2026/MZN;explicit continuity;no historical exemption/imports"
},
"counts_before": {
"delivered": 36,
"QA": 7,
"functional_pending": 89,
"documentary": 1,
"total": 133
},
"counts_after_delivery": {
"delivered": 43,
"QA": 0,
"functional_pending": 89,
"documentary": 1,
"total": 133
},
"QA": "ac948bd8/bda6d1e3;manual Tempo visual confirmation0dc2d64b;3frontend+API1/36+types/build;13frozenbooks unchanged;accepted proofs reused",
"visual_provenance": "Manual Tempo;no Codex browser observation claimed. G2L clarification908c8afc is separate from G3 confirmation0dc2d64b.",
"runtime_delta": [
{
"path": "resources/js/components/simulation-operations.tsx",
"sha256_LF": "68e0a98d9b1a3190a96d16210e1bb331c23dbbf9aaa218f973ba05dc9c90df55"
},
{
"path": "resources/js/lib/iva-operations.ts",
"sha256_LF": "5155a96101393e0dca5f183577587b9b3a9c4e3b981e8491adc0d640301bdcb3"
},
{
"path": "resources/js/lib/iva-temporary-benefits.ts",
"sha256_LF": "99bf065703db32709806475f7e8bfdf0d086cce9b15ab30434f44d8df6ed9230"
}
],
"authenticated_preflight": {
"installed": {
"status": "installed",
"commit": "ccdecbd8d74596e729f03381d3b37ca22ce5800e",
"release": "/var/www/investmoz-homologacao/releases/ccdecbd8d74596e729f03381d3b37ca22ce5800e-0967d766",
"previous_release": "/var/www/investmoz-homologacao/releases/e45a1394fa2ca8631593549b3af62093f25d9c13-f5f7e07d",
"database_migrations": 0,
"content_imports": 0
},
"current_link": "/var/www/investmoz-homologacao/releases/ccdecbd8d74596e729f03381d3b37ca22ce5800e-0967d766",
"release_revision": {
"commit": "ccdecbd8d74596e729f03381d3b37ca22ce5800e",
"branch": "main",
"built_at": "2026-10-24T14:40:55.681401+00:00",
"manifest_sha256": "8ee52a7b3f7c4363f10d73382d85325bbfa331c2e6e44ccd08d92e578cdf2776"
},
"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-g3-delivery-20261024/backup",
"target": {
"database": "teste_investidor",
"port": 5432
},
"tables": 174,
"files_verified": 369,
"dump_sha256": "0a9ebaa6f883abbea456f5971a35cb2081031735d56138f0d9354a9325591d7a",
"files_sha256": "ec19f952637953c1b286a5dfd5e8cef7861a0564c7d7c5a3187103fc0305a746",
"restore_verified": false
},
"restore": {
"restore_verified": true,
"tables_verified": 174,
"container_network": "none",
"database": "l1_g3_restore_20261024",
"port": 55441,
"source_dump_sha256": "0a9ebaa6f883abbea456f5971a35cb2081031735d56138f0d9354a9325591d7a",
"active_database_writes": 0
}
},
"activation": "Existing Git FF/webhook/installer;no migrations/imports/permissions/newserver fiscal rule",
"rollback": {
"patch": "docs/investmoz/simulations/l1-g3-readonly-rollback-20261024.patch",
"checked": true,
"applied": false,
"preserves": "catalogue/readers/history/reports;prior release and fresh backup retained",
"old_patch": "Earlier patch no longer applies after new helper;new compatible patch generated,old artifact preserved"
},
"L1_complete": false,
"P001": "05/06only",
"statistics_AI": "deferred"
}
}
@@ -0,0 +1,124 @@
{
"status": "ready_backup_restore_verified_not_installed",
"candidate": "0dc2d64b20ae3d6879e0154f5507b3fdc6031733",
"base_remote_main": "ccdecbd8d74596e729f03381d3b37ca22ce5800e",
"coverage": {
"group": "G3",
"branches": [
"P038",
"P039",
"P040",
"P041",
"P042",
"P043",
"P045"
],
"scope": "cessation2026/MZN;explicit continuity;no historical exemption/imports"
},
"counts_before": {
"delivered": 36,
"QA": 7,
"functional_pending": 89,
"documentary": 1,
"total": 133
},
"counts_after_delivery": {
"delivered": 43,
"QA": 0,
"functional_pending": 89,
"documentary": 1,
"total": 133
},
"QA": "ac948bd8/bda6d1e3;manual Tempo visual confirmation0dc2d64b;3frontend+API1/36+types/build;13frozenbooks unchanged;accepted proofs reused",
"visual_provenance": "Manual Tempo;no Codex browser observation claimed. G2L clarification908c8afc is separate from G3 confirmation0dc2d64b.",
"runtime_delta": [
{
"path": "resources/js/components/simulation-operations.tsx",
"sha256_LF": "68e0a98d9b1a3190a96d16210e1bb331c23dbbf9aaa218f973ba05dc9c90df55"
},
{
"path": "resources/js/lib/iva-operations.ts",
"sha256_LF": "5155a96101393e0dca5f183577587b9b3a9c4e3b981e8491adc0d640301bdcb3"
},
{
"path": "resources/js/lib/iva-temporary-benefits.ts",
"sha256_LF": "99bf065703db32709806475f7e8bfdf0d086cce9b15ab30434f44d8df6ed9230"
}
],
"authenticated_preflight": {
"installed": {
"status": "installed",
"commit": "ccdecbd8d74596e729f03381d3b37ca22ce5800e",
"release": "/var/www/investmoz-homologacao/releases/ccdecbd8d74596e729f03381d3b37ca22ce5800e-0967d766",
"previous_release": "/var/www/investmoz-homologacao/releases/e45a1394fa2ca8631593549b3af62093f25d9c13-f5f7e07d",
"database_migrations": 0,
"content_imports": 0
},
"current_link": "/var/www/investmoz-homologacao/releases/ccdecbd8d74596e729f03381d3b37ca22ce5800e-0967d766",
"release_revision": {
"commit": "ccdecbd8d74596e729f03381d3b37ca22ce5800e",
"branch": "main",
"built_at": "2026-10-24T14:40:55.681401+00:00",
"manifest_sha256": "8ee52a7b3f7c4363f10d73382d85325bbfa331c2e6e44ccd08d92e578cdf2776"
},
"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-g3-delivery-20261024/backup",
"target": {
"database": "teste_investidor",
"port": 5432
},
"tables": 174,
"files_verified": 369,
"dump_sha256": "0a9ebaa6f883abbea456f5971a35cb2081031735d56138f0d9354a9325591d7a",
"files_sha256": "ec19f952637953c1b286a5dfd5e8cef7861a0564c7d7c5a3187103fc0305a746",
"restore_verified": false
},
"restore": {
"restore_verified": true,
"tables_verified": 174,
"container_network": "none",
"database": "l1_g3_restore_20261024",
"port": 55441,
"source_dump_sha256": "0a9ebaa6f883abbea456f5971a35cb2081031735d56138f0d9354a9325591d7a",
"active_database_writes": 0
}
},
"activation": "Existing Git FF/webhook/installer;no migrations/imports/permissions/newserver fiscal rule",
"rollback": {
"patch": "docs/investmoz/simulations/l1-g3-readonly-rollback-20261024.patch",
"checked": true,
"applied": false,
"preserves": "catalogue/readers/history/reports;prior release and fresh backup retained",
"old_patch": "Earlier patch no longer applies after new helper;new compatible patch generated,old artifact preserved"
},
"L1_complete": false,
"P001": "05/06only",
"statistics_AI": "deferred"
}
@@ -0,0 +1,19 @@
--- a/resources/js/components/simulation-operations.tsx
+++ b/resources/js/components/simulation-operations.tsx
@@ -17,6 +17,8 @@
const change=(id:string,patch:Partial<SalesOperation>)=>run(()=>save({...book,rows:book.rows.map(r=>r.id===id?{...r,...patch}:r)}));
const continueTemporary=(id:string,target:string)=>run(()=>save({...book,rows:book.rows.map(row=>row.id===id?continueTemporaryOperation(row,target):row)}));
return <section aria-label="Operações IVA por oportunidade" className="space-y-3 rounded border p-3">
+ <p role="status">Novos cálculos temporariamente suspensos; resultados guardados e relatórios disponíveis.</p>
+ <fieldset disabled>
<h4 className="font-semibold">Operações de IVA — enquadramento das vendas</h4>
<p>Oportunidade {String(draft.context_opportunity||'entrada geral')}; moeda original {book.currency||'por indicar'}. Cobertura2026/MZN. Reutilize as vendas e complete apenas o enquadramento. Este bloco classifica as operações; não substitui nem soma novamente a execução mensal geral acima.</p>
<p>Uma empresa pode ter operações com tratamentos diferentes. Os valores são projecções sob pressupostos declarados, sem certificar facturas, reconhecer créditos ou submeter uma declaração à AT.</p>
@@ -82,6 +84,7 @@
{book.periods.map(p=><label className="block" key={p.period}><input type="checkbox" checked={p.complete} onChange={e=>run(()=>save({...book,periods:book.periods.map(v=>v.period===p.period?{...v,complete:e.target.checked}:v)}))}/> {p.period}: incluí todas as operações deste período; lista vazia significa ausência expressamente confirmada.</label>)}
<p>Limites: outras isenções/bases especiais e correspondência do campo06 permanecem por delimitar. IVA incluído a5% conserva a fracção exacta e apresenta um decimal a6casas; a aproximação de apresentação não constitui regra declarativa. O desconhecido nunca é assumido como zero.</p>
<button type="button" disabled={!book.periods.length} className="rounded bg-emerald-800 p-2 text-white disabled:opacity-50" onClick={()=>run(()=>save(recordSales(draft,book)))}>Calcular e guardar operações IVA</button>
+ </fieldset>
{book.result&&<><p role="status">{salesCurrent(draft,book)?'Resultado correspondente às entradas.':'Resultado histórico conservado; reveja as alterações antes de recalcular.'}</p><dl>{salesReportRows(draft).map(([,label,value,origin],index)=><div className="break-inside-avoid border-t py-2" key={index}><dt className="font-semibold">{label}</dt><dd>{value}<small className="block">{origin}</small></dd></div>)}</dl></>}
</section>;
}