group(function () { Route::get('register/contractor', [ContractorOnboardingController::class, 'showRegistrationForm']) ->name('contractors.register'); Route::post('register/contractor', [ContractorOnboardingController::class, 'register']) ->name('contractors.register.store'); }); Route::middleware(['web', 'auth'])->group(function () { // Admin onboarding approval routes Route::get('contractors/pending', [ContractorOnboardingController::class, 'pending']) ->name('contractors.pending'); Route::post('contractors/{contractor}/approve', [ContractorOnboardingController::class, 'approve']) ->name('contractors.approve'); Route::post('contractors/{contractor}/reject', [ContractorOnboardingController::class, 'reject']) ->name('contractors.reject'); // Contractor CRUD Route::resource('contractors', ContractorController::class); // Nested actions Route::post('contractors/{contractor}/equipment', [ContractorController::class, 'storeEquipment'])->name('contractors.equipment.store'); Route::post('contractors/{contractor}/certifications', [ContractorController::class, 'storeCertification'])->name('contractors.certifications.store'); Route::post('contractors/{contractor}/projects', [ContractorController::class, 'assignProject'])->name('contractors.projects.assign'); Route::delete('contractors/{contractor}/projects/{project}', [ContractorController::class, 'removeProject'])->name('contractors.projects.remove'); // Invoice lifecycle Route::post('contractors/{contractor}/invoices', [ContractorController::class, 'storeInvoice'])->name('contractors.invoices.store'); Route::patch('invoices/{invoice}/submit', [ContractorController::class, 'submitInvoice'])->name('invoices.submit'); Route::patch('invoices/{invoice}/approve', [ContractorController::class, 'approveInvoice'])->name('invoices.approve'); Route::post('invoices/{invoice}/pay', [ContractorController::class, 'payInvoice'])->name('invoices.pay'); });