fix: concluir apresentacao publica dos negocios e zonas
tests / ci (push) Canceled after 0s

This commit is contained in:
2026-10-20 19:00:32 +02:00
parent fd341b627e
commit 0e7d51f18f
4 changed files with 130 additions and 113 deletions
@@ -27,7 +27,7 @@
},
{
"path": "docs/investmoz/unification/traceability-and-manual.md",
"sha256": "e5400717643bde98a3b1e1163c4a4ebd4c6a774a168a3f5430c46cc3f850f5d8"
"sha256": "5596aa8edbbeff34a13613ec11f00f49c62e76a8e2185e5762d972fc70b667e7"
},
{
"path": "docs/investmoz/v2/auditoria-portal/backlog-priorizado.csv",
@@ -87,7 +87,7 @@
},
{
"path": "resources/js/pages/investment/business-marketplace.tsx",
"sha256": "fb6917c095f5ade85f52adeaf1292486627097e4f0daf0211f2b3627620ccd85"
"sha256": "f45a56b250bbb5da19613c6b7ad94ba89ea501929f97636c797d92b4a2251b51"
},
{
"path": "resources/js/pages/investment/catalogue.tsx",
@@ -107,7 +107,7 @@
},
{
"path": "resources/js/pages/investment/zones.tsx",
"sha256": "45244ce4be7e75b4d52c453f90d1764cd4d7a5ab4299d6f0af91c68fbf103ebd"
"sha256": "5fecb308c3800f6e2ee266fd8559d2b14bea3214f2ffbeb4b651b86f2bed7ea7"
},
{
"path": "resources/js/pages/portal/services.tsx",
@@ -138,7 +138,7 @@
"sha256": "f19ff2d17a385ab1f28c65f69233a13d88d6b8b6ec7285848fcd2a945b883ff9"
}
],
"build_manifest_sha256": "2e2113d46d7f89ff94851b88a8d023ca4427d57d4f1361bf9577aef8d3aa64af",
"build_manifest_sha256": "da35948622e0754e4ecc25247b8926dfcafa63c4fcb78a94da91a3c6e8b47451",
"migrations": [],
"data_operations": [],
"remote_operations": [],
@@ -1519,3 +1519,5 @@ Incremento ainda necessário: interpretação delimitada de palavras/sector/geog
Rever a branch e o manifesto nominal; reconciliar novos commits dos programadores antes da integração. Após decisão da Tempo, a cadeia Git existente compila a revisão aprovada de fontes e build. Esta execução não envia para `main`, não escreve no servidor e não altera conteúdos, schema, contas, papéis, MFA ou configuração.
Não há migrations, importação ou publicação neste pacote. A reversão repõe as fontes/build da revisão anterior através da cadeia existente, preservando a base, uploads, referências, permissões e dados posteriores. Os helpers de contexto só transportam query local; não aceitam URL externa como destino de retorno. O manifesto lista fontes e hash do build QA; não inclui `.env`, credenciais, dumps, vendor/node_modules ou fixtures persistentes.
Conferência final dos consumidores: negócios também conferido no navegador com pesquisa vazia; retirado o resumo local repetido, conservando o resumo partilhado. Fintech é identificado como especialização do Mercado Financeiro também nesse selector. Os cartões de zonas traduzem categoria, desenvolvimento, disponibilidade e estado de actividade, preservando os códigos e significados persistidos. A vista combinada não repete na lista de não localizados a ficha que já aparece na lista principal.
@@ -165,7 +165,9 @@ export default function BusinessMarketplace({
key={option.id}
value={String(option.id)}
>
{option.label}
{/fintech/i.test(option.label)
? 'Fintech — especialização do Mercado Financeiro'
: option.label}
</option>
),
)}
@@ -288,21 +290,12 @@ export default function BusinessMarketplace({
)}
<button className={button}>Pesquisar</button>
</form>
<p role="status">
{results.meta?.total ?? results.data.length} anúncios de
negócios publicados
</p>
{!results.data.length && (
<p role="status">
Não existem oportunidades publicadas com estes critérios.
</p>
)}
<ul className="grid gap-4 md:grid-cols-2">
{results.data.map((record) => (
<li className={card} key={record.id}>
<p>
{businessModalities[record.modality] ??
record.modality}
'Modalidade por indicar'}
</p>
<h2 className="text-xl font-bold">
<Link
+120 -98
View File
@@ -182,7 +182,7 @@ export default function Zones({
maxLength={120}
/>
</Field>
<Field label="Categoria">
<Field label="Grupo">
<select
className={input}
name="category"
@@ -196,93 +196,115 @@ export default function Zones({
</option>
</select>
</Field>
<Field label="Categoria física">
<select
className={input}
name="physical_category"
defaultValue={filters.physical_category ?? ''}
>
<option value="">Todas</option>
<option value="industrial_park">
Parque industrial
</option>
<details className="w-full rounded border p-3">
<summary className="cursor-pointer font-semibold">
Mais filtros
</summary>
<div className="grid gap-3 sm:grid-cols-2 lg:grid-cols-3">
<Field label="Tipo de espaço">
<select
className={input}
name="physical_category"
defaultValue={filters.physical_category ?? ''}
>
<option value="">Todas</option>
<option value="industrial_park">
Parque industrial
</option>
{zoneExtensionsAvailable && (
<>
<option value="agro_industrial_park">
Parque agro-industrial
</option>
<option value="industrial_logistics_park">
Parque industrial e logístico
</option>
</>
)}
<option value="industrial_free_zone">
ZFI
</option>
<option value="economic_zone">ZEE</option>
</select>
</Field>
<Field label="Actividade documentada">
<input
className={input}
name="activity"
defaultValue={filters.activity}
maxLength={120}
/>
</Field>
<Field label="Regime jurídico">
<select
className={input}
name="legal_regime"
defaultValue={filters.legal_regime ?? ''}
>
<option value="">Todos</option>
<option value="zee">ZEE</option>
<option value="zfi">ZFI</option>
<option value="general">Regime geral</option>
<option value="pending">Por confirmar</option>
</select>
</Field>
{zoneExtensionsAvailable && (
<>
<option value="agro_industrial_park">
Parque agro-industrial
</option>
<option value="industrial_logistics_park">
Parque industrial e logístico
</option>
</>
<Field label="Desenvolvimento">
<select
className={input}
name="development_status"
defaultValue={
filters.development_status ?? ''
}
>
<option value="">Todos</option>
<option value="announced">Anunciado</option>
<option value="planned">Planeado</option>
<option value="in_development">
Em desenvolvimento
</option>
<option value="partially_operational">
Parcialmente operacional
</option>
<option value="operational">
Operacional
</option>
<option value="unknown">
Por confirmar
</option>
</select>
</Field>
)}
<option value="industrial_free_zone">ZFI</option>
<option value="economic_zone">ZEE</option>
</select>
</Field>
<Field label="Actividade documentada">
<input
className={input}
name="activity"
defaultValue={filters.activity}
maxLength={120}
/>
</Field>
<Field label="Regime jurídico">
<select
className={input}
name="legal_regime"
defaultValue={filters.legal_regime ?? ''}
>
<option value="">Todos</option>
<option value="zee">ZEE</option>
<option value="zfi">ZFI</option>
<option value="general">Regime geral</option>
<option value="pending">Por confirmar</option>
</select>
</Field>
{zoneExtensionsAvailable && (
<Field label="Desenvolvimento">
<select
className={input}
name="development_status"
defaultValue={filters.development_status ?? ''}
>
<option value="">Todos</option>
<option value="announced">Anunciado</option>
<option value="planned">Planeado</option>
<option value="in_development">
Em desenvolvimento
</option>
<option value="partially_operational">
Parcialmente operacional
</option>
<option value="operational">Operacional</option>
<option value="unknown">Por confirmar</option>
</select>
</Field>
)}
{zoneExtensionsAvailable && (
<Field label="Disponibilidade">
<select
className={input}
name="availability_status"
defaultValue={filters.availability_status ?? ''}
>
<option value="">Todas</option>
<option value="confirmed">Confirmada</option>
<option value="unavailable">Indisponível</option>
<option value="reported_unverified">
Reportada, por verificar
</option>
<option value="not_informed">Não informada</option>
</select>
</Field>
)}
{zoneExtensionsAvailable && (
<Field label="Disponibilidade">
<select
className={input}
name="availability_status"
defaultValue={
filters.availability_status ?? ''
}
>
<option value="">Todas</option>
<option value="confirmed">
Confirmada
</option>
<option value="unavailable">
Indisponível
</option>
<option value="reported_unverified">
Reportada, por verificar
</option>
<option value="not_informed">
Não informada
</option>
</select>
</Field>
)}
</div>
</details>
<TerritoryFields initial={territorySelection} />
<button className={button}>Pesquisar</button>
</form>
<p role="status">{records.total} registos disponíveis</p>
{!management && (
<a
className="underline"
@@ -327,7 +349,11 @@ export default function Zones({
</Link>
)}
<p>
{zone.code} · {zone.category.toUpperCase()} ·{' '}
{zone.code} ·{' '}
{zone.category === 'industrial_park'
? 'Parque industrial'
: zone.category.toUpperCase()}{' '}
·{' '}
{[zone.district, zone.province]
.filter(Boolean)
.join(', ') || 'Localização por confirmar'}
@@ -335,28 +361,24 @@ export default function Zones({
{zone.legal_regime && (
<p>
Regime jurídico:{' '}
{zone.category === 'industrial_park'
? (parkLabels[zone.legal_regime] ??
zone.legal_regime.toUpperCase())
: zone.legal_regime.toUpperCase()}
{parkLabels[zone.legal_regime] ??
(['zee', 'zfi'].includes(zone.legal_regime)
? zone.legal_regime.toUpperCase()
: 'Por confirmar')}
</p>
)}
{zoneExtensionsAvailable && zone.development_status && (
<p>
Desenvolvimento:{' '}
{zone.category === 'industrial_park'
? (parkLabels[zone.development_status] ??
'Por confirmar')
: zone.development_status.replaceAll('_', ' ')}
{parkLabels[zone.development_status] ??
'Por confirmar'}
</p>
)}
{zoneExtensionsAvailable && zone.availability_status && (
<p>
Disponibilidade para instalação:{' '}
{zone.category === 'industrial_park'
? (parkLabels[zone.availability_status] ??
'Não informada')
: zone.availability_status.replaceAll('_', ' ')}
{parkLabels[zone.availability_status] ??
'Não informada'}
</p>
)}
{zone.area_value && (
@@ -378,7 +400,7 @@ export default function Zones({
{zone.activities
.map(
(activity) =>
`${activity.name} (${activity.status})`,
`${activity.name} (${({ potential: 'Potencial referido pela fonte', proposed: 'Proposta', authorized: 'Autorizada por documento', conditional: 'Condicionada', excluded: 'Excluída' } as Record<string, string>)[activity.status] ?? 'Por confirmar'})`,
)
.join(' · ')}
</p>
@@ -415,7 +437,7 @@ export default function Zones({
</p>
)}
<p>{zone.description}</p>
<p>Validação: {zone.validation_status}</p>
{management && <p>Validação: {zone.validation_status}</p>}
{management && (
<p>
Versão {zone.version_no} · {zone.publication_status}