From f59efc6dc7a3126a66d726c5ab7c8862cc67eace Mon Sep 17 00:00:00 2001 From: sky121113 Date: Fri, 22 May 2026 14:46:26 +0800 Subject: [PATCH] =?UTF-8?q?[FIX]=20=E8=A3=9C=E9=BD=8A=E8=88=87=E5=84=AA?= =?UTF-8?q?=E5=8C=96=E4=BE=86=E5=BA=97=E7=A6=AE=E3=80=81=E9=80=9A=E8=A1=8C?= =?UTF-8?q?=E7=A2=BC=E3=80=81=E5=8F=96=E8=B2=A8=E7=A2=BC=E4=B9=8B=E5=A4=9A?= =?UTF-8?q?=E8=AA=9E=E7=B3=BB=E8=88=87=E4=BB=8B=E9=9D=A2=E6=AC=84=E4=BD=8D?= =?UTF-8?q?=E5=91=88=E7=8F=BE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 移除非必要之 Log 備註:從來店禮使用記錄 (Logs) 的電腦版與行動版畫面中,徹底移除了無業務參考價值的技術備註 (Remark) 欄位,優化排版空間以符合極簡奢華風 UI 設計。 2. 補齊與對齊三語系檔案:補齊來店禮、通行碼與商品領取所缺少的多語系 Key,三個語系 JSON 檔 (zh_TW, en, ja) 的 Key 與行數已 100% 完美對齊 (共 2,255 行) 且完成升冪字母排序 (ksort)。 3. 簡化 Guest 票券大標題:簡化 Guest 端三種票券頁面 (通行碼、取貨碼、來店禮) 的大標題多語系拼接結構,改為單一乾淨的翻譯 Key 呼叫。 4. 口語化翻譯微調:將 Pickup Code 在語系檔中的中文翻譯由「領取碼」微調為更口語、直覺的「取貨碼」。 5. 優化 Guest 頁面欄位:將取貨碼頁面的「機台序號」替換為更具溫度的「機台名稱」;通行碼與來店禮頁面則徹底隱藏機台序號,優化用戶體驗。 --- .agents/rules/framework.md | 2 +- .agents/rules/skill-trigger.md | 7 +- .agents/skills/api-technical-specs/SKILL.md | 44 +- .agents/skills/multilingual-specs/SKILL.md | 161 +++ .../Controllers/Admin/SalesController.php | 258 ++++- .../Api/V1/App/MachineController.php | 71 ++ .../Guest/WelcomeGiftController.php | 26 + app/Models/Transaction/Order.php | 6 + app/Models/Transaction/WelcomeGift.php | 153 +++ app/Models/Transaction/WelcomeGiftLog.php | 56 ++ .../Transaction/TransactionService.php | 35 + config/api-docs.php | 77 +- ...5_22_105822_create_welcome_gifts_table.php | 55 ++ ...26_add_welcome_gift_id_to_orders_table.php | 33 + lang/en.json | 704 ++++++++------ lang/ja.json | 721 ++++++++------ lang/zh_TW.json | 670 +++++++------ .../admin/sales/welcome-gifts/index.blade.php | 913 ++++++++++++++++++ .../welcome-gifts/partials/tab-list.blade.php | 345 +++++++ .../welcome-gifts/partials/tab-logs.blade.php | 310 ++++++ .../views/guest/pass-code/show.blade.php | 24 +- resources/views/guest/pickup/show.blade.php | 39 +- .../views/guest/welcome-gift/show.blade.php | 77 ++ .../layouts/partials/sidebar-menu.blade.php | 4 +- routes/api.php | 1 + routes/web.php | 4 + tests/Feature/Api/V1/WelcomeGiftTest.php | 242 +++++ 27 files changed, 4021 insertions(+), 1017 deletions(-) create mode 100644 .agents/skills/multilingual-specs/SKILL.md create mode 100644 app/Http/Controllers/Guest/WelcomeGiftController.php create mode 100644 app/Models/Transaction/WelcomeGift.php create mode 100644 app/Models/Transaction/WelcomeGiftLog.php create mode 100644 database/migrations/2026_05_22_105822_create_welcome_gifts_table.php create mode 100644 database/migrations/2026_05_22_105826_add_welcome_gift_id_to_orders_table.php create mode 100644 resources/views/admin/sales/welcome-gifts/index.blade.php create mode 100644 resources/views/admin/sales/welcome-gifts/partials/tab-list.blade.php create mode 100644 resources/views/admin/sales/welcome-gifts/partials/tab-logs.blade.php create mode 100644 resources/views/guest/welcome-gift/show.blade.php create mode 100644 tests/Feature/Api/V1/WelcomeGiftTest.php diff --git a/.agents/rules/framework.md b/.agents/rules/framework.md index 9d56e5f..70ca86d 100644 --- a/.agents/rules/framework.md +++ b/.agents/rules/framework.md @@ -38,7 +38,7 @@ trigger: always_on * **樣式與組件**:全面使用 Tailwind CSS utility classes,遵循 Preline UI 的 HTML 結構進行開發。**避免撰寫自訂 CSS**。 * **互動邏輯**:優先使用輕量級 **Alpine.js** (`x-data`, `x-show`, `@click`) 於 Blade 內完成,**禁用 React / Vue / Inertia.js**。 * **【警告:Preline 冗餘】**:Preline 官方範例常有多餘控制項。必須確保介面佈局極簡,嚴格遵守「極簡奢華風 UI 實作規範 (SKILL.md)」。 -* **多語系 (I18n)**:所有 UI 可見文字必須使用 `@lang('key')` 或 `__('key')` 處理。Key 統一採用**英文原始詞彙**,並同步更新 `zh_TW.json`, `en.json`, `ja.json`。 +* **多語系 (I18n)**:所有 UI 可見文字必須使用 `@lang('key')` 或 `__('key')` 處理。Key 統一採用**英文原始詞彙**,並同步更新 `zh_TW.json`, `en.json`, `ja.json`。必須嚴格遵守「多語系管理與自動對齊規範 (SKILL.md)」,以 `zh_TW.json` 為標準對齊三語系,所有 JSON 檔案須按字母排序 (ksort),且斜線一律使用 `JSON_UNESCAPED_SLASHES` 還原為 `/`,嚴禁逸出為 `\/`。 ## 5. 運行與測試機制 * **啟動環境**:`./vendor/bin/sail up -d` diff --git a/.agents/rules/skill-trigger.md b/.agents/rules/skill-trigger.md index 018bb88..91a61ea 100644 --- a/.agents/rules/skill-trigger.md +++ b/.agents/rules/skill-trigger.md @@ -19,6 +19,7 @@ Skills 位於 `.agents/skills/`,採漸進式揭露以節省 Token。 | 介面, UI, 設計, 佈局, CSS, Tailwind, 奢華, 深色模式, Light Mode, Dark Mode, Blade, 樣式, 間距, 陰影, 動畫, 畫面, 頁面 | **極簡奢華風 UI 實作規範** | `.agents/skills/ui-minimal-luxury/SKILL.md` | | 查詢、撈資料、Query、Controller、下拉選單、Eloquent、N+1、`->get()`、select、交易、Transaction、Bulk、分頁、索引 | **資料庫與 ORM 最佳實踐規範** | `/home/mama/.gemini/antigravity/global_skills/database-best-practices/SKILL.md` | | RBAC, 權限, 角色, 租戶, Tenant, Company, Access Control, 多租戶, 權限控管 | **多租戶與權限架構實作規範** | `.agents/rules/rbac-rules.md` | +| 多語系, 翻譯, 語系檔, lang, json, zh_TW, en, ja, I18n | **多語系管理與自動對齊規範** | `.agents/skills/multilingual-specs/SKILL.md` | --- @@ -42,4 +43,8 @@ Skills 位於 `.agents/skills/`,採漸進式揭露以節省 Token。 ### 🔴 新增或修改 API 與 Controller 撈取資料庫邏輯時 必須讀取: 1. **database-best-practices** — 確認查詢優化、交易安全、批量寫入與索引規範 -2. **rbac-rules** — 確保 `company_id` 隔離邏輯正確套用 \ No newline at end of file +2. **rbac-rules** — 確保 `company_id` 隔離邏輯正確套用 + +### 🔴 新增或修改語系 JSON 檔案(lang/*.json)或執行多語系任務時 +必須讀取: +1. **multilingual-specs** — 確保遵守三語系對齊、字母排序、斜線不逸出規範 \ No newline at end of file diff --git a/.agents/skills/api-technical-specs/SKILL.md b/.agents/skills/api-technical-specs/SKILL.md index 79041d8..be8460c 100644 --- a/.agents/skills/api-technical-specs/SKILL.md +++ b/.agents/skills/api-technical-specs/SKILL.md @@ -234,11 +234,49 @@ description: 本技能規範定義了 Star Cloud 系統中所有機台 (IoT) 與 - `status`: "active"。 > [!WARNING] -> **鎖定機制**:B660, B670 與 B680 若連續錯誤 5 次,該機台將被鎖定驗證功能 1 分鐘。 +> **鎖定機制**:B660, B670, B680 與 B690 若連續錯誤 5 次,該機台將被鎖定驗證功能 1 分鐘。 --- -### 3.12 B027: 贈品碼/優惠券驗證 (Free Gift Verify) +### 3.12 B690: 來店禮驗證 (Welcome Gift Verify) +處理機台端的 8 位數來店禮代碼驗證。成功後回傳折扣資訊供機台端套用折扣。 + +- **URL**: POST /api/v1/app/machine/welcome-gift/verify/B690 +- **Authentication**: Bearer Token (Header) +- **Request Body:** + +| 參數 | 類型 | 必填 | 說明 | 範例 | +| :--- | :--- | :--- | :--- | :--- | +| code | String | 是 | 8 位數來店禮代碼 | "12345678" | + +**Response (Success 200):** + +| 參數 | 類型 | 說明 | 範例 | +| :--- | :--- | :--- | :--- | +| success | Boolean | 請求是否成功 | true | +| code | Integer | 業務狀態碼 | 200 | +| data.name | String | 來店禮名稱 | 新客八五折 | +| data.code_id | Integer | 來店禮 ID (用於 MQTT 交易關聯) | 12 | +| data.discount_type | String | 折扣類型 (percentage / amount) | percentage | +| data.discount_value | Integer | 折扣趴數 (如 15 代表 15% off) 或折扣金額 | 15 | +| data.discount_label | String | 台灣中文折數標籤 (如「八五折」、「折 50 元」) | 八五折 | +| data.usage_type | String | 使用類型 (once / unlimited) | once | +| data.status | String | 狀態 | active | + +**Response (Failed 404):** + +| 參數 | 類型 | 說明 | 範例 | +| :--- | :--- | :--- | :--- | +| success | Boolean | 請求是否成功 | false | +| message | String | 失敗原因 | Invalid or expired code | +| code | Integer | 業務狀態碼 | 404 | +| remaining_attempts | Integer | 剩餘嘗試次數 | 3 | + +- **消耗機制**: 出貨完成後,由機台發送 MQTT `finalize` 訊息,並在 `payment_type` 帶入 `7` (來店禮) 完成扣減。 + +--- + +### 3.14 B027: 贈品碼/優惠券驗證 (Free Gift Verify) 用於處理行銷贈品券、0 元購活動或特定的優惠券核銷流程。 - **URL**: POST /api/v1/app/sell/free-gift/B027 @@ -249,7 +287,7 @@ description: 本技能規範定義了 Star Cloud 系統中所有機台 (IoT) 與 --- -### 3.13 B650: 會員身分驗證 (Member Verification) +### 3.15 B650: 會員身分驗證 (Member Verification) 機台端掃碼後驗證會員身分。 - **URL**: POST /api/v1/app/machine/member/verify/B650 diff --git a/.agents/skills/multilingual-specs/SKILL.md b/.agents/skills/multilingual-specs/SKILL.md new file mode 100644 index 0000000..073e0c1 --- /dev/null +++ b/.agents/skills/multilingual-specs/SKILL.md @@ -0,0 +1,161 @@ +# 多語系管理與自動對齊規範 (Multilingual Specs) + +本技能規範定義了 Star Cloud 系統中所有多語系 JSON 檔案(位於 `lang/`)的維護標準。當專案需要新增、修改或校對多語系時,必須嚴格遵守此規範。 + +--- + +## 核心三大原則 (CRITICAL RULES) + +### 1. 三語系完美對齊 (Master-Align) +- **以 `zh_TW.json` 為唯一標準**:不論任何時候新增或修改翻譯 Key,都必須以 `lang/zh_TW.json` 的鍵值(Keys)集合為絕對標準。 +- **三檔對齊**:`lang/en.json` 與 `lang/ja.json` 的鍵值集合必須與 `zh_TW.json` 百分之百相同(行數、數量與 Key 的拼寫必須完全一致)。 + +### 2. 字母順序排序 (ksort) +- 為避免 Git 版本控制產生大範圍的亂序 Diff,三個 JSON 檔案中的所有鍵值對,必須一律按 **Key 的英文字母升冪順序** 進行排序(類似 PHP 的 `ksort()`)。 + +### 3. 斜線不逸出與美化 (No Escaped Slashes) +- **禁止使用預設 `json_encode` 逸出斜線**:JSON 檔案中的網址或路徑斜線一律使用 `/`,嚴禁產生 `\/`。 +- **儲存格式化要求**: + 在寫入語系 JSON 檔案時,必須使用以下 JSON 編碼參數: + ```php + JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE + ``` + +--- + +## 自動化對齊工具 (I18n Alignment Tool) + +當處理語系變更時,AI 助手應在專案的 `scratch/` 目錄中建立一個臨時 PHP 腳本(例如 `scratch/align_lang.php`),執行對齊並排序後,**立即將其刪除**。 + +### 🔧 臨時對齊腳本範本 (`scratch/align_lang.php`) + +```php + [ + "en" => "Channel Limits Config", + "ja" => "チャンネル制限設定" + ], + "Connection error" => [ + "en" => "Connection error", + "ja" => "接続エラー" + ], + "Passcode settings" => [ + "en" => "Passcode settings", + "ja" => "パスコード設定" + ], + "Reset Passcode" => [ + "en" => "Reset Passcode", + "ja" => "パスコードをリセット" + ], + "Update Passcode" => [ + "en" => "Update Passcode", + "ja" => "パスコードを更新" + ], + "Machine Authorization" => [ + "en" => "Machine Authorization", + "ja" => "デバイス授権" + ], + "Status" => [ + "en" => "Status", + "ja" => "ステータス" + ], + "Actions" => [ + "en" => "Actions", + "ja" => "操作" + ] +]; + +$missingEnCount = 0; +$missingJaCount = 0; + +$newEnData = []; +$newJaData = []; + +// 2. 以 zh_TW 的 keys 為基準對齊 en 與 ja +foreach ($zhData as $key => $zhVal) { + // 處理英文 + if (isset($enData[$key]) && trim($enData[$key]) !== '') { + $newEnData[$key] = $enData[$key]; + } else { + // 嘗試從精準字典查找 + if (isset($translationDict[$key]["en"])) { + $newEnData[$key] = $translationDict[$key]["en"]; + } else { + // fallback: 使用 key 原始名稱作為英文 + $newEnData[$key] = $key; + } + $missingEnCount++; + } + + // 處理日文 + if (isset($jaData[$key]) && trim($jaData[$key]) !== '') { + $newJaData[$key] = $jaData[$key]; + } else { + // 嘗試從精準字典查找 + if (isset($translationDict[$key]["ja"])) { + $newJaData[$key] = $translationDict[$key]["ja"]; + } else { + // fallback: 如果 key 與英文相同,且非中文,可先 fallback 英文,後續再由 LLM 補譯 + $newJaData[$key] = $key; + } + $missingJaCount++; + } +} + +// 3. 字母排序 (ksort) +ksort($zhData); +ksort($newEnData); +ksort($newJaData); + +// 4. 寫回檔案 (反逸出斜線 + Unicode) +$jsonFlags = JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE; + +file_put_contents($zhPath, json_encode($zhData, $jsonFlags) . "\n"); +file_put_contents($enPath, json_encode($newEnData, $jsonFlags) . "\n"); +file_put_contents($jaPath, json_encode($newJaData, $jsonFlags) . "\n"); + +echo "✅ 多語系處理完畢!\n"; +echo "📊 統計結果:\n"; +echo " - 總共鍵數: " . count($zhData) . " 個\n"; +echo " - 補齊英文空缺: {$missingEnCount} 個\n"; +echo " - 補齊日文空缺: {$missingJaCount} 個\n"; +``` + +--- + +## 💡 AI 助手處理語系之 SOP 流程 + +當使用者要求修改或補齊語系時,AI 必須: + +1. **同步更新/新增 `zh_TW.json`**:將新的詞彙加入 `zh_TW.json` 中。 +2. **利用 LLM 翻譯補足空缺**: + - 針對新加入的詞彙,由 AI 運用其 LLM 能力將高品質的英文(`en`)與日文(`ja`)翻譯出來。 +3. **擴充對齊腳本的暫存字典**: + - 將這些新翻譯的詞彙暫時寫入臨時對齊腳本 `scratch/align_lang.php` 中的 `$translationDict` 中。 +4. **執行一鍵對齊與字母排序**: + - 在終端機執行 `php scratch/align_lang.php`,確保三個語系 JSON 檔案行數百分之百對齊、全部排序、斜線清空。 +5. **清理暫存**: + - 刪除 `scratch/align_lang.php`。 +6. **Git 檢查與提交**: + - 執行 `git diff` 確認修改範疇僅限於新增的語系,無亂序與無關的語系被刪除。 diff --git a/app/Http/Controllers/Admin/SalesController.php b/app/Http/Controllers/Admin/SalesController.php index 1e11f8e..1454fad 100644 --- a/app/Http/Controllers/Admin/SalesController.php +++ b/app/Http/Controllers/Admin/SalesController.php @@ -13,6 +13,8 @@ use App\Models\Transaction\PickupCode; use App\Models\Transaction\PickupCodeLog; use App\Models\Transaction\PassCode; use App\Models\Transaction\PassCodeLog; +use App\Models\Transaction\WelcomeGift; +use App\Models\Transaction\WelcomeGiftLog; use App\Models\Machine\Machine; use Carbon\Carbon; use Illuminate\Support\Facades\Auth; @@ -596,12 +598,262 @@ class SalesController extends Controller } // 來店禮設定 - public function storeGifts() + public function storeGifts(Request $request) { - return view('admin.placeholder', [ + $tab = $request->input('tab', 'list'); + $isAjax = $request->ajax(); + + $data = [ 'title' => '來店禮設定', - 'description' => '來店優惠活動設定', + 'description' => '來店禮優惠碼管理 (單次與無限制來店優惠折抵)', + 'tab' => $tab, + ]; + + // 1. 來店禮列表 (list) + if (!$isAjax || $tab === 'list') { + $query = WelcomeGift::with(['machine', 'creator'])->latest(); + + if ($request->search) { + $query->where(function ($q) use ($request) { + $q->where('code', 'like', "%{$request->search}%") + ->orWhere('name', 'like', "%{$request->search}%") + ->orWhereHas('machine', function ($mq) use ($request) { + $mq->where('name', 'like', "%{$request->search}%") + ->orWhere('serial_no', 'like', "%{$request->search}%"); + }); + }); + } + + if ($request->status && trim($request->status) !== '') { + $status = trim($request->status); + if ($status === 'active') { + $query->where('status', 'active') + ->where(function ($q) { + $q->whereNull('expires_at') + ->orWhere('expires_at', '>', now()); + }); + } elseif ($status === 'expired') { + $query->where('status', 'active') + ->whereNotNull('expires_at') + ->where('expires_at', '<=', now()); + } else { + $query->where('status', $status); + } + } + + $data['welcomeGifts'] = $query->paginate($request->input('per_page', 10), ['*'], 'list_page')->withQueryString(); + $data['machines'] = Machine::all(); + } + + // 2. 操作紀錄 (logs) + if (!$isAjax || $tab === 'logs') { + $logQuery = WelcomeGiftLog::with(['machine:id,name,serial_no', 'welcomeGift', 'order:id,order_no']); + + if ($request->filled('search_log')) { + $search = $request->input('search_log'); + $logQuery->where(function ($q) use ($search) { + $q->where('remark', 'like', "%{$search}%") + ->orWhereHas('welcomeGift', function($pq) use ($search) { + $pq->where('code', 'like', "%{$search}%") + ->orWhere('name', 'like', "%{$search}%"); + }); + }); + } + + if ($request->filled('action')) { + $logQuery->where('action', $request->action); + } + + // 日期區間篩選 (6 個月限制) + $startDate = $request->input('start_date'); + $endDate = $request->input('end_date'); + + if (!$startDate && !$endDate) { + $logQuery->where('created_at', '>=', now()->subMonths(6)); + } else { + try { + if ($startDate) { + $logQuery->where('created_at', '>=', \Carbon\Carbon::parse($startDate)->startOfMinute()); + } + if ($endDate) { + $logQuery->where('created_at', '<=', \Carbon\Carbon::parse($endDate)->endOfMinute()); + } + } catch (\Exception $e) { } + } + + $data['logs'] = $logQuery->latest() + ->paginate($request->input('per_page', 10), ['*'], 'log_page') + ->withQueryString(); + + // 定義可用動作 + $data['actions'] = [ + 'verify_success' => __('verify_success'), + 'consume' => __('consume'), + 'cancel' => __('cancel'), + ]; + } + + if ($isAjax) { + return response()->json([ + 'success' => true, + 'tab' => $tab, + 'html' => view('admin.sales.welcome-gifts.partials.tab-' . $tab, $data)->render() + ]); + } + + return view('admin.sales.welcome-gifts.index', $data); + } + + /** + * 新增來店禮 + */ + public function storeWelcomeGift(Request $request) + { + $validated = $request->validate([ + 'machine_id' => 'required|exists:machines,id', + 'name' => 'required|string|max:100', + 'discount_type' => 'required|in:percentage,amount', + 'discount_val_input' => 'required|numeric|min:0.1', // 接受折數 (如 8.5) 或 金額 (如 50) + 'usage_type' => 'required|in:once,unlimited', + 'usage_limit' => 'nullable|integer|min:1', + 'expires_at' => 'nullable|date|after:now', + 'custom_code' => 'nullable|string|min:4|max:10', ]); + + $machine = Machine::findOrFail($validated['machine_id']); + + // 關鍵自動換算邏輯 + $discountValue = 0; + if ($validated['discount_type'] === 'percentage') { + // 使用者輸入折數 (如 8 代表打八折,8.5 代表打八五折) + $fold = (float) $validated['discount_val_input']; + // 換算為趴數,公式為 (10 - 折數) * 10 ➜ 例如 8.5折 ➜ (10 - 8.5) * 10 = 15% off + $discountValue = (int) round((10 - $fold) * 10); + } else { + // 金額折抵 (如 50 代表折 50 元) + $discountValue = (int) $validated['discount_val_input']; + } + + $welcomeGift = WelcomeGift::create([ + 'machine_id' => $validated['machine_id'], + 'name' => $validated['name'], + 'code' => $validated['custom_code'] ?? WelcomeGift::generateUniqueCode($validated['machine_id']), + 'discount_type' => $validated['discount_type'], + 'discount_value' => $discountValue, + 'usage_type' => $validated['usage_type'], + 'usage_limit' => $validated['usage_type'] === 'once' ? ($validated['usage_limit'] ?? 1) : null, + 'expires_at' => $validated['expires_at'], + 'status' => 'active', + 'company_id' => $machine->company_id, + 'created_by' => Auth::id(), + ]); + + SystemOperationLog::create([ + 'company_id' => $machine->company_id, + 'user_id' => Auth::id(), + 'module' => 'welcome_gift', + 'action' => 'create', + 'target_id' => $welcomeGift->id, + 'target_type' => WelcomeGift::class, + 'new_values' => $welcomeGift->toArray(), + ]); + + return back()->with('success', __('Welcome Gift created successfully.')); + } + + /** + * 更新來店禮 + */ + public function updateWelcomeGift(Request $request, WelcomeGift $welcomeGift) + { + $validated = $request->validate([ + 'name' => 'nullable|string|max:100', + 'discount_type' => 'nullable|in:percentage,amount', + 'discount_val_input' => 'nullable|numeric|min:0.1', + 'expires_at' => 'nullable|date', + 'status' => 'nullable|in:active,disabled', + 'usage_type' => 'nullable|in:once,unlimited', + 'usage_limit' => 'nullable|integer|min:1', + ]); + + if (isset($validated['expires_at']) && empty($validated['expires_at'])) { + $validated['expires_at'] = null; + } + + $oldValues = $welcomeGift->toArray(); + + // 整理要更新的資料 + $updateData = []; + if ($request->has('name')) { + $updateData['name'] = $validated['name']; + } + if ($request->has('status')) { + $updateData['status'] = $validated['status']; + } + if ($request->has('expires_at')) { + $updateData['expires_at'] = $validated['expires_at']; + } + if ($request->has('usage_type')) { + $updateData['usage_type'] = $validated['usage_type']; + if ($validated['usage_type'] === 'unlimited') { + $updateData['usage_limit'] = null; + } elseif ($request->has('usage_limit')) { + $updateData['usage_limit'] = $validated['usage_limit']; + } + } elseif ($request->has('usage_limit') && $welcomeGift->usage_type === 'once') { + $updateData['usage_limit'] = $validated['usage_limit']; + } + + // 折扣折數/金額更新 + if ($request->has('discount_type') || $request->has('discount_val_input')) { + $discountType = $validated['discount_type'] ?? $welcomeGift->discount_type; + $discountValInput = $validated['discount_val_input'] ?? ($discountType === 'percentage' ? $welcomeGift->input_fold : $welcomeGift->discount_value); + + $updateData['discount_type'] = $discountType; + if ($discountType === 'percentage') { + $fold = (float) $discountValInput; + $updateData['discount_value'] = (int) round((10 - $fold) * 10); + } else { + $updateData['discount_value'] = (int) $discountValInput; + } + } + + $welcomeGift->update($updateData); + + SystemOperationLog::create([ + 'company_id' => $welcomeGift->company_id, + 'user_id' => Auth::id(), + 'module' => 'welcome_gift', + 'action' => 'update', + 'target_id' => $welcomeGift->id, + 'target_type' => WelcomeGift::class, + 'old_values' => $oldValues, + 'new_values' => $welcomeGift->toArray(), + ]); + + return back()->with('success', __('Welcome Gift updated.')); + } + + /** + * 刪除來店禮 (改為停用) + */ + public function destroyWelcomeGift(WelcomeGift $welcomeGift) + { + $oldValues = $welcomeGift->toArray(); + $welcomeGift->update(['status' => 'disabled']); + + SystemOperationLog::create([ + 'company_id' => $welcomeGift->company_id, + 'user_id' => Auth::id(), + 'module' => 'welcome_gift', + 'action' => 'cancel', + 'target_id' => $welcomeGift->id, + 'target_type' => WelcomeGift::class, + 'old_values' => $oldValues, + 'new_values' => $welcomeGift->toArray(), + ]); + + return back()->with('success', __('Welcome Gift cancelled.')); } /** diff --git a/app/Http/Controllers/Api/V1/App/MachineController.php b/app/Http/Controllers/Api/V1/App/MachineController.php index b8dfab8..e542cc5 100644 --- a/app/Http/Controllers/Api/V1/App/MachineController.php +++ b/app/Http/Controllers/Api/V1/App/MachineController.php @@ -20,6 +20,8 @@ use App\Models\Transaction\PassCode; use App\Models\StaffCard; use App\Models\StaffCardLog; use App\Models\Transaction\PassCodeLog; +use App\Models\Transaction\WelcomeGift; +use App\Models\Transaction\WelcomeGiftLog; use App\Models\System\SystemOperationLog; use App\Services\Machine\MachineService; use App\Services\Product\ProductCatalogService; @@ -641,4 +643,73 @@ class MachineController extends Controller ] ]); } + + /** + * B690: Verify Welcome Gift (New) + */ + public function verifyWelcomeGift(Request $request) + { + $machine = $request->get('machine'); + $lockoutKey = "welcome_gift_lockout:{$machine->id}"; + + if (Cache::has($lockoutKey)) { + return response()->json(['success' => false, 'message' => 'Too many attempts. Locked.', 'code' => 429], 429); + } + + $validator = Validator::make($request->all(), ['code' => 'required|string|size:8']); + if ($validator->fails()) { + return response()->json(['success' => false, 'message' => 'Invalid format', 'code' => 400], 400); + } + + $code = $request->input('code'); + $gift = WelcomeGift::where('machine_id', $machine->id) + ->where('code', $code) + ->where('status', 'active') + ->where(function ($q) { + $q->whereNull('expires_at')->orWhere('expires_at', '>', now()); + }) + ->first(); + + if (!$gift || !$gift->isValid()) { + $fails = Cache::increment("welcome_gift_fails:{$machine->id}"); + if ($fails === 1) { + Cache::put("welcome_gift_fails:{$machine->id}", 1, 600); + } + if ($fails >= 5) { + Cache::put($lockoutKey, true, 60); + Cache::forget("welcome_gift_fails:{$machine->id}"); + } + return response()->json(['success' => false, 'message' => 'Invalid or expired code', 'code' => 404, 'remaining_attempts' => max(0, 5 - $fails)], 404); + } + + Cache::forget("welcome_gift_fails:{$machine->id}"); + + // 建立來店禮驗證日誌 (驗證成功) + WelcomeGiftLog::create([ + 'company_id' => $machine->company_id, + 'machine_id' => $machine->id, + 'welcome_gift_id' => $gift->id, + 'action' => 'verify_success', + 'remark' => 'log.welcome_gift.verify_success', + 'raw_data' => [ + 'code' => $gift->code, + 'discount_type' => $gift->discount_type, + 'discount_value' => $gift->discount_value + ] + ]); + + return response()->json([ + 'success' => true, + 'code' => 200, + 'data' => [ + 'name' => $gift->name, + 'code_id' => $gift->id, + 'discount_type' => $gift->discount_type, + 'discount_value' => $gift->discount_value, + 'discount_label' => $gift->discount_label, // 回傳自動算好的中文折數 (如「八折」、「折50元」) + 'usage_type' => $gift->usage_type, + 'status' => 'active' + ] + ]); + } } diff --git a/app/Http/Controllers/Guest/WelcomeGiftController.php b/app/Http/Controllers/Guest/WelcomeGiftController.php new file mode 100644 index 0000000..6266c44 --- /dev/null +++ b/app/Http/Controllers/Guest/WelcomeGiftController.php @@ -0,0 +1,26 @@ +where('slug', $slug) + ->where('status', 'active') + ->where(function ($query) { + $query->whereNull('expires_at') + ->orWhere('expires_at', '>', now()); + }) + ->firstOrFail(); + + return view('guest.welcome-gift.show', compact('welcomeGift')); + } +} diff --git a/app/Models/Transaction/Order.php b/app/Models/Transaction/Order.php index 9005260..9f90a6e 100644 --- a/app/Models/Transaction/Order.php +++ b/app/Models/Transaction/Order.php @@ -36,6 +36,7 @@ class Order extends Model 'payment_at', 'member_barcode', 'code_id', + 'welcome_gift_id', 'invoice_info', 'machine_time', 'status', @@ -141,4 +142,9 @@ class Order extends Model { return $this->hasOne(\App\Models\StaffCardLog::class); } + + public function welcomeGift() + { + return $this->belongsTo(WelcomeGift::class); + } } diff --git a/app/Models/Transaction/WelcomeGift.php b/app/Models/Transaction/WelcomeGift.php new file mode 100644 index 0000000..6e20172 --- /dev/null +++ b/app/Models/Transaction/WelcomeGift.php @@ -0,0 +1,153 @@ + 'datetime', + 'discount_value' => 'integer', + ]; + + protected $appends = ['discount_label', 'input_fold']; + + /** + * 獲取公開來店禮連結 + */ + public function getTicketUrlAttribute() + { + return $this->slug ? route('welcome-gift.ticket', $this->slug) : null; + } + + protected static function booted() + { + static::creating(function ($gift) { + if (!$gift->slug) { + $gift->slug = \Illuminate\Support\Str::random(16); + } + }); + } + + /** + * 後台編輯時回填使用的折數 (如趴數 20 換算回 8 折,15 換算回 8.5 折) + */ + public function getInputFoldAttribute() + { + if ($this->discount_type !== 'percentage') { + return null; + } + return (100 - $this->discount_value) / 10; + } + + /** + * 自動轉換為台灣消費者習慣的折數標籤 (例如:八折、八五折、折 50 元) + */ + public function getDiscountLabelAttribute(): string + { + if ($this->discount_type === 'amount') { + return "折 {$this->discount_value} 元"; + } + + if ($this->discount_type === 'percentage') { + $fold = $this->input_fold; + return $this->convertToChineseDiscount($fold); + } + + return ''; + } + + private function convertToChineseDiscount($fold): string + { + $map = [ + '1' => '一', '2' => '二', '3' => '三', '4' => '四', '5' => '五', + '6' => '六', '7' => '七', '8' => '八', '9' => '九', '0' => '零' + ]; + + $foldStr = (string)$fold; + if (strpos($foldStr, '.') !== false) { + list($integer, $decimal) = explode('.', $foldStr); + $intChar = $map[$integer] ?? $integer; + $decChar = $map[substr($decimal, 0, 1)] ?? substr($decimal, 0, 1); + return "{$intChar}{$decChar}折"; + } + + $char = $map[$foldStr] ?? $foldStr; + return "{$char}折"; + } + + /** + * 關聯機台 + */ + public function machine(): BelongsTo + { + return $this->belongsTo(Machine::class); + } + + /** + * 關聯建立者 + */ + public function creator(): BelongsTo + { + return $this->belongsTo(User::class, 'created_by'); + } + + /** + * 判斷是否可用 + */ + public function isValid(): bool + { + if ($this->status !== 'active') { + return false; + } + + if ($this->expires_at && $this->expires_at->isPast()) { + return false; + } + + if ($this->usage_type === 'once' && $this->usage_count >= ($this->usage_limit ?? 1)) { + return false; + } + + return true; + } + + /** + * 產生唯一的來店禮代碼 (8位) + */ + public static function generateUniqueCode(int $machineId): string + { + do { + $code = str_pad(rand(0, 99999999), 8, '0', STR_PAD_LEFT); + $exists = self::where('machine_id', $machineId) + ->where('code', $code) + ->where('status', 'active') + ->exists(); + } while ($exists); + + return $code; + } +} diff --git a/app/Models/Transaction/WelcomeGiftLog.php b/app/Models/Transaction/WelcomeGiftLog.php new file mode 100644 index 0000000..d122591 --- /dev/null +++ b/app/Models/Transaction/WelcomeGiftLog.php @@ -0,0 +1,56 @@ + 'array', + ]; + + /** + * 關聯來店禮 + */ + public function welcomeGift(): BelongsTo + { + return $this->belongsTo(WelcomeGift::class); + } + + /** + * 關聯機台 + */ + public function machine(): BelongsTo + { + return $this->belongsTo(Machine::class); + } + + /** + * 關聯訂單 + */ + public function order(): BelongsTo + { + return $this->belongsTo(Order::class); + } + + /** + * 關聯操作人員(一般是系統透過訂單綁定或背景核銷,如有操作人可由關聯取得,通常從 Order 或由 SystemOperationLog 獲取) + */ +} diff --git a/app/Services/Transaction/TransactionService.php b/app/Services/Transaction/TransactionService.php index 6f5393a..53dbc14 100644 --- a/app/Services/Transaction/TransactionService.php +++ b/app/Services/Transaction/TransactionService.php @@ -12,6 +12,8 @@ use App\Models\StaffCardLog; use App\Models\Transaction\PickupCode; use App\Models\Transaction\PickupCodeLog; use App\Models\Transaction\PassCodeLog; +use App\Models\Transaction\WelcomeGift; +use App\Models\Transaction\WelcomeGiftLog; use Illuminate\Support\Facades\Log; use App\Services\Machine\MachineService; @@ -63,6 +65,7 @@ class TransactionService 'payment_response' => $data['payment_response'] ?? null, 'member_barcode' => $data['member_barcode'] ?? null, 'code_id' => $data['code_id'] ?? null, + 'welcome_gift_id' => $data['welcome_gift_id'] ?? null, 'invoice_info' => $data['invoice_info'] ?? null, 'machine_time' => $data['machine_time'] ?? now(), 'payment_at' => now(), @@ -346,6 +349,38 @@ class TransactionService } } + // 處理來店禮 (Welcome Gift) 自動核銷 + $welcomeGiftId = $data['order']['welcome_gift_id'] ?? ($data['welcome_gift_id'] ?? null); + if ($welcomeGiftId) { + $welcomeGift = WelcomeGift::where('machine_id', $order->machine_id) + ->where('id', $welcomeGiftId) + ->where('status', 'active') + ->first(); + if ($welcomeGift) { + $newCount = $welcomeGift->usage_count + 1; + $isUsedUp = ($welcomeGift->usage_type === 'once' && $newCount >= ($welcomeGift->usage_limit ?? 1)); + + $welcomeGift->update([ + 'usage_count' => $newCount, + 'status' => $isUsedUp ? 'used' : 'active', + ]); + + WelcomeGiftLog::create([ + 'company_id' => $order->company_id, + 'machine_id' => $order->machine_id, + 'welcome_gift_id' => $welcomeGift->id, + 'order_id' => $order->id, + 'action' => 'consume', + 'remark' => "MQTT 交易完成自動核銷,訂單: #{$order->id}", + 'raw_data' => [ + 'code' => $welcomeGift->code, + 'count' => $newCount, + 'type' => $welcomeGift->usage_type + ] + ]); + } + } + return $order; }); diff --git a/config/api-docs.php b/config/api-docs.php index a76d248..c107aff 100644 --- a/config/api-docs.php +++ b/config/api-docs.php @@ -409,30 +409,87 @@ return [ 'notes' => '驗證成功後會建立刷卡日誌。連續錯誤同樣會觸發鎖定。' ], [ - 'name' => 'B027: 贈品碼/優惠券驗證 (Free Gift Verify)', - 'slug' => 'b027-freebie-code', + 'name' => 'B690: 來店禮驗證 (Welcome Gift Verify)', + 'slug' => 'b690-welcome-gift-verify', 'method' => 'POST', - 'path' => '/api/v1/app/sell/free-gift/B027', - 'description' => '驗證贈品券有效性。成功後回傳對應資訊,正式消耗改由 MQTT finalize 處理。', + 'path' => '/api/v1/app/machine/welcome-gift/verify/B690', + 'description' => '處理機台端的 8 位數來店禮代碼驗證。成功後回傳折扣資訊(含台灣中文折數標籤),供機台端套用折扣。正式消耗改由 MQTT finalize 處理 (payment_type=7)。', 'headers' => [ 'Authorization' => 'Bearer ', 'Content-Type' => 'application/json', ], 'parameters' => [ - 'passCode' => [ + 'code' => [ 'type' => 'string', - 'description' => '贈品碼/優惠券代碼', - 'example' => 'FREE888' + 'required' => true, + 'description' => '8 位數來店禮代碼', + 'example' => '12345678' + ] + ], + 'response_parameters' => [ + 'success' => [ + 'type' => 'boolean', + 'description' => '請求是否成功', + 'example' => true ], + 'code' => [ + 'type' => 'integer', + 'description' => '業務狀態碼', + 'example' => 200 + ], + 'data.name' => [ + 'type' => 'string', + 'description' => '來店禮名稱', + 'example' => '新客八五折' + ], + 'data.code_id' => [ + 'type' => 'integer', + 'description' => '來店禮 ID (用於 MQTT 交易關聯,payment_type=7 時帶入)', + 'example' => 12 + ], + 'data.discount_type' => [ + 'type' => 'string', + 'description' => '折扣類型:percentage (趴數折扣) 或 amount (金額折扣)', + 'example' => 'percentage' + ], + 'data.discount_value' => [ + 'type' => 'integer', + 'description' => '折扣數值。percentage 時為趴數 (如 15 代表 15% off);amount 時為折扣金額 (如 50)', + 'example' => 15 + ], + 'data.discount_label' => [ + 'type' => 'string', + 'description' => '台灣中文折數標籤 (如「八五折」、「折 50 元」),供 UI 直接顯示', + 'example' => '八五折' + ], + 'data.usage_type' => [ + 'type' => 'string', + 'description' => '使用類型:once (單次) 或 unlimited (無限制)', + 'example' => 'once' + ], + 'data.status' => [ + 'type' => 'string', + 'description' => '來店禮狀態', + 'example' => 'active' + ], + ], + 'request' => [ + 'code' => '12345678' ], 'response' => [ 'success' => true, + 'code' => 200, 'data' => [ - 'res1' => 'cloud_id_123', - 'message' => 'Free gift verified' + 'name' => '新客八五折', + 'code_id' => 12, + 'discount_type' => 'percentage', + 'discount_value' => 15, + 'discount_label' => '八五折', + 'usage_type' => 'once', + 'status' => 'active' ] ], - 'notes' => '消耗流程已遷移至 MQTT。' + 'notes' => '安全性:連續錯誤 5 次將鎖定該機台驗證功能 1 分鐘。消耗流程已遷移至 MQTT (payment_type=7)。' ], ], ], diff --git a/database/migrations/2026_05_22_105822_create_welcome_gifts_table.php b/database/migrations/2026_05_22_105822_create_welcome_gifts_table.php new file mode 100644 index 0000000..d8471d3 --- /dev/null +++ b/database/migrations/2026_05_22_105822_create_welcome_gifts_table.php @@ -0,0 +1,55 @@ +id(); + $table->foreignId('company_id')->constrained('companies')->onDelete('cascade'); + $table->foreignId('machine_id')->constrained('machines')->onDelete('cascade'); + $table->string('name', 100)->comment('來店禮名稱'); + $table->string('code', 10)->comment('來店禮代碼 (8位)'); + $table->string('slug', 16)->unique()->comment('票券 Slug'); + $table->string('discount_type')->comment('折扣類型: percentage (趴數), amount (金額)'); + $table->integer('discount_value')->comment('折扣值 (趴數或折抵金額)'); + $table->string('usage_type')->default('once')->comment('使用次數: once (單次), unlimited (無限制)'); + $table->integer('usage_limit')->nullable()->default(1)->comment('使用次數上限'); + $table->integer('usage_count')->default(0)->comment('已使用次數'); + $table->timestamp('expires_at')->nullable()->comment('到期時間'); + $table->string('status')->default('active')->comment('狀態: active, disabled, used, expired'); + $table->foreignId('created_by')->nullable()->constrained('users')->onDelete('set null'); + $table->timestamps(); + + $table->index(['company_id', 'machine_id', 'code', 'status']); + }); + + Schema::create('welcome_gift_logs', function (Blueprint $table) { + $table->id(); + $table->foreignId('company_id')->constrained('companies')->onDelete('cascade'); + $table->foreignId('machine_id')->constrained('machines')->onDelete('cascade'); + $table->foreignId('welcome_gift_id')->constrained('welcome_gifts')->onDelete('cascade'); + $table->foreignId('order_id')->nullable()->constrained('orders')->onDelete('set null'); + $table->string('action')->comment('動作: verify_success, consume, cancel'); + $table->string('remark')->nullable(); + $table->json('raw_data')->nullable(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('welcome_gift_logs'); + Schema::dropIfExists('welcome_gifts'); + } +}; diff --git a/database/migrations/2026_05_22_105826_add_welcome_gift_id_to_orders_table.php b/database/migrations/2026_05_22_105826_add_welcome_gift_id_to_orders_table.php new file mode 100644 index 0000000..9c370d9 --- /dev/null +++ b/database/migrations/2026_05_22_105826_add_welcome_gift_id_to_orders_table.php @@ -0,0 +1,33 @@ +foreignId('welcome_gift_id') + ->nullable() + ->after('code_id') + ->constrained('welcome_gifts') + ->onDelete('set null'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('orders', function (Blueprint $table) { + $table->dropForeign(['welcome_gift_id']); + $table->dropColumn('welcome_gift_id'); + }); + } +}; diff --git a/lang/en.json b/lang/en.json index 404ea2c..4238d39 100644 --- a/lang/en.json +++ b/lang/en.json @@ -5,6 +5,7 @@ "30s": "30s", "60 Seconds": "60 Seconds", "60s": "60s", + ":count staff cards imported successfully": ":count staff cards imported successfully", "A new verification link has been sent to your email address.": "A new verification link has been sent to your email address.", "A sync command was recently sent. Please wait 1 minute.": "A sync command was recently sent. Please wait 1 minute.", "AI Prediction": "AI Prediction", @@ -31,13 +32,15 @@ "Account deleted successfully.": "Account deleted successfully.", "Account updated successfully.": "Account updated successfully.", "Account:": "Account:", - "Accounts \/ Machines": "Accounts \/ Machines", + "Accounts / Machines": "Accounts / Machines", + "Accumulated dynamic product purchase cost": "Accumulated dynamic product purchase cost", "Action": "Action", - "Action \/ Target": "Action \/ Target", + "Action / Target": "Action / Target", "Actions": "Actions", "Active": "Active", "Active Slots": "Active Slots", "Active Status": "Active Status", + "Actual Qty": "Actual Qty", "Ad Settings": "Ad Settings", "Add Account": "Add Account", "Add Advertisement": "Add Advertisement", @@ -54,6 +57,7 @@ "Add Role": "Add Role", "Add Staff Card": "Add Staff Card", "Add Warehouse": "Add Warehouse", + "Add Welcome Gift": "Add Welcome Gift", "Add new inventory items to your warehouse": "Add new inventory items to your warehouse", "Address": "Address", "Adjust Inventory": "Adjust Inventory", @@ -68,7 +72,7 @@ "Administrator": "Administrator", "Advertisement List": "Advertisement List", "Advertisement Management": "Advertisement Management", - "Advertisement Video\/Image": "Advertisement Video\/Image", + "Advertisement Video/Image": "Advertisement Video/Image", "Advertisement assigned successfully": "Advertisement assigned successfully", "Advertisement assigned successfully.": "Advertisement assigned successfully.", "Advertisement created successfully": "Advertisement created successfully", @@ -78,11 +82,16 @@ "Advertisement status updated to :status": "Advertisement status updated to :status", "Advertisement updated successfully": "Advertisement updated successfully", "Advertisement updated successfully.": "Advertisement updated successfully.", + "Affected Slot": "Affected Slot", "Affiliated Company": "Affiliated Company", "Affiliated Unit": "Affiliated Unit", "Affiliation": "Affiliation", "After Qty": "After Qty", + "Alert Severity Levels": "Alert Severity Levels", "Alert Summary": "Alert Summary", + "Alert Switch": "Alert Switch", + "Alert Types": "Alert Types", + "Alert Types Source": "Alert Types Source", "Alerts": "Alerts", "Alerts Pending": "Alerts Pending", "Alerts Today": "Alerts Today", @@ -95,6 +104,7 @@ "All Machines": "All Machines", "All Normal": "All Normal", "All Permissions": "All Permissions", + "All Products (ALL)": "All Products (ALL)", "All Slots": "All Slots", "All Stable": "All Stable", "All Status": "All Status", @@ -106,10 +116,14 @@ "All issues marked as resolved.": "All issues marked as resolved.", "All slots are fully stocked": "All slots are fully stocked", "Amount": "Amount", - "Amount \/ Payment": "Amount \/ Payment", + "Amount / Payment": "Amount / Payment", + "Amount Discount": "Amount Discount", + "An error occurred during testing.": "An error occurred during testing.", "An error occurred while saving.": "An error occurred while saving.", + "An error occurred: ": "An error occurred: ", "Analysis Management": "Analysis Management", "Analysis Permissions": "Analysis Permissions", + "Analyze Solely": "Analyze Solely", "Apply changes to all identical products in this machine": "Apply changes to all identical products in this machine", "Apply to all identical products in this machine": "Apply to all identical products in this machine", "Approved At": "Approved At", @@ -162,6 +176,7 @@ "Assign replenishment staff": "Assign replenishment staff", "Assign warehouse managers": "Assign warehouse managers", "Assigned Machines": "Assigned Machines", + "Assigned Personnel": "Assigned Personnel", "Assigned To": "Assigned To", "Assignment removed successfully.": "Assignment removed successfully.", "Associated Order": "Associated Order", @@ -186,7 +201,7 @@ "Back to List": "Back to List", "Badge Settings": "Badge Settings", "Barcode": "Barcode", - "Barcode \/ Material": "Barcode \/ Material", + "Barcode / Material": "Barcode / Material", "Based on Hours": "Based on Hours", "Basic Information": "Basic Information", "Basic Settings": "Basic Settings", @@ -207,6 +222,7 @@ "CREATE STOCK TRANSFERS BETWEEN WAREHOUSES AND MACHINE RETURNS": "CREATE STOCK TRANSFERS BETWEEN WAREHOUSES AND MACHINE RETURNS", "Calculate Replenishment": "Calculate Replenishment", "Cancel": "Cancel", + "Cancel Gift": "Cancel Gift", "Cancel Order": "Cancel Order", "Cancel Pass Code": "Cancel Pass Code", "Cancel Pickup Code": "Cancel Pickup Code", @@ -243,12 +259,15 @@ "Change Note": "Change Note", "Change Stock": "Change Stock", "Channel Limits": "Channel Limits", - "Channel Limits (Track\/Spring)": "Channel Limits (Track\/Spring)", + "Channel Limits (Track/Spring)": "Channel Limits (Track/Spring)", + "Channel Limits Config": "Channel Limits Config", "Channel Limits Configuration": "Channel Limits Configuration", "ChannelId": "ChannelId", "ChannelSecret": "ChannelSecret", + "Check": "Check", "Checkout Time 1": "Checkout Time 1", "Checkout Time 2": "Checkout Time 2", + "Choose Date": "Choose Date", "Clear": "Clear", "Clear Abnormal Status": "Clear Abnormal Status", "Clear Filter": "Clear Filter", @@ -261,8 +280,8 @@ "Code": "Code", "Code Copied": "Code Copied", "Coin Acceptor": "Coin Acceptor", - "Coin\/Banknote Machine": "Coin\/Banknote Machine", - "Coin\/Bill Acceptor": "Coin\/Bill Acceptor", + "Coin/Banknote Machine": "Coin/Banknote Machine", + "Coin/Bill Acceptor": "Coin/Bill Acceptor", "Command Center": "Command Center", "Command Confirmation": "Command Confirmation", "Command Type": "Command Type", @@ -272,14 +291,20 @@ "Command queued successfully.": "Command queued successfully.", "Company": "Company", "Company Code": "Company Code", + "Company Discord notification settings updated successfully.": "Company Discord notification settings updated successfully.", + "Company Info": "Company Info", "Company Information": "Company Information", "Company Level": "Company Level", "Company Name": "Company Name", + "Company Settings": "Company Settings", "Complete movement history log": "Complete movement history log", "Completed": "Completed", "Completed At": "Completed At", "Config Name": "Config Name", "Configuration Name": "Configuration Name", + "Configure Discord Webhook alerts for hardware exceptions and connectivity logs": "Configure Discord Webhook alerts for hardware exceptions and connectivity logs", + "Configure alert types and temperature thresholds": "Configure alert types and temperature thresholds", + "Configured Alert Types": "Configured Alert Types", "Confirm": "Confirm", "Confirm Account Deactivation": "Confirm Account Deactivation", "Confirm Account Status Change": "Confirm Account Status Change", @@ -302,8 +327,12 @@ "Confirm this transfer?": "Confirm this transfer?", "Connected": "Connected", "Connecting...": "Connecting...", + "Connection error": "Connection error", + "Connection is unstable (disconnected :count times in the last hour)": "Connection is unstable (disconnected :count times in the last hour)", "Connection lost (LWT)": "Connection lost (LWT)", + "Connection recovery alerts and normal logs.": "Connection recovery alerts and normal logs.", "Connection restored": "Connection restored", + "Connectivity Logs": "Connectivity Logs", "Connectivity Status": "Connectivity Status", "Connectivity vs Sales Correlation": "Connectivity vs Sales Correlation", "Consumed": "Consumed", @@ -325,8 +354,12 @@ "Copy": "Copy", "Copy Code": "Copy Code", "Copy Link": "Copy Link", + "Copy Settings From Another Machine": "Copy Settings From Another Machine", + "Copy to Clipboard": "Copy to Clipboard", "Cost": "Cost", "Coupons": "Coupons", + "Courier/Dispatcher": "Courier/Dispatcher", + "Courier/Replenisher": "Courier/Replenisher", "Create": "Create", "Create Config": "Create Config", "Create Machine": "Create Machine", @@ -349,17 +382,31 @@ "Creation Time": "Creation Time", "Creator": "Creator", "Credit Card": "Credit Card", - "Credit Card \/ Contactless": "Credit Card \/ Contactless", + "Credit Card / Contactless": "Credit Card / Contactless", "Critical": "Critical", + "Critical failures requiring immediate hands-on attention.": "Critical failures requiring immediate hands-on attention.", + "Cross-Company / Headquarter Global Stats": "Cross-Company / Headquarter Global Stats", "Current": "Current", "Current Password": "Current Password", "Current Status": "Current Status", "Current Stock": "Current Stock", "Current Stocks": "Current Stocks", + "Current Temperature": "Current Temperature", "Current Type": "Current Type", + "Current data indicates a loss": "Current data indicates a loss", + "Current temperature (:temp°C) is above the upper limit (:limit°C).": "Current temperature (:temp°C) is above the upper limit (:limit°C).", + "Current temperature (:temp°C) is below the lower limit (:limit°C).": "Current temperature (:temp°C) is below the lower limit (:limit°C).", + "Current temperature has returned to normal range (:temp°C).": "Current temperature has returned to normal range (:temp°C).", "Current:": "Current:", + "Custom": "Custom", + "Custom Alert Types": "Custom Alert Types", "Custom Date": "Custom Date", "Custom Date Set": "Custom Date Set", + "Custom Disabled (Mute Alert)": "Custom Disabled (Mute Alert)", + "Custom Enabled": "Custom Enabled", + "Custom Expiry": "Custom Expiry", + "Custom Lower Limit (°C)": "Custom Lower Limit (°C)", + "Custom Upper Limit (°C)": "Custom Upper Limit (°C)", "Customer Details": "Customer Details", "Customer Info": "Customer Info", "Customer List": "Customer List", @@ -372,9 +419,11 @@ "Customer updated successfully.": "Customer updated successfully.", "Cycle Efficiency": "Cycle Efficiency", "Daily Revenue": "Daily Revenue", + "Daily operational variance curve for selected timeframe": "Daily operational variance curve for selected timeframe", "Damage": "Damage", "Danger Zone: Delete Account": "Danger Zone: Delete Account", "Dashboard": "Dashboard", + "Data Changes": "Data Changes", "Data Configuration": "Data Configuration", "Data Configuration Permissions": "Data Configuration Permissions", "Date": "Date", @@ -383,7 +432,14 @@ "Days": "Days", "Default Donate": "Default Donate", "Default Not Donate": "Default Not Donate", + "Default Temp Alert Limits": "Default Temp Alert Limits", + "Default Temp Alert Lower Limit (°C)": "Default Temp Alert Lower Limit (°C)", + "Default Temp Alert Upper Limit (°C)": "Default Temp Alert Upper Limit (°C)", + "Default Temp Limits": "Default Temp Limits", + "Default Temp Lower Limit (°C)": "Default Temp Lower Limit (°C)", + "Default Temp Upper Limit (°C)": "Default Temp Upper Limit (°C)", "Define and manage security roles and permissions.": "Define and manage security roles and permissions.", + "Define custom temperature limits or inherit from model": "Define custom temperature limits or inherit from model", "Define new third-party payment parameters": "Define new third-party payment parameters", "Delete": "Delete", "Delete Account": "Delete Account", @@ -404,12 +460,16 @@ "Delta": "Delta", "Deposit Bonus": "Deposit Bonus", "Describe the repair or maintenance status...": "Describe the repair or maintenance status...", - "Description \/ Name": "Description \/ Name", + "Description / Name": "Description / Name", "Deselect All": "Deselect All", "Detail": "Detail", + "Detailed Analysis Data": "Detailed Analysis Data", "Details": "Details", + "Device": "Device", + "Device Exception": "Device Exception", "Device Information": "Device Information", "Device Status Logs": "Device Status Logs", + "Device connection drops or minor warnings.": "Device connection drops or minor warnings.", "Devices": "Devices", "Disable": "Disable", "Disable Advertisement Confirmation": "Disable Advertisement Confirmation", @@ -421,7 +481,14 @@ "Disabled": "Disabled", "Disabling this customer will also disable all accounts under this customer. Are you sure you want to continue?": "Disabling this customer will also disable all accounts under this customer. Are you sure you want to continue?", "Discord Notifications": "Discord Notifications", + "Discord Webhook URL": "Discord Webhook URL", + "Discord notification settings updated successfully.": "Discord notification settings updated successfully.", "Discount": "Discount", + "Discount Amount": "Discount Amount", + "Discount Amount (NTD)": "Discount Amount (NTD)", + "Discount Fold": "Discount Fold", + "Discount Type": "Discount Type", + "Discount Value": "Discount Value", "Dispense Failed": "Dispense Failed", "Dispense Pending": "Dispense Pending", "Dispense Product": "Dispense Product", @@ -443,10 +510,11 @@ "Door Closed": "Door Closed", "Door Opened": "Door Opened", "Download Image": "Download Image", + "Download Template": "Download Template", "Draft": "Draft", "Duration": "Duration", "Duration (Seconds)": "Duration (Seconds)", - "E-Ticket (EasyCard\/iPass)": "E-Ticket (EasyCard\/iPass)", + "E-Ticket (EasyCard/iPass)": "E-Ticket (EasyCard/iPass)", "E.SUN Bank Scan": "E.SUN Bank Scan", "E.SUN Pay": "E.SUN Pay", "E.SUN QR Pay": "E.SUN QR Pay", @@ -462,9 +530,12 @@ "Edit Account": "Edit Account", "Edit Advertisement": "Edit Advertisement", "Edit Category": "Edit Category", + "Edit Company Alert Settings": "Edit Company Alert Settings", "Edit Customer": "Edit Customer", + "Edit Discord Alert Settings": "Edit Discord Alert Settings", "Edit Expiry": "Edit Expiry", "Edit Machine": "Edit Machine", + "Edit Machine Alert Settings": "Edit Machine Alert Settings", "Edit Machine Model": "Edit Machine Model", "Edit Machine Name": "Edit Machine Name", "Edit Machine Settings": "Edit Machine Settings", @@ -479,6 +550,8 @@ "Edit Staff Card": "Edit Staff Card", "Edit Sub Account Role": "Edit Sub Account Role", "Edit Warehouse": "Edit Warehouse", + "Edit Welcome Gift": "Edit Welcome Gift", + "Effective Alert Types": "Effective Alert Types", "Electronic Invoice": "Electronic Invoice", "Electronic Invoices": "Electronic Invoices", "Elevator descending": "Elevator descending", @@ -488,19 +561,21 @@ "Elevator rising": "Elevator rising", "Elevator sensor error": "Elevator sensor error", "Email": "Email", - "Emblem \/ Label": "Emblem \/ Label", + "Emblem / Label": "Emblem / Label", "Employee": "Employee", "Employee ID": "Employee ID", "Empty": "Empty", "Empty Slot": "Empty Slot", "Empty Slots": "Empty Slots", "Enable": "Enable", + "Enable Alerts": "Enable Alerts", "Enable Material Code": "Enable Material Code", "Enable Points": "Enable Points", "Enable Points Mechanism": "Enable Points Mechanism", + "Enable and paste Webhook URL": "Enable and paste Webhook URL", "Enabled": "Enabled", "Enabled Features": "Enabled Features", - "Enabled\/Disabled": "Enabled\/Disabled", + "Enabled/Disabled": "Enabled/Disabled", "End Date": "End Date", "End Time": "End Time", "Engineer": "Engineer", @@ -519,11 +594,14 @@ "Entire Machine": "Entire Machine", "Equipment efficiency and OEE metrics": "Equipment efficiency and OEE metrics", "Error": "Error", + "Error Code": "Error Code", + "Error Details": "Error Details", "Error processing request": "Error processing request", "Error report accepted": "Error report accepted", "Error: :message (:code)": "Error: :message (:code)", "Errors": "Errors", "Estimated Expiry": "Estimated Expiry", + "Excel File": "Excel File", "Execute": "Execute", "Execute Change": "Execute Change", "Execute Delivery Now": "Execute Delivery Now", @@ -535,15 +613,19 @@ "Expected Expiry Date & Time": "Expected Expiry Date & Time", "Expected Stock": "Expected Stock", "Expired": "Expired", - "Expired \/ Disabled": "Expired \/ Disabled", + "Expired / Disabled": "Expired / Disabled", "Expired Time": "Expired Time", "Expires At": "Expires At", "Expiring": "Expiring", "Expiry": "Expiry", "Expiry Date": "Expiry Date", + "Expiry Date Set": "Expiry Date Set", "Expiry Management": "Expiry Management", "Expiry Time": "Expiry Time", "Expiry date tracking and warnings": "Expiry date tracking and warnings", + "Export Report": "Export Report", + "Export to CSV": "Export to CSV", + "Export to Excel": "Export to Excel", "Failed": "Failed", "Failed to fetch machine data.": "Failed to fetch machine data.", "Failed to load permissions": "Failed to load permissions", @@ -551,102 +633,107 @@ "Failed to load tab content": "Failed to load tab content", "Failed to resolve issues.": "Failed to resolve issues.", "Failed to save permissions.": "Failed to save permissions.", + "Failed to send command": "Failed to send command", "Failed to send sync command.": "Failed to send sync command.", + "Failed to send test notification.": "Failed to send test notification.", + "Failed to send test notification. Please verify the Webhook URL.": "Failed to send test notification. Please verify the Webhook URL.", "Failed to update machine images: ": "Failed to update machine images: ", "Feature Settings": "Feature Settings", "Feature Toggles": "Feature Toggles", + "Field": "Field", "Fill Quantity": "Fill Quantity", "Fill Rate": "Fill Rate", "Fill in the device repair or maintenance details": "Fill in the device repair or maintenance details", "Fill in the product details below": "Fill in the product details below", "Filter": "Filter", + "Filter by Company": "Filter by Company", "Filter by Warehouse Presence": "Filter by Warehouse Presence", "Firmware Version": "Firmware Version", "Firmware updated to :version": "Firmware updated to :version", "Fleet Avg OEE": "Fleet Avg OEE", "Fleet Performance": "Fleet Performance", "Flow ID": "Flow ID", - "Flow ID \/ Amount": "Flow ID \/ Amount", - "Flow ID \/ Date": "Flow ID \/ Date", - "Flow ID \/ Machine": "Flow ID \/ Machine", - "Flow ID \/ Order": "Flow ID \/ Order", - "Flow ID \/ Product": "Flow ID \/ Product", - "Flow ID \/ Slot": "Flow ID \/ Slot", - "Flow ID \/ Slot \/ Amount": "Flow ID \/ Slot \/ Amount", - "Flow ID \/ Slot \/ Date": "Flow ID \/ Slot \/ Date", - "Flow ID \/ Slot \/ Machine": "Flow ID \/ Slot \/ Machine", - "Flow ID \/ Slot \/ Order": "Flow ID \/ Slot \/ Order", - "Flow ID \/ Slot \/ Product": "Flow ID \/ Slot \/ Product", - "Flow ID \/ Slot \/ Product \/ Amount": "Flow ID \/ Slot \/ Product \/ Amount", - "Flow ID \/ Slot \/ Product \/ Amount \/ Date": "Flow ID \/ Slot \/ Product \/ Amount \/ Date", - "Flow ID \/ Slot \/ Product \/ Amount \/ Date \/ Order": "Flow ID \/ Slot \/ Product \/ Amount \/ Date \/ Order", - "Flow ID \/ Slot \/ Product \/ Amount \/ Date \/ Time": "Flow ID \/ Slot \/ Product \/ Amount \/ Date \/ Time", - "Flow ID \/ Slot \/ Product \/ Amount \/ Date \/ Time \/ Order": "Flow ID \/ Slot \/ Product \/ Amount \/ Date \/ Time \/ Order", - "Flow ID \/ Slot \/ Product \/ Amount \/ Machine": "Flow ID \/ Slot \/ Product \/ Amount \/ Machine", - "Flow ID \/ Slot \/ Product \/ Amount \/ Machine \/ Date": "Flow ID \/ Slot \/ Product \/ Amount \/ Machine \/ Date", - "Flow ID \/ Slot \/ Product \/ Amount \/ Machine \/ Date \/ Order": "Flow ID \/ Slot \/ Product \/ Amount \/ Machine \/ Date \/ Order", - "Flow ID \/ Slot \/ Product \/ Amount \/ Machine \/ Date \/ Time": "Flow ID \/ Slot \/ Product \/ Amount \/ Machine \/ Date \/ Time", - "Flow ID \/ Slot \/ Product \/ Amount \/ Machine \/ Date \/ Time \/ Order": "Flow ID \/ Slot \/ Product \/ Amount \/ Machine \/ Date \/ Time \/ Order", - "Flow ID \/ Slot \/ Product \/ Amount \/ Machine \/ Order": "Flow ID \/ Slot \/ Product \/ Amount \/ Machine \/ Order", - "Flow ID \/ Slot \/ Product \/ Amount \/ Machine \/ Time": "Flow ID \/ Slot \/ Product \/ Amount \/ Machine \/ Time", - "Flow ID \/ Slot \/ Product \/ Amount \/ Machine \/ Time \/ Order": "Flow ID \/ Slot \/ Product \/ Amount \/ Machine \/ Time \/ Order", - "Flow ID \/ Slot \/ Product \/ Amount \/ Order": "Flow ID \/ Slot \/ Product \/ Amount \/ Order", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status": "Flow ID \/ Slot \/ Product \/ Amount \/ Status", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Date": "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Date", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Date \/ Order": "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Date \/ Order", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Date \/ Time": "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Date \/ Time", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Date \/ Time \/ Order": "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Date \/ Time \/ Order", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Machine": "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Machine", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Machine \/ Date": "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Machine \/ Date", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Machine \/ Date \/ Order": "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Machine \/ Date \/ Order", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Machine \/ Date \/ Time": "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Machine \/ Date \/ Time", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Machine \/ Date \/ Time \/ Order": "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Machine \/ Date \/ Time \/ Order", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Machine \/ Date \/ Time \/ Order \/ Extra": "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Machine \/ Date \/ Time \/ Order \/ Extra", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Machine \/ Date \/ Time \/ Order \/ Extra \/ More": "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Machine \/ Date \/ Time \/ Order \/ Extra \/ More", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Machine \/ Date \/ Time \/ Order \/ Extra \/ More \/ Done": "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Machine \/ Date \/ Time \/ Order \/ Extra \/ More \/ Done", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Machine \/ Order": "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Machine \/ Order", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Machine \/ Time": "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Machine \/ Time", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Machine \/ Time \/ Order": "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Machine \/ Time \/ Order", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Order": "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Order", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Time": "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Time", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Time \/ Order": "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Time \/ Order", - "Flow ID \/ Slot \/ Product \/ Amount \/ Time": "Flow ID \/ Slot \/ Product \/ Amount \/ Time", - "Flow ID \/ Slot \/ Product \/ Amount \/ Time \/ Order": "Flow ID \/ Slot \/ Product \/ Amount \/ Time \/ Order", - "Flow ID \/ Slot \/ Product \/ Date": "Flow ID \/ Slot \/ Product \/ Date", - "Flow ID \/ Slot \/ Product \/ Date \/ Order": "Flow ID \/ Slot \/ Product \/ Date \/ Order", - "Flow ID \/ Slot \/ Product \/ Date \/ Time": "Flow ID \/ Slot \/ Product \/ Date \/ Time", - "Flow ID \/ Slot \/ Product \/ Date \/ Time \/ Order": "Flow ID \/ Slot \/ Product \/ Date \/ Time \/ Order", - "Flow ID \/ Slot \/ Product \/ Machine": "Flow ID \/ Slot \/ Product \/ Machine", - "Flow ID \/ Slot \/ Product \/ Machine \/ Date": "Flow ID \/ Slot \/ Product \/ Machine \/ Date", - "Flow ID \/ Slot \/ Product \/ Machine \/ Date \/ Order": "Flow ID \/ Slot \/ Product \/ Machine \/ Date \/ Order", - "Flow ID \/ Slot \/ Product \/ Machine \/ Date \/ Time": "Flow ID \/ Slot \/ Product \/ Machine \/ Date \/ Time", - "Flow ID \/ Slot \/ Product \/ Machine \/ Date \/ Time \/ Order": "Flow ID \/ Slot \/ Product \/ Machine \/ Date \/ Time \/ Order", - "Flow ID \/ Slot \/ Product \/ Machine \/ Order": "Flow ID \/ Slot \/ Product \/ Machine \/ Order", - "Flow ID \/ Slot \/ Product \/ Machine \/ Time": "Flow ID \/ Slot \/ Product \/ Machine \/ Time", - "Flow ID \/ Slot \/ Product \/ Machine \/ Time \/ Order": "Flow ID \/ Slot \/ Product \/ Machine \/ Time \/ Order", - "Flow ID \/ Slot \/ Product \/ Order": "Flow ID \/ Slot \/ Product \/ Order", - "Flow ID \/ Slot \/ Product \/ Status": "Flow ID \/ Slot \/ Product \/ Status", - "Flow ID \/ Slot \/ Product \/ Status \/ Date": "Flow ID \/ Slot \/ Product \/ Status \/ Date", - "Flow ID \/ Slot \/ Product \/ Status \/ Date \/ Order": "Flow ID \/ Slot \/ Product \/ Status \/ Date \/ Order", - "Flow ID \/ Slot \/ Product \/ Status \/ Date \/ Time": "Flow ID \/ Slot \/ Product \/ Status \/ Date \/ Time", - "Flow ID \/ Slot \/ Product \/ Status \/ Date \/ Time \/ Order": "Flow ID \/ Slot \/ Product \/ Status \/ Date \/ Time \/ Order", - "Flow ID \/ Slot \/ Product \/ Status \/ Machine": "Flow ID \/ Slot \/ Product \/ Status \/ Machine", - "Flow ID \/ Slot \/ Product \/ Status \/ Machine \/ Date": "Flow ID \/ Slot \/ Product \/ Status \/ Machine \/ Date", - "Flow ID \/ Slot \/ Product \/ Status \/ Machine \/ Date \/ Order": "Flow ID \/ Slot \/ Product \/ Status \/ Machine \/ Date \/ Order", - "Flow ID \/ Slot \/ Product \/ Status \/ Machine \/ Date \/ Time": "Flow ID \/ Slot \/ Product \/ Status \/ Machine \/ Date \/ Time", - "Flow ID \/ Slot \/ Product \/ Status \/ Machine \/ Date \/ Time \/ Order": "Flow ID \/ Slot \/ Product \/ Status \/ Machine \/ Date \/ Time \/ Order", - "Flow ID \/ Slot \/ Product \/ Status \/ Machine \/ Order": "Flow ID \/ Slot \/ Product \/ Status \/ Machine \/ Order", - "Flow ID \/ Slot \/ Product \/ Status \/ Machine \/ Time": "Flow ID \/ Slot \/ Product \/ Status \/ Machine \/ Time", - "Flow ID \/ Slot \/ Product \/ Status \/ Machine \/ Time \/ Order": "Flow ID \/ Slot \/ Product \/ Status \/ Machine \/ Time \/ Order", - "Flow ID \/ Slot \/ Product \/ Status \/ Order": "Flow ID \/ Slot \/ Product \/ Status \/ Order", - "Flow ID \/ Slot \/ Product \/ Status \/ Time": "Flow ID \/ Slot \/ Product \/ Status \/ Time", - "Flow ID \/ Slot \/ Product \/ Status \/ Time \/ Order": "Flow ID \/ Slot \/ Product \/ Status \/ Time \/ Order", - "Flow ID \/ Slot \/ Product \/ Time": "Flow ID \/ Slot \/ Product \/ Time", - "Flow ID \/ Slot \/ Product \/ Time \/ Order": "Flow ID \/ Slot \/ Product \/ Time \/ Order", - "Flow ID \/ Slot \/ Status": "Flow ID \/ Slot \/ Status", - "Flow ID \/ Slot \/ Time": "Flow ID \/ Slot \/ Time", - "Flow ID \/ Status": "Flow ID \/ Status", - "Flow ID \/ Time": "Flow ID \/ Time", + "Flow ID / Amount": "Flow ID / Amount", + "Flow ID / Date": "Flow ID / Date", + "Flow ID / Machine": "Flow ID / Machine", + "Flow ID / Order": "Flow ID / Order", + "Flow ID / Product": "Flow ID / Product", + "Flow ID / Slot": "Flow ID / Slot", + "Flow ID / Slot / Amount": "Flow ID / Slot / Amount", + "Flow ID / Slot / Date": "Flow ID / Slot / Date", + "Flow ID / Slot / Machine": "Flow ID / Slot / Machine", + "Flow ID / Slot / Order": "Flow ID / Slot / Order", + "Flow ID / Slot / Product": "Flow ID / Slot / Product", + "Flow ID / Slot / Product / Amount": "Flow ID / Slot / Product / Amount", + "Flow ID / Slot / Product / Amount / Date": "Flow ID / Slot / Product / Amount / Date", + "Flow ID / Slot / Product / Amount / Date / Order": "Flow ID / Slot / Product / Amount / Date / Order", + "Flow ID / Slot / Product / Amount / Date / Time": "Flow ID / Slot / Product / Amount / Date / Time", + "Flow ID / Slot / Product / Amount / Date / Time / Order": "Flow ID / Slot / Product / Amount / Date / Time / Order", + "Flow ID / Slot / Product / Amount / Machine": "Flow ID / Slot / Product / Amount / Machine", + "Flow ID / Slot / Product / Amount / Machine / Date": "Flow ID / Slot / Product / Amount / Machine / Date", + "Flow ID / Slot / Product / Amount / Machine / Date / Order": "Flow ID / Slot / Product / Amount / Machine / Date / Order", + "Flow ID / Slot / Product / Amount / Machine / Date / Time": "Flow ID / Slot / Product / Amount / Machine / Date / Time", + "Flow ID / Slot / Product / Amount / Machine / Date / Time / Order": "Flow ID / Slot / Product / Amount / Machine / Date / Time / Order", + "Flow ID / Slot / Product / Amount / Machine / Order": "Flow ID / Slot / Product / Amount / Machine / Order", + "Flow ID / Slot / Product / Amount / Machine / Time": "Flow ID / Slot / Product / Amount / Machine / Time", + "Flow ID / Slot / Product / Amount / Machine / Time / Order": "Flow ID / Slot / Product / Amount / Machine / Time / Order", + "Flow ID / Slot / Product / Amount / Order": "Flow ID / Slot / Product / Amount / Order", + "Flow ID / Slot / Product / Amount / Status": "Flow ID / Slot / Product / Amount / Status", + "Flow ID / Slot / Product / Amount / Status / Date": "Flow ID / Slot / Product / Amount / Status / Date", + "Flow ID / Slot / Product / Amount / Status / Date / Order": "Flow ID / Slot / Product / Amount / Status / Date / Order", + "Flow ID / Slot / Product / Amount / Status / Date / Time": "Flow ID / Slot / Product / Amount / Status / Date / Time", + "Flow ID / Slot / Product / Amount / Status / Date / Time / Order": "Flow ID / Slot / Product / Amount / Status / Date / Time / Order", + "Flow ID / Slot / Product / Amount / Status / Machine": "Flow ID / Slot / Product / Amount / Status / Machine", + "Flow ID / Slot / Product / Amount / Status / Machine / Date": "Flow ID / Slot / Product / Amount / Status / Machine / Date", + "Flow ID / Slot / Product / Amount / Status / Machine / Date / Order": "Flow ID / Slot / Product / Amount / Status / Machine / Date / Order", + "Flow ID / Slot / Product / Amount / Status / Machine / Date / Time": "Flow ID / Slot / Product / Amount / Status / Machine / Date / Time", + "Flow ID / Slot / Product / Amount / Status / Machine / Date / Time / Order": "Flow ID / Slot / Product / Amount / Status / Machine / Date / Time / Order", + "Flow ID / Slot / Product / Amount / Status / Machine / Date / Time / Order / Extra": "Flow ID / Slot / Product / Amount / Status / Machine / Date / Time / Order / Extra", + "Flow ID / Slot / Product / Amount / Status / Machine / Date / Time / Order / Extra / More": "Flow ID / Slot / Product / Amount / Status / Machine / Date / Time / Order / Extra / More", + "Flow ID / Slot / Product / Amount / Status / Machine / Date / Time / Order / Extra / More / Done": "Flow ID / Slot / Product / Amount / Status / Machine / Date / Time / Order / Extra / More / Done", + "Flow ID / Slot / Product / Amount / Status / Machine / Order": "Flow ID / Slot / Product / Amount / Status / Machine / Order", + "Flow ID / Slot / Product / Amount / Status / Machine / Time": "Flow ID / Slot / Product / Amount / Status / Machine / Time", + "Flow ID / Slot / Product / Amount / Status / Machine / Time / Order": "Flow ID / Slot / Product / Amount / Status / Machine / Time / Order", + "Flow ID / Slot / Product / Amount / Status / Order": "Flow ID / Slot / Product / Amount / Status / Order", + "Flow ID / Slot / Product / Amount / Status / Time": "Flow ID / Slot / Product / Amount / Status / Time", + "Flow ID / Slot / Product / Amount / Status / Time / Order": "Flow ID / Slot / Product / Amount / Status / Time / Order", + "Flow ID / Slot / Product / Amount / Time": "Flow ID / Slot / Product / Amount / Time", + "Flow ID / Slot / Product / Amount / Time / Order": "Flow ID / Slot / Product / Amount / Time / Order", + "Flow ID / Slot / Product / Date": "Flow ID / Slot / Product / Date", + "Flow ID / Slot / Product / Date / Order": "Flow ID / Slot / Product / Date / Order", + "Flow ID / Slot / Product / Date / Time": "Flow ID / Slot / Product / Date / Time", + "Flow ID / Slot / Product / Date / Time / Order": "Flow ID / Slot / Product / Date / Time / Order", + "Flow ID / Slot / Product / Machine": "Flow ID / Slot / Product / Machine", + "Flow ID / Slot / Product / Machine / Date": "Flow ID / Slot / Product / Machine / Date", + "Flow ID / Slot / Product / Machine / Date / Order": "Flow ID / Slot / Product / Machine / Date / Order", + "Flow ID / Slot / Product / Machine / Date / Time": "Flow ID / Slot / Product / Machine / Date / Time", + "Flow ID / Slot / Product / Machine / Date / Time / Order": "Flow ID / Slot / Product / Machine / Date / Time / Order", + "Flow ID / Slot / Product / Machine / Order": "Flow ID / Slot / Product / Machine / Order", + "Flow ID / Slot / Product / Machine / Time": "Flow ID / Slot / Product / Machine / Time", + "Flow ID / Slot / Product / Machine / Time / Order": "Flow ID / Slot / Product / Machine / Time / Order", + "Flow ID / Slot / Product / Order": "Flow ID / Slot / Product / Order", + "Flow ID / Slot / Product / Status": "Flow ID / Slot / Product / Status", + "Flow ID / Slot / Product / Status / Date": "Flow ID / Slot / Product / Status / Date", + "Flow ID / Slot / Product / Status / Date / Order": "Flow ID / Slot / Product / Status / Date / Order", + "Flow ID / Slot / Product / Status / Date / Time": "Flow ID / Slot / Product / Status / Date / Time", + "Flow ID / Slot / Product / Status / Date / Time / Order": "Flow ID / Slot / Product / Status / Date / Time / Order", + "Flow ID / Slot / Product / Status / Machine": "Flow ID / Slot / Product / Status / Machine", + "Flow ID / Slot / Product / Status / Machine / Date": "Flow ID / Slot / Product / Status / Machine / Date", + "Flow ID / Slot / Product / Status / Machine / Date / Order": "Flow ID / Slot / Product / Status / Machine / Date / Order", + "Flow ID / Slot / Product / Status / Machine / Date / Time": "Flow ID / Slot / Product / Status / Machine / Date / Time", + "Flow ID / Slot / Product / Status / Machine / Date / Time / Order": "Flow ID / Slot / Product / Status / Machine / Date / Time / Order", + "Flow ID / Slot / Product / Status / Machine / Order": "Flow ID / Slot / Product / Status / Machine / Order", + "Flow ID / Slot / Product / Status / Machine / Time": "Flow ID / Slot / Product / Status / Machine / Time", + "Flow ID / Slot / Product / Status / Machine / Time / Order": "Flow ID / Slot / Product / Status / Machine / Time / Order", + "Flow ID / Slot / Product / Status / Order": "Flow ID / Slot / Product / Status / Order", + "Flow ID / Slot / Product / Status / Time": "Flow ID / Slot / Product / Status / Time", + "Flow ID / Slot / Product / Status / Time / Order": "Flow ID / Slot / Product / Status / Time / Order", + "Flow ID / Slot / Product / Time": "Flow ID / Slot / Product / Time", + "Flow ID / Slot / Product / Time / Order": "Flow ID / Slot / Product / Time / Order", + "Flow ID / Slot / Status": "Flow ID / Slot / Status", + "Flow ID / Slot / Time": "Flow ID / Slot / Time", + "Flow ID / Status": "Flow ID / Status", + "Flow ID / Time": "Flow ID / Time", "Force End Session": "Force End Session", "Force end current session": "Force end current session", "From": "From", @@ -658,6 +745,7 @@ "Full Points": "Full Points", "Functional Settings": "Functional Settings", "Games": "Games", + "General Settings": "General Settings", "General permissions not linked to a specific menu.": "General permissions not linked to a specific menu.", "Generate": "Generate", "Generate New Code": "Generate New Code", @@ -672,6 +760,7 @@ "Got it": "Got it", "Grant UI Access": "Grant UI Access", "Grid View": "Grid View", + "Gross Margin": "Gross Margin", "Half Points": "Half Points", "Half Points Amount": "Half Points Amount", "Hardware & Network": "Hardware & Network", @@ -697,18 +786,27 @@ "ITEM": "ITEM", "Identification": "Identification", "Identity & Codes": "Identity & Codes", + "Identity and Codes": "Identity and Codes", "Image": "Image", "Image Downloaded": "Image Downloaded", "Immediate": "Immediate", + "Import Excel": "Import Excel", + "Import Staff Cards": "Import Staff Cards", + "Import failed": "Import failed", "In Stock": "In Stock", "Inactive": "Inactive", - "Includes Credit Card\/Mobile Pay": "Includes Credit Card\/Mobile Pay", + "Includes Credit Card/Mobile Pay": "Includes Credit Card/Mobile Pay", "Indefinite": "Indefinite", "Info": "Info", + "Inherit": "Inherit", + "Inherit Company": "Inherit Company", + "Inherit Company Alert Types": "Inherit Company Alert Types", + "Inherit Model / System default": "Inherit Model / System Default", "Initial Admin Account": "Initial Admin Account", "Initial Role": "Initial Role", "Initial contract registration": "Initial contract registration", "Installation": "Installation", + "Installation Location": "Installation Location", "Insufficient stock for transfer": "Insufficient stock for transfer", "Invalid personnel selection": "Invalid personnel selection", "Invalid status transition": "Invalid status transition", @@ -721,8 +819,8 @@ "Invoice Date": "Invoice Date", "Invoice Information": "Invoice Information", "Invoice Number": "Invoice Number", - "Invoice Number \/ Flow ID": "Invoice Number \/ Flow ID", - "Invoice Number \/ Time": "Invoice Number \/ Time", + "Invoice Number / Flow ID": "Invoice Number / Flow ID", + "Invoice Number / Time": "Invoice Number / Time", "Invoice Status": "Invoice Status", "Issued At": "Issued At", "Item List": "Item List", @@ -740,18 +838,22 @@ "LINE Pay Direct Settings Description": "LINE Pay Direct Settings Description", "LINE_PAY_CHANNEL_ID": "LINE_PAY_CHANNEL_ID", "LIVE": "LIVE", + "Last 7 Days": "Last 7 Days", "Last Communication": "Last Communication", "Last Heartbeat": "Last Heartbeat", + "Last Month": "Last Month", "Last Page": "Last Page", "Last Signal": "Last Signal", "Last Sync": "Last Sync", "Last Time": "Last Time", "Last Updated": "Last Updated", "Last Used": "Last Used", + "Last Week": "Last Week", "Latitude": "Latitude", "Lease": "Lease", "Leave empty for permanent code": "Leave empty for permanent code", "Leave empty or 0 for permanent code": "Leave empty or 0 for permanent code", + "Leave empty to inherit company settings": "Leave empty to inherit company settings", "Level": "Level", "Line Coupons": "Line Coupons", "Line Machines": "Line Machines", @@ -770,7 +872,6 @@ "Loading Data": "Loading Data", "Loading failed": "Loading failed", "Loading machines...": "Loading machines...", - "Loading...": "Loading...", "Location": "Location", "Location found!": "Location found!", "Location not found": "Location not found", @@ -780,6 +881,7 @@ "Lock Page Lock": "Lock Page Lock", "Lock Page Unlock": "Lock Page Unlock", "Locked Page": "Locked Page", + "Log Details": "Log Details", "Log Time": "Log Time", "Login Alert": "Login Alert", "Login History": "Login History", @@ -794,18 +896,26 @@ "Low stock and out-of-stock alerts": "Low stock and out-of-stock alerts", "Loyalty & Features": "Loyalty & Features", "Machine": "Machine", - "Machine \/ Date": "Machine \/ Date", - "Machine \/ Employee": "Machine \/ Employee", - "Machine \/ Pass Code": "Machine \/ Pass Code", - "Machine \/ Slot": "Machine \/ Slot", + "Machine / Date": "Machine / Date", + "Machine / Employee": "Machine / Employee", + "Machine / Pass Code": "Machine / Pass Code", + "Machine / Slot": "Machine / Slot", + "Machine / Welcome Gift": "Machine / Welcome Gift", "Machine Advertisement Settings": "Machine Advertisement Settings", + "Machine Alert Settings": "Machine Alert Settings", + "Machine Connection Alert": "Machine Connection Alert", + "Machine Connectivity Logs (LWT)": "Machine Connectivity Logs (LWT)", + "Machine Connectivity Lost": "Connection Lost", + "Machine Connectivity Restored": "Connection Restored", "Machine Count": "Machine Count", "Machine Details": "Machine Details", + "Machine Discord notification settings updated successfully.": "Machine Discord notification settings updated successfully.", "Machine Distribution": "Machine Distribution", "Machine Distribution Map": "Machine Distribution Map", "Machine Flow ID": "Machine Flow ID", - "Machine Flow ID \/ Time": "Machine Flow ID \/ Time", + "Machine Flow ID / Time": "Machine Flow ID / Time", "Machine Images": "Machine Images", + "Machine Inbound Confirmation": "Machine Inbound Confirmation", "Machine Info": "Machine Info", "Machine Information": "Machine Information", "Machine Inventory": "Machine Inventory", @@ -828,6 +938,7 @@ "Machine Serial": "Machine Serial", "Machine Serial No": "Machine Serial No", "Machine Settings": "Machine Settings", + "Machine Specific": "Machine Specific", "Machine Status": "Machine Status", "Machine Status List": "Machine Status List", "Machine Stock": "Machine Stock", @@ -836,18 +947,22 @@ "Machine Utilization": "Machine Utilization", "Machine created successfully.": "Machine created successfully.", "Machine deleted successfully.": "Machine deleted successfully.", + "Machine has reconnected to the server and resumed normal heartbeat.": "Machine has reconnected to the server and resumed normal heartbeat.", "Machine images updated successfully.": "Machine images updated successfully.", "Machine is heartbeat normal": "Machine is heartbeat normal", "Machine model created successfully.": "Machine model created successfully.", "Machine model deleted successfully.": "Machine model deleted successfully.", + "Machine model saved successfully.": "Machine model saved successfully.", "Machine model updated successfully.": "Machine model updated successfully.", "Machine normal": "Machine normal", "Machine not found": "Machine not found", "Machine permissions updated successfully.": "Machine permissions updated successfully.", "Machine settings updated successfully.": "Machine settings updated successfully.", "Machine to Warehouse": "Machine to Warehouse", + "Machine to Warehouse Return": "Machine to Warehouse Return", "Machine to warehouse returns": "Machine to warehouse returns", "Machine updated successfully.": "Machine updated successfully.", + "Machine-Specific Webhook": "Machine-Specific Webhook", "Machines": "Machines", "Machines Online": "Machines Online", "Main": "Main", @@ -868,10 +983,12 @@ "Manage administrative and tenant accounts": "Manage administrative and tenant accounts", "Manage all tenant accounts and validity": "Manage all tenant accounts and validity", "Manage employee IC cards and track usage logs.": "Manage employee IC cards and track usage logs.", + "Manage machine access permissions": "Manage machine access permissions", "Manage multi-use authorization codes for testing and maintenance": "Manage multi-use authorization codes for testing and maintenance", "Manage stock levels, stock-in orders, and movement history": "Manage stock levels, stock-in orders, and movement history", "Manage stock transfers between warehouses and machine returns": "Manage stock transfers between warehouses and machine returns", "Manage warehouse stock levels, stock-in orders, adjustments, and movement history": "Manage warehouse stock levels, stock-in orders, adjustments, and movement history", + "Manage welcoming promotion codes for new guests": "Manage welcoming promotion codes for new guests", "Manage your ad material details": "Manage your ad material details", "Manage your catalog, categories, and inventory settings.": "Manage your catalog, categories, and inventory settings.", "Manage your catalog, prices, and multilingual details.": "Manage your catalog, prices, and multilingual details.", @@ -884,6 +1001,7 @@ "Manual Sync Ads": "Manual Sync Ads", "Manual Sync Products": "Manual Sync Products", "Manufacturer": "Manufacturer", + "Marketing and Loyalty": "Marketing and Loyalty", "Material Code": "Material Code", "Material Name": "Material Name", "Material Type": "Material Type", @@ -930,10 +1048,12 @@ "Microwave door opened": "Microwave door opened", "Min 8 characters": "Min 8 characters", "Model": "Model", + "Model Default": "Model Default", "Model Name": "Model Name", "Model changed to :model": "Model changed to :model", "Models": "Models", "Modification History": "Modification History", + "Modified fields": "Modified fields", "Modifying your own administrative permissions may result in losing access to certain system functions.": "Modifying your own administrative permissions may result in losing access to certain system functions.", "Monitor and manage stock levels across your fleet": "Monitor and manage stock levels across your fleet", "Monitor events and system activity across your vending fleet.": "Monitor events and system activity across your vending fleet.", @@ -945,9 +1065,9 @@ "Movement History": "Movement History", "Movement Logs": "Movement Logs", "Multilingual Names": "Multilingual Names", - "N\/A": "N\/A", + "N/A": "N/A", "Name": "Name", - "Name \/ Machine": "Name \/ Machine", + "Name / Machine": "Name / Machine", "Name in English": "Name in English", "Name in Japanese": "Name in Japanese", "Name in Traditional Chinese": "Name in Traditional Chinese", @@ -955,6 +1075,7 @@ "Needs replenishment": "Needs replenishment", "Never Connected": "Never Connected", "Never Used": "Never Used", + "New": "New", "New Command": "New Command", "New Machine Name": "New Machine Name", "New Password": "New Password", @@ -965,11 +1086,13 @@ "New Stock-In Order": "New Stock-In Order", "New Sub Account Role": "New Sub Account Role", "New Transfer": "New Transfer", + "New Value": "New Value", "Next": "Next", "No Company": "No Company", "No Invoice": "No Invoice", "No Location": "No Location", "No Machine Selected": "No Machine Selected", + "No Model": "No Model", "No accounts found": "No accounts found", "No active cargo lanes found": "No active cargo lanes found", "No additional notes": "No additional notes", @@ -979,11 +1102,13 @@ "No assignments": "No assignments", "No associated order found": "No associated order found", "No categories found.": "No categories found.", + "No changes detected": "No changes detected", "No command history": "No command history", "No configurations found": "No configurations found", "No content provided": "No content provided", "No customers found": "No customers found", "No data available": "No data available", + "No detailed changes recorded": "No detailed changes recorded", "No file uploaded.": "No file uploaded.", "No heartbeat for over 30 seconds": "No heartbeat for over 30 seconds", "No history records": "No history records", @@ -1001,9 +1126,11 @@ "No materials available": "No materials available", "No movement records found": "No movement records found", "No movements found": "No movements found", + "No operation logs found": "No operation logs found", "No pass codes found": "No pass codes found", "No permissions": "No permissions", "No pickup codes found": "No pickup codes found", + "No product data matching search criteria": "No product data matching search criteria", "No product record found": "No product record found", "No products found in this warehouse": "No products found in this warehouse", "No products found matching your criteria.": "No products found matching your criteria.", @@ -1027,13 +1154,16 @@ "No usage logs found.": "No usage logs found.", "No users found": "No users found", "No warehouses found": "No warehouses found", + "No welcome gifts found": "No welcome gifts found", "None": "None", "Normal": "Normal", + "Not Configured": "Not Configured", "Not Used": "Not Used", "Not Used Description": "Not Used Description", "Note": "Note", "Note (optional)": "Note (optional)", "Notes": "Notes", + "Notification Language": "Notification Language", "OEE": "OEE", "OEE Efficiency Trend": "OEE Efficiency Trend", "OEE Score": "OEE Score", @@ -1055,6 +1185,9 @@ "Offline + Pi Pay": "Offline + Pi Pay", "Offline + PlusPay": "Offline + PlusPay", "Offline Machines": "Offline Machines", + "Old": "Old", + "Old Value": "Old Value", + "Once": "Once", "Once your account is deleted, all of its resources and data will be permanently deleted. Before deleting your account, please download any data or information that you wish to retain.": "Once your account is deleted, all of its resources and data will be permanently deleted. Before deleting your account, please download any data or information that you wish to retain.", "Once your account is deleted, all of its resources and data will be permanently deleted. Please enter your password to confirm you would like to permanently delete your account.": "Once your account is deleted, all of its resources and data will be permanently deleted. Please enter your password to confirm you would like to permanently delete your account.", "One-click replenishment order generation": "One-click replenishment order generation", @@ -1063,7 +1196,10 @@ "Online Duration": "Online Duration", "Online Machines": "Online Machines", "Online Status": "Online Status", + "Only .xlsx, .xls, .csv files are supported (Max 5MB)": "Only .xlsx, .xls, .csv files are supported (Max 5MB)", + "Only machines under the same company can be cloned for security.": "Only machines under the same company can be cloned for security.", "Only system roles can be assigned to platform administrative accounts.": "Only system roles can be assigned to platform administrative accounts.", + "Operation Logs": "Operation Logs", "Operation Note": "Operation Note", "Operation Records": "Operation Records", "Operation failed": "Operation failed", @@ -1077,12 +1213,14 @@ "Optional notes...": "Optional notes...", "Optional remarks": "Optional remarks", "Optional remarks...": "Optional remarks...", + "Or Choose Custom Date": "Or Choose Custom Date", "Order Details": "Order Details", "Order Info": "Order Info", "Order Items": "Order Items", "Order Management": "Order Management", "Order No.": "Order No.", - "Order Number \/ Time": "Order Number \/ Time", + "Order Number": "Order Number", + "Order Number / Time": "Order Number / Time", "Order Status": "Order Status", "Order Time": "Order Time", "Order already completed": "Order already completed", @@ -1095,6 +1233,7 @@ "Orders": "Orders", "Orders per hour for selected date": "Orders per hour for selected date", "Original": "Original", + "Original Amount": "Original Amount", "Original Type": "Original Type", "Original:": "Original:", "Other Features": "Other Features", @@ -1160,6 +1299,7 @@ "Payment Type": "Payment Type", "Pending": "Pending", "Per Page": "Per Page", + "Percentage Discount": "Percentage Discount", "Performance": "Performance", "Permanent": "Permanent", "Permanent Code": "Permanent Code", @@ -1185,13 +1325,16 @@ "Pickup door closed": "Pickup door closed", "Pickup door error": "Pickup door error", "Pickup door not closed": "Pickup door not closed", + "Platform Operator": "Platform Operator", "Playback Order": "Playback Order", "Please Select Slot first": "Please Select Slot first", "Please check the following errors:": "Please check the following errors:", "Please check the form for errors.": "Please check the form for errors.", "Please confirm the details below": "Please confirm the details below", + "Please enter Webhook URL first.": "Please enter Webhook URL first.", "Please enter address first": "Please enter address first", "Please enter configuration name": "Please enter configuration name", + "Please make sure to enable \"Background graphics\" in your browser print settings to print product images and styled components correctly.": "Please make sure to enable \"Background graphics\" in your browser print settings to print product images and styled components correctly.", "Please select a company": "Please select a company", "Please select a company.": "Please select a company.", "Please select a machine": "Please select a machine", @@ -1202,43 +1345,56 @@ "Please select a material": "Please select a material", "Please select a slot": "Please select a slot", "Please select warehouse and machine": "Please select warehouse and machine", + "Please use our standard template to ensure data compatibility.": "Please use our standard template to ensure data compatibility.", "PlusPay": "PlusPay", "Point Rules": "Point Rules", "Point Settings": "Point Settings", "Points": "Points", "Points Settings": "Points Settings", "Points toggle": "Points toggle", - "Points\/Voucher": "Points\/Voucher", + "Points/Voucher": "Points/Voucher", "Position": "Position", "Prepared": "Prepared", + "Prepared By": "Prepared By", "Preparing": "Preparing", "Preview": "Preview", "Previous": "Previous", - "Price \/ Member": "Price \/ Member", + "Price / Member": "Price / Member", "Pricing Information": "Pricing Information", + "Print": "Print", + "Print & PDF": "Print & PDF", "Print Invoice": "Print Invoice", + "Print Notice": "Print Notice", + "Print Order": "Print Order", + "Print Time": "Print Time", "Product": "Product", - "Product \/ Slot": "Product \/ Slot", - "Product \/ Stock": "Product \/ Stock", + "Product / Slot": "Product / Slot", + "Product / Stock": "Product / Stock", + "Product Barcode": "Product Barcode", + "Product Cost": "Product Cost", "Product Count": "Product Count", "Product Details": "Product Details", "Product ID": "Product ID", "Product Image": "Product Image", "Product Info": "Product Info", + "Product Items": "Product Items", "Product List": "Product List", "Product Management": "Product Management", "Product Name": "Product Name", "Product Name (Multilingual)": "Product Name (Multilingual)", + "Product Report Analysis": "Product Report Analysis", "Product Reports": "Product Reports", + "Product Sales & Profit Trend": "Product Sales & Profit Trend", "Product Status": "Product Status", "Product created successfully": "Product created successfully", "Product deleted successfully": "Product deleted successfully", "Product empty": "Product empty", + "Product physical shipment count": "Product physical shipment count", "Product status updated to :status": "Product status updated to :status", "Product updated successfully": "Product updated successfully", "Production Company": "Production Company", "Products": "Products", - "Products \/ Stock": "Products \/ Stock", + "Products / Stock": "Products / Stock", "Profile": "Profile", "Profile Information": "Profile Information", "Profile Settings": "Profile Settings", @@ -1251,22 +1407,28 @@ "Purchase Finished": "Purchase Finished", "Purchases": "Purchases", "Purchasing": "Purchasing", + "Purpose": "Purpose", + "Push Status": "Push Status", "QR": "QR", "QR CODE": "QR CODE", + "QR Code": "QR Code", "QR Code Payment": "QR Code Payment", "QR Scan Payment": "QR Scan Payment", "Qty": "Qty", "Qty Change": "Qty Change", "Quality": "Quality", "Quantity": "Quantity", + "Quantity Sold": "Quantity Sold", "Questionnaire": "Questionnaire", "Quick Expiry Check": "Quick Expiry Check", + "Quick Filter": "Quick Filter", "Quick Maintenance": "Quick Maintenance", "Quick Replenish": "Quick Replenish", "Quick Select": "Quick Select", "Quick replenishment from this view": "Quick replenishment from this view", "Quick search...": "Quick search...", "Rank": "Rank", + "Ready to print": "Ready to print", "Real-time OEE analysis awaits": "Real-time OEE analysis awaits", "Real-time Operation Logs (Last 50)": "Real-time Operation Logs (Last 50)", "Real-time fleet efficiency and OEE metrics": "Real-time fleet efficiency and OEE metrics", @@ -1274,6 +1436,7 @@ "Real-time inventory status across all machines with expiry tracking": "Real-time inventory status across all machines with expiry tracking", "Real-time monitoring across all machines": "Real-time monitoring across all machines", "Real-time monitoring and adjustment of cargo lane inventory and expiration dates": "Real-time monitoring and adjustment of cargo lane inventory and expiration dates", + "Real-time operational data synchronized": "Real-time operational data synchronized", "Real-time performance analytics": "Real-time performance analytics", "Real-time slot-level inventory across all machines": "Real-time slot-level inventory across all machines", "Real-time status monitoring": "Real-time status monitoring", @@ -1291,6 +1454,7 @@ "Refunded": "Refunded", "Regenerate": "Regenerate", "Regenerating the token will disconnect the physical machine until it is updated. Continue?": "Regenerating the token will disconnect the physical machine until it is updated. Continue?", + "Remark": "Remark", "Remote Change": "Remote Change", "Remote Checkout": "Remote Checkout", "Remote Command Center": "Remote Command Center", @@ -1306,10 +1470,12 @@ "Remove Assignment Confirmation": "Remove Assignment Confirmation", "Repair": "Repair", "Replenish": "Replenish", + "Replenish Qty": "Replenish Qty", "Replenishment": "Replenishment", "Replenishment Audit": "Replenishment Audit", "Replenishment Details": "Replenishment Details", "Replenishment Items": "Replenishment Items", + "Replenishment Order": "Replenishment Order", "Replenishment Orders": "Replenishment Orders", "Replenishment Page": "Replenishment Page", "Replenishment Records": "Replenishment Records", @@ -1326,6 +1492,7 @@ "Reservation Members": "Reservation Members", "Reservation System": "Reservation System", "Reservations": "Reservations", + "Reset": "Reset", "Reset Filters": "Reset Filters", "Reset POS terminal": "Reset POS terminal", "Resolve Coordinates": "Resolve Coordinates", @@ -1359,11 +1526,14 @@ "Sale Price": "Sale Price", "Sales": "Sales", "Sales Activity": "Sales Activity", + "Sales Amount": "Sales Amount", "Sales Management": "Sales Management", "Sales Permissions": "Sales Permissions", + "Sales Quantity": "Sales Quantity", "Sales Record": "Sales Record", "Sales Records": "Sales Records", "Sales Today": "Sales Today", + "Sales revenue minus product cost net value": "Sales revenue minus product cost net value", "Save": "Save", "Save Changes": "Save Changes", "Save Config": "Save Config", @@ -1382,15 +1552,16 @@ "Scan to authorize testing or maintenance": "Scan to authorize testing or maintenance", "Scan to pick up your product": "Scan to pick up your product", "Schedule": "Schedule", + "Search": "Search", "Search Company Title...": "Search Company Title...", "Search Company...": "Search Company...", - "Search Flow ID \/ Slot...": "Search Flow ID \/ Slot...", - "Search Invoice No \/ Flow ID...": "Search Invoice No \/ Flow ID...", + "Search Flow ID / Slot...": "Search Flow ID / Slot...", + "Search Invoice No / Flow ID...": "Search Invoice No / Flow ID...", "Search Machine...": "Search Machine...", - "Search Order No \/ Flow ID \/ Invoice...": "Search Order No \/ Flow ID \/ Invoice...", - "Search Order No \/ Cards & Codes...": "Search Order No \/ Cards & Codes...", + "Search Order No / Cards & Codes...": "Search Order No / Cards & Codes...", + "Search Order No / Flow ID / Invoice...": "Search Order No / Flow ID / Invoice...", "Search Product": "Search Product", - "Search Product \/ Slot...": "Search Product \/ Slot...", + "Search Product / Slot...": "Search Product / Slot...", "Search accounts...": "Search accounts...", "Search by ID or Name": "Search by ID or Name", "Search by ID or Name...": "Search by ID or Name...", @@ -1398,18 +1569,22 @@ "Search by ID, Name or UID...": "Search by ID, Name or UID...", "Search by code, machine name or serial...": "Search by code, machine name or serial...", "Search by code, name or machine...": "Search by code, name or machine...", - "Search by name or S\/N...": "Search by name or S\/N...", + "Search by name or S/N...": "Search by name or S/N...", "Search by name...": "Search by name...", "Search cargo lane": "Search cargo lane", "Search categories...": "Search categories...", + "Search company name or code...": "Search company name or code...", "Search company...": "Search company...", "Search configurations...": "Search configurations...", "Search customers...": "Search customers...", "Search logs...": "Search logs...", + "Search machine name or SN...": "Search machine name or SN...", "Search machines by name or serial...": "Search machines by name or serial...", "Search machines...": "Search machines...", "Search models...": "Search models...", + "Search notes or values...": "Search notes or values...", "Search order number...": "Search order number...", + "Search product name, barcode...": "Search product name, barcode...", "Search products...": "Search products...", "Search roles...": "Search roles...", "Search serial no or name...": "Search serial no or name...", @@ -1436,11 +1611,13 @@ "Select Owner": "Select Owner", "Select Personnel": "Select Personnel", "Select Product": "Select Product", + "Select Product for Analysis": "Select Product for Analysis", "Select Slot": "Select Slot", "Select Slot...": "Select Slot...", "Select Target Company": "Select Target Company", "Select Target Slot": "Select Target Slot", "Select Warehouse": "Select Warehouse", + "Select a machine to copy settings from...": "Select a machine to copy settings from...", "Select a machine to deep dive": "Select a machine to deep dive", "Select a material to play on this machine": "Select a material to play on this machine", "Select a team member to handle this replenishment order": "Select a team member to handle this replenishment order", @@ -1453,6 +1630,7 @@ "Selected Machine": "Selected Machine", "Selected Slot": "Selected Slot", "Selection": "Selection", + "Sending...": "Sending...", "Sent": "Sent", "Serial & Version": "Serial & Version", "Serial NO": "Serial NO", @@ -1462,6 +1640,7 @@ "Service Periods": "Service Periods", "Service Terms": "Service Terms", "Settings Saved": "Settings Saved", + "Settings loaded from": "Settings loaded from", "Settings updated successfully.": "Settings updated successfully.", "Settlement": "Settlement", "Shopping Cart": "Shopping Cart", @@ -1476,7 +1655,7 @@ "Sign in to your account": "Sign in to your account", "Signed in as": "Signed in as", "Slot": "Slot", - "Slot \/ Product": "Slot \/ Product", + "Slot / Product": "Slot / Product", "Slot Mechanism (default: Conveyor, check for Spring)": "Slot Mechanism (default: Conveyor, check for Spring)", "Slot No": "Slot No", "Slot Status": "Slot Status", @@ -1496,6 +1675,7 @@ "Slots need replenishment": "Slots need replenishment", "Smallest number plays first.": "Smallest number plays first.", "Smart replenishment suggestions": "Smart replenishment suggestions", + "Smart vending machine product sales, cost and profit analysis report": "Smart vending machine product sales, cost and profit analysis report", "Software": "Software", "Software End": "Software End", "Software Service": "Software Service", @@ -1503,7 +1683,9 @@ "Some fields need attention": "Some fields need attention", "Sort Order": "Sort Order", "Source": "Source", + "Source Machine": "Source Machine", "Source Warehouse": "Source Warehouse", + "Source of temperature limit settings": "Source of temperature limit settings", "Special Permission": "Special Permission", "Specification": "Specification", "Specifications": "Specifications", @@ -1524,18 +1706,19 @@ "Standby Ad": "Standby Ad", "Start Date": "Start Date", "Start Delivery": "Start Delivery", + "Start Import": "Start Import", "Start Time": "Start Time", "Statistics": "Statistics", "Status": "Status", - "Status \/ Invoice": "Status \/ Invoice", - "Status \/ Temp \/ Sub \/ Card \/ Scan": "Status \/ Temp \/ Sub \/ Card \/ Scan", + "Status / Invoice": "Status / Invoice", + "Status / Temp / Sub / Card / Scan": "Status / Temp / Sub / Card / Scan", "Status Timeline": "Status Timeline", "Status updated successfully": "Status updated successfully", "Stock": "Stock", "Stock & Expiry": "Stock & Expiry", "Stock & Expiry Management": "Stock & Expiry Management", "Stock & Expiry Overview": "Stock & Expiry Overview", - "Stock \/ Capacity": "Stock \/ Capacity", + "Stock / Capacity": "Stock / Capacity", "Stock In": "Stock In", "Stock Level": "Stock Level", "Stock Level > 50%": "Stock Level > 50%", @@ -1545,6 +1728,7 @@ "Stock Out": "Stock Out", "Stock Quantity": "Stock Quantity", "Stock Rate": "Stock Rate", + "Stock Snap": "Stock Snap", "Stock Update": "Stock Update", "Stock adjustments and damage reports": "Stock adjustments and damage reports", "Stock flow history": "Stock flow history", @@ -1565,12 +1749,16 @@ "Store ID": "Store ID", "Store Management": "Store Management", "StoreID": "StoreID", - "Sub \/ Card \/ Scan": "Sub \/ Card \/ Scan", + "Sub / Card / Scan": "Sub / Card / Scan", "Sub Account Management": "Sub Account Management", "Sub Account Roles": "Sub Account Roles", "Sub Accounts": "Sub Accounts", "Sub-actions": "Sub-actions", + "Sub-machine Status": "Sub-machine Status", "Sub-machine Status Request": "Sub-machine Status Request", + "Submachine Alert": "Submachine Alert", + "Submachine Exception": "Submachine Exception", + "Submachine Exception (B013)": "Submachine Exception (B013)", "Submit Record": "Submit Record", "Subtotal": "Subtotal", "Success": "Success", @@ -1598,6 +1786,8 @@ "System Reboot": "System Reboot", "System Role": "System Role", "System Settings": "System Settings", + "System detected that the machine disconnected unexpectedly.": "System detected that the machine disconnected unexpectedly.", + "System restarting": "System restarting", "System role name cannot be modified.": "System role name cannot be modified.", "System roles cannot be deleted by tenant administrators.": "System roles cannot be deleted by tenant administrators.", "System roles cannot be modified by tenant administrators.": "System roles cannot be modified by tenant administrators.", @@ -1609,6 +1799,7 @@ "TapPay Integration": "TapPay Integration", "TapPay Integration Settings Description": "TapPay Integration Settings Description", "Target": "Target", + "Target Item": "Target Item", "Target Machine": "Target Machine", "Target Position": "Target Position", "Target Warehouse": "Target Warehouse", @@ -1616,17 +1807,31 @@ "Tax ID (Optional)": "Tax ID (Optional)", "Tax System": "Tax System", "Taxation System": "Taxation System", + "Temp Alert Range": "Temp Alert Range", + "Temp Alert State": "Temp Alert State", "Temperature": "Temperature", - "Temperature reported: :temp°C": "Temperature reported: :temp°C", + "Temperature Alert": "Temperature Alert", + "Temperature Alert (High)": "Temperature Alert (High)", + "Temperature Alert (Low)": "Temperature Alert (Low)", + "Temperature Alert Settings": "Temperature Alert Settings", + "Temperature Limit": "Temperature Limit", + "Temperature Restored": "Temperature Restored", "Temperature Trend": "Temperature Trend", + "Temperature reported: :temp°C": "Temperature reported: :temp°C", "Temperature updated to :temp°C": "Temperature updated to :temp°C", "Tenant": "Tenant", + "Tenant Company": "Tenant Company", "TermID": "TermID", + "Test Connection": "Test Connection", + "Test notification sent successfully.": "Test notification sent successfully.", + "Testing": "Testing", "The Super Admin role cannot be deleted.": "The Super Admin role cannot be deleted.", "The Super Admin role is immutable.": "The Super Admin role is immutable.", "The Super Admin role name cannot be modified.": "The Super Admin role name cannot be modified.", "The image is too large. Please upload an image smaller than 1MB.": "The image is too large. Please upload an image smaller than 1MB.", "The image is too large. Please upload an image smaller than 5MB.": "The image is too large. Please upload an image smaller than 5MB.", + "This Month": "This Month", + "This Week": "This Week", "This is a system administrator role. Its name is locked to ensure system stability.": "This is a system administrator role. Its name is locked to ensure system stability.", "This machine has a pending command. Please wait.": "This machine has a pending command. Please wait.", "This role belongs to another company and cannot be assigned.": "This role belongs to another company and cannot be assigned.", @@ -1643,6 +1848,7 @@ "To": "To", "To Warehouse": "To Warehouse", "To:": "To:", + "Today": "Today", "Today Cumulative Sales": "Today Cumulative Sales", "Today's Transactions": "Today's Transactions", "Total": "Total", @@ -1652,18 +1858,25 @@ "Total Gross Value": "Total Gross Value", "Total Logins": "Total Logins", "Total Machines": "Total Machines", + "Total Net Profit": "Total Net Profit", "Total Orders": "Total Orders", + "Total Product Cost": "Total Product Cost", "Total Quantity": "Total Quantity", + "Total Quantity Sold": "Total Quantity Sold", + "Total Sales": "Total Sales", + "Total Sales Amount": "Total Sales Amount", + "Total Sales Profit": "Total Sales Profit", "Total Selected": "Total Selected", "Total Slots": "Total Slots", "Total Stock": "Total Stock", "Total Stock Volume": "Total Stock Volume", "Total Warehouses": "Total Warehouses", "Total items": "Total items", + "Total transaction amount of successful payments": "Total transaction amount of successful payments", "Track": "Track", "Track Channel Limit": "Track Channel Limit", "Track Limit": "Track Limit", - "Track Limit (Track\/Spring)": "Track Limit (Track\/Spring)", + "Track Limit (Track/Spring)": "Track Limit (Track/Spring)", "Track device health and maintenance history": "Track device health and maintenance history", "Track stock levels, stock-in orders, and movement history": "Track stock levels, stock-in orders, and movement history", "Track stock-in orders and movement history": "Track stock-in orders and movement history", @@ -1675,8 +1888,12 @@ "Transfer Audit": "Transfer Audit", "Transfer Details": "Transfer Details", "Transfer In": "Transfer In", + "Transfer In Confirmation": "Transfer In Confirmation", + "Transfer Order": "Transfer Order", "Transfer Orders": "Transfer Orders", "Transfer Out": "Transfer Out", + "Transfer Out Confirmation": "Transfer Out Confirmation", + "Transfer Qty": "Transfer Qty", "Transfer Type": "Transfer Type", "Transfer completed": "Transfer completed", "Transfer in": "Transfer in", @@ -1690,13 +1907,15 @@ "Trigger": "Trigger", "Trigger Dispense": "Trigger Dispense", "Trigger Remote Dispense": "Trigger Remote Dispense", + "Triggers on unexpected connection losses (LWT) and auto-resolves with restoration reports. Regular reboots are intelligently filtered.": "Triggers on unexpected connection losses (LWT) and auto-resolves with restoration reports. Regular reboots are intelligently filtered.", + "Triggers when vending machines report motor blockages, coin/bill acceptor malfunctions, or sensor failures.": "Triggers when vending machines report motor blockages, coin/bill acceptor malfunctions, or sensor failures.", "Try using landmark names (e.g., Hualien County Government)": "Try using landmark names (e.g., Hualien County Government)", "Tutorial Page": "Tutorial Page", "Type": "Type", "Type to search or leave blank for system defaults.": "Type to search or leave blank for system defaults.", "UI Elements": "UI Elements", "Unassigned": "Unassigned", - "Unassigned \/ No Change": "Unassigned \/ No Change", + "Unassigned / No Change": "Unassigned / No Change", "Unauthorized Status": "Unauthorized Status", "Unauthorized login attempt: :account": "Unauthorized login attempt: :account", "Unauthorized: Account not authorized for this machine": "Unauthorized: Account not authorized for this machine", @@ -1734,7 +1953,10 @@ "Usage Limit": "Usage Limit", "Usage Logs": "Usage Logs", "Usage Progress": "Usage Progress", + "Usage Status": "Usage Status", + "Usage Type": "Usage Type", "Used": "Used", + "Used: :count": "Used: :count", "User": "User", "User Info": "User Info", "User logged in: :name": "User logged in: :name", @@ -1752,7 +1974,9 @@ "Validity Period (Days)": "Validity Period (Days)", "Validity Period (Hours)": "Validity Period (Hours)", "Vending": "Vending", + "Vending Machine Product Replenishment": "Vending Machine Product Replenishment", "Vending Page": "Vending Page", + "Vending machine reported a submachine hardware error.": "Vending machine reported a submachine hardware error.", "Venue Management": "Venue Management", "Verified": "Verified", "Verified Only": "Verified Only", @@ -1785,6 +2009,7 @@ "Warehouse Overview": "Warehouse Overview", "Warehouse Permissions": "Warehouse Permissions", "Warehouse Stock": "Warehouse Stock", + "Warehouse Stock Out": "Warehouse Stock Out", "Warehouse Transfer": "Warehouse Transfer", "Warehouse Type": "Warehouse Type", "Warehouse created successfully": "Warehouse created successfully", @@ -1795,6 +2020,7 @@ "Warehouse stock insufficient": "Warehouse stock insufficient", "Warehouse stock insufficient warning": "Warehouse stock insufficient warning", "Warehouse to Warehouse": "Warehouse to Warehouse", + "Warehouse to Warehouse Transfer": "Warehouse to Warehouse Transfer", "Warehouse to warehouse transfers": "Warehouse to warehouse transfers", "Warehouse updated successfully": "Warehouse updated successfully", "Warehouse updated successfully.": "Warehouse updated successfully.", @@ -1804,10 +2030,16 @@ "Warranty End": "Warranty End", "Warranty Service": "Warranty Service", "Warranty Start": "Warranty Start", + "Webhook Status": "Webhook Status", + "Webhook URL": "Webhook URL", "Welcome Gift": "Welcome Gift", + "Welcome Gift Code": "Welcome Gift Code", + "Welcome Gift Code (8 Digits)": "Welcome Gift Code (8 Digits)", "Welcome Gift Feature": "Welcome Gift Feature", "Welcome Gift Function": "Welcome Gift Function", + "Welcome Gift Name": "Welcome Gift Name", "Welcome Gift Status": "Welcome Gift Status", + "Welcome Gifts": "Welcome Gifts", "Work Content": "Work Content", "Yes, Cancel": "Yes, Cancel", "Yes, Deactivate": "Yes, Deactivate", @@ -1822,17 +2054,25 @@ "Your recent account activity": "Your recent account activity", "[PickupCode] Verification failed: :code": "[PickupCode] Verification failed: :code", "[StaffCard] Verification failed: :uid": "[StaffCard] Verification failed: :uid", + "_discord_section": "_discord_section", + "_model_temp_section": "_model_temp_section", "accounts": "Account Management", "admin": "Admin", "analysis": "Data Analysis", "and :count other items": "and :count other items", "app": "APP Maintenance", "audit": "Audit Management", + "barcode": "barcode", "basic-settings": "Basic Settings", "basic.machines": "Machine Settings", "basic.payment-configs": "Customer Payment Config", "by": "by", "cancel": "cancel", + "category": "category", + "category_created": "category_created", + "category_deleted": "category_deleted", + "category_id": "category_id", + "category_updated": "category_updated", "command.change": "Change", "command.checkout": "Checkout", "command.dispense": "Dispense", @@ -1844,18 +2084,24 @@ "command.update_ads": "Sync Ads", "command.update_products": "Sync Products", "companies": "Customer Management", + "company_id": "company_id", "completed": "Pickup Completed", "consume": "Pickup Successful", "consume_failed": "Pickup Failed", "consumed": "Consumed", + "cost": "cost", "create": "Create", + "d": "d", "data-config": "Data Configuration", "data-config.sub-account-roles": "Sub Account Roles", "data-config.sub-accounts": "Sub Accounts", + "description": "description", "disabled": "disabled", - "e.g. 500ml \/ 300g": "e.g. 500ml \/ 300g", + "e.g. 500ml / 300g": "e.g. 500ml / 300g", + "e.g. 8.5 for 85折, 8 for 8折": "e.g. 8.5 for 85折, 8 for 8折", "e.g. John Doe": "e.g. John Doe", "e.g. Main Warehouse": "e.g. Main Warehouse", + "e.g. New Guest 15% Off Discount": "e.g. New Guest 15% Off Discount", "e.g. TWSTAR": "e.g. TWSTAR", "e.g. Taiwan Star": "e.g. Taiwan Star", "e.g. Test Code for Maintenance": "e.g. Test Code for Maintenance", @@ -1869,10 +2115,14 @@ "e.g., Taipei Station": "e.g., Taipei Station", "e.g., お飲み物": "e.g., Drinks", "enabled": "enabled", + "error": "error", "failed": "failed", "files selected": "files selected", "hours ago": "hours ago", "image": "image", + "image_url": "image_url", + "info": "info", + "is_active": "is_active", "items": "items", "john@example.com": "john@example.com", "line": "LINE Config", @@ -1886,6 +2136,8 @@ "log.pickup.verify_success": "[Pickup Code] Verification successful, Code: :code", "log.pickup.verify_success_note": "Machine [:machine_sn] verified pickup code [:code]", "machines": "Machine Management", + "manufacturer": "manufacturer", + "member_price": "member_price", "members": "Member Management", "menu.analysis": "Data Analysis", "menu.analysis.change-stock": "Change Stock", @@ -1895,9 +2147,9 @@ "menu.app": "APP Maintenance", "menu.audit": "Audit Management", "menu.basic": "Basic Settings", + "menu.basic.discord-notifications": "Discord Notifications", "menu.basic.machines": "Machine Settings", "menu.basic.payment-configs": "Customer Payment Config", - "menu.basic.discord-notifications": "Discord Notifications", "menu.data-config": "Data Configuration", "menu.data-config.admin-products": "Product Status", "menu.data-config.advertisements": "Advertisement Management", @@ -1952,6 +2204,8 @@ "movement.type.remote_dispense": "Remote Dispense", "movement.type.replenishment": "Replenishment Restock", "movement.type.rollback": "Dispense Failed Rollback", + "name": "name", + "name_dictionary_key": "name_dictionary_key", "of": "of", "of items": "items", "orders": "orders", @@ -1960,6 +2214,13 @@ "permissions.accounts": "Account Management", "permissions.companies": "Customer Management", "permissions.roles": "Role Permissions", + "price": "price", + "product": "product", + "product_catalog_synced_to_all_machines": "product_catalog_synced_to_all_machines", + "product_created": "product_created", + "product_deleted": "product_deleted", + "product_status_toggled": "product_status_toggled", + "product_updated": "product_updated", "remote": "Remote Management", "reservation": "Reservation System", "roles": "Roles", @@ -1967,14 +2228,19 @@ "sales": "Sales Management", "sent": "Sent", "set": "Set", + "spec": "spec", "special-permission": "Special Permissions", + "spring_limit": "spring_limit", "standby": "Standby Ad", + "status": "status", "success": "success", "super-admin": "Super Admin", "superseded": "Superseded", "timeout": "Timeout", "times": "times", "to": "to", + "track_limit": "track_limit", + "type": "type", "update": "Update", "used": "Used", "user": "User", @@ -1985,185 +2251,5 @@ "visit_gift": "Visit Gift", "vs Yesterday": "vs Yesterday", "warehouses": "Warehouse Management", - "待填寫": "Pending", - "Import Excel": "Import Excel", - "Import Staff Cards": "Import Staff Cards", - "Excel File": "Excel File", - "Start Import": "Start Import", - "Only .xlsx, .xls, .csv files are supported (Max 5MB)": "Only .xlsx, .xls, .csv files are supported (Max 5MB)", - "Download Template": "Download Template", - "Please use our standard template to ensure data compatibility.": "Please use our standard template to ensure data compatibility.", - ":count staff cards imported successfully": ":count staff cards imported successfully", - "Import failed": "Import failed", - "System restarting": "System restarting", - "Product Report Analysis": "Product Report Analysis", - "Smart vending machine product sales, cost and profit analysis report": "Smart vending machine product sales, cost and profit analysis report", - "Real-time operational data synchronized": "Real-time operational data synchronized", - "Total Quantity Sold": "Total Quantity Sold", - "Product physical shipment count": "Product physical shipment count", - "Total Sales Amount": "Total Sales Amount", - "Sales Amount": "Sales Amount", - "Total transaction amount of successful payments": "Total transaction amount of successful payments", - "Total Product Cost": "Total Product Cost", - "Product Cost": "Product Cost", - "Sales Quantity": "Sales Quantity", - "Accumulated dynamic product purchase cost": "Accumulated dynamic product purchase cost", - "Total Sales Profit": "Total Sales Profit", - "Sales revenue minus product cost net value": "Sales revenue minus product cost net value", - "Current data indicates a loss": "Current data indicates a loss", - "Quick Filter": "Quick Filter", - "Last 7 Days": "Last 7 Days", - "Today": "Today", - "This Week": "This Week", - "Last Week": "Last Week", - "This Month": "This Month", - "Last Month": "Last Month", - "Select Product for Analysis": "Select Product for Analysis", - "All Products (ALL)": "All Products (ALL)", - "Tenant Company": "Tenant Company", - "Cross-Company \/ Headquarter Global Stats": "Cross-Company \/ Headquarter Global Stats", - "Product Sales & Profit Trend": "Product Sales & Profit Trend", - "Daily operational variance curve for selected timeframe": "Daily operational variance curve for selected timeframe", - "Detailed Analysis Data": "Detailed Analysis Data", - "Search product name, barcode...": "Search product name, barcode...", - "Export Report": "Export Report", - "Copy to Clipboard": "Copy to Clipboard", - "Export to CSV": "Export to CSV", - "Export to Excel": "Export to Excel", - "Print & PDF": "Print & PDF", - "Product Barcode": "Product Barcode", - "Quantity Sold": "Quantity Sold", - "Total Sales": "Total Sales", - "Total Net Profit": "Total Net Profit", - "Gross Margin": "Gross Margin", - "No product data matching search criteria": "No product data matching search criteria", - "Analyze Solely": "Analyze Solely", -"Configure Discord Webhook alerts for hardware exceptions and connectivity logs": "Configure Discord Webhook alerts for hardware exceptions and connectivity logs", - "Search company name or code...": "Search company name or code...", - "Company Info": "Company Info", - "Webhook URL": "Webhook URL", - "Push Status": "Push Status", - "Configured Alert Types": "Configured Alert Types", - "Not Configured": "Not Configured", - "Edit Discord Alert Settings": "Edit Discord Alert Settings", - "General Settings": "General Settings", - "Enable and paste Webhook URL": "Enable and paste Webhook URL", - "Discord Webhook URL": "Discord Webhook URL", - "Test Connection": "Test Connection", - "Sending...": "Sending...", - "Test notification sent successfully.": "Test notification sent successfully.", - "Failed to send test notification. Please verify the Webhook URL.": "Failed to send test notification. Please verify the Webhook URL.", - "An error occurred: ": "An error occurred: ", - "Discord notification settings updated successfully.": "Discord notification settings updated successfully.", - "Alert Types": "Alert Types", - "Submachine Exception (B013)": "Submachine Exception (B013)", - "Triggers when vending machines report motor blockages, coin/bill acceptor malfunctions, or sensor failures.": "Triggers when vending machines report motor blockages, coin/bill acceptor malfunctions, or sensor failures.", - "Machine Connectivity Logs (LWT)": "Machine Connectivity Logs (LWT)", - "Triggers on unexpected connection losses (LWT) and auto-resolves with restoration reports. Regular reboots are intelligently filtered.": "Triggers on unexpected connection losses (LWT) and auto-resolves with restoration reports. Regular reboots are intelligently filtered.", - "Alert Severity Levels": "Alert Severity Levels", - "Device": "Device", - "Critical failures requiring immediate hands-on attention.": "Critical failures requiring immediate hands-on attention.", - "Device connection drops or minor warnings.": "Device connection drops or minor warnings.", - "Connection recovery alerts and normal logs.": "Connection recovery alerts and normal logs.", - "Please enter Webhook URL first.": "Please enter Webhook URL first.", - "Failed to send test notification.": "Failed to send test notification.", - "An error occurred during testing.": "An error occurred during testing.", - "Search": "Search", - "Reset": "Reset", - "Notification Language": "Notification Language", - "Machine Connectivity Lost": "Connection Lost", - "System detected that the machine disconnected unexpectedly.": "System detected that the machine disconnected unexpectedly.", - "Machine Connectivity Restored": "Connection Restored", - "Machine has reconnected to the server and resumed normal heartbeat.": "Machine has reconnected to the server and resumed normal heartbeat.", - "Submachine Exception": "Submachine Exception", - "Vending machine reported a submachine hardware error.": "Vending machine reported a submachine hardware error.", - "Error Details": "Error Details", - "Error Code": "Error Code", - "Affected Slot": "Affected Slot", - "Installation Location": "Installation Location", - "Temperature Alert": "Temperature Alert", - "Temperature Alert (High)": "Temperature Alert (High)", - "Temperature Alert (Low)": "Temperature Alert (Low)", - "Temperature Restored": "Temperature Restored", - "Current temperature (:temp°C) is above the upper limit (:limit°C).": "Current temperature (:temp°C) is above the upper limit (:limit°C).", - "Current temperature (:temp°C) is below the lower limit (:limit°C).": "Current temperature (:temp°C) is below the lower limit (:limit°C).", - "Current temperature has returned to normal range (:temp°C).": "Current temperature has returned to normal range (:temp°C).", - "Temperature Limit": "Temperature Limit", - "Current Temperature": "Current Temperature", - "Submachine Alert": "Submachine Alert", - "Machine Connection Alert": "Machine Connection Alert", - - "Company Settings": "Company Settings", - "Alert Switch": "Alert Switch", - "Connectivity Logs": "Connectivity Logs", - "Device Exception": "Device Exception", - "Copy Settings From Another Machine": "Copy Settings From Another Machine", - "Custom": "Custom", - "Custom Enabled": "Custom Enabled", - "Custom Disabled (Mute Alert)": "Custom Disabled (Mute Alert)", - "Custom Upper Limit (°C)": "Custom Upper Limit (°C)", - "Custom Lower Limit (°C)": "Custom Lower Limit (°C)", - "Define custom temperature limits or inherit from model": "Define custom temperature limits or inherit from model", - "Edit Company Alert Settings": "Edit Company Alert Settings", - "Edit Machine Alert Settings": "Edit Machine Alert Settings", - "Inherit": "Inherit", - "Inherit Company": "Inherit Company", - "Inherit Model / System default": "Inherit Model / System Default", - "Leave empty to inherit company settings": "Leave empty to inherit company settings", - "Machine Specific": "Machine Specific", - "Machine-Specific Webhook": "Machine-Specific Webhook", - "Model Default": "Model Default", - "No Model": "No Model", - "Only machines under the same company can be cloned for security.": "Only machines under the same company can be cloned for security.", - "Select a machine to copy settings from...": "Select a machine to copy settings from...", - "Settings loaded from": "Settings loaded from", - "Source of temperature limit settings": "Source of temperature limit settings", - "Temp Alert Range": "Temp Alert Range", - "Temp Alert State": "Temp Alert State", - "Temperature Alert Settings": "Temperature Alert Settings", - "Webhook Status": "Webhook Status", - "Company Discord notification settings updated successfully.": "Company Discord notification settings updated successfully.", - "Machine Discord notification settings updated successfully.": "Machine Discord notification settings updated successfully.", - "Search machine name or SN...": "Search machine name or SN...", - - "Default Temp Upper Limit (°C)": "Default Temp Upper Limit (°C)", - "Default Temp Lower Limit (°C)": "Default Temp Lower Limit (°C)", - "Default Temp Limits": "Default Temp Limits", - "Default Temp Alert Upper Limit (°C)": "Default Temp Alert Upper Limit (°C)", - "Default Temp Alert Lower Limit (°C)": "Default Temp Alert Lower Limit (°C)", - "Default Temp Alert Limits": "Default Temp Alert Limits", - "Alert Types Source": "Alert Types Source", - "Inherit Company Alert Types": "Inherit Company Alert Types", - "Custom Alert Types": "Custom Alert Types", - "Effective Alert Types": "Effective Alert Types", - "Machine Alert Settings": "Machine Alert Settings", - "Configure alert types and temperature thresholds": "Configure alert types and temperature thresholds", - "Machine model saved successfully.": "Machine model saved successfully.", -"Replenishment Order": "Replenishment Order", - "Transfer Order": "Transfer Order", - "Ready to print": "Ready to print", - "Print": "Print", - "Platform Operator": "Platform Operator", - "Vending Machine Product Replenishment": "Vending Machine Product Replenishment", - "Warehouse to Warehouse Transfer": "Warehouse to Warehouse Transfer", - "Machine to Warehouse Return": "Machine to Warehouse Return", - "Order Number": "Order Number", - "Source Machine": "Source Machine", - "Assigned Personnel": "Assigned Personnel", - "Print Time": "Print Time", - "Stock Snap": "Stock Snap", - "Replenish Qty": "Replenish Qty", - "Transfer Qty": "Transfer Qty", - "Check": "Check", - "Actual Qty": "Actual Qty", - "Print Notice": "Print Notice", - "Please make sure to enable \"Background graphics\" in your browser print settings to print product images and styled components correctly.": "Please make sure to enable \"Background graphics\" in your browser print settings to print product images and styled components correctly.", - "Prepared By": "Prepared By", - "Warehouse Stock Out": "Warehouse Stock Out", - "Courier\/Replenisher": "Courier\/Replenisher", - "Machine Inbound Confirmation": "Machine Inbound Confirmation", - "Transfer Out Confirmation": "Transfer Out Confirmation", - "Courier\/Dispatcher": "Courier\/Dispatcher", - "Transfer In Confirmation": "Transfer In Confirmation", - "Print Order": "Print Order" + "warning": "warning" } diff --git a/lang/ja.json b/lang/ja.json index ac8aca7..4e94710 100644 --- a/lang/ja.json +++ b/lang/ja.json @@ -5,6 +5,7 @@ "30s": "30秒", "60 Seconds": "60秒", "60s": "60秒", + ":count staff cards imported successfully": ":count 枚のスタッフカードが正常にインポートされました", "A new verification link has been sent to your email address.": "新しい確認リンクがメールアドレスに送信されました。", "A sync command was recently sent. Please wait 1 minute.": "先ほど同期コマンドが送信されました。1分間お待ちください。", "AI Prediction": "AI予測", @@ -31,13 +32,15 @@ "Account deleted successfully.": "アカウントが正常に削除されました。", "Account updated successfully.": "アカウントが正常に更新されました。", "Account:": "アカウント:", - "Accounts \/ Machines": "アカウント \/ 機器", + "Accounts / Machines": "アカウント / 機器", + "Accumulated dynamic product purchase cost": "リアルタイム仕入コスト累計", "Action": "アクション", - "Action \/ Target": "操作 \/ 対象", + "Action / Target": "操作 / 対象", "Actions": "操作", "Active": "有効", "Active Slots": "使用中のスロット", "Active Status": "有効ステータス", + "Actual Qty": "実績数量", "Ad Settings": "広告設定", "Add Account": "アカウント追加", "Add Advertisement": "広告追加", @@ -54,6 +57,7 @@ "Add Role": "ロール追加", "Add Staff Card": "スタッフカード追加", "Add Warehouse": "倉庫追加", + "Add Welcome Gift": "ウェルカムギフトを追加", "Add new inventory items to your warehouse": "倉庫に新しい在庫アイテムを追加", "Address": "住所", "Adjust Inventory": "在庫調整", @@ -68,7 +72,7 @@ "Administrator": "管理者", "Advertisement List": "広告一覧", "Advertisement Management": "広告管理", - "Advertisement Video\/Image": "広告動画\/画像", + "Advertisement Video/Image": "広告動画/画像", "Advertisement assigned successfully": "広告の割り当てが完了しました", "Advertisement assigned successfully.": "広告の割り当てが完了しました。", "Advertisement created successfully": "広告が作成されました", @@ -78,11 +82,16 @@ "Advertisement status updated to :status": "広告のステータスが :status に更新されました", "Advertisement updated successfully": "広告が更新されました", "Advertisement updated successfully.": "広告が更新されました。", + "Affected Slot": "影響を受ける貨道", "Affiliated Company": "所属会社", "Affiliated Unit": "所属ユニット", "Affiliation": "所属", "After Qty": "変動後数量", + "Alert Severity Levels": "アラート深刻度", "Alert Summary": "アラート概要", + "Alert Switch": "アラートスイッチ", + "Alert Types": "アラートタイプ", + "Alert Types Source": "アラート種別ソース", "Alerts": "アラート", "Alerts Pending": "保留中のアラート", "Alerts Today": "本日のアラート", @@ -95,6 +104,7 @@ "All Machines": "すべての機器", "All Normal": "すべて正常", "All Permissions": "すべての権限", + "All Products (ALL)": "全商品 (ALL)", "All Slots": "すべてのスロット", "All Stable": "すべて安定", "All Status": "すべてのステータス", @@ -106,10 +116,14 @@ "All issues marked as resolved.": "すべての問題が解決済みとしてマークされました。", "All slots are fully stocked": "すべてのスロットが補充完了しました", "Amount": "金額", - "Amount \/ Payment": "金額 \/ 支払い", + "Amount / Payment": "金額 / 支払い", + "Amount Discount": "金額割引", + "An error occurred during testing.": "テスト中にエラーが発生しました。", "An error occurred while saving.": "保存中にエラーが発生しました。", + "An error occurred: ": "エラーが発生しました:", "Analysis Management": "分析管理", "Analysis Permissions": "分析権限", + "Analyze Solely": "個別分析", "Apply changes to all identical products in this machine": "この機器内のすべての同一商品に変更を適用", "Apply to all identical products in this machine": "この機器内のすべての同一商品に適用", "Approved At": "承認日時", @@ -162,6 +176,7 @@ "Assign replenishment staff": "補充スタッフを割り当て", "Assign warehouse managers": "倉庫責任者を割り当て", "Assigned Machines": "割り当てられた機器", + "Assigned Personnel": "担当者", "Assigned To": "担当者", "Assignment removed successfully.": "配信設定が削除されました。", "Associated Order": "関連注文", @@ -186,7 +201,7 @@ "Back to List": "一覧に戻る", "Badge Settings": "バッジ設定", "Barcode": "バーコード", - "Barcode \/ Material": "バーコード \/ 資材", + "Barcode / Material": "バーコード / 資材", "Based on Hours": "時間ベースで計算", "Basic Information": "基本情報", "Basic Settings": "基本設定", @@ -207,6 +222,7 @@ "CREATE STOCK TRANSFERS BETWEEN WAREHOUSES AND MACHINE RETURNS": "倉庫間の移動または機器からの返品を作成", "Calculate Replenishment": "補充量を計算", "Cancel": "キャンセル", + "Cancel Gift": "ギフトをキャンセル", "Cancel Order": "注文キャンセル", "Cancel Pass Code": "パスコードキャンセル", "Cancel Pickup Code": "受取コードキャンセル", @@ -243,12 +259,15 @@ "Change Note": "変動備考", "Change Stock": "お釣り在庫", "Channel Limits": "スロット上限", - "Channel Limits (Track\/Spring)": "スロット上限 (ベルト\/スプリング)", + "Channel Limits (Track/Spring)": "スロット上限 (ベルト/スプリング)", + "Channel Limits Config": "Channel Limits Config", "Channel Limits Configuration": "スロット上限設定", "ChannelId": "ChannelId", "ChannelSecret": "ChannelSecret", + "Check": "確認", "Checkout Time 1": "カード決済締め時間1", "Checkout Time 2": "カード決済締め時間2", + "Choose Date": "日付を選択", "Clear": "クリア", "Clear Abnormal Status": "異常状態のクリア", "Clear Filter": "フィルターをクリア", @@ -261,8 +280,8 @@ "Code": "コード", "Code Copied": "コードをコピーしました", "Coin Acceptor": "硬貨機", - "Coin\/Banknote Machine": "硬貨・紙幣機", - "Coin\/Bill Acceptor": "硬貨・紙幣機", + "Coin/Banknote Machine": "硬貨・紙幣機", + "Coin/Bill Acceptor": "硬貨・紙幣機", "Command Center": "コマンドセンター", "Command Confirmation": "コマンド確認", "Command Type": "コマンドタイプ", @@ -272,14 +291,20 @@ "Command queued successfully.": "コマンドが正常にキューされました。", "Company": "顧客企業", "Company Code": "会社コード", + "Company Discord notification settings updated successfully.": "会社の Discord 通知設定が正常に更新されました。", + "Company Info": "会社情報", "Company Information": "会社情報", "Company Level": "会社レベル", "Company Name": "会社名", + "Company Settings": "会社グローバル設定", "Complete movement history log": "完全な在庫変動履歴", "Completed": "完了済み", "Completed At": "完了日時", "Config Name": "設定名", "Configuration Name": "設定名", + "Configure Discord Webhook alerts for hardware exceptions and connectivity logs": "ハードウェア異常と接続ログ用のDiscord Webhookアラートを設定します", + "Configure alert types and temperature thresholds": "アラート種別と温度しきい値を設定", + "Configured Alert Types": "設定済みの告警タイプ", "Confirm": "確認", "Confirm Account Deactivation": "アカウント無効化の確認", "Confirm Account Status Change": "ステータス変更の確認", @@ -302,8 +327,12 @@ "Confirm this transfer?": "この在庫移動作業を確認しますか?", "Connected": "通信中", "Connecting...": "接続中...", + "Connection error": "Connection error", + "Connection is unstable (disconnected :count times in the last hour)": "Connection is unstable (disconnected :count times in the last hour)", "Connection lost (LWT)": "接続遮断", + "Connection recovery alerts and normal logs.": "接続復旧通知および通常ログ。", "Connection restored": "接続復旧", + "Connectivity Logs": "接続状態ログ", "Connectivity Status": "接続ステータス概要", "Connectivity vs Sales Correlation": "接続状態と売上の相関分析", "Consumed": "消込成功", @@ -325,8 +354,12 @@ "Copy": "コピー", "Copy Code": "コードをコピー", "Copy Link": "リンクをコピー", + "Copy Settings From Another Machine": "他の機器の設定をコピー", + "Copy to Clipboard": "クリップボードにコピー", "Cost": "原価", "Coupons": "クーポン", + "Courier/Dispatcher": "配送担当", + "Courier/Replenisher": "配送・補充担当", "Create": "作成", "Create Config": "設定作成", "Create Machine": "機器追加", @@ -349,17 +382,31 @@ "Creation Time": "作成時間", "Creator": "作成者", "Credit Card": "クレジットカード", - "Credit Card \/ Contactless": "クレジットカード\/非接触決済対応", + "Credit Card / Contactless": "クレジットカード/非接触決済対応", "Critical": "深刻", + "Critical failures requiring immediate hands-on attention.": "即座に対処が必要な重大な障害。", + "Cross-Company / Headquarter Global Stats": "複数会社間 / 本部グローバル統計", "Current": "現在", "Current Password": "現在のパスワード", "Current Status": "現在のステータス", "Current Stock": "現在庫", "Current Stocks": "現在の在庫", + "Current Temperature": "現在温度", "Current Type": "現在のタイプ", + "Current data indicates a loss": "現在データは赤字を示しています", + "Current temperature (:temp°C) is above the upper limit (:limit°C).": "現在温度 (:temp°C) が設定上限 (:limit°C) を超えています。", + "Current temperature (:temp°C) is below the lower limit (:limit°C).": "現在温度 (:temp°C) が設定下限 (:limit°C) を下回っています。", + "Current temperature has returned to normal range (:temp°C).": "現在温度は正常範囲 (:temp°C) に戻りました。", "Current:": "現:", + "Custom": "カスタム", + "Custom Alert Types": "カスタムアラート種別", "Custom Date": "カスタム日付", "Custom Date Set": "カスタム日付設定済み", + "Custom Disabled (Mute Alert)": "カスタム無効(アラート消音)", + "Custom Enabled": "カスタム有効", + "Custom Expiry": "カスタム期限", + "Custom Lower Limit (°C)": "カスタム下限温度 (°C)", + "Custom Upper Limit (°C)": "カスタム上限温度 (°C)", "Customer Details": "顧客詳細", "Customer Info": "顧客情報", "Customer List": "顧客一覧", @@ -372,9 +419,11 @@ "Customer updated successfully.": "顧客が正常に更新されました。", "Cycle Efficiency": "サイクル効率", "Daily Revenue": "本日の収益", + "Daily operational variance curve for selected timeframe": "選択期間における日次運営変動曲線", "Damage": "廃棄", "Danger Zone: Delete Account": "デンジャーゾーン:アカウント削除", "Dashboard": "ダッシュボード", + "Data Changes": "Data Changes", "Data Configuration": "データ設定", "Data Configuration Permissions": "データ設定権限", "Date": "日付", @@ -383,7 +432,14 @@ "Days": "日", "Default Donate": "デフォルトで寄付する", "Default Not Donate": "デフォルトで寄付しない", + "Default Temp Alert Limits": "デフォルト温度アラート範囲", + "Default Temp Alert Lower Limit (°C)": "デフォルト温度アラート下限 (°C)", + "Default Temp Alert Upper Limit (°C)": "デフォルト温度アラート上限 (°C)", + "Default Temp Limits": "デフォルト温度制御範囲", + "Default Temp Lower Limit (°C)": "デフォルト温度下限 (°C)", + "Default Temp Upper Limit (°C)": "デフォルト温度上限 (°C)", "Define and manage security roles and permissions.": "セキュリティロールと権限を定義・管理します。", + "Define custom temperature limits or inherit from model": "カスタム温度制限を設定するか、機器モデルから継承します", "Define new third-party payment parameters": "新しい外部決済パラメータを定義", "Delete": "削除", "Delete Account": "アカウント削除", @@ -404,12 +460,16 @@ "Delta": "変動量", "Deposit Bonus": "チャージボーナス", "Describe the repair or maintenance status...": "修理やメンテナンスの状況を説明してください...", - "Description \/ Name": "説明 \/ 名前", + "Description / Name": "説明 / 名前", "Deselect All": "すべて解除", "Detail": "詳細", + "Detailed Analysis Data": "明細分析データ", "Details": "明細", + "Device": "機台", + "Device Exception": "下位機異常", "Device Information": "デバイス情報", "Device Status Logs": "デバイスステータスログ", + "Device connection drops or minor warnings.": "機台の接続切断または軽微な警告。", "Devices": "台のデバイス", "Disable": "無効", "Disable Advertisement Confirmation": "広告無効化の確認", @@ -421,7 +481,14 @@ "Disabled": "無効済み", "Disabling this customer will also disable all accounts under this customer. Are you sure you want to continue?": "顧客を無効にすると配下の全アカウントも無効になります。続行しますか?", "Discord Notifications": "Discord通知", + "Discord Webhook URL": "Discord Webhook URL", + "Discord notification settings updated successfully.": "Discordアラート設定が正常に更新されました。", "Discount": "割引", + "Discount Amount": "Discount Amount", + "Discount Amount (NTD)": "割引金額 (NTD)", + "Discount Fold": "割引率", + "Discount Type": "割引タイプ", + "Discount Value": "割引値", "Dispense Failed": "出庫失敗", "Dispense Pending": "出庫中", "Dispense Product": "商品出庫", @@ -443,10 +510,11 @@ "Door Closed": "扉が閉まりました", "Door Opened": "扉が開きました", "Download Image": "画像をダウンロード", + "Download Template": "テンプレートのダウンロード", "Draft": "下書き", "Duration": "時間", "Duration (Seconds)": "再生秒数", - "E-Ticket (EasyCard\/iPass)": "電子チケット (EasyCard\/iPass)", + "E-Ticket (EasyCard/iPass)": "電子チケット (EasyCard/iPass)", "E.SUN Bank Scan": "玉山銀行スキャン", "E.SUN Pay": "玉山 Pay", "E.SUN QR Pay": "玉山銀行QR決済", @@ -462,9 +530,12 @@ "Edit Account": "アカウント編集", "Edit Advertisement": "広告編集", "Edit Category": "カテゴリ編集", + "Edit Company Alert Settings": "会社アラート設定を編集", "Edit Customer": "顧客編集", + "Edit Discord Alert Settings": "Discordアラート設定の編集", "Edit Expiry": "期限編集", "Edit Machine": "機器編集", + "Edit Machine Alert Settings": "機器アラート設定を編集", "Edit Machine Model": "機器モデル編集", "Edit Machine Name": "機器名編集", "Edit Machine Settings": "機器設定編集", @@ -479,6 +550,8 @@ "Edit Staff Card": "スタッフカード編集", "Edit Sub Account Role": "サブアカウントロール編集", "Edit Warehouse": "倉庫編集", + "Edit Welcome Gift": "ウェルカムギフトを編集", + "Effective Alert Types": "有効なアラート種別", "Electronic Invoice": "電子領収書", "Electronic Invoices": "電子領収書", "Elevator descending": "昇降プラットフォーム下降中", @@ -488,19 +561,21 @@ "Elevator rising": "昇降プラットフォーム上昇中", "Elevator sensor error": "昇降箱センサー異常", "Email": "メールアドレス", - "Emblem \/ Label": "エンブレム \/ ラベル", + "Emblem / Label": "エンブレム / ラベル", "Employee": "従業員", "Employee ID": "社員番号", "Empty": "空", "Empty Slot": "空きスロット", "Empty Slots": "空きスロット", "Enable": "有効", + "Enable Alerts": "Enable Alerts", "Enable Material Code": "資材コードを有効化", "Enable Points": "ポイントルールを有効化", "Enable Points Mechanism": "ポイント機能を有効化", + "Enable and paste Webhook URL": "Webhook URLを有効にして貼り付けます", "Enabled": "有効済み", "Enabled Features": "有効な機能", - "Enabled\/Disabled": "有効\/無効", + "Enabled/Disabled": "有効/無効", "End Date": "終了日", "End Time": "終了時間", "Engineer": "メンテナンス担当者", @@ -519,11 +594,14 @@ "Entire Machine": "全機器", "Equipment efficiency and OEE metrics": "設備効率および OEE 指標", "Error": "異常", + "Error Code": "異常コード", + "Error Details": "異常詳細", "Error processing request": "リクエスト処理エラー", "Error report accepted": "エラー報告を受理しました", "Error: :message (:code)": "エラー: :message (:code)", "Errors": "異常回数", "Estimated Expiry": "推定期限", + "Excel File": "Excel ファイル", "Execute": "実行", "Execute Change": "お釣り払い出し実行", "Execute Delivery Now": "今すぐ出庫実行", @@ -535,15 +613,19 @@ "Expected Expiry Date & Time": "予想期限日時", "Expected Stock": "予想在庫", "Expired": "期限切れ", - "Expired \/ Disabled": "期限切れ \/ 無効", + "Expired / Disabled": "期限切れ / 無効", "Expired Time": "掲載終了時間", "Expires At": "有効期限", "Expiring": "期限間近", "Expiry": "有効期限", "Expiry Date": "有効期限日", + "Expiry Date Set": "有効期限設定済み", "Expiry Management": "期限管理", - "Expiry Time": "期限時間", + "Expiry Time": "有効期限", "Expiry date tracking and warnings": "有効期限の追跡と警告", + "Export Report": "レポートのエクスポート", + "Export to CSV": "CSVエクスポート", + "Export to Excel": "Excelエクスポート", "Failed": "失敗", "Failed to fetch machine data.": "機器データの取得に失敗しました。", "Failed to load permissions": "権限の読み込みに失敗しました", @@ -551,102 +633,107 @@ "Failed to load tab content": "タブ内容の読み込みに失敗しました", "Failed to resolve issues.": "異常の解消に失敗しました。", "Failed to save permissions.": "権限の保存に失敗しました。", + "Failed to send command": "Failed to send command", "Failed to send sync command.": "同期コマンドの送信に失敗しました。", + "Failed to send test notification.": "テスト通知の送信に失敗しました。", + "Failed to send test notification. Please verify the Webhook URL.": "テスト通知の送信に失敗しました。Webhook URLを確認してください。", "Failed to update machine images: ": "機器画像の更新に失敗しました: ", "Feature Settings": "機能設定", "Feature Toggles": "機能切り替え", + "Field": "Field", "Fill Quantity": "補充数", "Fill Rate": "充填率", "Fill in the device repair or maintenance details": "デバイスの修理またはメンテナンスの詳細を入力", "Fill in the product details below": "以下に商品の詳細情報を入力してください", "Filter": "フィルター", + "Filter by Company": "Filter by Company", "Filter by Warehouse Presence": "倉庫の在庫状況で絞り込む", "Firmware Version": "ファームウェアバージョン", "Firmware updated to :version": "ファームウェア更新完了 : :version", "Fleet Avg OEE": "全機器平均 OEE", "Fleet Performance": "全機器パフォーマンス", "Flow ID": "フローID", - "Flow ID \/ Amount": "フローID \/ 金額", - "Flow ID \/ Date": "フローID \/ 日付", - "Flow ID \/ Machine": "フローID \/ 機器", - "Flow ID \/ Order": "フローID \/ 関連注文", - "Flow ID \/ Product": "フローID \/ 商品", - "Flow ID \/ Slot": "フローID \/ スロット", - "Flow ID \/ Slot \/ Amount": "フローID \/ スロット \/ 金額", - "Flow ID \/ Slot \/ Date": "フローID \/ スロット \/ 日付", - "Flow ID \/ Slot \/ Machine": "フローID \/ スロット \/ 機器", - "Flow ID \/ Slot \/ Order": "フローID \/ スロット \/ 関連注文", - "Flow ID \/ Slot \/ Product": "フローID \/ スロット \/ 商品", - "Flow ID \/ Slot \/ Product \/ Amount": "フローID \/ スロット \/ 商品 \/ 金額", - "Flow ID \/ Slot \/ Product \/ Amount \/ Date": "フローID \/ スロット \/ 商品 \/ 金額 \/ 日付", - "Flow ID \/ Slot \/ Product \/ Amount \/ Date \/ Order": "フローID \/ スロット \/ 商品 \/ 金額 \/ 日付 \/ 関連注文", - "Flow ID \/ Slot \/ Product \/ Amount \/ Date \/ Time": "フローID \/ スロット \/ 商品 \/ 金額 \/ 日付 \/ 時間", - "Flow ID \/ Slot \/ Product \/ Amount \/ Date \/ Time \/ Order": "フローID \/ スロット \/ 商品 \/ 金額 \/ 日付 \/ 時間 \/ 関連注文", - "Flow ID \/ Slot \/ Product \/ Amount \/ Machine": "フローID \/ スロット \/ 商品 \/ 金額 \/ 機器", - "Flow ID \/ Slot \/ Product \/ Amount \/ Machine \/ Date": "フローID \/ スロット \/ 商品 \/ 金額 \/ 機器 \/ 日付", - "Flow ID \/ Slot \/ Product \/ Amount \/ Machine \/ Date \/ Order": "フローID \/ スロット \/ 商品 \/ 金額 \/ 機器 \/ 日付 \/ 関連注文", - "Flow ID \/ Slot \/ Product \/ Amount \/ Machine \/ Date \/ Time": "フローID \/ スロット \/ 商品 \/ 金額 \/ 機器 \/ 日付 \/ 時間", - "Flow ID \/ Slot \/ Product \/ Amount \/ Machine \/ Date \/ Time \/ Order": "フローID \/ スロット \/ 商品 \/ 金額 \/ 機器 \/ 日付 \/ 時間 \/ 関連注文", - "Flow ID \/ Slot \/ Product \/ Amount \/ Machine \/ Order": "フローID \/ スロット \/ 商品 \/ 金額 \/ 機器 \/ 関連注文", - "Flow ID \/ Slot \/ Product \/ Amount \/ Machine \/ Time": "フローID \/ スロット \/ 商品 \/ 金額 \/ 機器 \/ 時間", - "Flow ID \/ Slot \/ Product \/ Amount \/ Machine \/ Time \/ Order": "フローID \/ スロット \/ 商品 \/ 金額 \/ 機器 \/ 時間 \/ 関連注文", - "Flow ID \/ Slot \/ Product \/ Amount \/ Order": "フローID \/ スロット \/ 商品 \/ 金額 \/ 関連注文", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status": "フローID \/ スロット \/ 商品 \/ 金額 \/ ステータス", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Date": "フローID \/ スロット \/ 商品 \/ 金額 \/ ステータス \/ 日付", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Date \/ Order": "フローID \/ スロット \/ 商品 \/ 金額 \/ ステータス \/ 日付 \/ 関連注文", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Date \/ Time": "フローID \/ スロット \/ 商品 \/ 金額 \/ ステータス \/ 日付 \/ 時間", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Date \/ Time \/ Order": "フローID \/ スロット \/ 商品 \/ 金額 \/ ステータス \/ 日付 \/ 時間 \/ 関連注文", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Machine": "フローID \/ スロット \/ 商品 \/ 金額 \/ ステータス \/ 機器", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Machine \/ Date": "フローID \/ スロット \/ 商品 \/ 金額 \/ ステータス \/ 機器 \/ 日付", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Machine \/ Date \/ Order": "フローID \/ スロット \/ 商品 \/ 金額 \/ ステータス \/ 機器 \/ 日付 \/ 関連注文", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Machine \/ Date \/ Time": "フローID \/ スロット \/ 商品 \/ 金額 \/ ステータス \/ 機器 \/ 日付 \/ 時間", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Machine \/ Date \/ Time \/ Order": "フローID \/ スロット \/ 商品 \/ 金額 \/ ステータス \/ 機器 \/ 日付 \/ 時間 \/ 関連注文", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Machine \/ Date \/ Time \/ Order \/ Extra": "フローID \/ スロット \/ 商品 \/ 金額 \/ ステータス \/ 機器 \/ 日付 \/ 時間 \/ 関連注文 \/ 追加", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Machine \/ Date \/ Time \/ Order \/ Extra \/ More": "フローID \/ スロット \/ 商品 \/ 金額 \/ ステータス \/ 機器 \/ 日付 \/ 時間 \/ 関連注文 \/ 追加 \/ さらに", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Machine \/ Date \/ Time \/ Order \/ Extra \/ More \/ Done": "フローID \/ スロット \/ 商品 \/ 金額 \/ ステータス \/ 機器 \/ 日付 \/ 時間 \/ 関連注文 \/ 追加 \/ さらに \/ 完了", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Machine \/ Order": "フローID \/ スロット \/ 商品 \/ 金額 \/ ステータス \/ 機器 \/ 関連注文", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Machine \/ Time": "フローID \/ スロット \/ 商品 \/ 金額 \/ ステータス \/ 機器 \/ 時間", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Machine \/ Time \/ Order": "フローID \/ スロット \/ 商品 \/ 金額 \/ ステータス \/ 機器 \/ 時間 \/ 関連注文", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Order": "フローID \/ スロット \/ 商品 \/ 金額 \/ ステータス \/ 関連注文", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Time": "フローID \/ スロット \/ 商品 \/ 金額 \/ ステータス \/ 時間", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Time \/ Order": "フローID \/ スロット \/ 商品 \/ 金額 \/ ステータス \/ 時間 \/ 関連注文", - "Flow ID \/ Slot \/ Product \/ Amount \/ Time": "フローID \/ スロット \/ 商品 \/ 金額 \/ 時間", - "Flow ID \/ Slot \/ Product \/ Amount \/ Time \/ Order": "フローID \/ スロット \/ 商品 \/ 時間 \/ 関連注文", - "Flow ID \/ Slot \/ Product \/ Date": "フローID \/ スロット \/ 商品 \/ 日付", - "Flow ID \/ Slot \/ Product \/ Date \/ Order": "フローID \/ スロット \/ 商品 \/ 日付 \/ 関連注文", - "Flow ID \/ Slot \/ Product \/ Date \/ Time": "フローID \/ スロット \/ 商品 \/ 日付 \/ 時間", - "Flow ID \/ Slot \/ Product \/ Date \/ Time \/ Order": "フローID \/ スロット \/ 商品 \/ 日付 \/ 時間 \/ 関連注文", - "Flow ID \/ Slot \/ Product \/ Machine": "フローID \/ スロット \/ 商品 \/ 機器", - "Flow ID \/ Slot \/ Product \/ Machine \/ Date": "フローID \/ スロット \/ 商品 \/ 機器 \/ 日付", - "Flow ID \/ Slot \/ Product \/ Machine \/ Date \/ Order": "フローID \/ スロット \/ 商品 \/ 機器 \/ 日付 \/ 関連注文", - "Flow ID \/ Slot \/ Product \/ Machine \/ Date \/ Time": "フローID \/ スロット \/ 商品 \/ 機器 \/ 日付 \/ 時間", - "Flow ID \/ Slot \/ Product \/ Machine \/ Date \/ Time \/ Order": "フローID \/ スロット \/ 商品 \/ 機器 \/ 日付 \/ 時間 \/ 関連注文", - "Flow ID \/ Slot \/ Product \/ Machine \/ Order": "フローID \/ スロット \/ 商品 \/ 機器 \/ 関連注文", - "Flow ID \/ Slot \/ Product \/ Machine \/ Time": "フローID \/ スロット \/ 商品 \/ 機器 \/ 時間", - "Flow ID \/ Slot \/ Product \/ Machine \/ Time \/ Order": "フローID \/ スロット \/ 商品 \/ 機器 \/ 時間 \/ 関連注文", - "Flow ID \/ Slot \/ Product \/ Order": "フローID \/ スロット \/ 商品 \/ 関連注文", - "Flow ID \/ Slot \/ Product \/ Status": "フローID \/ スロット \/ 商品 \/ ステータス", - "Flow ID \/ Slot \/ Product \/ Status \/ Date": "フローID \/ スロット \/ 商品 \/ ステータス \/ 日付", - "Flow ID \/ Slot \/ Product \/ Status \/ Date \/ Order": "フローID \/ スロット \/ 商品 \/ ステータス \/ 日付 \/ 関連注文", - "Flow ID \/ Slot \/ Product \/ Status \/ Date \/ Time": "フローID \/ スロット \/ 商品 \/ ステータス \/ 日付 \/ 時間", - "Flow ID \/ Slot \/ Product \/ Status \/ Date \/ Time \/ Order": "フローID \/ スロット \/ 商品 \/ ステータス \/ 日付 \/ 時間 \/ 関連注文", - "Flow ID \/ Slot \/ Product \/ Status \/ Machine": "フローID \/ スロット \/ 商品 \/ ステータス \/ 機器", - "Flow ID \/ Slot \/ Product \/ Status \/ Machine \/ Date": "フローID \/ スロット \/ 商品 \/ ステータス \/ 機器 \/ 日付", - "Flow ID \/ Slot \/ Product \/ Status \/ Machine \/ Date \/ Order": "フローID \/ スロット \/ 商品 \/ ステータス \/ 機器 \/ 日付 \/ 関連注文", - "Flow ID \/ Slot \/ Product \/ Status \/ Machine \/ Date \/ Time": "フローID \/ スロット \/ 商品 \/ ステータス \/ 機器 \/ 日付 \/ 時間", - "Flow ID \/ Slot \/ Product \/ Status \/ Machine \/ Date \/ Time \/ Order": "フローID \/ スロット \/ 商品 \/ ステータス \/ 機器 \/ 日付 \/ 時間 \/ 関連注文", - "Flow ID \/ Slot \/ Product \/ Status \/ Machine \/ Order": "フローID \/ スロット \/ 商品 \/ ステータス \/ 機器 \/ 関連注文", - "Flow ID \/ Slot \/ Product \/ Status \/ Machine \/ Time": "フローID \/ スロット \/ 商品 \/ ステータス \/ 機器 \/ 時間", - "Flow ID \/ Slot \/ Product \/ Status \/ Machine \/ Time \/ Order": "フローID \/ スロット \/ 商品 \/ ステータス \/ 機器 \/ 時間 \/ 関連注文", - "Flow ID \/ Slot \/ Product \/ Status \/ Order": "フローID \/ スロット \/ 商品 \/ ステータス \/ 関連注文", - "Flow ID \/ Slot \/ Product \/ Status \/ Time": "フローID \/ スロット \/ 商品 \/ ステータス \/ 時間", - "Flow ID \/ Slot \/ Product \/ Status \/ Time \/ Order": "フローID \/ スロット \/ 商品 \/ ステータス \/ 時間 \/ 関連注文", - "Flow ID \/ Slot \/ Product \/ Time": "フローID \/ スロット \/ 商品 \/ 時間", - "Flow ID \/ Slot \/ Product \/ Time \/ Order": "フローID \/ スロット \/ 商品 \/ 時間 \/ 関連注文", - "Flow ID \/ Slot \/ Status": "フローID \/ スロット \/ ステータス", - "Flow ID \/ Slot \/ Time": "フローID \/ スロット \/ 時間", - "Flow ID \/ Status": "フローID \/ ステータス", - "Flow ID \/ Time": "フローID \/ 時間", + "Flow ID / Amount": "フローID / 金額", + "Flow ID / Date": "フローID / 日付", + "Flow ID / Machine": "フローID / 機器", + "Flow ID / Order": "フローID / 関連注文", + "Flow ID / Product": "フローID / 商品", + "Flow ID / Slot": "フローID / スロット", + "Flow ID / Slot / Amount": "フローID / スロット / 金額", + "Flow ID / Slot / Date": "フローID / スロット / 日付", + "Flow ID / Slot / Machine": "フローID / スロット / 機器", + "Flow ID / Slot / Order": "フローID / スロット / 関連注文", + "Flow ID / Slot / Product": "フローID / スロット / 商品", + "Flow ID / Slot / Product / Amount": "フローID / スロット / 商品 / 金額", + "Flow ID / Slot / Product / Amount / Date": "フローID / スロット / 商品 / 金額 / 日付", + "Flow ID / Slot / Product / Amount / Date / Order": "フローID / スロット / 商品 / 金額 / 日付 / 関連注文", + "Flow ID / Slot / Product / Amount / Date / Time": "フローID / スロット / 商品 / 金額 / 日付 / 時間", + "Flow ID / Slot / Product / Amount / Date / Time / Order": "フローID / スロット / 商品 / 金額 / 日付 / 時間 / 関連注文", + "Flow ID / Slot / Product / Amount / Machine": "フローID / スロット / 商品 / 金額 / 機器", + "Flow ID / Slot / Product / Amount / Machine / Date": "フローID / スロット / 商品 / 金額 / 機器 / 日付", + "Flow ID / Slot / Product / Amount / Machine / Date / Order": "フローID / スロット / 商品 / 金額 / 機器 / 日付 / 関連注文", + "Flow ID / Slot / Product / Amount / Machine / Date / Time": "フローID / スロット / 商品 / 金額 / 機器 / 日付 / 時間", + "Flow ID / Slot / Product / Amount / Machine / Date / Time / Order": "フローID / スロット / 商品 / 金額 / 機器 / 日付 / 時間 / 関連注文", + "Flow ID / Slot / Product / Amount / Machine / Order": "フローID / スロット / 商品 / 金額 / 機器 / 関連注文", + "Flow ID / Slot / Product / Amount / Machine / Time": "フローID / スロット / 商品 / 金額 / 機器 / 時間", + "Flow ID / Slot / Product / Amount / Machine / Time / Order": "フローID / スロット / 商品 / 金額 / 機器 / 時間 / 関連注文", + "Flow ID / Slot / Product / Amount / Order": "フローID / スロット / 商品 / 金額 / 関連注文", + "Flow ID / Slot / Product / Amount / Status": "フローID / スロット / 商品 / 金額 / ステータス", + "Flow ID / Slot / Product / Amount / Status / Date": "フローID / スロット / 商品 / 金額 / ステータス / 日付", + "Flow ID / Slot / Product / Amount / Status / Date / Order": "フローID / スロット / 商品 / 金額 / ステータス / 日付 / 関連注文", + "Flow ID / Slot / Product / Amount / Status / Date / Time": "フローID / スロット / 商品 / 金額 / ステータス / 日付 / 時間", + "Flow ID / Slot / Product / Amount / Status / Date / Time / Order": "フローID / スロット / 商品 / 金額 / ステータス / 日付 / 時間 / 関連注文", + "Flow ID / Slot / Product / Amount / Status / Machine": "フローID / スロット / 商品 / 金額 / ステータス / 機器", + "Flow ID / Slot / Product / Amount / Status / Machine / Date": "フローID / スロット / 商品 / 金額 / ステータス / 機器 / 日付", + "Flow ID / Slot / Product / Amount / Status / Machine / Date / Order": "フローID / スロット / 商品 / 金額 / ステータス / 機器 / 日付 / 関連注文", + "Flow ID / Slot / Product / Amount / Status / Machine / Date / Time": "フローID / スロット / 商品 / 金額 / ステータス / 機器 / 日付 / 時間", + "Flow ID / Slot / Product / Amount / Status / Machine / Date / Time / Order": "フローID / スロット / 商品 / 金額 / ステータス / 機器 / 日付 / 時間 / 関連注文", + "Flow ID / Slot / Product / Amount / Status / Machine / Date / Time / Order / Extra": "フローID / スロット / 商品 / 金額 / ステータス / 機器 / 日付 / 時間 / 関連注文 / 追加", + "Flow ID / Slot / Product / Amount / Status / Machine / Date / Time / Order / Extra / More": "フローID / スロット / 商品 / 金額 / ステータス / 機器 / 日付 / 時間 / 関連注文 / 追加 / さらに", + "Flow ID / Slot / Product / Amount / Status / Machine / Date / Time / Order / Extra / More / Done": "フローID / スロット / 商品 / 金額 / ステータス / 機器 / 日付 / 時間 / 関連注文 / 追加 / さらに / 完了", + "Flow ID / Slot / Product / Amount / Status / Machine / Order": "フローID / スロット / 商品 / 金額 / ステータス / 機器 / 関連注文", + "Flow ID / Slot / Product / Amount / Status / Machine / Time": "フローID / スロット / 商品 / 金額 / ステータス / 機器 / 時間", + "Flow ID / Slot / Product / Amount / Status / Machine / Time / Order": "フローID / スロット / 商品 / 金額 / ステータス / 機器 / 時間 / 関連注文", + "Flow ID / Slot / Product / Amount / Status / Order": "フローID / スロット / 商品 / 金額 / ステータス / 関連注文", + "Flow ID / Slot / Product / Amount / Status / Time": "フローID / スロット / 商品 / 金額 / ステータス / 時間", + "Flow ID / Slot / Product / Amount / Status / Time / Order": "フローID / スロット / 商品 / 金額 / ステータス / 時間 / 関連注文", + "Flow ID / Slot / Product / Amount / Time": "フローID / スロット / 商品 / 金額 / 時間", + "Flow ID / Slot / Product / Amount / Time / Order": "フローID / スロット / 商品 / 時間 / 関連注文", + "Flow ID / Slot / Product / Date": "フローID / スロット / 商品 / 日付", + "Flow ID / Slot / Product / Date / Order": "フローID / スロット / 商品 / 日付 / 関連注文", + "Flow ID / Slot / Product / Date / Time": "フローID / スロット / 商品 / 日付 / 時間", + "Flow ID / Slot / Product / Date / Time / Order": "フローID / スロット / 商品 / 日付 / 時間 / 関連注文", + "Flow ID / Slot / Product / Machine": "フローID / スロット / 商品 / 機器", + "Flow ID / Slot / Product / Machine / Date": "フローID / スロット / 商品 / 機器 / 日付", + "Flow ID / Slot / Product / Machine / Date / Order": "フローID / スロット / 商品 / 機器 / 日付 / 関連注文", + "Flow ID / Slot / Product / Machine / Date / Time": "フローID / スロット / 商品 / 機器 / 日付 / 時間", + "Flow ID / Slot / Product / Machine / Date / Time / Order": "フローID / スロット / 商品 / 機器 / 日付 / 時間 / 関連注文", + "Flow ID / Slot / Product / Machine / Order": "フローID / スロット / 商品 / 機器 / 関連注文", + "Flow ID / Slot / Product / Machine / Time": "フローID / スロット / 商品 / 機器 / 時間", + "Flow ID / Slot / Product / Machine / Time / Order": "フローID / スロット / 商品 / 機器 / 時間 / 関連注文", + "Flow ID / Slot / Product / Order": "フローID / スロット / 商品 / 関連注文", + "Flow ID / Slot / Product / Status": "フローID / スロット / 商品 / ステータス", + "Flow ID / Slot / Product / Status / Date": "フローID / スロット / 商品 / ステータス / 日付", + "Flow ID / Slot / Product / Status / Date / Order": "フローID / スロット / 商品 / ステータス / 日付 / 関連注文", + "Flow ID / Slot / Product / Status / Date / Time": "フローID / スロット / 商品 / ステータス / 日付 / 時間", + "Flow ID / Slot / Product / Status / Date / Time / Order": "フローID / スロット / 商品 / ステータス / 日付 / 時間 / 関連注文", + "Flow ID / Slot / Product / Status / Machine": "フローID / スロット / 商品 / ステータス / 機器", + "Flow ID / Slot / Product / Status / Machine / Date": "フローID / スロット / 商品 / ステータス / 機器 / 日付", + "Flow ID / Slot / Product / Status / Machine / Date / Order": "フローID / スロット / 商品 / ステータス / 機器 / 日付 / 関連注文", + "Flow ID / Slot / Product / Status / Machine / Date / Time": "フローID / スロット / 商品 / ステータス / 機器 / 日付 / 時間", + "Flow ID / Slot / Product / Status / Machine / Date / Time / Order": "フローID / スロット / 商品 / ステータス / 機器 / 日付 / 時間 / 関連注文", + "Flow ID / Slot / Product / Status / Machine / Order": "フローID / スロット / 商品 / ステータス / 機器 / 関連注文", + "Flow ID / Slot / Product / Status / Machine / Time": "フローID / スロット / 商品 / ステータス / 機器 / 時間", + "Flow ID / Slot / Product / Status / Machine / Time / Order": "フローID / スロット / 商品 / ステータス / 機器 / 時間 / 関連注文", + "Flow ID / Slot / Product / Status / Order": "フローID / スロット / 商品 / ステータス / 関連注文", + "Flow ID / Slot / Product / Status / Time": "フローID / スロット / 商品 / ステータス / 時間", + "Flow ID / Slot / Product / Status / Time / Order": "フローID / スロット / 商品 / ステータス / 時間 / 関連注文", + "Flow ID / Slot / Product / Time": "フローID / スロット / 商品 / 時間", + "Flow ID / Slot / Product / Time / Order": "フローID / スロット / 商品 / 時間 / 関連注文", + "Flow ID / Slot / Status": "フローID / スロット / ステータス", + "Flow ID / Slot / Time": "フローID / スロット / 時間", + "Flow ID / Status": "フローID / ステータス", + "Flow ID / Time": "フローID / 時間", "Force End Session": "セッションを強制終了", "Force end current session": "現在のセッションを強制終了", "From": "元", @@ -658,6 +745,7 @@ "Full Points": "フルポイント", "Functional Settings": "機能設定", "Games": "ゲーム", + "General Settings": "基本設定", "General permissions not linked to a specific menu.": "特定のメニューに紐付かない一般権限。", "Generate": "生成", "Generate New Code": "新コード生成", @@ -672,6 +760,7 @@ "Got it": "了解しました", "Grant UI Access": "UIアクセスを開放", "Grid View": "グリッドビュー", + "Gross Margin": "粗利益率", "Half Points": "ハーフポイント", "Half Points Amount": "ハーフポイント金額", "Hardware & Network": "ハードウェア・ネットワーク", @@ -697,18 +786,27 @@ "ITEM": "アイテム", "Identification": "識別情報", "Identity & Codes": "識別・コード", + "Identity and Codes": "Identity and Codes", "Image": "画像", "Image Downloaded": "画像をダウンロードしました", "Immediate": "即時", + "Import Excel": "Excel インポート", + "Import Staff Cards": "スタッフカードのインポート", + "Import failed": "インポート失敗", "In Stock": "現在庫", "Inactive": "停止中", - "Includes Credit Card\/Mobile Pay": "クレジット\/QR決済を含む", + "Includes Credit Card/Mobile Pay": "クレジット/QR決済を含む", "Indefinite": "無期限", "Info": "情報", + "Inherit": "継承", + "Inherit Company": "会社設定を継承", + "Inherit Company Alert Types": "会社のアラート種別を継承", + "Inherit Model / System default": "モデル / システムデフォルトを継承", "Initial Admin Account": "初期管理アカウント", "Initial Role": "初期ロール", "Initial contract registration": "初期契約登録", "Installation": "設置", + "Installation Location": "設置場所", "Insufficient stock for transfer": "在庫不足のため移動できません", "Invalid personnel selection": "無効な担当者選択", "Invalid status transition": "無効なステータス遷移", @@ -721,8 +819,8 @@ "Invoice Date": "発行日", "Invoice Information": "領収書情報", "Invoice Number": "領収書番号", - "Invoice Number \/ Flow ID": "領収書番号 \/ フローID", - "Invoice Number \/ Time": "領収書番号 \/ 時間", + "Invoice Number / Flow ID": "領収書番号 / フローID", + "Invoice Number / Time": "領収書番号 / 時間", "Invoice Status": "発行ステータス", "Issued At": "発行日時", "Item List": "商品リスト", @@ -740,18 +838,22 @@ "LINE Pay Direct Settings Description": "LINE Pay 直結設定", "LINE_PAY_CHANNEL_ID": "LINE Pay チャンネルID", "LIVE": "ライブ", + "Last 7 Days": "過去7日間", "Last Communication": "最終通信", "Last Heartbeat": "最終ハートビート", + "Last Month": "先月", "Last Page": "最終ページ", "Last Signal": "最終信号", "Last Sync": "最終通信", "Last Time": "最終時間", "Last Updated": "最終更新日", "Last Used": "最終使用", + "Last Week": "先週", "Latitude": "緯度", "Lease": "リース", "Leave empty for permanent code": "空欄で無期限コードになります", "Leave empty or 0 for permanent code": "空欄または0で無期限コードになります", + "Leave empty to inherit company settings": "空白のままにすると会社のグローバル設定を継承します", "Level": "レベル", "Line Coupons": "LINEクーポン", "Line Machines": "LINE機器", @@ -770,7 +872,6 @@ "Loading Data": "データを読み込み中", "Loading failed": "読み込み失敗", "Loading machines...": "機器を読み込み中...", - "Loading...": "読み込み中...", "Location": "場所", "Location found!": "座標を取得しました!", "Location not found": "場所が見つかりません。ランドマーク名(例:花蓮県庁)を使用してみてください", @@ -780,6 +881,7 @@ "Lock Page Lock": "機器アプリロック", "Lock Page Unlock": "機器アプリロック解除", "Locked Page": "ロックページ", + "Log Details": "Log Details", "Log Time": "記録時間", "Login Alert": "ログイン警告", "Login History": "ログイン履歴", @@ -794,18 +896,26 @@ "Low stock and out-of-stock alerts": "低在庫と欠品のアラート", "Loyalty & Features": "マーケティング・ポイント", "Machine": "自販機", - "Machine \/ Date": "機器 \/ 日付", - "Machine \/ Employee": "機器 \/ 従業員", - "Machine \/ Pass Code": "機器 \/ パスコード", - "Machine \/ Slot": "機器 \/ スロット", + "Machine / Date": "機器 / 日付", + "Machine / Employee": "機器 / 従業員", + "Machine / Pass Code": "機器 / パスコード", + "Machine / Slot": "機器 / スロット", + "Machine / Welcome Gift": "デバイス / ウェルカムギフト", "Machine Advertisement Settings": "機器広告設定", + "Machine Alert Settings": "機台アラート設定", + "Machine Connection Alert": "マシン接続アラート", + "Machine Connectivity Logs (LWT)": "機台接続ログ (LWT)", + "Machine Connectivity Lost": "マシン接続切断", + "Machine Connectivity Restored": "マシン接続復旧", "Machine Count": "機器数", "Machine Details": "機器詳細", + "Machine Discord notification settings updated successfully.": "機器の Discord 通知設定が正常に更新されました。", "Machine Distribution": "機器分布", "Machine Distribution Map": "機器分布マップ", "Machine Flow ID": "機器フローID", - "Machine Flow ID \/ Time": "機器フローID \/ 時間", + "Machine Flow ID / Time": "機器フローID / 時間", "Machine Images": "機器写真", + "Machine Inbound Confirmation": "入庫確認", "Machine Info": "機器情報", "Machine Information": "機器情報", "Machine Inventory": "機器在庫", @@ -828,6 +938,7 @@ "Machine Serial": "機器シリアル", "Machine Serial No": "機器シリアル番号", "Machine Settings": "機器設定", + "Machine Specific": "機器専用", "Machine Status": "自販機ステータス", "Machine Status List": "機器稼働ステータスリスト", "Machine Stock": "機器在庫", @@ -836,18 +947,22 @@ "Machine Utilization": "機器稼働率", "Machine created successfully.": "機器が正常に作成されました。", "Machine deleted successfully.": "機器が正常に削除されました。", + "Machine has reconnected to the server and resumed normal heartbeat.": "マシンがサーバーに再接続し、通常のハートビートを再開しました。", "Machine images updated successfully.": "機器画像が正常に更新されました。", "Machine is heartbeat normal": "機器の通信は正常です", "Machine model created successfully.": "機器モデルが正常に作成されました。", "Machine model deleted successfully.": "機器モデルが正常に削除されました。", + "Machine model saved successfully.": "機器モデルが正常に追加されました。", "Machine model updated successfully.": "機器モデルが正常に更新されました。", "Machine normal": "機器システム正常", "Machine not found": "機器が見つかりません", "Machine permissions updated successfully.": "機器権限が正常に更新されました。", "Machine settings updated successfully.": "機器設定が正常に更新されました。", "Machine to Warehouse": "機器から倉庫", + "Machine to Warehouse Return": "自販機から倉庫への返品", "Machine to warehouse returns": "機器から倉庫への返却", "Machine updated successfully.": "機器が正常に更新されました。", + "Machine-Specific Webhook": "機器専用 Webhook", "Machines": "機器管理", "Machines Online": "オンライン機器", "Main": "本庫", @@ -868,10 +983,12 @@ "Manage administrative and tenant accounts": "システム管理者と顧客アカウントを管理", "Manage all tenant accounts and validity": "すべての顧客アカウントと有効期限を管理", "Manage employee IC cards and track usage logs.": "従業員ICカードの管理と使用履歴の追跡。", + "Manage machine access permissions": "Manage machine access permissions", "Manage multi-use authorization codes for testing and maintenance": "テストおよびメンテナンス用の多用途認証コードを管理", "Manage stock levels, stock-in orders, and movement history": "在庫レベル、入庫伝票、変動履歴を管理", "Manage stock transfers between warehouses and machine returns": "倉庫間の在庫移動と機器からの返却を管理", "Manage warehouse stock levels, stock-in orders, adjustments, and movement history": "倉庫の在庫レベル、入庫伝票、調整、変動履歴を管理", + "Manage welcoming promotion codes for new guests": "新規顧客向けのウェルカムギフト設定と割引コードの管理", "Manage your ad material details": "広告素材の詳細を管理", "Manage your catalog, categories, and inventory settings.": "カタログ、カテゴリ、および在庫設定を管理。", "Manage your catalog, prices, and multilingual details.": "カタログ、価格、および多言語詳細を管理。", @@ -884,6 +1001,7 @@ "Manual Sync Ads": "手動広告同期", "Manual Sync Products": "手動商品同期", "Manufacturer": "製造メーカー", + "Marketing and Loyalty": "Marketing and Loyalty", "Material Code": "資材コード", "Material Name": "素材名", "Material Type": "素材タイプ", @@ -930,10 +1048,12 @@ "Microwave door opened": "電子レンジ扉開放", "Min 8 characters": "最低 8文字", "Model": "機器モデル", + "Model Default": "モデルデフォルト", "Model Name": "モデル名", "Model changed to :model": "モデルが :model に変更されました", "Models": "モデル一覧", "Modification History": "変更履歴", + "Modified fields": "Modified fields", "Modifying your own administrative permissions may result in losing access to certain system functions.": "自分自身の管理権限を変更すると、一部のシステム機能にアクセスできなくなる可能性があります。", "Monitor and manage stock levels across your fleet": "すべての機器の在庫レベルを監視および管理", "Monitor events and system activity across your vending fleet.": "すべての自販機のイベントとシステムアクティビティを監視。", @@ -945,9 +1065,9 @@ "Movement History": "変動履歴", "Movement Logs": "変動ログ", "Multilingual Names": "多言語名", - "N\/A": "なし", + "N/A": "なし", "Name": "名前", - "Name \/ Machine": "名前 \/ 機器", + "Name / Machine": "名前 / 機器", "Name in English": "英語名", "Name in Japanese": "日本語名", "Name in Traditional Chinese": "繁体字中国語名", @@ -955,6 +1075,7 @@ "Needs replenishment": "補充が必要", "Never Connected": "接続履歴なし", "Never Used": "未使用", + "New": "New", "New Command": "新規コマンド", "New Machine Name": "新機器名", "New Password": "新パスワード", @@ -965,11 +1086,13 @@ "New Stock-In Order": "新規入庫伝票", "New Sub Account Role": "新しいサブアカウントロール", "New Transfer": "新規移動伝票", + "New Value": "New Value", "Next": "次へ", "No Company": "システム", "No Invoice": "領収書を発行しない", "No Location": "位置情報なし", "No Machine Selected": "機器が選択されていません", + "No Model": "モデル未設定", "No accounts found": "アカウントが見つかりません", "No active cargo lanes found": "アクティブなスロットが見つかりません", "No additional notes": "追加のメモはありません", @@ -979,11 +1102,13 @@ "No assignments": "割り当てなし", "No associated order found": "関連する注文が見つかりません", "No categories found.": "カテゴリが見つかりません。", + "No changes detected": "No changes detected", "No command history": "コマンド履歴なし", "No configurations found": "設定が見つかりません", "No content provided": "コンテンツが提供されていません", "No customers found": "顧客が見つかりません", "No data available": "データなし", + "No detailed changes recorded": "No detailed changes recorded", "No file uploaded.": "ファイルがアップロードされていません。", "No heartbeat for over 30 seconds": "30秒以上ハートビートがありません", "No history records": "履歴記録なし", @@ -1001,9 +1126,11 @@ "No materials available": "利用可能な素材がありません", "No movement records found": "変動記録が見つかりません", "No movements found": "変動が見つかりません", + "No operation logs found": "No operation logs found", "No pass codes found": "パスコードが見つかりません", "No permissions": "権限なし", "No pickup codes found": "受取コードが見つかりません", + "No product data matching search criteria": "検索条件に一致する商品データはありません", "No product record found": "商品記録が見つかりません", "No products found in this warehouse": "この倉庫に商品は見つかりません", "No products found matching your criteria.": "条件に一致する商品が見つかりません。", @@ -1027,13 +1154,16 @@ "No usage logs found.": "使用履歴が見つかりません。", "No users found": "ユーザーが見つかりません", "No warehouses found": "倉庫が見つかりません", + "No welcome gifts found": "ウェルカムギフトが見つかりません", "None": "なし", "Normal": "正常", + "Not Configured": "未設定", "Not Used": "使用しない", "Not Used Description": "サードパーティ決済を使用しない", "Note": "備考", "Note (optional)": "備考 (任意)", "Notes": "備考", + "Notification Language": "通知送信言語", "OEE": "OEE", "OEE Efficiency Trend": "OEE効率トレンド", "OEE Score": "OEEスコア", @@ -1055,6 +1185,9 @@ "Offline + Pi Pay": "オフライン + Pi Pay", "Offline + PlusPay": "オフライン + PlusPay", "Offline Machines": "オフライン機器", + "Old": "Old", + "Old Value": "Old Value", + "Once": "一回のみ", "Once your account is deleted, all of its resources and data will be permanently deleted. Before deleting your account, please download any data or information that you wish to retain.": "アカウントが削除されると、すべてのリソースとデータは完全に削除されます。アカウントを削除する前に、保持したいデータや情報をダウンロードしてください。", "Once your account is deleted, all of its resources and data will be permanently deleted. Please enter your password to confirm you would like to permanently delete your account.": "アカウントが削除されると、すべてのデータは永久に削除されます。完全に削除することを確認するためにパスワードを入力してください。", "One-click replenishment order generation": "ワンクリック補充伝票生成", @@ -1063,7 +1196,10 @@ "Online Duration": "累積オンライン時間", "Online Machines": "オンライン機器", "Online Status": "オンラインステータス", + "Only .xlsx, .xls, .csv files are supported (Max 5MB)": ".xlsx, .xls, .csv ファイルのみサポートされています (最大 5MB)", + "Only machines under the same company can be cloned for security.": "セキュリティのため、同じ会社の機器設定のみコピーできます。", "Only system roles can be assigned to platform administrative accounts.": "プラットフォーム管理アカウントにはシステムロールのみを割り当てることができます。", + "Operation Logs": "Operation Logs", "Operation Note": "操作メモ", "Operation Records": "操作記録", "Operation failed": "操作失敗", @@ -1077,12 +1213,14 @@ "Optional notes...": "任意のメモ...", "Optional remarks": "任意の備考", "Optional remarks...": "任意の備考...", + "Or Choose Custom Date": "または日付を選択", "Order Details": "注文詳細", "Order Info": "注文情報", "Order Items": "商品内容", "Order Management": "注文管理", "Order No.": "注文番号", - "Order Number \/ Time": "注文番号 \/ 時間", + "Order Number": "伝票番号", + "Order Number / Time": "注文番号 / 時間", "Order Status": "注文ステータス", "Order Time": "注文時間", "Order already completed": "注文は既に完了しています", @@ -1095,6 +1233,7 @@ "Orders": "購入注文", "Orders per hour for selected date": "選択した日付の1時間あたりの注文数", "Original": "元の", + "Original Amount": "Original Amount", "Original Type": "元のタイプ", "Original:": "元:", "Other Features": "その他の機能", @@ -1160,8 +1299,9 @@ "Payment Type": "支払方法", "Pending": "保留中", "Per Page": "1ページあたり表示", + "Percentage Discount": "割合割引", "Performance": "パフォーマンス", - "Permanent": "恒久", + "Permanent": "永久", "Permanent Code": "無期限コード", "Permanent if empty": "空欄で無期限", "Permanently Delete Account": "アカウントを完全に削除する", @@ -1178,20 +1318,23 @@ "Pickup Code": "受取コード", "Pickup Code (8 Digits)": "受取コード (8桁)", "Pickup Codes": "受取コード", - "Pickup Ticket": "受取チケット", + "Pickup Ticket": "商品受取チケット", "Pickup code cancelled.": "受取コードがキャンセルされました。", "Pickup code generated: :code": "受取コードが生成されました: :code", "Pickup code updated.": "受取コードが更新されました。", "Pickup door closed": "受取扉が閉まりました", "Pickup door error": "受取扉エラー", "Pickup door not closed": "受取扉が閉まっていません", + "Platform Operator": "プラットフォーム事業者", "Playback Order": "再生順序", "Please Select Slot first": "先にスロットを選択してください", "Please check the following errors:": "以下のエラーを確認してください:", "Please check the form for errors.": "フォームのエラーを確認してください。", "Please confirm the details below": "以下の詳細を確認してください", + "Please enter Webhook URL first.": "最初にWebhook URLを入力してください。", "Please enter address first": "先に住所を入力してください", "Please enter configuration name": "設定名を入力してください", + "Please make sure to enable \"Background graphics\" in your browser print settings to print product images and styled components correctly.": "商品の画像やスタイル付きコンポーネントを正しく印刷するために、ブラウザの印刷設定で『背景のグラフィック』を有効にしてください。", "Please select a company": "会社を選択してください", "Please select a company.": "会社を選択してください。", "Please select a machine": "機器を選択してください", @@ -1202,43 +1345,56 @@ "Please select a material": "素材を選択してください", "Please select a slot": "スロットを選択してください", "Please select warehouse and machine": "倉庫と機器を選択してください", + "Please use our standard template to ensure data compatibility.": "データの互換性を確保するために、標準テンプレートを使用してください。", "PlusPay": "全盈+PAY (PlusPay)", "Point Rules": "ポイントルール", "Point Settings": "ポイント設定", "Points": "ポイント", "Points Settings": "ポイント設定", "Points toggle": "ポイント切り替え", - "Points\/Voucher": "ポイント\/クーポン", + "Points/Voucher": "ポイント/クーポン", "Position": "配信位置", "Prepared": "準備完了", + "Prepared By": "起票者", "Preparing": "準備中", "Preview": "プレビュー", "Previous": "前へ", - "Price \/ Member": "価格 \/ 会員価格", + "Price / Member": "価格 / 会員価格", "Pricing Information": "価格情報", + "Print": "印刷", + "Print & PDF": "印刷 & PDF", "Print Invoice": "領収書印刷", + "Print Notice": "印刷時の注意", + "Print Order": "伝票印刷", + "Print Time": "印刷日時", "Product": "商品", - "Product \/ Slot": "商品 \/ スロット", - "Product \/ Stock": "商品 \/ 在庫", + "Product / Slot": "商品 / スロット", + "Product / Stock": "商品 / 在庫", + "Product Barcode": "商品バーコード", + "Product Cost": "商品コスト", "Product Count": "商品数", "Product Details": "商品詳細", "Product ID": "商品ID", "Product Image": "商品画像", "Product Info": "商品情報", + "Product Items": "Product Items", "Product List": "商品リスト", "Product Management": "商品管理", "Product Name": "商品名", "Product Name (Multilingual)": "商品名 (多言語)", + "Product Report Analysis": "商品レポート分析", "Product Reports": "商品レポート", + "Product Sales & Profit Trend": "商品販売・利益推移", "Product Status": "商品ステータス", "Product created successfully": "商品が正常に作成されました", "Product deleted successfully": "商品が正常に削除されました", "Product empty": "スロットが空です (PDT_EMPTY)", + "Product physical shipment count": "商品の実出荷数", "Product status updated to :status": "商品のステータスが :status に更新されました", "Product updated successfully": "商品が正常に更新されました", "Production Company": "製造会社", "Products": "商品", - "Products \/ Stock": "商品 \/ 在庫", + "Products / Stock": "商品 / 在庫", "Profile": "プロフィール", "Profile Information": "プロフィール情報", "Profile Settings": "プロフィール設定", @@ -1251,22 +1407,28 @@ "Purchase Finished": "購入終了", "Purchases": "購入伝票", "Purchasing": "購入中", + "Purpose": "用途", + "Push Status": "アラート状態", "QR": "QR", "QR CODE": "QRコード", + "QR Code": "QRコード", "QR Code Payment": "QRコード決済", "QR Scan Payment": "QRスキャン決済", "Qty": "数量", "Qty Change": "変動数", "Quality": "品質 (Quality)", "Quantity": "数量", + "Quantity Sold": "販売数", "Questionnaire": "アンケート", "Quick Expiry Check": "クイック期限チェック", + "Quick Filter": "クイックフィルター", "Quick Maintenance": "クイックメンテナンス", "Quick Replenish": "クイック補充", "Quick Select": "クイック選択", "Quick replenishment from this view": "この画面からクイック補充", "Quick search...": "クイック検索...", "Rank": "順位", + "Ready to print": "印刷準備完了", "Real-time OEE analysis awaits": "リアルタイムOEE分析待機中", "Real-time Operation Logs (Last 50)": "リアルタイム操作ログ (直近50件)", "Real-time fleet efficiency and OEE metrics": "全機器のリアルタイム効率とOEE指標", @@ -1274,6 +1436,7 @@ "Real-time inventory status across all machines with expiry tracking": "すべての機器のリアルタイム在庫状態と期限追跡", "Real-time monitoring across all machines": "全機器のリアルタイム監視", "Real-time monitoring and adjustment of cargo lane inventory and expiration dates": "スロット在庫と期限のリアルタイム監視および調整", + "Real-time operational data synchronized": "リアルタイム運営データ同期完了", "Real-time performance analytics": "リアルタイムパフォーマンス分析", "Real-time slot-level inventory across all machines": "全機器のリアルタイムスロットレベル在庫", "Real-time status monitoring": "リアルタイムステータス監視", @@ -1291,6 +1454,7 @@ "Refunded": "返金済み", "Regenerate": "再生成", "Regenerating the token will disconnect the physical machine until it is updated. Continue?": "トークンを再生成すると、更新されるまで物理機器の接続が切断されます。続行しますか?", + "Remark": "備考", "Remote Change": "遠隔お釣り", "Remote Checkout": "遠隔決済", "Remote Command Center": "遠隔コマンドセンター", @@ -1306,10 +1470,12 @@ "Remove Assignment Confirmation": "割り当て解除の確認", "Repair": "修理", "Replenish": "補充", + "Replenish Qty": "補充数量", "Replenishment": "補充", "Replenishment Audit": "補充伝票", "Replenishment Details": "補充伝票詳細", "Replenishment Items": "補充項目", + "Replenishment Order": "補充伝票", "Replenishment Orders": "機器補充伝票", "Replenishment Page": "補充ページ", "Replenishment Records": "機器補充記録", @@ -1326,6 +1492,7 @@ "Reservation Members": "予約会員", "Reservation System": "予約システム", "Reservations": "予約管理", + "Reset": "リセット", "Reset Filters": "フィルターをリセット", "Reset POS terminal": "POS端末をリセット", "Resolve Coordinates": "座標を取得", @@ -1359,11 +1526,14 @@ "Sale Price": "販売価格", "Sales": "販売管理", "Sales Activity": "販売活動", + "Sales Amount": "売上金額", "Sales Management": "販売管理", "Sales Permissions": "販売管理権限", + "Sales Quantity": "販売数量", "Sales Record": "販売記録", "Sales Records": "販売記録", "Sales Today": "本日の販売数", + "Sales revenue minus product cost net value": "販売額から商品コストを差し引いた純利益", "Save": "保存", "Save Changes": "変更を保存", "Save Config": "設定を保存", @@ -1379,18 +1549,19 @@ "Scan this code at the machine or share the link with the customer.": "機器でこのコードをスキャンするか、リンクを顧客と共有してください。", "Scan this code at the machine to authorize testing or maintenance.": "機器でこのコードをスキャンして、テストまたはメンテナンスを承認します。", "Scan this code to quickly access the maintenance form for this device.": "このQRコードをスキャンすると、このデバイスのメンテナンスフォームに素早くアクセスできます。", - "Scan to authorize testing or maintenance": "スキャンしてテストまたはメンテナンスを承認", - "Scan to pick up your product": "スキャンして商品を受け取る", + "Scan to authorize testing or maintenance": "スキャンしてテストまたはメンテナンスを承認します", + "Scan to pick up your product": "スキャンして商品をお受け取りください", "Schedule": "スケジュール", + "Search": "検索", "Search Company Title...": "会社名を検索...", "Search Company...": "会社を検索...", - "Search Flow ID \/ Slot...": "フローID \/ スロットを検索...", - "Search Invoice No \/ Flow ID...": "領収書番号 \/ フローIDを検索...", + "Search Flow ID / Slot...": "フローID / スロットを検索...", + "Search Invoice No / Flow ID...": "領収書番号 / フローIDを検索...", "Search Machine...": "機器を検索...", - "Search Order No \/ Flow ID \/ Invoice...": "注文番号 \/ フローID \/ 領収書を検索...", - "Search Order No \/ Cards & Codes...": "注文番号 \/ カード・コードを検索...", + "Search Order No / Cards & Codes...": "注文番号 / カード・コードを検索...", + "Search Order No / Flow ID / Invoice...": "注文番号 / フローID / 領収書を検索...", "Search Product": "商品を検索", - "Search Product \/ Slot...": "商品名 \/ スロットを検索...", + "Search Product / Slot...": "商品名 / スロットを検索...", "Search accounts...": "アカウントを検索...", "Search by ID or Name": "IDまたは名前で検索", "Search by ID or Name...": "IDまたは名前で検索...", @@ -1398,18 +1569,22 @@ "Search by ID, Name or UID...": "社員番号、名前、またはカードUIDで検索...", "Search by code, machine name or serial...": "コード、機器名、またはシリアルで検索...", "Search by code, name or machine...": "コード、名前、または機器で検索...", - "Search by name or S\/N...": "名前またはシリアル番号で検索...", + "Search by name or S/N...": "名前またはシリアル番号で検索...", "Search by name...": "名前で検索...", "Search cargo lane": "スロット番号または商品名で検索", "Search categories...": "カテゴリを検索...", + "Search company name or code...": "会社名またはコードで検索...", "Search company...": "会社を検索...", "Search configurations...": "設定を検索...", "Search customers...": "顧客を検索...", "Search logs...": "ログを検索...", + "Search machine name or SN...": "機器名またはシリアル番号で検索...", "Search machines by name or serial...": "機器名またはシリアルで検索...", "Search machines...": "機器を検索...", "Search models...": "モデルを検索...", + "Search notes or values...": "Search notes or values...", "Search order number...": "注文番号で検索...", + "Search product name, barcode...": "商品名、バーコードで検索...", "Search products...": "商品名で検索...", "Search roles...": "ロールを検索...", "Search serial no or name...": "シリアル番号または機器名で検索...", @@ -1436,11 +1611,13 @@ "Select Owner": "所有者を選択", "Select Personnel": "担当者を選択", "Select Product": "商品を選択", + "Select Product for Analysis": "分析対象商品の選択", "Select Slot": "スロットを選択", "Select Slot...": "スロットを選択...", "Select Target Company": "対象の会社を選択", "Select Target Slot": "対象のスロットを選択", "Select Warehouse": "倉庫を選択", + "Select a machine to copy settings from...": "設定のコピー元機器を選択...", "Select a machine to deep dive": "詳細分析する機器を選択", "Select a material to play on this machine": "この機器で再生する素材を選択", "Select a team member to handle this replenishment order": "この補充伝票を処理する担当者を選択", @@ -1453,6 +1630,7 @@ "Selected Machine": "選択された機器", "Selected Slot": "選択されたスロット", "Selection": "選択中", + "Sending...": "送信中...", "Sent": "送信済み (機器受信待ち)", "Serial & Version": "シリアルとバージョン", "Serial NO": "シリアル番号", @@ -1462,6 +1640,7 @@ "Service Periods": "サービス期間", "Service Terms": "サービス条件", "Settings Saved": "設定を保存しました", + "Settings loaded from": "以下の機器から設定を読み込みました:", "Settings updated successfully.": "設定が正常に更新されました。", "Settlement": "決済処理", "Shopping Cart": "ショッピングカート", @@ -1475,8 +1654,8 @@ "Showing last 6 months by default when no date range is selected": "日付範囲が未選択の場合、デフォルトで過去6ヶ月分を表示します", "Sign in to your account": "アカウントにサインイン", "Signed in as": "ログイン中のユーザー", - "Slot": "スロット", - "Slot \/ Product": "スロット \/ 商品", + "Slot": "選択用スロット", + "Slot / Product": "スロット / 商品", "Slot Mechanism (default: Conveyor, check for Spring)": "スロット機構 (デフォルト: ベルトコンベア、スプリングの場合はチェック)", "Slot No": "スロット番号", "Slot Status": "スロット期限ステータス", @@ -1496,6 +1675,7 @@ "Slots need replenishment": "補充が必要なスロット", "Smallest number plays first.": "番号が小さい順に再生されます。", "Smart replenishment suggestions": "スマート補充の提案", + "Smart vending machine product sales, cost and profit analysis report": "スマート自動販売機商品販売・コスト利益分析レポート", "Software": "ソフトウェア", "Software End": "ソフトウェア終了", "Software Service": "ソフトウェアサービス", @@ -1503,7 +1683,9 @@ "Some fields need attention": "いくつかのフィールドに注意が必要です", "Sort Order": "並び順", "Source": "移動元", + "Source Machine": "移動元自販機", "Source Warehouse": "移動元倉庫", + "Source of temperature limit settings": "温度制限設定のソース", "Special Permission": "特別権限", "Specification": "仕様", "Specifications": "仕様", @@ -1524,18 +1706,19 @@ "Standby Ad": "待機広告", "Start Date": "開始日", "Start Delivery": "配送開始", + "Start Import": "インポート開始", "Start Time": "開始時間", "Statistics": "統計", "Status": "ステータス", - "Status \/ Invoice": "ステータス \/ 領収書", - "Status \/ Temp \/ Sub \/ Card \/ Scan": "ステータス \/ 温度 \/ 下位機 \/ カードリーダー \/ スキャナー", + "Status / Invoice": "ステータス / 領収書", + "Status / Temp / Sub / Card / Scan": "ステータス / 温度 / 下位機 / カードリーダー / スキャナー", "Status Timeline": "ステータスタイムライン", "Status updated successfully": "ステータスが正常に更新されました", "Stock": "在庫", "Stock & Expiry": "在庫と期限", "Stock & Expiry Management": "在庫と期限の管理", "Stock & Expiry Overview": "在庫と期限の概要", - "Stock \/ Capacity": "在庫 \/ 容量", + "Stock / Capacity": "在庫 / 容量", "Stock In": "入庫", "Stock Level": "在庫レベル", "Stock Level > 50%": "在庫 50% 超", @@ -1545,6 +1728,7 @@ "Stock Out": "出庫", "Stock Quantity": "在庫数", "Stock Rate": "在庫率", + "Stock Snap": "在庫スナップショット", "Stock Update": "在庫同期", "Stock adjustments and damage reports": "在庫調整と廃棄レポート", "Stock flow history": "在庫フロー履歴", @@ -1565,12 +1749,16 @@ "Store ID": "店舗ID (Store ID)", "Store Management": "店舗管理", "StoreID": "店舗ID", - "Sub \/ Card \/ Scan": "下位機 \/ カードリーダー \/ スキャナー", + "Sub / Card / Scan": "下位機 / カードリーダー / スキャナー", "Sub Account Management": "サブアカウント管理", "Sub Account Roles": "サブアカウントロール", "Sub Accounts": "サブアカウント", "Sub-actions": "サブアクション", + "Sub-machine Status": "Sub-machine Status", "Sub-machine Status Request": "下位機ステータスリクエスト", + "Submachine Alert": "下位機アラート", + "Submachine Exception": "下位機ハードウェア異常", + "Submachine Exception (B013)": "下位機/商品ラック異常 (B013)", "Submit Record": "記録を提出", "Subtotal": "小計", "Success": "成功", @@ -1598,6 +1786,8 @@ "System Reboot": "システム再起動", "System Role": "システムロール", "System Settings": "システム設定", + "System detected that the machine disconnected unexpectedly.": "システムがマシンの予期せぬ切断を検出しました。", + "System restarting": "再起動中", "System role name cannot be modified.": "システムロール名は変更できません。", "System roles cannot be deleted by tenant administrators.": "顧客管理者はシステムロールを削除できません。", "System roles cannot be modified by tenant administrators.": "顧客管理者はシステムロールを変更できません。", @@ -1609,6 +1799,7 @@ "TapPay Integration": "TapPay 連携", "TapPay Integration Settings Description": "TapPay 決済連携設定", "Target": "対象", + "Target Item": "Target Item", "Target Machine": "対象機器", "Target Position": "ターゲット位置", "Target Warehouse": "対象倉庫", @@ -1616,17 +1807,31 @@ "Tax ID (Optional)": "統一企業番号 (任意)", "Tax System": "税務システム", "Taxation System": "税務システム", + "Temp Alert Range": "アラート温度範囲", + "Temp Alert State": "温度アラート状態", "Temperature": "温度", - "Temperature reported: :temp°C": "温度が報告されました: :temp°C", + "Temperature Alert": "温度アラート", + "Temperature Alert (High)": "温度過昇アラート", + "Temperature Alert (Low)": "温度低下アラート", + "Temperature Alert Settings": "温度アラート設定", + "Temperature Limit": "温度しきい値", + "Temperature Restored": "温度正常復帰", "Temperature Trend": "温度傾向", + "Temperature reported: :temp°C": "温度が報告されました: :temp°C", "Temperature updated to :temp°C": "温度が :temp°C に更新されました", "Tenant": "顧客 (テナント)", + "Tenant Company": "所属テナント会社", "TermID": "端末ID (TermID)", + "Test Connection": "接続テスト", + "Test notification sent successfully.": "テスト通知が正常に送信されました。", + "Testing": "テスト", "The Super Admin role cannot be deleted.": "特権管理者ロールは削除できません。", "The Super Admin role is immutable.": "特権管理者ロールは変更できません。", "The Super Admin role name cannot be modified.": "特権管理者ロールの名前は変更できません。", "The image is too large. Please upload an image smaller than 1MB.": "画像サイズが大きすぎます。1MB未満の画像をアップロードしてください。", "The image is too large. Please upload an image smaller than 5MB.": "画像サイズが大きすぎます。5MB未満の画像をアップロードしてください。", + "This Month": "今月", + "This Week": "今週", "This is a system administrator role. Its name is locked to ensure system stability.": "これはシステム管理者ロールです。システムの安定性を確保するため、名前はロックされています。", "This machine has a pending command. Please wait.": "この機器には実行中のコマンドがあります。しばらくお待ちください。", "This role belongs to another company and cannot be assigned.": "このロールは別の会社に属しているため、割り当てることができません。", @@ -1643,6 +1848,7 @@ "To": "移動先", "To Warehouse": "移動先倉庫", "To:": "終了:", + "Today": "今日", "Today Cumulative Sales": "本日の累積売上", "Today's Transactions": "本日の取引", "Total": "合計", @@ -1652,18 +1858,25 @@ "Total Gross Value": "総販売額", "Total Logins": "総ログイン回数", "Total Machines": "総機器数", + "Total Net Profit": "純利益総額", "Total Orders": "本日の注文", + "Total Product Cost": "商品総コスト", "Total Quantity": "総数量", + "Total Quantity Sold": "販売総数", + "Total Sales": "販売総額", + "Total Sales Amount": "販売総額", + "Total Sales Profit": "販売総利益", "Total Selected": "選択合計", "Total Slots": "総スロット数", "Total Stock": "総在庫", "Total Stock Volume": "総在庫量", "Total Warehouses": "総倉庫数", "Total items": "全 :count 件", + "Total transaction amount of successful payments": "支払い成功取引総額", "Track": "ベルトコンベア", "Track Channel Limit": "ベルトコンベアスロット上限", "Track Limit": "ベルトコンベア上限", - "Track Limit (Track\/Spring)": "スロット上限 (ベルト\/スプリング)", + "Track Limit (Track/Spring)": "スロット上限 (ベルト/スプリング)", "Track device health and maintenance history": "デバイスの健全性とメンテナンス履歴を追跡", "Track stock levels, stock-in orders, and movement history": "在庫レベル、入庫伝票、および変動履歴を追跡", "Track stock-in orders and movement history": "入庫伝票と在庫変動履歴を追跡", @@ -1675,8 +1888,12 @@ "Transfer Audit": "移動伝票監査", "Transfer Details": "移動伝票詳細", "Transfer In": "転入", + "Transfer In Confirmation": "入庫確認", + "Transfer Order": "在庫移動伝票", "Transfer Orders": "移動伝票管理", "Transfer Out": "転出", + "Transfer Out Confirmation": "出庫確認", + "Transfer Qty": "移動数量", "Transfer Type": "移動タイプ", "Transfer completed": "移動完了", "Transfer in": "移動(入)", @@ -1690,13 +1907,15 @@ "Trigger": "実行", "Trigger Dispense": "出庫トリガー", "Trigger Remote Dispense": "遠隔出庫をトリガー", + "Triggers on unexpected connection losses (LWT) and auto-resolves with restoration reports. Regular reboots are intelligently filtered.": "予期しない接続切断 (LWT) 時にアラートをトリガーし、接続復旧時に復旧通知を自動的に送信します。日常的な再起動はスマートにフィルタリングされます。", + "Triggers when vending machines report motor blockages, coin/bill acceptor malfunctions, or sensor failures.": "自動販売機がモーターの詰まり、紙幣機/硬貨機の故障、またはセンサーの異常を報告したときにトリガーされます。", "Try using landmark names (e.g., Hualien County Government)": "ランドマーク名(例:花蓮県庁)を使用してみてください", "Tutorial Page": "チュートリアルページ", "Type": "タイプ", "Type to search or leave blank for system defaults.": "入力して検索、または空白のままでシステムデフォルトを使用します。", "UI Elements": "UI要素", "Unassigned": "未割り当て", - "Unassigned \/ No Change": "未割り当て \/ 変更なし", + "Unassigned / No Change": "未割り当て / 変更なし", "Unauthorized Status": "未承認", "Unauthorized login attempt: :account": "不正なログイン試行: :account", "Unauthorized: Account not authorized for this machine": "未承認: アカウントはこの機器へのアクセス権がありません", @@ -1734,7 +1953,10 @@ "Usage Limit": "使用回数上限", "Usage Logs": "使用履歴", "Usage Progress": "使用進捗", + "Usage Status": "使用状況", + "Usage Type": "使用回数タイプ", "Used": "使用済み", + "Used: :count": "使用済み: :count 回", "User": "一般ユーザー", "User Info": "ユーザー情報", "User logged in: :name": "ユーザーがログインしました: :name", @@ -1752,7 +1974,9 @@ "Validity Period (Days)": "有効期間 (日)", "Validity Period (Hours)": "有効期間 (時間)", "Vending": "販売ページ", + "Vending Machine Product Replenishment": "自販機商品補充", "Vending Page": "販売ページ", + "Vending machine reported a submachine hardware error.": "マシンが下位機のハードウェア動作エラーを報告しました。", "Venue Management": "施設管理", "Verified": "検証済み", "Verified Only": "検証済みのみ", @@ -1785,6 +2009,7 @@ "Warehouse Overview": "倉庫概要", "Warehouse Permissions": "倉庫管理権限", "Warehouse Stock": "倉庫在庫", + "Warehouse Stock Out": "出庫確認", "Warehouse Transfer": "倉庫間移動", "Warehouse Type": "倉庫タイプ", "Warehouse created successfully": "倉庫が正常に作成されました", @@ -1795,6 +2020,7 @@ "Warehouse stock insufficient": "倉庫の在庫が不足しています", "Warehouse stock insufficient warning": "倉庫の在庫が不足しているためすべてのスロットを補充できませんが、補充伝票は作成可能です", "Warehouse to Warehouse": "倉庫から倉庫", + "Warehouse to Warehouse Transfer": "倉庫間移動", "Warehouse to warehouse transfers": "倉庫から倉庫への在庫移動", "Warehouse updated successfully": "倉庫が正常に更新されました", "Warehouse updated successfully.": "倉庫が正常に更新されました。", @@ -1804,10 +2030,16 @@ "Warranty End": "保証終了", "Warranty Service": "保証サービス", "Warranty Start": "保証開始", - "Welcome Gift": "来店ギフト", + "Webhook Status": "Webhook ステータス", + "Webhook URL": "Webhook URL", + "Welcome Gift": "来店プレゼント", + "Welcome Gift Code": "来店プレゼントコード", + "Welcome Gift Code (8 Digits)": "ウェルカムギフトコード (8桁)", "Welcome Gift Feature": "ウェルカムギフト機能", "Welcome Gift Function": "ウェルカムギフト機能", + "Welcome Gift Name": "ウェルカムギフト名", "Welcome Gift Status": "来店ギフトステータス", + "Welcome Gifts": "ウェルカムギフト設定", "Work Content": "作業内容", "Yes, Cancel": "はい、キャンセルします", "Yes, Deactivate": "はい、無効にします", @@ -1822,17 +2054,25 @@ "Your recent account activity": "最近のアカウントアクティビティ", "[PickupCode] Verification failed: :code": "[受取コード] 検証失敗: :code", "[StaffCard] Verification failed: :uid": "[スタッフカード] 検証失敗: :uid", + "_discord_section": "_discord_section", + "_model_temp_section": "_model_temp_section", "accounts": "アカウント管理", "admin": "管理者", "analysis": "分析管理", "and :count other items": "ほか :count 点", "app": "APP 運用保守", "audit": "監査管理", + "barcode": "barcode", "basic-settings": "基本設定", "basic.machines": "機器設定", "basic.payment-configs": "顧客決済設定", "by": "作成者:", "cancel": "キャンセル", + "category": "category", + "category_created": "category_created", + "category_deleted": "category_deleted", + "category_id": "category_id", + "category_updated": "category_updated", "command.change": "お釣り払い出し", "command.checkout": "決済", "command.dispense": "出庫", @@ -1844,18 +2084,24 @@ "command.update_ads": "広告同期", "command.update_products": "商品同期", "companies": "顧客管理", + "company_id": "company_id", "completed": "受取完了", "consume": "受取成功", "consume_failed": "受取失敗", "consumed": "消込完了", + "cost": "cost", "create": "作成", + "d": "日", "data-config": "データ設定", "data-config.sub-account-roles": "サブアカウントロール", "data-config.sub-accounts": "サブアカウント管理", + "description": "description", "disabled": "無効", - "e.g. 500ml \/ 300g": "例:500ml \/ 300g", + "e.g. 500ml / 300g": "例:500ml / 300g", + "e.g. 8.5 for 85折, 8 for 8折": "例:8.5は85%、8は80%", "e.g. John Doe": "例:山田太郎", "e.g. Main Warehouse": "例:第一倉庫", + "e.g. New Guest 15% Off Discount": "例:新規顧客向け15%割引", "e.g. TWSTAR": "例:TWSTAR", "e.g. Taiwan Star": "例:台湾星", "e.g. Test Code for Maintenance": "例:メンテナンステスト用コード", @@ -1869,10 +2115,14 @@ "e.g., Taipei Station": "例:東京駅", "e.g., お飲み物": "例:お飲み物", "enabled": "有効", + "error": "異常", "failed": "失敗", "files selected": "個のファイルを選択しました", "hours ago": "時間前", "image": "画像", + "image_url": "image_url", + "info": "一般", + "is_active": "is_active", "items": "件", "john@example.com": "john@example.com", "line": "Line 管理", @@ -1886,6 +2136,8 @@ "log.pickup.verify_success": "[受取コード] 検証成功、コード::code", "log.pickup.verify_success_note": "機器 [:machine_sn] が受取コード [:code] を検証", "machines": "機器管理", + "manufacturer": "manufacturer", + "member_price": "member_price", "members": "会員管理", "menu.analysis": "データ分析", "menu.analysis.change-stock": "両替在庫", @@ -1895,9 +2147,9 @@ "menu.app": "APP 運用保守", "menu.audit": "監査管理", "menu.basic": "基本設定", + "menu.basic.discord-notifications": "Discord通知設定", "menu.basic.machines": "機器設定", "menu.basic.payment-configs": "顧客決済設定", - "menu.basic.discord-notifications": "Discord通知設定", "menu.data-config": "データ設定", "menu.data-config.admin-products": "商品ステータス", "menu.data-config.advertisements": "広告管理", @@ -1952,6 +2204,8 @@ "movement.type.remote_dispense": "遠隔出庫", "movement.type.replenishment": "補充入庫", "movement.type.rollback": "出庫失敗ロールバック", + "name": "name", + "name_dictionary_key": "name_dictionary_key", "of": "/全", "of items": "件中", "orders": "件", @@ -1960,6 +2214,13 @@ "permissions.accounts": "アカウント管理", "permissions.companies": "顧客管理", "permissions.roles": "ロール権限管理", + "price": "price", + "product": "product", + "product_catalog_synced_to_all_machines": "product_catalog_synced_to_all_machines", + "product_created": "product_created", + "product_deleted": "product_deleted", + "product_status_toggled": "product_status_toggled", + "product_updated": "product_updated", "remote": "遠隔管理", "reservation": "予約システム", "roles": "ロール権限", @@ -1967,14 +2228,19 @@ "sales": "販売管理", "sent": "機器受信済み", "set": "設定済み", + "spec": "spec", "special-permission": "特別権限", + "spring_limit": "spring_limit", "standby": "待機広告", + "status": "status", "success": "成功", "super-admin": "特権管理者", "superseded": "コマンドは上書きされました", "timeout": "コマンドタイムアウト", "times": "回", "to": "~", + "track_limit": "track_limit", + "type": "type", "update": "更新", "used": "使用済み", "user": "一般ユーザー", @@ -1985,188 +2251,5 @@ "visit_gift": "来店ギフト", "vs Yesterday": "昨日比", "warehouses": "倉庫管理", - "待填寫": "未記入", - "Import Excel": "Excel インポート", - "Import Staff Cards": "スタッフカードのインポート", - "Excel File": "Excel ファイル", - "Start Import": "インポート開始", - "Only .xlsx, .xls, .csv files are supported (Max 5MB)": ".xlsx, .xls, .csv ファイルのみサポートされています (最大 5MB)", - "Download Template": "テンプレートのダウンロード", - "Please use our standard template to ensure data compatibility.": "データの互換性を確保するために、標準テンプレートを使用してください。", - ":count staff cards imported successfully": ":count 枚のスタッフカードが正常にインポートされました", - "Import failed": "インポート失敗", - "System restarting": "再起動中", - "Product Report Analysis": "商品レポート分析", - "Smart vending machine product sales, cost and profit analysis report": "スマート自動販売機商品販売・コスト利益分析レポート", - "Real-time operational data synchronized": "リアルタイム運営データ同期完了", - "Total Quantity Sold": "販売総数", - "Product physical shipment count": "商品の実出荷数", - "Total Sales Amount": "販売総額", - "Sales Amount": "売上金額", - "Total transaction amount of successful payments": "支払い成功取引総額", - "Total Product Cost": "商品総コスト", - "Product Cost": "商品コスト", - "Sales Quantity": "販売数量", - "Accumulated dynamic product purchase cost": "リアルタイム仕入コスト累計", - "Total Sales Profit": "販売総利益", - "Sales revenue minus product cost net value": "販売額から商品コストを差し引いた純利益", - "Current data indicates a loss": "現在データは赤字を示しています", - "Quick Filter": "クイックフィルター", - "Last 7 Days": "過去7日間", - "Today": "今日", - "This Week": "今週", - "Last Week": "先週", - "This Month": "今月", - "Last Month": "先月", - "Select Product for Analysis": "分析対象商品の選択", - "All Products (ALL)": "全商品 (ALL)", - "Tenant Company": "所属テナント会社", - "Cross-Company \/ Headquarter Global Stats": "複数会社間 \/ 本部グローバル統計", - "Product Sales & Profit Trend": "商品販売・利益推移", - "Daily operational variance curve for selected timeframe": "選択期間における日次運営変動曲線", - "Detailed Analysis Data": "明細分析データ", - "Search product name, barcode...": "商品名、バーコードで検索...", - "Export Report": "レポートのエクスポート", - "Copy to Clipboard": "クリップボードにコピー", - "Export to CSV": "CSVエクスポート", - "Export to Excel": "Excelエクスポート", - "Print & PDF": "印刷 & PDF", - "Product Barcode": "商品バーコード", - "Quantity Sold": "販売数", - "Total Sales": "販売総額", - "Total Net Profit": "純利益総額", - "Gross Margin": "粗利益率", - "No product data matching search criteria": "検索条件に一致する商品データはありません", - "Analyze Solely": "個別分析", -"Configure Discord Webhook alerts for hardware exceptions and connectivity logs": "ハードウェア異常と接続ログ用のDiscord Webhookアラートを設定します", - "Search company name or code...": "会社名またはコードで検索...", - "Company Info": "会社情報", - "Webhook URL": "Webhook URL", - "Push Status": "アラート状態", - "Configured Alert Types": "設定済みの告警タイプ", - "Not Configured": "未設定", - "Edit Discord Alert Settings": "Discordアラート設定の編集", - "General Settings": "基本設定", - "Enable and paste Webhook URL": "Webhook URLを有効にして貼り付けます", - "Discord Webhook URL": "Discord Webhook URL", - "Test Connection": "接続テスト", - "Sending...": "送信中...", - "Test notification sent successfully.": "テスト通知が正常に送信されました。", - "Failed to send test notification. Please verify the Webhook URL.": "テスト通知の送信に失敗しました。Webhook URLを確認してください。", - "An error occurred: ": "エラーが発生しました:", - "Discord notification settings updated successfully.": "Discordアラート設定が正常に更新されました。", - "Alert Types": "アラートタイプ", - "Submachine Exception (B013)": "下位機/商品ラック異常 (B013)", - "Triggers when vending machines report motor blockages, coin/bill acceptor malfunctions, or sensor failures.": "自動販売機がモーターの詰まり、紙幣機/硬貨機の故障、またはセンサーの異常を報告したときにトリガーされます。", - "Machine Connectivity Logs (LWT)": "機台接続ログ (LWT)", - "Triggers on unexpected connection losses (LWT) and auto-resolves with restoration reports. Regular reboots are intelligently filtered.": "予期しない接続切断 (LWT) 時にアラートをトリガーし、接続復旧時に復旧通知を自動的に送信します。日常的な再起動はスマートにフィルタリングされます。", - "Alert Severity Levels": "アラート深刻度", - "Device": "機台", - "Critical failures requiring immediate hands-on attention.": "即座に対処が必要な重大な障害。", - "Device connection drops or minor warnings.": "機台の接続切断または軽微な警告。", - "Connection recovery alerts and normal logs.": "接続復旧通知および通常ログ。", - "Please enter Webhook URL first.": "最初にWebhook URLを入力してください。", - "Failed to send test notification.": "テスト通知の送信に失敗しました。", - "An error occurred during testing.": "テスト中にエラーが発生しました。", - "Search": "検索", - "Reset": "リセット", - "error": "異常", - "warning": "警告", - "info": "一般", - "Notification Language": "通知送信言語", - "Machine Connectivity Lost": "マシン接続切断", - "System detected that the machine disconnected unexpectedly.": "システムがマシンの予期せぬ切断を検出しました。", - "Machine Connectivity Restored": "マシン接続復旧", - "Machine has reconnected to the server and resumed normal heartbeat.": "マシンがサーバーに再接続し、通常のハートビートを再開しました。", - "Submachine Exception": "下位機ハードウェア異常", - "Vending machine reported a submachine hardware error.": "マシンが下位機のハードウェア動作エラーを報告しました。", - "Error Details": "異常詳細", - "Error Code": "異常コード", - "Affected Slot": "影響を受ける貨道", - "Installation Location": "設置場所", - "Temperature Alert": "温度アラート", - "Temperature Alert (High)": "温度過昇アラート", - "Temperature Alert (Low)": "温度低下アラート", - "Temperature Restored": "温度正常復帰", - "Current temperature (:temp°C) is above the upper limit (:limit°C).": "現在温度 (:temp°C) が設定上限 (:limit°C) を超えています。", - "Current temperature (:temp°C) is below the lower limit (:limit°C).": "現在温度 (:temp°C) が設定下限 (:limit°C) を下回っています。", - "Current temperature has returned to normal range (:temp°C).": "現在温度は正常範囲 (:temp°C) に戻りました。", - "Temperature Limit": "温度しきい値", - "Current Temperature": "現在温度", - "Submachine Alert": "下位機アラート", - "Machine Connection Alert": "マシン接続アラート", - - "Company Settings": "会社グローバル設定", - "Alert Switch": "アラートスイッチ", - "Connectivity Logs": "接続状態ログ", - "Device Exception": "下位機異常", - "Copy Settings From Another Machine": "他の機器の設定をコピー", - "Custom": "カスタム", - "Custom Enabled": "カスタム有効", - "Custom Disabled (Mute Alert)": "カスタム無効(アラート消音)", - "Custom Upper Limit (°C)": "カスタム上限温度 (°C)", - "Custom Lower Limit (°C)": "カスタム下限温度 (°C)", - "Define custom temperature limits or inherit from model": "カスタム温度制限を設定するか、機器モデルから継承します", - "Edit Company Alert Settings": "会社アラート設定を編集", - "Edit Machine Alert Settings": "機器アラート設定を編集", - "Inherit": "継承", - "Inherit Company": "会社設定を継承", - "Inherit Model / System default": "モデル / システムデフォルトを継承", - "Leave empty to inherit company settings": "空白のままにすると会社のグローバル設定を継承します", - "Machine Specific": "機器専用", - "Machine-Specific Webhook": "機器専用 Webhook", - "Model Default": "モデルデフォルト", - "No Model": "モデル未設定", - "Only machines under the same company can be cloned for security.": "セキュリティのため、同じ会社の機器設定のみコピーできます。", - "Select a machine to copy settings from...": "設定のコピー元機器を選択...", - "Settings loaded from": "以下の機器から設定を読み込みました:", - "Source of temperature limit settings": "温度制限設定のソース", - "Temp Alert Range": "アラート温度範囲", - "Temp Alert State": "温度アラート状態", - "Temperature Alert Settings": "温度アラート設定", - "Webhook Status": "Webhook ステータス", - "Company Discord notification settings updated successfully.": "会社の Discord 通知設定が正常に更新されました。", - "Machine Discord notification settings updated successfully.": "機器の Discord 通知設定が正常に更新されました。", - "Search machine name or SN...": "機器名またはシリアル番号で検索...", - - "Default Temp Upper Limit (°C)": "デフォルト温度上限 (°C)", - "Default Temp Lower Limit (°C)": "デフォルト温度下限 (°C)", - "Default Temp Limits": "デフォルト温度制御範囲", - "Default Temp Alert Upper Limit (°C)": "デフォルト温度アラート上限 (°C)", - "Default Temp Alert Lower Limit (°C)": "デフォルト温度アラート下限 (°C)", - "Default Temp Alert Limits": "デフォルト温度アラート範囲", - "Alert Types Source": "アラート種別ソース", - "Inherit Company Alert Types": "会社のアラート種別を継承", - "Custom Alert Types": "カスタムアラート種別", - "Effective Alert Types": "有効なアラート種別", - "Machine Alert Settings": "機台アラート設定", - "Configure alert types and temperature thresholds": "アラート種別と温度しきい値を設定", - "Machine model saved successfully.": "機器モデルが正常に追加されました。", -"Replenishment Order": "補充伝票", - "Transfer Order": "在庫移動伝票", - "Ready to print": "印刷準備完了", - "Print": "印刷", - "Platform Operator": "プラットフォーム事業者", - "Vending Machine Product Replenishment": "自販機商品補充", - "Warehouse to Warehouse Transfer": "倉庫間移動", - "Machine to Warehouse Return": "自販機から倉庫への返品", - "Order Number": "伝票番号", - "Source Machine": "移動元自販機", - "Assigned Personnel": "担当者", - "Print Time": "印刷日時", - "Stock Snap": "在庫スナップショット", - "Replenish Qty": "補充数量", - "Transfer Qty": "移動数量", - "Check": "確認", - "Actual Qty": "実績数量", - "Print Notice": "印刷時の注意", - "Please make sure to enable \"Background graphics\" in your browser print settings to print product images and styled components correctly.": "商品の画像やスタイル付きコンポーネントを正しく印刷するために、ブラウザの印刷設定で『背景のグラフィック』を有効にしてください。", - "Prepared By": "起票者", - "Warehouse Stock Out": "出庫確認", - "Courier\/Replenisher": "配送・補充担当", - "Machine Inbound Confirmation": "入庫確認", - "Transfer Out Confirmation": "出庫確認", - "Courier\/Dispatcher": "配送担当", - "Transfer In Confirmation": "入庫確認", - "Print Order": "伝票印刷" + "warning": "警告" } diff --git a/lang/zh_TW.json b/lang/zh_TW.json index 261cde5..73d105d 100644 --- a/lang/zh_TW.json +++ b/lang/zh_TW.json @@ -5,6 +5,7 @@ "30s": "30秒", "60 Seconds": "60 秒", "60s": "60秒", + ":count staff cards imported successfully": "成功匯入 :count 張員工識別卡", "A new verification link has been sent to your email address.": "已將新的驗證連結發送至您的電子郵件地址。", "A sync command was recently sent. Please wait 1 minute.": "近期已發送過同步指令,請等待 1 分鐘後再試", "AI Prediction": "AI智能預測", @@ -31,13 +32,15 @@ "Account deleted successfully.": "帳號已成功刪除。", "Account updated successfully.": "帳號已成功更新。", "Account:": "帳號:", - "Accounts \/ Machines": "帳號 \/ 機台", + "Accounts / Machines": "帳號 / 機台", + "Accumulated dynamic product purchase cost": "即時商品進貨成本累計", "Action": "操作", - "Action \/ Target": "操作 \/ 對象", + "Action / Target": "操作 / 對象", "Actions": "操作", "Active": "已啟用", "Active Slots": "使用中貨道", "Active Status": "啟用狀態", + "Actual Qty": "實補數量", "Ad Settings": "廣告設置", "Add Account": "新增帳號", "Add Advertisement": "新增廣告", @@ -54,6 +57,7 @@ "Add Role": "新增角色", "Add Staff Card": "新增員工識別卡", "Add Warehouse": "新增倉庫", + "Add Welcome Gift": "新增來店禮", "Add new inventory items to your warehouse": "將新商品入庫至您的倉庫", "Address": "地址", "Adjust Inventory": "庫存管理", @@ -68,7 +72,7 @@ "Administrator": "管理員", "Advertisement List": "廣告列表", "Advertisement Management": "廣告管理", - "Advertisement Video\/Image": "廣告影片\/圖片", + "Advertisement Video/Image": "廣告影片/圖片", "Advertisement assigned successfully": "廣告投放完成", "Advertisement assigned successfully.": "廣告投放完成。", "Advertisement created successfully": "廣告建立成功", @@ -78,11 +82,16 @@ "Advertisement status updated to :status": "廣告狀態已更新為 :status", "Advertisement updated successfully": "廣告更新成功", "Advertisement updated successfully.": "廣告更新成功。", + "Affected Slot": "受影響貨道", "Affiliated Company": "所屬公司", "Affiliated Unit": "公司名稱", "Affiliation": "所屬單位", "After Qty": "異動後數量", + "Alert Severity Levels": "告警重要級別", "Alert Summary": "告警摘要", + "Alert Switch": "告警開關", + "Alert Types": "告警類別", + "Alert Types Source": "告警類型來源", "Alerts": "警示", "Alerts Pending": "待處理告警", "Alerts Today": "今日異常", @@ -95,6 +104,7 @@ "All Machines": "所有機台", "All Normal": "運作正常", "All Permissions": "全部權限", + "All Products (ALL)": "全部商品 (ALL)", "All Slots": "所有貨道", "All Stable": "狀態穩定", "All Status": "所有狀態", @@ -106,10 +116,14 @@ "All issues marked as resolved.": "所有異常已標記為已排除。", "All slots are fully stocked": "所有貨道已滿貨", "Amount": "金額", - "Amount \/ Payment": "金額 \/ 支付", + "Amount / Payment": "金額 / 支付", + "Amount Discount": "固定金額", + "An error occurred during testing.": "測試發送時發生錯誤。", "An error occurred while saving.": "儲存時發生錯誤。", + "An error occurred: ": "發生錯誤:", "Analysis Management": "分析管理", "Analysis Permissions": "分析管理權限", + "Analyze Solely": "單獨分析", "Apply changes to all identical products in this machine": "同步套用至此機台內的所有相同商品", "Apply to all identical products in this machine": "同步套用至此機台內的所有相同商品", "Approved At": "審核時間", @@ -162,6 +176,7 @@ "Assign replenishment staff": "指派補貨人員", "Assign warehouse managers": "指派倉庫負責人", "Assigned Machines": "授權機台", + "Assigned Personnel": "指派人員", "Assigned To": "指派人員", "Assignment removed successfully.": "廣告投放已移除。", "Associated Order": "關聯訂單", @@ -186,7 +201,7 @@ "Back to List": "返回列表", "Badge Settings": "識別證", "Barcode": "條碼", - "Barcode \/ Material": "條碼 \/ 物料編碼", + "Barcode / Material": "條碼 / 物料編碼", "Based on Hours": "依據時數計算", "Basic Information": "基本資訊", "Basic Settings": "基本設定", @@ -207,6 +222,7 @@ "CREATE STOCK TRANSFERS BETWEEN WAREHOUSES AND MACHINE RETURNS": "建立倉庫間調撥或機台退庫單", "Calculate Replenishment": "計算補貨量", "Cancel": "取消", + "Cancel Gift": "取消此來店禮", "Cancel Order": "取消訂單", "Cancel Pass Code": "取消通行碼", "Cancel Pickup Code": "取消取貨碼", @@ -230,7 +246,7 @@ "Card Terminal": "刷卡機端", "Card Terminal System": "刷卡機系統", "Card UID": "卡片 UID", - "Cash Module": "硬幣機 \/ 紙鈔機模組", + "Cash Module": "硬幣機 / 紙鈔機模組", "Cash Module Feature": "現金模組功能", "Cash Module Function": "現金模組功能", "Category": "類別", @@ -243,13 +259,15 @@ "Change Note": "異動備註", "Change Stock": "零錢庫存", "Channel Limits": "貨道上限", - "Channel Limits (Track\/Spring)": "貨道上限 (履帶\/彈簧)", + "Channel Limits (Track/Spring)": "貨道上限 (履帶/彈簧)", "Channel Limits Config": "貨道上限配置", "Channel Limits Configuration": "貨道上限配置", "ChannelId": "ChannelId", "ChannelSecret": "ChannelSecret", + "Check": "核對", "Checkout Time 1": "卡機結帳時間1", "Checkout Time 2": "卡機結帳時間2", + "Choose Date": "選擇日期", "Clear": "清除", "Clear Abnormal Status": "清除異常狀態", "Clear Filter": "清除篩選", @@ -262,8 +280,8 @@ "Code": "代碼", "Code Copied": "代碼已複製", "Coin Acceptor": "硬幣機", - "Coin\/Banknote Machine": "硬幣機\/紙鈔機", - "Coin\/Bill Acceptor": "硬幣機\/紙鈔機", + "Coin/Banknote Machine": "硬幣機/紙鈔機", + "Coin/Bill Acceptor": "硬幣機/紙鈔機", "Command Center": "指令中心", "Command Confirmation": "指令確認", "Command Type": "指令類型", @@ -273,14 +291,20 @@ "Command queued successfully.": "指令已加入佇列。", "Company": "客戶公司", "Company Code": "公司代碼", + "Company Discord notification settings updated successfully.": "公司 Discord 通知設定已成功更新。", + "Company Info": "公司資訊", "Company Information": "公司資訊", "Company Level": "公司層級", "Company Name": "公司名稱", + "Company Settings": "公司全域設定", "Complete movement history log": "完整的庫存異動歷程", "Completed": "已完成", "Completed At": "完成時間", "Config Name": "設定名稱", "Configuration Name": "設定名稱", + "Configure Discord Webhook alerts for hardware exceptions and connectivity logs": "配置各公司的 Discord Webhook 以接收硬體異常與連線狀態告警", + "Configure alert types and temperature thresholds": "設定告警類型與溫度門檻", + "Configured Alert Types": "已設定的告警類型", "Confirm": "確認", "Confirm Account Deactivation": "停用帳號確認", "Confirm Account Status Change": "帳號狀態變更確認", @@ -306,7 +330,9 @@ "Connection error": "連線錯誤", "Connection is unstable (disconnected :count times in the last hour)": "連線不穩定(過去 1 小時內中斷 :count 次)", "Connection lost (LWT)": "連線中斷", + "Connection recovery alerts and normal logs.": "連線恢復提示與一般日誌。", "Connection restored": "連線恢復", + "Connectivity Logs": "連線狀態日誌", "Connectivity Status": "連線狀態概況", "Connectivity vs Sales Correlation": "連線狀態與銷售關聯分析", "Consumed": "核銷成功", @@ -328,8 +354,12 @@ "Copy": "複製", "Copy Code": "複製代碼", "Copy Link": "複製連結", + "Copy Settings From Another Machine": "複製其他機台設定", + "Copy to Clipboard": "複製至剪貼簿", "Cost": "成本", "Coupons": "優惠券", + "Courier/Dispatcher": "物流經辦/派送員", + "Courier/Replenisher": "物流經辦/補貨員", "Create": "新增", "Create Config": "建立配置", "Create Machine": "新增機台", @@ -352,17 +382,31 @@ "Creation Time": "建立時間", "Creator": "建立者", "Credit Card": "信用卡", - "Credit Card \/ Contactless": "支援信用卡 \/ 感應支付", + "Credit Card / Contactless": "支援信用卡 / 感應支付", "Critical": "嚴重", + "Critical failures requiring immediate hands-on attention.": "需要立即處理的關鍵故障。", + "Cross-Company / Headquarter Global Stats": "跨公司 / 總部全域統計", "Current": "當前", "Current Password": "當前密碼", "Current Status": "當前狀態", "Current Stock": "當前庫存", "Current Stocks": "目前庫存", + "Current Temperature": "當前溫度", "Current Type": "當前類型", + "Current data indicates a loss": "當前數據出現虧損", + "Current temperature (:temp°C) is above the upper limit (:limit°C).": "當前溫度 (:temp°C) 已高於設定上限 (:limit°C)。", + "Current temperature (:temp°C) is below the lower limit (:limit°C).": "當前溫度 (:temp°C) 已低於設定下限 (:limit°C)。", + "Current temperature has returned to normal range (:temp°C).": "當前溫度已恢復至正常範圍 (:temp°C)。", "Current:": "現:", + "Custom": "自訂", + "Custom Alert Types": "自訂告警類型", "Custom Date": "自定義日期", "Custom Date Set": "已設定自定義日期", + "Custom Disabled (Mute Alert)": "自訂停用(靜音告警)", + "Custom Enabled": "自訂啟用", + "Custom Expiry": "自訂效期", + "Custom Lower Limit (°C)": "自訂下限溫度 (°C)", + "Custom Upper Limit (°C)": "自訂上限溫度 (°C)", "Customer Details": "客戶詳情", "Customer Info": "客戶資訊", "Customer List": "客戶列表", @@ -375,6 +419,7 @@ "Customer updated successfully.": "客戶更新成功。", "Cycle Efficiency": "週期效率", "Daily Revenue": "當日營收", + "Daily operational variance curve for selected timeframe": "所選統計區間之每日營運變動曲線", "Damage": "報廢", "Danger Zone: Delete Account": "危險區域:刪除帳號", "Dashboard": "儀表板", @@ -387,7 +432,14 @@ "Days": "天", "Default Donate": "預設捐贈", "Default Not Donate": "預設不捐贈", + "Default Temp Alert Limits": "預設溫度告警範圍", + "Default Temp Alert Lower Limit (°C)": "預設溫度告警下限 (°C)", + "Default Temp Alert Upper Limit (°C)": "預設溫度告警上限 (°C)", + "Default Temp Limits": "預設溫控範圍", + "Default Temp Lower Limit (°C)": "預設溫度下限 (°C)", + "Default Temp Upper Limit (°C)": "預設溫度上限 (°C)", "Define and manage security roles and permissions.": "定義並管理系統安全角色與權限。", + "Define custom temperature limits or inherit from model": "設定自訂溫度限制,或繼承自機台型號", "Define new third-party payment parameters": "定義新的第三方支付參數", "Delete": "刪除", "Delete Account": "刪除帳號", @@ -408,12 +460,16 @@ "Delta": "變化量", "Deposit Bonus": "儲值回饋", "Describe the repair or maintenance status...": "請描述維修或保養狀況...", - "Description \/ Name": "描述 \/ 名稱", + "Description / Name": "描述 / 名稱", "Deselect All": "取消全選", "Detail": "詳細", + "Detailed Analysis Data": "明細分析數據", "Details": "明細", + "Device": "機台", + "Device Exception": "下位機異常", "Device Information": "設備資訊", "Device Status Logs": "設備狀態紀錄", + "Device connection drops or minor warnings.": "機台連線中斷或輕微警報。", "Devices": "台設備", "Disable": "停用", "Disable Advertisement Confirmation": "停用廣告確認", @@ -425,7 +481,14 @@ "Disabled": "已停用", "Disabling this customer will also disable all accounts under this customer. Are you sure you want to continue?": "停用此客戶將會連帶停用該客戶下的所有帳號,確定要繼續嗎?", "Discord Notifications": "Discord通知", + "Discord Webhook URL": "Discord Webhook 網址", + "Discord notification settings updated successfully.": "Discord 通知設定更新成功。", "Discount": "折扣", + "Discount Amount": "折扣金額", + "Discount Amount (NTD)": "折抵金額 (NTD)", + "Discount Fold": "折數比例", + "Discount Type": "折抵類型", + "Discount Value": "折抵價值", "Dispense Failed": "出貨失敗", "Dispense Pending": "出貨中", "Dispense Product": "出貨商品", @@ -447,10 +510,11 @@ "Door Closed": "機門已關閉", "Door Opened": "機門已開啟", "Download Image": "下載圖片", + "Download Template": "下載範例檔", "Draft": "草稿", "Duration": "時長", "Duration (Seconds)": "播放秒數", - "E-Ticket (EasyCard\/iPass)": "電子票證 (悠遊卡\/一卡通)", + "E-Ticket (EasyCard/iPass)": "電子票證 (悠遊卡/一卡通)", "E.SUN Bank Scan": "玉山銀行掃碼", "E.SUN Pay": "玉山 Pay", "E.SUN QR Pay": "玉山銀行掃碼", @@ -466,9 +530,12 @@ "Edit Account": "編輯帳號", "Edit Advertisement": "編輯廣告", "Edit Category": "編輯分類", + "Edit Company Alert Settings": "編輯公司告警設定", "Edit Customer": "編輯客戶", + "Edit Discord Alert Settings": "編輯 Discord 告警設定", "Edit Expiry": "編輯效期", "Edit Machine": "編輯機台", + "Edit Machine Alert Settings": "編輯機台告警設定", "Edit Machine Model": "編輯機台型號", "Edit Machine Name": "編輯機台名稱", "Edit Machine Settings": "編輯機台設定", @@ -483,6 +550,8 @@ "Edit Staff Card": "編輯員工識別卡", "Edit Sub Account Role": "編輯子帳號角色", "Edit Warehouse": "編輯倉庫", + "Edit Welcome Gift": "編輯來店禮", + "Effective Alert Types": "目前生效的告警類型", "Electronic Invoice": "電子發票", "Electronic Invoices": "電子發票", "Elevator descending": "升降平台下降中", @@ -492,19 +561,21 @@ "Elevator rising": "升降平台上升中", "Elevator sensor error": "升降箱感測異常", "Email": "電子郵件", - "Emblem \/ Label": "標章 \/ 標籤", + "Emblem / Label": "標章 / 標籤", "Employee": "員工", "Employee ID": "員工編號", "Empty": "空白", "Empty Slot": "空貨道", "Empty Slots": "空貨道", "Enable": "啟用", + "Enable Alerts": "啟用告警", "Enable Material Code": "啟用物料編號", "Enable Points": "啟用點數規則", "Enable Points Mechanism": "啟用點數機制", + "Enable and paste Webhook URL": "啟用並貼上 Webhook 網址", "Enabled": "已啟用", "Enabled Features": "啟用功能", - "Enabled\/Disabled": "啟用\/停用", + "Enabled/Disabled": "啟用/停用", "End Date": "截止日", "End Time": "結束時間", "Engineer": "維修人員", @@ -523,11 +594,14 @@ "Entire Machine": "全機台", "Equipment efficiency and OEE metrics": "設備效能與 OEE 綜合指標", "Error": "異常", + "Error Code": "異常代碼", + "Error Details": "異常詳情", "Error processing request": "處理請求時發生錯誤", "Error report accepted": "錯誤回報已受理", "Error: :message (:code)": "錯誤::message (:code)", "Errors": "異常次數", "Estimated Expiry": "預計到期時間", + "Excel File": "Excel 檔案", "Execute": "執行", "Execute Change": "執行找零", "Execute Delivery Now": "立即執行出貨", @@ -539,15 +613,19 @@ "Expected Expiry Date & Time": "預計到期時間", "Expected Stock": "預期庫存", "Expired": "已過期", - "Expired \/ Disabled": "已過期 \/ 停用", + "Expired / Disabled": "已過期 / 停用", "Expired Time": "下架時間", "Expires At": "到期時間", "Expiring": "效期將屆", "Expiry": "效期", "Expiry Date": "有效日期", + "Expiry Date Set": "已設定到期日", "Expiry Management": "效期管理", "Expiry Time": "到期時間", "Expiry date tracking and warnings": "有效期限追蹤與預警", + "Export Report": "匯出報表", + "Export to CSV": "匯出成 CSV", + "Export to Excel": "匯出成 Excel", "Failed": "失敗", "Failed to fetch machine data.": "無法取得機台資料。", "Failed to load permissions": "載入權限失敗", @@ -557,6 +635,8 @@ "Failed to save permissions.": "無法儲存權限設定。", "Failed to send command": "發送指令失敗", "Failed to send sync command.": "無法送出同步指令", + "Failed to send test notification.": "發送測試通知失敗。", + "Failed to send test notification. Please verify the Webhook URL.": "發送測試通知失敗,請確認 Webhook 網址。", "Failed to update machine images: ": "更新機台圖片失敗:", "Feature Settings": "功能設定", "Feature Toggles": "功能開關", @@ -573,87 +653,87 @@ "Fleet Avg OEE": "全機台平均 OEE", "Fleet Performance": "全機台效能", "Flow ID": "流水號", - "Flow ID \/ Amount": "流水號 \/ 金額", - "Flow ID \/ Date": "流水號 \/ 日期", - "Flow ID \/ Machine": "流水號 \/ 機台", - "Flow ID \/ Order": "流水號 \/ 關聯訂單", - "Flow ID \/ Product": "流水號 \/ 商品", - "Flow ID \/ Slot": "流水號 \/ 貨道", - "Flow ID \/ Slot \/ Amount": "流水號 \/ 貨道 \/ 金額", - "Flow ID \/ Slot \/ Date": "流水號 \/ 貨道 \/ 日期", - "Flow ID \/ Slot \/ Machine": "流水號 \/ 貨道 \/ 機台", - "Flow ID \/ Slot \/ Order": "流水號 \/ 貨道 \/ 關聯訂單", - "Flow ID \/ Slot \/ Product": "流水號 \/ 貨道 \/ 商品", - "Flow ID \/ Slot \/ Product \/ Amount": "流水號 \/ 貨道 \/ 商品 \/ 金額", - "Flow ID \/ Slot \/ Product \/ Amount \/ Date": "流水號 \/ 貨道 \/ 商品 \/ 金額 \/ 日期", - "Flow ID \/ Slot \/ Product \/ Amount \/ Date \/ Order": "流水號 \/ 貨道 \/ 商品 \/ 金額 \/ 日期 \/ 關聯訂單", - "Flow ID \/ Slot \/ Product \/ Amount \/ Date \/ Time": "流水號 \/ 貨道 \/ 商品 \/ 金額 \/ 日期 \/ 時間", - "Flow ID \/ Slot \/ Product \/ Amount \/ Date \/ Time \/ Order": "流水號 \/ 貨道 \/ 商品 \/ 金額 \/ 日期 \/ 時間 \/ 關聯訂單", - "Flow ID \/ Slot \/ Product \/ Amount \/ Machine": "流水號 \/ 貨道 \/ 商品 \/ 金額 \/ 機台", - "Flow ID \/ Slot \/ Product \/ Amount \/ Machine \/ Date": "流水號 \/ 貨道 \/ 商品 \/ 金額 \/ 機台 \/ 日期", - "Flow ID \/ Slot \/ Product \/ Amount \/ Machine \/ Date \/ Order": "流水號 \/ 貨道 \/ 商品 \/ 金額 \/ 機台 \/ 日期 \/ 關聯訂單", - "Flow ID \/ Slot \/ Product \/ Amount \/ Machine \/ Date \/ Time": "流水號 \/ 貨道 \/ 商品 \/ 金額 \/ 機台 \/ 日期 \/ 時間", - "Flow ID \/ Slot \/ Product \/ Amount \/ Machine \/ Date \/ Time \/ Order": "流水號 \/ 貨道 \/ 商品 \/ 金額 \/ 機台 \/ 日期 \/ 時間 \/ 關聯訂單", - "Flow ID \/ Slot \/ Product \/ Amount \/ Machine \/ Order": "流水號 \/ 貨道 \/ 商品 \/ 金額 \/ 機台 \/ 關聯訂單", - "Flow ID \/ Slot \/ Product \/ Amount \/ Machine \/ Time": "流水號 \/ 貨道 \/ 商品 \/ 金額 \/ 機台 \/ 時間", - "Flow ID \/ Slot \/ Product \/ Amount \/ Machine \/ Time \/ Order": "流水號 \/ 貨道 \/ 商品 \/ 金額 \/ 機台 \/ 時間 \/ 關聯訂單", - "Flow ID \/ Slot \/ Product \/ Amount \/ Order": "流水號 \/ 貨道 \/ 商品 \/ 金額 \/ 關聯訂單", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status": "流水號 \/ 貨道 \/ 商品 \/ 金額 \/ 狀態", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Date": "流水號 \/ 貨道 \/ 商品 \/ 金額 \/ 狀態 \/ 日期", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Date \/ Order": "流水號 \/ 貨道 \/ 商品 \/ 金額 \/ 狀態 \/ 日期 \/ 關聯訂單", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Date \/ Time": "流水號 \/ 貨道 \/ 商品 \/ 金額 \/ 狀態 \/ 日期 \/ 時間", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Date \/ Time \/ Order": "流水號 \/ 貨道 \/ 商品 \/ 金額 \/ 狀態 \/ 日期 \/ 時間 \/ 關聯訂單", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Machine": "流水號 \/ 貨道 \/ 商品 \/ 金額 \/ 狀態 \/ 機台", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Machine \/ Date": "流水號 \/ 貨道 \/ 商品 \/ 金額 \/ 狀態 \/ 機台 \/ 日期", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Machine \/ Date \/ Order": "流水號 \/ 貨道 \/ 商品 \/ 金額 \/ 狀態 \/ 機台 \/ 日期 \/ 關聯訂單", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Machine \/ Date \/ Time": "流水號 \/ 貨道 \/ 商品 \/ 金額 \/ 狀態 \/ 機台 \/ 日期 \/ 時間", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Machine \/ Date \/ Time \/ Order": "流水號 \/ 貨道 \/ 商品 \/ 金額 \/ 狀態 \/ 機台 \/ 日期 \/ 時間 \/ 關聯訂單", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Machine \/ Date \/ Time \/ Order \/ Extra": "流水號 \/ 貨道 \/ 商品 \/ 金額 \/ 狀態 \/ 機台 \/ 日期 \/ 時間 \/ 關聯訂單 \/ 額外", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Machine \/ Date \/ Time \/ Order \/ Extra \/ More": "流水號 \/ 貨道 \/ 商品 \/ 金額 \/ 狀態 \/ 機台 \/ 日期 \/ 時間 \/ 關聯訂單 \/ 額外 \/ 更多", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Machine \/ Date \/ Time \/ Order \/ Extra \/ More \/ Done": "流水號 \/ 貨道 \/ 商品 \/ 金額 \/ 狀態 \/ 機台 \/ 日期 \/ 時間 \/ 關聯訂單 \/ 額外 \/ 更多 \/ 完成", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Machine \/ Order": "流水號 \/ 貨道 \/ 商品 \/ 金額 \/ 狀態 \/ 機台 \/ 關聯訂單", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Machine \/ Time": "流水號 \/ 貨道 \/ 商品 \/ 金額 \/ 狀態 \/ 機台 \/ 時間", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Machine \/ Time \/ Order": "流水號 \/ 貨道 \/ 商品 \/ 金額 \/ 狀態 \/ 機台 \/ 時間 \/ 關聯訂單", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Order": "流水號 \/ 貨道 \/ 商品 \/ 金額 \/ 狀態 \/ 關聯訂單", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Time": "流水號 \/ 貨道 \/ 商品 \/ 金額 \/ 狀態 \/ 時間", - "Flow ID \/ Slot \/ Product \/ Amount \/ Status \/ Time \/ Order": "流水號 \/ 貨道 \/ 商品 \/ 金額 \/ 狀態 \/ 時間 \/ 關聯訂單", - "Flow ID \/ Slot \/ Product \/ Amount \/ Time": "流水號 \/ 貨道 \/ 商品 \/ 金額 \/ 時間", - "Flow ID \/ Slot \/ Product \/ Amount \/ Time \/ Order": "流水號 \/ 貨道 \/ 商品 \/ 時間 \/ 關聯訂單", - "Flow ID \/ Slot \/ Product \/ Date": "流水號 \/ 貨道 \/ 商品 \/ 日期", - "Flow ID \/ Slot \/ Product \/ Date \/ Order": "流水號 \/ 貨道 \/ 商品 \/ 日期 \/ 關聯訂單", - "Flow ID \/ Slot \/ Product \/ Date \/ Time": "流水號 \/ 貨道 \/ 商品 \/ 日期 \/ 時間", - "Flow ID \/ Slot \/ Product \/ Date \/ Time \/ Order": "流水號 \/ 貨道 \/ 商品 \/ 日期 \/ 時間 \/ 關聯訂單", - "Flow ID \/ Slot \/ Product \/ Machine": "流水號 \/ 貨道 \/ 商品 \/ 機台", - "Flow ID \/ Slot \/ Product \/ Machine \/ Date": "流水號 \/ 貨道 \/ 商品 \/ 機台 \/ 日期", - "Flow ID \/ Slot \/ Product \/ Machine \/ Date \/ Order": "流水號 \/ 貨道 \/ 商品 \/ 機台 \/ 日期 \/ 關聯訂單", - "Flow ID \/ Slot \/ Product \/ Machine \/ Date \/ Time": "流水號 \/ 貨道 \/ 商品 \/ 機台 \/ 日期 \/ 時間", - "Flow ID \/ Slot \/ Product \/ Machine \/ Date \/ Time \/ Order": "流水號 \/ 貨道 \/ 商品 \/ 機台 \/ 日期 \/ 時間 \/ 關聯訂單", - "Flow ID \/ Slot \/ Product \/ Machine \/ Order": "流水號 \/ 貨道 \/ 商品 \/ 機台 \/ 關聯訂單", - "Flow ID \/ Slot \/ Product \/ Machine \/ Time": "流水號 \/ 貨道 \/ 商品 \/ 機台 \/ 時間", - "Flow ID \/ Slot \/ Product \/ Machine \/ Time \/ Order": "流水號 \/ 貨道 \/ 商品 \/ 機台 \/ 時間 \/ 關聯訂單", - "Flow ID \/ Slot \/ Product \/ Order": "流水號 \/ 貨道 \/ 商品 \/ 關聯訂單", - "Flow ID \/ Slot \/ Product \/ Status": "流水號 \/ 貨道 \/ 商品 \/ 狀態", - "Flow ID \/ Slot \/ Product \/ Status \/ Date": "流水號 \/ 貨道 \/ 商品 \/ 狀態 \/ 日期", - "Flow ID \/ Slot \/ Product \/ Status \/ Date \/ Order": "流水號 \/ 貨道 \/ 商品 \/ 狀態 \/ 日期 \/ 關聯訂單", - "Flow ID \/ Slot \/ Product \/ Status \/ Date \/ Time": "流水號 \/ 貨道 \/ 商品 \/ 狀態 \/ 日期 \/ 時間", - "Flow ID \/ Slot \/ Product \/ Status \/ Date \/ Time \/ Order": "流水號 \/ 貨道 \/ 商品 \/ 狀態 \/ 日期 \/ 時間 \/ 關聯訂單", - "Flow ID \/ Slot \/ Product \/ Status \/ Machine": "流水號 \/ 貨道 \/ 商品 \/ 狀態 \/ 機台", - "Flow ID \/ Slot \/ Product \/ Status \/ Machine \/ Date": "流水號 \/ 貨道 \/ 商品 \/ 狀態 \/ 機台 \/ 日期", - "Flow ID \/ Slot \/ Product \/ Status \/ Machine \/ Date \/ Order": "流水號 \/ 貨道 \/ 商品 \/ 狀態 \/ 機台 \/ 日期 \/ 關聯訂單", - "Flow ID \/ Slot \/ Product \/ Status \/ Machine \/ Date \/ Time": "流水號 \/ 貨道 \/ 商品 \/ 狀態 \/ 機台 \/ 日期 \/ 時間", - "Flow ID \/ Slot \/ Product \/ Status \/ Machine \/ Date \/ Time \/ Order": "流水號 \/ 貨道 \/ 商品 \/ 狀態 \/ 機台 \/ 日期 \/ 時間 \/ 關聯訂單", - "Flow ID \/ Slot \/ Product \/ Status \/ Machine \/ Order": "流水號 \/ 貨道 \/ 商品 \/ 狀態 \/ 機台 \/ 關聯訂單", - "Flow ID \/ Slot \/ Product \/ Status \/ Machine \/ Time": "流水號 \/ 貨道 \/ 商品 \/ 狀態 \/ 機台 \/ 時間", - "Flow ID \/ Slot \/ Product \/ Status \/ Machine \/ Time \/ Order": "流水號 \/ 貨道 \/ 商品 \/ 狀態 \/ 機台 \/ 時間 \/ 關聯訂單", - "Flow ID \/ Slot \/ Product \/ Status \/ Order": "流水號 \/ 貨道 \/ 商品 \/ 狀態 \/ 關聯訂單", - "Flow ID \/ Slot \/ Product \/ Status \/ Time": "流水號 \/ 貨道 \/ 商品 \/ 狀態 \/ 時間", - "Flow ID \/ Slot \/ Product \/ Status \/ Time \/ Order": "流水號 \/ 貨道 \/ 商品 \/ 狀態 \/ 時間 \/ 關聯訂單", - "Flow ID \/ Slot \/ Product \/ Time": "流水號 \/ 貨道 \/ 商品 \/ 時間", - "Flow ID \/ Slot \/ Product \/ Time \/ Order": "流水號 \/ 貨道 \/ 商品 \/ 時間 \/ 關聯訂單", - "Flow ID \/ Slot \/ Status": "流水號 \/ 貨道 \/ 狀態", - "Flow ID \/ Slot \/ Time": "流水號 \/ 貨道 \/ 時間", - "Flow ID \/ Status": "流水號 \/ 狀態", - "Flow ID \/ Time": "流水號 \/ 時間", + "Flow ID / Amount": "流水號 / 金額", + "Flow ID / Date": "流水號 / 日期", + "Flow ID / Machine": "流水號 / 機台", + "Flow ID / Order": "流水號 / 關聯訂單", + "Flow ID / Product": "流水號 / 商品", + "Flow ID / Slot": "流水號 / 貨道", + "Flow ID / Slot / Amount": "流水號 / 貨道 / 金額", + "Flow ID / Slot / Date": "流水號 / 貨道 / 日期", + "Flow ID / Slot / Machine": "流水號 / 貨道 / 機台", + "Flow ID / Slot / Order": "流水號 / 貨道 / 關聯訂單", + "Flow ID / Slot / Product": "流水號 / 貨道 / 商品", + "Flow ID / Slot / Product / Amount": "流水號 / 貨道 / 商品 / 金額", + "Flow ID / Slot / Product / Amount / Date": "流水號 / 貨道 / 商品 / 金額 / 日期", + "Flow ID / Slot / Product / Amount / Date / Order": "流水號 / 貨道 / 商品 / 金額 / 日期 / 關聯訂單", + "Flow ID / Slot / Product / Amount / Date / Time": "流水號 / 貨道 / 商品 / 金額 / 日期 / 時間", + "Flow ID / Slot / Product / Amount / Date / Time / Order": "流水號 / 貨道 / 商品 / 金額 / 日期 / 時間 / 關聯訂單", + "Flow ID / Slot / Product / Amount / Machine": "流水號 / 貨道 / 商品 / 金額 / 機台", + "Flow ID / Slot / Product / Amount / Machine / Date": "流水號 / 貨道 / 商品 / 金額 / 機台 / 日期", + "Flow ID / Slot / Product / Amount / Machine / Date / Order": "流水號 / 貨道 / 商品 / 金額 / 機台 / 日期 / 關聯訂單", + "Flow ID / Slot / Product / Amount / Machine / Date / Time": "流水號 / 貨道 / 商品 / 金額 / 機台 / 日期 / 時間", + "Flow ID / Slot / Product / Amount / Machine / Date / Time / Order": "流水號 / 貨道 / 商品 / 金額 / 機台 / 日期 / 時間 / 關聯訂單", + "Flow ID / Slot / Product / Amount / Machine / Order": "流水號 / 貨道 / 商品 / 金額 / 機台 / 關聯訂單", + "Flow ID / Slot / Product / Amount / Machine / Time": "流水號 / 貨道 / 商品 / 金額 / 機台 / 時間", + "Flow ID / Slot / Product / Amount / Machine / Time / Order": "流水號 / 貨道 / 商品 / 金額 / 機台 / 時間 / 關聯訂單", + "Flow ID / Slot / Product / Amount / Order": "流水號 / 貨道 / 商品 / 金額 / 關聯訂單", + "Flow ID / Slot / Product / Amount / Status": "流水號 / 貨道 / 商品 / 金額 / 狀態", + "Flow ID / Slot / Product / Amount / Status / Date": "流水號 / 貨道 / 商品 / 金額 / 狀態 / 日期", + "Flow ID / Slot / Product / Amount / Status / Date / Order": "流水號 / 貨道 / 商品 / 金額 / 狀態 / 日期 / 關聯訂單", + "Flow ID / Slot / Product / Amount / Status / Date / Time": "流水號 / 貨道 / 商品 / 金額 / 狀態 / 日期 / 時間", + "Flow ID / Slot / Product / Amount / Status / Date / Time / Order": "流水號 / 貨道 / 商品 / 金額 / 狀態 / 日期 / 時間 / 關聯訂單", + "Flow ID / Slot / Product / Amount / Status / Machine": "流水號 / 貨道 / 商品 / 金額 / 狀態 / 機台", + "Flow ID / Slot / Product / Amount / Status / Machine / Date": "流水號 / 貨道 / 商品 / 金額 / 狀態 / 機台 / 日期", + "Flow ID / Slot / Product / Amount / Status / Machine / Date / Order": "流水號 / 貨道 / 商品 / 金額 / 狀態 / 機台 / 日期 / 關聯訂單", + "Flow ID / Slot / Product / Amount / Status / Machine / Date / Time": "流水號 / 貨道 / 商品 / 金額 / 狀態 / 機台 / 日期 / 時間", + "Flow ID / Slot / Product / Amount / Status / Machine / Date / Time / Order": "流水號 / 貨道 / 商品 / 金額 / 狀態 / 機台 / 日期 / 時間 / 關聯訂單", + "Flow ID / Slot / Product / Amount / Status / Machine / Date / Time / Order / Extra": "流水號 / 貨道 / 商品 / 金額 / 狀態 / 機台 / 日期 / 時間 / 關聯訂單 / 額外", + "Flow ID / Slot / Product / Amount / Status / Machine / Date / Time / Order / Extra / More": "流水號 / 貨道 / 商品 / 金額 / 狀態 / 機台 / 日期 / 時間 / 關聯訂單 / 額外 / 更多", + "Flow ID / Slot / Product / Amount / Status / Machine / Date / Time / Order / Extra / More / Done": "流水號 / 貨道 / 商品 / 金額 / 狀態 / 機台 / 日期 / 時間 / 關聯訂單 / 額外 / 更多 / 完成", + "Flow ID / Slot / Product / Amount / Status / Machine / Order": "流水號 / 貨道 / 商品 / 金額 / 狀態 / 機台 / 關聯訂單", + "Flow ID / Slot / Product / Amount / Status / Machine / Time": "流水號 / 貨道 / 商品 / 金額 / 狀態 / 機台 / 時間", + "Flow ID / Slot / Product / Amount / Status / Machine / Time / Order": "流水號 / 貨道 / 商品 / 金額 / 狀態 / 機台 / 時間 / 關聯訂單", + "Flow ID / Slot / Product / Amount / Status / Order": "流水號 / 貨道 / 商品 / 金額 / 狀態 / 關聯訂單", + "Flow ID / Slot / Product / Amount / Status / Time": "流水號 / 貨道 / 商品 / 金額 / 狀態 / 時間", + "Flow ID / Slot / Product / Amount / Status / Time / Order": "流水號 / 貨道 / 商品 / 金額 / 狀態 / 時間 / 關聯訂單", + "Flow ID / Slot / Product / Amount / Time": "流水號 / 貨道 / 商品 / 金額 / 時間", + "Flow ID / Slot / Product / Amount / Time / Order": "流水號 / 貨道 / 商品 / 時間 / 關聯訂單", + "Flow ID / Slot / Product / Date": "流水號 / 貨道 / 商品 / 日期", + "Flow ID / Slot / Product / Date / Order": "流水號 / 貨道 / 商品 / 日期 / 關聯訂單", + "Flow ID / Slot / Product / Date / Time": "流水號 / 貨道 / 商品 / 日期 / 時間", + "Flow ID / Slot / Product / Date / Time / Order": "流水號 / 貨道 / 商品 / 日期 / 時間 / 關聯訂單", + "Flow ID / Slot / Product / Machine": "流水號 / 貨道 / 商品 / 機台", + "Flow ID / Slot / Product / Machine / Date": "流水號 / 貨道 / 商品 / 機台 / 日期", + "Flow ID / Slot / Product / Machine / Date / Order": "流水號 / 貨道 / 商品 / 機台 / 日期 / 關聯訂單", + "Flow ID / Slot / Product / Machine / Date / Time": "流水號 / 貨道 / 商品 / 機台 / 日期 / 時間", + "Flow ID / Slot / Product / Machine / Date / Time / Order": "流水號 / 貨道 / 商品 / 機台 / 日期 / 時間 / 關聯訂單", + "Flow ID / Slot / Product / Machine / Order": "流水號 / 貨道 / 商品 / 機台 / 關聯訂單", + "Flow ID / Slot / Product / Machine / Time": "流水號 / 貨道 / 商品 / 機台 / 時間", + "Flow ID / Slot / Product / Machine / Time / Order": "流水號 / 貨道 / 商品 / 機台 / 時間 / 關聯訂單", + "Flow ID / Slot / Product / Order": "流水號 / 貨道 / 商品 / 關聯訂單", + "Flow ID / Slot / Product / Status": "流水號 / 貨道 / 商品 / 狀態", + "Flow ID / Slot / Product / Status / Date": "流水號 / 貨道 / 商品 / 狀態 / 日期", + "Flow ID / Slot / Product / Status / Date / Order": "流水號 / 貨道 / 商品 / 狀態 / 日期 / 關聯訂單", + "Flow ID / Slot / Product / Status / Date / Time": "流水號 / 貨道 / 商品 / 狀態 / 日期 / 時間", + "Flow ID / Slot / Product / Status / Date / Time / Order": "流水號 / 貨道 / 商品 / 狀態 / 日期 / 時間 / 關聯訂單", + "Flow ID / Slot / Product / Status / Machine": "流水號 / 貨道 / 商品 / 狀態 / 機台", + "Flow ID / Slot / Product / Status / Machine / Date": "流水號 / 貨道 / 商品 / 狀態 / 機台 / 日期", + "Flow ID / Slot / Product / Status / Machine / Date / Order": "流水號 / 貨道 / 商品 / 狀態 / 機台 / 日期 / 關聯訂單", + "Flow ID / Slot / Product / Status / Machine / Date / Time": "流水號 / 貨道 / 商品 / 狀態 / 機台 / 日期 / 時間", + "Flow ID / Slot / Product / Status / Machine / Date / Time / Order": "流水號 / 貨道 / 商品 / 狀態 / 機台 / 日期 / 時間 / 關聯訂單", + "Flow ID / Slot / Product / Status / Machine / Order": "流水號 / 貨道 / 商品 / 狀態 / 機台 / 關聯訂單", + "Flow ID / Slot / Product / Status / Machine / Time": "流水號 / 貨道 / 商品 / 狀態 / 機台 / 時間", + "Flow ID / Slot / Product / Status / Machine / Time / Order": "流水號 / 貨道 / 商品 / 狀態 / 機台 / 時間 / 關聯訂單", + "Flow ID / Slot / Product / Status / Order": "流水號 / 貨道 / 商品 / 狀態 / 關聯訂單", + "Flow ID / Slot / Product / Status / Time": "流水號 / 貨道 / 商品 / 狀態 / 時間", + "Flow ID / Slot / Product / Status / Time / Order": "流水號 / 貨道 / 商品 / 狀態 / 時間 / 關聯訂單", + "Flow ID / Slot / Product / Time": "流水號 / 貨道 / 商品 / 時間", + "Flow ID / Slot / Product / Time / Order": "流水號 / 貨道 / 商品 / 時間 / 關聯訂單", + "Flow ID / Slot / Status": "流水號 / 貨道 / 狀態", + "Flow ID / Slot / Time": "流水號 / 貨道 / 時間", + "Flow ID / Status": "流水號 / 狀態", + "Flow ID / Time": "流水號 / 時間", "Force End Session": "強制結束當前會話", "Force end current session": "強制結束目前的連線", "From": "來源", @@ -665,6 +745,7 @@ "Full Points": "全點數", "Functional Settings": "功能設定", "Games": "互動遊戲", + "General Settings": "基本設定", "General permissions not linked to a specific menu.": "未連結到特定選單的一般權限。", "Generate": "產生", "Generate New Code": "產生新代碼", @@ -679,6 +760,7 @@ "Got it": "知道了", "Grant UI Access": "開放 UI 存取權限", "Grid View": "矩陣視圖", + "Gross Margin": "毛利率", "Half Points": "半點數", "Half Points Amount": "半點數金額", "Hardware & Network": "硬體與網路", @@ -708,15 +790,23 @@ "Image": "圖片", "Image Downloaded": "圖片已下載", "Immediate": "立即", + "Import Excel": "Excel 匯入", + "Import Staff Cards": "匯入員工識別卡", + "Import failed": "匯入失敗", "In Stock": "當前庫存", "Inactive": "已停用", - "Includes Credit Card\/Mobile Pay": "含信用卡\/行動支付", + "Includes Credit Card/Mobile Pay": "含信用卡/行動支付", "Indefinite": "無限期", "Info": "一般", + "Inherit": "繼承", + "Inherit Company": "繼承公司設定", + "Inherit Company Alert Types": "繼承公司告警類型", + "Inherit Model / System default": "繼承型號 / 系統預設", "Initial Admin Account": "初始管理帳號", "Initial Role": "初始角色", "Initial contract registration": "初始合約註冊", "Installation": "裝機", + "Installation Location": "安裝位置", "Insufficient stock for transfer": "庫存不足,無法調撥", "Invalid personnel selection": "無效的人員選擇", "Invalid status transition": "無效的狀態轉換", @@ -729,8 +819,8 @@ "Invoice Date": "開立日期", "Invoice Information": "發票資訊", "Invoice Number": "發票號碼", - "Invoice Number \/ Flow ID": "發票號碼 \/ 流水號", - "Invoice Number \/ Time": "發票號碼 \/ 時間", + "Invoice Number / Flow ID": "發票號碼 / 流水號", + "Invoice Number / Time": "發票號碼 / 時間", "Invoice Status": "發票開立狀態", "Issued At": "開立時間", "Item List": "商品清單", @@ -748,18 +838,22 @@ "LINE Pay Direct Settings Description": "LINE Pay 官方直連設定", "LINE_PAY_CHANNEL_ID": "LINE Pay 頻道 ID", "LIVE": "實時", + "Last 7 Days": "近 7 日", "Last Communication": "最後通訊", "Last Heartbeat": "最後心跳時間", + "Last Month": "上月", "Last Page": "最後頁面", "Last Signal": "最後訊號時間", "Last Sync": "最後通訊", "Last Time": "最後時間", "Last Updated": "最後更新日期", "Last Used": "最後使用", + "Last Week": "上週", "Latitude": "緯度", "Lease": "租賃", "Leave empty for permanent code": "留空表示永久有效", "Leave empty or 0 for permanent code": "留空或輸入 0 則為永久代碼", + "Leave empty to inherit company settings": "留空則繼承公司全域設定", "Level": "層級", "Line Coupons": "Line優惠券", "Line Machines": "Line機台", @@ -802,18 +896,26 @@ "Low stock and out-of-stock alerts": "低庫存與缺貨警示", "Loyalty & Features": "行銷與點數", "Machine": "機台", - "Machine \/ Date": "機台 \/ 日期", - "Machine \/ Employee": "機台 \/ 員工", - "Machine \/ Pass Code": "機台 \/ 通行碼", - "Machine \/ Slot": "機台 \/ 貨道", + "Machine / Date": "機台 / 日期", + "Machine / Employee": "機台 / 員工", + "Machine / Pass Code": "機台 / 通行碼", + "Machine / Slot": "機台 / 貨道", + "Machine / Welcome Gift": "機台 / 來店禮", "Machine Advertisement Settings": "機台廣告設置", + "Machine Alert Settings": "機台告警設定", + "Machine Connection Alert": "機台連線告警", + "Machine Connectivity Logs (LWT)": "機台連線狀態日誌 (LWT)", + "Machine Connectivity Lost": "機台連線中斷", + "Machine Connectivity Restored": "機台連線恢復", "Machine Count": "機台數量", "Machine Details": "機台詳情", + "Machine Discord notification settings updated successfully.": "機台 Discord 通知設定已成功更新。", "Machine Distribution": "機台分布", "Machine Distribution Map": "機台分布地圖", "Machine Flow ID": "機台流水號", - "Machine Flow ID \/ Time": "機台流水號 \/ 時間", + "Machine Flow ID / Time": "機台流水號 / 時間", "Machine Images": "機台照片", + "Machine Inbound Confirmation": "機台入庫確認", "Machine Info": "機台資訊", "Machine Information": "機台資訊", "Machine Inventory": "機台庫存", @@ -836,6 +938,7 @@ "Machine Serial": "機台序號", "Machine Serial No": "機台序號", "Machine Settings": "機台設定", + "Machine Specific": "機台專屬", "Machine Status": "機台狀態", "Machine Status List": "機台運行狀態列表", "Machine Stock": "機台庫存", @@ -844,18 +947,22 @@ "Machine Utilization": "機台稼動率", "Machine created successfully.": "機台已成功建立。", "Machine deleted successfully.": "機台已成功刪除。", + "Machine has reconnected to the server and resumed normal heartbeat.": "機台已重新連線至伺服器並恢復正常心跳。", "Machine images updated successfully.": "機台圖片已成功更新。", "Machine is heartbeat normal": "機台通訊正常", "Machine model created successfully.": "機台型號已成功建立。", "Machine model deleted successfully.": "機台型號已成功刪除。", + "Machine model saved successfully.": "機台型號已成功新增。", "Machine model updated successfully.": "機台型號已成功更新。", "Machine normal": "機台系統正常", "Machine not found": "找不到機台", "Machine permissions updated successfully.": "機台權限已成功更新。", "Machine settings updated successfully.": "機台設定已成功更新。", "Machine to Warehouse": "機台對倉庫", + "Machine to Warehouse Return": "機台退庫至倉庫", "Machine to warehouse returns": "機台退回倉庫", "Machine updated successfully.": "機台更新成功。", + "Machine-Specific Webhook": "機台專屬 Webhook", "Machines": "機台管理", "Machines Online": "在線機台數", "Main": "總倉", @@ -881,6 +988,7 @@ "Manage stock levels, stock-in orders, and movement history": "追蹤庫存水位、進貨單與異動紀錄", "Manage stock transfers between warehouses and machine returns": "建立倉庫間調撥或機台退庫單", "Manage warehouse stock levels, stock-in orders, adjustments, and movement history": "管理倉庫庫存水位、入庫單、盤點調整與異動紀錄", + "Manage welcoming promotion codes for new guests": "管理新客迎賓優惠碼與折抵活動", "Manage your ad material details": "管理您的廣告素材詳情", "Manage your catalog, categories, and inventory settings.": "管理您的商品型錄、分類及庫存設定。", "Manage your catalog, prices, and multilingual details.": "管理您的商品型錄、價格及多語系詳情。", @@ -940,6 +1048,7 @@ "Microwave door opened": "微波爐門開啟", "Min 8 characters": "至少 8 個字元", "Model": "機台型號", + "Model Default": "型號預設", "Model Name": "型號名稱", "Model changed to :model": "型號變更::model", "Models": "型號列表", @@ -956,9 +1065,9 @@ "Movement History": "異動紀錄", "Movement Logs": "異動紀錄", "Multilingual Names": "多語系名稱", - "N\/A": "不適用", + "N/A": "不適用", "Name": "名稱", - "Name \/ Machine": "名稱 \/ 機台", + "Name / Machine": "名稱 / 機台", "Name in English": "英文名稱", "Name in Japanese": "日文名稱", "Name in Traditional Chinese": "繁體中文名稱", @@ -983,6 +1092,7 @@ "No Invoice": "不開立發票", "No Location": "無位置資訊", "No Machine Selected": "尚未選擇機台", + "No Model": "未設定型號", "No accounts found": "找不到帳號資料", "No active cargo lanes found": "未找到活動貨道", "No additional notes": "無額外備註", @@ -1020,6 +1130,7 @@ "No pass codes found": "找不到通行碼", "No permissions": "無權限項目", "No pickup codes found": "找不到取貨碼", + "No product data matching search criteria": "沒有符合搜尋條件的商品資料", "No product record found": "無商品紀錄", "No products found in this warehouse": "此倉庫目前無商品庫存", "No products found matching your criteria.": "找不到符合條件的商品。", @@ -1043,13 +1154,16 @@ "No usage logs found.": "找不到使用日誌。", "No users found": "找不到用戶資料", "No warehouses found": "未找到倉庫", + "No welcome gifts found": "找不到來店禮資料", "None": "無", "Normal": "正常", + "Not Configured": "尚未設定", "Not Used": "不使用", "Not Used Description": "不使用第三方支付介接", "Note": "備註", "Note (optional)": "備註 (選填)", "Notes": "備註", + "Notification Language": "通知發送語系", "OEE": "OEE", "OEE Efficiency Trend": "OEE 效率趨勢", "OEE Score": "OEE 綜合評分", @@ -1073,6 +1187,7 @@ "Offline Machines": "離線機台", "Old": "舊值", "Old Value": "舊資料", + "Once": "單次使用", "Once your account is deleted, all of its resources and data will be permanently deleted. Before deleting your account, please download any data or information that you wish to retain.": "一旦您的帳號被刪除,其所有資源和數據將被永久刪除。在刪除帳號之前,請下載您希望保留的任何數據或資訊。", "Once your account is deleted, all of its resources and data will be permanently deleted. Please enter your password to confirm you would like to permanently delete your account.": "帳號一旦刪除,所有關連數據將被永久移除。請輸入您的密碼以確認您希望永久刪除此帳號。", "One-click replenishment order generation": "一鍵產生補貨單", @@ -1081,6 +1196,8 @@ "Online Duration": "累積連線時數", "Online Machines": "在線機台", "Online Status": "在線狀態", + "Only .xlsx, .xls, .csv files are supported (Max 5MB)": "僅支援 .xlsx, .xls, .csv 檔案 (最大 5MB)", + "Only machines under the same company can be cloned for security.": "基於安全性,僅限複製同公司旗下的機台設定。", "Only system roles can be assigned to platform administrative accounts.": "僅系統角色可指派給平台管理帳號。", "Operation Logs": "操作紀錄", "Operation Note": "操作備註", @@ -1096,12 +1213,14 @@ "Optional notes...": "備註內容(選填)...", "Optional remarks": "選填備註", "Optional remarks...": "選填備註...", + "Or Choose Custom Date": "或選擇自訂日期", "Order Details": "訂單詳情", "Order Info": "單據資訊", "Order Items": "商品內容", "Order Management": "訂單管理", "Order No.": "單號", - "Order Number \/ Time": "訂單編號 \/ 時間", + "Order Number": "訂單編號", + "Order Number / Time": "訂單編號 / 時間", "Order Status": "訂單狀態", "Order Time": "訂單時間", "Order already completed": "訂單已完成", @@ -1114,6 +1233,7 @@ "Orders": "購買單", "Orders per hour for selected date": "當日各小時訂單筆數", "Original": "原始", + "Original Amount": "應付金額", "Original Type": "原始類型", "Original:": "原:", "Other Features": "其他功能", @@ -1158,7 +1278,7 @@ "Pass Code (8 Digits)": "通行碼 (8 位數)", "Pass Code Management": "通行碼管理", "Pass Code QR": "通行碼 QR Code", - "Pass Code Ticket": "通行憑證", + "Pass Code Ticket": "通行碼票券", "Pass Codes": "通行碼", "Pass code cancelled.": "通行碼已取消。", "Pass code created: :code": "通行碼已建立::code", @@ -1179,8 +1299,9 @@ "Payment Type": "支付方式", "Pending": "待處理", "Per Page": "每頁顯示", + "Percentage Discount": "折數比例", "Performance": "效能 (Performance)", - "Permanent": "永久", + "Permanent": "永久有效", "Permanent Code": "永久代碼", "Permanent if empty": "留空則為永久有效", "Permanently Delete Account": "永久刪除帳號", @@ -1197,20 +1318,23 @@ "Pickup Code": "取貨碼", "Pickup Code (8 Digits)": "取貨碼 (8 位數)", "Pickup Codes": "取貨碼", - "Pickup Ticket": "取貨憑證", + "Pickup Ticket": "商品領取券", "Pickup code cancelled.": "取貨碼已取消", "Pickup code generated: :code": "已生成取貨碼::code", "Pickup code updated.": "取貨碼已更新", "Pickup door closed": "取貨門已關閉", "Pickup door error": "取貨門運作異常", "Pickup door not closed": "取貨門未關閉", + "Platform Operator": "平台營運商", "Playback Order": "播放順序", "Please Select Slot first": "請先選擇貨道", "Please check the following errors:": "請檢查以下錯誤:", "Please check the form for errors.": "請檢查欄位內容是否正確。", "Please confirm the details below": "請確認以下詳細資訊", + "Please enter Webhook URL first.": "請先輸入 Webhook 網址。", "Please enter address first": "請先輸入地址", "Please enter configuration name": "請輸入設定名稱", + "Please make sure to enable \"Background graphics\" in your browser print settings to print product images and styled components correctly.": "請確保在瀏覽器列印設定中啟用「背景圖形」,以便正確列印商品圖片和樣式元件。", "Please select a company": "請選擇公司", "Please select a company.": "請選擇公司", "Please select a machine": "請選擇機台", @@ -1221,43 +1345,56 @@ "Please select a material": "請選擇素材", "Please select a slot": "請選擇貨道", "Please select warehouse and machine": "請選擇倉庫和機台", + "Please use our standard template to ensure data compatibility.": "請使用標準範例檔以確保資料相容性。", "PlusPay": "全盈+PAY", "Point Rules": "點數規則", "Point Settings": "點數設定", "Points": "點數功能", "Points Settings": "點數設定", "Points toggle": "點數開關", - "Points\/Voucher": "點數\/優惠券", + "Points/Voucher": "點數/優惠券", "Position": "投放位置", "Prepared": "已備貨", + "Prepared By": "經辦人", "Preparing": "備貨中", "Preview": "預覽", "Previous": "上一頁", - "Price \/ Member": "售價 \/ 會員價", + "Price / Member": "售價 / 會員價", "Pricing Information": "價格資訊", + "Print": "列印", + "Print & PDF": "列印與 PDF", "Print Invoice": "列印發票", + "Print Notice": "列印提示", + "Print Order": "列印單據", + "Print Time": "列印時間", "Product": "商品", - "Product \/ Slot": "商品 \/ 貨道", - "Product \/ Stock": "商品 \/ 庫存", + "Product / Slot": "商品 / 貨道", + "Product / Stock": "商品 / 庫存", + "Product Barcode": "商品條碼", + "Product Cost": "商品成本", "Product Count": "商品數量", "Product Details": "商品明細", "Product ID": "商品編號", "Product Image": "商品圖片", "Product Info": "商品資訊", + "Product Items": "商品品項", "Product List": "商品清單", "Product Management": "商品管理", "Product Name": "商品名稱", "Product Name (Multilingual)": "商品名稱 (多語系)", + "Product Report Analysis": "商品報表分析", "Product Reports": "商品報表", + "Product Sales & Profit Trend": "商品銷售利潤走勢", "Product Status": "商品狀態", "Product created successfully": "商品已成功建立", "Product deleted successfully": "商品已成功刪除", "Product empty": "貨道缺貨 (PDT_EMPTY)", + "Product physical shipment count": "商品實體出貨件數", "Product status updated to :status": "商品狀態已更新為 :status", "Product updated successfully": "商品已成功更新", "Production Company": "生產公司", "Products": "商品", - "Products \/ Stock": "商品 \/ 庫存", + "Products / Stock": "商品 / 庫存", "Profile": "個人檔案", "Profile Information": "個人基本資料", "Profile Settings": "個人設定", @@ -1270,22 +1407,28 @@ "Purchase Finished": "購買結束", "Purchases": "採購單", "Purchasing": "購買中", + "Purpose": "用途", + "Push Status": "告警狀態", "QR": "二維碼", "QR CODE": "二維碼", + "QR Code": "QR Code", "QR Code Payment": "掃碼支付", "QR Scan Payment": "掃碼支付功能", "Qty": "數量", "Qty Change": "異動數量", "Quality": "品質 (Quality)", "Quantity": "數量", + "Quantity Sold": "銷售數量", "Questionnaire": "問卷", "Quick Expiry Check": "效期快速檢查", + "Quick Filter": "快捷篩選", "Quick Maintenance": "快速維護", "Quick Replenish": "快速補貨", "Quick Select": "快速選取", "Quick replenishment from this view": "從此畫面快速補貨", "Quick search...": "快速搜尋...", "Rank": "排行", + "Ready to print": "準備列印", "Real-time OEE analysis awaits": "即時 OEE 分析預備中", "Real-time Operation Logs (Last 50)": "即時操作日誌 (最後 50 筆)", "Real-time fleet efficiency and OEE metrics": "全機台即時效率與 OEE 指標", @@ -1293,6 +1436,7 @@ "Real-time inventory status across all machines with expiry tracking": "即時掌握所有機台庫存狀態與有效期限追蹤", "Real-time monitoring across all machines": "跨機台即時狀態監控", "Real-time monitoring and adjustment of cargo lane inventory and expiration dates": "即時監控與調整各機台貨道庫存與效期狀態", + "Real-time operational data synchronized": "即時營運數據已同步", "Real-time performance analytics": "即時效能分析", "Real-time slot-level inventory across all machines": "跨機台的即時貨道庫存追蹤", "Real-time status monitoring": "即時監控機台連線動態", @@ -1310,6 +1454,7 @@ "Refunded": "已退款", "Regenerate": "重新產生", "Regenerating the token will disconnect the physical machine until it is updated. Continue?": "重新產生金鑰將導致實體機台暫時失去連線,必須於機台端更新此新金鑰才能恢復。確定繼續嗎?", + "Remark": "備註", "Remote Change": "遠端找零", "Remote Checkout": "遠端結帳", "Remote Command Center": "遠端指令中心", @@ -1325,10 +1470,12 @@ "Remove Assignment Confirmation": "確認解除綁定", "Repair": "維修", "Replenish": "補貨", + "Replenish Qty": "補貨數量", "Replenishment": "補貨", "Replenishment Audit": "補貨單", "Replenishment Details": "補貨單詳情", "Replenishment Items": "補貨項目", + "Replenishment Order": "機台補貨單", "Replenishment Orders": "機台補貨單", "Replenishment Page": "補貨頁", "Replenishment Records": "機台補貨紀錄", @@ -1345,6 +1492,7 @@ "Reservation Members": "預約會員", "Reservation System": "預約系統", "Reservations": "預約管理", + "Reset": "重設", "Reset Filters": "重設篩選", "Reset POS terminal": "重設 POS 終端", "Resolve Coordinates": "獲取座標", @@ -1378,11 +1526,14 @@ "Sale Price": "售價", "Sales": "銷售管理", "Sales Activity": "銷售活動", + "Sales Amount": "銷售金額", "Sales Management": "銷售管理", "Sales Permissions": "銷售管理權限", + "Sales Quantity": "銷售數量", "Sales Record": "銷售紀錄", "Sales Records": "銷售紀錄", "Sales Today": "今日銷售", + "Sales revenue minus product cost net value": "銷售額扣除商品成本淨值", "Save": "儲存", "Save Changes": "儲存變更", "Save Config": "儲存配置", @@ -1401,15 +1552,16 @@ "Scan to authorize testing or maintenance": "掃描以進行測試或維護授權", "Scan to pick up your product": "掃描以領取您的商品", "Schedule": "排程區間", + "Search": "搜尋", "Search Company Title...": "搜尋公司名稱...", "Search Company...": "搜尋公司...", - "Search Flow ID \/ Slot...": "搜尋 流水號 \/ 貨道...", - "Search Invoice No \/ Flow ID...": "搜尋 發票號碼 \/ 流水號...", + "Search Flow ID / Slot...": "搜尋 流水號 / 貨道...", + "Search Invoice No / Flow ID...": "搜尋 發票號碼 / 流水號...", "Search Machine...": "搜尋機台...", - "Search Order No \/ Flow ID \/ Invoice...": "搜尋 訂單號 \/ 流水號 \/ 發票號碼...", - "Search Order No \/ Cards & Codes...": "搜尋 訂單號 \/ 卡號與代碼...", + "Search Order No / Cards & Codes...": "搜尋 訂單號 / 卡號與代碼...", + "Search Order No / Flow ID / Invoice...": "搜尋 訂單號 / 流水號 / 發票號碼...", "Search Product": "搜尋商品", - "Search Product \/ Slot...": "搜尋商品名稱 \/ 貨道...", + "Search Product / Slot...": "搜尋商品名稱 / 貨道...", "Search accounts...": "搜尋帳號...", "Search by ID or Name": "搜尋員工編號或姓名", "Search by ID or Name...": "搜尋員工編號或姓名...", @@ -1417,19 +1569,22 @@ "Search by ID, Name or UID...": "搜尋員工編號、姓名或卡號...", "Search by code, machine name or serial...": "搜尋代碼、機台名稱或序號...", "Search by code, name or machine...": "搜尋代碼、名稱或機台...", - "Search by name or S\/N...": "搜尋名稱或序號...", + "Search by name or S/N...": "搜尋名稱或序號...", "Search by name...": "搜尋名稱...", "Search cargo lane": "搜尋貨道編號或商品名稱", "Search categories...": "搜尋分類...", + "Search company name or code...": "搜尋公司名稱或代碼...", "Search company...": "搜尋公司...", "Search configurations...": "搜尋設定...", "Search customers...": "搜尋客戶...", "Search logs...": "搜尋紀錄...", + "Search machine name or SN...": "搜尋機台名稱或序號...", "Search machines by name or serial...": "搜尋機台名稱或序號...", "Search machines...": "搜尋機台...", "Search models...": "搜尋型號...", "Search notes or values...": "搜尋備註或數值...", "Search order number...": "搜尋單號...", + "Search product name, barcode...": "搜尋商品名稱、條碼...", "Search products...": "搜尋商品名稱...", "Search roles...": "搜尋角色...", "Search serial no or name...": "搜尋序號或機台名稱...", @@ -1456,11 +1611,13 @@ "Select Owner": "選擇公司名稱", "Select Personnel": "選擇人員", "Select Product": "選擇商品", + "Select Product for Analysis": "選擇分析商品", "Select Slot": "選擇貨道", "Select Slot...": "選擇貨道...", "Select Target Company": "選擇目標公司", "Select Target Slot": "選擇目標貨道", "Select Warehouse": "選擇倉庫", + "Select a machine to copy settings from...": "選擇要複製設定的來源機台...", "Select a machine to deep dive": "請選擇機台以開始深度分析", "Select a material to play on this machine": "選擇要在此機台播放的素材", "Select a team member to handle this replenishment order": "選擇負責此補貨單的團隊成員", @@ -1473,6 +1630,7 @@ "Selected Machine": "已選擇機台", "Selected Slot": "已選擇貨道", "Selection": "已選擇", + "Sending...": "發送中...", "Sent": "機台已接收", "Serial & Version": "序號與版本", "Serial NO": "機台序號", @@ -1482,6 +1640,7 @@ "Service Periods": "服務區間", "Service Terms": "服務期程", "Settings Saved": "設定已儲存", + "Settings loaded from": "已從以下機台載入設定:", "Settings updated successfully.": "設定更新成功。", "Settlement": "結帳處理", "Shopping Cart": "購物車", @@ -1496,7 +1655,7 @@ "Sign in to your account": "隨時隨地掌控您的業務。", "Signed in as": "登入身份", "Slot": "貨道", - "Slot \/ Product": "貨道 \/ 商品", + "Slot / Product": "貨道 / 商品", "Slot Mechanism (default: Conveyor, check for Spring)": "貨道機制 (預設履帶,勾選為彈簧)", "Slot No": "貨道編號", "Slot Status": "貨道效期", @@ -1516,6 +1675,7 @@ "Slots need replenishment": "需要補貨的貨道", "Smallest number plays first.": "數字愈小愈先播放。", "Smart replenishment suggestions": "智能補貨建議", + "Smart vending machine product sales, cost and profit analysis report": "智慧型販賣機商品銷售與成本利潤分析報表", "Software": "軟體", "Software End": "軟體結束", "Software Service": "軟體服務", @@ -1523,7 +1683,9 @@ "Some fields need attention": "部分欄位需要注意", "Sort Order": "排序", "Source": "來源", + "Source Machine": "來源機台", "Source Warehouse": "來源倉庫", + "Source of temperature limit settings": "溫度限制設定來源", "Special Permission": "特殊權限", "Specification": "規格", "Specifications": "規格", @@ -1544,18 +1706,19 @@ "Standby Ad": "待機廣告", "Start Date": "起始日", "Start Delivery": "開始配送", + "Start Import": "開始匯入", "Start Time": "開始時間", "Statistics": "數據統計", "Status": "狀態", - "Status \/ Invoice": "狀態 \/ 發票", - "Status \/ Temp \/ Sub \/ Card \/ Scan": "狀態 \/ 溫度 \/ 下位機 \/ 刷卡機 \/ 掃碼機", + "Status / Invoice": "狀態 / 發票", + "Status / Temp / Sub / Card / Scan": "狀態 / 溫度 / 下位機 / 刷卡機 / 掃碼機", "Status Timeline": "狀態時間線", "Status updated successfully": "狀態更新成功", "Stock": "庫存", "Stock & Expiry": "庫存與效期", "Stock & Expiry Management": "庫存與效期管理", "Stock & Expiry Overview": "庫存與效期一覽", - "Stock \/ Capacity": "庫存\/上限", + "Stock / Capacity": "庫存/上限", "Stock In": "庫存入庫", "Stock Level": "庫存水準", "Stock Level > 50%": "庫存高於 50%", @@ -1565,6 +1728,7 @@ "Stock Out": "庫存出庫", "Stock Quantity": "庫存數量", "Stock Rate": "庫存率", + "Stock Snap": "庫存快照", "Stock Update": "同步庫存", "Stock adjustments and damage reports": "庫存調整與報損處理", "Stock flow history": "庫存流向歷史", @@ -1585,13 +1749,16 @@ "Store ID": "商店代號", "Store Management": "店家管理", "StoreID": "商店代號 (StoreID)", - "Sub \/ Card \/ Scan": "下位機 \/ 刷卡機 \/ 掃碼機", + "Sub / Card / Scan": "下位機 / 刷卡機 / 掃碼機", "Sub Account Management": "子帳號管理", "Sub Account Roles": "子帳號角色", "Sub Accounts": "子帳號", "Sub-actions": "子項目", "Sub-machine Status": "下位機狀態", "Sub-machine Status Request": "下位機狀態回傳", + "Submachine Alert": "下位機告警", + "Submachine Exception": "下位機硬體異常", + "Submachine Exception (B013)": "下位機/貨道異常 (B013)", "Submit Record": "提交紀錄", "Subtotal": "小計", "Success": "成功", @@ -1619,6 +1786,8 @@ "System Reboot": "系統重啟", "System Role": "系統角色", "System Settings": "系統設定", + "System detected that the machine disconnected unexpectedly.": "系統偵測到機台已非預期中斷連線。", + "System restarting": "重啟中", "System role name cannot be modified.": "內建系統角色的名稱無法修改。", "System roles cannot be deleted by tenant administrators.": "客戶管理員無法刪除系統角色。", "System roles cannot be modified by tenant administrators.": "客戶管理員無法修改系統角色。", @@ -1638,17 +1807,31 @@ "Tax ID (Optional)": "統一編號 (選填)", "Tax System": "稅務系統", "Taxation System": "稅務系統", + "Temp Alert Range": "告警溫度範圍", + "Temp Alert State": "溫度告警狀態", "Temperature": "溫度", - "Temperature reported: :temp°C": "回報溫度 : :temp°C", + "Temperature Alert": "溫度告警", + "Temperature Alert (High)": "溫度過高告警", + "Temperature Alert (Low)": "溫度過低告警", + "Temperature Alert Settings": "溫度告警設定", + "Temperature Limit": "溫度限制", + "Temperature Restored": "溫度恢復正常", "Temperature Trend": "溫度趨勢", + "Temperature reported: :temp°C": "回報溫度 : :temp°C", "Temperature updated to :temp°C": "溫度已更新為::temp°C", "Tenant": "客戶", + "Tenant Company": "所屬租戶公司", "TermID": "終端代號 (TermID)", + "Test Connection": "測試連線", + "Test notification sent successfully.": "測試通知發送成功。", + "Testing": "測試", "The Super Admin role cannot be deleted.": "超級管理員角色不可刪除。", "The Super Admin role is immutable.": "超級管理員角色不可修改。", "The Super Admin role name cannot be modified.": "超級管理員角色的名稱無法修改。", "The image is too large. Please upload an image smaller than 1MB.": "圖片檔案太大,請上傳小於 1MB 的圖片。", "The image is too large. Please upload an image smaller than 5MB.": "圖片檔案太大,請上傳小於 5MB 的圖片。", + "This Month": "本月", + "This Week": "本週", "This is a system administrator role. Its name is locked to ensure system stability.": "這是系統管理員角色,名稱已鎖定以確保系統穩定性。", "This machine has a pending command. Please wait.": "此機台已有指令正在執行,請稍後。", "This role belongs to another company and cannot be assigned.": "此角色屬於其他公司,無法指派。", @@ -1665,6 +1848,7 @@ "To": "目的地", "To Warehouse": "目標倉庫", "To:": "終:", + "Today": "今日", "Today Cumulative Sales": "今日累積銷售", "Today's Transactions": "今日交易額", "Total": "總計", @@ -1674,18 +1858,25 @@ "Total Gross Value": "銷售總額", "Total Logins": "總登入次數", "Total Machines": "機台總數", + "Total Net Profit": "總淨利潤", "Total Orders": "今日訂單", + "Total Product Cost": "商品總成本", "Total Quantity": "補貨總量", + "Total Quantity Sold": "銷售總數量", + "Total Sales": "銷售總額", + "Total Sales Amount": "銷售總金額", + "Total Sales Profit": "銷售總利潤", "Total Selected": "已選擇總數", "Total Slots": "總貨道數", "Total Stock": "總庫存", "Total Stock Volume": "總庫存量", "Total Warehouses": "倉庫總數", "Total items": "總計 :count 項", + "Total transaction amount of successful payments": "已付款成功之交易總額", "Track": "履帶", "Track Channel Limit": "履帶貨道上限", "Track Limit": "履帶貨道上限", - "Track Limit (Track\/Spring)": "貨道上限(履帶\/彈簧)", + "Track Limit (Track/Spring)": "貨道上限(履帶/彈簧)", "Track device health and maintenance history": "追蹤設備健康與維修歷史", "Track stock levels, stock-in orders, and movement history": "追蹤庫存水位、進貨單與異動紀錄", "Track stock-in orders and movement history": "追蹤進貨單據與庫存異動紀錄", @@ -1697,8 +1888,12 @@ "Transfer Audit": "調撥單", "Transfer Details": "調撥單詳情", "Transfer In": "轉入", + "Transfer In Confirmation": "調入確認", + "Transfer Order": "庫存調撥單", "Transfer Orders": "調撥單管理", "Transfer Out": "調撥轉出", + "Transfer Out Confirmation": "調出確認", + "Transfer Qty": "調撥數量", "Transfer Type": "調撥類型", "Transfer completed": "調撥完成", "Transfer in": "調撥調入", @@ -1712,13 +1907,15 @@ "Trigger": "執行", "Trigger Dispense": "觸發出貨", "Trigger Remote Dispense": "觸發遠端出貨", + "Triggers on unexpected connection losses (LWT) and auto-resolves with restoration reports. Regular reboots are intelligently filtered.": "當機台無預警斷線 (LWT) 時觸發告警,並在恢復連線時發送復原通知。日常重開機會自動過濾。", + "Triggers when vending machines report motor blockages, coin/bill acceptor malfunctions, or sensor failures.": "當販賣機回報馬達堵塞、紙鈔機/硬幣器故障或感應器異常時觸發。", "Try using landmark names (e.g., Hualien County Government)": "您可以嘗試使用地標名稱(例如:花蓮縣政府)", "Tutorial Page": "教學頁", "Type": "類型", "Type to search or leave blank for system defaults.": "輸入關鍵字搜尋,或留空以使用系統預設。", "UI Elements": "UI元素", "Unassigned": "未指派", - "Unassigned \/ No Change": "未指派 \/ 不變動", + "Unassigned / No Change": "未指派 / 不變動", "Unauthorized Status": "未授權", "Unauthorized login attempt: :account": "越權登入嘗試::account", "Unauthorized: Account not authorized for this machine": "授權失敗:此帳號無存取該機台的權限", @@ -1756,7 +1953,10 @@ "Usage Limit": "使用次數上限", "Usage Logs": "使用紀錄", "Usage Progress": "使用進度", + "Usage Status": "使用狀態", + "Usage Type": "使用次數類型", "Used": "已使用", + "Used: :count": "已使用: :count 次", "User": "一般用戶", "User Info": "用戶資訊", "User logged in: :name": "使用者登入::name", @@ -1774,7 +1974,9 @@ "Validity Period (Days)": "有效期限 (天)", "Validity Period (Hours)": "有效期限 (小時)", "Vending": "販賣頁", + "Vending Machine Product Replenishment": "機台商品補貨", "Vending Page": "販賣頁", + "Vending machine reported a submachine hardware error.": "機台回報下位機硬體運作錯誤。", "Venue Management": "場地管理", "Verified": "驗證成功", "Verified Only": "僅限驗證", @@ -1807,6 +2009,7 @@ "Warehouse Overview": "倉庫總覽", "Warehouse Permissions": "倉庫管理權限", "Warehouse Stock": "倉庫數量", + "Warehouse Stock Out": "倉庫出庫確認", "Warehouse Transfer": "倉庫調撥", "Warehouse Type": "倉庫類型", "Warehouse created successfully": "倉庫建立成功", @@ -1817,6 +2020,7 @@ "Warehouse stock insufficient": "倉庫庫存不足", "Warehouse stock insufficient warning": "倉庫庫存不足以補滿所有貨道,但仍可建立補貨單", "Warehouse to Warehouse": "倉庫對倉庫", + "Warehouse to Warehouse Transfer": "倉庫至倉庫調撥", "Warehouse to warehouse transfers": "倉庫對倉庫調撥", "Warehouse updated successfully": "倉庫更新成功", "Warehouse updated successfully.": "倉庫已成功更新。", @@ -1826,10 +2030,16 @@ "Warranty End": "保固結束", "Warranty Service": "保固服務", "Warranty Start": "保固起始", + "Webhook Status": "Webhook 狀態", + "Webhook URL": "Webhook 網址", "Welcome Gift": "來店禮", + "Welcome Gift Code": "來店禮代碼", + "Welcome Gift Code (8 Digits)": "來店禮代碼 (8位數)", "Welcome Gift Feature": "迎賓禮功能", "Welcome Gift Function": "迎賓禮功能", + "Welcome Gift Name": "來店禮名稱", "Welcome Gift Status": "來店禮", + "Welcome Gifts": "來店禮設定", "Work Content": "作業內容", "Yes, Cancel": "確認取消", "Yes, Deactivate": "是的,停用", @@ -1844,6 +2054,8 @@ "Your recent account activity": "最近的帳號活動", "[PickupCode] Verification failed: :code": "[取貨碼] 驗證失敗: :code", "[StaffCard] Verification failed: :uid": "[員工卡] 驗證失敗: :uid", + "_discord_section": "=== Discord 告警設定 ===", + "_model_temp_section": "=== 型號溫度設定 ===", "accounts": "帳號管理", "admin": "管理員", "analysis": "分析管理", @@ -1879,14 +2091,17 @@ "consumed": "核銷完成", "cost": "成本", "create": "建立", + "d": "天", "data-config": "資料設定", "data-config.sub-account-roles": "子帳號角色", "data-config.sub-accounts": "子帳號管理", "description": "商品描述", "disabled": "停用", - "e.g. 500ml \/ 300g": "例如:500ml \/ 300g", + "e.g. 500ml / 300g": "例如:500ml / 300g", + "e.g. 8.5 for 85折, 8 for 8折": "例如:8.5 代表 85折,8 代表 8折", "e.g. John Doe": "例如:張曉明", "e.g. Main Warehouse": "如:總倉A", + "e.g. New Guest 15% Off Discount": "例如:新客迎賓 85 折優惠", "e.g. TWSTAR": "例如:TWSTAR", "e.g. Taiwan Star": "例如:台灣之星", "e.g. Test Code for Maintenance": "例如:維修測試代碼", @@ -1900,11 +2115,13 @@ "e.g., Taipei Station": "例如:台北車站", "e.g., お飲み物": "例如:お飲み物", "enabled": "啟用", + "error": "異常", "failed": "失敗", "files selected": "個檔案已選擇", "hours ago": "小時前", "image": "圖片", "image_url": "商品圖片", + "info": "一般", "is_active": "啟用狀態", "items": "筆項目", "john@example.com": "john@example.com", @@ -1930,9 +2147,9 @@ "menu.app": "APP 運維", "menu.audit": "審核管理", "menu.basic": "基本設定", + "menu.basic.discord-notifications": "Discord通知設定", "menu.basic.machines": "機台設定", "menu.basic.payment-configs": "客戶金流設定", - "menu.basic.discord-notifications": "Discord通知設定", "menu.data-config": "資料設定", "menu.data-config.admin-products": "商品狀態", "menu.data-config.advertisements": "廣告管理", @@ -2034,194 +2251,5 @@ "visit_gift": "來店禮", "vs Yesterday": "較昨日", "warehouses": "倉庫管理", - "待填寫": "待填寫", - "Import Excel": "Excel 匯入", - "Import Staff Cards": "匯入員工識別卡", - "Excel File": "Excel 檔案", - "Start Import": "開始匯入", - "Only .xlsx, .xls, .csv files are supported (Max 5MB)": "僅支援 .xlsx, .xls, .csv 檔案 (最大 5MB)", - "Download Template": "下載範例檔", - "Please use our standard template to ensure data compatibility.": "請使用標準範例檔以確保資料相容性。", - ":count staff cards imported successfully": "成功匯入 :count 張員工識別卡", - "Import failed": "匯入失敗", - "System restarting": "重啟中", - "Product Report Analysis": "商品報表分析", - "Smart vending machine product sales, cost and profit analysis report": "智慧型販賣機商品銷售與成本利潤分析報表", - "Real-time operational data synchronized": "即時營運數據已同步", - "Total Quantity Sold": "銷售總數量", - "Product physical shipment count": "商品實體出貨件數", - "Total Sales Amount": "銷售總金額", - "Sales Amount": "銷售金額", - "Total transaction amount of successful payments": "已付款成功之交易總額", - "Total Product Cost": "商品總成本", - "Product Cost": "商品成本", - "Sales Quantity": "銷售數量", - "Accumulated dynamic product purchase cost": "即時商品進貨成本累計", - "Total Sales Profit": "銷售總利潤", - "Sales revenue minus product cost net value": "銷售額扣除商品成本淨值", - "Current data indicates a loss": "當前數據出現虧損", - "Quick Filter": "快捷篩選", - "Last 7 Days": "近 7 日", - "Today": "今日", - "This Week": "本週", - "Last Week": "上週", - "This Month": "本月", - "Last Month": "上月", - "Select Product for Analysis": "選擇分析商品", - "All Products (ALL)": "全部商品 (ALL)", - "Tenant Company": "所屬租戶公司", - "Cross-Company \/ Headquarter Global Stats": "跨公司 \/ 總部全域統計", - "Product Sales & Profit Trend": "商品銷售利潤走勢", - "Daily operational variance curve for selected timeframe": "所選統計區間之每日營運變動曲線", - "Detailed Analysis Data": "明細分析數據", - "Search product name, barcode...": "搜尋商品名稱、條碼...", - "Export Report": "匯出報表", - "Copy to Clipboard": "複製至剪貼簿", - "Export to CSV": "匯出成 CSV", - "Export to Excel": "匯出成 Excel", - "Print & PDF": "列印與 PDF", - "Product Barcode": "商品條碼", - "Quantity Sold": "銷售數量", - "Total Sales": "銷售總額", - "Total Net Profit": "總淨利潤", - "Gross Margin": "毛利率", - "No product data matching search criteria": "沒有符合搜尋條件的商品資料", - "Analyze Solely": "單獨分析", - "Order Number": "訂單編號", - "Product Items": "商品品項", - "Original Amount": "應付金額", - "Discount Amount": "折扣金額", -"Configure Discord Webhook alerts for hardware exceptions and connectivity logs": "配置各公司的 Discord Webhook 以接收硬體異常與連線狀態告警", - "Search company name or code...": "搜尋公司名稱或代碼...", - "Company Info": "公司資訊", - "Webhook URL": "Webhook 網址", - "Push Status": "告警狀態", - "Configured Alert Types": "已設定的告警類型", - "Not Configured": "尚未設定", - "Edit Discord Alert Settings": "編輯 Discord 告警設定", - "General Settings": "基本設定", - "Enable Alerts": "啟用告警", - "Alert Types": "告警類別", - "Alert Severity Levels": "告警重要級別", - "Submachine Exception (B013)": "下位機/貨道異常 (B013)", - "Triggers when vending machines report motor blockages, coin/bill acceptor malfunctions, or sensor failures.": "當販賣機回報馬達堵塞、紙鈔機/硬幣器故障或感應器異常時觸發。", - "Machine Connectivity Logs (LWT)": "機台連線狀態日誌 (LWT)", - "Triggers on unexpected connection losses (LWT) and auto-resolves with restoration reports. Regular reboots are intelligently filtered.": "當機台無預警斷線 (LWT) 時觸發告警,並在恢復連線時發送復原通知。日常重開機會自動過濾。", - "Device": "機台", - "error": "異常", - "warning": "警告", - "info": "一般", - "Critical failures requiring immediate hands-on attention.": "需要立即處理的關鍵故障。", - "Device connection drops or minor warnings.": "機台連線中斷或輕微警報。", - "Connection recovery alerts and normal logs.": "連線恢復提示與一般日誌。", - "Please enter Webhook URL first.": "請先輸入 Webhook 網址。", - "Failed to send test notification.": "發送測試通知失敗。", - "An error occurred during testing.": "測試發送時發生錯誤。", - "Sending...": "發送中...", - "Test Connection": "測試連線", - "Test notification sent successfully.": "測試通知發送成功。", - "Failed to send test notification. Please verify the Webhook URL.": "發送測試通知失敗,請確認 Webhook 網址。", - "Discord notification settings updated successfully.": "Discord 通知設定更新成功。", - "Enable and paste Webhook URL": "啟用並貼上 Webhook 網址", - "Discord Webhook URL": "Discord Webhook 網址", - "An error occurred: ": "發生錯誤:", - "Search": "搜尋", - "Reset": "重設", - "Notification Language": "通知發送語系", - "Machine Connectivity Lost": "機台連線中斷", - "System detected that the machine disconnected unexpectedly.": "系統偵測到機台已非預期中斷連線。", - "Machine Connectivity Restored": "機台連線恢復", - "Machine has reconnected to the server and resumed normal heartbeat.": "機台已重新連線至伺服器並恢復正常心跳。", - "Submachine Exception": "下位機硬體異常", - "Vending machine reported a submachine hardware error.": "機台回報下位機硬體運作錯誤。", - "Error Details": "異常詳情", - "Error Code": "異常代碼", - "Affected Slot": "受影響貨道", - "Installation Location": "安裝位置", - "Temperature Alert": "溫度告警", - "Temperature Alert (High)": "溫度過高告警", - "Temperature Alert (Low)": "溫度過低告警", - "Temperature Restored": "溫度恢復正常", - "Current temperature (:temp°C) is above the upper limit (:limit°C).": "當前溫度 (:temp°C) 已高於設定上限 (:limit°C)。", - "Current temperature (:temp°C) is below the lower limit (:limit°C).": "當前溫度 (:temp°C) 已低於設定下限 (:limit°C)。", - "Current temperature has returned to normal range (:temp°C).": "當前溫度已恢復至正常範圍 (:temp°C)。", - "Temperature Limit": "溫度限制", - "Current Temperature": "當前溫度", - "Submachine Alert": "下位機告警", - "Machine Connection Alert": "機台連線告警", - - "_discord_section": "=== Discord 告警設定 ===" , - "Company Settings": "公司全域設定", - "Alert Switch": "告警開關", - "Connectivity Logs": "連線狀態日誌", - "Device Exception": "下位機異常", - "Copy Settings From Another Machine": "複製其他機台設定", - "Custom": "自訂", - "Custom Enabled": "自訂啟用", - "Custom Disabled (Mute Alert)": "自訂停用(靜音告警)", - "Custom Upper Limit (°C)": "自訂上限溫度 (°C)", - "Custom Lower Limit (°C)": "自訂下限溫度 (°C)", - "Define custom temperature limits or inherit from model": "設定自訂溫度限制,或繼承自機台型號", - "Edit Company Alert Settings": "編輯公司告警設定", - "Edit Machine Alert Settings": "編輯機台告警設定", - "Inherit": "繼承", - "Inherit Company": "繼承公司設定", - "Inherit Model / System default": "繼承型號 / 系統預設", - "Leave empty to inherit company settings": "留空則繼承公司全域設定", - "Machine Specific": "機台專屬", - "Machine-Specific Webhook": "機台專屬 Webhook", - "Model Default": "型號預設", - "No Model": "未設定型號", - "Only machines under the same company can be cloned for security.": "基於安全性,僅限複製同公司旗下的機台設定。", - "Select a machine to copy settings from...": "選擇要複製設定的來源機台...", - "Settings loaded from": "已從以下機台載入設定:", - "Source of temperature limit settings": "溫度限制設定來源", - "Temp Alert Range": "告警溫度範圍", - "Temp Alert State": "溫度告警狀態", - "Temperature Alert Settings": "溫度告警設定", - "Webhook Status": "Webhook 狀態", - "Company Discord notification settings updated successfully.": "公司 Discord 通知設定已成功更新。", - "Machine Discord notification settings updated successfully.": "機台 Discord 通知設定已成功更新。", - "Search machine name or SN...": "搜尋機台名稱或序號...", - - "_model_temp_section": "=== 型號溫度設定 ===", - "Default Temp Upper Limit (°C)": "預設溫度上限 (°C)", - "Default Temp Lower Limit (°C)": "預設溫度下限 (°C)", - "Default Temp Limits": "預設溫控範圍", - "Default Temp Alert Upper Limit (°C)": "預設溫度告警上限 (°C)", - "Default Temp Alert Lower Limit (°C)": "預設溫度告警下限 (°C)", - "Default Temp Alert Limits": "預設溫度告警範圍", - "Alert Types Source": "告警類型來源", - "Inherit Company Alert Types": "繼承公司告警類型", - "Custom Alert Types": "自訂告警類型", - "Effective Alert Types": "目前生效的告警類型", - "Machine Alert Settings": "機台告警設定", - "Configure alert types and temperature thresholds": "設定告警類型與溫度門檻", - "Machine model saved successfully.": "機台型號已成功新增。", -"Replenishment Order": "機台補貨單", - "Transfer Order": "庫存調撥單", - "Ready to print": "準備列印", - "Print": "列印", - "Platform Operator": "平台營運商", - "Vending Machine Product Replenishment": "機台商品補貨", - "Warehouse to Warehouse Transfer": "倉庫至倉庫調撥", - "Machine to Warehouse Return": "機台退庫至倉庫", - "Source Machine": "來源機台", - "Assigned Personnel": "指派人員", - "Print Time": "列印時間", - "Stock Snap": "庫存快照", - "Replenish Qty": "補貨數量", - "Transfer Qty": "調撥數量", - "Check": "核對", - "Actual Qty": "實補數量", - "Print Notice": "列印提示", - "Please make sure to enable \"Background graphics\" in your browser print settings to print product images and styled components correctly.": "請確保在瀏覽器列印設定中啟用「背景圖形」,以便正確列印商品圖片和樣式元件。", - "Prepared By": "經辦人", - "Warehouse Stock Out": "倉庫出庫確認", - "Courier\/Replenisher": "物流經辦\/補貨員", - "Machine Inbound Confirmation": "機台入庫確認", - "Transfer Out Confirmation": "調出確認", - "Courier\/Dispatcher": "物流經辦\/派送員", - "Transfer In Confirmation": "調入確認", - "Print Order": "列印單據" + "warning": "警告" } diff --git a/resources/views/admin/sales/welcome-gifts/index.blade.php b/resources/views/admin/sales/welcome-gifts/index.blade.php new file mode 100644 index 0000000..54bfc9a --- /dev/null +++ b/resources/views/admin/sales/welcome-gifts/index.blade.php @@ -0,0 +1,913 @@ +@extends('layouts.admin') + +@section('content') +
0 ? diffDays : 7; + } else { + this.editExpiryMode = 'permanent'; + this.editCustomExpiry = ''; + this.editExpiresDays = 7; + } + this.syncSelect('edit-discount-type', this.editDiscountType); + this.syncSelect('edit-usage-type', this.editUsageType); + + this.showEditModal = true; + }, + + generateRandomCode() { + this.customCode = Math.floor(Math.random() * 90000000 + 10000000).toString(); + }, + + calculateDaysExpiry() { + const date = new Date(); + const days = parseInt(this.expiresDays) || 0; + date.setDate(date.getDate() + days); + return this.formatDate(date); + }, + + getDisplayExpiry() { + if (this.expiryMode === 'permanent') { + return '{{ __("Permanent") }}'; + } + if (this.customExpiry) { + return this.customExpiry.replace('T', ' '); + } + return this.calculateDaysExpiry(); + }, + + getSubmittedExpiry() { + if (this.expiryMode === 'permanent') { + return ''; + } + if (this.customExpiry) { + return this.customExpiry; + } + return this.calculateDaysExpiry(); + }, + + calculateEditDaysExpiry() { + const date = new Date(); + const days = parseInt(this.editExpiresDays) || 0; + date.setDate(date.getDate() + days); + return this.formatDate(date); + }, + + getDisplayEditExpiry() { + if (this.editExpiryMode === 'permanent') { + return '{{ __("Permanent") }}'; + } + if (this.editCustomExpiry) { + return this.editCustomExpiry.replace('T', ' '); + } + return this.calculateEditDaysExpiry(); + }, + + getSubmittedEditExpiry() { + if (this.editExpiryMode === 'permanent') { + return ''; + } + if (this.editCustomExpiry) { + return this.editCustomExpiry; + } + return this.calculateEditDaysExpiry(); + }, + + formatDate(date) { + return date.getFullYear() + '-' + + String(date.getMonth() + 1).padStart(2, '0') + '-' + + String(date.getDate()).padStart(2, '0') + ' ' + + String(date.getHours()).padStart(2, '0') + ':' + + String(date.getMinutes()).padStart(2, '0'); + }, + + async fetchTabData(tab, customUrl = null) { + if (this.tabLoading === tab) return; + this.tabLoading = tab; + const container = document.getElementById(`tab-${tab}-container`); + let url = customUrl; + + if (!url) { + let params = new URLSearchParams(); + params.set('tab', tab); + params.set('_ajax', '1'); + + if (container) { + const form = container.querySelector('form'); + if (form) { + const formData = new FormData(form); + formData.forEach((value, key) => { + if (value.trim() !== '') params.append(key, value); + }); + } + } + url = `${window.location.pathname}?${params.toString()}`; + } else { + const urlObj = new URL(url, window.location.origin); + urlObj.searchParams.set('tab', tab); + urlObj.searchParams.set('_ajax', '1'); + url = urlObj.toString(); + } + + try { + const response = await fetch(url, { + headers: { + 'X-Requested-With': 'XMLHttpRequest', + 'Accept': 'application/json' + } + }); + const data = await response.json(); + if (data.success) { + if (container) { + container.innerHTML = data.html; + this.$nextTick(() => { + if (window.HSStaticMethods) window.HSStaticMethods.autoInit(); + }); + } + + const historyUrl = new URL(url, window.location.origin); + historyUrl.searchParams.delete('_ajax'); + window.history.pushState({}, '', historyUrl.toString()); + } + } catch (e) { + console.error(e); + window.showToast?.('{{ __("Loading failed") }}', 'error'); + } finally { + this.tabLoading = null; + } + }, + + confirmDelete(formId) { + this.deleteTargetForm = formId; + this.showDeleteModal = true; + }, + + submitDelete() { + if (this.deleteTargetForm) { + const form = document.getElementById(this.deleteTargetForm); + if (form) form.submit(); + } + this.showDeleteModal = false; + }, + + copyQrCode() { + if (!this.activeQrCode) return; + navigator.clipboard.writeText(this.activeQrCode).then(() => { + window.showToast('{{ __("Code Copied") }}', 'success'); + }); + }, + + copyQrLink() { + if (!this.activeTicketUrl) return; + navigator.clipboard.writeText(this.activeTicketUrl).then(() => { + window.showToast('{{ __("Link Copied") }}', 'success'); + }); + }, + + async downloadQrCode() { + const url = '{{ route('admin.basic-settings.qr-code') }}?size=500&data=' + encodeURIComponent(this.activeQrCode); + fetch(url) + .then(response => response.blob()) + .then(blob => { + const link = document.createElement('a'); + link.href = URL.createObjectURL(blob); + link.download = `welcome-gift-${this.activeQrCode}.png`; + link.click(); + URL.revokeObjectURL(link.href); + }); + }, + + syncSelect(id, value) { + this.$nextTick(() => { + const el = document.getElementById(id); + if (el) { + const valStr = (value !== undefined && value !== null && value.toString().trim() !== '') ? value.toString() : ' '; + el.value = valStr; + if (window.HSSelect) { + const inst = window.HSSelect.getInstance(el); + if (inst) inst.setValue(valStr); + } + } + }); + }, + + validateAndSubmit(e) { + if (!this.selectedMachine) { + window.showToast('{{ __("Please select a machine") }}', 'error'); + return; + } + if (!this.giftName.trim()) { + window.showToast('{{ __("Please enter a name") }}', 'error'); + return; + } + if (!this.discountValInput) { + window.showToast('{{ __("Please enter discount value") }}', 'error'); + return; + } + if (this.discountType === 'percentage') { + const val = parseFloat(this.discountValInput); + if (isNaN(val) || val <= 0 || val >= 10) { + window.showToast('{{ __("Discount fold must be between 0.1 and 9.9") }}', 'error'); + return; + } + } else { + const val = parseInt(this.discountValInput); + if (isNaN(val) || val <= 0) { + window.showToast('{{ __("Discount amount must be a positive integer") }}', 'error'); + return; + } + } + e.target.submit(); + }, + + getDiscountHelpText(input) { + const val = parseFloat(input); + if (isNaN(val) || val <= 0 || val >= 10) { + return ''; + } + const percentOff = Math.round((10 - val) * 10); + const map = { + '1': '一', '2': '二', '3': '三', '4': '四', '5': '五', + '6': '六', '7': '七', '8': '八', '9': '九', '0': '零' + }; + let foldStr = val.toString(); + let chineseFold = ''; + if (foldStr.includes('.')) { + const parts = foldStr.split('.'); + const integer = parts[0]; + const decimal = parts[1]; + const intChar = map[integer] || integer; + const decChar = map[decimal.charAt(0)] || decimal.charAt(0); + chineseFold = intChar + decChar + '折'; + } else { + const char = map[foldStr] || foldStr; + chineseFold = char + '折'; + } + return '{{ __("Discount") }}: ' + percentOff + '% off (' + chineseFold + ')'; + }, + + adjustDiscountValue(target, delta) { + const isEdit = target === 'edit'; + const type = isEdit ? this.editDiscountType : this.discountType; + const key = isEdit ? 'editDiscountValInput' : 'discountValInput'; + const current = parseFloat(this[key]) || 0; + const step = type === 'percentage' ? 0.1 : 1; + let next = current + (delta * step); + + if (type === 'percentage') { + next = Math.max(0.1, Math.min(9.9, next)); + this[key] = (Math.round(next * 10) / 10).toString(); + } else { + next = Math.max(1, Math.round(next)); + this[key] = next.toString(); + } + }, + + init() { + this.$watch('activeTab', (newTab) => { + const url = new URL(window.location.origin + window.location.pathname); + url.searchParams.set('tab', newTab); + window.history.pushState({}, '', url); + this.$nextTick(() => { + if (window.HSStaticMethods) window.HSStaticMethods.autoInit(); + }); + }); + + this.$watch('showCreateModal', (val) => { + if (val) { + this.selectedMachine = ''; + this.giftName = ''; + this.discountType = 'percentage'; + this.discountValInput = ''; + this.usageType = 'once'; + this.usageLimit = 1; + this.expiryMode = 'permanent'; + this.expiresDays = 7; + this.customExpiry = ''; + this.generateRandomCode(); + this.syncSelect('modal-gift-machine', ''); + this.syncSelect('create-discount-type', this.discountType); + this.syncSelect('create-usage-type', this.usageType); + } + }); + } +} " @ajax:navigate.window.prevent="fetchTabData(activeTab, $event.detail.url)"> + {{-- Page Header --}} + + + + + {{-- Tabs --}} + + + + + + {{-- Main Content --}} +
+
+ {{-- List Tab --}} +
+
+ +
+ @include('admin.sales.welcome-gifts.partials.tab-list') +
+
+
+ + {{-- Logs Tab --}} + +
+
+ + {{-- Create Modal --}} +
+
+
+ +
+
+

{{ + __('Add Welcome Gift') }}

+ +
+ +
+ @csrf +
+
+ + + @foreach($machines as $machine) + + @endforeach + +
+
+ + +
+
+ +
+
+ + + + + +
+
+ +
+ +
+ +
+ +
+
+
+
+ +
+
+ + + + + +
+ +
+ + {{-- Welcome Gift Code Section (Flexible) --}} +
+
+ + +
+ +
+ + {{-- Validity Period Section --}} +
+
+ +
+ + +
+
+ +
+ + +
+ {{-- Days Stepper --}} +
+ +
+ {{-- Unified Luxury Counter --}} +
+ +
+
+ +
+
+ +
+ + {{-- Quick Select Buttons --}} +
+ +
+
+
+ + {{-- Custom Expiry Input --}} +
+ +
+ +
+ + + +
+
+
+
+ + {{-- Expected Expiry Card --}} +
+
+ {{ __('Estimated Expiry') }} + +
+
+ + + + +
+
+
+
+ +
+ + +
+
+
+
+
+ + {{-- Edit Modal --}} +
+
+
+ +
+
+

{{ + __('Edit Welcome Gift') }}

+ +
+ +
+ @csrf + @method('PATCH') + + {{-- Readonly Welcome Gift Code Section --}} +
+ + +
+ +
+ + +
+ +
+
+ + + + + +
+
+ +
+ +
+ +
+ +
+
+
+
+ +
+
+ + + + + +
+ +
+ + {{-- Validity Period Section --}} +
+
+ +
+ + +
+
+ +
+ + +
+ {{-- Days Stepper --}} +
+ +
+ {{-- Unified Luxury Counter --}} +
+ +
+
+ +
+
+ +
+ + {{-- Quick Select Buttons --}} +
+ +
+
+
+ + {{-- Custom Expiry Input --}} +
+ +
+ +
+ + + +
+
+
+
+ + {{-- Expected Expiry Card --}} +
+
+ {{ __('Estimated Expiry') }} + +
+
+ + + + +
+
+
+
+ +
+ + +
+
+
+
+
+ + {{-- QR Modal --}} +
+
+
+
+
+ +
+
+
+

{{ __('QR Code') }} +

+

+ {{ __('Welcome Gift Code') }}: +

+
+ +
+ +
+
+ +
+ +
+

+ {{ __('Scan this code at the machine or share the link with the customer.') }} +

+ +
+ + + + + +
+
+
+ +
+ +
+
+
+
+ + {{-- Delete Modal --}} + +
+@endsection diff --git a/resources/views/admin/sales/welcome-gifts/partials/tab-list.blade.php b/resources/views/admin/sales/welcome-gifts/partials/tab-list.blade.php new file mode 100644 index 0000000..5e8f776 --- /dev/null +++ b/resources/views/admin/sales/welcome-gifts/partials/tab-list.blade.php @@ -0,0 +1,345 @@ +
+ +
+ + + + + + + +
+ +
+ + + + + +
+ +
+ + +
+
+ +{{-- Table (Desktop) --}} + + +{{-- Card Grid (Mobile) --}} +
+ @forelse ($welcomeGifts as $gift) +
+ {{-- Card Header --}} +
+
+
+ + + +
+
+ @if($gift->status === 'active' && (!$gift->expires_at || $gift->expires_at->isFuture())) +

+ {{ $gift->code }} +

+ @else +

+ {{ $gift->code }} +

+ @endif +

+ {{ $gift->name }} +

+
+
+
+ @php + $displayStatusMobile = $gift->status === 'active' && $gift->expires_at?->isPast() ? + 'expired' : ($gift->status === 'disabled' ? 'cancelled' : $gift->status); + @endphp + +
+
+ + {{-- Info Grid --}} +
+
+

+ {{ __('Machine') }}

+

+ {{ $gift->machine->name }}

+
+
+

+ {{ __('Discount Value') }}

+

+ {{ $gift->discount_label }}

+
+
+

+ {{ __('Usage Status') }}

+

+ @if($gift->usage_type === 'unlimited') + {{ __('Unlimited') }} ({{ $gift->usage_count }}) + @else + @if($gift->usage_count > 0) + {{ __('Used') }} + @else + {{ __('Once') }} + @endif + @endif +

+
+
+

+ {{ __('Expires At') }}

+

+ {{ $gift->expires_at ? $gift->expires_at->format('Y-m-d H:i') : __('Permanent') }} +

+
+
+ + {{-- Action Buttons --}} +
+ @if($gift->status === 'active' && (!$gift->expires_at || $gift->expires_at->isFuture())) + + + + @endif + + @if($gift->status === 'active') +
+ @csrf + @method('DELETE') + +
+ @endif +
+
+ @empty +
+ +
+ @endforelse +
+ +{{-- Pagination --}} +
+ {{ $welcomeGifts->appends(request()->query())->links('vendor.pagination.luxury') }} +
diff --git a/resources/views/admin/sales/welcome-gifts/partials/tab-logs.blade.php b/resources/views/admin/sales/welcome-gifts/partials/tab-logs.blade.php new file mode 100644 index 0000000..07b4b5a --- /dev/null +++ b/resources/views/admin/sales/welcome-gifts/partials/tab-logs.blade.php @@ -0,0 +1,310 @@ +{{-- Filter Form --}} +
+ + + {{-- 搜尋關鍵字 --}} +
+ + + + + + + +
+ + {{-- 類型篩選 --}} +
+ + @foreach($actions as $key => $label) + + @endforeach + +
+ + {{-- 開始時間 --}} +
+ + + + +
{{ __('Start Time') }}
+
+ + {{-- 結束時間 --}} +
+ + + + +
{{ __('End Time') }}
+
+ + {{-- 6 個月限制提示 (僅在未搜尋時間時顯示) --}} + @if(!request('start_date') && !request('end_date')) + + @endif + + {{-- 按鈕組 --}} +
+ + +
+
+ +{{-- Desktop Table Mode --}} + + +{{-- Card Mode (Mobile & Tablet) --}} +
+ @forelse($logs as $log) +
+
+
+
+ + + +
+
+

+ {{ $log->machine->name ?? $log->machine->serial_no ?? '-' }}

+

+ {{ $log->welcomeGift->name ?? '-' }}

+
+
+
+ +
+
+ +
+
+

{{ + __('Welcome Gift Code') }}

+

+ {{ $log->welcomeGift->code ?? '-' }} +

+
+
+

{{ + __('Discount') }}

+

+ {{ $log->welcomeGift->discount_label ?? '-' }} +

+
+
+

{{ + __('Sales Record') }}

+ @if($log->order_id) + + {{ $log->order?->order_no ?? '#' . $log->order_id }} + + @else +

-

+ @endif +
+ +
+

{{ + __('Time') }}

+

+ {{ $log->created_at?->format('Y-m-d H:i:s') }}

+
+
+
+ @empty +
+ +
+ @endforelse +
+ +{{-- Pagination --}} +
+ {{ $logs->links('vendor.pagination.luxury') }} +
diff --git a/resources/views/guest/pass-code/show.blade.php b/resources/views/guest/pass-code/show.blade.php index 10800f9..9ef7c72 100644 --- a/resources/views/guest/pass-code/show.blade.php +++ b/resources/views/guest/pass-code/show.blade.php @@ -1,5 +1,5 @@ - + @@ -13,27 +13,17 @@ body { font-family: 'Outfit', sans-serif; } - +
- {{-- Header Area --}}
-
-
- {{ __('Valid Authorization') }} -
-

{{ __('Pass') }} {{ __('Code') }}

+

{{ __('Pass Code') }}

{{ __('Scan to authorize testing or maintenance') }}

- {{-- Ticket Card --}}
- {{-- Background Glow --}}
-
- {{-- Machine Section --}}
- {{-- Notch cutouts for ticket look --}}
@@ -47,7 +37,6 @@

{{ $passCode->machine->name }}

-

{{ $passCode->machine->serial_no }}

@@ -64,7 +53,6 @@
- {{-- QR Section --}}
@@ -76,7 +64,6 @@
- {{-- Expiry Area --}}

{{ __('Expiry Time') }}

@@ -85,11 +72,6 @@

- - {{-- Footer Branding --}} -
-

{{ config('app.name') }} © {{ date('Y') }}

-
diff --git a/resources/views/guest/pickup/show.blade.php b/resources/views/guest/pickup/show.blade.php index c8328d2..cadcfed 100644 --- a/resources/views/guest/pickup/show.blade.php +++ b/resources/views/guest/pickup/show.blade.php @@ -1,5 +1,5 @@ - + @@ -13,38 +13,29 @@ body { font-family: 'Outfit', sans-serif; } - + + @php + $slot = $pickupCode->machine->slots->where('slot_no', $pickupCode->slot_no)->first(); + $product = $slot?->product; + @endphp +
- {{-- Header Area --}}
-
-
- {{ __('Valid Ticket') }} -
-

{{ __('Pickup') }} {{ __('Ticket') }}

+

{{ __('Pickup Code') }}

{{ __('Scan to pick up your product') }}

- {{-- Ticket Card --}}
- {{-- Background Glow --}}
-
- {{-- Product Section --}}
- {{-- Notch cutouts for ticket look --}}
- @php - $slot = $pickupCode->machine->slots->where('slot_no', $pickupCode->slot_no)->first(); - $product = $slot?->product; - @endphp @if($product && $product->image_url) - + {{ $product->name }} @else @@ -55,6 +46,7 @@

{{ $product?->name ?? __('Unknown Product') }}

+

{{ $pickupCode->machine->name ?? $pickupCode->machine->serial_no }}

@@ -66,12 +58,11 @@
{{ __('Status') }} - {{ __('Active') }} + {{ __('Active') }}
- {{-- QR Section --}}
@@ -79,11 +70,10 @@

{{ __('Pickup Code') }}

-

{{ $pickupCode->code }}

+

{{ $pickupCode->code }}

- {{-- Expiry Area --}}

{{ __('Expiry Time') }}

@@ -92,11 +82,6 @@

- - {{-- Footer Branding --}} -
-

{{ config('app.name') }} © {{ date('Y') }}

-
diff --git a/resources/views/guest/welcome-gift/show.blade.php b/resources/views/guest/welcome-gift/show.blade.php new file mode 100644 index 0000000..b42ebb3 --- /dev/null +++ b/resources/views/guest/welcome-gift/show.blade.php @@ -0,0 +1,77 @@ + + + + + + {{ __('Welcome Gift') }} - {{ config('app.name') }} + @vite(['resources/css/app.css', 'resources/js/app.js']) + + + + + + +
+
+

{{ __('Welcome Gift') }}

+

{{ __('Scan QR Code') }}

+
+ +
+
+
+
+
+
+ +
+
+ + + +
+
+

+ {{ $welcomeGift->machine->name }} +

+
+
+ +
+
+ {{ __('Welcome Gift') }} + {{ $welcomeGift->name }} +
+
+
+ {{ __('Status') }} + {{ __('Active') }} +
+
+
+ +
+
+ +
+ +
+

{{ __('Welcome Gift Code') }}

+

{{ $welcomeGift->code }}

+
+
+ +
+

{{ __('Expiry Time') }}

+

+ {{ $welcomeGift->expires_at ? $welcomeGift->expires_at->format('Y/m/d H:i') : __('Permanent') }} +

+
+
+
+
+ + diff --git a/resources/views/layouts/partials/sidebar-menu.blade.php b/resources/views/layouts/partials/sidebar-menu.blade.php index a688f66..ac8e2b3 100644 --- a/resources/views/layouts/partials/sidebar-menu.blade.php +++ b/resources/views/layouts/partials/sidebar-menu.blade.php @@ -210,12 +210,12 @@ {{ __('Pass Codes') }} @endcan - {{-- + @can('menu.sales.store-gifts')
  • {{ __('Store Gifts') }}
  • - --}} + @endcan diff --git a/routes/api.php b/routes/api.php index 01ba150..efa4b0e 100644 --- a/routes/api.php +++ b/routes/api.php @@ -67,6 +67,7 @@ Route::prefix('v1')->middleware(['throttle:api'])->group(function () { Route::post('machine/pickup/verify/B660', [App\Http\Controllers\Api\V1\App\MachineController::class, 'verifyPickupCode']); Route::post('machine/passcode/verify/B670', [App\Http\Controllers\Api\V1\App\MachineController::class, 'verifyPassCode']); Route::post('machine/staff/verify/B680', [App\Http\Controllers\Api\V1\App\MachineController::class, 'verifyStaffCard']); + Route::post('machine/welcome-gift/verify/B690', [App\Http\Controllers\Api\V1\App\MachineController::class, 'verifyWelcomeGift']); // 廣告與貨道清單 (B005, B009, B012) Route::get('machine/ad/B005', [App\Http\Controllers\Api\V1\App\MachineController::class, 'getAdvertisements']); diff --git a/routes/web.php b/routes/web.php index 09114dc..b6eae56 100644 --- a/routes/web.php +++ b/routes/web.php @@ -27,6 +27,7 @@ Route::get('/machines/distribution', [App\Http\Controllers\Admin\BasicSettings\M // 公開取貨憑證頁面 (無需登入) Route::get('/p/{slug}', [App\Http\Controllers\Guest\PickupController::class, 'show'])->name('pickup.ticket')->middleware('throttle:60,1'); Route::get('/t/{slug}', [App\Http\Controllers\Guest\PassCodeController::class, 'show'])->name('pass-code.ticket')->middleware('throttle:60,1'); +Route::get('/g/{slug}', [App\Http\Controllers\Guest\WelcomeGiftController::class, 'show'])->name('welcome-gift.ticket')->middleware('throttle:60,1'); Route::get('/dashboard', function () { return redirect()->route('admin.dashboard'); @@ -141,6 +142,9 @@ Route::middleware(['auth', 'auth.session', 'verified', 'tenant.access'])->prefix Route::get('/orders', [App\Http\Controllers\Admin\SalesController::class, 'orders'])->name('orders'); Route::get('/promotions', [App\Http\Controllers\Admin\SalesController::class, 'promotions'])->name('promotions'); Route::get('/store-gifts', [App\Http\Controllers\Admin\SalesController::class, 'storeGifts'])->name('store-gifts'); + Route::post('/store-gifts', [App\Http\Controllers\Admin\SalesController::class, 'storeWelcomeGift'])->name('store-gifts.store'); + Route::patch('/store-gifts/{welcomeGift}', [App\Http\Controllers\Admin\SalesController::class, 'updateWelcomeGift'])->name('store-gifts.update'); + Route::delete('/store-gifts/{welcomeGift}', [App\Http\Controllers\Admin\SalesController::class, 'destroyWelcomeGift'])->name('store-gifts.destroy'); // 詳情路由必須放在最後,避免攔截其他具體路由 Route::get('/{order}', [App\Http\Controllers\Admin\SalesController::class, 'show'])->name('show'); diff --git a/tests/Feature/Api/V1/WelcomeGiftTest.php b/tests/Feature/Api/V1/WelcomeGiftTest.php new file mode 100644 index 0000000..a60090b --- /dev/null +++ b/tests/Feature/Api/V1/WelcomeGiftTest.php @@ -0,0 +1,242 @@ +company = Company::create([ + 'name' => 'Test Company', + ]); + + $this->apiToken = 'test-machine-api-token-123456'; + + // 建立 Machine,並帶入 api_token 與 company_id + $this->machine = Machine::factory()->create([ + 'company_id' => $this->company->id, + 'api_token' => $this->apiToken, + ]); + } + + /** + * 1. 測試折數與趴數雙向換算 (Model Accessors) + */ + public function test_welcome_gift_discount_conversion_logic(): void + { + // A. 百分比折抵:15% off (8.5折) + $giftA = WelcomeGift::create([ + 'company_id' => $this->company->id, + 'machine_id' => $this->machine->id, + 'name' => '15% off Welcome Gift', + 'code' => '85000000', + 'discount_type' => 'percentage', + 'discount_value' => 15, + 'usage_type' => 'once', + 'usage_limit' => 1, + 'status' => 'active', + ]); + + $this->assertEquals(8.5, $giftA->input_fold); + $this->assertEquals('八五折', $giftA->discount_label); + + // B. 百分比折抵:20% off (8折) + $giftB = WelcomeGift::create([ + 'company_id' => $this->company->id, + 'machine_id' => $this->machine->id, + 'name' => '20% off Welcome Gift', + 'code' => '80000000', + 'discount_type' => 'percentage', + 'discount_value' => 20, + 'usage_type' => 'once', + 'usage_limit' => 1, + 'status' => 'active', + ]); + + $this->assertEquals(8, $giftB->input_fold); + $this->assertEquals('八折', $giftB->discount_label); + + // C. 金額折抵:折 50 元 + $giftC = WelcomeGift::create([ + 'company_id' => $this->company->id, + 'machine_id' => $this->machine->id, + 'name' => '50 NTD off Welcome Gift', + 'code' => '50000000', + 'discount_type' => 'amount', + 'discount_value' => 50, + 'usage_type' => 'once', + 'usage_limit' => 1, + 'status' => 'active', + ]); + + $this->assertNull($giftC->input_fold); + $this->assertEquals('折 50 元', $giftC->discount_label); + } + + /** + * 2. 測試 B690 API 驗證成功 + */ + public function test_b690_verification_success(): void + { + $gift = WelcomeGift::create([ + 'company_id' => $this->company->id, + 'machine_id' => $this->machine->id, + 'name' => '15% off Welcome Gift', + 'code' => '12345678', + 'discount_type' => 'percentage', + 'discount_value' => 15, + 'usage_type' => 'once', + 'usage_limit' => 1, + 'status' => 'active', + ]); + + $response = $this->withHeader('Authorization', "Bearer {$this->apiToken}") + ->postJson('/api/v1/app/machine/welcome-gift/verify/B690', [ + 'code' => '12345678', + ]); + + $response->assertStatus(200) + ->assertJson([ + 'success' => true, + 'code' => 200, + 'data' => [ + 'name' => '15% off Welcome Gift', + 'code_id' => $gift->id, + 'discount_type' => 'percentage', + 'discount_value' => 15, + 'discount_label' => '八五折', + 'usage_type' => 'once', + 'status' => 'active', + ], + ]); + + // 驗證是否有寫入 verify_success 日誌 + $this->assertDatabaseHas('welcome_gift_logs', [ + 'company_id' => $this->company->id, + 'machine_id' => $this->machine->id, + 'welcome_gift_id' => $gift->id, + 'action' => 'verify_success', + ]); + } + + /** + * 3. 測試 B690 驗證防刷與 Lockout 限流鎖定 + */ + public function test_b690_lockout_mechanism(): void + { + $lockoutKey = "welcome_gift_lockout:{$this->machine->id}"; + $failsKey = "welcome_gift_fails:{$this->machine->id}"; + + Cache::forget($lockoutKey); + Cache::forget($failsKey); + + // 連續 4 次錯誤 + for ($i = 0; $i < 4; $i++) { + $response = $this->withHeader('Authorization', "Bearer {$this->apiToken}") + ->postJson('/api/v1/app/machine/welcome-gift/verify/B690', [ + 'code' => '00000000', + ]); + $response->assertStatus(404) + ->assertJson([ + 'success' => false, + 'remaining_attempts' => 4 - $i, + ]); + } + + // 第 5 次錯誤,觸發 Lockout 60 秒鎖定 + $response = $this->withHeader('Authorization', "Bearer {$this->apiToken}") + ->postJson('/api/v1/app/machine/welcome-gift/verify/B690', [ + 'code' => '00000000', + ]); + + $response->assertStatus(404) + ->assertJson([ + 'success' => false, + 'remaining_attempts' => 0, + ]); + + // 第 6 次呼叫,因 Lockout 鎖定,直接回傳 429 + $response = $this->withHeader('Authorization', "Bearer {$this->apiToken}") + ->postJson('/api/v1/app/machine/welcome-gift/verify/B690', [ + 'code' => '00000000', + ]); + + $response->assertStatus(429) + ->assertJson([ + 'success' => false, + 'message' => 'Too many attempts. Locked.', + ]); + } + + /** + * 4. 測試交易核銷閉環 (Finalize Transaction) + */ + public function test_transaction_service_finalize_will_consume_welcome_gift(): void + { + // 建立一個單次使用限制的來店禮 + $gift = WelcomeGift::create([ + 'company_id' => $this->company->id, + 'machine_id' => $this->machine->id, + 'name' => '15% off Welcome Gift', + 'code' => '12345678', + 'discount_type' => 'percentage', + 'discount_value' => 15, + 'usage_type' => 'once', + 'usage_limit' => 1, + 'status' => 'active', + ]); + + $transactionService = app(TransactionService::class); + + $payload = [ + 'serial_no' => $this->machine->serial_no, + 'flow_id' => 'FLOW-123456-WELCOME-GIFT', + 'order' => [ + 'flow_id' => 'FLOW-123456-WELCOME-GIFT', + 'total_amount' => 100, + 'discount_amount' => 15, + 'pay_amount' => 85, + 'welcome_gift_id' => $gift->id, + ], + ]; + + // 執行交易 finalize + $order = $transactionService->finalizeTransaction($payload); + + $this->assertInstanceOf(Order::class, $order); + $this->assertEquals($gift->id, $order->welcome_gift_id); + + // 驗證來店禮 usage_count 被加 1,且狀態變為 used (因為 usage_limit 為 1) + $gift->refresh(); + $this->assertEquals(1, $gift->usage_count); + $this->assertEquals('used', $gift->status); + + // 驗證核銷日誌被建立 + $this->assertDatabaseHas('welcome_gift_logs', [ + 'company_id' => $this->company->id, + 'machine_id' => $this->machine->id, + 'welcome_gift_id' => $gift->id, + 'order_id' => $order->id, + 'action' => 'consume', + ]); + } +}