// Malaysian Payroll V2 app()->router->group([ 'namespace' => 'API\v2\My', 'prefix' => 'api/v2/my-payroll', 'middleware' => ['cors'], 'as' => 'my-payroll.' ], function ($router) { // ===== STATIC ROUTES FIRST (must come before variable routes) ===== // Payroll Processing - Static routes $router->post('/calculate', [ 'as' => 'calculate', 'uses' => 'MyPayrollController@calculate' ]); $router->post('/process', [ 'as' => 'process', 'uses' => 'MyPayrollController@process' ]); // Settings - Static routes $router->get('/settings', [ 'as' => 'settings.index', 'uses' => 'MyPayrollSettingController@index' ]); $router->post('/settings', [ 'as' => 'settings.update', 'uses' => 'MyPayrollSettingController@update' ]); // Tax Rates - Static routes $router->get('/tax-rates', [ 'as' => 'tax-rates.index', 'uses' => 'MyTaxController@index' ]); $router->post('/tax-rates', [ 'as' => 'tax-rates.store', 'uses' => 'MyTaxController@store' ]); // EPF Rates - Static routes $router->get('/epf-rates', [ 'as' => 'epf-rates.index', 'uses' => 'MyEpfController@index' ]); $router->post('/epf-rates', [ 'as' => 'epf-rates.store', 'uses' => 'MyEpfController@store' ]); // SOCSO Categories - Static routes $router->get('/socso-categories', [ 'as' => 'socso-categories.index', 'uses' => 'MySocsoController@index' ]); $router->post('/socso-categories', [ 'as' => 'socso-categories.store', 'uses' => 'MySocsoController@store' ]); // EIS Rates - Static routes $router->get('/eis-rates', [ 'as' => 'eis-rates.index', 'uses' => 'MyEisController@index' ]); $router->post('/eis-rates', [ 'as' => 'eis-rates.store', 'uses' => 'MyEisController@store' ]); // Zakat - Static routes $router->get('/zakat', [ 'as' => 'zakat.index', 'uses' => 'MyZakatController@index' ]); $router->post('/zakat', [ 'as' => 'zakat.store', 'uses' => 'MyZakatController@store' ]); // Reports - Static routes $router->post('/reports/ea-form', [ 'as' => 'reports.ea-form', 'uses' => 'MyReportController@generateEAForm' ]); $router->post('/reports/cp8a', [ 'as' => 'reports.cp8a', 'uses' => 'MyReportController@generateCP8A' ]); $router->post('/reports/socso', [ 'as' => 'reports.socso', 'uses' => 'MyReportController@generateSOCSOReport' ]); $router->post('/reports/epf', [ 'as' => 'reports.epf', 'uses' => 'MyReportController@generateEPFReport' ]); // Bank Files - Static routes $router->post('/bank-files/generate', [ 'as' => 'bank-files.generate', 'uses' => 'MyBankFileController@generate' ]); $router->get('/bank-files/supported-banks', [ 'as' => 'bank-files.supported-banks', 'uses' => 'MyBankFileController@getSupportedBanks' ]); // Payslips - Static routes $router->get('/payslips/employee', [ 'as' => 'payslips.employee', 'uses' => 'MyPayslipController@getEmployeePayslips' ]); $router->post('/payslips/bulk-generate', [ 'as' => 'payslips.bulk-generate', 'uses' => 'MyPayslipController@generateBulk' ]); // ===== VARIABLE ROUTES WITH SPECIFIC PATTERNS ===== // Payroll history - specific pattern $router->get('/history/{employeeId}', [ 'as' => 'history', 'uses' => 'MyPayrollController@history' ]); // Bank files download - specific pattern $router->get('/bank-files/download/{filename}', [ 'as' => 'bank-files.download', 'uses' => 'MyBankFileController@download' ]); // Payslips generate - specific pattern $router->get('/payslips/generate/{payrollId}', [ 'as' => 'payslips.generate', 'uses' => 'MyPayslipController@generate' ]); // Payslips download - specific pattern $router->get('/payslips/download/{filename}', [ 'as' => 'payslips.download', 'uses' => 'MyPayslipController@download' ]); // Payslips preview - specific pattern $router->get('/payslips/preview/{payrollId}', [ 'as' => 'payslips.preview', 'uses' => 'MyPayslipController@preview' ]); // Reports by type - specific pattern $router->get('/reports/{type}', [ 'as' => 'reports', 'uses' => 'MyPayrollController@reports' ]); // ===== VARIABLE ROUTES WITH {id} - MUST BE LAST ===== // Tax Rates - variable routes $router->put('/tax-rates/{id}', [ 'as' => 'tax-rates.update', 'uses' => 'MyTaxController@update' ]); $router->get('/tax-rates/{id}', [ 'as' => 'tax-rates.detail', 'uses' => 'MyTaxController@show' ]); $router->delete('/tax-rates/{id}', [ 'as' => 'tax-rates.destroy', 'uses' => 'MyTaxController@destroy' ]); // EPF Rates - variable routes $router->put('/epf-rates/{id}', [ 'as' => 'epf-rates.update', 'uses' => 'MyEpfController@update' ]); $router->get('/epf-rates/{id}', [ 'as' => 'epf-rates.show', 'uses' => 'MyEpfController@show' ]); $router->delete('/epf-rates/{id}', [ 'as' => 'epf-rates.destroy', 'uses' => 'MyEpfController@destroy' ]); // SOCSO Categories - variable routes $router->put('/socso-categories/{id}', [ 'as' => 'socso-categories.update', 'uses' => 'MySocsoController@update' ]); $router->get('/socso-categories/{id}', [ 'as' => 'socso-categories.show', 'uses' => 'MySocsoController@show' ]); $router->delete('/socso-categories/{id}', [ 'as' => 'socso-categories.destroy', 'uses' => 'MySocsoController@destroy' ]); // EIS Rates - variable routes $router->put('/eis-rates/{id}', [ 'as' => 'eis-rates.update', 'uses' => 'MyEisController@update' ]); $router->get('/eis-rates/{id}', [ 'as' => 'eis-rates.show', 'uses' => 'MyEisController@show' ]); $router->delete('/eis-rates/{id}', [ 'as' => 'eis-rates.destroy', 'uses' => 'MyEisController@destroy' ]); // Zakat - variable routes $router->put('/zakat/{id}', [ 'as' => 'zakat.update', 'uses' => 'MyZakatController@update' ]); $router->get('/zakat/{id}', [ 'as' => 'zakat.show', 'uses' => 'MyZakatController@show' ]); $router->delete('/zakat/{id}', [ 'as' => 'zakat.destroy', 'uses' => 'MyZakatController@destroy' ]); // Payroll CRUD - variable routes (MUST BE LAST) $router->get('/{id}', [ 'as' => 'show', 'uses' => 'MyPayrollController@show' ]); $router->put('/{id}', [ 'as' => 'update', 'uses' => 'MyPayrollController@update' ]); $router->delete('/{id}', [ 'as' => 'destroy', 'uses' => 'MyPayrollController@destroy' ]); $router->post('/{id}/mark-paid', [ 'as' => 'mark-paid', 'uses' => 'MyPayrollController@markPaid' ]); });