From e1f010f941e9993645e131b34ec1f4c3fe82c71b Mon Sep 17 00:00:00 2001 From: nala Date: Fri, 23 Oct 2026 13:30:10 +0200 Subject: [PATCH] fix: preserve corridor filters and keep investment previews readable --- .../Controllers/PublicGeographyController.php | 2 +- .../corridor-adaptive-context-20261023.json | 25 +++++++++++++++++++ .../unification/traceability-and-manual.md | 2 ++ resources/js/pages/investor-path/context.tsx | 8 +++--- 4 files changed, 32 insertions(+), 5 deletions(-) create mode 100644 docs/investmoz/unification/corridor-adaptive-context-20261023.json diff --git a/app/Http/Controllers/PublicGeographyController.php b/app/Http/Controllers/PublicGeographyController.php index 5677e9d6..a0ebe60c 100644 --- a/app/Http/Controllers/PublicGeographyController.php +++ b/app/Http/Controllers/PublicGeographyController.php @@ -34,6 +34,6 @@ class PublicGeographyController extends Controller ->orWhereRaw('source_code ILIKE ?', [$term])); } - return response()->json($query->orderBy('name')->orderBy('id')->paginate(100, ['id', 'name', 'parent_id', 'location_type', 'source_code'])); + return response()->json($query->orderBy('name')->orderBy('id')->paginate(100, ['id', 'name', 'parent_id', 'location_type', 'source_code'])->withQueryString()); } } diff --git a/docs/investmoz/unification/corridor-adaptive-context-20261023.json b/docs/investmoz/unification/corridor-adaptive-context-20261023.json new file mode 100644 index 00000000..e3a536f3 --- /dev/null +++ b/docs/investmoz/unification/corridor-adaptive-context-20261023.json @@ -0,0 +1,25 @@ +{ + "decision_owner": "Tempo, Lda.", + "decision_date": "2026-10-23", + "configuration": "config/investment_corridors.php", + "functional_revision": "0025309b", + "maputo_final_decision": ["Maputo Província", "Maputo Cidade"], + "automatic_province": {"nacala": "Nampula", "limpopo": "Gaza"}, + "existing_territorial_ids_reused": true, + "server_validation": ["corridor and territory", "documented zone compatibility", "actor and dossier access", "draft request ordering", "dossier concurrency"], + "recovery": "Encrypted pending draft in the existing dossier payload, per actor; distinct from confirmed context.", + "qa": { + "database": "simulator_fiscal_delta_20261021_test", + "port": 55441, + "focused_tests": 5, + "assertions": 90, + "existing_opportunity_continuity_tests": "passed", + "types": "passed", + "build": "passed", + "browser": ["Beira offers Sofala and Manica", "Nacala selects Nampula", "Maputo offers both units", "Sofala/Dondo recovers after reload", "normal context confirmation succeeds"], + "browser_account_and_dossier": "synthetic and private, QA only", + "screenshot": "outputs/preservation-inventory-20261023/corridor-adaptive-territory-QA.png" + }, + "homologation": {"git_integrated": true, "public_read_check": "Maputo province endpoint returns exactly the two existing units", "real_dossier_test_writes": false}, + "installation": {"migrations": 0, "imports": 0, "republication": false, "new_roles": false, "geometry_changes": false, "automatic_fiscal_calculation": false} +} diff --git a/docs/investmoz/unification/traceability-and-manual.md b/docs/investmoz/unification/traceability-and-manual.md index f28634d4..0c1b0112 100644 --- a/docs/investmoz/unification/traceability-and-manual.md +++ b/docs/investmoz/unification/traceability-and-manual.md @@ -2,6 +2,8 @@ ## Território adaptado ao corredor — decisão funcional da Tempo, 23/10/2026 +Revisão funcional `0025309b` integrada pelo Git e disponível na homologação. Conferência do destino apenas de leitura: o serviço territorial para Maputo devolve exactamente as duas unidades existentes, sem consultar ou gravar um dossier real. A prova de recuperação e confirmação de Sofala/Dondo foi feita no dossier sintético QA, com indicação **Dados confirmados**. A prévia apresenta nomes e alterações úteis ao investidor, omitindo campos de identificadores internos. + Aplicada a tabela da Tempo como configuração do percurso existente (`config/investment_corridors.php`), usando os códigos e identificadores do cadastro territorial já aceite. Pemba–Lichinga: Cabo Delgado/Niassa; Nacala: Nampula; Vale do Zambeze: Tete/Zambézia; Beira: Sofala/Manica; Limpopo: Gaza; Maputo: **Maputo Província e Maputo Cidade**, conforme o esclarecimento final da Tempo. Só Nacala e Limpopo têm uma única província e a seleccionam automaticamente quando ainda não existe localização. Maputo exige escolher entre as duas unidades. Esta configuração funcional não declara novos limites geográficos nem altera os mestres, as associações ou as fichas publicadas. Na preparação, cada oportunidade mantém a sua localização separada. O corredor inicial vem da fonte da ficha quando disponível; o investidor pode escolher outro corredor para o seu investimento, sem alterar a associação publicada da oportunidade. Uma mudança conserva o caminho ainda compatível; se a província deixar de pertencer ao corredor, retira os níveis territoriais dependentes e explica a alteração. A província única é proposta automaticamente; um território documentado ou previamente confirmado continua protegido pela confirmação de alternativa aplicável. A localização da primeira oportunidade alimenta os campos gerais existentes; outras escolhas permanecem identificadas separadamente. diff --git a/resources/js/pages/investor-path/context.tsx b/resources/js/pages/investor-path/context.tsx index e1501673..3504bc58 100644 --- a/resources/js/pages/investor-path/context.tsx +++ b/resources/js/pages/investor-path/context.tsx @@ -45,7 +45,7 @@ export default function ContextEditor({ territorySelection?: TerritoryOption[]; requestedChoices?: OpportunityChoice[] | null; entrySources?: string[]; - draft?: {needs_review?:boolean;selection?:Partial>;declarations?:Record;replace_fields?:string[];document_links?:Record}|null; + draft?: {draft_sequence?:number;needs_review?:boolean;selection?:Partial>;declarations?:Record;replace_fields?:string[];document_links?:Record}|null; }) { const navigation = useNavigationContext(); const [choices, setChoices] = useState(requestedChoices ?? initial.context.opportunity_choices ?? []); @@ -100,7 +100,7 @@ export default function ContextEditor({ const latestDraft=useRef(draftBody);latestDraft.current=draftBody; const skipNextDraft=useRef(false); const confirmedDraftBody=useRef(null); - const sequence=useRef({body:'',value:Date.now()}); + const sequence=useRef({body:'',value:Math.max(Date.now(),draft?.draft_sequence??0)}); if(sequence.current.body!==draftBody)sequence.current={body:draftBody,value:Math.max(Date.now(),sequence.current.value+1)}; useEffect(()=>{ if(busy||corridorLoading||corridorError)return; @@ -654,7 +654,7 @@ export default function ContextEditor({ {plan.documents_preserved}{' '} documentos.{' '} - {plan.maintained.map((x) => ( + {plan.maintained.filter(x=>!x.field.endsWith('_id')).map((x) => (

{contextFieldNames[ x.field @@ -670,7 +670,7 @@ export default function ContextEditor({ Atualizado pela nova seleção - {plan.updated.map((x) => ( + {plan.updated.filter(x=>!x.field.endsWith('_id')).map((x) => (

{contextFieldNames[ x.field