vernova/routes/web.php
2026-07-26 19:58:27 +03:30

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');
});