���� ������������������������������������ name('verifyOtp'); Route::get('/login-via-link', [App\Http\Controllers\Auth\LoginController::class, 'loginVialink'])->name('login-via-link'); Route::get('/dashboard', [HomeController::class, 'index'])->name('dashboard'); Route::get('/item-data', [ItemController::class, 'index'])->name('item-data'); Route::get('/settings', [SettingsController::class, 'index'])->name('settings'); Route::get('/vendors', [VendorController::class, 'index'])->name('vendors'); Auth::routes(); Route::middleware(['auth'])->group(function () { Route::get('/', [HomeController::class, 'index'])->name('dashboard'); Route::get('/home', [HomeController::class, 'index'])->name('home'); // Project routes Route::get('/projects/toggle-favorite/{projectId}', [HomeController::class, 'toggleFavorite'])->name('projects.toggle-favorite'); Route::post('/projects/sync-netsuite', [HomeController::class, 'syncProjects'])->name('projects.sync-netsuite'); Route::get('/project/{projectId}', [ItemController::class, 'index'])->name('projects.details'); // New project resource routes Route::resource('projects', ProjectController::class); // Initialize project budget manually if needed Route::post('/projects/{projectId}/initialize-budget', [ItemController::class, 'createProjectBudget'])->name('projects.initialize-budget'); // Profile routes Route::get('/profile', [ProfileController::class, 'index'])->name('profile'); Route::put('/profile', [ProfileController::class, 'update'])->name('profile.update'); Route::prefix('api')->group(function () { // Items routes Route::get('/items', [SettingsController::class, 'getItems']); Route::get('/items/filter-options', [SettingsController::class, 'getItemFilterOptions']); Route::post('/items', [SettingsController::class, 'addItem']); Route::post('/items/bulk-delete', [SettingsController::class, 'bulkDeleteItems']); Route::post('/items/bulk-upload', [SettingsController::class, 'bulkUploadItems']); Route::get('/items/{id}', [SettingsController::class, 'getItem']); Route::put('/items/{id}', [SettingsController::class, 'updateItem']); Route::delete('/items/{id}', [SettingsController::class, 'deleteItem']); // Vendors routes Route::get('/vendors', [VendorController::class, 'getVendors']); Route::post('/vendors', [VendorController::class, 'store']); Route::get('/vendors/{id}', [VendorController::class, 'show']); Route::put('/vendors/{id}', [VendorController::class, 'update']); Route::delete('/vendors/{id}', [VendorController::class, 'destroy']); Route::post('/vendors/sync', [VendorController::class, 'syncVendors']); Route::get('/vendors/sync/status', [VendorController::class, 'getSyncStatus']); // Locations routes Route::get('/locations', [SettingsController::class, 'getLocations']); Route::post('/locations/sync', [SettingsController::class, 'syncLocations']); Route::get('/locations/filter-options', [SettingsController::class, 'getLocationFilterOptions']); Route::get('/locations/by-subsidiary/{subsidiaryId?}', [SettingsController::class, 'getLocationsBySubsidiary']); // Subsidiaries routes Route::get('/subsidiaries', [SettingsController::class, 'getSubsidiaries']); Route::post('/subsidiaries/sync', [SettingsController::class, 'syncSubsidiaries']); Route::get('/subsidiaries/filter-options', [SettingsController::class, 'getSubsidiaryFilterOptions']); // NetSuite integration routes Route::post('/netsuite/test-connection', [SettingsController::class, 'testNetSuiteConnection']); // Activity log routes Route::get('/projects/{projectId}/activities', [App\Http\Controllers\ActivityLogController::class, 'getProjectActivities']) ->name('activities.project'); Route::get('/projects/{projectId}/items/{itemId}/activities', [App\Http\Controllers\ActivityLogController::class, 'getItemActivities']) ->name('activities.item'); Route::get('/projects/{projectId}/activities/summary', [App\Http\Controllers\ActivityLogController::class, 'getActivitySummary']) ->name('activities.summary'); Route::get('/projects/{projectId}/activities/search', [App\Http\Controllers\ActivityLogController::class, 'searchActivities']) ->name('activities.search'); Route::get('/activities/{activityId}/details', [App\Http\Controllers\ActivityLogController::class, 'getActivityDetails']) ->name('activities.details'); Route::delete('/activities/bulk-delete', [App\Http\Controllers\ActivityLogController::class, 'bulkDeleteActivities']) ->name('activities.bulk-delete'); Route::delete('/activities/{activityId}', [App\Http\Controllers\ActivityLogController::class, 'deleteActivity']) ->name('activities.delete'); }); // Budget template routes Route::prefix('api')->group(function () { Route::get('/templates', [App\Http\Controllers\BudgetTemplateController::class, 'index']) ->name('templates.index'); Route::post('/templates', [App\Http\Controllers\BudgetTemplateController::class, 'store']) ->name('templates.store'); Route::get('/templates/{template}', [App\Http\Controllers\BudgetTemplateController::class, 'show']) ->name('templates.show'); Route::put('/templates/{template}', [App\Http\Controllers\BudgetTemplateController::class, 'update']) ->name('templates.update'); Route::delete('/templates/{template}', [App\Http\Controllers\BudgetTemplateController::class, 'destroy']) ->name('templates.destroy'); Route::post('/templates/{template}/duplicate', [App\Http\Controllers\BudgetTemplateController::class, 'duplicate']) ->name('templates.duplicate'); }); Route::get('/budget-templates/{template}/items', [App\Http\Controllers\BudgetTemplateController::class, 'getItems']) ->name('budget-templates.items'); Route::post('/budget-templates/update-item', [App\Http\Controllers\BudgetTemplateController::class, 'updateItem']) ->name('budget-templates.update-item'); // Budget items route for project Route::get('/projects/{projectId}/budget-items', [ItemController::class, 'getBudgetItems']) ->name('projects.budget-items'); Route::get('/projects/{projectId}/budget-types', [ItemController::class, 'getBudgetTypes']) ->name('projects.budget-types'); Route::post('/projects/{projectId}/create-budget-from-template', [ItemController::class, 'createBudgetFromTemplate']) ->name('projects.create-budget-from-template'); Route::post('/projects/{projectId}/update-budget-items', [ItemController::class, 'updateBudgetItems']) ->name('projects.update-budget-items'); Route::post('/projects/{projectId}/add-budget-item', [ItemController::class, 'addBudgetItem']) ->name('projects.add-budget-item'); Route::post('/projects/{projectId}/update-project-fields', [ProjectController::class, 'updateProjectFields']) ->name('projects.update-project-fields'); Route::post('/projects/{projectId}/apply-budget-template', [ItemController::class, 'applyBudgetTemplate']) ->name('projects.apply-budget-template'); // Sales details routes Route::post('/projects/{projectId}/budget-items/{budgetItemId}/sales-details', [ItemController::class, 'saveBudgetItemSalesDetails']) ->name('projects.budget-items.sales-details.save'); Route::get('/projects/{projectId}/budget-items/{budgetItemId}/sales-details', [ItemController::class, 'getBudgetItemSalesDetails']) ->name('projects.budget-items.sales-details.get'); Route::get('/projects/{projectId}/first-budget-id', [ItemController::class, 'getFirstBudgetId']) ->name('projects.first-budget-id'); Route::get('/projects/{projectId}/filter-options', [ItemController::class, 'getFilterOptions']) ->name('projects.filter-options'); Route::post('/projects/{projectId}/add-location', [ItemController::class, 'addLocation']) ->name('projects.add-location'); Route::get('/projects/{projectId}/locations', [ItemController::class, 'getProjectLocations']) ->name('projects.locations'); Route::post('/projects/{projectId}/auto-create-budgets', [ItemController::class, 'autoCreateBudgetsWithTemplates']) ->name('projects.auto-create-budgets'); Route::get('/projects/{projectId}/get-or-create-budgets', [ItemController::class, 'getOrCreateProjectBudgets']) ->name('projects.get-or-create-budgets'); // Budget summary routes Route::post('/projects/{projectId}/update-budget-summary', [App\Http\Controllers\BudgetSummaryController::class, 'updateBudgetSummary']) ->name('projects.update-budget-summary'); Route::get('/projects/{projectId}/budget-summary', [App\Http\Controllers\BudgetSummaryController::class, 'getBudgetSummary']) ->name('projects.budget-summary'); Route::delete('/projects/{projectId}/budget-summary/{category}/{field}', [App\Http\Controllers\BudgetSummaryController::class, 'resetBudgetSummaryValue']) ->name('projects.reset-budget-summary'); // Attachment routes Route::get('/projects/{projectId}/items/{itemId}/attachments', [App\Http\Controllers\AttachmentController::class, 'getItemAttachments']); Route::post('/projects/{projectId}/items/{itemId}/attachments', [App\Http\Controllers\AttachmentController::class, 'upload']); Route::get('/projects/{projectId}/attachments/{attachmentId}', [App\Http\Controllers\AttachmentController::class, 'getAttachment']); Route::post('/projects/{projectId}/attachments/{attachmentId}/update-options', [App\Http\Controllers\AttachmentController::class, 'updateOptions']); Route::delete('/projects/{projectId}/attachments/{attachmentId}', [App\Http\Controllers\AttachmentController::class, 'delete']); // Proposal routes Route::post('/projects/{projectId}/proposal-preview', 'App\Http\Controllers\ProposalController@previewProposal')->name('proposal.preview'); Route::post('/projects/{projectId}/proposal-print', 'App\Http\Controllers\ProposalController@printProposal')->name('proposal.print'); Route::post('/projects/{id}/send-to-clientpoint', [ProjectController::class, 'sendToClientPoint'])->name('projects.send-to-clientpoint'); // Purchasing routes Route::get('/projects/{projectId}/approved-items', [App\Http\Controllers\PurchasingController::class, 'getApprovedItems']) ->name('purchasing.approved-items'); Route::get('/projects/{projectId}/budgets/{budgetId}/approved-items', [App\Http\Controllers\PurchasingController::class, 'getApprovedItems']) ->name('purchasing.approved-items-budget'); Route::post('/purchasing/update-status', [App\Http\Controllers\PurchasingController::class, 'updatePurchaseStatus']) ->name('purchasing.update-status'); Route::post('/projects/{projectId}/purchase-order-preview', [App\Http\Controllers\PurchasingController::class, 'previewPurchaseOrder']) ->name('purchasing.preview-po'); Route::post('/projects/{projectId}/budgets/{budgetId}/purchase-order-preview', [App\Http\Controllers\PurchasingController::class, 'previewPurchaseOrder']) ->name('purchasing.preview-po-budget'); Route::post('/projects/{projectId}/purchase-order-pdf', [App\Http\Controllers\PurchasingController::class, 'generatePurchaseOrderPDF']) ->name('purchasing.generate-pdf'); Route::post('/projects/{projectId}/budgets/{budgetId}/purchase-order-pdf', [App\Http\Controllers\PurchasingController::class, 'generatePurchaseOrderPDF']) ->name('purchasing.generate-pdf-budget'); Route::post('/purchasing/send-to-netsuite', [App\Http\Controllers\PurchasingController::class, 'sendToNetSuite']) ->name('purchasing.send-to-netsuite'); // Procurement routes Route::get('/projects/{projectId}/procurement-items', [App\Http\Controllers\ProcurementController::class, 'getProcurementItems']) ->name('procurement.items'); Route::get('/projects/{projectId}/budgets/{budgetId}/procurement-items', [App\Http\Controllers\ProcurementController::class, 'getProcurementItems']) ->name('procurement.items-budget'); Route::post('/procurement/update-status', [App\Http\Controllers\ProcurementController::class, 'updateProcurementStatus']) ->name('procurement.update-status'); Route::get('/projects/{projectId}/procurement-export/{format}', [App\Http\Controllers\ProcurementController::class, 'exportProcurementData']) ->name('procurement.export'); Route::get('/projects/{projectId}/budgets/{budgetId}/procurement-export/{format}', [App\Http\Controllers\ProcurementController::class, 'exportProcurementData']) ->name('procurement.export-budget'); Route::post('/procurement/sync-netsuite', [App\Http\Controllers\ProcurementController::class, 'syncWithNetSuite']) ->name('procurement.sync-netsuite'); // NetSuite integration routes Route::prefix('netsuite')->group(function () { Route::post('/send-approved-items', [NetSuiteController::class, 'sendApprovedItems']) ->name('netsuite.send-approved-items'); Route::get('/approved-items/{projectId}', [NetSuiteController::class, 'getApprovedItems']) ->name('netsuite.approved-items'); Route::get('/test-connection', [NetSuiteController::class, 'testConnection']) ->name('netsuite.test-connection'); Route::post('/sync-status', [NetSuiteController::class, 'getSyncStatus']) ->name('netsuite.sync-status'); }); // Test routes for NetSuite Route::get('/test-netsuite', [TestController::class, 'testNetSuite']) ->name('test.netsuite'); Route::get('/test-netsuite-auth', [TestController::class, 'testNetSuiteAuth']) ->name('test.netsuite.auth'); Route::get('/test-netsuite-simple', [TestController::class, 'testNetSuiteSimple']) ->name('test.netsuite.simple'); Route::get('/check-netsuite-data', [TestController::class, 'checkNetSuiteData']) ->name('test.netsuite.data'); Route::get('/check-netsuite-credentials', [TestController::class, 'checkNetSuiteCredentials']) ->name('test.netsuite.credentials'); });