2025-12-30 15:03:19 +08:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
use Illuminate\Support\Facades\Route;
|
|
|
|
|
use Inertia\Inertia;
|
|
|
|
|
use App\Http\Controllers\CategoryController;
|
|
|
|
|
use App\Http\Controllers\VendorController;
|
|
|
|
|
use App\Http\Controllers\VendorProductController;
|
2026-01-06 16:17:12 +08:00
|
|
|
use App\Http\Controllers\DashboardController;
|
2025-12-30 15:03:19 +08:00
|
|
|
use App\Http\Controllers\ProductController;
|
2026-01-07 14:44:01 +08:00
|
|
|
use App\Http\Controllers\Auth\LoginController;
|
2025-12-30 15:03:19 +08:00
|
|
|
use App\Http\Controllers\PurchaseOrderController;
|
2026-01-07 14:44:01 +08:00
|
|
|
use App\Http\Controllers\WarehouseController;
|
|
|
|
|
use App\Http\Controllers\InventoryController;
|
|
|
|
|
use App\Http\Controllers\SafetyStockController;
|
|
|
|
|
use App\Http\Controllers\TransferOrderController;
|
2026-01-08 11:52:25 +08:00
|
|
|
use App\Http\Controllers\UnitController;
|
2026-01-13 13:30:51 +08:00
|
|
|
use App\Http\Controllers\Admin\RoleController;
|
|
|
|
|
use App\Http\Controllers\Admin\UserController;
|
2026-01-16 17:36:37 +08:00
|
|
|
use App\Http\Controllers\Admin\ActivityLogController;
|
2026-01-16 11:56:44 +08:00
|
|
|
use App\Http\Controllers\ProfileController;
|
2026-01-20 09:44:05 +08:00
|
|
|
use App\Http\Controllers\UtilityFeeController;
|
|
|
|
|
use App\Http\Controllers\AccountingReportController;
|
2026-01-15 13:36:59 +08:00
|
|
|
use Stancl\Tenancy\Middleware\InitializeTenancyByDomainOrSubdomain;
|
2026-01-07 14:44:01 +08:00
|
|
|
|
2026-01-15 13:36:59 +08:00
|
|
|
// 登入/登出路由
|
2026-01-07 14:44:01 +08:00
|
|
|
Route::get('/login', [LoginController::class, 'show'])->name('login');
|
|
|
|
|
Route::post('/login', [LoginController::class, 'store']);
|
|
|
|
|
Route::post('/logout', [LoginController::class, 'destroy'])->name('logout');
|
|
|
|
|
|
|
|
|
|
Route::middleware('auth')->group(function () {
|
2026-01-13 17:00:58 +08:00
|
|
|
// 儀表板 - 所有登入使用者皆可存取
|
2026-01-07 14:44:01 +08:00
|
|
|
Route::get('/', [DashboardController::class, 'index'])->name('dashboard');
|
|
|
|
|
|
2026-01-16 11:56:44 +08:00
|
|
|
// 使用者帳號設定
|
|
|
|
|
Route::get('/profile', [ProfileController::class, 'edit'])->name('profile.edit');
|
|
|
|
|
Route::patch('/profile', [ProfileController::class, 'update'])->name('profile.update');
|
|
|
|
|
Route::put('/profile/password', [ProfileController::class, 'updatePassword'])->name('profile.password');
|
|
|
|
|
|
2026-01-13 17:00:58 +08:00
|
|
|
// 類別管理 (用於商品對話框) - 需要商品權限
|
|
|
|
|
Route::middleware('permission:products.view')->group(function () {
|
|
|
|
|
Route::get('/categories', [CategoryController::class, 'index'])->name('categories.index');
|
|
|
|
|
Route::post('/categories', [CategoryController::class, 'store'])->middleware('permission:products.create')->name('categories.store');
|
|
|
|
|
Route::put('/categories/{category}', [CategoryController::class, 'update'])->middleware('permission:products.edit')->name('categories.update');
|
|
|
|
|
Route::delete('/categories/{category}', [CategoryController::class, 'destroy'])->middleware('permission:products.delete')->name('categories.destroy');
|
|
|
|
|
});
|
2026-01-07 14:44:01 +08:00
|
|
|
|
2026-01-13 17:00:58 +08:00
|
|
|
// 單位管理 - 需要商品權限
|
|
|
|
|
Route::middleware('permission:products.create|products.edit')->group(function () {
|
|
|
|
|
Route::post('/units', [UnitController::class, 'store'])->name('units.store');
|
|
|
|
|
Route::put('/units/{unit}', [UnitController::class, 'update'])->name('units.update');
|
|
|
|
|
Route::delete('/units/{unit}', [UnitController::class, 'destroy'])->name('units.destroy');
|
|
|
|
|
});
|
2026-01-08 11:52:25 +08:00
|
|
|
|
2026-01-07 14:44:01 +08:00
|
|
|
// 商品管理
|
2026-01-13 17:00:58 +08:00
|
|
|
Route::middleware('permission:products.view')->group(function () {
|
|
|
|
|
Route::get('/products', [ProductController::class, 'index'])->name('products.index');
|
|
|
|
|
Route::post('/products', [ProductController::class, 'store'])->middleware('permission:products.create')->name('products.store');
|
|
|
|
|
Route::put('/products/{product}', [ProductController::class, 'update'])->middleware('permission:products.edit')->name('products.update');
|
|
|
|
|
Route::delete('/products/{product}', [ProductController::class, 'destroy'])->middleware('permission:products.delete')->name('products.destroy');
|
|
|
|
|
});
|
2026-01-07 14:44:01 +08:00
|
|
|
|
|
|
|
|
// 廠商管理
|
2026-01-13 17:00:58 +08:00
|
|
|
Route::middleware('permission:vendors.view')->group(function () {
|
|
|
|
|
Route::get('/vendors', [VendorController::class, 'index'])->name('vendors.index');
|
|
|
|
|
Route::get('/vendors/{vendor}', [VendorController::class, 'show'])->name('vendors.show');
|
|
|
|
|
Route::post('/vendors', [VendorController::class, 'store'])->middleware('permission:vendors.create')->name('vendors.store');
|
|
|
|
|
Route::put('/vendors/{vendor}', [VendorController::class, 'update'])->middleware('permission:vendors.edit')->name('vendors.update');
|
|
|
|
|
Route::delete('/vendors/{vendor}', [VendorController::class, 'destroy'])->middleware('permission:vendors.delete')->name('vendors.destroy');
|
2026-01-07 14:44:01 +08:00
|
|
|
|
2026-01-13 17:00:58 +08:00
|
|
|
// 供貨商品相關路由
|
|
|
|
|
Route::post('/vendors/{vendor}/products', [VendorProductController::class, 'store'])->middleware('permission:vendors.edit')->name('vendors.products.store');
|
|
|
|
|
Route::put('/vendors/{vendor}/products/{product}', [VendorProductController::class, 'update'])->middleware('permission:vendors.edit')->name('vendors.products.update');
|
|
|
|
|
Route::delete('/vendors/{vendor}/products/{product}', [VendorProductController::class, 'destroy'])->middleware('permission:vendors.edit')->name('vendors.products.destroy');
|
|
|
|
|
});
|
2026-01-07 14:44:01 +08:00
|
|
|
|
|
|
|
|
// 倉庫管理
|
2026-01-13 17:00:58 +08:00
|
|
|
Route::middleware('permission:warehouses.view')->group(function () {
|
|
|
|
|
Route::get('/warehouses', [WarehouseController::class, 'index'])->name('warehouses.index');
|
|
|
|
|
Route::post('/warehouses', [WarehouseController::class, 'store'])->middleware('permission:warehouses.create')->name('warehouses.store');
|
|
|
|
|
Route::put('/warehouses/{warehouse}', [WarehouseController::class, 'update'])->middleware('permission:warehouses.edit')->name('warehouses.update');
|
|
|
|
|
Route::delete('/warehouses/{warehouse}', [WarehouseController::class, 'destroy'])->middleware('permission:warehouses.delete')->name('warehouses.destroy');
|
|
|
|
|
|
|
|
|
|
// 倉庫庫存管理 - 需要庫存權限
|
|
|
|
|
Route::middleware('permission:inventory.view')->group(function () {
|
|
|
|
|
Route::get('/warehouses/{warehouse}/inventory', [InventoryController::class, 'index'])->name('warehouses.inventory.index');
|
|
|
|
|
Route::get('/warehouses/{warehouse}/inventory/{inventoryId}/history', [InventoryController::class, 'history'])->name('warehouses.inventory.history');
|
|
|
|
|
|
|
|
|
|
Route::middleware('permission:inventory.adjust')->group(function () {
|
|
|
|
|
Route::get('/warehouses/{warehouse}/inventory/create', [InventoryController::class, 'create'])->name('warehouses.inventory.create');
|
|
|
|
|
Route::post('/warehouses/{warehouse}/inventory', [InventoryController::class, 'store'])->name('warehouses.inventory.store');
|
|
|
|
|
Route::get('/warehouses/{warehouse}/inventory/{inventoryId}/edit', [InventoryController::class, 'edit'])->name('warehouses.inventory.edit');
|
|
|
|
|
Route::put('/warehouses/{warehouse}/inventory/{inventoryId}', [InventoryController::class, 'update'])->name('warehouses.inventory.update');
|
|
|
|
|
Route::delete('/warehouses/{warehouse}/inventory/{inventoryId}', [InventoryController::class, 'destroy'])->name('warehouses.inventory.destroy');
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
// 安全庫存設定
|
|
|
|
|
Route::middleware('permission:inventory.view')->group(function () {
|
|
|
|
|
Route::get('/warehouses/{warehouse}/safety-stock', [SafetyStockController::class, 'index'])->name('warehouses.safety-stock.index');
|
|
|
|
|
Route::middleware('permission:inventory.safety_stock')->group(function () {
|
|
|
|
|
Route::post('/warehouses/{warehouse}/safety-stock', [SafetyStockController::class, 'store'])->name('warehouses.safety-stock.store');
|
|
|
|
|
Route::put('/warehouses/{warehouse}/safety-stock/{inventory}', [SafetyStockController::class, 'update'])->name('warehouses.safety-stock.update');
|
|
|
|
|
Route::delete('/warehouses/{warehouse}/safety-stock/{inventory}', [SafetyStockController::class, 'destroy'])->name('warehouses.safety-stock.destroy');
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
});
|
2026-01-07 14:44:01 +08:00
|
|
|
|
|
|
|
|
// 採購單管理
|
2026-01-13 17:00:58 +08:00
|
|
|
Route::middleware('permission:purchase_orders.view')->group(function () {
|
|
|
|
|
Route::get('/purchase-orders', [PurchaseOrderController::class, 'index'])->name('purchase-orders.index');
|
|
|
|
|
|
|
|
|
|
Route::middleware('permission:purchase_orders.create')->group(function () {
|
|
|
|
|
Route::get('/purchase-orders/create', [PurchaseOrderController::class, 'create'])->name('purchase-orders.create');
|
|
|
|
|
Route::post('/purchase-orders', [PurchaseOrderController::class, 'store'])->name('purchase-orders.store');
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
Route::get('/purchase-orders/{id}', [PurchaseOrderController::class, 'show'])->name('purchase-orders.show');
|
|
|
|
|
|
|
|
|
|
Route::get('/purchase-orders/{id}/edit', [PurchaseOrderController::class, 'edit'])->middleware('permission:purchase_orders.edit')->name('purchase-orders.edit');
|
|
|
|
|
Route::put('/purchase-orders/{id}', [PurchaseOrderController::class, 'update'])->middleware('permission:purchase_orders.edit')->name('purchase-orders.update');
|
|
|
|
|
Route::delete('/purchase-orders/{id}', [PurchaseOrderController::class, 'destroy'])->middleware('permission:purchase_orders.delete')->name('purchase-orders.destroy');
|
|
|
|
|
});
|
2026-01-07 14:44:01 +08:00
|
|
|
|
2026-01-20 09:44:05 +08:00
|
|
|
// 公共事業費管理 (TODO: 添加權限控制)
|
|
|
|
|
// 公共事業費
|
|
|
|
|
Route::middleware('permission:utility_fees.view')->group(function () {
|
|
|
|
|
Route::get('/utility-fees', [UtilityFeeController::class, 'index'])->name('utility-fees.index');
|
|
|
|
|
});
|
|
|
|
|
Route::middleware('permission:utility_fees.create')->group(function () {
|
|
|
|
|
Route::post('/utility-fees', [UtilityFeeController::class, 'store'])->name('utility-fees.store');
|
|
|
|
|
});
|
|
|
|
|
Route::middleware('permission:utility_fees.edit')->group(function () {
|
|
|
|
|
Route::put('/utility-fees/{utility_fee}', [UtilityFeeController::class, 'update'])->name('utility-fees.update');
|
|
|
|
|
});
|
|
|
|
|
Route::middleware('permission:utility_fees.delete')->group(function () {
|
|
|
|
|
Route::delete('/utility-fees/{utility_fee}', [UtilityFeeController::class, 'destroy'])->name('utility-fees.destroy');
|
|
|
|
|
});
|
|
|
|
|
|
2026-01-07 14:44:01 +08:00
|
|
|
// 撥補單 (在庫存調撥時使用)
|
2026-01-13 17:00:58 +08:00
|
|
|
Route::middleware('permission:inventory.transfer')->group(function () {
|
|
|
|
|
Route::post('/transfer-orders', [TransferOrderController::class, 'store'])->name('transfer-orders.store');
|
|
|
|
|
});
|
|
|
|
|
Route::get('/api/warehouses/{warehouse}/inventories', [TransferOrderController::class, 'getWarehouseInventories'])
|
|
|
|
|
->middleware('permission:inventory.view')
|
|
|
|
|
->name('api.warehouses.inventories');
|
2026-01-07 14:44:01 +08:00
|
|
|
|
2026-01-20 17:45:38 +08:00
|
|
|
// 系統管理
|
|
|
|
|
Route::middleware('permission:accounting.view')->prefix('accounting-report')->group(function () {
|
|
|
|
|
Route::get('/', [AccountingReportController::class, 'index'])->name('accounting.report');
|
2026-01-21 10:55:11 +08:00
|
|
|
Route::get('/export', [AccountingReportController::class, 'export'])
|
|
|
|
|
->middleware('permission:accounting.export')
|
|
|
|
|
->name('accounting.export');
|
2026-01-20 17:45:38 +08:00
|
|
|
});
|
|
|
|
|
|
2026-01-13 13:30:51 +08:00
|
|
|
// 系統管理
|
|
|
|
|
Route::prefix('admin')->group(function () {
|
2026-01-13 17:00:58 +08:00
|
|
|
Route::middleware('permission:roles.view')->group(function () {
|
|
|
|
|
Route::get('/roles', [RoleController::class, 'index'])->name('roles.index');
|
|
|
|
|
Route::middleware('permission:roles.create')->group(function () {
|
|
|
|
|
Route::get('/roles/create', [RoleController::class, 'create'])->name('roles.create');
|
|
|
|
|
Route::post('/roles', [RoleController::class, 'store'])->name('roles.store');
|
|
|
|
|
});
|
|
|
|
|
Route::get('/roles/{role}/edit', [RoleController::class, 'edit'])->middleware('permission:roles.edit')->name('roles.edit');
|
|
|
|
|
Route::put('/roles/{role}', [RoleController::class, 'update'])->middleware('permission:roles.edit')->name('roles.update');
|
|
|
|
|
Route::delete('/roles/{role}', [RoleController::class, 'destroy'])->middleware('permission:roles.delete')->name('roles.destroy');
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
Route::middleware('permission:users.view')->group(function () {
|
|
|
|
|
Route::get('/users', [UserController::class, 'index'])->name('users.index');
|
|
|
|
|
Route::middleware('permission:users.create')->group(function () {
|
|
|
|
|
Route::get('/users/create', [UserController::class, 'create'])->name('users.create');
|
|
|
|
|
Route::post('/users', [UserController::class, 'store'])->name('users.store');
|
|
|
|
|
});
|
|
|
|
|
Route::get('/users/{user}/edit', [UserController::class, 'edit'])->middleware('permission:users.edit')->name('users.edit');
|
|
|
|
|
Route::put('/users/{user}', [UserController::class, 'update'])->middleware('permission:users.edit')->name('users.update');
|
|
|
|
|
Route::delete('/users/{user}', [UserController::class, 'destroy'])->middleware('permission:users.delete')->name('users.destroy');
|
|
|
|
|
});
|
2026-01-16 17:36:37 +08:00
|
|
|
|
|
|
|
|
Route::middleware('permission:system.view_logs')->group(function () {
|
|
|
|
|
Route::get('/activity-logs', [ActivityLogController::class, 'index'])->name('activity-logs.index');
|
|
|
|
|
});
|
2026-01-20 17:45:38 +08:00
|
|
|
|
2026-01-13 13:30:51 +08:00
|
|
|
});
|
|
|
|
|
|
2026-01-07 14:44:01 +08:00
|
|
|
}); // End of auth middleware group
|