[PROMOTE] 晉升 dev 到 demo 環境
1. 統一基本設定權限機制,將 DC通知 與 APK版本 權限移出客戶管理員預設範本,比照金流與機台設定,避免部署被強行還原。 2. 刪除 menu.special-permission.apk-versions 與 menu.special-permission.discord-notifications 冗餘特殊權限,並清理多語系檔對應 Key。 3. 修正 DiscordNotificationSecurityTest.php 安全驗證測試以適應新權限規則。
This commit is contained in:
commit
a12b6aac19
@ -58,8 +58,6 @@ class RoleSeeder extends Seeder
|
||||
'menu.reservation',
|
||||
'menu.special-permission',
|
||||
'menu.special-permission.clear-stock',
|
||||
'menu.special-permission.apk-versions',
|
||||
'menu.special-permission.discord-notifications',
|
||||
'menu.basic',
|
||||
'menu.basic.machines',
|
||||
'menu.basic.payment-configs',
|
||||
@ -123,10 +121,6 @@ class RoleSeeder extends Seeder
|
||||
'menu.reservation',
|
||||
'menu.special-permission',
|
||||
'menu.special-permission.clear-stock',
|
||||
'menu.special-permission.apk-versions',
|
||||
'menu.special-permission.discord-notifications',
|
||||
'menu.basic.discord-notifications',
|
||||
'menu.basic.apk-versions',
|
||||
]);
|
||||
}
|
||||
}
|
||||
@ -2361,9 +2361,7 @@
|
||||
"menu.sales.records": "Sales Records",
|
||||
"menu.sales.store-gifts": "Store Gifts",
|
||||
"menu.special-permission": "Special Permissions",
|
||||
"menu.special-permission.apk-versions": "APK Versions",
|
||||
"menu.special-permission.clear-stock": "Clear Stock",
|
||||
"menu.special-permission.discord-notifications": "Discord Notifications",
|
||||
"menu.warehouses": "Warehouse Management",
|
||||
"menu.warehouses.inventory": "Inventory Management",
|
||||
"menu.warehouses.machine-inventory": "Machine Inventory Overview",
|
||||
|
||||
@ -2361,9 +2361,7 @@
|
||||
"menu.sales.records": "販売記録",
|
||||
"menu.sales.store-gifts": "来店ギフト",
|
||||
"menu.special-permission": "特別権限",
|
||||
"menu.special-permission.apk-versions": "APKバージョン",
|
||||
"menu.special-permission.clear-stock": "在庫クリア",
|
||||
"menu.special-permission.discord-notifications": "Discord通知",
|
||||
"menu.warehouses": "倉庫管理",
|
||||
"menu.warehouses.inventory": "在庫管理",
|
||||
"menu.warehouses.machine-inventory": "機器在庫概要",
|
||||
|
||||
@ -2361,9 +2361,7 @@
|
||||
"menu.sales.records": "銷售紀錄",
|
||||
"menu.sales.store-gifts": "來店禮",
|
||||
"menu.special-permission": "特殊權限",
|
||||
"menu.special-permission.apk-versions": "APK版本",
|
||||
"menu.special-permission.clear-stock": "庫存清空",
|
||||
"menu.special-permission.discord-notifications": "Discord通知",
|
||||
"menu.warehouses": "倉儲管理",
|
||||
"menu.warehouses.inventory": "庫存管理",
|
||||
"menu.warehouses.machine-inventory": "機台庫存概覽",
|
||||
|
||||
@ -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)
|
||||
@ -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');
|
||||
@ -61,6 +61,8 @@ class DiscordNotificationSecurityTest extends TestCase
|
||||
|
||||
// 確保 tenantAdminTemplate 包含我們新加的 menu.basic.discord-notifications
|
||||
$tenantRole->syncPermissions($tenantAdminTemplate->permissions);
|
||||
// 手動指派以測試有權限時的存取行為 (因現已改為比照機台設定預設不配給範本)
|
||||
$tenantRole->givePermissionTo('menu.basic.discord-notifications');
|
||||
$this->tenantAdmin->assignRole($tenantRole);
|
||||
|
||||
// 5. 建立普通無此權限之帳號
|
||||
|
||||
Loading…
Reference in New Issue
Block a user