Integrate mining and energy references into sector and dossier journeys
This commit is contained in:
@@ -8,7 +8,9 @@ use App\Services\InvestmentGuides;
|
||||
use App\Services\InvestmentZonePathContext;
|
||||
use App\Services\InvestorPath;
|
||||
use App\Services\LegacyContent;
|
||||
use App\Services\SectorResourceReferences;
|
||||
use App\Services\SectorInvestment;
|
||||
use App\Services\VirtualDesk;
|
||||
use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Illuminate\Http\Request;
|
||||
@@ -32,6 +34,9 @@ class InvestorPathController extends Controller
|
||||
{
|
||||
abort_unless($path->available(), 404);
|
||||
$data = ['contexts' => $path->contexts($request->user()), 'sectorSource' => app(SectorInvestment::class)->context($sectorSlug)];
|
||||
if (isset(SectorResourceReferences::SOURCES[$sectorSlug]) && $request->filled('resource_area')) {
|
||||
$data['resourceSource'] = app(SectorResourceReferences::class)->selection($sectorSlug, ['area_id' => $request->query('resource_area'), 'location_label' => $request->query('resource_location'), 'group_id' => $request->query('resource_group'), 'source_sha256' => $request->query('resource_source')]);
|
||||
}
|
||||
|
||||
return $request->expectsJson() ? response()->json($data) : Inertia::render('investor-path/index', $data);
|
||||
}
|
||||
@@ -73,14 +78,28 @@ class InvestorPathController extends Controller
|
||||
if ($sector !== null) {
|
||||
app(SectorInvestment::class)->context($sector);
|
||||
}
|
||||
$reference = $request->input('sector_reference');
|
||||
if ($reference !== null) {
|
||||
abort_unless(isset(SectorResourceReferences::SOURCES[$sector]) && is_array($reference), 422);
|
||||
app(SectorResourceReferences::class)->selection($sector, $reference);
|
||||
}
|
||||
$source = $request->input('content_resource_id');
|
||||
if ($source !== null) {
|
||||
$resourceId = filter_var($source, FILTER_VALIDATE_INT);
|
||||
abort_unless(is_int($resourceId) && $resourceId !== 0, 422);
|
||||
app(LegacyContent::class)->articleForResource($resourceId);
|
||||
}
|
||||
$id = DB::transaction(function () use ($path, $request, $source, $sector, $zone): string {
|
||||
$id = DB::transaction(function () use ($path, $request, $source, $sector, $zone, $reference): string {
|
||||
if ($reference !== null) {
|
||||
DB::table('users')->where('id', $request->user()->id)->lockForUpdate()->first();
|
||||
}
|
||||
$existingReferenceCase = $reference !== null ? DB::table('desk_cases')->where('user_id', $request->user()->id)->where('client_key', $request->input('client_key'))->first() : null;
|
||||
$id = $path->create($request->user(), $request->all());
|
||||
if ($existingReferenceCase) {
|
||||
$selection = app(SectorResourceReferences::class)->selection($sector, $reference);
|
||||
$oldPayload = app(VirtualDesk::class)->decode($existingReferenceCase->payload);
|
||||
abort_unless(array_any($oldPayload['investor_path']['sector_references'] ?? [], fn ($row) => $row['key'] === $selection['key']), 409, 'A chave de criação já foi usada com outra referência sectorial; recupere o dossier existente.');
|
||||
}
|
||||
if ($source !== null) {
|
||||
$case = $path->view($request->user(), $id)['case'];
|
||||
app(LegacyContent::class)->attach($request->user(), $id, ['version' => $case['version'], 'resource_id' => (int) $source]);
|
||||
@@ -88,7 +107,7 @@ class InvestorPathController extends Controller
|
||||
|
||||
if ($sector !== null) {
|
||||
$case = $path->view($request->user(), $id)['case'];
|
||||
app(SectorInvestment::class)->attach($request->user(), $id, ['version' => $case['version'], 'sector_slug' => $sector]);
|
||||
app(SectorInvestment::class)->attach($request->user(), $id, ['version' => $case['version'], 'sector_slug' => $sector, 'sector_reference' => $reference]);
|
||||
}
|
||||
|
||||
if ($zone) {
|
||||
|
||||
@@ -127,6 +127,10 @@ final class InvestmentPreparationWorkspace
|
||||
{
|
||||
$objects = [['key' => 'investment:'.$case->id, 'label' => $case->title, 'kind' => 'investment']];
|
||||
$evidence = [];
|
||||
foreach ($context['sector_references'] ?? [] as $reference) {
|
||||
$current = hash_equals((SectorResourceReferences::SOURCES[$reference['sector_slug']] ?? ''), $reference['source_sha256'] ?? '') ? $reference : ['unavailable' => true, 'source_sha256' => (SectorResourceReferences::SOURCES[$reference['sector_slug']] ?? '')];
|
||||
$evidence['sector-resource:'.$reference['key']] = ['key' => 'sector-resource:'.$reference['key'], 'label' => $reference['title'], 'consulted' => $reference, 'current' => $current, 'notice' => 'Referência sectorial e de cadeia de valor; não certifica direitos, licenças nem disponibilidade de projecto.'];
|
||||
}
|
||||
$refs = array_values($context['selection'] ?? []);
|
||||
foreach ($context['opportunity_choices'] ?? [] as $choice) {
|
||||
$refs[] = $choice['opportunity'];
|
||||
|
||||
@@ -142,6 +142,9 @@ final class InvestorContext
|
||||
$zone = $context['selection']['park'] ?? null;
|
||||
$context['fields']['investment_regime'] = $zone['fields']['investment_regime'] ?? 'general';
|
||||
$context['fields']['special_zone_id'] = $zone['id'] ?? '';
|
||||
if (! empty($payload['investor_path']['sector_references'])) {
|
||||
$context['sector_references'] = $payload['investor_path']['sector_references'];
|
||||
}
|
||||
|
||||
return $context;
|
||||
}
|
||||
|
||||
@@ -173,6 +173,7 @@ final class InvestorPath
|
||||
'results' => $results, 'requests' => $requests, 'documents' => $documents,
|
||||
'zone_contexts' => ($owner || $manager) ? ($path['zone_contexts'] ?? []) : [],
|
||||
'sector_contexts' => ($owner || $manager) ? ($path['sector_contexts'] ?? []) : [],
|
||||
'sector_references' => ($owner || $manager) ? ($path['sector_references'] ?? []) : [],
|
||||
'content_sources' => ($owner || $manager) ? ($path['content_sources'] ?? []) : [],
|
||||
'tasks' => DB::table('tasks')->where('desk_case_id', $id)
|
||||
->whereNull('deleted_at')
|
||||
|
||||
@@ -74,7 +74,7 @@ final class SectorInvestment
|
||||
}
|
||||
}
|
||||
|
||||
return ['articles' => $articles, 'relations' => collect($relations)->unique('id')->values()->all(), 'locations' => $locations,
|
||||
return ['resource_reference' => isset(SectorResourceReferences::SOURCES[$sector->slug]) ? app(SectorResourceReferences::class)->view($sector->slug) : null, 'articles' => $articles, 'relations' => collect($relations)->unique('id')->values()->all(), 'locations' => $locations,
|
||||
'start_href' => app(InvestorPath::class)->available() ? '/investimentos/a-partir-do-setor/'.$sector->slug : null,
|
||||
'start_notice' => app(InvestorPath::class)->available() ? null : 'O percurso para guardar a ideia está temporariamente indisponível. A consulta e o apoio continuam disponíveis.',
|
||||
'register_href' => app(PortalProfileAccess::class)->available() ? ($creation ? $creation.'?sector_id='.$sector->id : '/perfil/promotor') : null,
|
||||
@@ -114,24 +114,31 @@ final class SectorInvestment
|
||||
*/
|
||||
public function attach(User $actor, string $id, array $input): void
|
||||
{
|
||||
$data = Validator::make($input, ['version' => 'required|integer|min:1', 'sector_slug' => 'required|string|max:150'])->validate();
|
||||
$data = Validator::make($input, ['version' => 'required|integer|min:1', 'sector_slug' => 'required|string|max:150', 'sector_reference' => 'nullable|array'])->validate();
|
||||
$context = $this->context($data['sector_slug']);
|
||||
abort_if(! empty($data['sector_reference']) && ! isset(SectorResourceReferences::SOURCES[$context['slug']]), 422);
|
||||
$reference = isset($data['sector_reference']) ? app(SectorResourceReferences::class)->selection($context['slug'], $data['sector_reference']) : null;
|
||||
abort_unless(app(InvestorPath::class)->available(), 404);
|
||||
DB::transaction(function () use ($actor, $id, $data, $context) {
|
||||
DB::transaction(function () use ($actor, $id, $data, $context, $reference) {
|
||||
$desk = app(VirtualDesk::class);
|
||||
$case = $desk->case($actor, $id, true, true);
|
||||
abort_if($case->closed_at, 409, 'O dossier está encerrado.');
|
||||
abort_unless(DB::table('investor_journeys')->where('id', $case->journey_id)->whereNotNull('path_definition_id')->whereNull('deleted_at')->exists(), 409, 'Este dossier conserva outro roteiro.');
|
||||
$payload = $desk->decode($case->payload);
|
||||
foreach ($payload['investor_path']['sector_contexts'] ?? [] as $existing) {
|
||||
if ($existing['id'] === $context['id']) {
|
||||
return;
|
||||
}
|
||||
$hasSector = array_any($payload['investor_path']['sector_contexts'] ?? [], fn ($row) => $row['id'] === $context['id']);
|
||||
$hasReference = $reference !== null && array_any($payload['investor_path']['sector_references'] ?? [], fn ($row) => $row['key'] === $reference['key']);
|
||||
if ($hasSector && ($reference === null || $hasReference)) {
|
||||
return;
|
||||
}
|
||||
abort_unless((int) $case->version === $data['version'], 409, 'O dossier foi alterado; recupere a versão atual.');
|
||||
$payload['investor_path']['sector_contexts'][] = [...$context, 'actor_id' => $actor->id, 'saved_at' => now()->toIso8601String()];
|
||||
if (! $hasSector) {
|
||||
$payload['investor_path']['sector_contexts'][] = [...$context, 'actor_id' => $actor->id, 'saved_at' => now()->toIso8601String()];
|
||||
}
|
||||
if ($reference !== null && ! $hasReference) {
|
||||
$payload['investor_path']['sector_references'][] = [...$reference, 'actor_id' => $actor->id, 'saved_at' => now()->toIso8601String()];
|
||||
}
|
||||
DB::table('desk_cases')->where('id', $id)->update(['payload' => $desk->encode($payload), 'version' => $case->version + 1, 'updated_at' => now()]);
|
||||
$desk->event($desk->case($actor, $id), $actor, 'sector_context_referenced', ['sector_id' => $context['id'], 'sector_slug' => $context['slug']]);
|
||||
$desk->event($desk->case($actor, $id), $actor, 'sector_context_referenced', ['sector_id' => $context['id'], 'sector_slug' => $context['slug'], 'sector_reference_key' => $reference['key'] ?? null]);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,82 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services;
|
||||
|
||||
use App\Support\CheckedFile;
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
|
||||
/** Versioned reference content over existing sector pages and private dossiers. */
|
||||
final class SectorResourceReferences
|
||||
{
|
||||
public const SOURCES = [
|
||||
'mineracao' => '7202fb5986b40e62347867c653770030683ffec2701a2921e84342f15e9f3d8a',
|
||||
'energia-especifica' => '2d9d94ac70115ade43c4093a4d5b302aaa93623a149f936615c38ba67b1e2bd2',
|
||||
];
|
||||
|
||||
// Generated data are checked independently from the unchanged Word originals.
|
||||
public const DATA = [
|
||||
'mineracao' => ['file' => 'mining-reference-20261111.json', 'hash' => '173c1fda9e20997436704d0e8e3a9a6d1be9b0dba4eb8b5f3d4c1e5fbb1020b8'],
|
||||
'energia-especifica' => ['file' => 'energy-reference-20261111.json', 'hash' => '3c1c33e68a710c65114f5db232eceb732f8894a1825baa52683e70a6e5a1f2bf'],
|
||||
];
|
||||
|
||||
/** @return array<string,mixed> */
|
||||
public function data(string $sector): array
|
||||
{
|
||||
abort_unless(isset(self::DATA[$sector]), 404);
|
||||
$path = database_path('data/'.self::DATA[$sector]['file']);
|
||||
abort_unless(hash_equals(self::DATA[$sector]['hash'], CheckedFile::sha256($path)), 503, 'A versão das referências sectoriais mudou.');
|
||||
$data = json_decode(CheckedFile::read($path), true, 512, JSON_THROW_ON_ERROR);
|
||||
abort_unless(($data['source_sha256'] ?? null) === self::SOURCES[$sector], 503, 'Reconciliar a versão da referência antes de usar.');
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
/** @return array<string,mixed> */
|
||||
public function view(string $sector): array
|
||||
{
|
||||
$data = $this->data($sector);
|
||||
$mining = $sector === 'mineracao';
|
||||
$groups = $mining ? $data['minerals'] : $data['groups'];
|
||||
$risks = $data['risks'];
|
||||
if ($mining) {
|
||||
$start = array_find_key($risks, fn ($text) => str_starts_with($text, 'Riscos e pontos'));
|
||||
$end = array_find_key($risks, fn ($text) => str_starts_with($text, 'Próximos passos'));
|
||||
$risks = $start !== null && $end !== null ? array_slice($risks, $start + 1, $end - $start - 1) : [];
|
||||
}
|
||||
|
||||
return ['sector_slug' => $sector, 'title' => $mining ? 'Mineração e cadeias de valor' : 'Energia e cadeias de valor',
|
||||
'introduction' => $mining ? 'Explore recursos minerais por localização e possibilidades de fornecimento, logística, energia e transformação. São referências para preparar o investimento; uma ocorrência não identifica uma concessão ou um projecto disponível.' : 'Explore gás natural, electricidade, renováveis e as actividades da cadeia de valor. Distinga projectos de referência, propostas, previsões e possibilidades de fornecimento ao preparar o investimento.',
|
||||
'group_label' => $mining ? 'Grupo mineral' : 'Segmento energético',
|
||||
'resource_heading' => $mining ? 'Recursos e localização' : 'Segmentos e âmbito territorial',
|
||||
'resource_notice' => $mining ? 'A localização é a indicada para o grupo de minérios. Quando a fonte não discrimina a distribuição de cada minério, não se presume que todos ocorram em todos os locais.' : 'Bacias, localidades, corredores e províncias conservam o âmbito indicado na fonte. Uma localização não delimitada fica por definir no investimento; uma referência não significa concurso aberto ou projecto disponível.',
|
||||
'source_sha256' => self::SOURCES[$sector], 'reference_date' => $data['reference_date'],
|
||||
'groups' => array_map(fn ($group) => [...array_diff_key($group, ['province_names' => true]), 'location_labels' => $group['location_labels'] ?? $group['province_names']], $groups),
|
||||
'areas' => array_map(fn ($area) => [...array_diff_key($area, ['source_fields' => true, 'province_names' => true, 'mineral_ids' => true]), 'location_labels' => $area['location_labels'] ?? $area['province_names'], 'group_ids' => $area['group_ids'] ?? $area['mineral_ids']], $data['areas']),
|
||||
'projects' => $data['projects'], 'indicators' => array_map(fn ($row) => ['label' => $row['mineral'], 'value' => $row['value'], 'source' => $row['source']], $data['indicators']),
|
||||
'risks' => $risks, 'sources' => $data['sources'], 'source_links' => $data['source_links'] ?? [], 'background' => $data['background'] ?? []];
|
||||
}
|
||||
|
||||
/** @param array<string,mixed> $input
|
||||
* @return array<string,mixed> */
|
||||
public function selection(string $sector, array $input): array
|
||||
{
|
||||
abort_unless(isset(self::SOURCES[$sector]), 422);
|
||||
$input = Validator::make($input, ['area_id' => 'required|string', 'source_sha256' => 'required|string|size:64', 'location_label' => 'nullable|string|max:150', 'group_id' => 'nullable|string'])->validate();
|
||||
abort_unless(hash_equals(self::SOURCES[$sector], $input['source_sha256']), 409, 'A referência foi actualizada; recupere a selecção actual.');
|
||||
$data = $this->view($sector);
|
||||
$area = array_find($data['areas'], fn ($row) => $row['id'] === $input['area_id']);
|
||||
abort_unless($area, 422, 'Escolha uma área de referência existente.');
|
||||
$group = isset($input['group_id']) ? array_find($data['groups'], fn ($row) => $row['id'] === $input['group_id']) : null;
|
||||
abort_if(isset($input['group_id']) && (! $group || ! in_array($group['id'], $area['group_ids'], true)), 422, 'O grupo escolhido não corresponde à cadeia de valor.');
|
||||
$location = $input['location_label'] ?? null;
|
||||
abort_if($location !== null && ! in_array($location, $area['location_labels'], true), 422, 'A localização escolhida não consta desta área de referência.');
|
||||
$snapshot = ['sector_slug' => $sector, 'source_sha256' => self::SOURCES[$sector], 'reference_date' => $data['reference_date'],
|
||||
'group_id' => $group['id'] ?? null, 'group_name' => $group['name'] ?? null, 'area_id' => $area['id'], 'title' => $area['title'], 'location_label' => $location,
|
||||
'locations_text' => $area['locations_text'], 'indicative_location' => $area['indicative_location'], 'value_chain' => $area['value_chain'], 'market_evidence' => $area['market_evidence'],
|
||||
'source_row' => $area['source_row'], 'source_state' => $area['source_state'], 'coordinates' => null, 'promotion_ready' => false,
|
||||
'territory_precision' => $location === null ? 'source_area_reference' : ($location === 'Maputo' ? 'province_or_city_unspecified' : 'source_location_reference'),
|
||||
'href' => '/sectores/'.$sector.'?'.http_build_query(['resource_area' => $area['id'], 'resource_location' => $location, 'resource_group' => $group['id'] ?? null])];
|
||||
|
||||
return ['key' => hash('sha256', json_encode([$sector, self::SOURCES[$sector], $area['id'], $location, $group['id'] ?? null], JSON_THROW_ON_ERROR)), ...$snapshot];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,807 @@
|
||||
{
|
||||
"format": "investmoz-energy-reference-v1",
|
||||
"source_sha256": "2d9d94ac70115ade43c4093a4d5b302aaa93623a149f936615c38ba67b1e2bd2",
|
||||
"source_document_name": "Oportunidades de investimento em energia.docx",
|
||||
"reference_date": "2026-11-11",
|
||||
"title": "Energia e cadeias de valor em Moçambique",
|
||||
"groups": [
|
||||
{
|
||||
"id": "EN-GAS",
|
||||
"name": "Gás natural e GNL",
|
||||
"locations_text": "Bacia do Rovuma; Buzi. A fonte não atribui todas as áreas a uma província. Projectos de GNL; base logística de Pemba. Gasoduto Norte–Sul; corredor Palma–Maputo, apresentado como proposta de estudo. Corredor Palma–Maputo proposto no estudo; implantação de cada indústria por definir. Implantação a definir no investimento; sem localização discriminada na fonte.",
|
||||
"location_labels": [
|
||||
"Bacia do Rovuma",
|
||||
"Buzi",
|
||||
"Pemba",
|
||||
"Norte–Sul",
|
||||
"Palma–Maputo"
|
||||
],
|
||||
"coordinates": null
|
||||
},
|
||||
{
|
||||
"id": "EN-POWER",
|
||||
"name": "Electricidade, hidroeléctricas e redes",
|
||||
"locations_text": "Rio Zambeze; Maputo–Temane; interligação Moçambique–Zâmbia. Âmbitos de projecto, sem coordenadas.",
|
||||
"location_labels": [
|
||||
"Rio Zambeze",
|
||||
"Maputo–Temane",
|
||||
"Moçambique–Zâmbia"
|
||||
],
|
||||
"coordinates": null
|
||||
},
|
||||
{
|
||||
"id": "EN-SOLAR",
|
||||
"name": "Solar, armazenamento e sistemas fora da rede",
|
||||
"locations_text": "Mocuba (Zambézia), Metoro (Cabo Delgado), Cuamba (Niassa) e Afungi. Sistemas fora da rede: implantação a definir.",
|
||||
"location_labels": [
|
||||
"Zambézia",
|
||||
"Mocuba",
|
||||
"Cabo Delgado",
|
||||
"Metoro",
|
||||
"Niassa",
|
||||
"Cuamba",
|
||||
"Afungi"
|
||||
],
|
||||
"coordinates": null
|
||||
},
|
||||
{
|
||||
"id": "EN-WIND",
|
||||
"name": "Energia eólica",
|
||||
"locations_text": "Namaacha (Maputo, sem distinção entre província e cidade na fonte).",
|
||||
"location_labels": [
|
||||
"Namaacha",
|
||||
"Maputo"
|
||||
],
|
||||
"coordinates": null
|
||||
},
|
||||
{
|
||||
"id": "EN-HYDROGEN",
|
||||
"name": "Hidrogénio verde",
|
||||
"locations_text": "Sem implantação concreta identificada na fonte.",
|
||||
"location_labels": [],
|
||||
"coordinates": null
|
||||
},
|
||||
{
|
||||
"id": "EN-BIO",
|
||||
"name": "Biocombustíveis",
|
||||
"locations_text": "Implantação a definir; a fonte não discrimina locais de produção.",
|
||||
"location_labels": [],
|
||||
"coordinates": null
|
||||
},
|
||||
{
|
||||
"id": "EN-GREEN",
|
||||
"name": "Parques industriais verdes",
|
||||
"locations_text": "Corredores e parques sem implantação discriminada na fonte.",
|
||||
"location_labels": [],
|
||||
"coordinates": null
|
||||
}
|
||||
],
|
||||
"areas": [
|
||||
{
|
||||
"id": "ENE-01",
|
||||
"title": "Gás natural — Upstream",
|
||||
"group_ids": [
|
||||
"EN-GAS"
|
||||
],
|
||||
"locations_text": "Bacia do Rovuma; Buzi. A fonte não atribui todas as áreas a uma província.",
|
||||
"location_labels": [
|
||||
"Bacia do Rovuma",
|
||||
"Buzi"
|
||||
],
|
||||
"value_chain": "Concursos de áreas, campos maduros (Buzi), parcerias com empresas locais. Perfil de investidor: Operadores e parceiros locais.",
|
||||
"market_evidence": "A bacia do Rovuma concentra as maiores oportunidades do país. O Mozambique LNG (Área 1) prevê uma capacidade anual de 12,9 milhões de toneladas; o Coral Norte FLNG (Eni) teve decisão final de investimento em 2025, com 3,6 milhões de toneladas anuais a partir de 2028; e o Rovuma LNG (ExxonMobil), estimado em cerca de 24 mil milhões de dólares, aproxima-se da decisão final de investimento. Para investidores e empresas nacionais, as oportunidades estendem-se a engenharia, construção, logística, serviços marítimos, telecomunicações e manutenção industrial. No mercado interno, o Instituto Nacional de Petróleo identifica áreas como o gasoduto Norte-Sul, o campo maduro de Buzi, o GNL de pequena escala, o armazenamento de GPL e a base logística de Pemba.",
|
||||
"indicative_location": "Bacia do Rovuma; Buzi. A fonte não atribui todas as áreas a uma província.",
|
||||
"source_row": "table4:row1; paragraph:34,paragraph:35",
|
||||
"source_state": "Referência para preparação",
|
||||
"availability": "reference_only",
|
||||
"promotion_ready": false,
|
||||
"coordinates": null
|
||||
},
|
||||
{
|
||||
"id": "ENE-02",
|
||||
"title": "Gás natural — Construção e serviços",
|
||||
"group_ids": [
|
||||
"EN-GAS"
|
||||
],
|
||||
"locations_text": "Projectos de GNL; base logística de Pemba.",
|
||||
"location_labels": [
|
||||
"Pemba"
|
||||
],
|
||||
"value_chain": "Engenharia, logística, serviços marítimos, telecomunicações, manutenção, formação. Perfil de investidor: PME nacionais e parcerias internacionais.",
|
||||
"market_evidence": "Para investidores e empresas nacionais, as oportunidades estendem-se a engenharia, construção, logística, serviços marítimos, telecomunicações e manutenção industrial. No mercado interno, o Instituto Nacional de Petróleo identifica áreas como o gasoduto Norte-Sul, o campo maduro de Buzi, o GNL de pequena escala, o armazenamento de GPL e a base logística de Pemba. Está prevista uma componente de formação para 15.734 moçambicanos (custo estimado em 126 milhões de dólares) e a capacitação de 355 pequenas e médias empresas na fase de construção e cerca de 1.500 na fase operacional. O ministro apelou a parcerias com entidades estrangeiras especializadas para transferência de conhecimento e tecnologia.",
|
||||
"indicative_location": "Projectos de GNL; base logística de Pemba.",
|
||||
"source_row": "table4:row2; paragraph:35,paragraph:58",
|
||||
"source_state": "Referência para preparação",
|
||||
"availability": "reference_only",
|
||||
"promotion_ready": false,
|
||||
"coordinates": null
|
||||
},
|
||||
{
|
||||
"id": "ENE-03",
|
||||
"title": "Gás natural — Midstream",
|
||||
"group_ids": [
|
||||
"EN-GAS"
|
||||
],
|
||||
"locations_text": "Gasoduto Norte–Sul; corredor Palma–Maputo, apresentado como proposta de estudo.",
|
||||
"location_labels": [
|
||||
"Norte–Sul",
|
||||
"Palma–Maputo"
|
||||
],
|
||||
"value_chain": "Gasodutos Norte-Sul e Palma–Maputo, armazenamento de GPL, GNL de pequena escala. Perfil de investidor: Investidores em infra-estruturas.",
|
||||
"market_evidence": "Para investidores e empresas nacionais, as oportunidades estendem-se a engenharia, construção, logística, serviços marítimos, telecomunicações e manutenção industrial. No mercado interno, o Instituto Nacional de Petróleo identifica áreas como o gasoduto Norte-Sul, o campo maduro de Buzi, o GNL de pequena escala, o armazenamento de GPL e a base logística de Pemba. Um estudo do Programa de Partilha de Conhecimentos (KSP) propõe um corredor energético Palma–Maputo para integrar petroquímica, fertilizantes e geração eléctrica, e destaca o gás natural veicular (GNV) nos transportes.",
|
||||
"indicative_location": "Gasoduto Norte–Sul; corredor Palma–Maputo, apresentado como proposta de estudo.",
|
||||
"source_row": "table4:row3; paragraph:35,paragraph:51",
|
||||
"source_state": "Referência para preparação",
|
||||
"availability": "reference_only",
|
||||
"promotion_ready": false,
|
||||
"coordinates": null
|
||||
},
|
||||
{
|
||||
"id": "ENE-04",
|
||||
"title": "Gás natural — Industrialização",
|
||||
"group_ids": [
|
||||
"EN-GAS"
|
||||
],
|
||||
"locations_text": "Corredor Palma–Maputo proposto no estudo; implantação de cada indústria por definir.",
|
||||
"location_labels": [
|
||||
"Palma–Maputo"
|
||||
],
|
||||
"value_chain": "Fertilizantes, petroquímica, geração eléctrica a gás. Perfil de investidor: Grupos industriais e produtores independentes de energia.",
|
||||
"market_evidence": "O Governo defende que o gás natural não deve ser visto apenas como produto de exportação, mas como matéria-prima para criar indústrias, empresas e emprego, com usos que vão da electricidade aos fertilizantes. O ministro dos Recursos Minerais e Energia identificou como desafios do sector privado o acesso a financiamento, a certificação e a tecnologia. Um estudo do Programa de Partilha de Conhecimentos (KSP) propõe um corredor energético Palma–Maputo para integrar petroquímica, fertilizantes e geração eléctrica, e destaca o gás natural veicular (GNV) nos transportes. Fertilizantes: o grupo Export Trading Group (ETG) manifestou, em Outubro de 2026, interesse em produzir fertilizantes a partir do gás natural, com o objectivo de liderar a produção na África Subsariana.",
|
||||
"indicative_location": "Corredor Palma–Maputo proposto no estudo; implantação de cada indústria por definir.",
|
||||
"source_row": "table4:row4; paragraph:50,paragraph:51,paragraph:53",
|
||||
"source_state": "Referência para preparação",
|
||||
"availability": "reference_only",
|
||||
"promotion_ready": false,
|
||||
"coordinates": null
|
||||
},
|
||||
{
|
||||
"id": "ENE-05",
|
||||
"title": "Gás natural — Mercado final",
|
||||
"group_ids": [
|
||||
"EN-GAS"
|
||||
],
|
||||
"locations_text": "Implantação a definir no investimento; sem localização discriminada na fonte.",
|
||||
"location_labels": [],
|
||||
"value_chain": "GNV, biocombustíveis, mobilidade eléctrica. Perfil de investidor: Empresas de distribuição e mobilidade.",
|
||||
"market_evidence": "Gás natural veicular e biocombustíveis: o Governo considera GNV, conversão de gás em electricidade, mobilidade eléctrica e biocombustíveis respostas à volatilidade dos preços dos combustíveis. Mercado interno: gasodutos e projectos de GNV orientados para o consumo doméstico abrem espaço ao sector privado.",
|
||||
"indicative_location": "Implantação a definir no investimento; sem localização discriminada na fonte.",
|
||||
"source_row": "table4:row5; paragraph:55,paragraph:56",
|
||||
"source_state": "Referência para preparação",
|
||||
"availability": "reference_only",
|
||||
"promotion_ready": false,
|
||||
"coordinates": null
|
||||
},
|
||||
{
|
||||
"id": "ENE-06",
|
||||
"title": "Hidroeléctricas, redes e interligações",
|
||||
"group_ids": [
|
||||
"EN-POWER"
|
||||
],
|
||||
"locations_text": "Rio Zambeze; Maputo–Temane; interligação Moçambique–Zâmbia. Âmbitos de projecto, sem coordenadas.",
|
||||
"location_labels": [
|
||||
"Rio Zambeze",
|
||||
"Maputo–Temane",
|
||||
"Moçambique–Zâmbia"
|
||||
],
|
||||
"value_chain": "Fornecimento de subestações, transformadores, protecções eléctricas, SCADA e modernização de redes.",
|
||||
"market_evidence": "A Hidroeléctrica de Cahora Bassa, com 2.075 MW instalados, mantém um papel central. Estão em preparação a barragem de Mphanda Nkuwa (1.500 MW no rio Zambeze, com conclusão prevista para 2031), a expansão de Cahora Bassa Norte (1.250 MW) e a linha de transmissão Maputo-Temane. A modernização da rede da EDM e a interligação Moçambique-Zâmbia de 400 kV, apoiada pelo BAD, abrem espaço para fornecimento de subestações, transformadores, protecções eléctricas e sistemas SCADA, além de reforçar a exportação regional de energia. Hidroeléctrica: a ETS prevê 3,5 GW de nova capacidade hídrica entre 2024 e 2030, incluindo a conclusão de Mphanda Nkuwa (1.500 MW), um projecto que o Governo procurou apresentar a parceiros estratégicos. Solar e eólica: a ETS prevê um programa de leilões de energia renovável para impulsionar estas fontes, bem como a expansão e modernização da rede para absorver a nova geração.",
|
||||
"indicative_location": "Rio Zambeze; Maputo–Temane; interligação Moçambique–Zâmbia. Âmbitos de projecto, sem coordenadas.",
|
||||
"source_row": "paragraphs:37,38,67,68",
|
||||
"source_state": "Referência para preparação",
|
||||
"availability": "reference_only",
|
||||
"promotion_ready": false,
|
||||
"coordinates": null
|
||||
},
|
||||
{
|
||||
"id": "ENE-07",
|
||||
"title": "Solar, baterias e sistemas fora da rede",
|
||||
"group_ids": [
|
||||
"EN-SOLAR"
|
||||
],
|
||||
"locations_text": "Mocuba (Zambézia), Metoro (Cabo Delgado), Cuamba (Niassa) e Afungi. Sistemas fora da rede: implantação a definir.",
|
||||
"location_labels": [
|
||||
"Zambézia",
|
||||
"Mocuba",
|
||||
"Cabo Delgado",
|
||||
"Metoro",
|
||||
"Niassa",
|
||||
"Cuamba",
|
||||
"Afungi"
|
||||
],
|
||||
"value_chain": "Produção solar, sistemas de armazenamento, fornecimento e manutenção de equipamentos e soluções fora da rede.",
|
||||
"market_evidence": "Moçambique recebe cerca de 2.500 horas de sol por ano e dispõe de potencial eólico ao longo da costa. A estratégia nacional prevê 2 GW de energia solar até 2030, e já existem projectos como a central solar de 7,1 MW associada ao complexo de Afungi e um parque solar de 400 MW ligado a Cahora Bassa. Os sistemas fora da rede permitem ainda alargar o acesso à electricidade onde a rede é mais lenta ou dispendiosa de expandir. Os projectos abaixo estão documentados em fontes oficiais (MIREME e EDM) ou em comunicados dos promotores. Mostram o modelo dominante: produtores independentes em parceria com a EDM, com contratos de compra de energia de longo prazo e financiamento de instituições de desenvolvimento. Os dados de Metoro diferem entre fontes, sobretudo no valor do investimento, por isso devem ser confirmados com a EDM. Em Mocuba, parte da receita anual destina-se a programas sociais na comunidade, e a Cuamba é um dos primeiros projectos do país a integrar armazenamento em baterias, o que sugere oportunidades em sistemas de armazenamento. Estado actual: segundo o director-executivo da Globeleq em Moçambique, as centrais de Mocuba e Cuamba estão em operação, foram adquiridas pela empresa em Dezembro de 2023 e injectam 48 MW na rede da EDM (33 MW em Mocuba e 15 MW em Cuamba), reduzindo as perdas de transmissão nas regiões centro e norte. Esta informação vem de uma declaração do promotor divulgada pela imprensa; a referência consultada não apresenta confirmação directa da EDM nem dados de 2026 sobre Metoro .",
|
||||
"indicative_location": "Mocuba (Zambézia), Metoro (Cabo Delgado), Cuamba (Niassa) e Afungi. Sistemas fora da rede: implantação a definir.",
|
||||
"source_row": "paragraphs:40,43,45,46; table3:rows1–3",
|
||||
"source_state": "Referência para preparação",
|
||||
"availability": "reference_only",
|
||||
"promotion_ready": false,
|
||||
"coordinates": null
|
||||
},
|
||||
{
|
||||
"id": "ENE-08",
|
||||
"title": "Energia eólica — Namaacha",
|
||||
"group_ids": [
|
||||
"EN-WIND"
|
||||
],
|
||||
"locations_text": "Namaacha (Maputo, sem distinção entre província e cidade na fonte).",
|
||||
"location_labels": [
|
||||
"Namaacha",
|
||||
"Maputo"
|
||||
],
|
||||
"value_chain": "Desenvolvimento e fornecimento para geração eólica; obras previstas dependem do fecho financeiro.",
|
||||
"market_evidence": "Quanto à eólica, a Globeleq indicou em 2026 que desenvolve, com a EDM e a Source Energia, o parque eólico de Namaacha (Maputo), com 120 MW previstos e investimento global estimado em cerca de 260 milhões de dólares. O início das obras está previsto para 2027, depois do fecho financeiro, pelo que o projecto ainda não está em construção.",
|
||||
"indicative_location": "Namaacha (Maputo, sem distinção entre província e cidade na fonte).",
|
||||
"source_row": "paragraph:47",
|
||||
"source_state": "Referência para preparação",
|
||||
"availability": "reference_only",
|
||||
"promotion_ready": false,
|
||||
"coordinates": null
|
||||
},
|
||||
{
|
||||
"id": "ENE-09",
|
||||
"title": "Hidrogénio verde — estudos e infra-estruturas",
|
||||
"group_ids": [
|
||||
"EN-HYDROGEN"
|
||||
],
|
||||
"locations_text": "Sem implantação concreta identificada na fonte.",
|
||||
"location_labels": [],
|
||||
"value_chain": "Estudos de mercado e viabilidade, consultoria, parcerias, produção, armazenamento e transporte.",
|
||||
"market_evidence": "A Estratégia de Transição Energética (ETS) prevê investimentos de cerca de 80 mil milhões de dólares até 2050 e fixa a meta de posicionar Moçambique entre os líderes na produção de hidrogénio na África austral até 2030. O Governo aponta a combinação de recursos hídricos, gás, solar e eólico como base para a produção, sobretudo de hidrogénio verde, e prevê que seja maioritariamente exportado. A ETS refere ainda a necessidade de instalações de produção, armazenamento e redes de transporte, e parcerias regionais. O sector está numa fase inicial: o banco alemão KfW e a EDM assinaram, em Março de 2025, um acordo de 500 mil euros para estudos de mercado e de viabilidade técnica e económica do hidrogénio verde. Existem, por isso, oportunidades em estudos, consultoria, parcerias e infra-estruturas de apoio, mas o levantamento não identifica projectos com decisão final de investimento.",
|
||||
"indicative_location": "Sem implantação concreta identificada na fonte.",
|
||||
"source_row": "paragraphs:61,62",
|
||||
"source_state": "Referência para preparação",
|
||||
"availability": "reference_only",
|
||||
"promotion_ready": false,
|
||||
"coordinates": null
|
||||
},
|
||||
{
|
||||
"id": "ENE-10",
|
||||
"title": "Biocombustíveis e respectivas cadeias de fornecimento",
|
||||
"group_ids": [
|
||||
"EN-BIO"
|
||||
],
|
||||
"locations_text": "Implantação a definir; a fonte não discrimina locais de produção.",
|
||||
"location_labels": [],
|
||||
"value_chain": "Matérias-primas agrícolas, produção, armazenagem, transporte, distribuição e mistura de biocombustíveis.",
|
||||
"market_evidence": "O Decreto n.º 61/2023 regula a produção, transporte, armazenagem, distribuição, comercialização e exportação de biocombustíveis e prevê que importadores e distribuidores de combustíveis líquidos adquiram biocombustível produzido no país para mistura. A produção acima de 1.000.000 de litros por ano é licenciada pelo ministro da Energia. Um estudo do programa USAID SPEED indica que as misturas B3 (biodiesel) e E10 (etanol) estavam previstas para iniciar em Agosto de 2024 e que as matérias-primas imediatamente disponíveis são a cana-de-açúcar (etanol) e o óleo de soja e de algodão (biodiesel). O mesmo estudo lembra que a anterior tentativa de criar a indústria (2005–2013, centrada na jatrofa e na exportação) não teve sucesso, por falta de sementes de qualidade, apoio à cadeia de valor e mercado, e que há preocupações com terra, água e segurança alimentar. Em Junho de 2026, o MIREME promoveu o primeiro seminário nacional de biocombustíveis para identificar instrumentos de financiamento e operacionalizar a mistura obrigatória.",
|
||||
"indicative_location": "Implantação a definir; a fonte não discrimina locais de produção.",
|
||||
"source_row": "paragraphs:64,65",
|
||||
"source_state": "Referência para preparação",
|
||||
"availability": "reference_only",
|
||||
"promotion_ready": false,
|
||||
"coordinates": null
|
||||
},
|
||||
{
|
||||
"id": "ENE-11",
|
||||
"title": "Parques industriais verdes",
|
||||
"group_ids": [
|
||||
"EN-GREEN"
|
||||
],
|
||||
"locations_text": "Corredores e parques sem implantação discriminada na fonte.",
|
||||
"location_labels": [],
|
||||
"value_chain": "Indústria e infra-estruturas abastecidas por energia limpa; preparação de parcerias e localização.",
|
||||
"market_evidence": "Parques industriais verdes: a ETS refere corredores e parques industriais abastecidos por energia limpa, uma oportunidade para indústria e infra-estruturas.",
|
||||
"indicative_location": "Corredores e parques sem implantação discriminada na fonte.",
|
||||
"source_row": "paragraph:69",
|
||||
"source_state": "Referência para preparação",
|
||||
"availability": "reference_only",
|
||||
"promotion_ready": false,
|
||||
"coordinates": null
|
||||
}
|
||||
],
|
||||
"projects": [
|
||||
"Mozambique LNG (TotalEnergies) — Gás natural. Investimento estimado: ~20 mil milhões USD. Estado/calendário na fonte: Relançado em Jan. 2026; primeira produção em 2029.",
|
||||
"Rovuma LNG (ExxonMobil) — Gás natural. Investimento estimado: ~24 mil milhões USD. Estado/calendário na fonte: Pré-decisão final de investimento.",
|
||||
"Coral Norte FLNG (Eni) — Gás natural. Investimento estimado: 6 a 7 mil milhões USD. Estado/calendário na fonte: Decisão final tomada em 2025; capacidade a partir de 2028.",
|
||||
"Mphanda Nkuwa — Hidroeléctrica. Investimento estimado: ~4,5 mil milhões EUR. Estado/calendário na fonte: 1.500 MW; conclusão prevista para 2031.",
|
||||
"Interligação Moçambique-Zâmbia — Transmissão. Estado/calendário na fonte: Em execução, com apoio do BAD.",
|
||||
"Central solar de Afungi — Solar. Investimento estimado: 10 a 15 milhões USD. Estado/calendário na fonte: Concurso EPC lançado (7,1 MW).",
|
||||
"Central Solar de Mocuba (Zambézia) — Solar. Capacidade: 40 MW instalados (cerca de 33 MW injectados na rede); cerca de 79 GWh /ano. Investimento referido: 76 milhões USD. Parcerias: Origem: Scatec (52,5%), EDM (25%), Norfund (22,5%); financiamento IFC e Fundo Africano de Infra-estruturas Emergentes; contrato de compra de energia de 25 anos. Adquirida pela Globeleq em Dezembro de 2023. Estado na fonte: Inaugurada em Agosto de 2019, a primeira de grandes dimensões no país; em operação em 2026.",
|
||||
"Central Solar de Metoro (Cabo Delgado) — Solar. Capacidade: 41 MWp; cerca de 69 GWh /ano. Investimento referido: 56 milhões USD (MIREME); 47,3 milhões EUR (Lusa/ ALER). Parcerias: Neoen (75%) e EDM (25%); empréstimo da AFD de 40 milhões USD. Estado na fonte: Inaugurada em 1 de Abril de 2022.",
|
||||
"Central Solar de Cuamba (Niassa) — Solar com baterias. Capacidade: 19 MWp (15 MWac) com baterias de 2 MW / 7 MWh. Investimento referido: 36 milhões USD. Parcerias: Globeleq, Source Energia e EDM; dívida de 19 milhões USD do EAIF / PIDG; contrato de compra de energia de 25 anos. Estado na fonte: Em operação e a injectar cerca de 15 MW na rede em 2026 (fecho financeiro em Dezembro de 2021).",
|
||||
"Parque eólico de Namaacha — Eólica. Investimento estimado: ~260 milhões USD. Estado/calendário na fonte: Em desenvolvimento (120 MW); obras previstas para 2027, após fecho financeiro."
|
||||
],
|
||||
"indicators": [],
|
||||
"risks": [
|
||||
"Segurança: Instabilidade em Cabo Delgado já adiou projectos de GNL. Resposta a considerar: Acompanhar a situação operacional e exigir planos de segurança.",
|
||||
"Macrofiscal: A consolidação fiscal é essencial para atrair o sector privado. Resposta a considerar: Parcerias com financiadores multilaterais e garantias.",
|
||||
"Ambiental e social: Barragens e GNL exigem gestão de impactos e realojamento. Resposta a considerar: Estudos de impacto e planos de envolvimento comunitário.",
|
||||
"Mercado: Maior concorrência global entre projectos de GNL e financiamento condicionado. Resposta a considerar: Diversificar entre gás, renováveis e redes."
|
||||
],
|
||||
"sources": [
|
||||
"Instituto Nacional de Petróleo – Oportunidades de Investimento",
|
||||
"Novimoz – Gás natural em Moçambique: exportação e renováveis aceleram debate",
|
||||
"Efacont – Energia Moçambique: Projetos e Oportunidades de Negócio",
|
||||
"Integrity Magazine – Moçambique poderá avançar com dois grandes projectos energéticos",
|
||||
"EY Moçambique – Transição Energética em Moçambique",
|
||||
"Boletim da República – Lei n.º 9/2026 (Lei do Conteúdo Local)",
|
||||
"BCL – A Lei do Conteúdo Local está disponível para consulta pública",
|
||||
"APIEX – Legislação de Investimentos em Moçambique",
|
||||
"INP – Políticas e Quadro Legal",
|
||||
"Gasoduto – Ministro da Energia sugere cadeias de valor do gás",
|
||||
"O Económico – Oportunidades Industriais do Gás Natural em Moçambique",
|
||||
"MMO – Ministro incentiva empresários moçambicanos a aproveitarem oportunidades do gás natural",
|
||||
"Diário Económico – Grupo ETG quer produzir fertilizantes a partir do gás natural",
|
||||
"Agroportal – Empresas de fertilizantes e energia interessadas em investir em Moçambique",
|
||||
"RTP – Moçambique quer entrar na produção de hidrogénio e ser líder na África austral até 2030",
|
||||
"Jornal Notícias – Estuda-se viabilidade do hidrogénio verde",
|
||||
"Boletim da República – Decreto n.º 61/2023 (Regulamento de Biocombustíveis)",
|
||||
"USAID SPEED – Avaliação da política de mistura obrigatória de biocombustíveis em Moçambique",
|
||||
"Jornal Domingo – MIREME apresenta quadro regulatório de biocombustível",
|
||||
"EDM – Inauguração da Central Solar de Mocuba",
|
||||
"MIREME – O país dispõe de mais uma central solar (Metoro)",
|
||||
"ALER – Presidente moçambicano inaugura maior central solar do país",
|
||||
"Camaramen – Acordo de financiamento da Central Solar de Cuamba",
|
||||
"Diário Económico – EDM: Centrais de Cuamba e Mocuba reduzem perdas de energia na rede nacional"
|
||||
],
|
||||
"source_links": [
|
||||
{
|
||||
"title": "Instituto Nacional de Petróleo – Oportunidades de Investimento",
|
||||
"url": "https://www.inp.gov.mz/oportunidades-de-investimento/",
|
||||
"source_paragraph": 90
|
||||
},
|
||||
{
|
||||
"title": "Novimoz – Gás natural em Moçambique: exportação e renováveis aceleram debate",
|
||||
"url": "https://novimz.com/2026/08/21/gas-natural-em-mocambique-exportacao-e-renovaveis-aceleram-debate/",
|
||||
"source_paragraph": 91
|
||||
},
|
||||
{
|
||||
"title": "Efacont – Energia Moçambique: Projetos e Oportunidades de Negócio",
|
||||
"url": "https://www.efacont.pt/blog/setor-energia-mocambique/",
|
||||
"source_paragraph": 92
|
||||
},
|
||||
{
|
||||
"title": "Integrity Magazine – Moçambique poderá avançar com dois grandes projectos energéticos",
|
||||
"url": "https://integritymagazine.co.mz/arquivos/45893",
|
||||
"source_paragraph": 93
|
||||
},
|
||||
{
|
||||
"title": "EY Moçambique – Transição Energética em Moçambique",
|
||||
"url": "https://www.ey.com/pt_mz/insights/energy-resources/transicao-energetica-em-mocambique",
|
||||
"source_paragraph": 94
|
||||
},
|
||||
{
|
||||
"title": "Boletim da República – Lei n.º 9/2026 (Lei do Conteúdo Local)",
|
||||
"url": "https://mireme.gov.mz/wp-content/uploads/2026/09/Lei-de-Conteudo-Local-BR_104_I_SERIE_3.o_SUPLEMENTO_2026.pdf",
|
||||
"source_paragraph": 95
|
||||
},
|
||||
{
|
||||
"title": "BCL – A Lei do Conteúdo Local está disponível para consulta pública",
|
||||
"url": "https://bcl.org.mz/noticia/a-lei-do-conteudo-local-esta-disponivel-para-consulta-publica-no-website-do-bcl/",
|
||||
"source_paragraph": 96
|
||||
},
|
||||
{
|
||||
"title": "APIEX – Legislação de Investimentos em Moçambique",
|
||||
"url": "https://pt.apiex.gov.mz/wp-content/uploads/2025/02/LEGISLACAO-DE-INVESTIMENTOS-EM-MOCAMBIQUE.pdf",
|
||||
"source_paragraph": 97
|
||||
},
|
||||
{
|
||||
"title": "INP – Políticas e Quadro Legal",
|
||||
"url": "https://www.inp.gov.mz/politicas-e-quadro-legal/",
|
||||
"source_paragraph": 98
|
||||
},
|
||||
{
|
||||
"title": "Gasoduto – Ministro da Energia sugere cadeias de valor do gás",
|
||||
"url": "https://gasoduto.co.mz/2026/07/16/ministro-da-energia-sugere-cadeias-de-valor-do-gas/",
|
||||
"source_paragraph": 99
|
||||
},
|
||||
{
|
||||
"title": "O Económico – Oportunidades Industriais do Gás Natural em Moçambique",
|
||||
"url": "https://www.oeconomico.com/oportunidades-industriais-do-gas-natural-em-mocambique/",
|
||||
"source_paragraph": 100
|
||||
},
|
||||
{
|
||||
"title": "MMO – Ministro incentiva empresários moçambicanos a aproveitarem oportunidades do gás natural",
|
||||
"url": "https://noticias.mmo.co.mz/2026/06/ministro-incentiva-empresarios-mocambicanos-a-aproveitarem-oportunidades-do-gas-natural.html",
|
||||
"source_paragraph": 101
|
||||
},
|
||||
{
|
||||
"title": "Diário Económico – Grupo ETG quer produzir fertilizantes a partir do gás natural",
|
||||
"url": "https://www.diarioeconomico.co.mz/2026/10/23/oilgas/grupo-etg-quer-produzir-fertilizantes-a-partir-do-gas-natural-no-pais/",
|
||||
"source_paragraph": 102
|
||||
},
|
||||
{
|
||||
"title": "Agroportal – Empresas de fertilizantes e energia interessadas em investir em Moçambique",
|
||||
"url": "https://www.agroportal.pt/empresas-na-areas-dos-fertilizantes-e-da-energia-interessados-em-investir-mais-em-mocambique/",
|
||||
"source_paragraph": 103
|
||||
},
|
||||
{
|
||||
"title": "RTP – Moçambique quer entrar na produção de hidrogénio e ser líder na África austral até 2030",
|
||||
"url": "https://www.rtp.pt/noticias/economia/mocambique-quer-entrar-na-producao-de-hidrogenio-e-ser-lider-na-africa-austral-ate-2030_n1551096",
|
||||
"source_paragraph": 104
|
||||
},
|
||||
{
|
||||
"title": "Jornal Notícias – Estuda-se viabilidade do hidrogénio verde",
|
||||
"url": "https://www.jornalnoticias.co.mz/destaque/estuda-se-viabilidade-do-hidrogenio-verde/",
|
||||
"source_paragraph": 105
|
||||
},
|
||||
{
|
||||
"title": "Boletim da República – Decreto n.º 61/2023 (Regulamento de Biocombustíveis)",
|
||||
"url": "https://faolex.fao.org/docs/pdf/moz223152.pdf",
|
||||
"source_paragraph": 106
|
||||
},
|
||||
{
|
||||
"title": "USAID SPEED – Avaliação da política de mistura obrigatória de biocombustíveis em Moçambique",
|
||||
"url": "https://repositorio.up.ac.mz/server/api/core/bitstreams/6a5d12fc-736e-4a7b-8ccc-84365279377d/content",
|
||||
"source_paragraph": 107
|
||||
},
|
||||
{
|
||||
"title": "Jornal Domingo – MIREME apresenta quadro regulatório de biocombustível",
|
||||
"url": "https://www.jornaldomingo.co.mz/economia/mireme-apresenta-quadro-regulatorio-de-biocombustivel/",
|
||||
"source_paragraph": 108
|
||||
},
|
||||
{
|
||||
"title": "EDM – Inauguração da Central Solar de Mocuba",
|
||||
"url": "https://portal.edm.co.mz/en/node/1294",
|
||||
"source_paragraph": 109
|
||||
},
|
||||
{
|
||||
"title": "MIREME – O país dispõe de mais uma central solar (Metoro)",
|
||||
"url": "https://mireme.gov.mz/o-pais-dispoe-de-mais-uma-central-solar/",
|
||||
"source_paragraph": 110
|
||||
},
|
||||
{
|
||||
"title": "ALER – Presidente moçambicano inaugura maior central solar do país",
|
||||
"url": "https://www.aler-energia.org/pt/comunicacao/noticias/presidente-mocambicano-inaugura-maior-central-solar-do-pais/",
|
||||
"source_paragraph": 111
|
||||
},
|
||||
{
|
||||
"title": "Camaramen – Acordo de financiamento da Central Solar de Cuamba",
|
||||
"url": "https://camaramen.co.mz/665/concluido-acordo-para-o-financiamento-da-central-solar-de-cuamba-em-niassa/",
|
||||
"source_paragraph": 112
|
||||
},
|
||||
{
|
||||
"title": "Diário Económico – EDM: Centrais de Cuamba e Mocuba reduzem perdas de energia na rede nacional",
|
||||
"url": "https://www.diarioeconomico.co.mz/2026/05/28/oilgas/energia/edm-centrais-de-cuamba-e-mocuba-reduzem-perdas-de-energia-na-rede-nacional/",
|
||||
"source_paragraph": 113
|
||||
}
|
||||
],
|
||||
"background": [
|
||||
{
|
||||
"title": "Financiamento referido nas fontes",
|
||||
"paragraphs": [
|
||||
"Instituições como o Banco Mundial, o BAD e a União Europeia mobilizam financiamento para redes, interligações regionais e renováveis.",
|
||||
"O novo programa do Banco Mundial (cerca de 6 mil milhões de dólares), as linhas do BAD, a iniciativa Global Gateway da União Europeia e o apoio do Exim Bank dos EUA ao Mozambique LNG (4,7 mil milhões de dólares) sustentam o ciclo actual. Parcerias público-privadas e quadros regulatórios estáveis são factores apontados para atrair capital."
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Enquadramento sectorial referido nas fontes",
|
||||
"paragraphs": [
|
||||
"O investimento privado rege-se pela Lei de Investimentos (Lei n.º 8/2023, de 9 de Junho), que estabelece garantias, direitos e deveres dos investidores e prevê incentivos fiscais e não fiscais. Esta lei não se aplica aos investimentos feitos ao abrigo de legislação específica, como a prospecção, pesquisa e produção de petróleo e gás, mas aplica-se, nas matérias não reguladas, ao processamento, comercialização e transporte de produtos petrolíferos. O Código dos Benefícios Fiscais (Lei n.º 4/2009) completa o regime geral.",
|
||||
"As operações petrolíferas têm regime próprio: a Lei n.º 27/2014 (alterada pela Lei n.º 14/2017) define a tributação e os benefícios fiscais do sector. Em 3 de Junho de 2026 foi aprovada uma nova Lei do Petróleo (Lei n.º 8/2026), que revoga a Lei n.º 21/2014 e a Lei n.º 16/2022. Os investidores devem verificar o texto actualizado e os respectivos contratos de concessão.",
|
||||
"A Lei n.º 9/2026, de 3 de Junho, estabelece o regime de aquisição de bens, contratação de serviços e emprego de mão-de-obra nacional nos projectos de petróleo e gás natural. Aplica-se aos titulares de direitos de operações petrolíferas, a terceiros que executem essas operações e às entidades que com eles contratam, que devem garantir, por via contratual, que os subcontratados cumprem as regras, sob pena de responsabilidade solidária.",
|
||||
"Entre os princípios da lei estão a preservação do interesse nacional, a capacitação dos empresários moçambicanos, a contratação de mão-de-obra nacional com transferência de conhecimento, o incentivo a parcerias entre empresas nacionais e estrangeiras e a transparência nas aquisições. A lei prevê a criação de uma Autoridade de Conteúdo Local, e um regulamento deverá definir os planos de aquisição, a certificação e a monitoria. A sua aprovação pelo Conselho de Ministros era esperada em cerca de 90 dias após a publicação."
|
||||
]
|
||||
},
|
||||
{
|
||||
"title": "Âmbito dos dados solares",
|
||||
"paragraphs": [
|
||||
"Os dados de Metoro diferem entre fontes, sobretudo no valor do investimento, por isso devem ser confirmados com a EDM. Em Mocuba, parte da receita anual destina-se a programas sociais na comunidade, e a Cuamba é um dos primeiros projectos do país a integrar armazenamento em baterias, o que sugere oportunidades em sistemas de armazenamento.",
|
||||
"Estado actual: segundo o director-executivo da Globeleq em Moçambique, as centrais de Mocuba e Cuamba estão em operação, foram adquiridas pela empresa em Dezembro de 2023 e injectam 48 MW na rede da EDM (33 MW em Mocuba e 15 MW em Cuamba), reduzindo as perdas de transmissão nas regiões centro e norte. Esta informação vem de uma declaração do promotor divulgada pela imprensa; a referência consultada não apresenta confirmação directa da EDM nem dados de 2026 sobre Metoro ."
|
||||
]
|
||||
}
|
||||
],
|
||||
"original_tables": [
|
||||
[
|
||||
[
|
||||
"Preparado por",
|
||||
"Osmane Nala"
|
||||
],
|
||||
[
|
||||
"Data",
|
||||
"11 de Novembro de 2026"
|
||||
],
|
||||
[
|
||||
"Âmbito",
|
||||
"Gás natural, hidroeléctrica, redes e energias renováveis"
|
||||
]
|
||||
],
|
||||
[
|
||||
[
|
||||
"Projecto",
|
||||
"Segmento",
|
||||
"Investimento estimado",
|
||||
"Estado / calendário"
|
||||
],
|
||||
[
|
||||
"Mozambique LNG (TotalEnergies)",
|
||||
"Gás natural",
|
||||
"~20 mil milhões USD",
|
||||
"Relançado em Jan. 2026; primeira produção em 2029"
|
||||
],
|
||||
[
|
||||
"Rovuma LNG (ExxonMobil)",
|
||||
"Gás natural",
|
||||
"~24 mil milhões USD",
|
||||
"Pré-decisão final de investimento"
|
||||
],
|
||||
[
|
||||
"Coral Norte FLNG (Eni)",
|
||||
"Gás natural",
|
||||
"6 a 7 mil milhões USD",
|
||||
"Decisão final tomada em 2025; capacidade a partir de 2028"
|
||||
],
|
||||
[
|
||||
"Mphanda Nkuwa",
|
||||
"Hidroeléctrica",
|
||||
"~4,5 mil milhões EUR",
|
||||
"1.500 MW; conclusão prevista para 2031"
|
||||
],
|
||||
[
|
||||
"Interligação Moçambique-Zâmbia",
|
||||
"Transmissão",
|
||||
"n.d.",
|
||||
"Em execução, com apoio do BAD"
|
||||
],
|
||||
[
|
||||
"Central solar de Afungi",
|
||||
"Solar",
|
||||
"10 a 15 milhões USD",
|
||||
"Concurso EPC lançado (7,1 MW)"
|
||||
],
|
||||
[
|
||||
"Central Solar de Mocuba",
|
||||
"Solar",
|
||||
"76 milhões USD",
|
||||
"Em operação; injecta cerca de 33 MW na rede (2026)"
|
||||
],
|
||||
[
|
||||
"Central Solar de Metoro",
|
||||
"Solar",
|
||||
"56 milhões USD (MIREME)",
|
||||
"Inaugurada em 2022; 41 MWp"
|
||||
],
|
||||
[
|
||||
"Central Solar de Cuamba",
|
||||
"Solar com baterias",
|
||||
"36 milhões USD",
|
||||
"Em operação; injecta cerca de 15 MW na rede (2026)"
|
||||
],
|
||||
[
|
||||
"Parque eólico de Namaacha",
|
||||
"Eólica",
|
||||
"~260 milhões USD",
|
||||
"Em desenvolvimento (120 MW); obras previstas para 2027, após fecho financeiro"
|
||||
]
|
||||
],
|
||||
[
|
||||
[
|
||||
"Projecto",
|
||||
"Capacidade",
|
||||
"Investimento",
|
||||
"Parceiros e financiamento",
|
||||
"Estado"
|
||||
],
|
||||
[
|
||||
"Central Solar de Mocuba (Zambézia)",
|
||||
"40 MW instalados (cerca de 33 MW injectados na rede); cerca de 79 GWh /ano",
|
||||
"76 milhões USD",
|
||||
"Origem: Scatec (52,5%), EDM (25%), Norfund (22,5%); financiamento IFC e Fundo Africano de Infra-estruturas Emergentes; contrato de compra de energia de 25 anos. Adquirida pela Globeleq em Dezembro de 2023",
|
||||
"Inaugurada em Agosto de 2019, a primeira de grandes dimensões no país; em operação em 2026"
|
||||
],
|
||||
[
|
||||
"Central Solar de Metoro (Cabo Delgado)",
|
||||
"41 MWp; cerca de 69 GWh /ano",
|
||||
"56 milhões USD (MIREME); 47,3 milhões EUR (Lusa/ ALER)",
|
||||
"Neoen (75%) e EDM (25%); empréstimo da AFD de 40 milhões USD",
|
||||
"Inaugurada em 1 de Abril de 2022"
|
||||
],
|
||||
[
|
||||
"Central Solar de Cuamba (Niassa)",
|
||||
"19 MWp (15 MWac) com baterias de 2 MW / 7 MWh",
|
||||
"36 milhões USD",
|
||||
"Globeleq, Source Energia e EDM; dívida de 19 milhões USD do EAIF / PIDG; contrato de compra de energia de 25 anos",
|
||||
"Em operação e a injectar cerca de 15 MW na rede em 2026 (fecho financeiro em Dezembro de 2021)"
|
||||
]
|
||||
],
|
||||
[
|
||||
[
|
||||
"Elo da cadeia",
|
||||
"Exemplos de oportunidades",
|
||||
"Perfil de investidor"
|
||||
],
|
||||
[
|
||||
"Upstream",
|
||||
"Concursos de áreas, campos maduros (Buzi), parcerias com empresas locais",
|
||||
"Operadores e parceiros locais"
|
||||
],
|
||||
[
|
||||
"Construção e serviços",
|
||||
"Engenharia, logística, serviços marítimos, telecomunicações, manutenção, formação",
|
||||
"PME nacionais e parcerias internacionais"
|
||||
],
|
||||
[
|
||||
"Midstream",
|
||||
"Gasodutos Norte-Sul e Palma–Maputo, armazenamento de GPL, GNL de pequena escala",
|
||||
"Investidores em infra-estruturas"
|
||||
],
|
||||
[
|
||||
"Industrialização",
|
||||
"Fertilizantes, petroquímica, geração eléctrica a gás",
|
||||
"Grupos industriais e produtores independentes de energia"
|
||||
],
|
||||
[
|
||||
"Mercado final",
|
||||
"GNV, biocombustíveis, mobilidade eléctrica",
|
||||
"Empresas de distribuição e mobilidade"
|
||||
]
|
||||
],
|
||||
[
|
||||
[
|
||||
"Diploma",
|
||||
"Matéria",
|
||||
"Relevância para o investidor"
|
||||
],
|
||||
[
|
||||
"Lei n.º 8/2023 (Lei de Investimentos)",
|
||||
"Garantias, direitos, deveres e incentivos",
|
||||
"Regime geral; não cobre a pesquisa e produção de petróleo e gás"
|
||||
],
|
||||
[
|
||||
"Lei n.º 4/2009 (Código dos Benefícios Fiscais)",
|
||||
"Benefícios fiscais",
|
||||
"Base dos incentivos fiscais"
|
||||
],
|
||||
[
|
||||
"Leis n.º 27/2014 e 14/2017",
|
||||
"Tributação e benefícios das operações petrolíferas",
|
||||
"Regime fiscal específico do sector"
|
||||
],
|
||||
[
|
||||
"Lei n.º 8/2026 (Lei do Petróleo)",
|
||||
"Atribuição de direitos petrolíferos",
|
||||
"Substitui a Lei n.º 21/2014"
|
||||
],
|
||||
[
|
||||
"Lei n.º 9/2026 (Conteúdo Local)",
|
||||
"Bens, serviços e mão-de-obra nacionais",
|
||||
"Obriga a priorizar fornecedores e trabalhadores moçambicanos"
|
||||
]
|
||||
],
|
||||
[
|
||||
[
|
||||
"Risco",
|
||||
"Descrição",
|
||||
"Mitigação"
|
||||
],
|
||||
[
|
||||
"Segurança",
|
||||
"Instabilidade em Cabo Delgado já adiou projectos de GNL.",
|
||||
"Acompanhar a situação operacional e exigir planos de segurança."
|
||||
],
|
||||
[
|
||||
"Macrofiscal",
|
||||
"A consolidação fiscal é essencial para atrair o sector privado.",
|
||||
"Parcerias com financiadores multilaterais e garantias."
|
||||
],
|
||||
[
|
||||
"Ambiental e social",
|
||||
"Barragens e GNL exigem gestão de impactos e realojamento.",
|
||||
"Estudos de impacto e planos de envolvimento comunitário."
|
||||
],
|
||||
[
|
||||
"Mercado",
|
||||
"Maior concorrência global entre projectos de GNL e financiamento condicionado.",
|
||||
"Diversificar entre gás, renováveis e redes."
|
||||
]
|
||||
]
|
||||
],
|
||||
"original_paragraphs": [
|
||||
"Oportunidades de investimento em energia",
|
||||
"Panorama do sector energético em Moçambique",
|
||||
"",
|
||||
"Índice",
|
||||
"Resumo executivo 3",
|
||||
"Gás natural e GNL 3",
|
||||
"Electricidade, hidroeléctricas e redes 3",
|
||||
"Energias renováveis 4",
|
||||
"Projectos solares em operação ou financiados 5",
|
||||
"Outras oportunidades e cadeia de valor 6",
|
||||
"Do gás exportado ao gás transformado 6",
|
||||
"Oportunidades adicionais 7",
|
||||
"Cadeia de valor e papel das empresas nacionais 7",
|
||||
"Hidrogénio verde 8",
|
||||
"Biocombustíveis 8",
|
||||
"Outras fontes de energia 8",
|
||||
"Financiamento 9",
|
||||
"Incentivos fiscais, quadro legal e conteúdo local 9",
|
||||
"Quadro legal geral 9",
|
||||
"Regime específico do petróleo e gás 9",
|
||||
"Lei do Conteúdo Local 9",
|
||||
"Riscos e desafios 10",
|
||||
"Recomendações 10",
|
||||
"Conclusão 11",
|
||||
"Fontes 11",
|
||||
"Resumo executivo",
|
||||
"Moçambique atravessa um ciclo de investimento energético particularmente relevante, assente no relançamento dos projectos de gás natural liquefeito (GNL) na bacia do Rovuma, na expansão da capacidade hidroeléctrica e na aposta crescente em energia solar e nas redes de transmissão.",
|
||||
"O Mozambique LNG (TotalEnergies), com investimento estimado em cerca de 20 mil milhões de dólares, foi relançado em Janeiro de 2026, com primeira produção apontada para 2029.",
|
||||
"A hidroeléctrica representa cerca de 70% da electricidade nacional, e a estratégia de transição energética prevê mais 2 a 4 GW hídricos e 2 GW solares até 2030.",
|
||||
"Instituições como o Banco Mundial, o BAD e a União Europeia mobilizam financiamento para redes, interligações regionais e renováveis.",
|
||||
"O investimento exige, contudo, atenção à segurança em Cabo Delgado, à estabilidade macrofiscal e à gestão dos impactos ambientais e sociais.",
|
||||
"Principal conclusão",
|
||||
"As maiores oportunidades concentram-se no gás natural (upstream, midstream e cadeia de fornecimento), na expansão de redes e interligações e em projectos solares e hídricos com apoio de financiadores multilaterais.",
|
||||
"Gás natural e GNL",
|
||||
"A bacia do Rovuma concentra as maiores oportunidades do país. O Mozambique LNG (Área 1) prevê uma capacidade anual de 12,9 milhões de toneladas; o Coral Norte FLNG (Eni) teve decisão final de investimento em 2025, com 3,6 milhões de toneladas anuais a partir de 2028; e o Rovuma LNG (ExxonMobil), estimado em cerca de 24 mil milhões de dólares, aproxima-se da decisão final de investimento.",
|
||||
"Para investidores e empresas nacionais, as oportunidades estendem-se a engenharia, construção, logística, serviços marítimos, telecomunicações e manutenção industrial. No mercado interno, o Instituto Nacional de Petróleo identifica áreas como o gasoduto Norte-Sul, o campo maduro de Buzi, o GNL de pequena escala, o armazenamento de GPL e a base logística de Pemba.",
|
||||
"Electricidade, hidroeléctricas e redes",
|
||||
"A Hidroeléctrica de Cahora Bassa, com 2.075 MW instalados, mantém um papel central. Estão em preparação a barragem de Mphanda Nkuwa (1.500 MW no rio Zambeze, com conclusão prevista para 2031), a expansão de Cahora Bassa Norte (1.250 MW) e a linha de transmissão Maputo-Temane.",
|
||||
"A modernização da rede da EDM e a interligação Moçambique-Zâmbia de 400 kV, apoiada pelo BAD, abrem espaço para fornecimento de subestações, transformadores, protecções eléctricas e sistemas SCADA, além de reforçar a exportação regional de energia.",
|
||||
"Energias renováveis",
|
||||
"Moçambique recebe cerca de 2.500 horas de sol por ano e dispõe de potencial eólico ao longo da costa. A estratégia nacional prevê 2 GW de energia solar até 2030, e já existem projectos como a central solar de 7,1 MW associada ao complexo de Afungi e um parque solar de 400 MW ligado a Cahora Bassa. Os sistemas fora da rede permitem ainda alargar o acesso à electricidade onde a rede é mais lenta ou dispendiosa de expandir.",
|
||||
"Projectos energéticos em destaque",
|
||||
"Projectos solares em operação ou financiados",
|
||||
"Os projectos abaixo estão documentados em fontes oficiais (MIREME e EDM) ou em comunicados dos promotores. Mostram o modelo dominante: produtores independentes em parceria com a EDM, com contratos de compra de energia de longo prazo e financiamento de instituições de desenvolvimento.",
|
||||
"Centrais solares concretas em Moçambique",
|
||||
"Os dados de Metoro diferem entre fontes, sobretudo no valor do investimento, por isso devem ser confirmados com a EDM. Em Mocuba, parte da receita anual destina-se a programas sociais na comunidade, e a Cuamba é um dos primeiros projectos do país a integrar armazenamento em baterias, o que sugere oportunidades em sistemas de armazenamento.",
|
||||
"Estado actual: segundo o director-executivo da Globeleq em Moçambique, as centrais de Mocuba e Cuamba estão em operação, foram adquiridas pela empresa em Dezembro de 2023 e injectam 48 MW na rede da EDM (33 MW em Mocuba e 15 MW em Cuamba), reduzindo as perdas de transmissão nas regiões centro e norte. Esta informação vem de uma declaração do promotor divulgada pela imprensa; não encontrei uma confirmação directa da EDM, nem dados de 2026 sobre Metoro .",
|
||||
"Quanto à eólica, a Globeleq indicou em 2026 que desenvolve, com a EDM e a Source Energia, o parque eólico de Namaacha (Maputo), com 120 MW previstos e investimento global estimado em cerca de 260 milhões de dólares. O início das obras está previsto para 2027, depois do fecho financeiro, pelo que o projecto ainda não está em construção.",
|
||||
"Outras oportunidades e cadeia de valor",
|
||||
"Do gás exportado ao gás transformado",
|
||||
"O Governo defende que o gás natural não deve ser visto apenas como produto de exportação, mas como matéria-prima para criar indústrias, empresas e emprego, com usos que vão da electricidade aos fertilizantes. O ministro dos Recursos Minerais e Energia identificou como desafios do sector privado o acesso a financiamento, a certificação e a tecnologia.",
|
||||
"Um estudo do Programa de Partilha de Conhecimentos (KSP) propõe um corredor energético Palma–Maputo para integrar petroquímica, fertilizantes e geração eléctrica, e destaca o gás natural veicular (GNV) nos transportes.",
|
||||
"Oportunidades adicionais",
|
||||
"Fertilizantes: o grupo Export Trading Group (ETG) manifestou, em Outubro de 2026, interesse em produzir fertilizantes a partir do gás natural, com o objectivo de liderar a produção na África Subsariana.",
|
||||
"Geração e transmissão de electricidade: a Azura Power, co-proprietária da central térmica de Ressano Garcia, declarou ambição de investir mais em geração, transmissão e infra-estruturas relacionadas, sem indicar projectos ou valores.",
|
||||
"Gás natural veicular e biocombustíveis: o Governo considera GNV, conversão de gás em electricidade, mobilidade eléctrica e biocombustíveis respostas à volatilidade dos preços dos combustíveis.",
|
||||
"Mercado interno: gasodutos e projectos de GNV orientados para o consumo doméstico abrem espaço ao sector privado.",
|
||||
"Cadeia de valor e papel das empresas nacionais",
|
||||
"Está prevista uma componente de formação para 15.734 moçambicanos (custo estimado em 126 milhões de dólares) e a capacitação de 355 pequenas e médias empresas na fase de construção e cerca de 1.500 na fase operacional. O ministro apelou a parcerias com entidades estrangeiras especializadas para transferência de conhecimento e tecnologia.",
|
||||
"Elos da cadeia de valor do gás e oportunidades",
|
||||
"Hidrogénio verde",
|
||||
"A Estratégia de Transição Energética (ETS) prevê investimentos de cerca de 80 mil milhões de dólares até 2050 e fixa a meta de posicionar Moçambique entre os líderes na produção de hidrogénio na África austral até 2030. O Governo aponta a combinação de recursos hídricos, gás, solar e eólico como base para a produção, sobretudo de hidrogénio verde, e prevê que seja maioritariamente exportado. A ETS refere ainda a necessidade de instalações de produção, armazenamento e redes de transporte, e parcerias regionais.",
|
||||
"O sector está numa fase inicial: o banco alemão KfW e a EDM assinaram, em Março de 2025, um acordo de 500 mil euros para estudos de mercado e de viabilidade técnica e económica do hidrogénio verde. Existem, por isso, oportunidades em estudos, consultoria, parcerias e infra-estruturas de apoio, mas ainda não encontrei projectos com decisão final de investimento.",
|
||||
"Biocombustíveis",
|
||||
"O Decreto n.º 61/2023 regula a produção, transporte, armazenagem, distribuição, comercialização e exportação de biocombustíveis e prevê que importadores e distribuidores de combustíveis líquidos adquiram biocombustível produzido no país para mistura. A produção acima de 1.000.000 de litros por ano é licenciada pelo ministro da Energia. Um estudo do programa USAID SPEED indica que as misturas B3 (biodiesel) e E10 (etanol) estavam previstas para iniciar em Agosto de 2024 e que as matérias-primas imediatamente disponíveis são a cana-de-açúcar (etanol) e o óleo de soja e de algodão (biodiesel).",
|
||||
"O mesmo estudo lembra que a anterior tentativa de criar a indústria (2005–2013, centrada na jatrofa e na exportação) não teve sucesso, por falta de sementes de qualidade, apoio à cadeia de valor e mercado, e que há preocupações com terra, água e segurança alimentar. Em Junho de 2026, o MIREME promoveu o primeiro seminário nacional de biocombustíveis para identificar instrumentos de financiamento e operacionalizar a mistura obrigatória.",
|
||||
"Outras fontes de energia",
|
||||
"Hidroeléctrica: a ETS prevê 3,5 GW de nova capacidade hídrica entre 2024 e 2030, incluindo a conclusão de Mphanda Nkuwa (1.500 MW), um projecto que o Governo procurou apresentar a parceiros estratégicos.",
|
||||
"Solar e eólica: a ETS prevê um programa de leilões de energia renovável para impulsionar estas fontes, bem como a expansão e modernização da rede para absorver a nova geração.",
|
||||
"Parques industriais verdes: a ETS refere corredores e parques industriais abastecidos por energia limpa, uma oportunidade para indústria e infra-estruturas.",
|
||||
"Financiamento",
|
||||
"O novo programa do Banco Mundial (cerca de 6 mil milhões de dólares), as linhas do BAD, a iniciativa Global Gateway da União Europeia e o apoio do Exim Bank dos EUA ao Mozambique LNG (4,7 mil milhões de dólares) sustentam o ciclo actual. Parcerias público-privadas e quadros regulatórios estáveis são factores apontados para atrair capital.",
|
||||
"Incentivos fiscais, quadro legal e conteúdo local",
|
||||
"Quadro legal geral",
|
||||
"O investimento privado rege-se pela Lei de Investimentos (Lei n.º 8/2023, de 9 de Junho), que estabelece garantias, direitos e deveres dos investidores e prevê incentivos fiscais e não fiscais. Esta lei não se aplica aos investimentos feitos ao abrigo de legislação específica, como a prospecção, pesquisa e produção de petróleo e gás, mas aplica-se, nas matérias não reguladas, ao processamento, comercialização e transporte de produtos petrolíferos. O Código dos Benefícios Fiscais (Lei n.º 4/2009) completa o regime geral.",
|
||||
"Regime específico do petróleo e gás",
|
||||
"As operações petrolíferas têm regime próprio: a Lei n.º 27/2014 (alterada pela Lei n.º 14/2017) define a tributação e os benefícios fiscais do sector. Em 3 de Junho de 2026 foi aprovada uma nova Lei do Petróleo (Lei n.º 8/2026), que revoga a Lei n.º 21/2014 e a Lei n.º 16/2022. Os investidores devem verificar o texto actualizado e os respectivos contratos de concessão.",
|
||||
"Lei do Conteúdo Local",
|
||||
"A Lei n.º 9/2026, de 3 de Junho, estabelece o regime de aquisição de bens, contratação de serviços e emprego de mão-de-obra nacional nos projectos de petróleo e gás natural. Aplica-se aos titulares de direitos de operações petrolíferas, a terceiros que executem essas operações e às entidades que com eles contratam, que devem garantir, por via contratual, que os subcontratados cumprem as regras, sob pena de responsabilidade solidária.",
|
||||
"Entre os princípios da lei estão a preservação do interesse nacional, a capacitação dos empresários moçambicanos, a contratação de mão-de-obra nacional com transferência de conhecimento, o incentivo a parcerias entre empresas nacionais e estrangeiras e a transparência nas aquisições. A lei prevê a criação de uma Autoridade de Conteúdo Local, e um regulamento deverá definir os planos de aquisição, a certificação e a monitoria. A sua aprovação pelo Conselho de Ministros era esperada em cerca de 90 dias após a publicação.",
|
||||
"Resumo do enquadramento para investidores",
|
||||
"Riscos e desafios",
|
||||
"Recomendações",
|
||||
"Posicionar-se na cadeia de valor — Conteúdo local : registar-se junto dos grandes projectos de GNL e fornecer serviços de engenharia, logística e manutenção.",
|
||||
"Explorar redes e interligações — Transmissão : acompanhar os concursos da EDM e da interligação Moçambique-Zâmbia para equipamentos e sistemas.",
|
||||
"Apostar em solar e sistemas fora da rede — Diversificação : desenvolver projectos de menor escala com acesso a financiamento multilateral.",
|
||||
"Gerir o risco desde o início — Segurança e conformidade : estruturar parcerias com empresas locais e prever cenários de atraso.",
|
||||
"Conclusão",
|
||||
"O sector energético moçambicano combina um ciclo de grandes projectos de gás com necessidades concretas de electricidade, redes e renováveis. Os investidores que conciliarem a escala dos megaprojectos com oportunidades de menor dimensão e uma gestão rigorosa do risco estarão melhor posicionados.",
|
||||
"Fontes",
|
||||
"Instituto Nacional de Petróleo – Oportunidades de Investimento",
|
||||
"Novimoz – Gás natural em Moçambique: exportação e renováveis aceleram debate",
|
||||
"Efacont – Energia Moçambique: Projetos e Oportunidades de Negócio",
|
||||
"Integrity Magazine – Moçambique poderá avançar com dois grandes projectos energéticos",
|
||||
"EY Moçambique – Transição Energética em Moçambique",
|
||||
"Boletim da República – Lei n.º 9/2026 (Lei do Conteúdo Local)",
|
||||
"BCL – A Lei do Conteúdo Local está disponível para consulta pública",
|
||||
"APIEX – Legislação de Investimentos em Moçambique",
|
||||
"INP – Políticas e Quadro Legal",
|
||||
"Gasoduto – Ministro da Energia sugere cadeias de valor do gás",
|
||||
"O Económico – Oportunidades Industriais do Gás Natural em Moçambique",
|
||||
"MMO – Ministro incentiva empresários moçambicanos a aproveitarem oportunidades do gás natural",
|
||||
"Diário Económico – Grupo ETG quer produzir fertilizantes a partir do gás natural",
|
||||
"Agroportal – Empresas de fertilizantes e energia interessadas em investir em Moçambique",
|
||||
"RTP – Moçambique quer entrar na produção de hidrogénio e ser líder na África austral até 2030",
|
||||
"Jornal Notícias – Estuda-se viabilidade do hidrogénio verde",
|
||||
"Boletim da República – Decreto n.º 61/2023 (Regulamento de Biocombustíveis)",
|
||||
"USAID SPEED – Avaliação da política de mistura obrigatória de biocombustíveis em Moçambique",
|
||||
"Jornal Domingo – MIREME apresenta quadro regulatório de biocombustível",
|
||||
"EDM – Inauguração da Central Solar de Mocuba",
|
||||
"MIREME – O país dispõe de mais uma central solar (Metoro)",
|
||||
"ALER – Presidente moçambicano inaugura maior central solar do país",
|
||||
"Camaramen – Acordo de financiamento da Central Solar de Cuamba",
|
||||
"Diário Económico – EDM: Centrais de Cuamba e Mocuba reduzem perdas de energia na rede nacional"
|
||||
],
|
||||
"source_instructions_are_not_product_rules": true
|
||||
}
|
||||
@@ -0,0 +1,744 @@
|
||||
{
|
||||
"format": "investmoz-mining-reference-v1",
|
||||
"source_sha256": "7202fb5986b40e62347867c653770030683ffec2701a2921e84342f15e9f3d8a",
|
||||
"source_document_name": "Minérios de Moçambique e a sua localização.docx",
|
||||
"reference_date": "2026-11-11",
|
||||
"title": "Mineração e cadeias de valor em Moçambique",
|
||||
"minerals": [
|
||||
{
|
||||
"id": "MINERAL-01",
|
||||
"name": "Carvão (térmico e metalúrgico)",
|
||||
"locations_text": "Tete (Moatize, Changara, Mutarara, Marávia, Zumbo); ocorrências em Niassa (Lago) e Sofala",
|
||||
"province_names": [
|
||||
"Niassa",
|
||||
"Sofala",
|
||||
"Tete"
|
||||
],
|
||||
"source_row": "table1:row1",
|
||||
"coordinates": null,
|
||||
"classification": "reported_occurrence_group"
|
||||
},
|
||||
{
|
||||
"id": "MINERAL-02",
|
||||
"name": "Gás natural e petróleo",
|
||||
"locations_text": "Inhambane (Pande e Temane); Cabo Delgado (Palma, Mocímboa, bacia do Rovuma); Sofala (Búzi); pesquisa na baía do Bazaruto",
|
||||
"province_names": [
|
||||
"Cabo Delgado",
|
||||
"Inhambane",
|
||||
"Sofala"
|
||||
],
|
||||
"source_row": "table1:row2",
|
||||
"coordinates": null,
|
||||
"classification": "reported_occurrence_group"
|
||||
},
|
||||
{
|
||||
"id": "MINERAL-03",
|
||||
"name": "Areias pesadas (ilmenite, zircão, rútilo, monazite)",
|
||||
"locations_text": "Nampula (Moma, Angoche); Zambézia (Pebane, Chinde, Moebase); Inhambane (Jangamo); Gaza (Chibuto, Xai-Xai); Maputo (Ponta do Ouro, Inhaca)",
|
||||
"province_names": [
|
||||
"Gaza",
|
||||
"Inhambane",
|
||||
"Maputo",
|
||||
"Nampula",
|
||||
"Zambézia"
|
||||
],
|
||||
"source_row": "table1:row3",
|
||||
"coordinates": null,
|
||||
"classification": "reported_occurrence_group"
|
||||
},
|
||||
{
|
||||
"id": "MINERAL-04",
|
||||
"name": "Grafite",
|
||||
"locations_text": "Cabo Delgado (Balama, Ancuabe); Niassa (Nipepe); Tete (Angónia)",
|
||||
"province_names": [
|
||||
"Cabo Delgado",
|
||||
"Niassa",
|
||||
"Tete"
|
||||
],
|
||||
"source_row": "table1:row4",
|
||||
"coordinates": null,
|
||||
"classification": "reported_occurrence_group"
|
||||
},
|
||||
{
|
||||
"id": "MINERAL-05",
|
||||
"name": "Terras raras, fluorite e gálio",
|
||||
"locations_text": "Tete (Monte Muambe); Sofala (ocorrências aluvionares preliminares)",
|
||||
"province_names": [
|
||||
"Sofala",
|
||||
"Tete"
|
||||
],
|
||||
"source_row": "table1:row5",
|
||||
"coordinates": null,
|
||||
"classification": "reported_occurrence_group"
|
||||
},
|
||||
{
|
||||
"id": "MINERAL-06",
|
||||
"name": "Ouro",
|
||||
"locations_text": "Manica; Zambézia; Nampula; Tete; Niassa; ouro aluvial em rios como Revuè e Chua",
|
||||
"province_names": [
|
||||
"Manica",
|
||||
"Nampula",
|
||||
"Niassa",
|
||||
"Tete",
|
||||
"Zambézia"
|
||||
],
|
||||
"source_row": "table1:row6",
|
||||
"coordinates": null,
|
||||
"classification": "reported_occurrence_group"
|
||||
},
|
||||
{
|
||||
"id": "MINERAL-07",
|
||||
"name": "Ferro, titânio, vanádio e manganês",
|
||||
"locations_text": "Manica, Tete (Chiúta), Nampula",
|
||||
"province_names": [
|
||||
"Manica",
|
||||
"Nampula",
|
||||
"Tete"
|
||||
],
|
||||
"source_row": "table1:row7",
|
||||
"coordinates": null,
|
||||
"classification": "reported_occurrence_group"
|
||||
},
|
||||
{
|
||||
"id": "MINERAL-08",
|
||||
"name": "Cobre, níquel, zinco e bauxite",
|
||||
"locations_text": "Tete (Chidué, Fíngoè), Manica, Nampula (Monapo, Murrupula), Zambézia, Niassa",
|
||||
"province_names": [
|
||||
"Manica",
|
||||
"Nampula",
|
||||
"Niassa",
|
||||
"Tete",
|
||||
"Zambézia"
|
||||
],
|
||||
"source_row": "table1:row8",
|
||||
"coordinates": null,
|
||||
"classification": "reported_occurrence_group"
|
||||
},
|
||||
{
|
||||
"id": "MINERAL-09",
|
||||
"name": "Tantalite, lítio e outros metais raros",
|
||||
"locations_text": "Zambézia (Ile, Alto Molócue); Nampula; Zambézia e Cabo Delgado em pegmatitos",
|
||||
"province_names": [
|
||||
"Cabo Delgado",
|
||||
"Nampula",
|
||||
"Zambézia"
|
||||
],
|
||||
"source_row": "table1:row9",
|
||||
"coordinates": null,
|
||||
"classification": "reported_occurrence_group"
|
||||
},
|
||||
{
|
||||
"id": "MINERAL-10",
|
||||
"name": "Pedras preciosas e semipreciosas",
|
||||
"locations_text": "Cabo Delgado (rubis em Montepuez); Zambézia, Nampula, Manica, Tete (turmalina, água-marinha, granada, esmeralda)",
|
||||
"province_names": [
|
||||
"Cabo Delgado",
|
||||
"Manica",
|
||||
"Nampula",
|
||||
"Tete",
|
||||
"Zambézia"
|
||||
],
|
||||
"source_row": "table1:row10",
|
||||
"coordinates": null,
|
||||
"classification": "reported_occurrence_group"
|
||||
},
|
||||
{
|
||||
"id": "MINERAL-11",
|
||||
"name": "Mármore, apatite, calcário, argilas e diatomito",
|
||||
"locations_text": "Cabo Delgado (mármore, Montepuez); Nampula (apatite); Sofala, Inhambane e Maputo (calcário); Maputo e Gaza (diatomito)",
|
||||
"province_names": [
|
||||
"Cabo Delgado",
|
||||
"Gaza",
|
||||
"Inhambane",
|
||||
"Maputo",
|
||||
"Nampula",
|
||||
"Sofala"
|
||||
],
|
||||
"source_row": "table1:row11",
|
||||
"coordinates": null,
|
||||
"classification": "reported_occurrence_group"
|
||||
}
|
||||
],
|
||||
"areas": [
|
||||
{
|
||||
"id": "MIN-01",
|
||||
"title": "Carvão: fornecimento de bens e serviços e logística",
|
||||
"mineral_ids": [
|
||||
"MINERAL-01"
|
||||
],
|
||||
"locations_text": "Tete (Moatize, Revobue); corredores de Nacala e Sena (Beira)",
|
||||
"province_names": [
|
||||
"Tete"
|
||||
],
|
||||
"market_evidence": "Produção nacional de 16,3 Mt em 2024, com previsão de mais de 22 Mt em 2026; Revobue prevê 3,5 Mt /ano, subindo para 7 Mt /ano a partir de 2032",
|
||||
"value_chain": "Conteúdo local, serviços à mina, manutenção ferroviária e portuária (indicativo)",
|
||||
"source_state": "A estruturar",
|
||||
"indicative_location": "Moatize (Tete); porto de Nacala-a-Velha e cidade da Beira, nos corredores logísticos. Distrito do Revobue não indicado nas fontes. Indicação não oficial, a partir das fontes citadas; sem valor de georreferenciação.",
|
||||
"source_fields": {
|
||||
"ID InvesteMoz": "[a atribuir]",
|
||||
"Título": "MIN-01: Carvão: fornecimento de bens e serviços e logística",
|
||||
"Sector / subsector": "Energia e minas / carvão e logística",
|
||||
"Localização": "Tete (Moatize, Revobue); corredores de Nacala e Sena (Beira)",
|
||||
"Localização indicativa (distrito, não oficial)": "Moatize (Tete); porto de Nacala-a-Velha e cidade da Beira, nos corredores logísticos. Distrito do Revobue não indicado nas fontes. Indicação não oficial, a partir das fontes citadas; sem valor de georreferenciação.",
|
||||
"Georreferenciação": "[a confirmar]",
|
||||
"Evidência de mercado": "Produção nacional de 16,3 Mt em 2024, com previsão de mais de 22 Mt em 2026; Revobue prevê 3,5 Mt /ano, subindo para 7 Mt /ano a partir de 2032.",
|
||||
"Modelo possível": "Conteúdo local, serviços à mina, manutenção ferroviária e portuária (indicativo)",
|
||||
"Promotor e ponto focal": "[a confirmar]",
|
||||
"DUAT ou direito de uso": "[a confirmar]",
|
||||
"Estudos de viabilidade e técnicos": "[a confirmar]",
|
||||
"Licenças e autorizações": "[a confirmar]",
|
||||
"Modelo contratual": "[a confirmar]",
|
||||
"CAPEX (com data-base)": "[a confirmar]",
|
||||
"Estado": "A estruturar",
|
||||
"": ""
|
||||
},
|
||||
"source_row": "table3:row1",
|
||||
"coordinates": null,
|
||||
"availability": "reference_only",
|
||||
"promotion_ready": false
|
||||
},
|
||||
{
|
||||
"id": "MIN-02",
|
||||
"title": "Grafite: cadeia de valor para baterias",
|
||||
"mineral_ids": [
|
||||
"MINERAL-04"
|
||||
],
|
||||
"locations_text": "Cabo Delgado (Balama, Ancuabe); Niassa (Nipepe)",
|
||||
"province_names": [
|
||||
"Cabo Delgado",
|
||||
"Niassa"
|
||||
],
|
||||
"market_evidence": "4.º produtor mundial em 2024; Balama com capacidade nominal de 350 000 t/ano; produção caiu 64% em 2024",
|
||||
"value_chain": "Beneficiamento e parcerias com operadores (indicativo)",
|
||||
"source_state": "A estruturar",
|
||||
"indicative_location": "Balama e Ancuabe (Cabo Delgado); Nipepe (Niassa). Indicação não oficial, a partir das fontes citadas; sem valor de georreferenciação.",
|
||||
"source_fields": {
|
||||
"ID InvesteMoz": "[a atribuir]",
|
||||
"Título": "MIN-02: Grafite: cadeia de valor para baterias",
|
||||
"Sector / subsector": "Minas / grafite e materiais para baterias",
|
||||
"Localização": "Cabo Delgado (Balama, Ancuabe); Niassa (Nipepe)",
|
||||
"Localização indicativa (distrito, não oficial)": "Balama e Ancuabe (Cabo Delgado); Nipepe (Niassa). Indicação não oficial, a partir das fontes citadas; sem valor de georreferenciação.",
|
||||
"Georreferenciação": "[a confirmar]",
|
||||
"Evidência de mercado": "4.º produtor mundial em 2024; Balama com capacidade nominal de 350 000 t/ano; produção caiu 64% em 2024.",
|
||||
"Modelo possível": "Beneficiamento e parcerias com operadores (indicativo)",
|
||||
"Promotor e ponto focal": "[a confirmar]",
|
||||
"DUAT ou direito de uso": "[a confirmar]",
|
||||
"Estudos de viabilidade e técnicos": "[a confirmar]",
|
||||
"Licenças e autorizações": "[a confirmar]",
|
||||
"Modelo contratual": "[a confirmar]",
|
||||
"CAPEX (com data-base)": "[a confirmar]",
|
||||
"Estado": "A estruturar",
|
||||
"Fonte e data": "Fontes públicas: USGS; Diário Económico. Actualizado em 11/11/2026."
|
||||
},
|
||||
"source_row": "table3:row2",
|
||||
"coordinates": null,
|
||||
"availability": "reference_only",
|
||||
"promotion_ready": false
|
||||
},
|
||||
{
|
||||
"id": "MIN-03",
|
||||
"title": "Areias pesadas e terras raras: processamento local",
|
||||
"mineral_ids": [
|
||||
"MINERAL-03",
|
||||
"MINERAL-05"
|
||||
],
|
||||
"locations_text": "Nampula (Moma); Tete (Monte Muambe); Sofala (fase preliminar)",
|
||||
"province_names": [
|
||||
"Nampula",
|
||||
"Sofala",
|
||||
"Tete"
|
||||
],
|
||||
"market_evidence": "Moçambique é o 2.º produtor mundial de ilmenite; a monazite de Moma é exportada como concentrado, sem separação no país; Monte Muambe tem recurso de 13,6 Mt com 2,42% de óxidos de terras raras",
|
||||
"value_chain": "Separação e refinação de terras raras, parcerias com operadores (indicativo)",
|
||||
"source_state": "A estruturar",
|
||||
"indicative_location": "Moma (Nampula); Monte Muambe (Tete). Distrito de Monte Muambe e localização em Sofala não indicados nas fontes. Indicação não oficial, a partir das fontes citadas; sem valor de georreferenciação.",
|
||||
"source_fields": {
|
||||
"ID InvesteMoz": "[a atribuir]",
|
||||
"Título": "MIN-03: Areias pesadas e terras raras: processamento local",
|
||||
"Sector / subsector": "Minas / areias pesadas e terras raras",
|
||||
"Localização": "Nampula (Moma); Tete (Monte Muambe); Sofala (fase preliminar)",
|
||||
"Localização indicativa (distrito, não oficial)": "Moma (Nampula); Monte Muambe (Tete). Distrito de Monte Muambe e localização em Sofala não indicados nas fontes. Indicação não oficial, a partir das fontes citadas; sem valor de georreferenciação.",
|
||||
"Georreferenciação": "[a confirmar]",
|
||||
"Evidência de mercado": "2.º produtor mundial de ilmenite em 2024; a monazite de Moma é exportada como concentrado, sem separação no país; Monte Muambe tem recurso de 13,6 Mt com 2,42% de óxidos totais de terras raras.",
|
||||
"Modelo possível": "Separação e refinação de terras raras, parcerias com operadores (indicativo)",
|
||||
"Promotor e ponto focal": "[a confirmar]",
|
||||
"DUAT ou direito de uso": "[a confirmar]",
|
||||
"Estudos de viabilidade e técnicos": "[a confirmar]",
|
||||
"Licenças e autorizações": "[a confirmar]",
|
||||
"Modelo contratual": "[a confirmar]",
|
||||
"CAPEX (com data-base)": "[a confirmar]",
|
||||
"Estado": "A estruturar",
|
||||
"": ""
|
||||
},
|
||||
"source_row": "table3:row3",
|
||||
"coordinates": null,
|
||||
"availability": "reference_only",
|
||||
"promotion_ready": false
|
||||
},
|
||||
{
|
||||
"id": "MIN-04",
|
||||
"title": "Gás natural: GNL e energia",
|
||||
"mineral_ids": [
|
||||
"MINERAL-02"
|
||||
],
|
||||
"locations_text": "Inhambane (Pande e Temane); Cabo Delgado (Coral Sul FLNG); Maputo (terminal GNL da Matola)",
|
||||
"province_names": [
|
||||
"Cabo Delgado",
|
||||
"Inhambane",
|
||||
"Maputo"
|
||||
],
|
||||
"market_evidence": "Pande e Temane em declínio, com fim da extracção previsto para 2030; terminal da Matola visa fecho financeiro até ao fim de 2027; Coral Sul com 3,4 Mtpa",
|
||||
"value_chain": "Infra-estrutura de GNL, geração de electricidade, concessão ou parceria (indicativo)",
|
||||
"source_state": "A estruturar",
|
||||
"indicative_location": "Inhassoro (Inhambane, para Pande e Temane); Palma e Mocímboa (Cabo Delgado, para o gás da bacia do Rovuma); Matola (Maputo, para o terminal de GNL). Distrito do Coral Sul FLNG não indicado nas fontes. Indicação não oficial, a partir das fontes citadas; sem valor de georreferenciação.",
|
||||
"source_fields": {
|
||||
"ID InvesteMoz": "[a atribuir]",
|
||||
"Título": "MIN-04: Gás natural: GNL e energia",
|
||||
"Sector / subsector": "Energia / gás natural e GNL",
|
||||
"Localização": "Inhambane (Pande e Temane); Cabo Delgado (Coral Sul FLNG); Maputo (terminal GNL da Matola)",
|
||||
"Localização indicativa (distrito, não oficial)": "Inhassoro (Inhambane, para Pande e Temane); Palma e Mocímboa (Cabo Delgado, para o gás da bacia do Rovuma); Matola (Maputo, para o terminal de GNL). Distrito do Coral Sul FLNG não indicado nas fontes. Indicação não oficial, a partir das fontes citadas; sem valor de georreferenciação.",
|
||||
"Georreferenciação": "[a confirmar]",
|
||||
"Evidência de mercado": "Pande e Temane em declínio, com fim da extracção previsto para 2030; terminal da Matola visa fecho financeiro até ao fim de 2027; Coral Sul com capacidade de 3,4 Mtpa .",
|
||||
"Modelo possível": "Infra-estrutura de GNL, geração de electricidade, concessão ou parceria (indicativo)",
|
||||
"Promotor e ponto focal": "[a confirmar]",
|
||||
"DUAT ou direito de uso": "[a confirmar]",
|
||||
"Estudos de viabilidade e técnicos": "[a confirmar]",
|
||||
"Licenças e autorizações": "[a confirmar]",
|
||||
"Modelo contratual": "[a confirmar]",
|
||||
"CAPEX (com data-base)": "[a confirmar]",
|
||||
"Estado": "A estruturar",
|
||||
"": ""
|
||||
},
|
||||
"source_row": "table3:row4",
|
||||
"coordinates": null,
|
||||
"availability": "reference_only",
|
||||
"promotion_ready": false
|
||||
},
|
||||
{
|
||||
"id": "MIN-05",
|
||||
"title": "Gemas: rubis e pedras semipreciosas",
|
||||
"mineral_ids": [
|
||||
"MINERAL-10"
|
||||
],
|
||||
"locations_text": "Cabo Delgado (Montepuez); Zambézia, Nampula, Manica, Tete",
|
||||
"province_names": [
|
||||
"Cabo Delgado",
|
||||
"Manica",
|
||||
"Nampula",
|
||||
"Tete",
|
||||
"Zambézia"
|
||||
],
|
||||
"market_evidence": "Produção de rubi de 5,10 milhões de quilates em 2025 (mais 29%) e 3,18 milhões no primeiro semestre de 2026; cerca de 70% é exportada, sobretudo para os Emirados Árabes Unidos (Governo; USGS).",
|
||||
"value_chain": "Lapidação, certificação e comercialização (indicativo)",
|
||||
"source_state": "A estruturar",
|
||||
"indicative_location": "Montepuez (Cabo Delgado). Distritos das restantes ocorrências não indicados nas fontes. Indicação não oficial, a partir das fontes citadas; sem valor de georreferenciação.",
|
||||
"source_fields": {
|
||||
"ID InvesteMoz": "[a atribuir]",
|
||||
"Título": "MIN-05: Gemas: rubis e pedras semipreciosas",
|
||||
"Sector / subsector": "Minas / gemas",
|
||||
"Localização": "Cabo Delgado (Montepuez); Zambézia, Nampula, Manica, Tete",
|
||||
"Localização indicativa (distrito, não oficial)": "Montepuez (Cabo Delgado). Distritos das restantes ocorrências não indicados nas fontes. Indicação não oficial, a partir das fontes citadas; sem valor de georreferenciação.",
|
||||
"Georreferenciação": "[a confirmar]",
|
||||
"Evidência de mercado": "Produção de rubi segundo o Ministério dos Recursos Minerais e Energia: 3,95 milhões de quilates em 2023, 4,14 em 2024 e 5,10 em 2025 (aumento de 29%; 123% da meta). Em 2026, 3,18 milhões de quilates no primeiro semestre (mais 61%), cerca de 78% da meta anual de 4,06 milhões; cerca de 70% da produção é exportada. Outra fonte indica valores mais baixos para 2023 (2,71 milhões) e 2024 (3,95 milhões), por isso os valores de anos anteriores podem ter sido revistos. Não encontrei dados de produção das outras gemas. O Montepuez Ruby Mining (Gemfields 75%, Mwiriti 25%) exportou 1,3 milhões de quilates em 2023, com receitas de leilão de 151,3 milhões de dólares nesse ano e de pelo menos 49,9 milhões de dólares em 2025. O USGS indica que os rubis são exportados sobretudo para os Emirados Árabes Unidos.",
|
||||
"Modelo possível": "Lapidação, certificação e comercialização (indicativo)",
|
||||
"Promotor e ponto focal": "[a confirmar]",
|
||||
"DUAT ou direito de uso": "[a confirmar]",
|
||||
"Estudos de viabilidade e técnicos": "[a confirmar]",
|
||||
"Licenças e autorizações": "[a confirmar]",
|
||||
"Modelo contratual": "[a confirmar]",
|
||||
"CAPEX (com data-base)": "[a confirmar]",
|
||||
"Estado": "A estruturar",
|
||||
"": ""
|
||||
},
|
||||
"source_row": "table3:row5",
|
||||
"coordinates": null,
|
||||
"availability": "reference_only",
|
||||
"promotion_ready": false
|
||||
},
|
||||
{
|
||||
"id": "MIN-06",
|
||||
"title": "Minerais industriais e materiais de construção",
|
||||
"mineral_ids": [
|
||||
"MINERAL-11"
|
||||
],
|
||||
"locations_text": "Cabo Delgado (mármore); Nampula (apatite); Sofala, Inhambane e Maputo (calcário); Maputo e Gaza (diatomito)",
|
||||
"province_names": [
|
||||
"Cabo Delgado",
|
||||
"Gaza",
|
||||
"Inhambane",
|
||||
"Maputo",
|
||||
"Nampula",
|
||||
"Sofala"
|
||||
],
|
||||
"market_evidence": "Ocorrências identificadas; sem dados de produção confirmados neste documento",
|
||||
"value_chain": "Cimento, cerâmica, agricultura (indicativo)",
|
||||
"source_state": "A estruturar",
|
||||
"indicative_location": "Montepuez (Cabo Delgado, mármore); Manhiça, Boane, Macia e Manjacaze (Maputo e Gaza, diatomito). Distritos das restantes ocorrências não indicados nas fontes. Indicação não oficial, a partir das fontes citadas; sem valor de georreferenciação.",
|
||||
"source_fields": {
|
||||
"ID InvesteMoz": "[a atribuir]",
|
||||
"Título": "MIN-06: Minerais industriais e materiais de construção",
|
||||
"Sector / subsector": "Minas / minerais industriais",
|
||||
"Localização": "Cabo Delgado (mármore); Nampula (apatite); Sofala, Inhambane e Maputo (calcário); Maputo e Gaza (diatomito)",
|
||||
"Localização indicativa (distrito, não oficial)": "Montepuez (Cabo Delgado, mármore); Manhiça, Boane, Macia e Manjacaze (Maputo e Gaza, diatomito). Distritos das restantes ocorrências não indicados nas fontes. Indicação não oficial, a partir das fontes citadas; sem valor de georreferenciação.",
|
||||
"Georreferenciação": "[a confirmar]",
|
||||
"Evidência de mercado": "Ocorrências identificadas; sem dados de produção confirmados neste documento.",
|
||||
"Modelo possível": "Cimento, cerâmica, agricultura (indicativo)",
|
||||
"Promotor e ponto focal": "[a confirmar]",
|
||||
"DUAT ou direito de uso": "[a confirmar]",
|
||||
"Estudos de viabilidade e técnicos": "[a confirmar]",
|
||||
"Licenças e autorizações": "[a confirmar]",
|
||||
"Modelo contratual": "[a confirmar]",
|
||||
"CAPEX (com data-base)": "[a confirmar]",
|
||||
"Estado": "A estruturar",
|
||||
"": ""
|
||||
},
|
||||
"source_row": "table3:row6",
|
||||
"coordinates": null,
|
||||
"availability": "reference_only",
|
||||
"promotion_ready": false
|
||||
},
|
||||
{
|
||||
"id": "MIN-07",
|
||||
"title": "Ouro: exploração e comercialização",
|
||||
"mineral_ids": [
|
||||
"MINERAL-06"
|
||||
],
|
||||
"locations_text": "Manica; Zambézia; Nampula; Tete; Niassa; ouro aluvial em rios como Revuè e Chua",
|
||||
"province_names": [
|
||||
"Manica",
|
||||
"Nampula",
|
||||
"Niassa",
|
||||
"Tete",
|
||||
"Zambézia"
|
||||
],
|
||||
"market_evidence": "Produção nacional de 1 349 kg em 2025 (queda de 17%) e meta de 1 723 kg para 2026, que seria recorde; Manica é a província que mais contribui (Governo).",
|
||||
"value_chain": "Parcerias com operadores e mineração artesanal organizada (indicativo)",
|
||||
"source_state": "A estruturar",
|
||||
"indicative_location": "Rios Revuè, Inhamucarara, Musa, Chimesi, Mimosa e Chua (sem distritos indicados nas fontes). Indicação não oficial, a partir das fontes citadas; sem valor de georreferenciação.",
|
||||
"source_fields": {
|
||||
"ID InvesteMoz": "[a atribuir]",
|
||||
"Título": "MIN-07: Ouro: exploração e comercialização",
|
||||
"Sector / subsector": "Minas / ouro",
|
||||
"Localização": "Manica; Zambézia; Nampula; Tete; Niassa; ouro aluvial em rios como Revuè e Chua",
|
||||
"Localização indicativa (distrito, não oficial)": "Rios Revuè, Inhamucarara, Musa, Chimesi, Mimosa e Chua (sem distritos indicados nas fontes). Indicação não oficial, a partir das fontes citadas; sem valor de georreferenciação.",
|
||||
"Georreferenciação": "[a confirmar]",
|
||||
"Evidência de mercado": "Produção nacional segundo o Governo: 1 263 kg em 2022; 1 641 kg em 2024 (recorde); 1 349 kg em 2025 (queda de 17%, por suspensão da mineração em Manica); meta de 1 723 kg para 2026, com 713 kg no primeiro semestre (queda de 12%). O USGS (via CEIC) regista 1 666 kg em 2023 e 1 626 kg em 2024, valor ligeiramente diferente do do Governo para 2024. Manica é a província que mais contribui para a produção; em Setembro de 2025 o Governo suspendeu a mineração em Manica, e 30 das 41 empresas suspensas foram autorizadas a retomar em Agosto de 2026.",
|
||||
"Modelo possível": "Parcerias com operadores e mineração artesanal organizada (indicativo)",
|
||||
"Promotor e ponto focal": "[a confirmar]",
|
||||
"DUAT ou direito de uso": "[a confirmar]",
|
||||
"Estudos de viabilidade e técnicos": "[a confirmar]",
|
||||
"Licenças e autorizações": "[a confirmar]",
|
||||
"Modelo contratual": "[a confirmar]",
|
||||
"CAPEX (com data-base)": "[a confirmar]",
|
||||
"Estado": "A estruturar",
|
||||
"": ""
|
||||
},
|
||||
"source_row": "table3:row7",
|
||||
"coordinates": null,
|
||||
"availability": "reference_only",
|
||||
"promotion_ready": false
|
||||
},
|
||||
{
|
||||
"id": "MIN-08",
|
||||
"title": "Ferro, titânio, vanádio e manganês",
|
||||
"mineral_ids": [
|
||||
"MINERAL-07"
|
||||
],
|
||||
"locations_text": "Manica, Tete (Chiúta), Nampula",
|
||||
"province_names": [
|
||||
"Manica",
|
||||
"Nampula",
|
||||
"Tete"
|
||||
],
|
||||
"market_evidence": "Ocorrências identificadas; titânio associado às areias pesadas (concentrados de titânio cresceram 4% em 2024, USGS); sem dados de produção de ferro, vanádio e manganês.",
|
||||
"value_chain": "Exploração e parcerias com operadores (indicativo)",
|
||||
"source_state": "A estruturar",
|
||||
"indicative_location": "Chiúta (Tete). Distritos de Manica e Nampula não indicados nas fontes. Indicação não oficial, a partir das fontes citadas; sem valor de georreferenciação.",
|
||||
"source_fields": {
|
||||
"ID InvesteMoz": "[a atribuir]",
|
||||
"Título": "MIN-08: Ferro, titânio, vanádio e manganês",
|
||||
"Sector / subsector": "Minas / metais ferrosos",
|
||||
"Localização": "Manica, Tete (Chiúta), Nampula",
|
||||
"Localização indicativa (distrito, não oficial)": "Chiúta (Tete). Distritos de Manica e Nampula não indicados nas fontes. Indicação não oficial, a partir das fontes citadas; sem valor de georreferenciação.",
|
||||
"Georreferenciação": "[a confirmar]",
|
||||
"Evidência de mercado": "Ocorrências identificadas; titânio associado às areias pesadas (concentrados de titânio cresceram 4% em 2024, USGS); sem dados de produção de ferro, vanádio e manganês.",
|
||||
"Modelo possível": "Exploração e parcerias com operadores (indicativo)",
|
||||
"Promotor e ponto focal": "[a confirmar]",
|
||||
"DUAT ou direito de uso": "[a confirmar]",
|
||||
"Estudos de viabilidade e técnicos": "[a confirmar]",
|
||||
"Licenças e autorizações": "[a confirmar]",
|
||||
"Modelo contratual": "[a confirmar]",
|
||||
"CAPEX (com data-base)": "[a confirmar]",
|
||||
"Estado": "A estruturar",
|
||||
"": ""
|
||||
},
|
||||
"source_row": "table3:row8",
|
||||
"coordinates": null,
|
||||
"availability": "reference_only",
|
||||
"promotion_ready": false
|
||||
},
|
||||
{
|
||||
"id": "MIN-09",
|
||||
"title": "Cobre, níquel, zinco e bauxite",
|
||||
"mineral_ids": [
|
||||
"MINERAL-08"
|
||||
],
|
||||
"locations_text": "Tete (Chidué, Fíngoè), Manica, Nampula (Monapo, Murrupula), Zambézia, Niassa",
|
||||
"province_names": [
|
||||
"Manica",
|
||||
"Nampula",
|
||||
"Niassa",
|
||||
"Tete",
|
||||
"Zambézia"
|
||||
],
|
||||
"market_evidence": "Ocorrências de metais básicos associados a ouro, vanádio e prata; USGS regista bauxite e alumínio entre os produtos do país, com alumínio exportado para Singapura; sem dados de produção de cobre, níquel e zinco.",
|
||||
"value_chain": "Pesquisa e exploração, parcerias com operadores (indicativo)",
|
||||
"source_state": "A estruturar",
|
||||
"indicative_location": "Chidué e Fíngoè (Tete); Monapo e Murrupula (Nampula). Indicação não oficial, a partir das fontes citadas; sem valor de georreferenciação.",
|
||||
"source_fields": {
|
||||
"ID InvesteMoz": "[a atribuir]",
|
||||
"Título": "MIN-09: Cobre, níquel, zinco e bauxite",
|
||||
"Sector / subsector": "Minas / metais básicos e bauxite",
|
||||
"Localização": "Tete (Chidué, Fíngoè), Manica, Nampula (Monapo, Murrupula), Zambézia, Niassa",
|
||||
"Localização indicativa (distrito, não oficial)": "Chidué e Fíngoè (Tete); Monapo e Murrupula (Nampula). Indicação não oficial, a partir das fontes citadas; sem valor de georreferenciação.",
|
||||
"Georreferenciação": "[a confirmar]",
|
||||
"Evidência de mercado": "Ocorrências de metais básicos associados a ouro, vanádio e prata; USGS regista bauxite e alumínio entre os produtos do país, com alumínio exportado para Singapura; sem dados de produção de cobre, níquel e zinco.",
|
||||
"Modelo possível": "Pesquisa e exploração, parcerias com operadores (indicativo)",
|
||||
"Promotor e ponto focal": "[a confirmar]",
|
||||
"DUAT ou direito de uso": "[a confirmar]",
|
||||
"Estudos de viabilidade e técnicos": "[a confirmar]",
|
||||
"Licenças e autorizações": "[a confirmar]",
|
||||
"Modelo contratual": "[a confirmar]",
|
||||
"CAPEX (com data-base)": "[a confirmar]",
|
||||
"Estado": "A estruturar",
|
||||
"": ""
|
||||
},
|
||||
"source_row": "table3:row9",
|
||||
"coordinates": null,
|
||||
"availability": "reference_only",
|
||||
"promotion_ready": false
|
||||
},
|
||||
{
|
||||
"id": "MIN-10",
|
||||
"title": "Tantalite, lítio e outros metais raros",
|
||||
"mineral_ids": [
|
||||
"MINERAL-09"
|
||||
],
|
||||
"locations_text": "Zambézia (Ile, Alto Molócue); Nampula; Zambézia e Cabo Delgado em pegmatitos",
|
||||
"province_names": [
|
||||
"Cabo Delgado",
|
||||
"Nampula",
|
||||
"Zambézia"
|
||||
],
|
||||
"market_evidence": "6.º produtor mundial de tântalo em 2024 (USGS); depósitos de tantalite subexplorados na Zambézia; lítio em pegmatitos; o Diário Económico refere que a Britannica indica que Moçambique poderá ter as maiores reservas mundiais de tantalite.",
|
||||
"value_chain": "Pesquisa, exploração e beneficiamento, parcerias com operadores (indicativo)",
|
||||
"source_state": "A estruturar",
|
||||
"indicative_location": "Ile e Alto Molócue (Zambézia). Indicação não oficial, a partir das fontes citadas; sem valor de georreferenciação.",
|
||||
"source_fields": {
|
||||
"ID InvesteMoz": "[a atribuir]",
|
||||
"Título": "MIN-10: Tantalite, lítio e outros metais raros",
|
||||
"Sector / subsector": "Minas / metais raros e críticos",
|
||||
"Localização": "Zambézia (Ile, Alto Molócue); Nampula; Zambézia e Cabo Delgado em pegmatitos",
|
||||
"Localização indicativa (distrito, não oficial)": "Ile e Alto Molócue (Zambézia). Indicação não oficial, a partir das fontes citadas; sem valor de georreferenciação.",
|
||||
"Georreferenciação": "[a confirmar]",
|
||||
"Evidência de mercado": "6.º produtor mundial de tântalo em 2024 (USGS); depósitos de tantalite subexplorados na Zambézia; lítio em pegmatitos; o Diário Económico refere que a Britannica indica que Moçambique poderá ter as maiores reservas mundiais de tantalite.",
|
||||
"Modelo possível": "Pesquisa, exploração e beneficiamento, parcerias com operadores (indicativo)",
|
||||
"Promotor e ponto focal": "[a confirmar]",
|
||||
"DUAT ou direito de uso": "[a confirmar]",
|
||||
"Estudos de viabilidade e técnicos": "[a confirmar]",
|
||||
"Licenças e autorizações": "[a confirmar]",
|
||||
"Modelo contratual": "[a confirmar]",
|
||||
"CAPEX (com data-base)": "[a confirmar]",
|
||||
"Estado": "A estruturar",
|
||||
"": ""
|
||||
},
|
||||
"source_row": "table3:row10",
|
||||
"coordinates": null,
|
||||
"availability": "reference_only",
|
||||
"promotion_ready": false
|
||||
}
|
||||
],
|
||||
"indicators": [
|
||||
{
|
||||
"mineral": "Ilmenite (areias pesadas)",
|
||||
"value": "2.º produtor mundial em 2024, cerca de 21% da produção global; Moma tem cerca de 200 milhões de toneladas de ilmenite em recursos",
|
||||
"source": "USGS (2024); Diário Económico",
|
||||
"source_row": "table2:row1"
|
||||
},
|
||||
{
|
||||
"mineral": "Zircão",
|
||||
"value": "3.º produtor mundial em 2024, cerca de 10% da produção global",
|
||||
"source": "USGS (2024)",
|
||||
"source_row": "table2:row2"
|
||||
},
|
||||
{
|
||||
"mineral": "Concentrados de titânio",
|
||||
"value": "Produção aumentou 4% em 2024",
|
||||
"source": "USGS (2024)",
|
||||
"source_row": "table2:row3"
|
||||
},
|
||||
{
|
||||
"mineral": "Grafite",
|
||||
"value": "4.º produtor mundial em 2024 (cerca de 3%); produção caiu 64% após interrupções em Ancuabe e Balama; Balama tem capacidade nominal de 350 000 t/ano",
|
||||
"source": "USGS (2024); Diário Económico",
|
||||
"source_row": "table2:row4"
|
||||
},
|
||||
{
|
||||
"mineral": "Berílio e tântalo",
|
||||
"value": "5.º produtor mundial de berílio (1%) e 6.º de tântalo (2%) em 2024",
|
||||
"source": "USGS (2024)",
|
||||
"source_row": "table2:row5"
|
||||
},
|
||||
{
|
||||
"mineral": "Terras raras (Monte Muambe)",
|
||||
"value": "Recurso de 13,6 milhões de toneladas com 2,42% de óxidos totais de terras raras (código JORC)",
|
||||
"source": "Diário Económico",
|
||||
"source_row": "table2:row6"
|
||||
},
|
||||
{
|
||||
"mineral": "Produção mineral total",
|
||||
"value": "27,3 milhões de toneladas em 2023, contra 20,9 milhões em 2022",
|
||||
"source": "CEIC (2023)",
|
||||
"source_row": "table2:row7"
|
||||
},
|
||||
{
|
||||
"mineral": "Carvão (Tete)",
|
||||
"value": "Produção nacional, concentrada em Tete: 14,8 milhões de toneladas em 2022, 14,9 em 2023 e 16,3 em 2024; previsão do Governo de 19 milhões em 2025 e mais de 22 milhões em 2026. A mina de Moatize (Vulcan) é a maior; Revobue prevê 3,5 milhões de t/ano na fase inicial",
|
||||
"source": "Club of Mozambique / Africa-Press (PESOE 2026); Without Borders Energy",
|
||||
"source_row": "table2:row8"
|
||||
},
|
||||
{
|
||||
"mineral": "Gás natural (Pande e Temane)",
|
||||
"value": "Produção acumulada de 79,48 mil milhões de m³ até Outubro de 2025; reservas provadas da concessão PPA de 327,9 mil milhões de pés cúbicos em Junho de 2026 (440,6 em Junho de 2025); a produção total da Sasol em Moçambique caiu 7% no exercício de 2026; fim da extracção previsto para 2030",
|
||||
"source": "Club of Mozambique (Lusa); MZ News (Sasol 20-F)",
|
||||
"source_row": "table2:row9"
|
||||
},
|
||||
{
|
||||
"mineral": "Gás natural (Coral Sul FLNG)",
|
||||
"value": "Capacidade de liquefacção de cerca de 3,4 milhões de toneladas por ano (Bacia do Rovuma, Cabo Delgado)",
|
||||
"source": "Eni",
|
||||
"source_row": "table2:row10"
|
||||
},
|
||||
{
|
||||
"mineral": "Ouro",
|
||||
"value": "Produção nacional segundo o Governo: 1 263 kg em 2022; 1 641 kg em 2024 (recorde); 1 349 kg em 2025 (queda de 17%, por suspensão da mineração em Manica); meta de 1 723 kg para 2026, com 713 kg no primeiro semestre (queda de 12%). O USGS (via CEIC) regista 1 666 kg em 2023 e 1 626 kg em 2024, valor ligeiramente diferente do do Governo para 2024.",
|
||||
"source": "Ministério dos Recursos Minerais e Energia (via Club of Mozambique/Lusa e 360 Mozambique/Diário Económico); USGS (via CEIC)",
|
||||
"source_row": "table2:row11"
|
||||
},
|
||||
{
|
||||
"mineral": "Rubis e outras gemas",
|
||||
"value": "Produção de rubi segundo o Ministério dos Recursos Minerais e Energia: 3,95 milhões de quilates em 2023, 4,14 em 2024 e 5,10 em 2025 (aumento de 29%; 123% da meta). Em 2026, 3,18 milhões de quilates no primeiro semestre (mais 61%), cerca de 78% da meta anual de 4,06 milhões; cerca de 70% da produção é exportada. Outra fonte indica valores mais baixos para 2023 (2,71 milhões) e 2024 (3,95 milhões), por isso os valores de anos anteriores podem ter sido revistos. Não encontrei dados de produção das outras gemas.",
|
||||
"source": "Ministério dos Recursos Minerais e Energia (via Club of Mozambique/Lusa e 360 Mozambique); Beyond The Bay",
|
||||
"source_row": "table2:row12"
|
||||
}
|
||||
],
|
||||
"projects": [
|
||||
"Balama (Cabo Delgado): a maior mina de grafite de África, operada pela Syrah Resources .",
|
||||
"Moma (Nampula): mina de areias pesadas operada pela Kenmare Resources, com ilmenite, zircão e rútilo.",
|
||||
"Monte Muambe (Tete): projecto de terras raras, fluorite e gálio associado.",
|
||||
"Pande e Temane (Inhambane): jazigos de gás natural, com gasoduto para a África do Sul.",
|
||||
"Coral Sul FLNG (Cabo Delgado): primeira unidade flutuante de GNL instalada em águas ultraprofundas, na bacia do Rovuma, com capacidade de liquefacção de cerca de 3,4 milhões de toneladas por ano. É operada pela Eni em nome dos parceiros da Área 4 (ExxonMobil, CNPC, Galp, KOGAS e ENH).",
|
||||
"Revobue (Tete): mina de carvão inaugurada em Março de 2026, com o grupo indiano Jindal como principal accionista. Prevê produzir 3,5 milhões de toneladas por ano na fase inicial e 7 milhões a partir de 2032, com vida útil de 35 anos. O carvão será exportado pela linha de Sena até ao porto da Beira."
|
||||
],
|
||||
"risks": [
|
||||
"Segundo a regra de publicação do InvesteMoz, uma oportunidade só recebe o estado \"Pronta para promoção\" quando estiverem documentados, em simultâneo, os seis requisitos abaixo. Nenhum está confirmado para as áreas listadas, por isso todas ficam \"A estruturar\".",
|
||||
"Situação fundiária (DUAT) ou direito de uso aplicável.",
|
||||
"Promotor e ponto focal.",
|
||||
"Estudos de viabilidade e técnicos requeridos.",
|
||||
"Licenças e autorizações relevantes.",
|
||||
"Modelo contratual aprovado.",
|
||||
"CAPEX actualizado, com data-base.",
|
||||
"Riscos e pontos de diligência identificados nas fontes",
|
||||
"Volatilidade de produção: a produção de grafite caiu 64% em 2024 e as vendas de carvão caíram 35% no primeiro trimestre de 2025, por paragens de minas e perturbações ferroviárias.",
|
||||
"Declínio do gás: as reservas provadas de Pande e Temane caíram 25,6% num ano.",
|
||||
"Comunidades e ambiente: há críticas à poluição e às detonações em Moatize, e o Revobue exige o reassentamento de cinco aldeias.",
|
||||
"Ouro e licenciamento: a mineração foi suspensa em Manica desde 30 de Setembro de 2025 e a produção de 2025 caiu 17%; também houve paragens no Niassa para regularização de licenças.",
|
||||
"Rubis e mineração ilegal: o Montepuez Ruby Mining refere centenas de mineiros ilegais por dia na sua concessão, o que atrasou a segunda fábrica de processamento e o leilão de 2025; a produção da terceira maior produtora está suspensa.",
|
||||
"Dados: faltam valores de produção de outras gemas e de gás por ano; os dados do EITI e do Ministério dos Recursos Minerais e Energia devem ser usados para os confirmar. Os valores de ouro e de rubi divergem entre fontes.",
|
||||
"Próximos passos para publicação",
|
||||
"Confirmar a entidade responsável, validar os dados com o Ministério dos Recursos Minerais e Energia, georreferenciar as áreas e obter validação jurídica e editorial antes de publicar."
|
||||
],
|
||||
"sources": [
|
||||
"EITI Moçambique – Ocorrência de minerais em Moçambique (anexos 2 e 4), eiti.org.",
|
||||
"Escola MZ – Principais rochas e minerais e suas áreas de ocorrência (escolamz.com).",
|
||||
"Fluxo Arte – Distribuição por província de recursos naturais (mozconteudo.blogspot.com).",
|
||||
"Diário Económico – A janela estreita entre geologia e geoeconomia, Parte 2 (23/07/2026).",
|
||||
"USGS – Mozambique, National Minerals Information Center (usgs.gov).",
|
||||
"CEIC – Moçambique: Produção de minerais (ceicdata.com).",
|
||||
"Ministério dos Recursos Minerais e Energia – Relatório Estatístico da Indústria Extractiva 2024; EITI – Relatório ITIE 2023-2024 (eiti.org).",
|
||||
"Club of Mozambique – Mozambique expects coal production to reach record highs next year (26/11/2025); Mozambique prepares alternative to declining Pande and Temane gas production (05/11/2026).",
|
||||
"Without Borders Energy – Mozambique Coal; MZ News – Reservas de gás da Sasol caem 25,6% (08/11/2026); Eni – Coral Sul FLNG Key Facts .",
|
||||
"Club of Mozambique – Mozambique: Chapo inaugurates coal mine in Tete (16/03/2026).",
|
||||
"Integrity Magazine – Da Vale a Vulcan : comunidades de Moatize (15/09/2024).",
|
||||
"Club of Mozambique – Mozambique: Gold production rises 4% in Q1 to 283 kilogrammes (17/06/2026); 360 Mozambique – Mozambique Gold Output Falls 12% in First Half on Mining Suspensions (18/09/2026); CEIC – Mozambique Gold Production (usgs.gov/ceicdata.com).",
|
||||
"Club of Mozambique – Mozambique: ruby production soars past five million carats in 2025 (09/04/2026); Montepuez Ruby Mining second plant set for 2025 (29/08/2024); 360 Mozambique – Ruby Production Increased by 29% (09/04/2026); Beyond The Bay – Mozambique ruby production surges in first half of 2026 (24/09/2026)."
|
||||
],
|
||||
"original_paragraphs": [
|
||||
"Recursos Minerais de Moçambique: Referência de Oportunidades de Investimento",
|
||||
"Ficha de referência para o portal InvesteMoz",
|
||||
"Estado: A estruturar (informação de referência; nenhuma oportunidade classificada como \"Pronta para promoção\") Fonte: fontes públicas listadas na secção 8 .0 Data de actualização: 11 de Novembro de 2026 Entidade responsável / ponto focal: [a confirmar antes da publicação] Natureza: informação orientadora; não constitui oferta nem aconselhamento de investimento. Os dados carecem de validação institucional e jurídica.",
|
||||
"1.0 Resumo para o Investidor",
|
||||
"Moçambique combina carvão e gás de escala exportadora, grafite e areias pesadas de relevância mundial, terras raras, rubis e minerais industriais, distribuídos por todas as províncias. Segundo o USGS, a mineração contribuiu com cerca de 15% do PIB em 2024. Este documento organiza a informação pública disponível por minério e localização e identifica áreas de oportunidade (fornecimento de serviços, logística, processamento local e energia), com as respectivas condições de prontidão e riscos.",
|
||||
"2.0 Principais Minérios e Localização",
|
||||
"Minérios por província e zona de ocorrência",
|
||||
"3.0 Projectos de Destaque",
|
||||
"Balama (Cabo Delgado): a maior mina de grafite de África, operada pela Syrah Resources .",
|
||||
"Moma (Nampula): mina de areias pesadas operada pela Kenmare Resources, com ilmenite, zircão e rútilo.",
|
||||
"Monte Muambe (Tete): projecto de terras raras, fluorite e gálio associado.",
|
||||
"Pande e Temane (Inhambane): jazigos de gás natural, com gasoduto para a África do Sul.",
|
||||
"Coral Sul FLNG (Cabo Delgado): primeira unidade flutuante de GNL instalada em águas ultraprofundas, na bacia do Rovuma, com capacidade de liquefacção de cerca de 3,4 milhões de toneladas por ano. É operada pela Eni em nome dos parceiros da Área 4 (ExxonMobil, CNPC, Galp, KOGAS e ENH).",
|
||||
"Revobue (Tete): mina de carvão inaugurada em Março de 2026, com o grupo indiano Jindal como principal accionista. Prevê produzir 3,5 milhões de toneladas por ano na fase inicial e 7 milhões a partir de 2032, com vida útil de 35 anos. O carvão será exportado pela linha de Sena até ao porto da Beira.",
|
||||
"4.0 Reservas e Produção Anual",
|
||||
"Segundo o Serviço Geológico dos EUA (USGS), a indústria mineira contribuiu com cerca de 15% do PIB de Moçambique em 2024. Os valores abaixo vêm de fontes públicas e referem-se aos anos indicados.",
|
||||
"Produção e recursos dos principais minérios",
|
||||
"",
|
||||
"A s quantidades das outras gemas (além do rubi) constam do Relatório Estatístico da Indústria Extractiva 2024, do Ministério dos Recursos Minerais e Energia, e do Relatório ITIE 2023-2024. Não as incluí aqui por não ter conseguido confirmar os valores exactos. Os valores de carvão são nacionais; a maior parte provém de Tete. Os valores de gás por ano de produção não foram encontrados nas fontes consultadas. Os valores de ouro e de rubi divergem entre fontes, e a produção artesanal pode não estar totalmente registada.",
|
||||
"5.0 Oportunidades de Investimento",
|
||||
"A tabela cruza a informação das secções anteriores com áreas onde a literatura pública aponta espaço para investimento. Os modelos são indicativos e não representam projectos aprovados nem promotores confirmados.",
|
||||
"Áreas de oportunidade por cadeia de valor",
|
||||
"6.0 Fichas Individuais InvesteMoz",
|
||||
"Cada ficha segue os campos de publicação do InvesteMoz. Os campos marcados \"[a confirmar]\" devem ser preenchidos e documentados antes de a oportunidade passar de \"A estruturar\" para \"Pronta para promoção\".",
|
||||
"Ficha 1: Carvão: fornecimento de bens e serviços e logística",
|
||||
"Ficha 2: Grafite: cadeia de valor para baterias",
|
||||
"Ficha 3: Areias pesadas e terras raras: processamento local",
|
||||
"Ficha 4: Gás natural: GNL e energia",
|
||||
"Ficha 5: Gemas: rubis e pedras semipreciosas",
|
||||
"Ficha 6: Minerais industriais e materiais de construção",
|
||||
"Ficha 7: Ouro: exploração e comercialização",
|
||||
"Ficha 8: Ferro, titânio, vanádio e manganês",
|
||||
"Ficha 9: Cobre, níquel, zinco e bauxite",
|
||||
"Ficha 10: Tantalite, lítio e outros metais raros",
|
||||
"7 .0 Prontidão para Publicação e Riscos",
|
||||
"Segundo a regra de publicação do InvesteMoz, uma oportunidade só recebe o estado \"Pronta para promoção\" quando estiverem documentados, em simultâneo, os seis requisitos abaixo. Nenhum está confirmado para as áreas listadas, por isso todas ficam \"A estruturar\".",
|
||||
"Situação fundiária (DUAT) ou direito de uso aplicável.",
|
||||
"Promotor e ponto focal.",
|
||||
"Estudos de viabilidade e técnicos requeridos.",
|
||||
"Licenças e autorizações relevantes.",
|
||||
"Modelo contratual aprovado.",
|
||||
"CAPEX actualizado, com data-base.",
|
||||
"Riscos e pontos de diligência identificados nas fontes",
|
||||
"Volatilidade de produção: a produção de grafite caiu 64% em 2024 e as vendas de carvão caíram 35% no primeiro trimestre de 2025, por paragens de minas e perturbações ferroviárias.",
|
||||
"Declínio do gás: as reservas provadas de Pande e Temane caíram 25,6% num ano.",
|
||||
"Comunidades e ambiente: há críticas à poluição e às detonações em Moatize, e o Revobue exige o reassentamento de cinco aldeias.",
|
||||
"Ouro e licenciamento: a mineração foi suspensa em Manica desde 30 de Setembro de 2025 e a produção de 2025 caiu 17%; também houve paragens no Niassa para regularização de licenças.",
|
||||
"Rubis e mineração ilegal: o Montepuez Ruby Mining refere centenas de mineiros ilegais por dia na sua concessão, o que atrasou a segunda fábrica de processamento e o leilão de 2025; a produção da terceira maior produtora está suspensa.",
|
||||
"Dados: faltam valores de produção de outras gemas e de gás por ano; os dados do EITI e do Ministério dos Recursos Minerais e Energia devem ser usados para os confirmar. Os valores de ouro e de rubi divergem entre fontes.",
|
||||
"Próximos passos para publicação",
|
||||
"Confirmar a entidade responsável, validar os dados com o Ministério dos Recursos Minerais e Energia, georreferenciar as áreas e obter validação jurídica e editorial antes de publicar.",
|
||||
"8 .0 Fontes",
|
||||
"EITI Moçambique – Ocorrência de minerais em Moçambique (anexos 2 e 4), eiti.org.",
|
||||
"Escola MZ – Principais rochas e minerais e suas áreas de ocorrência (escolamz.com).",
|
||||
"Fluxo Arte – Distribuição por província de recursos naturais (mozconteudo.blogspot.com).",
|
||||
"Diário Económico – A janela estreita entre geologia e geoeconomia, Parte 2 (23/07/2026).",
|
||||
"USGS – Mozambique, National Minerals Information Center (usgs.gov).",
|
||||
"CEIC – Moçambique: Produção de minerais (ceicdata.com).",
|
||||
"Ministério dos Recursos Minerais e Energia – Relatório Estatístico da Indústria Extractiva 2024; EITI – Relatório ITIE 2023-2024 (eiti.org).",
|
||||
"Club of Mozambique – Mozambique expects coal production to reach record highs next year (26/11/2025); Mozambique prepares alternative to declining Pande and Temane gas production (05/11/2026).",
|
||||
"Without Borders Energy – Mozambique Coal; MZ News – Reservas de gás da Sasol caem 25,6% (08/11/2026); Eni – Coral Sul FLNG Key Facts .",
|
||||
"Club of Mozambique – Mozambique: Chapo inaugurates coal mine in Tete (16/03/2026).",
|
||||
"Integrity Magazine – Da Vale a Vulcan : comunidades de Moatize (15/09/2024).",
|
||||
"Club of Mozambique – Mozambique: Gold production rises 4% in Q1 to 283 kilogrammes (17/06/2026); 360 Mozambique – Mozambique Gold Output Falls 12% in First Half on Mining Suspensions (18/09/2026); CEIC – Mozambique Gold Production (usgs.gov/ceicdata.com).",
|
||||
"Club of Mozambique – Mozambique: ruby production soars past five million carats in 2025 (09/04/2026); Montepuez Ruby Mining second plant set for 2025 (29/08/2024); 360 Mozambique – Ruby Production Increased by 29% (09/04/2026); Beyond The Bay – Mozambique ruby production surges in first half of 2026 (24/09/2026)."
|
||||
],
|
||||
"source_instructions_are_not_product_rules": true
|
||||
}
|
||||
@@ -1,3 +1,25 @@
|
||||
## Energia — consulta e preparação no mesmo dossier (QA,11/11/2026)
|
||||
|
||||
1. Abra **Sectores de investimento → Energia** (`/sectores/energia-especifica`). Seleccione localização e segmento energético,ou pesquise uma actividade.
|
||||
2. Consulte a área de cadeia de valor e a respectiva evidência. Os projectos de referência,contexto de financiamento,quadro sectorial,riscos e fontes ficam em secções expansíveis. Os valores e calendários conservam as distinções das fontes.
|
||||
3. Escolha **Preparar uma ideia nesta cadeia de valor**. Depois de autenticar,confira o resumo e confirme no dossier existente,ou crie um. Área,segmento,localização e versão consultada acompanham a escolha.
|
||||
4. Reabra o dossier e consulte **Sectores e cadeias de valor**. Pode acrescentar uma referência deMineração no mesmo dossier;nenhuma substitui a outra. Ambas ficam disponíveis como evidências para a análiseSWOT,sem conclusões automáticas.
|
||||
|
||||
Localização não discriminada permanece por definir;uma bacia ou corredor não é convertido numa província. Referências de produção,capacidade,investimento,estudo ou calendário não significam oferta aberta,financiamento garantido ou licença. A incorporação não activa incentivos fiscais ou novos direitos.
|
||||
|
||||
**Estado:** os dois sectores estão implementados emQA e agrupados para entrega;instalação e conferência visual ainda pendentes. Referência da homologação6d3bf293,com270instituições preservadas. Prova conjunta `outputs/sector-resource-20261111/verification.json`.
|
||||
|
||||
## Mineração — consulta e preparação no mesmo dossier (QA,11/11/2026)
|
||||
|
||||
1. Abra **Sectores de investimento → Mineração** (`/sectores/mineracao`). Escolha localização e grupo mineral,ou pesquise uma actividade. Pode consultar recursos,projectos,indicadores por período e fontes sem autenticação.
|
||||
2. Em **Possibilidades na cadeia de valor**,consulte a actividade e expanda **Evidência e âmbito territorial**. Seleccione **Preparar uma ideia nesta cadeia de valor**.
|
||||
3. Autentique-se apenas para guardar. Confira o resumo e escolha **Continuar neste dossier com o setor**,ou crie um dossier. A área,grupo mineral,localização e versão consultada acompanham a escolha; nenhum dossier é escolhido automaticamente.
|
||||
4. Ao reabrir o dossier,consulte **Sectores e cadeias de valor** e volte à referência pelo respectivo acesso. Pode acrescentar outra área sem substituir a anterior. As referências ficam disponíveis na preparação/análise SWOT como evidências; conclusões são elaboradas e revistas pela equipa.
|
||||
|
||||
As ocorrências servem a preparação do investimento. Não atribuem concessão,licença,promotor ou disponibilidade. “Maputo” pode precisar de distinção entre província e cidade; não foram criadas coordenadas ou associações territoriais por aproximação. Produção,recursos,capacidade e previsões são apresentados separadamente com os períodos da fonte. A escolha mantém rastreabilidade privada no dossier,sem publicar a análise ou enviar dados a terceiros.
|
||||
|
||||
**Saldo:** percurso implementado/testado em QA; instalação e revisão visual pendentes. A referência instalada continua6d3bf293;270instituições e restantes funcionalidades preservadas. Registo técnico no mesmo backlog/matriz e `outputs/mining-reference-20261111/verification.json`.
|
||||
|
||||
## 11/11/2026 — perfis uniformes e menu de seis grupos instalados em6d3bf293
|
||||
|
||||
Instalação expressamente autorizada deeca67191 concluída na revisão integrada `6d3bf2937ee6f5a58267967516560ba73d2cc936`,conferida às12:38:49Africa/Johannesburg(10:38:49UTC). A guarda inicial detectoua400802b já instalada e parou antes de escrever. Comparação delimitada identificou seis alterações independentes de tradução/cabeçalho fixo,integradas e preservadas;os quinze ficheiros aprovados deeca67191 permaneceram idênticos. Pacote reconciliado aplica/reverte exactamente sobrea400802b;pacote original preservado. Não foi necessária nova decisão de âmbito.
|
||||
|
||||
@@ -1,3 +1,23 @@
|
||||
## 11/11/2026 — Energia incorporada pelo mesmo percurso de Mineração, em QA
|
||||
|
||||
**Implementação:** o sector existente `/sectores/energia-especifica` passa a apresentar o documento fornecido com7segmentos,11áreas de cadeia de valor,10projectos de referência,4riscos e24fontes com as ligações originais. Gás/upstream/construção/midstream/industrialização/mercado final,redes/hídrica,solar/baterias/eólica,hidrogénio,biocombustíveis e parques verdes mantêm o seu contexto. As três centrais solares aparecem uma vez cada,com capacidade,promotores,financiamento e estado referidos. Metoro conserva56milhõesUSD e47,3milhõesEUR,atribuídos às fontes,sem conversão ou escolha silenciosa. Previsão,operação,desenvolvimento,estudo e proposta não são tratados como estados equivalentes.
|
||||
|
||||
**Localização e continuidade:** filtros usam apenas bacias,corredores,localidades e províncias explicitamente referidos. Buzi não recebe província por aproximação;Maputo permanece por precisar quando não discriminado;hidrogénio/biocombustíveis sem implantação mantêm local por definir. Escolher área → seleccionar dossier existente ou criar → guardar → recuperar → usar como evidência na preparação/SWOT. Energia e Mineração reutilizam o mesmo serviço/componente de referências do sector e o mesmo escritor/histórico do dossier,sem módulos,tabelas,roles ou permissões novos. Podem coexistir no mesmo dossier sem substituir escolhas deliberadas. Origem,linha/parágrafo,versão,actor e data preservados. Referências não criam ofertas,concursos abertos,direitos,licenças,promotores ou conclusões SWOT.
|
||||
|
||||
**QA:** sete casos nativos dos dois sectores/166asserções no cluster55441,em transacções revertidas;cinco casos de interface com filtros,retoma,continuidade e locais por definir;nove casos já dirigidos aos componentes afectados,sem repetir operações aceites. Análise PHP,tipos,lint e compilação registados no fecho em `outputs/sector-resource-20261111/verification.json`. HTMLs dos componentes reais emSSR são evidência de renderização,não revisão visual de navegador. Documento deEnergia intacto,SHA256 `2d9d94ac70115ade43c4093a4d5b302aaa93623a149f936615c38ba67b1e2bd2`;extracção reproduzível em `tools/prepare-energy-reference.py`. As referências legais permanecem documentais;nenhum cálculo,benefício ou regra é activado pela incorporação.
|
||||
|
||||
**Saldo:** Mineração e Energia implementadas emQA,agrupadas para entrega Git com backup/restauro/reversão;instalação e conferência visual pendentes. Referência da homologação6d3bf293 e270instituições preservadas. Não há publicação de projectos reais nem envio de dados a terceiros. A fonte precisa de dados específicos para ofertas concretas e localização mais exacta;isso não impede consultar/preparar estes percursos. Restantes módulos e resíduos fiscaisL1–L7,L8,L9–L16 mantêm o seu saldo anterior.
|
||||
|
||||
## 11/11/2026 — Mineração e cadeia de valor implementadas em QA, sem instalação
|
||||
|
||||
O documento «Minérios de Moçambique e a sua localização» foi integrado na página existente `/sectores/mineracao`, sem módulo paralelo: **11 grupos minerais,10 áreas de cadeia de valor,6 projectos de referência,12 indicadores e13 fontes**. Consulta por localização,grupo mineral ou actividade; cada área mostra o âmbito territorial,possibilidades de fornecimento,logística,energia,beneficiamento ou transformação. Produção,capacidade,recursos e previsões conservam período e atribuição. São referências para preparação,não uma oferta de concessão ou projecto disponível.
|
||||
|
||||
**Percurso demonstrado:** sector → Cabo Delgado/Grafite → cadeia de valor → escolher dossier existente ou criar → confirmar → recuperar no mesmo dossier → referência disponível como evidência SWOT. A escolha conserva grupo mineral,área,localização,texto territorial,versão/hash da fonte,actor e data. Áreas distintas são acrescentadas sem duplicar o sector,alterar o título ou substituir escolhas anteriores. Repetição recupera a mesma referência; chave de criação reutilizada com outra selecção recusa409. Dossier alheio403,encerrado409,fonte/local/grupo incompatíveis409/422. Sem coordenadas,direitos mineiros,promotores ou relações geográficas inferidos. “Maputo” mantém província/cidade por precisar quando o original não distingue. A localização agregada de um grupo não prova a ocorrência de todos os minérios em todos os locais.
|
||||
|
||||
**QA dirigido:** quatro casos nativos PostgreSQL55441/82asserções,em transacções revertidas; três casos de interface para filtros,retoma e continuidade nas duas escolhas de dossier; nove casos dos componentes afectados reutilizados sem repetir operações aceites. Análise PHP,tipos,lint e compilação no fecho registados em `outputs/mining-reference-20261111/verification.json`. Não é conferência visual de navegador. Original intacto,SHA256 `7202fb5986b40e62347867c653770030683ffec2701a2921e84342f15e9f3d8a`; extracção reproduzível em `tools/prepare-mining-reference.py`,linhas de origem conservadas. Instruções contidas no documento não foram convertidas em regras de produto.
|
||||
|
||||
**Estado:** implementado em QA; instalação deste conteúdo ainda pendente de autorização específica da entrega. Homologação de referência `6d3bf293`,270instituições publicadas e entregas aceites preservadas. Não se criam/publicam dez oportunidades concretas nem se importam anexos para a biblioteca. Faltam instalação e conferência visual deste recorte; projectos concretos,localizações mais precisas e condições dependem dos respectivos dados. O restante saldo integral por módulo e fiscalL1–L7,L8 eL9–L16 permanece aberto nos seus recortes.
|
||||
|
||||
## 11/11/2026 — perfis uniformes e menu de seis grupos instalados em6d3bf293
|
||||
|
||||
Instalação expressamente autorizada deeca67191 concluída na revisão integrada `6d3bf2937ee6f5a58267967516560ba73d2cc936`,conferida às12:38:49Africa/Johannesburg(10:38:49UTC). A guarda inicial detectoua400802b já instalada e parou antes de escrever. Comparação delimitada identificou seis alterações independentes de tradução/cabeçalho fixo,integradas e preservadas;os quinze ficheiros aprovados deeca67191 permaneceram idênticos. Pacote reconciliado aplica/reverte exactamente sobrea400802b;pacote original preservado. Não foi necessária nova decisão de âmbito.
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -1,3 +1,23 @@
|
||||
## 11/11/2026 — Energia incorporada pelo mesmo percurso de Mineração, em QA
|
||||
|
||||
**Implementação:** o sector existente `/sectores/energia-especifica` passa a apresentar o documento fornecido com7segmentos,11áreas de cadeia de valor,10projectos de referência,4riscos e24fontes com as ligações originais. Gás/upstream/construção/midstream/industrialização/mercado final,redes/hídrica,solar/baterias/eólica,hidrogénio,biocombustíveis e parques verdes mantêm o seu contexto. As três centrais solares aparecem uma vez cada,com capacidade,promotores,financiamento e estado referidos. Metoro conserva56milhõesUSD e47,3milhõesEUR,atribuídos às fontes,sem conversão ou escolha silenciosa. Previsão,operação,desenvolvimento,estudo e proposta não são tratados como estados equivalentes.
|
||||
|
||||
**Localização e continuidade:** filtros usam apenas bacias,corredores,localidades e províncias explicitamente referidos. Buzi não recebe província por aproximação;Maputo permanece por precisar quando não discriminado;hidrogénio/biocombustíveis sem implantação mantêm local por definir. Escolher área → seleccionar dossier existente ou criar → guardar → recuperar → usar como evidência na preparação/SWOT. Energia e Mineração reutilizam o mesmo serviço/componente de referências do sector e o mesmo escritor/histórico do dossier,sem módulos,tabelas,roles ou permissões novos. Podem coexistir no mesmo dossier sem substituir escolhas deliberadas. Origem,linha/parágrafo,versão,actor e data preservados. Referências não criam ofertas,concursos abertos,direitos,licenças,promotores ou conclusões SWOT.
|
||||
|
||||
**QA:** sete casos nativos dos dois sectores/166asserções no cluster55441,em transacções revertidas;cinco casos de interface com filtros,retoma,continuidade e locais por definir;nove casos já dirigidos aos componentes afectados,sem repetir operações aceites. Análise PHP,tipos,lint e compilação registados no fecho em `outputs/sector-resource-20261111/verification.json`. HTMLs dos componentes reais emSSR são evidência de renderização,não revisão visual de navegador. Documento deEnergia intacto,SHA256 `2d9d94ac70115ade43c4093a4d5b302aaa93623a149f936615c38ba67b1e2bd2`;extracção reproduzível em `tools/prepare-energy-reference.py`. As referências legais permanecem documentais;nenhum cálculo,benefício ou regra é activado pela incorporação.
|
||||
|
||||
**Saldo:** Mineração e Energia implementadas emQA,agrupadas para entrega Git com backup/restauro/reversão;instalação e conferência visual pendentes. Referência da homologação6d3bf293 e270instituições preservadas. Não há publicação de projectos reais nem envio de dados a terceiros. A fonte precisa de dados específicos para ofertas concretas e localização mais exacta;isso não impede consultar/preparar estes percursos. Restantes módulos e resíduos fiscaisL1–L7,L8,L9–L16 mantêm o seu saldo anterior.
|
||||
|
||||
## 11/11/2026 — Mineração e cadeia de valor implementadas em QA, sem instalação
|
||||
|
||||
O documento «Minérios de Moçambique e a sua localização» foi integrado na página existente `/sectores/mineracao`, sem módulo paralelo: **11 grupos minerais,10 áreas de cadeia de valor,6 projectos de referência,12 indicadores e13 fontes**. Consulta por localização,grupo mineral ou actividade; cada área mostra o âmbito territorial,possibilidades de fornecimento,logística,energia,beneficiamento ou transformação. Produção,capacidade,recursos e previsões conservam período e atribuição. São referências para preparação,não uma oferta de concessão ou projecto disponível.
|
||||
|
||||
**Percurso demonstrado:** sector → Cabo Delgado/Grafite → cadeia de valor → escolher dossier existente ou criar → confirmar → recuperar no mesmo dossier → referência disponível como evidência SWOT. A escolha conserva grupo mineral,área,localização,texto territorial,versão/hash da fonte,actor e data. Áreas distintas são acrescentadas sem duplicar o sector,alterar o título ou substituir escolhas anteriores. Repetição recupera a mesma referência; chave de criação reutilizada com outra selecção recusa409. Dossier alheio403,encerrado409,fonte/local/grupo incompatíveis409/422. Sem coordenadas,direitos mineiros,promotores ou relações geográficas inferidos. “Maputo” mantém província/cidade por precisar quando o original não distingue. A localização agregada de um grupo não prova a ocorrência de todos os minérios em todos os locais.
|
||||
|
||||
**QA dirigido:** quatro casos nativos PostgreSQL55441/82asserções,em transacções revertidas; três casos de interface para filtros,retoma e continuidade nas duas escolhas de dossier; nove casos dos componentes afectados reutilizados sem repetir operações aceites. Análise PHP,tipos,lint e compilação no fecho registados em `outputs/mining-reference-20261111/verification.json`. Não é conferência visual de navegador. Original intacto,SHA256 `7202fb5986b40e62347867c653770030683ffec2701a2921e84342f15e9f3d8a`; extracção reproduzível em `tools/prepare-mining-reference.py`,linhas de origem conservadas. Instruções contidas no documento não foram convertidas em regras de produto.
|
||||
|
||||
**Estado:** implementado em QA; instalação deste conteúdo ainda pendente de autorização específica da entrega. Homologação de referência `6d3bf293`,270instituições publicadas e entregas aceites preservadas. Não se criam/publicam dez oportunidades concretas nem se importam anexos para a biblioteca. Faltam instalação e conferência visual deste recorte; projectos concretos,localizações mais precisas e condições dependem dos respectivos dados. O restante saldo integral por módulo e fiscalL1–L7,L8 eL9–L16 permanece aberto nos seus recortes.
|
||||
|
||||
## 11/11/2026 — perfis uniformes e menu de seis grupos instalados em6d3bf293
|
||||
|
||||
Instalação expressamente autorizada deeca67191 concluída na revisão integrada `6d3bf2937ee6f5a58267967516560ba73d2cc936`,conferida às12:38:49Africa/Johannesburg(10:38:49UTC). A guarda inicial detectoua400802b já instalada e parou antes de escrever. Comparação delimitada identificou seis alterações independentes de tradução/cabeçalho fixo,integradas e preservadas;os quinze ficheiros aprovados deeca67191 permaneceram idênticos. Pacote reconciliado aplica/reverte exactamente sobrea400802b;pacote original preservado. Não foi necessária nova decisão de âmbito.
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
import SectorResourceReference, { type SectorResourceData } from './sector-resource-reference';
|
||||
import { Link } from '@inertiajs/react';
|
||||
import EducationalArticleCard, {
|
||||
type EducationalArticle,
|
||||
} from './educational-article-card';
|
||||
export type SectorEntryData = {
|
||||
resource_reference?: SectorResourceData | null;
|
||||
articles: EducationalArticle[];
|
||||
relations: {
|
||||
id: string;
|
||||
@@ -43,6 +45,7 @@ export default function SectorEntry({
|
||||
modalidade adequada. Cada oportunidade tem promotor, objetivo e
|
||||
dados próprios.
|
||||
</p>
|
||||
{data.resource_reference && <SectorResourceReference data={data.resource_reference} />}
|
||||
<nav aria-label="Ações no setor" className="flex flex-wrap gap-3">
|
||||
{data.start_href ? (
|
||||
<Link
|
||||
|
||||
@@ -0,0 +1,233 @@
|
||||
import { useState } from "react";
|
||||
import { Link, usePage } from "@inertiajs/react";
|
||||
export type SectorResourceArea = {
|
||||
id: string;
|
||||
group_ids: string[];
|
||||
title: string;
|
||||
locations_text: string;
|
||||
location_labels: string[];
|
||||
market_evidence: string;
|
||||
value_chain: string;
|
||||
indicative_location: string;
|
||||
promotion_ready: boolean;
|
||||
source_row: string;
|
||||
};
|
||||
export type SectorResourceSelection = {
|
||||
sector_slug: string;
|
||||
key: string;
|
||||
group_id?: string | null;
|
||||
group_name?: string | null;
|
||||
area_id: string;
|
||||
title: string;
|
||||
location_label: string | null;
|
||||
locations_text: string;
|
||||
value_chain: string;
|
||||
source_sha256: string;
|
||||
reference_date: string;
|
||||
href: string;
|
||||
};
|
||||
export type SectorResourceData = {
|
||||
sector_slug: string;
|
||||
title: string;
|
||||
introduction: string;
|
||||
group_label: string;
|
||||
resource_heading: string;
|
||||
resource_notice: string;
|
||||
background: {title:string;paragraphs:string[]}[];
|
||||
source_sha256: string;
|
||||
reference_date: string;
|
||||
groups: { id: string; name: string; locations_text: string; location_labels: string[] }[];
|
||||
areas: SectorResourceArea[];
|
||||
projects: string[];
|
||||
indicators: { label: string; value: string; source: string }[];
|
||||
risks: string[];
|
||||
sources: string[];
|
||||
source_links?: {title:string;url:string}[];
|
||||
};
|
||||
export default function SectorResourceReference({ data }: { data: SectorResourceData }) {
|
||||
const url = usePage().url,
|
||||
query = new URL(url, "https://investmoz.invalid").searchParams;
|
||||
const [location, setLocation] = useState(query.get("resource_location") ?? ""),
|
||||
[search, setSearch] = useState(""),
|
||||
[area, setArea] = useState(query.get("resource_area") ?? ""),
|
||||
[group, setGroup] = useState(query.get("resource_group") ?? "");
|
||||
const locations = [
|
||||
...new Set(
|
||||
data.groups
|
||||
.flatMap((m) => m.location_labels)
|
||||
.concat(data.areas.flatMap((m) => m.location_labels)),
|
||||
),
|
||||
].sort((a, b) => a.localeCompare(b, "pt"));
|
||||
const matches = (x: { location_labels: string[] }, text: string) =>
|
||||
(!location || x.location_labels.includes(location)) &&
|
||||
(!search || text.toLocaleLowerCase("pt").includes(search.toLocaleLowerCase("pt")));
|
||||
const groups = data.groups.filter(
|
||||
(m) => (!group || m.id === group) && matches(m, m.name + " " + m.locations_text),
|
||||
),
|
||||
areas = data.areas.filter(
|
||||
(a) =>
|
||||
(!area || a.id === area) &&
|
||||
(!group || a.group_ids.includes(group)) &&
|
||||
matches(a, a.title + " " + a.value_chain + " " + a.locations_text),
|
||||
);
|
||||
return (
|
||||
<section
|
||||
aria-label={data.title}
|
||||
className="space-y-5 rounded border p-4"
|
||||
>
|
||||
<h2 className="text-xl font-semibold">{data.title}</h2>
|
||||
<p>{data.introduction}</p>
|
||||
<div className="flex flex-wrap gap-3">
|
||||
<label>
|
||||
Localização
|
||||
<select
|
||||
className="mt-1 block max-w-full rounded border p-2"
|
||||
aria-label="Localização sectorial"
|
||||
value={location}
|
||||
onChange={(e) => {
|
||||
setLocation(e.target.value);
|
||||
setArea("");
|
||||
}}
|
||||
>
|
||||
<option value="">Todas as localizações</option>
|
||||
{locations.map((p) => (
|
||||
<option key={p} value={p}>
|
||||
{p === "Maputo" ? "Maputo — província/cidade a precisar" : p}
|
||||
</option>
|
||||
))}
|
||||
</select>
|
||||
</label>
|
||||
<label>
|
||||
{data.group_label}
|
||||
<select
|
||||
className="mt-1 block max-w-full rounded border p-2"
|
||||
aria-label={data.group_label}
|
||||
value={group}
|
||||
onChange={(e) => {
|
||||
setGroup(e.target.value);
|
||||
setArea("");
|
||||
}}
|
||||
>
|
||||
<option value="">Todos os grupos</option>
|
||||
{data.groups.map((m) => (
|
||||
<option key={m.id} value={m.id}>
|
||||
{m.name}
|
||||
</option>
|
||||
))}
|
||||
</select>
|
||||
</label>
|
||||
<label>
|
||||
Recurso, local ou actividade
|
||||
<input
|
||||
className="mt-1 block max-w-full rounded border p-2"
|
||||
aria-label="Pesquisar recursos e cadeia de valor"
|
||||
value={search}
|
||||
onChange={(e) => {
|
||||
setSearch(e.target.value);
|
||||
setArea("");
|
||||
}}
|
||||
/>
|
||||
</label>
|
||||
{area && (
|
||||
<button type="button" onClick={() => setArea("")}>
|
||||
Ver todas as áreas
|
||||
</button>
|
||||
)}
|
||||
</div>
|
||||
<div>
|
||||
<h3 className="font-semibold">{data.resource_heading}</h3>
|
||||
{groups.length ? (
|
||||
<ul className="space-y-3">
|
||||
{groups.map((m) => (
|
||||
<li key={m.id}>
|
||||
<strong>{m.name}</strong>
|
||||
<p>{m.locations_text}</p>
|
||||
</li>
|
||||
))}
|
||||
</ul>
|
||||
) : (
|
||||
<p>Sem referências para esta pesquisa.</p>
|
||||
)}
|
||||
<p className="text-sm">{data.resource_notice}</p>
|
||||
</div>
|
||||
<div>
|
||||
<h3 className="font-semibold">Possibilidades na cadeia de valor</h3>
|
||||
{areas.map((a) => (
|
||||
<article key={a.id} className="my-3 space-y-2 rounded border p-3">
|
||||
<h4 className="font-semibold">{a.title}</h4>
|
||||
<p>{a.locations_text}</p>
|
||||
<p>{a.value_chain.replace(/\s*\(indicativo\)/, "")}</p>
|
||||
<details>
|
||||
<summary>Evidência e âmbito territorial</summary>
|
||||
<p>{a.market_evidence}</p>
|
||||
{a.indicative_location !== a.locations_text && <p>{a.indicative_location}</p>}
|
||||
<p>Referência de {data.reference_date}; preparação da actividade sujeita ao investimento concreto.</p>
|
||||
</details>
|
||||
<Link
|
||||
className="underline"
|
||||
href={
|
||||
"/investimentos/a-partir-do-setor/" + data.sector_slug + "?" +
|
||||
new URLSearchParams({
|
||||
resource_area: a.id,
|
||||
resource_source: data.source_sha256,
|
||||
...(group ? { resource_group: group } : {}),
|
||||
...(location ? { resource_location: location } : {}),
|
||||
})
|
||||
}
|
||||
>
|
||||
Preparar uma ideia nesta cadeia de valor
|
||||
</Link>
|
||||
</article>
|
||||
))}
|
||||
{!areas.length && <p>Sem áreas de investimento para esta selecção.</p>}
|
||||
</div>
|
||||
<details>
|
||||
<summary>Projectos de referência</summary>
|
||||
<ul>
|
||||
{data.projects.map((p, i) => (
|
||||
<li key={i}>{p}</li>
|
||||
))}
|
||||
</ul>
|
||||
</details>
|
||||
{!!data.indicators.length && (
|
||||
<details>
|
||||
<summary>Produção e recursos por período</summary>
|
||||
{data.indicators.map((s, i) => (
|
||||
<article key={i}>
|
||||
<h4>{s.label}</h4>
|
||||
<p>
|
||||
{s.value.replace(
|
||||
"Não encontrei dados de produção das outras gemas.",
|
||||
"Outras gemas: sem valores apresentados.",
|
||||
)}
|
||||
</p>
|
||||
<p>Fonte: {s.source}</p>
|
||||
</article>
|
||||
))}
|
||||
<p>
|
||||
Produção, capacidade, recursos e previsões são grandezas distintas. Os valores
|
||||
conservam os períodos e divergências das fontes.
|
||||
</p>
|
||||
</details>
|
||||
)}
|
||||
<details>
|
||||
<summary>Riscos a considerar</summary>
|
||||
<ul>
|
||||
{data.risks.map((r, i) => (
|
||||
<li key={i}>{r}</li>
|
||||
))}
|
||||
</ul>
|
||||
</details>
|
||||
{data.background.map(section=><details key={section.title}><summary>{section.title}</summary>{section.paragraphs.map((text,i)=><p key={i}>{text}</p>)}{section.title.startsWith("Enquadramento")&&<p>Referência documental; não activa benefícios fiscais, licenças ou direitos no portal.</p>}</details>)}
|
||||
<details>
|
||||
<summary>Fontes e data</summary>
|
||||
<p>Referências reunidas em {data.reference_date}.</p>
|
||||
<ul>
|
||||
{data.sources.map((s, i) => (
|
||||
<li key={i}>{data.source_links?.find(link=>link.title===s)?.url ? <a className="underline" href={data.source_links.find(link=>link.title===s)!.url} target="_blank" rel="noopener noreferrer">{s}</a> : s}</li>
|
||||
))}
|
||||
</ul>
|
||||
</details>
|
||||
</section>
|
||||
);
|
||||
}
|
||||
@@ -1,3 +1,4 @@
|
||||
import type { SectorResourceSelection } from '@/components/sector-resource-reference';
|
||||
import { createOperationKey } from '@/lib/operation-key';
|
||||
import { Head, Link, router, useForm } from '@inertiajs/react';
|
||||
import { useState } from 'react';
|
||||
@@ -19,11 +20,13 @@ export default function InvestmentContexts({
|
||||
contexts,
|
||||
contentSource,
|
||||
sectorSource,
|
||||
resourceSource,
|
||||
zoneSource,
|
||||
companyComparisonAnswers,
|
||||
guideSelection,
|
||||
}: {
|
||||
contexts: InvestmentContext[];
|
||||
resourceSource?: SectorResourceSelection;
|
||||
companyComparisonAnswers?: CompanyAnswers | null;
|
||||
guideSelection?: GuideSelection | null;
|
||||
contentSource?: LegacyArticle;
|
||||
@@ -46,6 +49,14 @@ export default function InvestmentContexts({
|
||||
reuse_consent: false,
|
||||
content_resource_id: contentSource?.id,
|
||||
sector_slug: sectorSource?.slug,
|
||||
sector_reference: resourceSource
|
||||
? {
|
||||
area_id: resourceSource.area_id,
|
||||
group_id: resourceSource.group_id,
|
||||
source_sha256: resourceSource.source_sha256,
|
||||
location_label: resourceSource.location_label,
|
||||
}
|
||||
: undefined,
|
||||
...(companyComparisonAnswers
|
||||
? { company_comparison: companyComparisonAnswers }
|
||||
: {}),
|
||||
@@ -87,6 +98,14 @@ export default function InvestmentContexts({
|
||||
publicada.
|
||||
</p>
|
||||
)}
|
||||
{resourceSource && (
|
||||
<section className="rounded border p-4">
|
||||
<h2>{resourceSource.title}</h2>
|
||||
<p>{resourceSource.location_label ?? resourceSource.locations_text}</p>
|
||||
<p>{resourceSource.value_chain}</p>
|
||||
<p>Esta referência será guardada apenas no dossier que escolher.</p>
|
||||
</section>
|
||||
)}
|
||||
{contentSource && (
|
||||
<p>
|
||||
Preparar a partir de{' '}
|
||||
@@ -155,6 +174,7 @@ export default function InvestmentContexts({
|
||||
{
|
||||
version: item.version,
|
||||
sector_slug: sectorSource.slug,
|
||||
...(resourceSource ? { sector_reference: form.data.sector_reference } : {}),
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import type { SectorResourceSelection } from '@/components/sector-resource-reference';
|
||||
import {
|
||||
financialCategories,
|
||||
financialTypes,
|
||||
@@ -44,6 +45,7 @@ type Step = {
|
||||
source_paragraph: number;
|
||||
};
|
||||
type Path = {
|
||||
sector_references?: SectorResourceSelection[];
|
||||
funding_selections?: {
|
||||
id: string;
|
||||
title: string;
|
||||
@@ -639,6 +641,21 @@ export default function InvestmentPath(path: Path) {
|
||||
)}
|
||||
</label>
|
||||
)}
|
||||
{!!path.sector_references?.length && (
|
||||
<section className="space-y-3 rounded border p-4">
|
||||
<h2 className="text-lg font-semibold">Sectores e cadeias de valor</h2>
|
||||
{path.sector_references.map((reference) => (
|
||||
<article key={reference.key}>
|
||||
<h3>{reference.title}</h3>
|
||||
<p>{reference.location_label ?? reference.locations_text}</p>
|
||||
<p>{reference.value_chain}</p>
|
||||
<Link className="underline" href={reference.href}>
|
||||
Consultar a referência mineral
|
||||
</Link>
|
||||
</article>
|
||||
))}
|
||||
</section>
|
||||
)}
|
||||
<ContextDocuments
|
||||
source={path.investment_context?.selection.opportunity}
|
||||
/>
|
||||
|
||||
@@ -0,0 +1,111 @@
|
||||
<?php
|
||||
|
||||
namespace Tests\Feature;
|
||||
|
||||
use App\Models\User;
|
||||
use App\Services\SectorResourceReferences;
|
||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Http;
|
||||
use Illuminate\Support\Str;
|
||||
use Inertia\Testing\AssertableInertia;
|
||||
use Tests\TestCase;
|
||||
|
||||
final class EnergyReferenceTest extends TestCase
|
||||
{
|
||||
use DatabaseTransactions;
|
||||
|
||||
protected function setUp(): void
|
||||
{
|
||||
parent::setUp();
|
||||
$this->withoutVite();
|
||||
$identity = DB::selectOne('select current_database() as name,inet_server_port() as port');
|
||||
$this->assertSame('simulator_fiscal_delta_20261021_test', $identity->name);
|
||||
$this->assertSame(55441, (int) $identity->port);
|
||||
config(['investor-path.enabled' => true, 'investor-path.private_preparation' => true, 'suitecrm.enabled' => false, 'investmoz_ai.enabled' => false]);
|
||||
Http::preventStrayRequests();
|
||||
}
|
||||
|
||||
private function choice(): array
|
||||
{
|
||||
return ['area_id' => 'ENE-07', 'group_id' => 'EN-SOLAR', 'location_label' => 'Niassa', 'source_sha256' => SectorResourceReferences::SOURCES['energia-especifica']];
|
||||
}
|
||||
|
||||
public function test_energy_source_preserves_named_places_solar_discrepancies_and_project_states_without_activating_rules(): void
|
||||
{
|
||||
$service = app(SectorResourceReferences::class);
|
||||
$raw = $service->data('energia-especifica');
|
||||
$view = $service->view('energia-especifica');
|
||||
$this->assertCount(7, $view['groups']);
|
||||
$this->assertCount(11, $view['areas']);
|
||||
$this->assertCount(10, $view['projects']);
|
||||
$this->assertCount(24, $view['sources']);
|
||||
$this->assertCount(4, $view['risks']);
|
||||
$this->assertCount(6, $raw['original_tables']);
|
||||
$this->assertArrayNotHasKey('original_tables', $view);
|
||||
foreach ($view['areas'] as $area) {
|
||||
$this->assertNull($area['coordinates']);
|
||||
$this->assertFalse($area['promotion_ready']);
|
||||
}
|
||||
$solar = implode(' ', $view['projects']);
|
||||
$this->assertStringContainsString('47,3 milhões EUR', $solar);
|
||||
$this->assertStringContainsString('56 milhões USD', $solar);
|
||||
$this->assertStringContainsString('15 MWac', $solar);
|
||||
$this->assertStringContainsString('após fecho financeiro', $solar);
|
||||
$upstream = $service->selection('energia-especifica', ['area_id' => 'ENE-01', 'location_label' => 'Buzi', 'source_sha256' => $view['source_sha256']]);
|
||||
$this->assertSame('Buzi', $upstream['location_label']);
|
||||
$this->assertArrayNotHasKey('province_id', $upstream);
|
||||
$unknown = $service->selection('energia-especifica', ['area_id' => 'ENE-09', 'source_sha256' => $view['source_sha256']]);
|
||||
$this->assertNull($unknown['location_label']);
|
||||
$this->assertSame('source_area_reference', $unknown['territory_precision']);
|
||||
file_put_contents(base_path('outputs/energy-reference-20261111/public-view.json'), json_encode($view, JSON_THROW_ON_ERROR | JSON_UNESCAPED_UNICODE));
|
||||
$this->get('/sectores/energia-especifica')->assertOk()->assertInertia(fn (AssertableInertia $page) => $page->component('portal/services')->has('sectorEntry.resource_reference.groups', 7));
|
||||
}
|
||||
|
||||
public function test_energy_new_dossier_and_existing_mining_dossier_keep_both_sources_and_recover_swot_evidence(): void
|
||||
{
|
||||
$this->actingAs(User::factory()->create());
|
||||
$before = DB::table('opportunities')->count();
|
||||
$selection = $this->choice();
|
||||
$start = $this->getJson('/investimentos/a-partir-do-setor/energia-especifica?'.http_build_query(['resource_area' => $selection['area_id'], 'resource_location' => $selection['location_label'], 'resource_group' => $selection['group_id'], 'resource_source' => $selection['source_sha256']]))->assertOk();
|
||||
$this->assertSame('EN-SOLAR', $start->json('resourceSource.group_id'));
|
||||
file_put_contents(base_path('outputs/energy-reference-20261111/start-page.json'), json_encode($start->json(), JSON_THROW_ON_ERROR | JSON_UNESCAPED_UNICODE));
|
||||
$body = ['title' => 'SYNTHETIC energy dossier', 'client_key' => (string) Str::uuid(), 'reuse_consent' => true, 'sector_slug' => 'energia-especifica', 'sector_reference' => $selection];
|
||||
$id = $this->postJson('/investimentos', $body)->assertCreated()->json('id');
|
||||
$this->assertSame($id, $this->postJson('/investimentos', $body)->assertCreated()->json('id'));
|
||||
$one = $this->getJson('/investimentos/'.$id)->assertOk()->json();
|
||||
$this->assertCount(1, $one['sector_references']);
|
||||
$this->assertSame('Niassa', $one['sector_references'][0]['location_label']);
|
||||
$mining = ['area_id' => 'MIN-02', 'location_label' => 'Cabo Delgado', 'group_id' => 'MINERAL-04', 'source_sha256' => SectorResourceReferences::SOURCES['mineracao']];
|
||||
$this->postJson('/investimentos/'.$id.'/sectores', ['version' => $one['case']['version'], 'sector_slug' => 'mineracao', 'sector_reference' => $mining])->assertOk();
|
||||
$two = $this->getJson('/investimentos/'.$id)->assertOk()->json();
|
||||
$this->assertCount(2, $two['sector_references']);
|
||||
$this->assertCount(2, $two['sector_contexts']);
|
||||
$this->assertSame($one['sector_references'][0], $two['sector_references'][0]);
|
||||
$this->assertSame('SYNTHETIC energy dossier', $two['case']['title']);
|
||||
$version = $two['case']['version'];
|
||||
$this->postJson('/investimentos/'.$id.'/sectores', ['version' => $version - 1, 'sector_slug' => 'energia-especifica', 'sector_reference' => $selection])->assertOk();
|
||||
$this->assertSame($version, $this->getJson('/investimentos/'.$id)->assertOk()->json('case.version'));
|
||||
$workspace = $this->getJson('/investimentos/'.$id.'/preparacao')->assertOk();
|
||||
$this->assertStringContainsString('Solar, baterias', $workspace->getContent());
|
||||
$this->assertStringContainsString('Grafite', $workspace->getContent());
|
||||
$this->assertSame($before, DB::table('opportunities')->count());
|
||||
file_put_contents(base_path('outputs/energy-reference-20261111/recovered-dossier.json'), json_encode($two, JSON_THROW_ON_ERROR | JSON_UNESCAPED_UNICODE));
|
||||
$this->actingAs(User::factory()->create());
|
||||
$this->postJson('/investimentos/'.$id.'/sectores', ['version' => $version, 'sector_slug' => 'energia-especifica', 'sector_reference' => $selection])->assertForbidden();
|
||||
}
|
||||
|
||||
public function test_energy_reference_rejects_wrong_sector_location_group_and_changed_creation_intent(): void
|
||||
{
|
||||
$this->actingAs(User::factory()->create());
|
||||
$body = ['title' => 'SYNTHETIC guarded energy dossier', 'client_key' => (string) Str::uuid(), 'reuse_consent' => true, 'sector_slug' => 'energia-especifica', 'sector_reference' => $this->choice()];
|
||||
$this->postJson('/investimentos', $body)->assertCreated();
|
||||
$this->postJson('/investimentos', [...$body, 'sector_reference' => [...$this->choice(), 'location_label' => 'Cabo Delgado']])->assertStatus(409);
|
||||
foreach ([['location_label' => 'Gaza'], ['group_id' => 'EN-WIND'], ['source_sha256' => str_repeat('a', 64)]] as $bad) {
|
||||
$count = DB::table('desk_cases')->count();
|
||||
$this->postJson('/investimentos', [...$body, 'client_key' => (string) Str::uuid(), 'sector_reference' => [...$this->choice(), ...$bad]])->assertStatus(isset($bad['source_sha256']) ? 409 : 422);
|
||||
$this->assertSame($count, DB::table('desk_cases')->count());
|
||||
}
|
||||
$this->postJson('/investimentos', [...$body, 'client_key' => (string) Str::uuid(), 'sector_slug' => 'turismo'])->assertStatus(422);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,119 @@
|
||||
<?php
|
||||
|
||||
namespace Tests\Feature;
|
||||
|
||||
use App\Models\User;
|
||||
use App\Services\SectorInvestment;
|
||||
use App\Services\SectorResourceReferences;
|
||||
use Illuminate\Foundation\Testing\DatabaseTransactions;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Http;
|
||||
use Illuminate\Support\Str;
|
||||
use Inertia\Testing\AssertableInertia;
|
||||
use Tests\TestCase;
|
||||
|
||||
final class MiningReferenceTest extends TestCase
|
||||
{
|
||||
use DatabaseTransactions;
|
||||
|
||||
protected function setUp(): void
|
||||
{
|
||||
parent::setUp();
|
||||
$this->withoutVite();
|
||||
$db = DB::selectOne('select current_database() as name,inet_server_port() as port');
|
||||
$this->assertSame('simulator_fiscal_delta_20261021_test', $db->name);
|
||||
$this->assertSame(55441, (int) $db->port);
|
||||
config(['investor-path.enabled' => true, 'investor-path.private_preparation' => true, 'suitecrm.enabled' => false, 'investmoz_ai.enabled' => false]);
|
||||
Http::preventStrayRequests();
|
||||
}
|
||||
|
||||
private function choice(string $area = 'MIN-02', ?string $province = 'Cabo Delgado'): array
|
||||
{
|
||||
return ['area_id' => $area, 'location_label' => $province, 'source_sha256' => SectorResourceReferences::SOURCES['mineracao']];
|
||||
}
|
||||
|
||||
public function test_complete_reference_has_source_counts_distinct_metrics_and_no_invented_coordinates(): void
|
||||
{
|
||||
$service = app(SectorResourceReferences::class);
|
||||
$data = $service->data('mineracao');
|
||||
$this->assertCount(11, $data['minerals']);
|
||||
$this->assertCount(10, $data['areas']);
|
||||
$this->assertCount(12, $data['indicators']);
|
||||
$this->assertCount(6, $data['projects']);
|
||||
$this->assertCount(13, $data['sources']);
|
||||
foreach ([...$data['minerals'], ...$data['areas']] as $row) {
|
||||
$this->assertNull($row['coordinates']);
|
||||
}
|
||||
$view = $service->view('mineracao');
|
||||
$this->assertArrayNotHasKey('original_paragraphs', $view);
|
||||
$this->assertArrayNotHasKey('source_fields', $view['areas'][0]);
|
||||
$this->assertCount(6, $view['risks']);
|
||||
file_put_contents(base_path('outputs/mining-reference-20261111/public-view.json'), json_encode($view, JSON_THROW_ON_ERROR | JSON_UNESCAPED_UNICODE));
|
||||
$this->get('/sectores/mineracao')->assertOk()->assertInertia(fn (AssertableInertia $page) => $page->component('portal/services')->has('sectorEntry.resource_reference.groups', 11));
|
||||
$this->assertStringNotContainsString('Próximos passos', json_encode($view['risks']));
|
||||
$selection = $service->selection('mineracao', $this->choice('MIN-06', 'Maputo'));
|
||||
$this->assertSame('province_or_city_unspecified', $selection['territory_precision']);
|
||||
$this->assertFalse($selection['promotion_ready']);
|
||||
$this->assertNull($selection['coordinates']);
|
||||
}
|
||||
|
||||
public function test_native_sector_start_save_retry_recovery_and_swot_keep_same_reference_without_creating_opportunities(): void
|
||||
{
|
||||
$actor = User::factory()->create();
|
||||
$this->actingAs($actor);
|
||||
$before = DB::table('opportunities')->count();
|
||||
$choice = [...$this->choice(), 'group_id' => 'MINERAL-04'];
|
||||
$start = $this->getJson('/investimentos/a-partir-do-setor/mineracao?'.http_build_query(['resource_area' => $choice['area_id'], 'resource_location' => $choice['location_label'], 'resource_group' => $choice['group_id'], 'resource_source' => $choice['source_sha256']]))->assertOk();
|
||||
$this->assertSame('Grafite', $start->json('resourceSource.group_name'));
|
||||
file_put_contents(base_path('outputs/mining-reference-20261111/start-page.json'), json_encode($start->json(), JSON_THROW_ON_ERROR | JSON_UNESCAPED_UNICODE));
|
||||
$body = ['title' => 'SYNTHETIC mining value-chain preparation', 'client_key' => (string) Str::uuid(), 'reuse_consent' => true, 'sector_slug' => 'mineracao', 'sector_reference' => $choice];
|
||||
$id = $this->postJson('/investimentos', $body)->assertCreated()->json('id');
|
||||
$again = $this->postJson('/investimentos', $body)->assertCreated();
|
||||
$this->assertSame($id, $again->json('id'));
|
||||
$view = $this->getJson('/investimentos/'.$id)->assertOk()->json();
|
||||
$this->assertCount(1, $view['sector_references']);
|
||||
$this->assertSame('Cabo Delgado', $view['sector_references'][0]['location_label']);
|
||||
$this->assertSame('MINERAL-04', $view['sector_references'][0]['group_id']);
|
||||
$this->assertSame(SectorResourceReferences::SOURCES['mineracao'], $view['sector_references'][0]['source_sha256']);
|
||||
$this->assertStringContainsString('Beneficiamento', $view['sector_references'][0]['value_chain']);
|
||||
$this->assertCount(1, $view['sector_contexts']);
|
||||
file_put_contents(base_path('outputs/mining-reference-20261111/recovered-dossier.json'), json_encode($view, JSON_THROW_ON_ERROR | JSON_UNESCAPED_UNICODE));
|
||||
$workspace = $this->getJson('/investimentos/'.$id.'/preparacao')->assertOk();
|
||||
$this->assertStringContainsString('sector-resource:', $workspace->getContent());
|
||||
$this->assertSame($before, DB::table('opportunities')->count());
|
||||
$this->postJson('/investimentos', [...$body, 'sector_reference' => $this->choice('MIN-01', 'Tete')])->assertStatus(409);
|
||||
$this->actingAs(User::factory()->create());
|
||||
$this->getJson('/investimentos/'.$id)->assertForbidden();
|
||||
}
|
||||
|
||||
public function test_existing_dossier_appends_distinct_area_and_preserves_manual_fields_and_previous_reference(): void
|
||||
{
|
||||
$actor = User::factory()->create();
|
||||
$this->actingAs($actor);
|
||||
$id = $this->postJson('/investimentos', ['title' => 'SYNTHETIC existing mining dossier', 'client_key' => (string) Str::uuid(), 'reuse_consent' => true])->assertCreated()->json('id');
|
||||
$service = app(SectorInvestment::class);
|
||||
$version = $this->getJson('/investimentos/'.$id)->assertOk()->json('case.version');
|
||||
$service->attach($actor, $id, ['version' => $version, 'sector_slug' => 'mineracao', 'sector_reference' => $this->choice()]);
|
||||
$one = $this->getJson('/investimentos/'.$id)->assertOk()->json();
|
||||
$service->attach($actor, $id, ['version' => $one['case']['version'], 'sector_slug' => 'mineracao', 'sector_reference' => $this->choice('MIN-01', 'Tete')]);
|
||||
$two = $this->getJson('/investimentos/'.$id)->assertOk()->json();
|
||||
$this->assertCount(2, $two['sector_references']);
|
||||
$this->assertSame($one['sector_references'][0], $two['sector_references'][0]);
|
||||
$this->assertSame('SYNTHETIC existing mining dossier', $two['case']['title']);
|
||||
$this->assertCount(1, $two['sector_contexts']);
|
||||
$service->attach($actor, $id, ['version' => $version, 'sector_slug' => 'mineracao', 'sector_reference' => $this->choice()]);
|
||||
$this->assertSame($two['case']['version'], $this->getJson('/investimentos/'.$id)->json('case.version'));
|
||||
DB::table('desk_cases')->where('id', $id)->update(['closed_at' => now()]);
|
||||
$this->postJson('/investimentos/'.$id.'/sectores', ['version' => $two['case']['version'], 'sector_slug' => 'mineracao', 'sector_reference' => $this->choice('MIN-05', 'Cabo Delgado')])->assertStatus(409);
|
||||
}
|
||||
|
||||
public function test_mismatched_source_province_and_mineral_are_refused_before_dossier_creation(): void
|
||||
{
|
||||
$this->actingAs(User::factory()->create());
|
||||
$count = DB::table('desk_cases')->count();
|
||||
foreach ([['source_sha256' => str_repeat('0', 64)], ['location_label' => 'Gaza'], ['group_id' => 'MINERAL-01']] as $bad) {
|
||||
$response = $this->postJson('/investimentos', ['title' => 'SYNTHETIC invalid mineral', 'client_key' => (string) Str::uuid(), 'reuse_consent' => true, 'sector_slug' => 'mineracao', 'sector_reference' => [...$this->choice(), ...$bad]]);
|
||||
$this->assertContains($response->status(), [409, 422]);
|
||||
}$this->assertSame($count, DB::table('desk_cases')->count());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,119 @@
|
||||
import test from 'node:test';
|
||||
import assert from 'node:assert/strict';
|
||||
import fs from 'node:fs';
|
||||
import { compileFunction } from 'node:vm';
|
||||
import { createRequire } from 'node:module';
|
||||
import { renderToStaticMarkup } from 'react-dom/server';
|
||||
import ts from 'typescript';
|
||||
const require = createRequire(import.meta.url);
|
||||
const root = new URL('../../', import.meta.url);
|
||||
const source = JSON.parse(fs.readFileSync(new URL('database/data/mining-reference-20261111.json', root)));
|
||||
// Public data follows exactly the service projection, while native QA verifies the route itself.
|
||||
const begin = source.risks.findIndex(x => x.startsWith('Riscos e pontos'));
|
||||
const end = source.risks.findIndex(x => x.startsWith('Próximos passos'));
|
||||
const data = { ...source, sector_slug:'mineracao', title:'Mineração e cadeias de valor', introduction:'Explore recursos minerais por localização.', group_label:'Grupo mineral', resource_heading:'Recursos e localização', resource_notice:'Conservar o âmbito territorial da fonte.', background:[], risks: source.risks.slice(begin + 1, end) };
|
||||
data.groups=source.minerals.map(({province_names,...group})=>({...group,location_labels:province_names}));
|
||||
data.indicators=source.indicators.map(({mineral,value,source})=>({value,source,label:mineral}));
|
||||
delete data.original_paragraphs;
|
||||
data.areas = data.areas.map(({source_fields: _sourceFields,province_names,mineral_ids, ...area}) => ({...area,location_labels:province_names,group_ids:mineral_ids}));
|
||||
function load(file, mocks) {
|
||||
const code = ts.transpileModule(fs.readFileSync(new URL(file, root), 'utf8'), {
|
||||
compilerOptions: {module:ts.ModuleKind.CommonJS,target:ts.ScriptTarget.ES2022,jsx:ts.JsxEmit.ReactJSX},
|
||||
}).outputText;
|
||||
const mod = {exports:{}};
|
||||
compileFunction(code,['require','module','exports'])(key => mocks[key] ?? require(key),mod,mod.exports);
|
||||
return mod.exports.default;
|
||||
}
|
||||
function nodes(tree) {
|
||||
if (!tree || typeof tree !== 'object') return [];
|
||||
if (Array.isArray(tree)) return tree.flatMap(nodes);
|
||||
return [tree,...nodes(tree.props?.children)];
|
||||
}
|
||||
const Link = ({children, ...props}) => require('react').createElement('a',props,children);
|
||||
function mount(url = '/sectores/mineracao', content = data) {
|
||||
const state = []; let cursor = 0;
|
||||
const Component = load('resources/js/components/sector-resource-reference.tsx', {
|
||||
react:{useState(initial) {const n=cursor++; if (!(n in state)) state[n]=initial; return [state[n],value=>state[n]=value];}},
|
||||
'@inertiajs/react':{Link,usePage:()=>({url})},
|
||||
});
|
||||
return () => {cursor=0;return Component({data:content});};
|
||||
}
|
||||
test('mineral and province filters keep value-chain selection in the existing investment route',()=>{
|
||||
const render=mount(); let tree=render();
|
||||
nodes(tree).find(n=>n.props?.['aria-label']==='Localização sectorial').props.onChange({target:{value:'Cabo Delgado'}});
|
||||
tree=render(); nodes(tree).find(n=>n.props?.['aria-label']==='Grupo mineral').props.onChange({target:{value:'MINERAL-04'}});
|
||||
tree=render();
|
||||
const links=nodes(tree).filter(n=>n.type===Link);
|
||||
assert.equal(links.length,1);
|
||||
const url=new URL(links[0].props.href,'https://qa.invalid');
|
||||
assert.equal(url.pathname,'/investimentos/a-partir-do-setor/mineracao');
|
||||
assert.equal(url.searchParams.get('resource_area'),'MIN-02');
|
||||
assert.equal(url.searchParams.get('resource_location'),'Cabo Delgado');
|
||||
assert.equal(url.searchParams.get('resource_group'),'MINERAL-04');
|
||||
assert.equal(url.searchParams.get('resource_source'),source.source_sha256);
|
||||
const html=renderToStaticMarkup(tree);
|
||||
assert.match(html,/Beneficiamento/);
|
||||
if (process.env.INVESTMOZ_MINING_QA_ARTIFACTS === '1') {
|
||||
const view=JSON.parse(fs.readFileSync(new URL('outputs/mining-reference-20261111/public-view.json',root)));
|
||||
for (const key of ['source_sha256','reference_date','groups','areas','projects','indicators','sources','risks']) assert.deepEqual(view[key],data[key]);
|
||||
fs.writeFileSync(new URL('outputs/mining-reference-20261111/Cabo-Delgado-Grafite.html',root),html);
|
||||
}
|
||||
});
|
||||
test('return link filters and source uncertainty survive without invented map pins or publishing instructions',()=>{
|
||||
const render=mount('/sectores/mineracao?resource_area=MIN-06&resource_location=Maputo');
|
||||
const html=renderToStaticMarkup(render());
|
||||
assert.match(html,/Maputo — província\/cidade a precisar/);
|
||||
assert.match(html,/Minerais industriais/);
|
||||
assert.doesNotMatch(html,/Próximos passos|documento gerador|seis requisitos|latitude|longitude/);
|
||||
const clear=nodes(render()).find(n=>n.type==='button');clear.props.onClick();
|
||||
assert.ok(nodes(render()).filter(n=>n.type===Link).length>=1);
|
||||
});
|
||||
test('selected mining context reaches both new and existing dossier actions',()=>{
|
||||
let initial; const posted=[];
|
||||
const selection={sector_slug:'mineracao',area_id:'MIN-02',group_id:'MINERAL-04',location_label:'Cabo Delgado',source_sha256:source.source_sha256,title:data.areas[1].title,value_chain:data.areas[1].value_chain};
|
||||
const Component=load('resources/js/pages/investor-path/index.tsx',{
|
||||
react:{useState:fn=>[typeof fn==='function'?fn():fn,()=>{}]},
|
||||
'@/lib/operation-key':{createOperationKey:()=> 'SYNTHETIC-key'},
|
||||
'@/lib/company-comparison':{}, '@/lib/investment-guides':{},
|
||||
'@inertiajs/react':{Head:()=>null,Link,router:{post:(...args)=>posted.push(args)},useForm:data=>{initial=data;return {data,errors:{},processing:false,setData:()=>{},post:url=>posted.push([url,data])};}},
|
||||
});
|
||||
const tree=Component({contexts:[{id:'SYNTHETIC-case',version:3,title:'Synthetic dossier',updated_at:'2026-11-11'}],sectorSource:{slug:'mineracao',name:'Mineração',href:'/sectores/mineracao'},resourceSource:selection});
|
||||
assert.deepEqual(initial.sector_reference,{area_id:selection.area_id,group_id:selection.group_id,source_sha256:selection.source_sha256,location_label:selection.location_label});
|
||||
const button=nodes(tree).find(n=>n.type==='button' && n.props.onClick);
|
||||
button.props.onClick();
|
||||
assert.equal(posted[0][0],'/investimentos/SYNTHETIC-case/sectores');
|
||||
assert.deepEqual(posted[0][1].sector_reference,initial.sector_reference);
|
||||
nodes(tree).find(n=>n.type==='form').props.onSubmit({preventDefault(){}});
|
||||
assert.equal(posted[1][0],'/investimentos');
|
||||
assert.deepEqual(posted[1][1].sector_reference,initial.sector_reference);
|
||||
});
|
||||
|
||||
const energySource=JSON.parse(fs.readFileSync(new URL('database/data/energy-reference-20261111.json',root)));
|
||||
const energyData={...energySource,sector_slug:'energia-especifica',title:'Energia e cadeias de valor',introduction:'Prepare o investimento energético.',group_label:'Segmento energético',resource_heading:'Segmentos e âmbito territorial',resource_notice:'Conservar bacias,corredores e localidades.'};
|
||||
test('energy solar selection preserves Niassa, batteries and the correct sector route',()=>{
|
||||
const render=mount('/sectores/energia-especifica',energyData);let tree=render();
|
||||
nodes(tree).find(n=>n.props?.['aria-label']==='Localização sectorial').props.onChange({target:{value:'Niassa'}});
|
||||
tree=render();nodes(tree).find(n=>n.props?.['aria-label']==='Segmento energético').props.onChange({target:{value:'EN-SOLAR'}});
|
||||
tree=render();const links=nodes(tree).filter(n=>n.type===Link);assert.equal(links.length,1);
|
||||
const url=new URL(links[0].props.href,'https://qa.invalid');
|
||||
assert.equal(url.pathname,'/investimentos/a-partir-do-setor/energia-especifica');
|
||||
assert.equal(url.searchParams.get('resource_area'),'ENE-07');
|
||||
assert.equal(url.searchParams.get('resource_location'),'Niassa');
|
||||
assert.equal(url.searchParams.get('resource_group'),'EN-SOLAR');
|
||||
const html=renderToStaticMarkup(tree);
|
||||
assert.match(html,/baterias|armazenamento/);assert.match(html,/47,3 milhões EUR/);assert.match(html,/56 milhões USD/);
|
||||
assert.doesNotMatch(html,/Produção e recursos por período/);
|
||||
if(process.env.INVESTMOZ_MINING_QA_ARTIFACTS==='1'){
|
||||
const view=JSON.parse(fs.readFileSync(new URL('outputs/energy-reference-20261111/public-view.json',root)));
|
||||
for(const key of ['groups','areas','projects','sources','risks','background'])assert.deepEqual(view[key],energyData[key]);
|
||||
fs.writeFileSync(new URL('outputs/energy-reference-20261111/Niassa-Solar.html',root),html);
|
||||
}
|
||||
});
|
||||
test('energy studies without a named location stay selectable without assigning national coverage',()=>{
|
||||
const tree=mount('/sectores/energia-especifica?resource_area=ENE-09',energyData)();
|
||||
const links=nodes(tree).filter(n=>n.type===Link);assert.equal(links.length,1);
|
||||
const url=new URL(links[0].props.href,'https://qa.invalid');
|
||||
assert.equal(url.searchParams.get('resource_location'),null);
|
||||
assert.equal(url.searchParams.get('resource_area'),'ENE-09');
|
||||
const html=renderToStaticMarkup(tree);assert.match(html,/Sem implantação concreta/);assert.doesNotMatch(html,/latitude|longitude/);
|
||||
});
|
||||
@@ -0,0 +1,108 @@
|
||||
"""Extract the supplied reference; curated groupings cite its exact rows/paragraphs.
|
||||
No coordinates, offers, territorial masters or product rules are created.
|
||||
"""
|
||||
from pathlib import Path
|
||||
import argparse, hashlib, json, re, zipfile, xml.etree.ElementTree as E
|
||||
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument('source', type=Path)
|
||||
parser.add_argument('--out', type=Path, required=True)
|
||||
args = parser.parse_args()
|
||||
ns = {'w': 'http://schemas.openxmlformats.org/wordprocessingml/2006/main'}
|
||||
def clean(value):
|
||||
return re.sub(r'\s+([,;)])', r'\1', re.sub(r'([(])\s+', r'\1', re.sub(r'\s+', ' ', value))).strip()
|
||||
def text(node):
|
||||
return clean(' '.join(t.text or '' for t in node.findall('.//w:t', ns)))
|
||||
with zipfile.ZipFile(args.source) as archive:
|
||||
body = E.fromstring(archive.read('word/document.xml')).find('w:body', ns)
|
||||
relationships = {r.attrib['Id']: r.attrib['Target'] for r in E.fromstring(archive.read('word/_rels/document.xml.rels')) if r.attrib.get('Type','').endswith('/hyperlink')}
|
||||
paragraph_nodes = [n for n in body if n.tag.endswith('}p') and ' '.join(t.text or '' for t in n.findall('.//w:t', ns))]
|
||||
source_links = []
|
||||
for index, node in enumerate(paragraph_nodes):
|
||||
for link in node.findall('.//w:hyperlink', ns):
|
||||
url = relationships.get(link.attrib.get('{http://schemas.openxmlformats.org/officeDocument/2006/relationships}id'), '')
|
||||
if index >= 90 and url.startswith(('https://','http://')):
|
||||
source_links.append({'title':text(node),'url':url,'source_paragraph':index})
|
||||
# Preserve positions before whitespace normalization, including the original blank paragraph.
|
||||
paragraphs = [text(n) for n in body if n.tag.endswith('}p') and ' '.join(t.text or '' for t in n.findall('.//w:t', ns))]
|
||||
tables = [[[text(c) for c in r.findall('w:tc', ns)] for r in n.findall('w:tr', ns)] for n in body if n.tag.endswith('}tbl')]
|
||||
assert len(paragraphs) == 114 and len(tables) == 6 and len(tables[1]) == 11
|
||||
groups = [('EN-GAS','Gás natural e GNL'),('EN-POWER','Electricidade, hidroeléctricas e redes'),('EN-SOLAR','Solar, armazenamento e sistemas fora da rede'),('EN-WIND','Energia eólica'),('EN-HYDROGEN','Hidrogénio verde'),('EN-BIO','Biocombustíveis'),('EN-GREEN','Parques industriais verdes')]
|
||||
areas = []
|
||||
def area(number, title, group, locations, labels, chain, evidence, citations):
|
||||
areas.append({'id': f'ENE-{number:02}', 'title': title, 'group_ids': [group],
|
||||
'locations_text': locations, 'location_labels': labels, 'value_chain': chain,
|
||||
'market_evidence': evidence, 'indicative_location': locations,
|
||||
'source_row': citations, 'source_state': 'Referência para preparação',
|
||||
'availability': 'reference_only', 'promotion_ready': False, 'coordinates': None})
|
||||
for i, row in enumerate(tables[3][1:], 1):
|
||||
locations, labels, paragraphs_used = {
|
||||
1: ('Bacia do Rovuma; Buzi. A fonte não atribui todas as áreas a uma província.', ['Bacia do Rovuma','Buzi'], [34,35]),
|
||||
2: ('Projectos de GNL; base logística de Pemba.', ['Pemba'], [35,58]),
|
||||
3: ('Gasoduto Norte–Sul; corredor Palma–Maputo, apresentado como proposta de estudo.', ['Norte–Sul','Palma–Maputo'], [35,51]),
|
||||
4: ('Corredor Palma–Maputo proposto no estudo; implantação de cada indústria por definir.', ['Palma–Maputo'], [50,51,53]),
|
||||
5: ('Implantação a definir no investimento; sem localização discriminada na fonte.', [], [55,56]),
|
||||
}[i]
|
||||
area(i, 'Gás natural — '+row[0], 'EN-GAS', locations, labels,
|
||||
row[1]+'. Perfil de investidor: '+row[2]+'.',
|
||||
' '.join(paragraphs[n] for n in paragraphs_used),
|
||||
f'table4:row{i}; '+','.join('paragraph:'+str(n) for n in paragraphs_used))
|
||||
area(6, 'Hidroeléctricas, redes e interligações', 'EN-POWER',
|
||||
'Rio Zambeze; Maputo–Temane; interligação Moçambique–Zâmbia. Âmbitos de projecto, sem coordenadas.',
|
||||
['Rio Zambeze','Maputo–Temane','Moçambique–Zâmbia'],
|
||||
'Fornecimento de subestações, transformadores, protecções eléctricas, SCADA e modernização de redes.',
|
||||
' '.join(paragraphs[n] for n in [37,38,67,68]), 'paragraphs:37,38,67,68')
|
||||
area(7, 'Solar, baterias e sistemas fora da rede', 'EN-SOLAR',
|
||||
'Mocuba (Zambézia), Metoro (Cabo Delgado), Cuamba (Niassa) e Afungi. Sistemas fora da rede: implantação a definir.',
|
||||
['Zambézia','Mocuba','Cabo Delgado','Metoro','Niassa','Cuamba','Afungi'],
|
||||
'Produção solar, sistemas de armazenamento, fornecimento e manutenção de equipamentos e soluções fora da rede.',
|
||||
' '.join(paragraphs[n] for n in [40,43,45,46]), 'paragraphs:40,43,45,46; table3:rows1–3')
|
||||
area(8, 'Energia eólica — Namaacha', 'EN-WIND', 'Namaacha (Maputo, sem distinção entre província e cidade na fonte).',
|
||||
['Namaacha','Maputo'], 'Desenvolvimento e fornecimento para geração eólica; obras previstas dependem do fecho financeiro.',
|
||||
paragraphs[47], 'paragraph:47')
|
||||
area(9, 'Hidrogénio verde — estudos e infra-estruturas', 'EN-HYDROGEN', 'Sem implantação concreta identificada na fonte.', [],
|
||||
'Estudos de mercado e viabilidade, consultoria, parcerias, produção, armazenamento e transporte.',
|
||||
' '.join(paragraphs[n] for n in [61,62]), 'paragraphs:61,62')
|
||||
area(10, 'Biocombustíveis e respectivas cadeias de fornecimento', 'EN-BIO', 'Implantação a definir; a fonte não discrimina locais de produção.', [],
|
||||
'Matérias-primas agrícolas, produção, armazenagem, transporte, distribuição e mistura de biocombustíveis.',
|
||||
' '.join(paragraphs[n] for n in [64,65]), 'paragraphs:64,65')
|
||||
area(11, 'Parques industriais verdes', 'EN-GREEN', 'Corredores e parques sem implantação discriminada na fonte.', [],
|
||||
'Indústria e infra-estruturas abastecidas por energia limpa; preparação de parcerias e localização.',
|
||||
paragraphs[69], 'paragraph:69')
|
||||
group_rows = []
|
||||
for key, name in groups:
|
||||
matches = [a for a in areas if key in a['group_ids']]
|
||||
labels = list(dict.fromkeys(label for a in matches for label in a['location_labels']))
|
||||
group_rows.append({'id': key, 'name': name, 'locations_text': ' '.join(dict.fromkeys(a['locations_text'] for a in matches)), 'location_labels': labels, 'coordinates': None})
|
||||
projects = []
|
||||
for i, row in enumerate(tables[1][1:], 1):
|
||||
solar = next((r for r in tables[2][1:] if row[0] in r[0]), None)
|
||||
if solar:
|
||||
description = f'{solar[0]} — {row[1]}. Capacidade: {solar[1]}. Investimento referido: {solar[2]}. Parcerias: {solar[3]}. Estado na fonte: {solar[4]}.'
|
||||
else:
|
||||
amount = '' if row[2] == 'n.d.' else f' Investimento estimado: {row[2]}.'
|
||||
description = f'{row[0]} — {row[1]}.{amount} Estado/calendário na fonte: {row[3]}.'
|
||||
projects.append(description)
|
||||
result = {'format': 'investmoz-energy-reference-v1', 'source_sha256': hashlib.sha256(args.source.read_bytes()).hexdigest(),
|
||||
'source_document_name': args.source.name, 'reference_date': '2026-11-11', 'title': 'Energia e cadeias de valor em Moçambique',
|
||||
'groups': group_rows, 'areas': areas, 'projects': projects,
|
||||
'indicators': [], 'risks': [f'{r[0]}: {r[1]} Resposta a considerar: {r[2]}' for r in tables[5][1:]],
|
||||
'sources': paragraphs[90:], 'source_links': source_links,
|
||||
'background': [{'title':'Financiamento referido nas fontes','paragraphs':[paragraphs[29],paragraphs[71]]},
|
||||
{'title':'Enquadramento sectorial referido nas fontes','paragraphs':[paragraphs[n] for n in [74,76,78,79]]},
|
||||
{'title':'Âmbito dos dados solares','paragraphs':[paragraphs[45],paragraphs[46]]}],
|
||||
'original_tables': tables, 'original_paragraphs': paragraphs,
|
||||
'source_instructions_are_not_product_rules': True}
|
||||
assert len(projects) == 10 and len(areas) == 11 and len(result['sources']) == 24
|
||||
assert len(source_links) == 24
|
||||
# Editorial presentation, preserving original wording in original_paragraphs/tables.
|
||||
def editorial(value):
|
||||
if isinstance(value, str):
|
||||
return value.replace('ainda não encontrei projectos com decisão final de investimento','o levantamento não identifica projectos com decisão final de investimento').replace('não encontrei uma confirmação directa da EDM, nem dados de 2026 sobre Metoro','a referência consultada não apresenta confirmação directa da EDM nem dados de 2026 sobre Metoro')
|
||||
if isinstance(value, list): return [editorial(x) for x in value]
|
||||
if isinstance(value, dict): return {k:editorial(v) for k,v in value.items()}
|
||||
return value
|
||||
for key in ['areas','background']: result[key]=editorial(result[key])
|
||||
args.out.parent.mkdir(parents=True, exist_ok=True)
|
||||
args.out.write_text(json.dumps(result, ensure_ascii=False, indent=2), encoding='utf-8')
|
||||
print(json.dumps({'sha256':result['source_sha256'],'groups':len(groups),'areas':len(areas),'projects':len(projects),'sources':len(result['sources'])}))
|
||||
@@ -0,0 +1,24 @@
|
||||
from pathlib import Path
|
||||
import argparse,zipfile,xml.etree.ElementTree as E,hashlib,json,re
|
||||
parser=argparse.ArgumentParser();parser.add_argument('source',type=Path);parser.add_argument('--out',type=Path,required=True);args=parser.parse_args()
|
||||
ns={'w':'http://schemas.openxmlformats.org/wordprocessingml/2006/main'}
|
||||
def clean(s):return re.sub(r'\s+([,;)])',r'\1',re.sub(r'([(])\s+',r'\1',re.sub(r'\s+',' ',s))).strip()
|
||||
def text(el):return clean(' '.join(x.text or '' for x in el.findall('.//w:t',ns)))
|
||||
z=zipfile.ZipFile(args.source);root=E.fromstring(z.read('word/document.xml'));body=root.find('w:body',ns);tables=[];sections={};heading='';paragraphs=[]
|
||||
for node in body:
|
||||
if node.tag.endswith('}p'):
|
||||
value=text(node);paragraphs.append(value)
|
||||
if re.match(r'^[1-8]\s*\.0 ',value):heading=re.match(r'^([1-8])\s*\.0 ',value).group(1)+'.0';sections[heading]=[]
|
||||
elif value:sections.setdefault(heading,[]).append(value)
|
||||
elif node.tag.endswith('}tbl'):tables.append([[text(cell) for cell in row.findall('w:tc',ns)] for row in node.findall('w:tr',ns)])
|
||||
assert len(tables)==13 and len(tables[0])==12 and len(tables[2])==11
|
||||
provinces=['Cabo Delgado','Gaza','Inhambane','Manica','Maputo','Nampula','Niassa','Sofala','Tete','Zambézia']
|
||||
def locations(value):return [p for p in provinces if re.search(r'(?<!\w)'+re.escape(p)+r'(?!\w)',value,re.I)]
|
||||
source_hash=hashlib.sha256(args.source.read_bytes()).hexdigest()
|
||||
minerals=[{'id':f'MINERAL-{i:02}','name':r[0],'locations_text':r[1],'province_names':locations(r[1]),'source_row':f'table1:row{i}','coordinates':None,'classification':'reported_occurrence_group'} for i,r in enumerate(tables[0][1:],1)]
|
||||
areas=[]
|
||||
for i,(row,detail) in enumerate(zip(tables[2][1:],tables[3:]),1):
|
||||
fields=dict(detail[1:]);mineral_groups={1:[1],2:[4],3:[3,5],4:[2],5:[10],6:[11],7:[6],8:[7],9:[8],10:[9]};areas.append({'id':f'MIN-{i:02}','title':row[0],'mineral_ids':[f'MINERAL-{number:02}' for number in mineral_groups[i]],'locations_text':row[1],'province_names':locations(row[1]),'market_evidence':row[2],'value_chain':row[3],'source_state':row[4],'indicative_location':fields.get('Localização indicativa (distrito, não oficial)',''),'source_fields':fields,'source_row':f'table3:row{i}','coordinates':None,'availability':'reference_only','promotion_ready':False})
|
||||
result={'format':'investmoz-mining-reference-v1','source_sha256':source_hash,'source_document_name':args.source.name,'reference_date':'2026-11-11','title':'Mineração e cadeias de valor em Moçambique','minerals':minerals,'areas':areas,'indicators':[{'mineral':r[0],'value':r[1],'source':r[2],'source_row':f'table2:row{i}'} for i,r in enumerate(tables[1][1:],1)],'projects':sections.get('3.0',[]),'risks':sections.get('7.0',[]),'sources':sections.get('8.0',[]),'original_paragraphs':paragraphs,'source_instructions_are_not_product_rules':True}
|
||||
assert len(areas)==10 and len(minerals)==11 and len(result['indicators'])==12 and len(result['projects'])==6 and result['sources']
|
||||
args.out.parent.mkdir(parents=True,exist_ok=True);args.out.write_text(json.dumps(result,ensure_ascii=False,indent=2),encoding='utf-8');print(json.dumps({'sha256':source_hash,'minerals':len(minerals),'areas':len(areas),'projects':len(result['projects']),'indicators':len(result['indicators']),'sources':len(result['sources']),'coordinates_created':0}))
|
||||
@@ -0,0 +1,34 @@
|
||||
<?php
|
||||
|
||||
$root = dirname(__DIR__);
|
||||
if (! in_array(($argv[1] ?? ''), ['test', 'analyse'], true) || basename($root) !== 'portal-investidor') {
|
||||
throw new RuntimeException('Explicit local test operation required.');
|
||||
}
|
||||
foreach (['APP_ENV' => 'testing', 'APP_KEY' => 'base64:'.base64_encode(str_repeat('Q', 32)),
|
||||
'APP_CONFIG_CACHE' => $root.'/outputs/sector-resource-20261111/no-config.php',
|
||||
'DB_CONNECTION' => 'pgsql', 'DB_HOST' => '127.0.0.1', 'DB_PORT' => '55441',
|
||||
'DB_DATABASE' => 'simulator_fiscal_delta_20261021_test', 'DB_USERNAME' => 'investmoz_test', 'DB_PASSWORD' => '',
|
||||
'DB_URL' => '', 'DATABASE_URL' => '', 'CACHE_STORE' => 'array', 'SESSION_DRIVER' => 'array',
|
||||
'QUEUE_CONNECTION' => 'sync', 'MAIL_MAILER' => 'array', 'SUITECRM_ENABLED' => 'false'] as $key => $value) {
|
||||
putenv($key.'='.$value);
|
||||
$_ENV[$key] = $_SERVER[$key] = $value;
|
||||
}
|
||||
$pdo = new PDO('pgsql:host=127.0.0.1;port=55441;dbname=simulator_fiscal_delta_20261021_test', 'investmoz_test', '');
|
||||
$identity = $pdo->query('select current_database() as name,inet_server_port() as port')->fetch(PDO::FETCH_ASSOC);
|
||||
if ($identity['name'] !== 'simulator_fiscal_delta_20261021_test' || (int) $identity['port'] !== 55441) {
|
||||
throw new RuntimeException('Isolated QA identity required.');
|
||||
}
|
||||
if (($argv[1] ?? '') === 'analyse') {
|
||||
$argv = ['phpstan', 'analyse', '--no-progress', '--memory-limit=512M', '--configuration='.$root.'/outputs/funding-directory-20261110/phpstan.neon', 'app/Services/SectorResourceReferences.php', 'app/Services/SectorInvestment.php', 'app/Services/InvestorPath.php', 'app/Services/InvestorContext.php', 'app/Services/InvestmentPreparationWorkspace.php', 'app/Http/Controllers/InvestorPathController.php'];
|
||||
$_SERVER['argv'] = $argv;
|
||||
$_SERVER['argc'] = count($argv);
|
||||
require $root.'/vendor/autoload.php';
|
||||
require $root.'/vendor/phpstan/phpstan/phpstan';
|
||||
exit;
|
||||
}
|
||||
$argv = ['phpunit', '-c', 'phpunit.investmoz.xml', '--do-not-cache-result', 'tests/Feature/MiningReferenceTest.php', 'tests/Feature/EnergyReferenceTest.php'];
|
||||
$argc = count($argv);
|
||||
$_SERVER['argv'] = $argv;
|
||||
$_SERVER['argc'] = $argc;
|
||||
require $root.'/vendor/autoload.php';
|
||||
require $root.'/vendor/phpunit/phpunit/phpunit';
|
||||
Reference in New Issue
Block a user