[FIX] 統一基本設定權限機制並清除冗餘特殊權限

1. 修正 RoleSeeder.php:移除了預設分配給客戶管理員角色模板的 menu.basic.discord-notifications 與 menu.basic.apk-versions 權限,使其運作機制與機台設定、金流設定完全一致,預設不分配且避免部署時被強制重灌。
2. 清除冗餘權限:從 Seeder 權限宣告中移除專案未引用的 menu.special-permission.apk-versions 與 menu.special-permission.discord-notifications。
3. 語系檔對齊整理:自 zh_TW.json, en.json, ja.json 中刪除冗餘的特殊權限翻譯 Key,並重新按字母排序(ksort)且還原斜線。
4. 修正單元測試:調整 DiscordNotificationSecurityTest.php,在 setUp 中為測試角色手動指派基本通知權限以通過 Gate 檢查,成功修正測試案例。
This commit is contained in:
sky121113 2026-06-04 13:01:49 +08:00
parent 7579a0b5be
commit 7ceb7644f0
7 changed files with 2 additions and 331 deletions

View File

@ -58,8 +58,6 @@ class RoleSeeder extends Seeder
'menu.reservation', 'menu.reservation',
'menu.special-permission', 'menu.special-permission',
'menu.special-permission.clear-stock', 'menu.special-permission.clear-stock',
'menu.special-permission.apk-versions',
'menu.special-permission.discord-notifications',
'menu.basic', 'menu.basic',
'menu.basic.machines', 'menu.basic.machines',
'menu.basic.payment-configs', 'menu.basic.payment-configs',
@ -123,10 +121,6 @@ class RoleSeeder extends Seeder
'menu.reservation', 'menu.reservation',
'menu.special-permission', 'menu.special-permission',
'menu.special-permission.clear-stock', 'menu.special-permission.clear-stock',
'menu.special-permission.apk-versions',
'menu.special-permission.discord-notifications',
'menu.basic.discord-notifications',
'menu.basic.apk-versions',
]); ]);
} }
} }

View File

@ -2361,9 +2361,7 @@
"menu.sales.records": "Sales Records", "menu.sales.records": "Sales Records",
"menu.sales.store-gifts": "Store Gifts", "menu.sales.store-gifts": "Store Gifts",
"menu.special-permission": "Special Permissions", "menu.special-permission": "Special Permissions",
"menu.special-permission.apk-versions": "APK Versions",
"menu.special-permission.clear-stock": "Clear Stock", "menu.special-permission.clear-stock": "Clear Stock",
"menu.special-permission.discord-notifications": "Discord Notifications",
"menu.warehouses": "Warehouse Management", "menu.warehouses": "Warehouse Management",
"menu.warehouses.inventory": "Inventory Management", "menu.warehouses.inventory": "Inventory Management",
"menu.warehouses.machine-inventory": "Machine Inventory Overview", "menu.warehouses.machine-inventory": "Machine Inventory Overview",

View File

@ -2361,9 +2361,7 @@
"menu.sales.records": "販売記録", "menu.sales.records": "販売記録",
"menu.sales.store-gifts": "来店ギフト", "menu.sales.store-gifts": "来店ギフト",
"menu.special-permission": "特別権限", "menu.special-permission": "特別権限",
"menu.special-permission.apk-versions": "APKバージョン",
"menu.special-permission.clear-stock": "在庫クリア", "menu.special-permission.clear-stock": "在庫クリア",
"menu.special-permission.discord-notifications": "Discord通知",
"menu.warehouses": "倉庫管理", "menu.warehouses": "倉庫管理",
"menu.warehouses.inventory": "在庫管理", "menu.warehouses.inventory": "在庫管理",
"menu.warehouses.machine-inventory": "機器在庫概要", "menu.warehouses.machine-inventory": "機器在庫概要",

View File

@ -2361,9 +2361,7 @@
"menu.sales.records": "銷售紀錄", "menu.sales.records": "銷售紀錄",
"menu.sales.store-gifts": "來店禮", "menu.sales.store-gifts": "來店禮",
"menu.special-permission": "特殊權限", "menu.special-permission": "特殊權限",
"menu.special-permission.apk-versions": "APK版本",
"menu.special-permission.clear-stock": "庫存清空", "menu.special-permission.clear-stock": "庫存清空",
"menu.special-permission.discord-notifications": "Discord通知",
"menu.warehouses": "倉儲管理", "menu.warehouses": "倉儲管理",
"menu.warehouses.inventory": "庫存管理", "menu.warehouses.inventory": "庫存管理",
"menu.warehouses.machine-inventory": "機台庫存概覽", "menu.warehouses.machine-inventory": "機台庫存概覽",

View File

@ -1,253 +0,0 @@
import json
import os
files = {
'zh_TW': '/home/mama/projects/star-cloud/lang/zh_TW.json',
'en': '/home/mama/projects/star-cloud/lang/en.json',
'ja': '/home/mama/projects/star-cloud/lang/ja.json'
}
new_keys = {
"CREATE STOCK TRANSFERS BETWEEN WAREHOUSES AND MACHINE RETURNS": {
"zh_TW": "建立倉庫間調撥或機台退庫單",
"en": "Create stock transfers between warehouses and machine returns",
"ja": "倉庫間の転送および機台からの返品伝票を作成"
},
"Create and manage replenishment orders from warehouse to machines": {
"zh_TW": "建立並管理從倉庫到機台的補貨單",
"en": "Create and manage replenishment orders from warehouse to machines",
"ja": "倉庫から機台への補充伝票の作成と管理"
},
"Create stock transfers between warehouses and machine returns": {
"zh_TW": "建立倉庫間調撥或機台退庫單",
"en": "Create stock transfers between warehouses and machine returns",
"ja": "倉庫間の転送および機台からの返品伝票を作成"
},
"Create Transfer Order": {
"zh_TW": "建立調撥單",
"en": "Create Transfer Order",
"ja": "転送伝票を作成"
},
"Create Replenishment Order": {
"zh_TW": "建立補貨單",
"en": "Create Replenishment Order",
"ja": "補充伝票を作成"
},
"New Transfer": {
"zh_TW": "新增調撥單",
"en": "New Transfer",
"ja": "新規転送"
},
"New Replenishment": {
"zh_TW": "新增補貨單",
"en": "New Replenishment",
"ja": "新規補充"
},
"New Stock-In Order": {
"zh_TW": "新增進貨單",
"en": "New Stock-In Order",
"ja": "新規入庫伝票"
},
"No transfer orders found": {
"zh_TW": "查無調撥單紀錄",
"en": "No transfer orders found",
"ja": "転送伝票が見つかりません"
},
"No replenishment orders found": {
"zh_TW": "查無補貨單紀錄",
"en": "No replenishment orders found",
"ja": "補充伝票が見つかりません"
},
"No stock data found": {
"zh_TW": "查無庫存資料",
"en": "No stock data found",
"ja": "在庫データが見つかりません"
},
"No stock-in orders found": {
"zh_TW": "查無進貨單紀錄",
"en": "No stock-in orders found",
"ja": "入庫伝票が見つかりません"
},
"No movement records found": {
"zh_TW": "查無異動紀錄",
"en": "No movement records found",
"ja": "移動履歴が見つかりません"
},
"Replenishment Orders": {
"zh_TW": "機台補貨單",
"en": "Replenishment Orders",
"ja": "機台補充伝票"
},
"Search products...": {
"zh_TW": "搜尋商品...",
"en": "Search products...",
"ja": "商品を検索..."
},
"Search Product": {
"zh_TW": "搜尋商品",
"en": "Search Product",
"ja": "商品を検索"
},
"Select Warehouse": {
"zh_TW": "選擇倉庫",
"en": "Select Warehouse",
"ja": "倉庫を選択"
},
"Select Machine": {
"zh_TW": "選擇機台",
"en": "Select Machine",
"ja": "機台を選択"
},
"Select Product": {
"zh_TW": "選擇商品",
"en": "Select Product",
"ja": "商品を選択"
},
"Source Warehouse": {
"zh_TW": "來源倉庫",
"en": "Source Warehouse",
"ja": "発送元倉庫"
},
"Target Warehouse": {
"zh_TW": "目標倉庫",
"en": "Target Warehouse",
"ja": "対象倉庫"
},
"Stock-In Orders": {
"zh_TW": "進貨單管理",
"en": "Stock-In Orders",
"ja": "入庫伝票"
},
"Stock-In Management": {
"zh_TW": "進貨管理",
"en": "Stock-In Management",
"ja": "入庫管理"
},
"Stock flow history": {
"zh_TW": "庫存流向歷史",
"en": "Stock flow history",
"ja": "在庫移動履歴"
},
"Stock-In Orders Tab": {
"zh_TW": "進貨單管理",
"en": "Stock-In Orders",
"ja": "入庫伝票"
},
"Transfer Orders": {
"zh_TW": "調撥單管理",
"en": "Transfer Orders",
"ja": "転送伝票"
},
"Track stock-in orders and movement history": {
"zh_TW": "追蹤進貨單據與庫存異動紀錄",
"en": "Track stock-in orders and movement history",
"ja": "入庫伝票および移動履歴の追跡"
},
"Warehouse to Warehouse": {
"zh_TW": "倉庫對倉庫",
"en": "Warehouse to Warehouse",
"ja": "倉庫間転送"
},
"Warehouse Transfer": {
"zh_TW": "倉庫調撥",
"en": "Warehouse Transfer",
"ja": "倉庫転送"
},
"Warehouse Management": {
"zh_TW": "倉儲管理",
"en": "Warehouse Management",
"ja": "倉庫管理"
},
"Warehouse purchase records": {
"zh_TW": "倉庫採購進貨紀錄",
"en": "Warehouse purchase records",
"ja": "倉庫購入記録"
},
"Machine to Warehouse": {
"zh_TW": "機台對倉庫",
"en": "Machine to Warehouse",
"ja": "機台から倉庫"
},
"Machine Return": {
"zh_TW": "機台退庫",
"en": "Machine Return",
"ja": "機台返品"
},
"Machine Replenishment": {
"zh_TW": "機台補貨單",
"en": "Machine Replenishment",
"ja": "機台補充"
},
"Movement History": {
"zh_TW": "異動紀錄",
"en": "Movement History",
"ja": "移動履歴"
},
"Movement Logs": {
"zh_TW": "異動紀錄",
"en": "Movement Logs",
"ja": "移動ログ"
},
"Manage stock transfers between warehouses and machine returns": {
"zh_TW": "建立倉庫間調撥或機台退庫單",
"en": "Manage stock transfers between warehouses and machine returns",
"ja": "倉庫間の転送および機台からの返品伝票を作成"
},
"Main": {
"zh_TW": "總倉",
"en": "Main",
"ja": "総倉庫"
},
"Note": {
"zh_TW": "備註",
"en": "Note",
"ja": "備考"
},
"Transfer Audit": {
"zh_TW": "調撥單",
"en": "Transfer Audit",
"ja": "転送監査"
},
"Transfers": {
"zh_TW": "調撥單",
"en": "Transfers",
"ja": "転送"
},
"Inventory Management": {
"zh_TW": "庫存管理",
"en": "Inventory Management",
"ja": "在庫管理"
},
"Manage stock levels, stock-in orders, and movement history": {
"zh_TW": "追蹤庫存水位、進貨單與異動紀錄",
"en": "Manage stock levels, stock-in orders, and movement history",
"ja": "在庫レベル、入庫伝票、および移動履歴の管理"
},
"Track stock levels, stock-in orders, and movement history": {
"zh_TW": "追蹤庫存水位、進貨單與異動紀錄",
"en": "Track stock levels, stock-in orders, and movement history",
"ja": "在庫レベル、入庫伝票、および移動履歴の追跡"
}
}
for lang, path in files.items():
if not os.path.exists(path):
continue
with open(path, 'r', encoding='utf-8') as f:
data = json.load(f)
# Update menu.warehouses
if lang == 'zh_TW':
data['menu.warehouses'] = "倉儲管理"
# Add/Update keys
for k, v in new_keys.items():
if lang in v:
data[k] = v[lang]
elif lang == 'en':
data[k] = k
# Sort keys and write back
with open(path, 'w', encoding='utf-8') as f:
json.dump(data, f, ensure_ascii=False, indent=4, sort_keys=True)

View File

@ -1,66 +0,0 @@
<?php
// Mocking Route and Laravel environment for breadcrumb logic test
function __($str) { return $str; }
class Route {
public static $currentName = '';
public static function currentRouteName() { return self::$currentName; }
}
function testBreadcrumbs($routeName) {
Route::$currentName = $routeName;
$links = [];
$links[] = [
'label' => __('Dashboard'),
'url' => '/admin/dashboard',
'active' => $routeName === 'admin.dashboard'
];
$moduleMap = [
'admin.warehouses' => __('Warehouse Management'),
// ... simplified
];
$foundModule = null;
foreach ($moduleMap as $prefix => $label) {
if (str_starts_with($routeName, $prefix)) {
$foundModule = [
'label' => $label,
'url' => '#',
'active' => false
];
break;
}
}
if ($foundModule) {
$links[] = $foundModule;
}
$segments = explode('.', $routeName);
$lastSegment = end($segments);
// Simplifed page labels
$pageLabel = match($lastSegment) {
'inventory' => __('Inventory Management'),
'index' => 'Warehouse Overview',
default => null,
};
if ($pageLabel) {
$links[] = [
'label' => $pageLabel,
'active' => true
];
}
echo "Route: $routeName\n";
foreach ($links as $link) {
echo " - " . $link['label'] . ($link['active'] ? " (active)" : "") . "\n";
}
echo "\n";
}
testBreadcrumbs('admin.warehouses.inventory');
testBreadcrumbs('admin.warehouses.index');

View File

@ -61,6 +61,8 @@ class DiscordNotificationSecurityTest extends TestCase
// 確保 tenantAdminTemplate 包含我們新加的 menu.basic.discord-notifications // 確保 tenantAdminTemplate 包含我們新加的 menu.basic.discord-notifications
$tenantRole->syncPermissions($tenantAdminTemplate->permissions); $tenantRole->syncPermissions($tenantAdminTemplate->permissions);
// 手動指派以測試有權限時的存取行為 (因現已改為比照機台設定預設不配給範本)
$tenantRole->givePermissionTo('menu.basic.discord-notifications');
$this->tenantAdmin->assignRole($tenantRole); $this->tenantAdmin->assignRole($tenantRole);
// 5. 建立普通無此權限之帳號 // 5. 建立普通無此權限之帳號