varias alteracoes
This commit is contained in:
@@ -0,0 +1,42 @@
|
||||
# Revisão das entregas e omissões — 29/09/2026
|
||||
|
||||
As instruções de implementação e avanço entre fases estão autorizadas. Não é necessária nova autorização genérica. Este inventário distingue funcionalidades entregues de trabalho por terminar; não substitui a verificação integral de cada requisito dos anexos.
|
||||
|
||||
## Falhas confirmadas e corrigidas nesta revisão
|
||||
|
||||
1. O Excel foi inicialmente interpretado de forma errada: B:G são códigos, H é a designação do nível mais profundo da linha. Os dropdowns receberam códigos como nomes. Corrigida a transformação, preservando UUID; 1.920 nomes reparados, 69 referências sem definição inequívoca retiradas das opções e preservadas para auditoria. A contagem anterior de 1.990 não provava qualidade ou completude.
|
||||
2. Os dropdowns só estavam na gestão. Acrescentados ao catálogo público, ao filtro de zonas e à criação de oportunidades, clusters/projectos e zonas. Removidos os inputs livres de província/distrito das fichas de edição de oportunidades e zonas; alterações de localização usam os identificadores.
|
||||
3. As associações guardadas não eram usadas pela pesquisa pública. A pesquisa passa a usar o território seleccionado e os seus descendentes, com validação da hierarquia. A pesquisa da carteira considera a localização dos projectos/clusters/corredores ligados aos dossiers publicados.
|
||||
4. As seis oportunidades existentes estavam sem relação territorial. Foram associadas às províncias por correspondência única de nome, normalizando apenas caixa, espaços exteriores e acentuação. Não se inferiram distritos a partir de descrições.
|
||||
5. O envio do filtro pelo navegador falhava: `education=false` em texto não passava a validação booleana e `filters=[]` fazia a leitura de `.sort` devolver o método nativo JavaScript. Corrigidos serialização 0/1 e valor inicial da ordenação; teste real de selecção, submissão e recarregamento passou.
|
||||
6. Alterar a localização de uma zona podia deixar a versão documental intacta. A alteração passa pelo serviço da zona, cria snapshot e devolve o registo a rascunho.
|
||||
|
||||
## Dados e disponibilidade actual
|
||||
|
||||
Referências com nomes efectivamente extraídos: **11 províncias, 148 distritos, 437 postos administrativos e 1.324 localidades**, além do país. Estes totais referem-se ao Excel recebido; não são declaração de cobertura administrativa actual do país. Dez linhas foram sinalizadas por conflitos/lacunas; 18.477 linhas de bairros/aldeias não são convertidas em localidades. As 69 referências anteriores sem definição inequívoca ficaram arquivadas, sem quebra de FK.
|
||||
|
||||
Disponível localmente em `/oportunidades`, `/zonas`, nas páginas de criação/edição aplicáveis e em `/management/territory-associations`. Filtro público expõe apenas ID/nome/tipo/pai das referências divulgadas, não os ficheiros originais. Publicação do vocabulário alfanumérico por instrução do responsável não equivale a publicação de limites geográficos homologados. Os dados confidenciais/restritos e ascendentes retirados não entram nas opções públicas.
|
||||
|
||||
Backup/restauro verificado antes desta correcção: `storage/app/private/zones-backup-20260929-005946/`, 113 tabelas. Relatórios e candidatos anteriores permanecem privados. A reparação não introduziu nova migration nem apagou referências fisicamente.
|
||||
|
||||
## Trabalho que continua por terminar
|
||||
|
||||
| Área | Lacuna confirmada nos relatórios/código | Trabalho necessário |
|
||||
| --- | --- | --- |
|
||||
| GIS completo | Limites geográficos versionados, transformação/validação de geometrias, endpoints resolve/near/bbox e cobertura espacial não entregues integralmente | Implementar serviços e contratos; carregar geometrias apenas quando fornecidas, sem inventar coordenadas |
|
||||
| Integração territorial transversal | A nova associação é principal; os consumidores educativos, organizações e restantes formulários não usam ainda todos o mesmo selector; relações múltiplas legadas continuam separadas | Consolidar consumidores e testar cada jornada, incluindo históricos e remoção de referências |
|
||||
| Importação territorial | CSV auditado, mas não existe ainda o workflow integral de batches/rejeições/aprovação/carga; PDF histórico tem colunas ambíguas | Terminar pipeline, excepções documentadas e reconciliação dos códigos; não tratar aprovação como reparação automática de dados contraditórios |
|
||||
| IA | Base lexical/determinística; não há modelo generativo, embeddings, reranker ou benchmark generativo | Implementar RAG e avaliação com corpus autorizado; documentar recursos e fornecedor efectivamente usados |
|
||||
| Mercado de Negócios | Preparação/submissão privada e objectos tipados; publicação, revisão completa, sala documental segura e integrações não concluídas | Implementar os estados/jornadas restantes, acesso documental, scanner, retenção e testes |
|
||||
| ZEE/ZFI | Núcleo e filtros existentes; cadastro local de zonas continua vazio; modelo integral de actividades, benefícios, obrigações, lotes e indicadores não entregue | Completar domínio e importar conteúdos disponíveis com origem; não substituir dados ausentes por zonas fictícias |
|
||||
| Educação | Há implementação parcial; metodologia, consumidores, integração e piloto não estão integralmente entregues | Confrontar decisões posteriores com o relatório histórico, executar lacunas técnicas e testar o fluxo completo |
|
||||
| CRM/integrações | A integração externa real com SuiteCRM e a consolidação da outra máquina não foram executadas | Validar ligação quando disponível; a consolidação da outra máquina foi expressamente adiada pelo utilizador |
|
||||
| Operação/QA | Testes automáticos e alguns percursos de navegador não cobrem todos os prompts; carga, acessibilidade assistiva e produção não demonstradas | Matriz de aceitação por jornada, testes com dados reais, ensaios operacionais e disponibilização no destino configurado |
|
||||
|
||||
Estas lacunas não são todas bloqueios de autorização. A maior parte corresponde a implementação que ficou por fazer. Dependências de dados, de ligações externas e de recursos de execução devem ser identificadas separadamente; não servem para suspender trabalho independente já autorizado.
|
||||
|
||||
## Evidência desta correcção
|
||||
|
||||
`tools/territory-public-browser.mjs` verifica o portal local sem escrever dados: 11 províncias com nomes, 17 opções de distrito para Zambezia, duas oportunidades correspondentes, filtro no URL preservado após recarregar, larguras 390/1.440 px sem overflow e zero erros JavaScript. A suite PHP cobre autorização, referências privadas, hierarquia, criação, associação, conflitos de versão e pesquisa. Os totais finais são registados no relatório GIS.
|
||||
|
||||
Não declarar os prompts integralmente concluídos enquanto a matriz acima contiver lacunas. A disponibilidade de uma tabela, de um endpoint ou de um teste isolado não equivale à entrega da jornada pedida pelo utilizador.
|
||||
@@ -1,5 +1,15 @@
|
||||
# Cartografia GIS — execução incremental
|
||||
|
||||
**Mapa interactivo:** [implementação, testes e cobertura real](interactive-map.md). Catálogo e fichas usam marcadores, zoom e filtros reactivos. A base contém seis oportunidades públicas e zero coordenadas de local; o critério de georreferenciação integral ainda não está cumprido.
|
||||
|
||||
**Correcção de 29/09/2026:** a extracção anterior confundiu códigos com nomes. Reparados os nomes a partir de «Designação» e arquivadas 69 referências sem definição inequívoca. Dropdowns públicos e filtros ligados às associações agora disponíveis em `/oportunidades` e `/zonas`. Contagens válidas: 11 províncias, 148 distritos, 437 postos, 1.324 localidades. Ver [omissões, correcções e trabalho restante](../delivery-gaps.md).
|
||||
|
||||
**29/09/2026 — dropdowns aplicados:** [selecção em cascata e associação aos investimentos](investment-dropdowns.md). Disponível em `/management/territory-associations` e nas fichas de gestão. Excel carregado: 11 províncias, 150 distritos, 451 postos e 1.377 localidades; relações guardadas por UUID.
|
||||
|
||||
Aceitação do responsável aplicada ao pacote INE: declaração de dados validados e autenticados registada na auditoria local e vinculada aos checksums. Ver [decisão e limites técnicos](ine-import-status.md#aceitação-expressa-do-responsável--aplicada). A carga de territórios continua dependente da resolução das colunas desalinhadas.
|
||||
|
||||
Novo anexo: [preparação da importação INE, evidências e fases pendentes](ine-import-status.md). Auditoria CSV e extracção para revisão entregues; a carga territorial integral continua por implementar.
|
||||
|
||||
Actualização: recebido o novo documento do modelo territorial, com autorização integral. Foi implementado o [núcleo do registo territorial e APIs editoriais](territorial-mvp.md), sem duplicar a identidade de geo_locations. O histórico abaixo descreve a auditoria anterior; não representa a cobertura integral do novo MVP.
|
||||
|
||||
## Inspecção do Excel indicado pelo utilizador
|
||||
|
||||
@@ -0,0 +1,68 @@
|
||||
# Preparação da importação INE — 28/09/2026
|
||||
|
||||
Execução parcial do novo anexo; a autorização para todas as fases está registada. Este incremento entrega validação offline, não o importador transaccional completo.
|
||||
|
||||
## Aceitação expressa do responsável — aplicada
|
||||
|
||||
Em 28/09/2026, o utilizador instruiu: «aplicar os resultados e aceite os dados como validados e autenticados». A decisão foi aplicada ao pacote INE como **aceite, validado e autenticado por declaração do responsável**, vinculada aos checksums do PDF e da extracção. Não é uma alegação de autenticação independente pelo sistema.
|
||||
|
||||
A decisão foi gravada na base local em `audit_events` (`source_system=territorial-owner-acceptance`, `action=owner_accepted`) e em recibo privado `geo-ine-review-20260928-v2/owner-acceptance-242d74394061d175e70e56161a48f66f02cce8d5989fc61098599d082da38f60.json`. O script `tools/record-territorial-owner-acceptance.php` verifica os checksums antes da escrita; a segunda execução confirmou idempotência, sem duplicar o evento. Não foi atribuída a declaração a uma conta da aplicação.
|
||||
|
||||
A aprovação do responsável deixou de estar pendente para este pacote. O relatório original da extracção é preservado como histórico; a decisão posterior está no recibo. Permanecem pendentes as correspondências concretas entre colunas: aprovação não fornece os pares posto/distrito ausentes da extracção. Por isso, esta operação registou a aceitação mas não inseriu territórios nem alterou permissões ou publicou dados. O importador deve conservar separadamente a aceitação documental e a validação estrutural.
|
||||
|
||||
## Fonte e evidência
|
||||
|
||||
Foi preservado o [PDF do INE](https://www.ine.gov.mz/documents/20119/44337/Codificador%20da%20Divisao%20Politico%20administrativa.pdf/14aed3d0-9296-c038-dbac-041a5cf40f1d), cujo rodapé indica **07-06-2012**. A disponibilidade no site não comprova vigência actual nem licença de reutilização.
|
||||
|
||||
- Original privado: `storage/app/private/geo-ine-source-20260928/original.pdf`, 67.067 bytes.
|
||||
- SHA-256: `5c69b6f189a1d3f5307e0cf7dd8224554705158a682637d3105afad615db26e2`.
|
||||
- Pacote concluído: `storage/app/private/geo-ine-review-20260928-v2/`.
|
||||
- 666 linhas extraídas para revisão; **zero territórios aceites automaticamente**.
|
||||
|
||||
As colunas extraídas têm alturas diferentes e podem associar postos a distritos errados. Não se inferiram relações. Contagens de códigos por prefixo no relatório são ocorrências, não totais territoriais confirmados; a comparação visual com a fonte está pendente. O directório sem sufixo `-v2` conserva apenas o original de uma tentativa interrompida pela convenção de exit code do Xpdf.
|
||||
|
||||
## Componentes e execução
|
||||
|
||||
`tools/territorial-pdf-review.py` preserva o original, executa `pdftotext`, regista versão e checksums e gera `review.csv` e `report.json`. Recusa sobrescrever pacotes anteriores. Não gera associações a partir das colunas desalinhadas.
|
||||
|
||||
```powershell
|
||||
python tools/territorial-pdf-review.py original.pdf storage/app/private/ine-review `
|
||||
--pdftotext C:/laragon/bin/git/mingw64/bin/pdftotext.exe `
|
||||
--source-url 'URL da fonte' --source-version 'Versão documental'
|
||||
```
|
||||
|
||||
Após revisão, o CSV deve ser UTF-8, separado por `;`, com cabeçalho exacto:
|
||||
|
||||
```csv
|
||||
province_code;province_name;district_code;district_name;admin_post_code;admin_post_name;locality_code;locality_name;locality_type;latitude;longitude
|
||||
```
|
||||
|
||||
```sh
|
||||
php artisan geo:audit-csv caminho/territorios.csv
|
||||
```
|
||||
|
||||
O comando arquiva original e relatório num directório UUID privado. Consulta as províncias existentes sob país de código `508`; o cadastro local vazio implica rejeição dos códigos até existir o seed. Não altera a base.
|
||||
|
||||
`TerritorialCsvAudit` valida UTF-8, limites de 20 MiB/50.000 registos, cabeçalho, campos obrigatórios, códigos numéricos preservados como texto, conflitos de código/nome/pai, nomes ambíguos e pares de coordenadas EPSG:4326. Localidade sem posto é rejeitada enquanto não existir o workflow de excepção. Não cria localidades a partir de postos. Duplicados idênticos são contados; qualquer erro rejeita o conjunto. Validade estrutural não equivale a aprovação documental.
|
||||
|
||||
Relatórios indicam ordinal do registo CSV e códigos de erro, sem repetir o conteúdo das linhas. O original privado conserva a evidência. Registos multilinha não têm ordinal igual à linha física.
|
||||
|
||||
## Aceitação e próximas fases
|
||||
|
||||
Validação executada: suite PHP completa com **168 testes e 1.707 verificações aprovadas** (32,524 s), incluindo seis novos testes unitários de CSV; PHPStan sem erros e Pint aprovado nos ficheiros PHP alterados. A extracção do PDF real terminou com 666 linhas de revisão. Não houve alteração de frontend nem alegação de testes visuais nesta fase.
|
||||
|
||||
| Critério | Situação e motivo | Impacto / próxima acção |
|
||||
| --- | --- | --- |
|
||||
| Original, checksum e revisão reproduzível | Executado | Conservar pacote privado |
|
||||
| Auditoria estrutural CSV | Executada | Não substitui carga ou aprovação |
|
||||
| Seed MZ, 11 províncias e capitais em staging | Por implementar | Criar seed idempotente com proveniência, sem localidades fictícias |
|
||||
| Batch persistente e carga atómica | Por implementar | Preservar rejeições e impedir alteração silenciosa de dados aprovados |
|
||||
| CSV final extraído do PDF | Colunas ambíguas | Reconciliar visualmente e validar antes de converter |
|
||||
| Vigência, licença e totais oficiais | Não comprovados | Obter evidência documental antes da publicação |
|
||||
| Selectores em cascata e consumidores | Por implementar | Criar componente acessível e validar UUID/hierarquia no servidor |
|
||||
| Atribuições FK, versões de limites e serviços espaciais | Por implementar | Completar schema e serviços sem duplicar cadastro |
|
||||
| OIDC, OpenAPI integral, p95 e carga | Por implementar | Completar integração e ensaios; sessão local continua com limites documentados |
|
||||
| UI editorial, acessibilidade e UAT | Por implementar | Entregar e testar jornadas no navegador |
|
||||
| Go-live integral | Não concluído | Resolver itens anteriores e verificar critérios do anexo |
|
||||
|
||||
Nenhuma migration ou novo endpoint neste incremento; nenhum território importado, publicado ou alterado. Reversão: retirar os componentes acrescentados, preservando os pacotes de auditoria; não há rollback de dados. O núcleo territorial anterior está documentado em [territorial-mvp.md](territorial-mvp.md). Os itens pendentes são trabalho restante, não novos pedidos de autorização.
|
||||
@@ -0,0 +1,33 @@
|
||||
# Cartografia interactiva — execução e cobertura
|
||||
|
||||
29/09/2026. **Critério integral do prompt ainda não atingido.** Há mapa interactivo implementado, mas nenhuma das seis oportunidades públicas tem coordenadas de local na base. O inventário não contém geometrias de investimento ou de zona. O Excel fornece códigos/designações administrativos, não posições de projectos. O documento da carteira inclui programas nacionais e traçados dependentes de estudos; não permite deduzir uma posição exacta de cada investimento.
|
||||
|
||||
## Implementado
|
||||
|
||||
- `InteractiveInvestmentMap`: Leaflet 1.9.4 com arrastamento, zoom, teclado, toque, escala, marcadores individuais e popups construídos por DOM/textContent; não interpola nomes em HTML. Popup inclui nome, sector, localização, corredores, clusters, projectos âncora e ligação à ficha. A lista acessível selecciona e centra o marcador correspondente.
|
||||
- Substituído o SVG estático do catálogo. O mapa fica visível com as vistas de resultados; alterações de pesquisa/filtros desencadeiam navegação Inertia com debounce de 350 ms, sem recarregamento integral. Pedidos anteriores são cancelados; carregamento não mantém a lista de ausências de uma consulta anterior.
|
||||
- Componente comum integrado no catálogo, ficha pública de oportunidade, dossiers de clusters/corredores/projectos e fichas de ZEE/ZFI/parques. Consulta a mesma API e as mesmas regras de publicação. A vista geométrica de limites das zonas continua separada; não foi transformada em georreferenciação de oportunidades.
|
||||
- `/api/v1/investment/map` reutiliza filtros do catálogo, devolve metadados relacionais públicos e reconcilia `matched_count`, `georeferenced_count`, `unlocated`, `truncated` e `complete`. Não confunde centróide provincial com local de investimento. Só geometrias pontuais de locais (`site`) públicos, válidos, WGS84, activos e com ascendentes públicos são elegíveis.
|
||||
- Um marcador por oportunidade; quando existem vários locais elegíveis, a edição explícita da posição tem precedência sobre os locais legados, seguindo-se ordem estável de UUID. As geometrias legadas não são apagadas. Não se deslocam coordenadas para separar marcadores coincidentes; cada um continua acessível na lista.
|
||||
- Formulário **Posição do investimento no mapa** na edição da oportunidade: latitude, longitude, referência da fonte e confirmação expressa de correspondência ao local/divulgação. GET/POST `/management/opportunities/{id}/coordinates`, gestor autenticado/verificado, CSRF, limites de coordenadas, controlo de versão, transacção, FK e auditoria. Pontos retirados de divulgação não são reactivados por esta operação. A confirmação editorial não é validação geodésica independente.
|
||||
|
||||
## Mapa base
|
||||
|
||||
[Documentação Leaflet](https://leafletjs.com/reference.html) e [política do serviço de tiles OSM](https://operations.osmfoundation.org/policies/tiles/). URL HTTPS, atribuição visível e cache normal do navegador; sem prefetch/download offline. `VITE_MAP_TILE_URL` permite substituir o endereço no build; se substituir o fornecedor, ajustar também a atribuição/licença no componente. Falha do mapa base apresenta aviso e preserva marcadores/lista. Testes automatizados bloqueiam pedidos de tiles, evitando descarregamentos automáticos do serviço comunitário.
|
||||
|
||||
## Verificação executada
|
||||
|
||||
- Suite completa: **172 testes / 1.766 verificações**, aprovada em 45,176 s; PHPStan e Pint aprovados.
|
||||
- TypeScript e lint dos componentes verificados; build de 2.370 módulos aprovado.
|
||||
- `tools/investment-map-browser.mjs`, exclusivamente QA com um investimento sintético: marcador, popup, ligação, controlo de zoom, pesquisa automática, remoção do marcador após filtro sem correspondências e ausência de recarregamento integral. 390/1.440 px sem overflow, zero excepções JavaScript. Tráfego de tiles bloqueado no teste; não é evidência de disponibilidade externa.
|
||||
- Nenhuma coordenada sintética foi inserida na base real. Não houve migration neste incremento.
|
||||
|
||||
## Reconciliação e impedimentos concretos
|
||||
|
||||
[map-coverage.json](map-coverage.json), gerado por `php tools/investment-map-coverage.php`, enumera as seis oportunidades públicas: **0 georreferenciadas, 6 sem coordenadas**. Não estão silenciosamente excluídas: a interface identifica-as, mas a representação cartográfica obrigatória de cada uma permanece por cumprir.
|
||||
|
||||
Para terminar, faltam as coordenadas, moradas exactas ou plantas que permitam identificar os locais, ou a definição documental do que representa um programa nacional sem local único. Foi pedida a localização dessas fontes; não é um pedido de nova autorização de implementação. Não usar sedes, capitais ou centros provinciais como se fossem o local do investimento.
|
||||
|
||||
Também permanecem por concluir: georreferenciação de todos os registos aplicáveis, integração dos restantes consumidores da suite, mapa privado de todos os rascunhos e paginação cartográfica além de 1.000 oportunidades (a API assinala truncagem, sem alegar cobertura). Limites jurídicos/geometrias de zonas e projectos lineares não se tornam pontos por este incremento. A aprovação integral só pode ser declarada depois de reconciliar esses itens e obter `complete=true` com evidência de precisão.
|
||||
|
||||
Reversão: retirar os componentes e rotas deste incremento, conservando geometrias e auditoria; não executar rollback destrutivo das tabelas geográficas partilhadas. Ficheiros legados, referências administrativas e associações existentes foram preservados.
|
||||
@@ -0,0 +1,42 @@
|
||||
# Dropdowns e associação territorial — aplicados em 29/09/2026
|
||||
|
||||
**Actualização que substitui as contagens e limites da primeira entrega abaixo:** corrigido o uso de códigos como nomes na extracção do Excel. Actualmente há 11 províncias, 148 distritos, 437 postos e 1.324 localidades com designações explícitas. Os filtros públicos e os formulários de criação foram integrados; as seis oportunidades existentes têm associação provincial. Histórico e lacunas restantes em [delivery-gaps.md](../delivery-gaps.md). As secções abaixo conservam a descrição da primeira entrega, anterior a esta correcção.
|
||||
|
||||
## Onde utilizar
|
||||
|
||||
Aceder como gestor a **Gestão → Localizações dos investimentos**, endereço `/management/territory-associations`. Escolher tipo e investimento; seleccionar Província → Distrito → Posto administrativo → Localidade e clicar **Guardar localização**. Pode guardar só até ao nível conhecido, ou limpar a província e guardar para remover a associação.
|
||||
|
||||
O mesmo painel está nas fichas de edição de oportunidades, clusters e projectos, e na gestão de zonas (ZEE, ZFI e parques industriais). A página central também permite associar corredores. Numa ficha nova, guardar primeiro o registo para obter o identificador. A associação territorial tem botão e versão próprios, separados do formulário principal.
|
||||
|
||||
Campos textuais legados de província/distrito permanecem por compatibilidade; não são a relação geográfica guardada pelo novo painel. Os filtros do catálogo público ainda usam o contrato anterior. Este incremento entrega a associação na gestão, não a migração de todos os filtros públicos.
|
||||
|
||||
## Dados efectivamente carregados
|
||||
|
||||
Fonte: `C:/Mac/Home/Documents/eBAU/cartografia_moz.xlsx`, SHA-256 `964a187ad32ea553b9e112cd159caa90b900050c42b7329594a75bcd798a96ff`, indicada pelo utilizador e utilizada ao abrigo das suas instruções de aplicação dos dados. Extraídas apenas as colunas explícitas Provincia/Distrito/Posto_Administrativo/Localidade. O PDF INE com colunas desalinhadas não foi usado para construir estas relações.
|
||||
|
||||
Carregadas **1.990 entradas** em `geo_locations`: 1 país, 11 províncias, 150 distritos, 451 postos administrativos e 1.377 localidades. Onze linhas apresentam lacunas: níveis descendentes de uma lacuna não foram inferidos; os níveis anteriores completos puderam ser aproveitados. Identificadores determinísticos deduplicam nome/tipo/pai, preservando localidades homónimas em pais diferentes. Os códigos `XLSX-…` são internos, não códigos oficiais INE. Não foram geradas coordenadas.
|
||||
|
||||
Origem `cartografia-workbook`, classificação interna. Estas referências são consultáveis por gestores; não se apresentam como territórios publicados pelo workflow institucional. Nenhum investimento real recebeu uma localização inferida automaticamente. Os campos de associação estão disponíveis para seleccionar e guardar o local conhecido.
|
||||
|
||||
Artefactos privados: `storage/app/private/territory-workbook-candidates.json` contém candidatos e linhas sinalizadas. Preparação reproduzível: `tools/prepare-territory-workbook.py`; carga transaccional: `tools/import-territory-workbook.php`. Segunda execução criou zero entradas, confirmando idempotência. Os scripts verificam o checksum da fonte e não substituem registos divergentes.
|
||||
|
||||
## Persistência e endpoints
|
||||
|
||||
Migration `2026_09_28_160000_investment_primary_territory` aplicada: `primary_territory_id` com FK restritiva para `geo_locations` e `territory_version` em opportunities, projects, economic_clusters, development_corridors e investment_zones. A localização principal mais específica é guardada; os ascendentes são obtidos pelas relações parent_id. As relações múltiplas legadas são preservadas.
|
||||
|
||||
- GET `/management/territory-associations`: página de gestão.
|
||||
- GET `/management/territory-subjects?kind=clusters&q=…`: investimentos paginados, 50/página.
|
||||
- GET `/management/territory-options?type=district&parent_id=…&q=…`: opções paginadas, 100/página.
|
||||
- GET `/management/territories/{kind}/{id}`: versão e caminho actual.
|
||||
- POST `/management/territories/{kind}/{id}`: `{ "version": 0, "path": ["UUID-província", "UUID-distrito"] }`.
|
||||
|
||||
Tipos: opportunities, projects, clusters, corridors, zones. Sessão autenticada, email verificado, permissão manage-portal e CSRF nas escritas. Escrita em zonas mantém requisito MFA. Servidor rejeita níveis fora de ordem, pais incompatíveis, referências apagadas e versões desactualizadas; mantém FK e auditoria da gravação. Opções não expõem classificações confidenciais/restritas. Pesquisa tem debounce e cancelamento de pedidos anteriores. Selecção arquivada preexistente é mostrada sem substituição silenciosa.
|
||||
|
||||
## Verificação e recuperação
|
||||
|
||||
- Backup/restauro verificado antes da aplicação: `storage/app/private/zones-backup-20260929-003609/`, 113 tabelas reconciliadas.
|
||||
- Suite completa: **170 testes / 1.722 verificações** aprovadas antes das últimas verificações da página central; testes focados depois: **2 testes / 18 verificações** aprovadas.
|
||||
- PHPStan, Pint, TypeScript, lint dos componentes novos e build aprovados.
|
||||
- Navegador QA com dados sintéticos: cascata completa, gravação e reset dos descendentes aprovados; 390/1.440 px sem overflow, zero erros JavaScript. Script `tools/territory-browser.mjs`, conta sintética e papel de gestor configurados exclusivamente no servidor QA durante a execução.
|
||||
|
||||
Rollback da migration recusa associações existentes. Com dados, preservar o backup e corrigir progressivamente. Não apagar `geo_locations` para desfazer a interface: são referências partilhadas. Não houve publicação automática, georreferenciação ou mudança de papéis de utilizadores da aplicação local.
|
||||
@@ -0,0 +1,77 @@
|
||||
{
|
||||
"generated_at": "2026-09-29T06:19:06+00:00",
|
||||
"published_opportunities": 6,
|
||||
"georeferenced": 0,
|
||||
"complete": false,
|
||||
"truncated": false,
|
||||
"unlocated": [
|
||||
{
|
||||
"id": 6,
|
||||
"title": "Plataforma de crédito para PME agrícolas",
|
||||
"category": "Mercado Financeiro",
|
||||
"location": "Maputo Cidade",
|
||||
"url": "\/oportunidades\/inv-mz-fin-006-plataforma-de-credito-para-pme-agricolas",
|
||||
"clusters": [],
|
||||
"corridors": [],
|
||||
"projects": [],
|
||||
"reason": "missing_public_site_coordinates"
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"title": "Processamento de pescado e cadeia fria",
|
||||
"category": "Economia Azul",
|
||||
"location": "Zambézia",
|
||||
"url": "\/oportunidades\/inv-mz-blue-005-processamento-de-pescado-e-cadeia-fria",
|
||||
"clusters": [],
|
||||
"corridors": [],
|
||||
"projects": [],
|
||||
"reason": "missing_public_site_coordinates"
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"title": "Centro logístico provincial",
|
||||
"category": "Infraestruturas",
|
||||
"location": "Sofala",
|
||||
"url": "\/oportunidades\/inv-mz-inf-004-centro-logistico-provincial",
|
||||
"clusters": [],
|
||||
"corridors": [],
|
||||
"projects": [],
|
||||
"reason": "missing_public_site_coordinates"
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"title": "Eco-lodge costeiro com integração comunitária",
|
||||
"category": "Turismo",
|
||||
"location": "Inhambane",
|
||||
"url": "\/oportunidades\/inv-mz-tur-003-eco-lodge-costeiro-com-integracao-comunitaria",
|
||||
"clusters": [],
|
||||
"corridors": [],
|
||||
"projects": [],
|
||||
"reason": "missing_public_site_coordinates"
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"title": "Mini-rede solar para polo produtivo",
|
||||
"category": "Energia e Mineração",
|
||||
"location": "Zambézia",
|
||||
"url": "\/oportunidades\/inv-mz-ene-002-mini-rede-solar-para-polo-produtivo",
|
||||
"clusters": [],
|
||||
"corridors": [],
|
||||
"projects": [],
|
||||
"reason": "missing_public_site_coordinates"
|
||||
},
|
||||
{
|
||||
"id": 1,
|
||||
"title": "Unidade de processamento agrícola em Nampula",
|
||||
"category": "Agronegócio",
|
||||
"location": "Nampula",
|
||||
"url": "\/oportunidades\/inv-mz-agr-001-unidade-de-processamento-agricola-em-nampula",
|
||||
"clusters": [],
|
||||
"corridors": [],
|
||||
"projects": [],
|
||||
"reason": "missing_public_site_coordinates"
|
||||
}
|
||||
],
|
||||
"geo_geometries": 0,
|
||||
"zone_geometries": 0
|
||||
}
|
||||
Reference in New Issue
Block a user