Files
Investidor-V2/routes/web.php
T

314 lines
29 KiB
PHP

<?php
require __DIR__.'/procurement.php';
require __DIR__.'/existing-business.php';
require __DIR__.'/territorial-registry.php';
require __DIR__.'/partnerships.php';
require __DIR__.'/virtual-desk.php';
require __DIR__.'/investment-zones.php';
use App\Http\Controllers\AiController;
use App\Http\Controllers\ClusterValueChainController;
use App\Http\Controllers\CrmController;
use App\Http\Controllers\DashboardController;
use App\Http\Controllers\DocumentMalwareController;
use App\Http\Controllers\EconomicReferenceController;
use App\Http\Controllers\EducationController;
use App\Http\Controllers\EducationInvestmentController;
use App\Http\Controllers\InvestmentCoordinatesController;
use App\Http\Controllers\InvestmentDiscoveryController;
use App\Http\Controllers\InvestmentPortfolioController;
use App\Http\Controllers\InvestmentRelationshipRepairController;
use App\Http\Controllers\InvestmentStructureController;
use App\Http\Controllers\InvestmentStructureRelationController;
use App\Http\Controllers\InvestmentTerritoryController;
use App\Http\Controllers\InvestorWorkspaceController;
use App\Http\Controllers\LegacyContentController;
use App\Http\Controllers\OpportunityClassificationController;
use App\Http\Controllers\OpportunityManagementController;
use App\Http\Controllers\OpportunityOriginReviewController;
use App\Http\Controllers\OpportunityResourceController;
use App\Http\Controllers\PortalManagementController;
use App\Http\Controllers\PortalProfileController;
use App\Http\Controllers\PortalProfileInstallationController;
use App\Http\Controllers\PortalServicesController;
use App\Http\Controllers\PublicBusinessOpportunityController;
use App\Http\Controllers\PublicGeographyController;
use App\Http\Controllers\PublicPortalController;
use App\Http\Controllers\TerritoryGeometryImportController;
use App\Http\Middleware\AiEnabled;
use App\Http\Middleware\EducationEnabled;
use App\Http\Middleware\EnsurePortalProfileAdministration;
use App\Http\Middleware\EnsurePortalProfiles;
use App\Http\Middleware\RequireZoneMfa;
use Illuminate\Support\Facades\Route;
use Inertia\Inertia;
use Laravel\Fortify\Features;
// Route::inertia('/', 'welcome')->name('home');
Route::get('/', [PortalServicesController::class, 'home'])->name('home');
Route::inertia('/politica-de-privacidade', 'portal/privacy-policy')->name('legal.privacy');
Route::inertia('/termos-de-uso', 'portal/terms-of-use')->name('legal.terms');
foreach (['sectores' => 'sectors', 'como-investir' => 'procedures', 'legislacao' => 'legislation', 'documentos' => 'documents',
'apoio' => 'support', 'parcerias' => 'partnerships', 'simulador-fiscal' => 'simulator',
'formularios/investidor' => 'investor', 'formularios/empresa' => 'company'] as $path => $page) {
Route::get('/'.$path, [PortalServicesController::class, 'page'])->defaults('page', $page)->name('services.'.$page);
}
Route::get('/Simulador', [PortalServicesController::class, 'page'])->defaults('page', 'simulator')->name('services.simulator.alias');
Route::get('/documentos/{id}', [PortalServicesController::class, 'showDocument'])->whereNumber('id')->name('services.document');
Route::get('/documentos/{id}/view', [PortalServicesController::class, 'viewDocument'])->whereNumber('id')->name('services.document.view');
Route::get('/documentos/{id}/download', [PortalServicesController::class, 'download'])->whereNumber('id')->name('services.download');
Route::get('/explorar/{sectorSlug}', [LegacyContentController::class, 'landing'])->whereIn('sectorSlug', array_keys(config('legacy_content.groups', [])));
Route::get('/{legacySlug}', [LegacyContentController::class, 'article'])->whereIn('legacySlug', array_keys(config('legacy_content.articles', [])));
Route::post('/apoio', [PortalServicesController::class, 'submit'])->middleware('throttle:10,1')->name('services.submit');
Route::middleware(['auth', 'verified'])->group(function () {
Route::get('/gestao-conteudos', fn (\Illuminate\Http\Request $request) => Inertia::render('management/content-hub', app(\App\Services\ContentManagement::class)->view($request->user())))->name('content-management');
Route::get('/balcao-virtual', [PortalServicesController::class, 'page'])->defaults('page', 'desk')->name('services.desk');
Route::post('/parcerias', [PortalServicesController::class, 'partnership'])->middleware('throttle:10,1')->name('services.partnership');
});
Route::middleware(['auth', 'verified', \App\Http\Middleware\EnsureScopedEditorial::class])->group(function () {
Route::get('/management/portal-services/resources/{id}/article', [\App\Http\Controllers\EditorialArticleController::class, 'edit'])->whereNumber('id')->name('editorial.edit');
Route::put('/management/portal-services/resources/{id}/article', [\App\Http\Controllers\EditorialArticleController::class, 'save'])->whereNumber('id')->name('editorial.save');
Route::get('/management/portal-services/resources/{id}/article/preview', [\App\Http\Controllers\EditorialArticleController::class, 'preview'])->whereNumber('id')->name('editorial.preview');
Route::post('/management/portal-services/resources/{id}/article/preview', [\App\Http\Controllers\EditorialArticleController::class, 'previewContent'])->whereNumber('id')->name('editorial.preview-content');
Route::get('/management/editorial-installation', [\App\Http\Controllers\EditorialArticleController::class, 'installation'])->name('editorial.installation');
Route::get('/management/editorial-installation/mfa', [\App\Http\Controllers\EditorialArticleController::class, 'showMfa'])->name('editorial.mfa');
Route::post('/management/editorial-installation/mfa', [\App\Http\Controllers\EditorialArticleController::class, 'confirmMfa'])->middleware('throttle:5,1');
Route::post('/management/editorial-installation', [\App\Http\Controllers\EditorialArticleController::class, 'install'])->name('editorial.install');
Route::post('/management/portal-services/disclosure-authorization/apply', [PortalServicesController::class, 'applyDocumentDisclosureAuthorization'])->name('services.disclosure-authorization.apply');
Route::post('/management/portal-services/resources', [PortalServicesController::class, 'resource'])->name('services.resource');
Route::put('/management/portal-services/resources/{id}', [PortalServicesController::class, 'updateResource'])->whereNumber('id')->name('services.resource.update');
Route::post('/management/portal-services/{type}/{id}', [PortalServicesController::class, 'moderate'])->whereIn('type', ['resources', 'partnerships'])->whereNumber('id')->name('services.moderate');
});
Route::middleware(['auth', 'verified', \App\Http\Middleware\EnsureDocumentManagement::class])->group(function () {
Route::get('/management/portal-services', [PortalServicesController::class, 'manage'])->name('services.manage');
Route::get('/management/documents/{id}/download', [PortalServicesController::class, 'downloadForManager'])->whereUuid('id')->name('documents.manage.download');
Route::post('/management/portal-services/upload', [PortalServicesController::class, 'upload'])->middleware('throttle:10,1')->name('services.upload');
Route::post('/management/documents/{id}/malware/retry', [DocumentMalwareController::class, 'retry'])->whereUuid('id')->middleware('throttle:10,1')->name('documents.malware.retry');
});
Route::get('/artigos/{id}', [\App\Http\Controllers\EditorialArticleController::class, 'show'])->whereNumber('id')->name('editorial.show');
Route::get('/carteira', [InvestmentPortfolioController::class, 'index'])->name('portfolio.index');
Route::get('/carteira/{id}', [InvestmentPortfolioController::class, 'show'])->whereUuid('id')->name('portfolio.show');
Route::get('/oportunidades', [InvestmentDiscoveryController::class, 'index'])->name('portal.opportunities');
Route::get('/oportunidades/{slug}', [InvestmentDiscoveryController::class, 'detail'])->name('portal.opportunity');
Route::get('/negocios', [PublicBusinessOpportunityController::class, 'index'])->name('business-marketplace.index');
Route::get('/negocios/{slug}/manifestar-interesse', [PublicBusinessOpportunityController::class, 'interest'])->name('business-marketplace.interest');
Route::get('/negocios/{slug}', [PublicBusinessOpportunityController::class, 'show'])->name('business-marketplace.show');
Route::get('/sectores/mercado-financeiro/fintech', [PublicPortalController::class, 'sector'])->defaults('slug', 'mercado-financeiro/fintech')->name('portal.sector.fintech');
Route::get('/sectores/{slug}', [PublicPortalController::class, 'sector'])->name('portal.sector');
Route::get('/manifestar-interesse/{slug?}', [PublicPortalController::class, 'interest'])->name('portal.interest');
Route::get('/acesso-gestao', fn () => Inertia::render('management-access', [
'registrationEnabled' => Features::enabled(Features::registration()),
]))->name('management.access');
Route::middleware(['auth', 'verified'])->group(function () {
Route::get('/investidor', [InvestorWorkspaceController::class, 'index'])->name('investor.workspace');
Route::post('/investidor/guardar/{id}', [InvestorWorkspaceController::class, 'start'])->whereUuid('id')->name('investor.start');
Route::post('/investidor/{id}/interesse', [InvestorWorkspaceController::class, 'submit'])->whereUuid('id')->middleware('throttle:10,1')->name('investor.submit');
Route::get('dashboard', DashboardController::class)->name('dashboard');
});
require __DIR__.'/settings.php';
require __DIR__.'/investment.php';
require __DIR__.'/land-assistance.php';
Route::middleware(['auth', 'verified', 'can:manage-portal', AiEnabled::class])->group(function () {
Route::get('/management/ai', [AiController::class, 'index'])->name('ai.index');
Route::get('/management/ai/runs/{id}', [AiController::class, 'show'])->whereUuid('id')->name('ai.show');
foreach (['api/v1/ai', 'management/ai'] as $prefix) {
Route::post($prefix.'/controls/{capability}', [AiController::class, 'control']);
Route::prefix($prefix)->middleware('throttle:20,1')->group(function () {
Route::post('runs', [AiController::class, 'run']);
Route::get('runs/{id}', [AiController::class, 'show'])->whereUuid('id');
Route::post('runs/{id}/feedback', [AiController::class, 'feedback'])->whereUuid('id');
Route::post('runs/{id}/review', [AiController::class, 'review'])->whereUuid('id');
Route::post('sources', [AiController::class, 'source']);
Route::post('documents', [AiController::class, 'document']);
Route::post('sources/{id}/review', [AiController::class, 'reviewSource'])->whereUuid('id');
});
}
});
Route::get('/api/v1/investment/territory-options', [PublicGeographyController::class, 'options'])->middleware('throttle:api');
Route::get('/api/v1/investment/territory-geometries', [InvestmentTerritoryController::class, 'geometries'])->middleware('throttle:api');
// Installation must be reachable before the profile schema/feature is enabled.
Route::middleware(['auth', 'verified'])->group(function () {
Route::get('/management/profile-install', [PortalProfileInstallationController::class, 'preview']);
Route::post('/management/profile-install', [PortalProfileInstallationController::class, 'apply']);
Route::post('/management/profile-install/bootstrap', [PortalProfileInstallationController::class, 'bootstrap']);
Route::get('/management/profile-install/bootstrap/{id}', [PortalProfileInstallationController::class, 'bootstrapPreview'])->whereUuid('id');
Route::post('/management/profile-install/bootstrap/{id}/confirm', [PortalProfileInstallationController::class, 'confirmBootstrap'])->whereUuid('id');
Route::get('/management/opportunity-resources-install/organization-country', [OpportunityResourceController::class, 'organizationCountryPreview']);
Route::post('/management/opportunity-resources-install/organization-country', [OpportunityResourceController::class, 'organizationCountryApply']);
});
Route::middleware(['auth', 'verified', EnsurePortalProfileAdministration::class])->group(function () {
$profiles = PortalProfileController::class;
Route::get('/perfil/promotor', [$profiles, 'requests']);
Route::post('/perfil/promotor', [$profiles, 'requestProfile']);
Route::get('/perfil/promotor/{id}', [$profiles, 'requestStatus'])->whereUuid('id');
Route::get('/perfis/gestao', [$profiles, 'administration']);
Route::get('/perfis/auditoria', [$profiles, 'audit']);
Route::post('/perfis/pedidos/{id}/decisao', [$profiles, 'decide'])->whereUuid('id');
Route::get('/perfis/pedidos/{id}/documentos/{documentId}', [$profiles, 'requestDocument'])->whereUuid(['id', 'documentId']);
Route::post('/perfis/organizacao-operadora', [$profiles, 'registerOperatorOrganization']);
Route::post('/perfis/atribuicoes', [$profiles, 'grant']);
Route::post('/perfis/atribuicoes/{id}/revogar', [$profiles, 'revoke'])->whereUuid('id');
Route::post('/perfis/substituicoes', [$profiles, 'replacement']);
Route::post('/perfis/seguranca/{id}/aprovar', [$profiles, 'approveSecurity'])->whereUuid('id');
Route::post('/perfis/substituicoes/{id}/aplicar', [$profiles, 'replace'])->whereUuid('id');
Route::post('/perfis/elevacoes', [$profiles, 'elevation']);
});
Route::middleware(['auth', 'verified', EnsurePortalProfiles::class])->group(function () {
$profiles = PortalProfileController::class;
Route::get('/minhas-oportunidades', [$profiles, 'opportunities']);
Route::get('/minhas-oportunidades/lotes/agronegocio', [\App\Http\Controllers\CorridorAgribusinessController::class, 'show']);
Route::post('/minhas-oportunidades/lotes/agronegocio/cadastrar', [\App\Http\Controllers\CorridorAgribusinessController::class, 'register']);
Route::post('/minhas-oportunidades/lotes/agronegocio/previa', [\App\Http\Controllers\CorridorAgribusinessController::class, 'preview']);
Route::post('/minhas-oportunidades/lotes/agronegocio/divulgar', [\App\Http\Controllers\CorridorAgribusinessController::class, 'disclose']);
Route::get('/minhas-oportunidades/territory-options', [InvestmentTerritoryController::class, 'options']);
Route::get('/minhas-oportunidades/territory-geometries', [InvestmentTerritoryController::class, 'geometries']);
Route::get('/minhas-oportunidades/create', [$profiles, 'edit']);
Route::get('/minhas-oportunidades/{id}/edit', [$profiles, 'edit'])->whereNumber('id');
Route::get('/minhas-oportunidades/{id}/view', [$profiles, 'edit'])->whereNumber('id');
Route::get('/minhas-oportunidades/{id}/response', [OpportunityManagementController::class, 'canonicalResponse'])->whereNumber('id');
Route::post('/minhas-oportunidades/drafts', [OpportunityManagementController::class, 'save']);
Route::put('/minhas-oportunidades/{id}/draft', [OpportunityManagementController::class, 'save'])->whereNumber('id');
Route::get('/minhas-oportunidades/{id}/classification', [OpportunityClassificationController::class, 'index'])->whereNumber('id');
Route::post('/minhas-oportunidades/{id}/classification/review', [OpportunityClassificationController::class, 'review'])->whereNumber('id');
Route::post('/minhas-oportunidades/{id}/workflow', [$profiles, 'workflow'])->whereNumber('id');
Route::get('/minhas-oportunidades/{id}/divulgacao', [\App\Http\Controllers\OpportunityPromotionController::class, 'show'])->whereNumber('id');
Route::post('/minhas-oportunidades/{id}/divulgacao/previa', [\App\Http\Controllers\OpportunityPromotionController::class, 'preview'])->whereNumber('id');
Route::post('/minhas-oportunidades/{id}/divulgacao/confirmar', [\App\Http\Controllers\OpportunityPromotionController::class, 'confirm'])->whereNumber('id');
Route::post('/minhas-oportunidades/{id}/contacts', [$profiles, 'contact'])->whereNumber('id');
Route::get('/minhas-oportunidades/{id}/resources', [OpportunityResourceController::class, 'index'])->whereNumber('id');
Route::post('/minhas-oportunidades/{id}/library-support', [OpportunityResourceController::class, 'reuseLibrary'])->whereNumber('id');
Route::post('/minhas-oportunidades/{id}/resources/{kind}', [OpportunityResourceController::class, 'save'])->whereNumber('id');
Route::post('/minhas-oportunidades/{id}/resources/{kind}/{resourceId}', [OpportunityResourceController::class, 'save'])->whereNumber('id');
Route::post('/minhas-oportunidades/{id}/resources/{kind}/{resourceId}/lifecycle', [OpportunityResourceController::class, 'lifecycle'])->whereNumber('id');
Route::post('/minhas-oportunidades/{id}/resources/images/{resourceId}/prepare', [OpportunityResourceController::class, 'prepareImage'])->whereNumber('id');
Route::get('/minhas-oportunidades/{id}/resources/{kind}/{resourceId}/download', [OpportunityResourceController::class, 'download'])->whereNumber('id');
Route::get('/minhas-oportunidades/{id}/resources/images/{resourceId}/preview/{documentId}', [OpportunityResourceController::class, 'previewImage'])->whereNumber('id')->middleware('signed')->name('promoter.opportunity-image-preview');
});
Route::middleware(['auth', 'verified', \App\Http\Middleware\EnsureScopedPortalAdministration::class])->prefix('management')->name('management.')->group(function () {
Route::get('economic-references/lot-01', [EconomicReferenceController::class, 'preview']);
Route::post('economic-references/lot-01/{operation}', [EconomicReferenceController::class, 'apply'])->whereIn('operation', ['schema', 'import', 'publish', 'withdraw']);
Route::get('territory-geometry-import', [TerritoryGeometryImportController::class, 'preview']);
Route::post('territory-geometry-import', [TerritoryGeometryImportController::class, 'apply'])->middleware(RequireZoneMfa::class);
Route::post('territory-geometry-import/{batch}/reverse', [TerritoryGeometryImportController::class, 'reverse'])->whereUuid('batch')->middleware(RequireZoneMfa::class);
Route::get('opportunity-management-install', [OpportunityManagementController::class, 'installation']);
Route::post('opportunity-management-install', [OpportunityManagementController::class, 'applyInstallation']);
Route::get('opportunity-resources-install', [OpportunityResourceController::class, 'installation']);
Route::post('opportunity-resources-install', [OpportunityResourceController::class, 'applyInstallation']);
Route::get('opportunities/{id}/resources', [OpportunityResourceController::class, 'index'])->whereNumber('id');
Route::post('opportunities/{id}/resources/images/{resourceId}/prepare', [OpportunityResourceController::class, 'prepareImage'])->whereNumber('id');
Route::get('opportunities/{id}/resources/images/{resourceId}/preview/{documentId}', [OpportunityResourceController::class, 'previewImage'])->whereNumber('id')->middleware('signed')->name('opportunity-image-preview');
Route::post('opportunities/{id}/library-support', [OpportunityResourceController::class, 'reuseLibrary'])->whereNumber('id');
Route::post('opportunities/{id}/resources/{kind}', [OpportunityResourceController::class, 'save'])->whereNumber('id');
Route::post('opportunities/{id}/resources/{kind}/{resourceId}', [OpportunityResourceController::class, 'save'])->whereNumber('id');
Route::post('opportunities/{id}/resources/{kind}/{resourceId}/lifecycle', [OpportunityResourceController::class, 'lifecycle'])->whereNumber('id');
Route::get('opportunities/{id}/resources/{kind}/{resourceId}/download', [OpportunityResourceController::class, 'download'])->whereNumber('id');
Route::get('opportunities', [OpportunityManagementController::class, 'index']);
Route::get('opportunities/create', [OpportunityManagementController::class, 'edit']);
Route::get('opportunities/{id}/edit', [OpportunityManagementController::class, 'edit'])->whereNumber('id');
Route::get('opportunities/{id}/view', [OpportunityManagementController::class, 'edit'])->whereNumber('id');
Route::post('opportunities/drafts', [OpportunityManagementController::class, 'save']);
Route::put('opportunities/{id}/draft', [OpportunityManagementController::class, 'save'])->whereNumber('id');
Route::post('opportunities/{id}/lifecycle', [OpportunityManagementController::class, 'lifecycle'])->whereNumber('id');
Route::get('opportunities/{id}/coordinates', [InvestmentCoordinatesController::class, 'show'])->whereNumber('id');
Route::post('opportunities/{id}/coordinates', [InvestmentCoordinatesController::class, 'save'])->whereNumber('id');
Route::get('territory-options', [InvestmentTerritoryController::class, 'options'])->middleware('throttle:api');
Route::get('territory-geometries', [InvestmentTerritoryController::class, 'geometries'])->middleware('throttle:api');
Route::get('territory-subjects', [InvestmentTerritoryController::class, 'subjects'])->middleware('throttle:api');
Route::get('territory-associations', fn () => Inertia::render('management/territory-associations'));
Route::get('territories/{kind}/{id}', [InvestmentTerritoryController::class, 'show']);
Route::post('territories/{kind}/{id}', [InvestmentTerritoryController::class, 'save']);
$controller = PortalManagementController::class;
Route::prefix('education')->name('education.')->middleware(EducationEnabled::class)->group(function () {
Route::get('/', [EducationController::class, 'index'])->name('index');
Route::post('catalog/{kind}', [EducationController::class, 'catalog'])->whereIn('kind', ['skills', 'occupations', 'providers', 'courses'])->name('catalog');
Route::post('{kind}', [EducationController::class, 'store'])->whereIn('kind', ['demands', 'capacities'])->name('store');
Route::post('{kind}/{id}/review', [EducationController::class, 'review'])->whereIn('kind', ['demands', 'capacities'])->whereUuid('id')->name('review');
Route::get('demands/{id}/analysis', [EducationController::class, 'analysis'])->whereUuid('id')->name('analysis');
Route::post('demands/{id}/investment', [EducationInvestmentController::class, 'store'])->whereUuid('id')->name('investment');
});
Route::get('portfolio', [InvestmentPortfolioController::class, 'index'])->name('portfolio.index');
Route::get('relationship-repair', [InvestmentRelationshipRepairController::class, 'preview'])->name('relationship-repair.preview');
Route::get('opportunity-origin', [OpportunityOriginReviewController::class, 'index'])->name('opportunity-origin.index');
Route::post('opportunity-origin/preview', [OpportunityOriginReviewController::class, 'preview'])->name('opportunity-origin.preview');
Route::post('opportunity-origin/apply', [OpportunityOriginReviewController::class, 'apply'])->name('opportunity-origin.apply');
Route::post('relationship-repair', [InvestmentRelationshipRepairController::class, 'apply'])->name('relationship-repair.apply');
Route::get('portfolio/{id}', [InvestmentPortfolioController::class, 'show'])->whereUuid('id')->name('portfolio.show');
Route::put('portfolio/{dossier}', [InvestmentPortfolioController::class, 'save'])->name('portfolio.save');
Route::post('portfolio/{dossier}/publish', [InvestmentPortfolioController::class, 'publish'])->name('portfolio.publish');
Route::post('clusters/{cluster}/chain-links', [ClusterValueChainController::class, 'link'])->name('clusters.chain-links.store');
Route::delete('clusters/{cluster}/chain-links/{link}', [ClusterValueChainController::class, 'removeLink'])->name('clusters.chain-links.delete');
Route::post('clusters/{cluster}/gaps', [ClusterValueChainController::class, 'gap'])->name('clusters.gaps.store');
Route::put('clusters/{cluster}/gaps/{gap}', [ClusterValueChainController::class, 'gap'])->name('clusters.gaps.update');
Route::get('{structure}', [InvestmentStructureController::class, 'index'])->whereIn('structure', ['projects', 'clusters', 'corridors'])->name('structures.index');
Route::get('{structure}/create', [InvestmentStructureController::class, 'edit'])->whereIn('structure', ['projects', 'clusters', 'corridors'])->name('structures.create');
Route::get('{structure}/{id}/edit', [InvestmentStructureController::class, 'edit'])->whereIn('structure', ['projects', 'clusters', 'corridors'])->whereUuid('id')->name('structures.edit');
Route::post('{structure}', [InvestmentStructureController::class, 'save'])->whereIn('structure', ['projects', 'clusters', 'corridors'])->name('structures.store');
Route::put('{structure}/{id}', [InvestmentStructureController::class, 'save'])->whereIn('structure', ['projects', 'clusters', 'corridors'])->whereUuid('id')->name('structures.update');
Route::post('clusters/{cluster}/projects', [InvestmentStructureController::class, 'linkProject'])->name('clusters.projects');
Route::post('structure-relations/{kind}', [InvestmentStructureRelationController::class, 'store'])->whereIn('kind', ['cluster-project', 'corridor-project', 'corridor-cluster'])->name('structure-relations.store');
Route::post('structure-relations/{kind}/{id}/{action}', [InvestmentStructureRelationController::class, 'review'])->whereIn('kind', ['cluster-project', 'corridor-project', 'corridor-cluster'])->whereUuid('id')->whereIn('action', ['validate', 'revoke'])->name('structure-relations.review');
Route::post('clusters/{cluster}/chains', [InvestmentStructureController::class, 'saveChain'])->name('clusters.chains.store');
Route::put('clusters/{cluster}/chains/{chain}', [InvestmentStructureController::class, 'saveChain'])->name('clusters.chains.update');
Route::get('crm/investors', [CrmController::class, 'investors'])->name('crm.investors');
Route::get('crm/investors/{investor}', [CrmController::class, 'investor'])->name('crm.investor');
Route::patch('crm/investors/{investor}', [CrmController::class, 'saveInvestor'])->name('crm.investor-update');
Route::patch('crm/investors/{investor}/contacts/{contact}', [CrmController::class, 'saveContact'])->name('crm.contact-update');
Route::get('crm/leads', [CrmController::class, 'index'])->name('crm.leads');
Route::get('crm/convert/{interest}', [CrmController::class, 'prepare'])->name('crm.prepare');
Route::post('crm/convert/{interest}', [CrmController::class, 'convert'])->name('crm.convert');
Route::get('crm/leads/{lead}', [CrmController::class, 'show'])->name('crm.lead');
Route::patch('crm/leads/{lead}', [CrmController::class, 'update'])->name('crm.update');
Route::post('crm/leads/{lead}/tasks', [CrmController::class, 'task'])->name('crm.tasks');
Route::patch('crm/leads/{lead}/tasks/{task}', [CrmController::class, 'updateTask'])->name('crm.task-update');
Route::get('history', [$controller, 'history'])->name('history');
Route::get('interests/atribuicoes', [$controller, 'interestAssignments'])->name('interests.assignments');
Route::post('interests/{interest}/responsavel', [$controller, 'assignInterest'])->name('interests.assign');
Route::get('interests', [$controller, 'interests'])->name('interests');
Route::get('interests/{interest}', [$controller, 'interest'])->name('interest');
Route::patch('interests/{interest}', [$controller, 'review'])->name('review');
Route::patch('interests/{interest}/consent/contact', [$controller, 'withdrawContactConsent'])->name('consent.withdraw-contact');
Route::patch('interests/{interest}/consent/proponent', [$controller, 'withdrawProponentSharingConsent'])->name('consent.withdraw-proponent');
Route::get('{resource}', [$controller, 'catalog'])->whereIn('resource', ['sectors', 'opportunities'])->name('catalog');
Route::get('{resource}/create', [$controller, 'edit'])->whereIn('resource', ['sectors', 'opportunities'])->name('create');
Route::get('{resource}/{id}/edit', [$controller, 'edit'])->whereIn('resource', ['sectors', 'opportunities'])->whereNumber('id')->name('edit');
Route::post('{resource}', [$controller, 'save'])->whereIn('resource', ['sectors', 'opportunities'])->name('store');
Route::put('{resource}/{id}', [$controller, 'save'])->whereIn('resource', ['sectors', 'opportunities'])->whereNumber('id')->name('update');
});
Route::get('/porque-investir', fn () => Inertia::render('portal/why-invest'))->name('portal.why-invest');
require __DIR__.'/investor-path.php';
// Serialize management requests for the same session so background dropdown/coordinate
// reads cannot overwrite validation feedback from a concurrent form submission.
foreach (Route::getRoutes()->getRoutes() as $managementRoute) {
if (str_starts_with($managementRoute->uri(), 'management/')) {
$managementRoute->block(10, 10);
}
}
// Existing installation permission and session MFA; no schema installation.
Route::middleware(['auth', 'verified'])->group(function () {
Route::get('/management/sector-reconciliation', [\App\Http\Controllers\SectorReconciliationController::class, 'preview']);
Route::post('/management/sector-reconciliation', [\App\Http\Controllers\SectorReconciliationController::class, 'apply']);
});
// Tempo, 19/10/2026: simple participation uses the existing account, without MFA enrollment.
Route::get('/participar/entrar', function (\Illuminate\Http\Request $request) {
$return = $request->query('return', '/manifestar-interesse');
abort_unless(is_string($return) && str_starts_with($return, '/') && !str_starts_with($return, '//') && !str_contains($return, '\\'), 422);
$request->session()->put('url.intended', $return);
return redirect($request->user() ? $return : '/register');
});