380 lines
35 KiB
PHP
380 lines
35 KiB
PHP
<?php
|
|
|
|
require __DIR__.'/procurement.php';
|
|
require __DIR__.'/funding.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\ClusterCompetitivenessController;
|
|
use App\Http\Controllers\ClusterValueChainController;
|
|
use App\Http\Controllers\CorridorAgribusinessController;
|
|
use App\Http\Controllers\CrmController;
|
|
use App\Http\Controllers\DashboardController;
|
|
use App\Http\Controllers\DocumentMalwareController;
|
|
use App\Http\Controllers\EconomicReferenceController;
|
|
use App\Http\Controllers\EditorialArticleController;
|
|
use App\Http\Controllers\EducationController;
|
|
use App\Http\Controllers\EducationDeclarationDraftController;
|
|
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\OpportunityCurationController;
|
|
use App\Http\Controllers\OpportunityManagementController;
|
|
use App\Http\Controllers\OpportunityOriginReviewController;
|
|
use App\Http\Controllers\OpportunityPromotionController;
|
|
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\ProactiveSupplyController;
|
|
use App\Http\Controllers\ProductExperimentController;
|
|
use App\Http\Controllers\ProductUsageMetricsController;
|
|
use App\Http\Controllers\PublicBusinessOpportunityController;
|
|
use App\Http\Controllers\PublicGeographyController;
|
|
use App\Http\Controllers\PublicPortalController;
|
|
use App\Http\Controllers\PublicSitemapController;
|
|
use App\Http\Controllers\SectorReconciliationController;
|
|
use App\Http\Controllers\TerritoryGeometryImportController;
|
|
use App\Http\Middleware\AiEnabled;
|
|
use App\Http\Middleware\EducationEnabled;
|
|
use App\Http\Middleware\EnsureDocumentManagement;
|
|
use App\Http\Middleware\EnsurePortalProfileAdministration;
|
|
use App\Http\Middleware\EnsurePortalProfiles;
|
|
use App\Http\Middleware\EnsureScopedEditorial;
|
|
use App\Http\Middleware\EnsureScopedPortalAdministration;
|
|
use App\Http\Middleware\PrivateInvestmentResponse;
|
|
use App\Http\Middleware\RequireZoneMfa;
|
|
use App\Http\Middleware\VerifiedOrSimpleParticipation;
|
|
use App\Services\ContentManagement;
|
|
use Illuminate\Http\Request;
|
|
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::get('/sitemap.xml', [PublicSitemapController::class, 'index']);
|
|
Route::get('/sitemap/pages.xml', [PublicSitemapController::class, 'pages']);
|
|
Route::get('/sitemap/opportunities/{page}.xml', [PublicSitemapController::class, 'opportunities'])->whereNumber('page');
|
|
Route::inertia('/contextos-de-investimento', 'portal/investment-contexts')->name('portal.investment-contexts');
|
|
Route::get('/formularios/fiscais', function (Request $request) {
|
|
$input = $request->validate(['imposto' => ['nullable', 'in:iva,irpc']]);
|
|
|
|
return Inertia::render('portal/fiscal-forms', ['initialTax' => $input['imposto'] ?? 'iva']);
|
|
})->name('portal.fiscal-forms');
|
|
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');
|
|
foreach (['simulador' => 'services.simulator', 'contactos' => 'services.support'] as $legacyPath => $destination) {
|
|
Route::get('/'.$legacyPath, fn (Request $request) => redirect()->to(route($destination, $request->query(), false), 301));
|
|
}
|
|
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 (Request $request) => Inertia::render('management/content-hub', app(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', EnsureScopedEditorial::class])->group(function () {
|
|
Route::get('/management/portal-services/resources/{id}/article', [EditorialArticleController::class, 'edit'])->whereNumber('id')->name('editorial.edit');
|
|
Route::put('/management/portal-services/resources/{id}/article', [EditorialArticleController::class, 'save'])->whereNumber('id')->name('editorial.save');
|
|
Route::get('/management/portal-services/resources/{id}/article/preview', [EditorialArticleController::class, 'preview'])->whereNumber('id')->name('editorial.preview');
|
|
Route::post('/management/portal-services/resources/{id}/article/preview', [EditorialArticleController::class, 'previewContent'])->whereNumber('id')->name('editorial.preview-content');
|
|
Route::get('/management/editorial-installation', [EditorialArticleController::class, 'installation'])->name('editorial.installation');
|
|
Route::get('/management/editorial-installation/mfa', [EditorialArticleController::class, 'showMfa'])->name('editorial.mfa');
|
|
Route::post('/management/editorial-installation/mfa', [EditorialArticleController::class, 'confirmMfa'])->middleware('throttle:5,1');
|
|
Route::post('/management/editorial-installation', [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', 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}', [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('/carteira/{id}/interesse', [InvestmentPortfolioController::class, 'resumeInterest'])->whereUuid('id')->middleware(['auth', \App\Http\Middleware\VerifiedOrSimpleParticipation::class])->name('portfolio.interest');
|
|
Route::get('/pesquisa', \App\Http\Controllers\GlobalSearchController::class)->name('portal.search');
|
|
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::get('/management/product-usage', [ProductUsageMetricsController::class, 'index'])->middleware(['auth', 'verified', 'can:manage-portal', PrivateInvestmentResponse::class, 'throttle:30,1']);
|
|
Route::middleware(['auth', 'verified', 'can:manage-portal', PrivateInvestmentResponse::class, 'throttle:30,1'])->prefix('management/product-experiments')->group(function () {
|
|
Route::get('/', [ProductExperimentController::class, 'index']);
|
|
Route::get('/new', [ProductExperimentController::class, 'create']);
|
|
Route::post('/', [ProductExperimentController::class, 'store']);
|
|
Route::get('/{id}', [ProductExperimentController::class, 'show'])->whereUuid('id');
|
|
Route::post('/{id}/revisions', [ProductExperimentController::class, 'revise'])->whereUuid('id');
|
|
});
|
|
|
|
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::get('/management/profile-install/technical-support',[PortalProfileInstallationController::class,'supportPreview']);
|
|
Route::post('/management/profile-install/technical-support',[PortalProfileInstallationController::class,'applySupport']);
|
|
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 () {
|
|
Route::get('/suporte-tecnico/incidentes',[\App\Http\Controllers\TechnicalSupportController::class,'index']);
|
|
Route::get('/suporte-tecnico/incidentes/{reference}',[\App\Http\Controllers\TechnicalSupportController::class,'show'])->whereUuid('reference');
|
|
Route::post('/suporte-tecnico/incidentes/{reference}',[\App\Http\Controllers\TechnicalSupportController::class,'decide'])->whereUuid('reference');
|
|
Route::post('/suporte-tecnico/incidentes/{reference}/consultado',[\App\Http\Controllers\TechnicalSupportController::class,'consulted'])->whereUuid('reference');
|
|
$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 () {
|
|
Route::get('/minhas-oportunidades/oferta-interna', [ProactiveSupplyController::class, 'index'])->middleware('throttle:60,1');
|
|
Route::get('/minhas-oportunidades/oferta-interna/revisao', [ProactiveSupplyController::class, 'review'])->middleware(['throttle:60,1', PrivateInvestmentResponse::class]);
|
|
$profiles = PortalProfileController::class;
|
|
Route::get('/minhas-oportunidades', [$profiles, 'opportunities']);
|
|
Route::get('/minhas-oportunidades/lotes/agronegocio', [CorridorAgribusinessController::class, 'show']);
|
|
Route::post('/minhas-oportunidades/lotes/agronegocio/cadastrar', [CorridorAgribusinessController::class, 'register']);
|
|
Route::post('/minhas-oportunidades/lotes/agronegocio/previa', [CorridorAgribusinessController::class, 'preview']);
|
|
Route::post('/minhas-oportunidades/lotes/agronegocio/divulgar', [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::get('/minhas-oportunidades/{id}/destaque', [OpportunityCurationController::class, 'show'])->whereNumber('id')->middleware(PrivateInvestmentResponse::class);
|
|
Route::post('/minhas-oportunidades/{id}/destaque/previa', [OpportunityCurationController::class, 'preview'])->whereNumber('id')->middleware(PrivateInvestmentResponse::class);
|
|
Route::post('/minhas-oportunidades/{id}/destaque/confirmar', [OpportunityCurationController::class, 'confirm'])->whereNumber('id')->middleware(PrivateInvestmentResponse::class);
|
|
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', [OpportunityPromotionController::class, 'show'])->whereNumber('id');
|
|
Route::post('/minhas-oportunidades/{id}/divulgacao/previa', [OpportunityPromotionController::class, 'preview'])->whereNumber('id');
|
|
Route::post('/minhas-oportunidades/{id}/divulgacao/confirmar', [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', 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::get('opportunities/{id}/destaque', [OpportunityCurationController::class, 'show'])->whereNumber('id')->middleware(PrivateInvestmentResponse::class);
|
|
Route::post('opportunities/{id}/destaque/previa', [OpportunityCurationController::class, 'preview'])->whereNumber('id')->middleware(PrivateInvestmentResponse::class);
|
|
Route::post('opportunities/{id}/destaque/confirmar', [OpportunityCurationController::class, 'confirm'])->whereNumber('id')->middleware(PrivateInvestmentResponse::class);
|
|
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('drafts/{kind}', [EducationDeclarationDraftController::class, 'index'])->whereIn('kind', ['demands', 'capacities']);
|
|
Route::post('drafts/{kind}', [EducationDeclarationDraftController::class, 'save'])->whereIn('kind', ['demands', 'capacities']);
|
|
Route::get('drafts/{kind}/{id}', [EducationDeclarationDraftController::class, 'show'])->whereIn('kind', ['demands', 'capacities'])->whereUuid('id');
|
|
Route::put('drafts/{kind}/{id}', [EducationDeclarationDraftController::class, 'save'])->whereIn('kind', ['demands', 'capacities'])->whereUuid('id');
|
|
Route::post('drafts/{kind}/{id}/submit', [EducationDeclarationDraftController::class, 'submit'])->whereIn('kind', ['demands', 'capacities'])->whereUuid('id');
|
|
Route::get('/', [EducationController::class, 'index'])->name('index');
|
|
Route::get('{kind}/{id}', [EducationController::class, 'declaration'])->whereIn('kind',['demands','capacities'])->whereUuid('id')->name('declaration');
|
|
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::match(['GET', 'POST'], '{kind}/{id}/review-preparation', [EducationController::class, 'reviewPreparation'])->whereIn('kind', ['demands','capacities'])->whereUuid('id');
|
|
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::get('clusters/{cluster}/competitiveness', [ClusterCompetitivenessController::class, 'show'])->name('clusters.competitiveness.show');
|
|
Route::post('clusters/{cluster}/competitiveness/{action}', [ClusterCompetitivenessController::class, 'change'])->whereIn('action', ['saved', 'approved', 'withdrawn', 'restored'])->name('clusters.competitiveness.change');
|
|
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::post('crm/leads/{lead}/task-preparation', [CrmController::class, 'taskPreparation'])->name('crm.task-preparation');
|
|
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', [SectorReconciliationController::class, 'preview']);
|
|
Route::post('/management/sector-reconciliation', [SectorReconciliationController::class, 'apply']);
|
|
});
|
|
|
|
// Tempo, 19/10/2026: simple participation uses the existing account, without MFA enrollment.
|
|
Route::get('/participar/entrar', function (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');
|
|
});
|