189 lines
11 KiB
PHP
189 lines
11 KiB
PHP
<?php
|
|
|
|
use Illuminate\Support\Facades\Route;
|
|
use App\Http\Controllers\AuthController;
|
|
use App\Http\Controllers\DashboardController;
|
|
use App\Http\Controllers\ProjectController;
|
|
use App\Http\Controllers\TaskController;
|
|
use App\Http\Controllers\EmployeeController;
|
|
use App\Http\Controllers\ExpenseController;
|
|
use App\Http\Controllers\PettyCashController;
|
|
use App\Http\Controllers\InventoryController;
|
|
use App\Http\Controllers\AttachmentController;
|
|
use App\Http\Controllers\LetterController;
|
|
use App\Http\Controllers\DocumentController;
|
|
use App\Http\Controllers\ReportController;
|
|
use App\Http\Controllers\PayrollController;
|
|
use App\Http\Controllers\SettingsController;
|
|
|
|
|
|
/*
|
|
|--------------------------------------------------------------------------
|
|
| Web Routes
|
|
|--------------------------------------------------------------------------
|
|
|
|
|
| Here is where you can register web routes for your application. These
|
|
| routes are loaded by the RouteServiceProvider and all of them will
|
|
| be assigned to the "web" middleware group. Make something great!
|
|
|
|
|
*/
|
|
|
|
// Authentication Routes (public)
|
|
Route::get('/login', [AuthController::class, 'showLogin'])->name('login');
|
|
Route::post('/login', [AuthController::class, 'login'])->name('login.post');
|
|
Route::post('/logout', [AuthController::class, 'logout'])->name('logout');
|
|
|
|
// Protected Routes (auth required)
|
|
Route::middleware(['auth', \App\Http\Middleware\SetTenant::class, \App\Http\Middleware\SetLocale::class, \App\Http\Middleware\AuditLogMiddleware::class])->group(function () {
|
|
|
|
// Dashboard
|
|
Route::get('/', [DashboardController::class, 'index'])->name('dashboard');
|
|
Route::get('/dashboard', [DashboardController::class, 'index'])->name('dashboard.index');
|
|
|
|
// Locale & Settings
|
|
Route::post('/locale', function (\Illuminate\Http\Request $request) {
|
|
$locale = $request->validate(['locale' => 'required|in:fa,en,ar'])['locale'];
|
|
session(['locale' => $locale]);
|
|
app()->setLocale($locale);
|
|
if ($request->user()) {
|
|
$request->user()->update(['locale' => $locale]);
|
|
}
|
|
return redirect()->back();
|
|
})->name('locale.update');
|
|
|
|
Route::post('/calendar', function (\Illuminate\Http\Request $request) {
|
|
$calendar = $request->validate(['calendar' => 'required|in:jalali,gregorian'])['calendar'];
|
|
session(['calendar' => $calendar]);
|
|
if ($request->user()) {
|
|
$request->user()->update(['preferred_calendar' => $calendar]);
|
|
}
|
|
return redirect()->back();
|
|
})->name('calendar.update');
|
|
|
|
Route::post('/currency', function (\Illuminate\Http\Request $request) {
|
|
$currency = $request->validate(['currency' => 'required|in:IRR,USD,EUR,AED'])['currency'];
|
|
session(['currency' => $currency]);
|
|
return redirect()->back();
|
|
})->name('currency.update');
|
|
|
|
// Projects
|
|
Route::resource('projects', ProjectController::class);
|
|
Route::put('projects/{project}/status', [ProjectController::class, 'updateStatus'])->name('projects.update-status');
|
|
Route::get('projects-export/excel', [ProjectController::class, 'exportExcel'])->name('projects.export.excel');
|
|
Route::get('projects-export/pdf', [ProjectController::class, 'exportPdf'])->name('projects.export.pdf');
|
|
|
|
// Tasks
|
|
Route::resource('tasks', TaskController::class);
|
|
Route::put('tasks/{task}/status', [TaskController::class, 'updateStatus'])->name('tasks.update-status');
|
|
Route::get('tasks-kanban', [TaskController::class, 'kanban'])->name('tasks.kanban');
|
|
Route::get('tasks-gantt', [TaskController::class, 'gantt'])->name('tasks.gantt');
|
|
Route::get('tasks/{task}/gantt', [TaskController::class, 'gantt'])->name('tasks.gantt-project');
|
|
|
|
// Employees
|
|
Route::resource('employees', EmployeeController::class);
|
|
Route::get('employees/{employee}/work-logs', [EmployeeController::class, 'workLogs'])->name('employees.work-logs');
|
|
Route::get('employees/{employee}/financials', [EmployeeController::class, 'financials'])->name('employees.financials');
|
|
|
|
// Expenses
|
|
Route::resource('expenses', ExpenseController::class);
|
|
Route::put('expenses/{expense}/approve', [ExpenseController::class, 'approve'])->name('expenses.approve');
|
|
Route::put('expenses/{expense}/reject', [ExpenseController::class, 'reject'])->name('expenses.reject');
|
|
|
|
// Petty Cash
|
|
Route::resource('petty-cashes', PettyCashController::class);
|
|
Route::get('petty-cashes/{pettyCash}/create-expense', [PettyCashController::class, 'createExpense'])->name('petty-cashes.create-expense');
|
|
Route::post('petty-cashes/{pettyCash}/store-expense', [PettyCashController::class, 'storeExpense'])->name('petty-cashes.store-expense');
|
|
Route::put('petty-cashes/{pettyCash}/approve', [PettyCashController::class, 'approve'])->name('petty-cashes.approve');
|
|
Route::put('petty-cashes/{pettyCash}/reject', [PettyCashController::class, 'reject'])->name('petty-cashes.reject');
|
|
Route::put('petty-cashes/{pettyCash}/settle', [PettyCashController::class, 'settle'])->name('petty-cashes.settle');
|
|
|
|
// Inventory
|
|
Route::prefix('inventory')->name('inventory.')->group(function () {
|
|
// Dashboard
|
|
Route::get('/', [InventoryController::class, 'index'])->name('index');
|
|
|
|
// Items CRUD
|
|
Route::get('items', [InventoryController::class, 'items'])->name('items');
|
|
Route::get('items/create', [InventoryController::class, 'createItem'])->name('items.create');
|
|
Route::post('items', [InventoryController::class, 'storeItem'])->name('items.store');
|
|
Route::get('items/{item}/edit', [InventoryController::class, 'editItem'])->name('items.edit');
|
|
Route::put('items/{item}', [InventoryController::class, 'updateItem'])->name('items.update');
|
|
Route::delete('items/{item}', [InventoryController::class, 'destroyItem'])->name('items.destroy');
|
|
|
|
// Warehouses CRUD
|
|
Route::get('warehouses', [InventoryController::class, 'warehouses'])->name('warehouses');
|
|
Route::get('warehouses/create', [InventoryController::class, 'createWarehouse'])->name('warehouses.create');
|
|
Route::post('warehouses', [InventoryController::class, 'storeWarehouse'])->name('warehouses.store');
|
|
Route::get('warehouses/{warehouse}/edit', [InventoryController::class, 'editWarehouse'])->name('warehouses.edit');
|
|
Route::put('warehouses/{warehouse}', [InventoryController::class, 'updateWarehouse'])->name('warehouses.update');
|
|
Route::delete('warehouses/{warehouse}', [InventoryController::class, 'destroyWarehouse'])->name('warehouses.destroy');
|
|
|
|
// Transactions
|
|
Route::get('transactions', [InventoryController::class, 'transactions'])->name('transactions');
|
|
|
|
// Stock operations
|
|
Route::post('stock-in', [InventoryController::class, 'stockIn'])->name('stock-in');
|
|
Route::post('stock-out', [InventoryController::class, 'stockOut'])->name('stock-out');
|
|
Route::post('transfer', [InventoryController::class, 'stockTransfer'])->name('transfer');
|
|
Route::get('current-stock', [InventoryController::class, 'currentStock'])->name('current-stock');
|
|
});
|
|
|
|
// Letters (Correspondence)
|
|
Route::resource('letters', LetterController::class);
|
|
Route::put('letters/{letter}/archive', [LetterController::class, 'archive'])->name('letters.archive');
|
|
|
|
// Letters (Correspondence)
|
|
Route::resource('letters', LetterController::class);
|
|
Route::put('letters/{letter}/archive', [LetterController::class, 'archive'])->name('letters.archive');
|
|
|
|
// Documents
|
|
Route::resource('documents', DocumentController::class);
|
|
Route::get('documents/{document}/download', [DocumentController::class, 'download'])->name('documents.download');
|
|
|
|
// Reports
|
|
Route::prefix('reports')->name('reports.')->group(function () {
|
|
Route::get('/', [ReportController::class, 'index'])->name('index');
|
|
Route::get('financial', [ReportController::class, 'financial'])->name('financial');
|
|
Route::get('financial/excel', [ReportController::class, 'financialExportExcel'])->name('financial.excel');
|
|
Route::get('financial/pdf', [ReportController::class, 'financialExportPdf'])->name('financial.pdf');
|
|
Route::get('employee-worklog', [ReportController::class, 'employeeWorklog'])->name('employee-worklog');
|
|
Route::get('employee-worklog/excel', [ReportController::class, 'employeeWorklogExportExcel'])->name('employee-worklog.excel');
|
|
Route::get('inventory', [ReportController::class, 'inventory'])->name('inventory');
|
|
Route::get('inventory/excel', [ReportController::class, 'inventoryExportExcel'])->name('inventory.excel');
|
|
Route::get('payroll', [ReportController::class, 'payroll'])->name('payroll');
|
|
Route::get('payroll/excel', [ReportController::class, 'payrollExportExcel'])->name('payroll.excel');
|
|
});
|
|
|
|
Route::prefix('payroll')->name('payroll.')->group(function () {
|
|
Route::get('/', [PayrollController::class, 'index'])->name('index');
|
|
Route::get('/calculate', [PayrollController::class, 'calculate'])->name('calculate');
|
|
Route::post('/auto-calculate', [PayrollController::class, 'autoCalculate'])->name('auto-calculate');
|
|
Route::post('/store', [PayrollController::class, 'store'])->name('store');
|
|
Route::get('/settlement', [PayrollController::class, 'settlement'])->name('settlement');
|
|
Route::post('/preview-settlement', [PayrollController::class, 'previewSettlement'])->name('preview-settlement');
|
|
Route::post('/process-settlement', [PayrollController::class, 'processSettlement'])->name('process-settlement');
|
|
Route::post('/pay-bulk', [PayrollController::class, 'payBulk'])->name('pay-bulk');
|
|
Route::get('/{employee}', [PayrollController::class, 'show'])->name('show');
|
|
Route::post('/{financial}/pay', [PayrollController::class, 'pay'])->name('pay');
|
|
Route::delete('/{financial}', [PayrollController::class, 'destroy'])->name('destroy');
|
|
});
|
|
|
|
// Settings
|
|
Route::prefix('settings')->name('settings.')->group(function () {
|
|
Route::get('/', [SettingsController::class, 'index'])->name('index');
|
|
Route::put('organization', [SettingsController::class, 'updateOrganization'])->name('organization.update');
|
|
Route::post('users', [SettingsController::class, 'storeUser'])->name('users.store');
|
|
Route::put('users/{user}', [SettingsController::class, 'updateUser'])->name('users.update');
|
|
Route::patch('users/{user}/toggle', [SettingsController::class, 'toggleUser'])->name('users.toggle');
|
|
Route::post('currencies', [SettingsController::class, 'storeCurrency'])->name('currencies.store');
|
|
Route::put('currencies/{currency}', [SettingsController::class, 'updateCurrency'])->name('currencies.update');
|
|
Route::patch('currencies/{currency}/toggle', [SettingsController::class, 'toggleCurrency'])->name('currencies.toggle');
|
|
});
|
|
|
|
|
|
// Attachments
|
|
Route::post('attachments', [AttachmentController::class, 'store'])->name('attachments.store');
|
|
Route::delete('attachments/{attachment}', [AttachmentController::class, 'destroy'])->name('attachments.destroy');
|
|
Route::get('attachments/{attachment}/download', [AttachmentController::class, 'download'])->name('attachments.download');
|
|
});
|