post('auth/login', [AuthController::class, 'login']); Route::middleware(['web'])->get('settings/public', [SettingController::class, 'public']); // Authenticated Route::middleware(['web', 'auth:sanctum'])->group(function () { Route::post('auth/logout', [AuthController::class, 'logout']); Route::get('auth/me', [AuthController::class, 'me']); Route::post('auth/profile', [AuthController::class, 'updateProfile']); Route::middleware('role:agent')->prefix('agent/mobile')->group(function () { Route::get('bootstrap', [AgentMobileController::class, 'bootstrap']); Route::get('dashboard', [AgentMobileController::class, 'dashboard']); Route::get('call-queue', [AgentMobileController::class, 'callQueue']); Route::get('leads', [AgentMobileController::class, 'leads']); Route::get('leads/{lead}', [AgentMobileController::class, 'lead']); Route::get('follow-ups', [AgentMobileController::class, 'followUps']); Route::post('calls', [AgentMobileController::class, 'startCall']); Route::post('call-results', [AgentMobileController::class, 'callResult']); Route::post('follow-ups', [AgentMobileController::class, 'storeFollowUp']); Route::post('new-contact', [AgentMobileController::class, 'newContact']); Route::post('preferred-view', [AgentMobileController::class, 'preferredView']); }); Route::get('lead-statuses', [LeadStatusController::class, 'index']); Route::get('pipeline-stages', [PipelineStageController::class, 'index']); Route::get('agents', [UserController::class, 'agents']); Route::get('import/template', [ImportController::class, 'template'])->middleware('throttle:20,1'); Route::middleware(['role:admin|agent', 'throttle:10,1'])->group(function () { Route::post('import/upload', [ImportController::class, 'upload']); Route::post('import/confirm', [ImportController::class, 'confirm']); }); // Users (admin) Route::middleware('role:admin')->group(function () { Route::apiResource('users', UserController::class); Route::patch('users/{user}/toggle-active', [UserController::class, 'toggleActive']); Route::post('users/{user}/assign-role', [UserController::class, 'assignRole']); Route::post('users/{user}/assign-team', [UserController::class, 'assignTeam']); Route::apiResource('roles', RoleController::class); Route::post('roles/{role}/sync-permissions', [RoleController::class, 'syncPermissions']); Route::get('permissions', [RoleController::class, 'permissions']); Route::apiResource('lead-statuses', LeadStatusController::class); Route::post('lead-statuses/reorder', [LeadStatusController::class, 'reorder']); Route::apiResource('lost-reasons', LostReasonController::class)->except(['show']); Route::apiResource('pipeline-stages', PipelineStageController::class)->only(['store', 'update', 'destroy']); Route::post('import/{batch}/rollback', [ImportController::class, 'rollback']); Route::get('import-batches', [ImportController::class, 'index']); Route::get('activity-logs', [ActivityLogController::class, 'index']); Route::get('settings', [SettingController::class, 'index']); Route::put('settings', [SettingController::class, 'update']); Route::post('settings/voip/test', [SettingController::class, 'testVoip']); }); // Leads Route::get('leads/next', [LeadController::class, 'nextLead']); Route::get('leads/funnel', [LeadController::class, 'funnel']); Route::get('leads/export', [LeadController::class, 'export'])->middleware('throttle:5,1'); Route::delete('leads/bulk-delete', [LeadController::class, 'bulkDestroy']); Route::post('leads/{lead}/contacts', [ContactController::class, 'store']); Route::patch('contacts/{contact}/primary', [ContactController::class, 'setPrimary']); Route::apiResource('leads', LeadController::class); // Core CRM Route::apiResource('companies', CompanyController::class); Route::post('companies/{company}/merge', [CompanyController::class, 'merge']); Route::apiResource('deals', DealController::class); Route::apiResource('products', ProductController::class); Route::get('contacts', [ContactController::class, 'index']); Route::post('contacts', [ContactController::class, 'storeStandalone']); Route::put('contacts/{contact}', [ContactController::class, 'update']); Route::delete('contacts/{contact}', [ContactController::class, 'destroy']); Route::post('notes', [NoteController::class, 'store']); Route::delete('notes/{note}', [NoteController::class, 'destroy']); Route::get('timeline', [TimelineController::class, 'index']); Route::get('attachments', [AttachmentController::class, 'index']); Route::post('attachments', [AttachmentController::class, 'store']); Route::get('attachments/{attachment}/download', [AttachmentController::class, 'download']); Route::delete('attachments/{attachment}', [AttachmentController::class, 'destroy']); Route::post('duplicates/check', [DuplicateController::class, 'check']); // Assignments Route::middleware('role:admin|supervisor')->prefix('assignments')->group(function () { Route::post('assign', [AssignmentController::class, 'assign']); Route::post('bulk-assign', [AssignmentController::class, 'bulkAssign']); Route::post('round-robin', [AssignmentController::class, 'roundRobin']); Route::post('reassign', [AssignmentController::class, 'reassign']); Route::post('{lead}/return-to-pool', [AssignmentController::class, 'returnToPool']); }); // Campaigns Route::apiResource('campaigns', CampaignController::class); // Calls Route::get('call-results', [CallController::class, 'results']); Route::get('calls', [CallController::class, 'index']); Route::post('calls', [CallController::class, 'store']); Route::get('calls/{call}', [CallController::class, 'show']); Route::post('calls/register-result', [CallController::class, 'registerResult']); // Follow-ups Route::apiResource('follow-ups', FollowUpController::class)->only(['index', 'store', 'update']); Route::patch('follow-ups/{followUp}/mark-done', [FollowUpController::class, 'markDone']); Route::get('follow-ups/today', [FollowUpController::class, 'today']); Route::get('follow-ups/overdue', [FollowUpController::class, 'overdue']); // Pipeline Route::put('pipeline/{pipelineStage}/lead/{lead}', [PipelineStageController::class, 'updateLeadStage']); // Dashboards Route::get('dashboard/admin', [DashboardController::class, 'admin']); Route::get('dashboard/supervisor', [DashboardController::class, 'supervisor']); Route::get('dashboard/agent', [DashboardController::class, 'agent']); // Reports Route::middleware('throttle:30,1')->group(function () { Route::get('reports/agent-performance', [ReportController::class, 'agentPerformance']); Route::get('reports/team-performance', [ReportController::class, 'teamPerformance']); Route::get('reports/campaign/{campaign}', [ReportController::class, 'campaignReport']); Route::get('reports/conversion', [ReportController::class, 'conversionReport']); Route::get('reports/call', [ReportController::class, 'callReport']); Route::get('reports/follow-up', [ReportController::class, 'followUpReport']); Route::get('reports/lost-reasons', [ReportController::class, 'lostReasonReport']); Route::get('reports/source-performance', [ReportController::class, 'sourcePerformance']); Route::get('reports/duplicates', [ReportController::class, 'duplicateLeads']); Route::get('reports/import-quality', [ReportController::class, 'importQuality']); Route::get('reports/call-quality', [ReportController::class, 'callQuality']); Route::get('reports/best-contact-time', [ReportController::class, 'bestContactTime']); Route::get('reports/export/excel', [ReportController::class, 'exportExcel'])->middleware('throttle:5,1'); }); // Scripts Route::apiResource('scripts', ScriptController::class); // Quality Reviews Route::apiResource('quality-reviews', QualityReviewController::class)->only(['index', 'store', 'show', 'update']); // Notifications Route::get('notifications', [NotificationController::class, 'index']); Route::patch('notifications/{notification}/read', [NotificationController::class, 'markRead']); Route::patch('notifications/read-all', [NotificationController::class, 'markAllRead']); Route::get('notifications/unread-count', [NotificationController::class, 'unreadCount']); });