[REFACTOR] 機台系統設定 settings JSON 化與編輯介面多語系/UI 優化

1. Machine 模型:新增 settings JSON 的 accessors/mutators(shopping_mode、tax_invoice_enabled、card_terminal_enabled、scan_pay_esun/linepay_enabled、shopping_cart_enabled 等),讀寫統一收斂到 settings 欄位並同步既有資料表欄位。
2. MachineSettingController:system_settings 儲存邏輯補上 pickup_module_enabled(納入 allowedFields,非基礎版模式時強制關閉)。
3. 多語系補完:新增 Edit Machine System Settings、Basic Mode Features、Bill、Coin、Search machine name or code... 等 key(en/ja/zh_TW),並把寫死的「鈔/幣」面額前綴與中文搜尋框 placeholder 改為 __() 翻譯。
4. 編輯 modal UI:各支付區塊「全選/取消全選」移至標題旁;取貨模組新增區塊總開關與全選;購物車/來店禮改為卡片版型、開關靠右移除重複標籤。
5. 基礎版專屬功能以容器外框+標籤分組,與會員系統/稅務系統/硬體周邊(永遠顯示)做出視覺區隔;「支付方式」全選一併納入取貨模組。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
sky121113 2026-06-09 17:34:11 +08:00
parent f34a7bf9bc
commit 17f565bded
7 changed files with 886 additions and 205 deletions

View File

@ -347,13 +347,93 @@ class MachineSettingController extends AdminController
'shopping_cart_enabled', 'shopping_cart_enabled',
'welcome_gift_enabled', 'welcome_gift_enabled',
'cash_module_enabled', 'cash_module_enabled',
'pickup_module_enabled',
'member_system_enabled', 'member_system_enabled',
'ambient_temp_monitoring_enabled', 'ambient_temp_monitoring_enabled',
]; ];
$shoppingMode = $settings['shopping_mode'] ?? 'basic';
$data = []; $data = [];
foreach ($allowedFields as $field) { foreach ($allowedFields as $field) {
$data[$field] = isset($settings[$field]) ? (bool)$settings[$field] : false; $data[$field] = isset($settings[$field]) ? (bool)$settings[$field] : false;
} }
$jsonSettings = $machine->settings ?? [];
$jsonSettings['shopping_mode'] = $shoppingMode;
if ($shoppingMode !== 'basic') {
$data['card_terminal_enabled'] = false;
$data['scan_pay_esun_enabled'] = false;
$data['scan_pay_linepay_enabled'] = false;
$data['shopping_cart_enabled'] = false;
$data['welcome_gift_enabled'] = false;
$data['cash_module_enabled'] = false;
$data['pickup_module_enabled'] = false;
$jsonSettings['credit_card_enabled'] = false;
$jsonSettings['mobile_pay_enabled'] = false;
$jsonSettings['card_pay_enabled'] = false;
$jsonSettings['card_pay_easycard'] = false;
$jsonSettings['card_pay_ipass'] = false;
$jsonSettings['card_pay_icash'] = false;
$jsonSettings['scan_pay_enabled'] = false;
$jsonSettings['scan_pay_tappay_enabled'] = false;
$jsonSettings['tappay_linepay'] = false;
$jsonSettings['tappay_jkopay'] = false;
$jsonSettings['tappay_pipay'] = false;
$jsonSettings['tappay_pluspay'] = false;
$jsonSettings['tappay_easywallet'] = false;
$jsonSettings['cash_bill_1000'] = false;
$jsonSettings['cash_bill_500'] = false;
$jsonSettings['cash_bill_100'] = false;
$jsonSettings['cash_coin_50'] = false;
$jsonSettings['cash_coin_10'] = false;
$jsonSettings['cash_coin_5'] = false;
$jsonSettings['cash_coin_1'] = false;
$jsonSettings['pickup_code_enabled'] = false;
$jsonSettings['pass_code_enabled'] = false;
} else {
$jsonSettings['credit_card_enabled'] = isset($settings['credit_card_enabled']) ? (bool)$settings['credit_card_enabled'] : false;
$jsonSettings['mobile_pay_enabled'] = isset($settings['mobile_pay_enabled']) ? (bool)$settings['mobile_pay_enabled'] : false;
$jsonSettings['card_pay_enabled'] = isset($settings['card_pay_enabled']) ? (bool)$settings['card_pay_enabled'] : false;
$jsonSettings['card_pay_easycard'] = isset($settings['card_pay_easycard']) ? (bool)$settings['card_pay_easycard'] : false;
$jsonSettings['card_pay_ipass'] = isset($settings['card_pay_ipass']) ? (bool)$settings['card_pay_ipass'] : false;
$jsonSettings['card_pay_icash'] = isset($settings['card_pay_icash']) ? (bool)$settings['card_pay_icash'] : false;
$jsonSettings['scan_pay_enabled'] = isset($settings['scan_pay_enabled']) ? (bool)$settings['scan_pay_enabled'] : false;
$jsonSettings['scan_pay_tappay_enabled'] = isset($settings['scan_pay_tappay_enabled']) ? (bool)$settings['scan_pay_tappay_enabled'] : false;
$jsonSettings['tappay_linepay'] = isset($settings['tappay_linepay']) ? (bool)$settings['tappay_linepay'] : false;
$jsonSettings['tappay_jkopay'] = isset($settings['tappay_jkopay']) ? (bool)$settings['tappay_jkopay'] : false;
$jsonSettings['tappay_pipay'] = isset($settings['tappay_pipay']) ? (bool)$settings['tappay_pipay'] : false;
$jsonSettings['tappay_pluspay'] = isset($settings['tappay_pluspay']) ? (bool)$settings['tappay_pluspay'] : false;
$jsonSettings['tappay_easywallet'] = isset($settings['tappay_easywallet']) ? (bool)$settings['tappay_easywallet'] : false;
$jsonSettings['cash_bill_1000'] = isset($settings['cash_bill_1000']) ? (bool)$settings['cash_bill_1000'] : false;
$jsonSettings['cash_bill_500'] = isset($settings['cash_bill_500']) ? (bool)$settings['cash_bill_500'] : false;
$jsonSettings['cash_bill_100'] = isset($settings['cash_bill_100']) ? (bool)$settings['cash_bill_100'] : false;
$jsonSettings['cash_coin_50'] = isset($settings['cash_coin_50']) ? (bool)$settings['cash_coin_50'] : false;
$jsonSettings['cash_coin_10'] = isset($settings['cash_coin_10']) ? (bool)$settings['cash_coin_10'] : false;
$jsonSettings['cash_coin_5'] = isset($settings['cash_coin_5']) ? (bool)$settings['cash_coin_5'] : false;
$jsonSettings['cash_coin_1'] = isset($settings['cash_coin_1']) ? (bool)$settings['cash_coin_1'] : false;
$jsonSettings['pickup_code_enabled'] = isset($settings['pickup_code_enabled']) ? (bool)$settings['pickup_code_enabled'] : false;
$jsonSettings['pass_code_enabled'] = isset($settings['pass_code_enabled']) ? (bool)$settings['pass_code_enabled'] : false;
}
foreach ($allowedFields as $field) {
$jsonSettings[$field] = $data[$field];
}
$machine->update([
'settings' => $jsonSettings,
'updater_id' => auth()->id()
]);
// 同時更新 model 的屬性欄位 (以防 mutator 同步,以及確保 dirty check 正確)
$machine->update(array_merge($data, ['updater_id' => auth()->id()])); $machine->update(array_merge($data, ['updater_id' => auth()->id()]));
if ($request->expectsJson()) { if ($request->expectsJson()) {

View File

@ -426,6 +426,137 @@ class Machine extends Model
->count(); ->count();
} }
// === settings JSON 重構 Accessors & Mutators ===
public function getShoppingModeAttribute(): string
{
return $this->settings['shopping_mode'] ?? 'basic';
}
public function setShoppingModeAttribute($value)
{
$settings = $this->settings ?? [];
$settings['shopping_mode'] = (string) $value;
$this->settings = $settings;
}
public function getTaxInvoiceEnabledAttribute(): bool
{
return (bool) ($this->settings['tax_invoice_enabled'] ?? ($this->attributes['tax_invoice_enabled'] ?? false));
}
public function setTaxInvoiceEnabledAttribute($value)
{
$settings = $this->settings ?? [];
$settings['tax_invoice_enabled'] = (bool) $value;
$this->settings = $settings;
$this->attributes['tax_invoice_enabled'] = (bool) $value;
}
public function getCardTerminalEnabledAttribute(): bool
{
return (bool) ($this->settings['card_terminal_enabled'] ?? ($this->attributes['card_terminal_enabled'] ?? false));
}
public function setCardTerminalEnabledAttribute($value)
{
$settings = $this->settings ?? [];
$settings['card_terminal_enabled'] = (bool) $value;
$this->settings = $settings;
$this->attributes['card_terminal_enabled'] = (bool) $value;
}
public function getScanPayEsunEnabledAttribute(): bool
{
return (bool) ($this->settings['scan_pay_esun_enabled'] ?? ($this->attributes['scan_pay_esun_enabled'] ?? false));
}
public function setScanPayEsunEnabledAttribute($value)
{
$settings = $this->settings ?? [];
$settings['scan_pay_esun_enabled'] = (bool) $value;
$this->settings = $settings;
$this->attributes['scan_pay_esun_enabled'] = (bool) $value;
}
public function getScanPayLinepayEnabledAttribute(): bool
{
return (bool) ($this->settings['scan_pay_linepay_enabled'] ?? ($this->attributes['scan_pay_linepay_enabled'] ?? false));
}
public function setScanPayLinepayEnabledAttribute($value)
{
$settings = $this->settings ?? [];
$settings['scan_pay_linepay_enabled'] = (bool) $value;
$this->settings = $settings;
$this->attributes['scan_pay_linepay_enabled'] = (bool) $value;
}
public function getShoppingCartEnabledAttribute(): bool
{
return (bool) ($this->settings['shopping_cart_enabled'] ?? ($this->attributes['shopping_cart_enabled'] ?? false));
}
public function setShoppingCartEnabledAttribute($value)
{
$settings = $this->settings ?? [];
$settings['shopping_cart_enabled'] = (bool) $value;
$this->settings = $settings;
$this->attributes['shopping_cart_enabled'] = (bool) $value;
}
public function getWelcomeGiftEnabledAttribute(): bool
{
return (bool) ($this->settings['welcome_gift_enabled'] ?? ($this->attributes['welcome_gift_enabled'] ?? false));
}
public function setWelcomeGiftEnabledAttribute($value)
{
$settings = $this->settings ?? [];
$settings['welcome_gift_enabled'] = (bool) $value;
$this->settings = $settings;
$this->attributes['welcome_gift_enabled'] = (bool) $value;
}
public function getCashModuleEnabledAttribute(): bool
{
return (bool) ($this->settings['cash_module_enabled'] ?? ($this->attributes['cash_module_enabled'] ?? false));
}
public function setCashModuleEnabledAttribute($value)
{
$settings = $this->settings ?? [];
$settings['cash_module_enabled'] = (bool) $value;
$this->settings = $settings;
$this->attributes['cash_module_enabled'] = (bool) $value;
}
public function getMemberSystemEnabledAttribute(): bool
{
return (bool) ($this->settings['member_system_enabled'] ?? ($this->attributes['member_system_enabled'] ?? false));
}
public function setMemberSystemEnabledAttribute($value)
{
$settings = $this->settings ?? [];
$settings['member_system_enabled'] = (bool) $value;
$this->settings = $settings;
$this->attributes['member_system_enabled'] = (bool) $value;
}
public function getAmbientTempMonitoringEnabledAttribute(): bool
{
return (bool) ($this->settings['ambient_temp_monitoring_enabled'] ?? ($this->attributes['ambient_temp_monitoring_enabled'] ?? false));
}
public function setAmbientTempMonitoringEnabledAttribute($value)
{
$settings = $this->settings ?? [];
$settings['ambient_temp_monitoring_enabled'] = (bool) $value;
$this->settings = $settings;
$this->attributes['ambient_temp_monitoring_enabled'] = (bool) $value;
}
public function users() public function users()
{ {
return $this->belongsToMany(\App\Models\System\User::class); return $this->belongsToMany(\App\Models\System\User::class);

View File

@ -221,6 +221,8 @@
"Barcode / Material": "Barcode / Material", "Barcode / Material": "Barcode / Material",
"Based on Hours": "Based on Hours", "Based on Hours": "Based on Hours",
"Basic Information": "Basic Information", "Basic Information": "Basic Information",
"Basic Mode": "Basic Mode",
"Basic Mode Features": "Basic Mode Features",
"Basic Settings": "Basic Settings", "Basic Settings": "Basic Settings",
"Basic Specifications": "Basic Specifications", "Basic Specifications": "Basic Specifications",
"Batch": "Batch", "Batch": "Batch",
@ -233,7 +235,12 @@
"Bento heating": "Bento heating", "Bento heating": "Bento heating",
"Bento machine cooling water tank empty": "Bento machine cooling water tank low water", "Bento machine cooling water tank empty": "Bento machine cooling water tank low water",
"Bento not detected": "Bento not detected", "Bento not detected": "Bento not detected",
"Bill": "Bill",
"Bill 100": "Bill 100",
"Bill 1000": "Bill 1000",
"Bill 500": "Bill 500",
"Bill Acceptor": "Bill Acceptor", "Bill Acceptor": "Bill Acceptor",
"Bill Denominations": "Bill Denominations",
"Bracelet drop not detected": "Bracelet drop not detected", "Bracelet drop not detected": "Bracelet drop not detected",
"Bracelet scan failed": "Bracelet scan failed", "Bracelet scan failed": "Bracelet scan failed",
"Branch": "Branch", "Branch": "Branch",
@ -263,6 +270,7 @@
"Cannot delete role with active users.": "Cannot delete role with active users.", "Cannot delete role with active users.": "Cannot delete role with active users.",
"Cannot delete warehouse with existing stock": "Cannot delete warehouse with existing stock", "Cannot delete warehouse with existing stock": "Cannot delete warehouse with existing stock",
"Card Machine System": "Card Machine System", "Card Machine System": "Card Machine System",
"Card Payment": "Card Payment",
"Card Reader": "Card Reader", "Card Reader": "Card Reader",
"Card Reader No": "Card Reader No", "Card Reader No": "Card Reader No",
"Card Reader Reboot": "Card Reader Reboot", "Card Reader Reboot": "Card Reader Reboot",
@ -276,6 +284,7 @@
"Cash Module": "Cash Module", "Cash Module": "Cash Module",
"Cash Module Feature": "Cash Module Feature", "Cash Module Feature": "Cash Module Feature",
"Cash Module Function": "Cash Module Function", "Cash Module Function": "Cash Module Function",
"Cash Payment": "Cash Payment",
"Category": "Category", "Category": "Category",
"Category Management": "Category Management", "Category Management": "Category Management",
"Category Name": "Category Name", "Category Name": "Category Name",
@ -312,7 +321,13 @@
"Close Panel": "Close Panel", "Close Panel": "Close Panel",
"Code": "Code", "Code": "Code",
"Code Copied": "Code Copied", "Code Copied": "Code Copied",
"Coin": "Coin",
"Coin 1": "Coin 1",
"Coin 10": "Coin 10",
"Coin 5": "Coin 5",
"Coin 50": "Coin 50",
"Coin Acceptor": "Coin Acceptor", "Coin Acceptor": "Coin Acceptor",
"Coin Denominations": "Coin Denominations",
"Coin/Banknote Machine": "Coin/Banknote Machine", "Coin/Banknote Machine": "Coin/Banknote Machine",
"Coin/Bill Acceptor": "Coin/Bill Acceptor", "Coin/Bill Acceptor": "Coin/Bill Acceptor",
"Command Center": "Command Center", "Command Center": "Command Center",
@ -418,6 +433,7 @@
"Creator": "Creator", "Creator": "Creator",
"Credit Card": "Credit Card", "Credit Card": "Credit Card",
"Credit Card / Contactless": "Credit Card / Contactless", "Credit Card / Contactless": "Credit Card / Contactless",
"Credit Card Payment": "Credit Card Payment",
"Critical": "Critical", "Critical": "Critical",
"Critical failures requiring immediate hands-on attention.": "Critical failures requiring immediate hands-on attention.", "Critical failures requiring immediate hands-on attention.": "Critical failures requiring immediate hands-on attention.",
"Cross-Company / Headquarter Global Stats": "Cross-Company / Headquarter Global Stats", "Cross-Company / Headquarter Global Stats": "Cross-Company / Headquarter Global Stats",
@ -591,6 +607,8 @@
"ESUN": "ESUN", "ESUN": "ESUN",
"ESUN Scan Pay": "ESUN Scan Pay", "ESUN Scan Pay": "ESUN Scan Pay",
"Easy Wallet": "Easy Wallet", "Easy Wallet": "Easy Wallet",
"EasyCard": "EasyCard",
"EasyWallet": "EasyWallet",
"Edit": "Edit", "Edit": "Edit",
"Edit Account": "Edit Account", "Edit Account": "Edit Account",
"Edit Advertisement": "Edit Advertisement", "Edit Advertisement": "Edit Advertisement",
@ -604,6 +622,7 @@
"Edit Machine Model": "Edit Machine Model", "Edit Machine Model": "Edit Machine Model",
"Edit Machine Name": "Edit Machine Name", "Edit Machine Name": "Edit Machine Name",
"Edit Machine Settings": "Edit Machine Settings", "Edit Machine Settings": "Edit Machine Settings",
"Edit Machine System Settings": "Edit Machine System Settings",
"Edit Name": "Edit Name", "Edit Name": "Edit Name",
"Edit Pass Code": "Edit Pass Code", "Edit Pass Code": "Edit Pass Code",
"Edit Payment Config": "Edit Payment Config", "Edit Payment Config": "Edit Payment Config",
@ -924,6 +943,7 @@
"Item List": "Item List", "Item List": "Item List",
"Items": "Items", "Items": "Items",
"JKO Pay": "JKO Pay", "JKO Pay": "JKO Pay",
"JKOPAY": "JKOPAY",
"JKO_MERCHANT_ID": "JKO_MERCHANT_ID", "JKO_MERCHANT_ID": "JKO_MERCHANT_ID",
"Japanese": "Japanese", "Japanese": "Japanese",
"Joined": "Joined", "Joined": "Joined",
@ -960,6 +980,7 @@
"Line Members": "Line Members", "Line Members": "Line Members",
"Line Official Account": "Line Official Account", "Line Official Account": "Line Official Account",
"Line Orders": "Line Orders", "Line Orders": "Line Orders",
"Line Pay": "Line Pay",
"Line Permissions": "Line Permissions", "Line Permissions": "Line Permissions",
"Line Products": "Line Products", "Line Products": "Line Products",
"LinePay": "LinePay", "LinePay": "LinePay",
@ -1174,6 +1195,7 @@
"Microwave push rod retract error (0223)": "Microwave push rod retract error (0223)", "Microwave push rod retract error (0223)": "Microwave push rod retract error (0223)",
"Milk dispense timeout": "Milk dispense timeout", "Milk dispense timeout": "Milk dispense timeout",
"Min 8 characters": "Min 8 characters", "Min 8 characters": "Min 8 characters",
"Mobile Payment": "Mobile Payment",
"Model": "Model", "Model": "Model",
"Model Default": "Model Default", "Model Default": "Model Default",
"Model Name": "Model Name", "Model Name": "Model Name",
@ -1430,6 +1452,7 @@
"Pass code deleted.": "Pass code deleted.", "Pass code deleted.": "Pass code deleted.",
"Pass code disabled.": "Pass code disabled.", "Pass code disabled.": "Pass code disabled.",
"Pass code updated.": "Pass code updated.", "Pass code updated.": "Pass code updated.",
"Passcode": "Passcode",
"Password": "Password", "Password": "Password",
"Password updated successfully.": "Password updated successfully.", "Password updated successfully.": "Password updated successfully.",
"Payment & Invoice": "Payment & Invoice", "Payment & Invoice": "Payment & Invoice",
@ -1459,13 +1482,16 @@
"Phone": "Phone", "Phone": "Phone",
"Photo Slot": "Photo Slot", "Photo Slot": "Photo Slot",
"Pi Pay": "Pi Pay", "Pi Pay": "Pi Pay",
"Pi Wallet": "Pi Wallet",
"Picked up": "Picked up", "Picked up": "Picked up",
"Picked up Time": "Picked up Time", "Picked up Time": "Picked up Time",
"Pickup Code": "Pickup Code", "Pickup Code": "Pickup Code",
"Pickup Code (8 Digits)": "Pickup Code (8 Digits)", "Pickup Code (8 Digits)": "Pickup Code (8 Digits)",
"Pickup Codes": "Pickup Codes", "Pickup Codes": "Pickup Codes",
"Pickup Module": "Pickup Module",
"Pickup Recipient (Prescription Slip)": "Pickup Recipient (Prescription Slip)", "Pickup Recipient (Prescription Slip)": "Pickup Recipient (Prescription Slip)",
"Pickup Recipient Info": "Pickup Recipient Info", "Pickup Recipient Info": "Pickup Recipient Info",
"Pickup Sheet (Material No.)": "Pickup Sheet (Material No.)",
"Pickup Ticket": "Pickup Ticket", "Pickup Ticket": "Pickup Ticket",
"Pickup Voucher": "Pickup Voucher", "Pickup Voucher": "Pickup Voucher",
"Pickup code cancelled.": "Pickup code cancelled.", "Pickup code cancelled.": "Pickup code cancelled.",
@ -1718,6 +1744,7 @@
"Saving...": "Saving...", "Saving...": "Saving...",
"Scale level and access control": "Scale level and access control", "Scale level and access control": "Scale level and access control",
"Scan Pay": "Scan Pay", "Scan Pay": "Scan Pay",
"Scan Payment": "Scan Payment",
"Scan QR Code": "Scan QR Code", "Scan QR Code": "Scan QR Code",
"Scan this code at the machine or share the link with the customer.": "Scan this code at the machine or share the link with the customer.", "Scan this code at the machine or share the link with the customer.": "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 at the machine to authorize testing or maintenance.", "Scan this code at the machine to authorize testing or maintenance.": "Scan this code at the machine to authorize testing or maintenance.",
@ -1753,6 +1780,7 @@
"Search customers...": "Search customers...", "Search customers...": "Search customers...",
"Search logs...": "Search logs...", "Search logs...": "Search logs...",
"Search machine name or SN...": "Search machine name or SN...", "Search machine name or SN...": "Search machine name or SN...",
"Search machine name or code...": "Search machine name or code...",
"Search machine name, S/N, or location...": "Search machine name, S/N, or location...", "Search machine name, S/N, or location...": "Search machine name, S/N, or location...",
"Search machine name, serial no...": "Search machine name, serial no...", "Search machine name, serial no...": "Search machine name, serial no...",
"Search machines by name or serial...": "Search machines by name or serial...", "Search machines by name or serial...": "Search machines by name or serial...",
@ -1774,6 +1802,7 @@
"Security & State": "Security & State", "Security & State": "Security & State",
"Security Controls": "Security Controls", "Security Controls": "Security Controls",
"Select All": "Select All", "Select All": "Select All",
"Select All / Deselect All": "Select All / Deselect All",
"Select Cargo Lane": "Select Cargo Lane", "Select Cargo Lane": "Select Cargo Lane",
"Select Category": "Select Category", "Select Category": "Select Category",
"Select Company": "Select Company", "Select Company": "Select Company",
@ -1825,7 +1854,7 @@
"Setup Brand": "Setup Brand", "Setup Brand": "Setup Brand",
"Shopping Cart": "Shopping Cart", "Shopping Cart": "Shopping Cart",
"Shopping Cart Feature": "Shopping Cart Feature", "Shopping Cart Feature": "Shopping Cart Feature",
"Shopping Cart Function": "Shopping Cart Function", "Shopping Mode": "Shopping Mode",
"Show": "Show", "Show": "Show",
"Show material code field in products": "Show material code field in products", "Show material code field in products": "Show material code field in products",
"Show points rules in products": "Show points rules in products", "Show points rules in products": "Show points rules in products",
@ -1984,6 +2013,7 @@
"System super admin accounts cannot be modified via this interface.": "System super admin accounts cannot be modified via this interface.", "System super admin accounts cannot be modified via this interface.": "System super admin accounts cannot be modified via this interface.",
"Systems Initializing": "Systems Initializing", "Systems Initializing": "Systems Initializing",
"Table View": "Table View", "Table View": "Table View",
"TapPay": "TapPay",
"TapPay Integration": "TapPay Integration", "TapPay Integration": "TapPay Integration",
"TapPay Integration Settings Description": "TapPay Integration Settings Description", "TapPay Integration Settings Description": "TapPay Integration Settings Description",
"Target": "Target", "Target": "Target",
@ -2252,7 +2282,6 @@
"Welcome Gift Code": "Welcome Gift Code", "Welcome Gift Code": "Welcome Gift Code",
"Welcome Gift Code (8 Digits)": "Welcome Gift Code (8 Digits)", "Welcome Gift Code (8 Digits)": "Welcome Gift Code (8 Digits)",
"Welcome Gift Feature": "Welcome Gift Feature", "Welcome Gift Feature": "Welcome Gift Feature",
"Welcome Gift Function": "Welcome Gift Function",
"Welcome Gift Name": "Welcome Gift Name", "Welcome Gift Name": "Welcome Gift Name",
"Welcome Gift Status": "Welcome Gift Status", "Welcome Gift Status": "Welcome Gift Status",
"Welcome Gifts": "Welcome Gifts", "Welcome Gifts": "Welcome Gifts",
@ -2342,6 +2371,8 @@
"fanon": "Fan turned on", "fanon": "Fan turned on",
"files selected": "files selected", "files selected": "files selected",
"hours ago": "hours ago", "hours ago": "hours ago",
"iPASS": "iPASS",
"icash": "icash",
"image": "image", "image": "image",
"image_url": "image_url", "image_url": "image_url",
"info": "info", "info": "info",

View File

@ -221,6 +221,8 @@
"Barcode / Material": "バーコード / 資材", "Barcode / Material": "バーコード / 資材",
"Based on Hours": "時間ベースで計算", "Based on Hours": "時間ベースで計算",
"Basic Information": "基本情報", "Basic Information": "基本情報",
"Basic Mode": "基本版",
"Basic Mode Features": "基本版ショッピング機能",
"Basic Settings": "基本設定", "Basic Settings": "基本設定",
"Basic Specifications": "基本仕様", "Basic Specifications": "基本仕様",
"Batch": "バッチ", "Batch": "バッチ",
@ -233,7 +235,12 @@
"Bento heating": "弁当加熱中", "Bento heating": "弁当加熱中",
"Bento machine cooling water tank empty": "弁当機冷却水タンク空", "Bento machine cooling water tank empty": "弁当機冷却水タンク空",
"Bento not detected": "弁当が検出されません", "Bento not detected": "弁当が検出されません",
"Bill": "紙幣",
"Bill 100": "100元紙幣受入",
"Bill 1000": "1000元紙幣受入",
"Bill 500": "500元紙幣受入",
"Bill Acceptor": "紙幣識別機", "Bill Acceptor": "紙幣識別機",
"Bill Denominations": "紙幣受入金種",
"Bracelet drop not detected": "ブレスレット落下未検出", "Bracelet drop not detected": "ブレスレット落下未検出",
"Bracelet scan failed": "ブレスレットスキャン失敗", "Bracelet scan failed": "ブレスレットスキャン失敗",
"Branch": "分庫", "Branch": "分庫",
@ -263,6 +270,7 @@
"Cannot delete role with active users.": "ユーザーが紐付けられているロールは削除できません。", "Cannot delete role with active users.": "ユーザーが紐付けられているロールは削除できません。",
"Cannot delete warehouse with existing stock": "在庫がある倉庫は削除できません", "Cannot delete warehouse with existing stock": "在庫がある倉庫は削除できません",
"Card Machine System": "カードリーダーシステム", "Card Machine System": "カードリーダーシステム",
"Card Payment": "カード決済",
"Card Reader": "カードリーダー", "Card Reader": "カードリーダー",
"Card Reader No": "カードリーダー番号", "Card Reader No": "カードリーダー番号",
"Card Reader Reboot": "カードリーダー再起動", "Card Reader Reboot": "カードリーダー再起動",
@ -273,9 +281,10 @@
"Card Terminal": "カード端末", "Card Terminal": "カード端末",
"Card Terminal System": "カードリーダーシステム", "Card Terminal System": "カードリーダーシステム",
"Card UID": "カードUID", "Card UID": "カードUID",
"Cash Module": "コイン・紙幣モジュール", "Cash Module": "現金モジュール",
"Cash Module Feature": "現金モジュール機能", "Cash Module Feature": "現金モジュール機能",
"Cash Module Function": "現金モジュール機能", "Cash Module Function": "現金モジュール機能",
"Cash Payment": "現金決済",
"Category": "カテゴリ", "Category": "カテゴリ",
"Category Management": "カテゴリ管理", "Category Management": "カテゴリ管理",
"Category Name": "カテゴリ名", "Category Name": "カテゴリ名",
@ -312,7 +321,13 @@
"Close Panel": "パネルを閉じる", "Close Panel": "パネルを閉じる",
"Code": "コード", "Code": "コード",
"Code Copied": "コードをコピーしました", "Code Copied": "コードをコピーしました",
"Coin": "硬貨",
"Coin 1": "1元硬貨受入",
"Coin 10": "10元硬貨受入",
"Coin 5": "5元硬貨受入",
"Coin 50": "50元硬貨受入",
"Coin Acceptor": "硬貨機", "Coin Acceptor": "硬貨機",
"Coin Denominations": "硬貨受入金種",
"Coin/Banknote Machine": "硬貨・紙幣機", "Coin/Banknote Machine": "硬貨・紙幣機",
"Coin/Bill Acceptor": "硬貨・紙幣機", "Coin/Bill Acceptor": "硬貨・紙幣機",
"Command Center": "コマンドセンター", "Command Center": "コマンドセンター",
@ -418,6 +433,7 @@
"Creator": "作成者", "Creator": "作成者",
"Credit Card": "クレジットカード", "Credit Card": "クレジットカード",
"Credit Card / Contactless": "クレジットカード/非接触決済対応", "Credit Card / Contactless": "クレジットカード/非接触決済対応",
"Credit Card Payment": "クレジットカード決済",
"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": "複数会社間 / 本部グローバル統計",
@ -581,7 +597,7 @@
"During OTA deployment, the device will install directly in the background without user confirmation.": "OTAデプロイ時、デバイスはユーザーの確認なしでバックグラウンドで直接インストールされます。", "During OTA deployment, the device will install directly in the background without user confirmation.": "OTAデプロイ時、デバイスはユーザーの確認なしでバックグラウンドで直接インストールされます。",
"E-Ticket (EasyCard/iPass)": "電子チケット (EasyCard/iPass)", "E-Ticket (EasyCard/iPass)": "電子チケット (EasyCard/iPass)",
"E.SUN Bank Scan": "玉山銀行スキャン", "E.SUN Bank Scan": "玉山銀行スキャン",
"E.SUN Pay": "玉山 Pay", "E.SUN Pay": "玉山ペイ",
"E.SUN QR Pay": "玉山銀行QR決済", "E.SUN QR Pay": "玉山銀行QR決済",
"E.SUN QR Scan": "玉山銀行ラベル決済", "E.SUN QR Scan": "玉山銀行ラベル決済",
"E.SUN QR Scan Settings Description": "玉山銀行スキャン決済設定", "E.SUN QR Scan Settings Description": "玉山銀行スキャン決済設定",
@ -591,6 +607,8 @@
"ESUN": "玉山銀行", "ESUN": "玉山銀行",
"ESUN Scan Pay": "玉山スキャン決済", "ESUN Scan Pay": "玉山スキャン決済",
"Easy Wallet": "悠遊付 (Easy Wallet)", "Easy Wallet": "悠遊付 (Easy Wallet)",
"EasyCard": "悠遊カード",
"EasyWallet": "悠遊付",
"Edit": "編集", "Edit": "編集",
"Edit Account": "アカウント編集", "Edit Account": "アカウント編集",
"Edit Advertisement": "広告編集", "Edit Advertisement": "広告編集",
@ -604,6 +622,7 @@
"Edit Machine Model": "機器モデル編集", "Edit Machine Model": "機器モデル編集",
"Edit Machine Name": "機器名編集", "Edit Machine Name": "機器名編集",
"Edit Machine Settings": "機器設定編集", "Edit Machine Settings": "機器設定編集",
"Edit Machine System Settings": "機器システム設定編集",
"Edit Name": "名前編集", "Edit Name": "名前編集",
"Edit Pass Code": "パスコード編集", "Edit Pass Code": "パスコード編集",
"Edit Payment Config": "決済設定編集", "Edit Payment Config": "決済設定編集",
@ -893,7 +912,7 @@
"Imported with errors. Please check the console.": "Imported with errors. Please check the console.", "Imported with errors. Please check the console.": "Imported with errors. Please check the console.",
"In Stock": "現在庫", "In Stock": "現在庫",
"Inactive": "停止中", "Inactive": "停止中",
"Includes Credit Card/Mobile Pay": "クレジット/QR決済を含む", "Includes Credit Card/Mobile Pay": "クレジット/モバイル決済",
"Indefinite": "無期限", "Indefinite": "無期限",
"Info": "情報", "Info": "情報",
"Inherit": "継承", "Inherit": "継承",
@ -924,6 +943,7 @@
"Item List": "商品リスト", "Item List": "商品リスト",
"Items": "件", "Items": "件",
"JKO Pay": "街口支付 (JKO Pay)", "JKO Pay": "街口支付 (JKO Pay)",
"JKOPAY": "JKOPAY",
"JKO_MERCHANT_ID": "街口支付 (JKO Pay) 加盟店ID", "JKO_MERCHANT_ID": "街口支付 (JKO Pay) 加盟店ID",
"Japanese": "日本語", "Japanese": "日本語",
"Joined": "加入日", "Joined": "加入日",
@ -960,6 +980,7 @@
"Line Members": "LINEメンバー", "Line Members": "LINEメンバー",
"Line Official Account": "LINE公式アカウント", "Line Official Account": "LINE公式アカウント",
"Line Orders": "LINE注文", "Line Orders": "LINE注文",
"Line Pay": "LINE Pay",
"Line Permissions": "LINE権限", "Line Permissions": "LINE権限",
"Line Products": "LINE商品", "Line Products": "LINE商品",
"LinePay": "LinePay", "LinePay": "LinePay",
@ -1174,6 +1195,7 @@
"Microwave push rod retract error (0223)": "電子レンジプッシュロッド引き込みエラー (0223)", "Microwave push rod retract error (0223)": "電子レンジプッシュロッド引き込みエラー (0223)",
"Milk dispense timeout": "牛乳抽出タイムアウト", "Milk dispense timeout": "牛乳抽出タイムアウト",
"Min 8 characters": "最低 8文字", "Min 8 characters": "最低 8文字",
"Mobile Payment": "モバイル決済",
"Model": "機器モデル", "Model": "機器モデル",
"Model Default": "モデルデフォルト", "Model Default": "モデルデフォルト",
"Model Name": "モデル名", "Model Name": "モデル名",
@ -1430,6 +1452,7 @@
"Pass code deleted.": "パスコードが削除されました。", "Pass code deleted.": "パスコードが削除されました。",
"Pass code disabled.": "パスコードが無効化されました。", "Pass code disabled.": "パスコードが無効化されました。",
"Pass code updated.": "パスコードが更新されました。", "Pass code updated.": "パスコードが更新されました。",
"Passcode": "通行コード",
"Password": "パスワード", "Password": "パスワード",
"Password updated successfully.": "パスワードが正常に更新されました。", "Password updated successfully.": "パスワードが正常に更新されました。",
"Payment & Invoice": "決済・領収書", "Payment & Invoice": "決済・領収書",
@ -1459,13 +1482,16 @@
"Phone": "電話番号", "Phone": "電話番号",
"Photo Slot": "写真スロット", "Photo Slot": "写真スロット",
"Pi Pay": "Pi 拍錢包 (Pi Pay)", "Pi Pay": "Pi 拍錢包 (Pi Pay)",
"Pi Wallet": "Pi Wallet",
"Picked up": "受取済み", "Picked up": "受取済み",
"Picked up Time": "受取時間", "Picked up Time": "受取時間",
"Pickup Code": "受取コード", "Pickup Code": "受取コード",
"Pickup Code (8 Digits)": "受取コード (8桁)", "Pickup Code (8 Digits)": "受取コード (8桁)",
"Pickup Codes": "受取コード", "Pickup Codes": "受取コード",
"Pickup Module": "受取モジュール",
"Pickup Recipient (Prescription Slip)": "受取者(処方箋)", "Pickup Recipient (Prescription Slip)": "受取者(処方箋)",
"Pickup Recipient Info": "受取者情報", "Pickup Recipient Info": "受取者情報",
"Pickup Sheet (Material No.)": "ピッキングシート(材料番号)",
"Pickup Ticket": "商品受取チケット", "Pickup Ticket": "商品受取チケット",
"Pickup Voucher": "受取票", "Pickup Voucher": "受取票",
"Pickup code cancelled.": "受取コードがキャンセルされました。", "Pickup code cancelled.": "受取コードがキャンセルされました。",
@ -1502,7 +1528,7 @@
"Please select an APK file to upload": "Please select an APK file to upload", "Please select an APK file to upload": "Please select an APK file to upload",
"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": "全盈+PAY (PlusPay)", "PlusPay": "PlusPay",
"Point Rules": "ポイントルール", "Point Rules": "ポイントルール",
"Point Settings": "ポイント設定", "Point Settings": "ポイント設定",
"Points": "ポイント", "Points": "ポイント",
@ -1718,6 +1744,7 @@
"Saving...": "保存中...", "Saving...": "保存中...",
"Scale level and access control": "スケールレベルとアクセス制御", "Scale level and access control": "スケールレベルとアクセス制御",
"Scan Pay": "スキャン決済", "Scan Pay": "スキャン決済",
"Scan Payment": "QRコード決済",
"Scan QR Code": "QRコードをスキャン", "Scan QR Code": "QRコードをスキャン",
"Scan this code at the machine or share the link with the customer.": "機器でこのコードをスキャンするか、リンクを顧客と共有してください。", "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 at the machine to authorize testing or maintenance.": "機器でこのコードをスキャンして、テストまたはメンテナンスを承認します。",
@ -1753,6 +1780,7 @@
"Search customers...": "顧客を検索...", "Search customers...": "顧客を検索...",
"Search logs...": "ログを検索...", "Search logs...": "ログを検索...",
"Search machine name or SN...": "機器名またはシリアル番号で検索...", "Search machine name or SN...": "機器名またはシリアル番号で検索...",
"Search machine name or code...": "機器名またはコードを検索...",
"Search machine name, S/N, or location...": "Search machine name, S/N, or location...", "Search machine name, S/N, or location...": "Search machine name, S/N, or location...",
"Search machine name, serial no...": "マシン名、シリアル番号で検索...", "Search machine name, serial no...": "マシン名、シリアル番号で検索...",
"Search machines by name or serial...": "機器名またはシリアルで検索...", "Search machines by name or serial...": "機器名またはシリアルで検索...",
@ -1774,6 +1802,7 @@
"Security & State": "セキュリティ・状態", "Security & State": "セキュリティ・状態",
"Security Controls": "セキュリティ制御", "Security Controls": "セキュリティ制御",
"Select All": "すべて選択", "Select All": "すべて選択",
"Select All / Deselect All": "すべて選択 / すべて解除",
"Select Cargo Lane": "スロットを選択", "Select Cargo Lane": "スロットを選択",
"Select Category": "カテゴリを選択", "Select Category": "カテゴリを選択",
"Select Company": "会社を選択", "Select Company": "会社を選択",
@ -1825,7 +1854,7 @@
"Setup Brand": "デザイン設定", "Setup Brand": "デザイン設定",
"Shopping Cart": "ショッピングカート", "Shopping Cart": "ショッピングカート",
"Shopping Cart Feature": "ショッピングカート機能", "Shopping Cart Feature": "ショッピングカート機能",
"Shopping Cart Function": "ショッピングカート機能", "Shopping Mode": "ショッピングモード",
"Show": "表示", "Show": "表示",
"Show material code field in products": "商品に資材コードフィールドを表示する", "Show material code field in products": "商品に資材コードフィールドを表示する",
"Show points rules in products": "商品にポイントルールフィールドを表示する", "Show points rules in products": "商品にポイントルールフィールドを表示する",
@ -1876,7 +1905,7 @@
"Spring Channel Limit": "スプリングスロット上限", "Spring Channel Limit": "スプリングスロット上限",
"Spring Limit": "スプリング上限", "Spring Limit": "スプリング上限",
"Staff": "スタッフ", "Staff": "スタッフ",
"Staff Card": "スタッフカード", "Staff Card": "社員カード",
"Staff Card Info": "スタッフカード情報", "Staff Card Info": "スタッフカード情報",
"Staff Identification Management": "スタッフ識別管理", "Staff Identification Management": "スタッフ識別管理",
"Staff List": "スタッフ一覧", "Staff List": "スタッフ一覧",
@ -1984,6 +2013,7 @@
"System super admin accounts cannot be modified via this interface.": "システム特権管理者アカウントはこのインターフェースから変更できません。", "System super admin accounts cannot be modified via this interface.": "システム特権管理者アカウントはこのインターフェースから変更できません。",
"Systems Initializing": "システム初期化中", "Systems Initializing": "システム初期化中",
"Table View": "リストビュー", "Table View": "リストビュー",
"TapPay": "TapPay",
"TapPay Integration": "TapPay 連携", "TapPay Integration": "TapPay 連携",
"TapPay Integration Settings Description": "TapPay 決済連携設定", "TapPay Integration Settings Description": "TapPay 決済連携設定",
"Target": "対象", "Target": "対象",
@ -2252,7 +2282,6 @@
"Welcome Gift Code": "来店プレゼントコード", "Welcome Gift Code": "来店プレゼントコード",
"Welcome Gift Code (8 Digits)": "ウェルカムギフトコード (8桁)", "Welcome Gift Code (8 Digits)": "ウェルカムギフトコード (8桁)",
"Welcome Gift Feature": "ウェルカムギフト機能", "Welcome Gift Feature": "ウェルカムギフト機能",
"Welcome Gift Function": "ウェルカムギフト機能",
"Welcome Gift Name": "ウェルカムギフト名", "Welcome Gift Name": "ウェルカムギフト名",
"Welcome Gift Status": "来店ギフトステータス", "Welcome Gift Status": "来店ギフトステータス",
"Welcome Gifts": "ウェルカムギフト", "Welcome Gifts": "ウェルカムギフト",
@ -2342,6 +2371,8 @@
"fanon": "ファン起動", "fanon": "ファン起動",
"files selected": "個のファイルを選択しました", "files selected": "個のファイルを選択しました",
"hours ago": "時間前", "hours ago": "時間前",
"iPASS": "iPASSカード",
"icash": "icashカード",
"image": "画像", "image": "画像",
"image_url": "image_url", "image_url": "image_url",
"info": "一般", "info": "一般",

View File

@ -221,6 +221,8 @@
"Barcode / Material": "條碼 / 物料編碼", "Barcode / Material": "條碼 / 物料編碼",
"Based on Hours": "依據時數計算", "Based on Hours": "依據時數計算",
"Basic Information": "基本資訊", "Basic Information": "基本資訊",
"Basic Mode": "基礎版",
"Basic Mode Features": "基礎版購物功能",
"Basic Settings": "基本設定", "Basic Settings": "基本設定",
"Basic Specifications": "基本規格", "Basic Specifications": "基本規格",
"Batch": "批號", "Batch": "批號",
@ -233,7 +235,12 @@
"Bento heating": "盒飯正在加熱", "Bento heating": "盒飯正在加熱",
"Bento machine cooling water tank empty": "盒飯機冷卻水箱缺水", "Bento machine cooling water tank empty": "盒飯機冷卻水箱缺水",
"Bento not detected": "沒檢測到盒飯", "Bento not detected": "沒檢測到盒飯",
"Bill": "鈔",
"Bill 100": "收鈔面額100",
"Bill 1000": "收鈔面額1000",
"Bill 500": "收鈔面額500",
"Bill Acceptor": "紙鈔機", "Bill Acceptor": "紙鈔機",
"Bill Denominations": "收鈔面額",
"Bracelet drop not detected": "沒檢測到手環掉入取貨斗", "Bracelet drop not detected": "沒檢測到手環掉入取貨斗",
"Bracelet scan failed": "沒掃碼到手環", "Bracelet scan failed": "沒掃碼到手環",
"Branch": "分倉", "Branch": "分倉",
@ -263,6 +270,7 @@
"Cannot delete role with active users.": "無法刪除已有綁定帳號的角色。", "Cannot delete role with active users.": "無法刪除已有綁定帳號的角色。",
"Cannot delete warehouse with existing stock": "無法刪除仍有庫存的倉庫", "Cannot delete warehouse with existing stock": "無法刪除仍有庫存的倉庫",
"Card Machine System": "刷卡機系統", "Card Machine System": "刷卡機系統",
"Card Payment": "卡片支付",
"Card Reader": "刷卡機", "Card Reader": "刷卡機",
"Card Reader No": "刷卡機編號", "Card Reader No": "刷卡機編號",
"Card Reader Reboot": "刷卡機重啟", "Card Reader Reboot": "刷卡機重啟",
@ -273,9 +281,10 @@
"Card Terminal": "刷卡機端", "Card Terminal": "刷卡機端",
"Card Terminal System": "刷卡機系統", "Card Terminal System": "刷卡機系統",
"Card UID": "卡片 UID", "Card UID": "卡片 UID",
"Cash Module": "硬幣機 / 紙鈔機模組", "Cash Module": "現金模組",
"Cash Module Feature": "現金模組功能", "Cash Module Feature": "現金模組功能",
"Cash Module Function": "現金模組功能", "Cash Module Function": "現金模組功能",
"Cash Payment": "現金支付",
"Category": "類別", "Category": "類別",
"Category Management": "分類管理", "Category Management": "分類管理",
"Category Name": "分類名稱", "Category Name": "分類名稱",
@ -312,7 +321,13 @@
"Close Panel": "關閉面板", "Close Panel": "關閉面板",
"Code": "代碼", "Code": "代碼",
"Code Copied": "代碼已複製", "Code Copied": "代碼已複製",
"Coin": "幣",
"Coin 1": "收幣面額1",
"Coin 10": "收幣面額10",
"Coin 5": "收幣面額5",
"Coin 50": "收幣面額50",
"Coin Acceptor": "硬幣機", "Coin Acceptor": "硬幣機",
"Coin Denominations": "收幣面額",
"Coin/Banknote Machine": "硬幣機/紙鈔機", "Coin/Banknote Machine": "硬幣機/紙鈔機",
"Coin/Bill Acceptor": "硬幣機/紙鈔機", "Coin/Bill Acceptor": "硬幣機/紙鈔機",
"Command Center": "指令中心", "Command Center": "指令中心",
@ -418,6 +433,7 @@
"Creator": "建立者", "Creator": "建立者",
"Credit Card": "信用卡", "Credit Card": "信用卡",
"Credit Card / Contactless": "支援信用卡 / 感應支付", "Credit Card / Contactless": "支援信用卡 / 感應支付",
"Credit Card Payment": "信用卡支付",
"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": "跨公司 / 總部全域統計",
@ -581,7 +597,7 @@
"During OTA deployment, the device will install directly in the background without user confirmation.": "未來執行 OTA 部署時,機台將跳過詢問並直接自動安裝(靜默安裝)。", "During OTA deployment, the device will install directly in the background without user confirmation.": "未來執行 OTA 部署時,機台將跳過詢問並直接自動安裝(靜默安裝)。",
"E-Ticket (EasyCard/iPass)": "電子票證 (悠遊卡/一卡通)", "E-Ticket (EasyCard/iPass)": "電子票證 (悠遊卡/一卡通)",
"E.SUN Bank Scan": "玉山銀行掃碼", "E.SUN Bank Scan": "玉山銀行掃碼",
"E.SUN Pay": "玉山 Pay", "E.SUN Pay": "玉山支付",
"E.SUN QR Pay": "玉山銀行掃碼", "E.SUN QR Pay": "玉山銀行掃碼",
"E.SUN QR Scan": "玉山銀行標籤支付", "E.SUN QR Scan": "玉山銀行標籤支付",
"E.SUN QR Scan Settings Description": "玉山銀行掃碼支付設定", "E.SUN QR Scan Settings Description": "玉山銀行掃碼支付設定",
@ -591,6 +607,8 @@
"ESUN": "玉山銀行", "ESUN": "玉山銀行",
"ESUN Scan Pay": "玉山掃碼支付", "ESUN Scan Pay": "玉山掃碼支付",
"Easy Wallet": "悠遊付", "Easy Wallet": "悠遊付",
"EasyCard": "悠遊卡",
"EasyWallet": "悠遊付",
"Edit": "編輯", "Edit": "編輯",
"Edit Account": "編輯帳號", "Edit Account": "編輯帳號",
"Edit Advertisement": "編輯廣告", "Edit Advertisement": "編輯廣告",
@ -604,6 +622,7 @@
"Edit Machine Model": "編輯機台型號", "Edit Machine Model": "編輯機台型號",
"Edit Machine Name": "編輯機台名稱", "Edit Machine Name": "編輯機台名稱",
"Edit Machine Settings": "編輯機台設定", "Edit Machine Settings": "編輯機台設定",
"Edit Machine System Settings": "編輯機台系統設定",
"Edit Name": "編輯名稱", "Edit Name": "編輯名稱",
"Edit Pass Code": "編輯通行碼", "Edit Pass Code": "編輯通行碼",
"Edit Payment Config": "編輯金流配置", "Edit Payment Config": "編輯金流配置",
@ -893,7 +912,7 @@
"Imported with errors. Please check the console.": "部分資料匯入失敗,請查看瀏覽器主控台。", "Imported with errors. Please check the console.": "部分資料匯入失敗,請查看瀏覽器主控台。",
"In Stock": "當前庫存", "In Stock": "當前庫存",
"Inactive": "已停用", "Inactive": "已停用",
"Includes Credit Card/Mobile Pay": "含信用卡/行動支付", "Includes Credit Card/Mobile Pay": "刷卡機支付",
"Indefinite": "無限期", "Indefinite": "無限期",
"Info": "一般", "Info": "一般",
"Inherit": "繼承", "Inherit": "繼承",
@ -924,6 +943,7 @@
"Item List": "商品清單", "Item List": "商品清單",
"Items": "筆", "Items": "筆",
"JKO Pay": "街口支付", "JKO Pay": "街口支付",
"JKOPAY": "接口支付",
"JKO_MERCHANT_ID": "街口支付 商店代號", "JKO_MERCHANT_ID": "街口支付 商店代號",
"Japanese": "日文", "Japanese": "日文",
"Joined": "加入日期", "Joined": "加入日期",
@ -960,6 +980,7 @@
"Line Members": "Line會員", "Line Members": "Line會員",
"Line Official Account": "Line生活圈", "Line Official Account": "Line生活圈",
"Line Orders": "Line訂單", "Line Orders": "Line訂單",
"Line Pay": "Line pay",
"Line Permissions": "Line 管理權限", "Line Permissions": "Line 管理權限",
"Line Products": "Line商品", "Line Products": "Line商品",
"LinePay": "LinePay", "LinePay": "LinePay",
@ -1174,6 +1195,7 @@
"Microwave push rod retract error (0223)": "微波爐內推桿收回錯誤", "Microwave push rod retract error (0223)": "微波爐內推桿收回錯誤",
"Milk dispense timeout": "按鍵出奶超時", "Milk dispense timeout": "按鍵出奶超時",
"Min 8 characters": "至少 8 個字元", "Min 8 characters": "至少 8 個字元",
"Mobile Payment": "手機支付",
"Model": "機台型號", "Model": "機台型號",
"Model Default": "型號預設", "Model Default": "型號預設",
"Model Name": "型號名稱", "Model Name": "型號名稱",
@ -1430,6 +1452,7 @@
"Pass code deleted.": "通行碼已刪除", "Pass code deleted.": "通行碼已刪除",
"Pass code disabled.": "通行碼已取消。", "Pass code disabled.": "通行碼已取消。",
"Pass code updated.": "通行碼已更新", "Pass code updated.": "通行碼已更新",
"Passcode": "通行碼",
"Password": "密碼", "Password": "密碼",
"Password updated successfully.": "密碼已成功變更。", "Password updated successfully.": "密碼已成功變更。",
"Payment & Invoice": "金流與發票", "Payment & Invoice": "金流與發票",
@ -1459,13 +1482,16 @@
"Phone": "手機號碼", "Phone": "手機號碼",
"Photo Slot": "照片欄位", "Photo Slot": "照片欄位",
"Pi Pay": "Pi 拍錢包", "Pi Pay": "Pi 拍錢包",
"Pi Wallet": "PI 拍錢包",
"Picked up": "領取", "Picked up": "領取",
"Picked up Time": "領取時間", "Picked up Time": "領取時間",
"Pickup Code": "取貨碼", "Pickup Code": "取貨碼",
"Pickup Code (8 Digits)": "取貨碼 (8 位數)", "Pickup Code (8 Digits)": "取貨碼 (8 位數)",
"Pickup Codes": "取貨碼", "Pickup Codes": "取貨碼",
"Pickup Module": "取貨模組",
"Pickup Recipient (Prescription Slip)": "取物人(領藥單)", "Pickup Recipient (Prescription Slip)": "取物人(領藥單)",
"Pickup Recipient Info": "取物人資訊", "Pickup Recipient Info": "取物人資訊",
"Pickup Sheet (Material No.)": "取物單(物料編號)",
"Pickup Ticket": "商品領取券", "Pickup Ticket": "商品領取券",
"Pickup Voucher": "取物單", "Pickup Voucher": "取物單",
"Pickup code cancelled.": "取貨碼已取消", "Pickup code cancelled.": "取貨碼已取消",
@ -1502,7 +1528,7 @@
"Please select an APK file to upload": "請選擇要上傳的 APK 檔案", "Please select an APK file to upload": "請選擇要上傳的 APK 檔案",
"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": "全盈+PAY", "PlusPay": "全盈+Pay",
"Point Rules": "點數規則", "Point Rules": "點數規則",
"Point Settings": "點數設定", "Point Settings": "點數設定",
"Points": "點數功能", "Points": "點數功能",
@ -1718,6 +1744,7 @@
"Saving...": "儲存中...", "Saving...": "儲存中...",
"Scale level and access control": "層級與存取控制", "Scale level and access control": "層級與存取控制",
"Scan Pay": "掃碼支付功能", "Scan Pay": "掃碼支付功能",
"Scan Payment": "掃碼支付",
"Scan QR Code": "掃描 QR Code", "Scan QR Code": "掃描 QR Code",
"Scan this code at the machine or share the link with the customer.": "請在機台掃描此碼,或將連結分享給客戶。", "Scan this code at the machine or share the link with the customer.": "請在機台掃描此碼,或將連結分享給客戶。",
"Scan this code at the machine to authorize testing or maintenance.": "請在機台上掃描此 QR Code 以進行測試或維護授權。", "Scan this code at the machine to authorize testing or maintenance.": "請在機台上掃描此 QR Code 以進行測試或維護授權。",
@ -1753,6 +1780,7 @@
"Search customers...": "搜尋客戶...", "Search customers...": "搜尋客戶...",
"Search logs...": "搜尋紀錄...", "Search logs...": "搜尋紀錄...",
"Search machine name or SN...": "搜尋機台名稱或序號...", "Search machine name or SN...": "搜尋機台名稱或序號...",
"Search machine name or code...": "搜尋機台名稱或代號...",
"Search machine name, S/N, or location...": "搜尋機台名稱、序號 (S/N) 或位置...", "Search machine name, S/N, or location...": "搜尋機台名稱、序號 (S/N) 或位置...",
"Search machine name, serial no...": "搜尋機台名稱、編號...", "Search machine name, serial no...": "搜尋機台名稱、編號...",
"Search machines by name or serial...": "搜尋機台名稱或序號...", "Search machines by name or serial...": "搜尋機台名稱或序號...",
@ -1774,6 +1802,7 @@
"Security & State": "安全性與狀態", "Security & State": "安全性與狀態",
"Security Controls": "安全控制", "Security Controls": "安全控制",
"Select All": "全選", "Select All": "全選",
"Select All / Deselect All": "全選/取消全選",
"Select Cargo Lane": "選擇貨道", "Select Cargo Lane": "選擇貨道",
"Select Category": "選擇類別", "Select Category": "選擇類別",
"Select Company": "選擇公司", "Select Company": "選擇公司",
@ -1825,7 +1854,7 @@
"Setup Brand": "設定樣式", "Setup Brand": "設定樣式",
"Shopping Cart": "購物車", "Shopping Cart": "購物車",
"Shopping Cart Feature": "購物車功能", "Shopping Cart Feature": "購物車功能",
"Shopping Cart Function": "購物車功能", "Shopping Mode": "購物方式",
"Show": "顯示", "Show": "顯示",
"Show material code field in products": "在商品資料中顯示物料編號欄位", "Show material code field in products": "在商品資料中顯示物料編號欄位",
"Show points rules in products": "在商品資料中顯示點數規則相關欄位", "Show points rules in products": "在商品資料中顯示點數規則相關欄位",
@ -1984,6 +2013,7 @@
"System super admin accounts cannot be modified via this interface.": "系統超級管理員帳號無法透過此介面修改。", "System super admin accounts cannot be modified via this interface.": "系統超級管理員帳號無法透過此介面修改。",
"Systems Initializing": "系統初始化中", "Systems Initializing": "系統初始化中",
"Table View": "列表視圖", "Table View": "列表視圖",
"TapPay": "TapPay",
"TapPay Integration": "TapPay 支付串接", "TapPay Integration": "TapPay 支付串接",
"TapPay Integration Settings Description": "喬睿科技支付串接設定", "TapPay Integration Settings Description": "喬睿科技支付串接設定",
"Target": "目標", "Target": "目標",
@ -2252,7 +2282,6 @@
"Welcome Gift Code": "來店禮代碼", "Welcome Gift Code": "來店禮代碼",
"Welcome Gift Code (8 Digits)": "來店禮代碼 (8位數)", "Welcome Gift Code (8 Digits)": "來店禮代碼 (8位數)",
"Welcome Gift Feature": "迎賓禮功能", "Welcome Gift Feature": "迎賓禮功能",
"Welcome Gift Function": "迎賓禮功能",
"Welcome Gift Name": "來店禮名稱", "Welcome Gift Name": "來店禮名稱",
"Welcome Gift Status": "來店禮", "Welcome Gift Status": "來店禮",
"Welcome Gifts": "來店禮", "Welcome Gifts": "來店禮",
@ -2342,6 +2371,8 @@
"fanon": "風扇開", "fanon": "風扇開",
"files selected": "個檔案已選擇", "files selected": "個檔案已選擇",
"hours ago": "小時前", "hours ago": "小時前",
"iPASS": "一卡通",
"icash": "icash",
"image": "圖片", "image": "圖片",
"image_url": "商品圖片", "image_url": "商品圖片",
"info": "一般", "info": "一般",

View File

@ -99,19 +99,99 @@
machineSettings: {}, machineSettings: {},
openMachineSettingsModal(machine) { openMachineSettingsModal(machine) {
this.currentMachine = machine; this.currentMachine = machine;
const settings = machine.settings || {};
this.machineSettings = { this.machineSettings = {
shopping_mode: settings.shopping_mode || 'basic',
tax_invoice_enabled: machine.tax_invoice_enabled === true || machine.tax_invoice_enabled === 1 || machine.tax_invoice_enabled === '1', tax_invoice_enabled: machine.tax_invoice_enabled === true || machine.tax_invoice_enabled === 1 || machine.tax_invoice_enabled === '1',
// 刷卡機支付
card_terminal_enabled: machine.card_terminal_enabled === true || machine.card_terminal_enabled === 1 || machine.card_terminal_enabled === '1', card_terminal_enabled: machine.card_terminal_enabled === true || machine.card_terminal_enabled === 1 || machine.card_terminal_enabled === '1',
credit_card_enabled: settings.credit_card_enabled === true || settings.credit_card_enabled === 1 || settings.credit_card_enabled === '1',
mobile_pay_enabled: settings.mobile_pay_enabled === true || settings.mobile_pay_enabled === 1 || settings.mobile_pay_enabled === '1',
card_pay_enabled: settings.card_pay_enabled === true || settings.card_pay_enabled === 1 || settings.card_pay_enabled === '1',
card_pay_easycard: settings.card_pay_easycard === true || settings.card_pay_easycard === 1 || settings.card_pay_easycard === '1',
card_pay_ipass: settings.card_pay_ipass === true || settings.card_pay_ipass === 1 || settings.card_pay_ipass === '1',
card_pay_icash: settings.card_pay_icash === true || settings.card_pay_icash === 1 || settings.card_pay_icash === '1',
// 掃碼支付
scan_pay_enabled: settings.scan_pay_enabled === true || settings.scan_pay_enabled === 1 || settings.scan_pay_enabled === '1',
scan_pay_esun_enabled: machine.scan_pay_esun_enabled === true || machine.scan_pay_esun_enabled === 1 || machine.scan_pay_esun_enabled === '1', scan_pay_esun_enabled: machine.scan_pay_esun_enabled === true || machine.scan_pay_esun_enabled === 1 || machine.scan_pay_esun_enabled === '1',
scan_pay_linepay_enabled: machine.scan_pay_linepay_enabled === true || machine.scan_pay_linepay_enabled === 1 || machine.scan_pay_linepay_enabled === '1', scan_pay_tappay_enabled: settings.scan_pay_tappay_enabled === true || settings.scan_pay_tappay_enabled === 1 || settings.scan_pay_tappay_enabled === '1',
tappay_linepay: settings.tappay_linepay === true || settings.tappay_linepay === 1 || settings.tappay_linepay === '1',
tappay_jkopay: settings.tappay_jkopay === true || settings.tappay_jkopay === 1 || settings.tappay_jkopay === '1',
tappay_pipay: settings.tappay_pipay === true || settings.tappay_pipay === 1 || settings.tappay_pipay === '1',
tappay_pluspay: settings.tappay_pluspay === true || settings.tappay_pluspay === 1 || settings.tappay_pluspay === '1',
tappay_easywallet: settings.tappay_easywallet === true || settings.tappay_easywallet === 1 || settings.tappay_easywallet === '1',
// 現金支付 (預設皆可收,若 JSON 中特別記錄 false 才是 false)
cash_module_enabled: machine.cash_module_enabled === true || machine.cash_module_enabled === 1 || machine.cash_module_enabled === '1',
cash_bill_1000: settings.cash_bill_1000 !== false && settings.cash_bill_1000 !== 0 && settings.cash_bill_1000 !== '0',
cash_bill_500: settings.cash_bill_500 !== false && settings.cash_bill_500 !== 0 && settings.cash_bill_500 !== '0',
cash_bill_100: settings.cash_bill_100 !== false && settings.cash_bill_100 !== 0 && settings.cash_bill_100 !== '0',
cash_coin_50: settings.cash_coin_50 !== false && settings.cash_coin_50 !== 0 && settings.cash_coin_50 !== '0',
cash_coin_10: settings.cash_coin_10 !== false && settings.cash_coin_10 !== 0 && settings.cash_coin_10 !== '0',
cash_coin_5: settings.cash_coin_5 !== false && settings.cash_coin_5 !== 0 && settings.cash_coin_5 !== '0',
cash_coin_1: settings.cash_coin_1 !== false && settings.cash_coin_1 !== 0 && settings.cash_coin_1 !== '0',
// 取貨模組
pickup_module_enabled: settings.pickup_module_enabled !== undefined
? (settings.pickup_module_enabled === true || settings.pickup_module_enabled === 1 || settings.pickup_module_enabled === '1')
: ((settings.pickup_code_enabled === true || settings.pickup_code_enabled === 1 || settings.pickup_code_enabled === '1') || (settings.pass_code_enabled === true || settings.pass_code_enabled === 1 || settings.pass_code_enabled === '1')),
pickup_code_enabled: settings.pickup_code_enabled === true || settings.pickup_code_enabled === 1 || settings.pickup_code_enabled === '1',
pass_code_enabled: settings.pass_code_enabled === true || settings.pass_code_enabled === 1 || settings.pass_code_enabled === '1',
// 零售附加功能
shopping_cart_enabled: machine.shopping_cart_enabled === true || machine.shopping_cart_enabled === 1 || machine.shopping_cart_enabled === '1', shopping_cart_enabled: machine.shopping_cart_enabled === true || machine.shopping_cart_enabled === 1 || machine.shopping_cart_enabled === '1',
welcome_gift_enabled: machine.welcome_gift_enabled === true || machine.welcome_gift_enabled === 1 || machine.welcome_gift_enabled === '1', welcome_gift_enabled: machine.welcome_gift_enabled === true || machine.welcome_gift_enabled === 1 || machine.welcome_gift_enabled === '1',
cash_module_enabled: machine.cash_module_enabled === true || machine.cash_module_enabled === 1 || machine.cash_module_enabled === '1',
member_system_enabled: machine.member_system_enabled === true || machine.member_system_enabled === 1 || machine.member_system_enabled === '1', member_system_enabled: machine.member_system_enabled === true || machine.member_system_enabled === 1 || machine.member_system_enabled === '1',
// 環境監控
ambient_temp_monitoring_enabled: machine.ambient_temp_monitoring_enabled === true || machine.ambient_temp_monitoring_enabled === 1 || machine.ambient_temp_monitoring_enabled === '1' ambient_temp_monitoring_enabled: machine.ambient_temp_monitoring_enabled === true || machine.ambient_temp_monitoring_enabled === 1 || machine.ambient_temp_monitoring_enabled === '1'
}; };
this.showMachineSettingsModal = true; this.showMachineSettingsModal = true;
}, },
toggleAllCardTerminal() {
const keys = ['credit_card_enabled', 'mobile_pay_enabled', 'card_pay_enabled', 'card_pay_easycard', 'card_pay_ipass', 'card_pay_icash'];
const allChecked = keys.every(k => this.machineSettings[k]);
keys.forEach(k => {
this.machineSettings[k] = !allChecked;
});
},
toggleAllScanPay() {
const keys = ['scan_pay_esun_enabled', 'scan_pay_tappay_enabled', 'tappay_linepay', 'tappay_jkopay', 'tappay_pipay', 'tappay_pluspay', 'tappay_easywallet'];
const allChecked = keys.every(k => this.machineSettings[k]);
keys.forEach(k => {
this.machineSettings[k] = !allChecked;
});
},
toggleAllCash() {
const keys = ['cash_bill_1000', 'cash_bill_500', 'cash_bill_100', 'cash_coin_50', 'cash_coin_10', 'cash_coin_5', 'cash_coin_1'];
const allChecked = keys.every(k => this.machineSettings[k]);
keys.forEach(k => {
this.machineSettings[k] = !allChecked;
});
},
toggleAllPickup() {
const keys = ['pickup_code_enabled', 'pass_code_enabled'];
const allChecked = keys.every(k => this.machineSettings[k]);
keys.forEach(k => {
this.machineSettings[k] = !allChecked;
});
},
toggleAllPayments() {
const mainKeys = ['card_terminal_enabled', 'scan_pay_enabled', 'cash_module_enabled', 'pickup_module_enabled'];
const subKeys = [
'credit_card_enabled', 'mobile_pay_enabled', 'card_pay_enabled', 'card_pay_easycard', 'card_pay_ipass', 'card_pay_icash',
'scan_pay_esun_enabled', 'scan_pay_tappay_enabled', 'tappay_linepay', 'tappay_jkopay', 'tappay_pipay', 'tappay_pluspay', 'tappay_easywallet',
'cash_bill_1000', 'cash_bill_500', 'cash_bill_100', 'cash_coin_50', 'cash_coin_10', 'cash_coin_5', 'cash_coin_1',
'pickup_code_enabled', 'pass_code_enabled'
];
const allMainChecked = mainKeys.every(k => this.machineSettings[k]);
const targetValue = !allMainChecked;
mainKeys.forEach(k => this.machineSettings[k] = targetValue);
subKeys.forEach(k => this.machineSettings[k] = targetValue);
},
openMaintenanceQr(machine) { openMaintenanceQr(machine) {
this.maintenanceQrMachineName = machine.name; this.maintenanceQrMachineName = machine.name;
const baseUrl = '{{ route('admin.maintenance.create', ['serial_no' => 'SERIAL_NO']) }}'; const baseUrl = '{{ route('admin.maintenance.create', ['serial_no' => 'SERIAL_NO']) }}';
@ -437,9 +517,313 @@
@method('PATCH') @method('PATCH')
<div class="space-y-3"> <div class="space-y-3">
<!-- 稅務系統 --> <!-- 購物方式 (單選) -->
<div <div class="grid grid-cols-1 md:grid-cols-4 gap-4 items-center p-4 rounded-xl bg-slate-50/50 dark:bg-slate-800/50 border border-slate-100 dark:border-slate-700/50 hover:bg-slate-50 dark:hover:bg-slate-800 transition-colors">
class="grid grid-cols-1 md:grid-cols-4 gap-4 items-center p-4 rounded-xl bg-slate-50/50 dark:bg-slate-800/50 border border-slate-100 dark:border-slate-700/50 hover:bg-slate-50 dark:hover:bg-slate-800 transition-colors"> <div class="md:col-span-1">
<h4 class="text-sm font-black text-slate-700 dark:text-slate-200">{{ __('Shopping Mode') }}</h4>
</div>
<div class="md:col-span-3 flex flex-wrap gap-x-6 gap-y-2">
<label class="flex items-center gap-2 cursor-pointer group">
<input type="radio" name="settings[shopping_mode]" value="basic" x-model="machineSettings.shopping_mode" class="w-4 h-4 text-cyan-500 border-slate-300 focus:ring-cyan-500 dark:bg-slate-800 dark:border-slate-700 dark:checked:bg-cyan-500 dark:checked:border-cyan-500 dark:focus:border-cyan-500">
<span class="text-sm font-bold text-slate-600 dark:text-slate-300 group-hover:text-slate-900 dark:group-hover:text-white transition-colors">{{ __('Basic Mode') }}</span>
</label>
<label class="flex items-center gap-2 cursor-pointer group">
<input type="radio" name="settings[shopping_mode]" value="employee_card" x-model="machineSettings.shopping_mode" class="w-4 h-4 text-cyan-500 border-slate-300 focus:ring-cyan-500 dark:bg-slate-800 dark:border-slate-700 dark:checked:bg-cyan-500 dark:checked:border-cyan-500 dark:focus:border-cyan-500">
<span class="text-sm font-bold text-slate-600 dark:text-slate-300 group-hover:text-slate-900 dark:group-hover:text-white transition-colors">{{ __('Staff Card') }}</span>
</label>
<label class="flex items-center gap-2 cursor-pointer group">
<input type="radio" name="settings[shopping_mode]" value="pickup_sheet" x-model="machineSettings.shopping_mode" class="w-4 h-4 text-cyan-500 border-slate-300 focus:ring-cyan-500 dark:bg-slate-800 dark:border-slate-700 dark:checked:bg-cyan-500 dark:checked:border-cyan-500 dark:focus:border-cyan-500">
<span class="text-sm font-bold text-slate-600 dark:text-slate-300 group-hover:text-slate-900 dark:group-hover:text-white transition-colors">{{ __('Pickup Sheet (Material No.)') }}</span>
</label>
</div>
</div>
<!-- 零售/金流展開部分 (僅基礎版顯示) -->
<div x-show="machineSettings.shopping_mode === 'basic'" x-transition class="space-y-3 rounded-2xl border border-slate-200 dark:border-slate-700/60 border-l-4 border-l-cyan-500 bg-slate-50/40 dark:bg-slate-800/20 p-4">
<!-- 基礎版專屬區塊標籤 -->
<div class="flex items-center">
<span class="inline-flex items-center gap-1.5 px-2.5 py-1 rounded-full bg-cyan-500/10 text-cyan-600 dark:text-cyan-400 text-[11px] font-black uppercase tracking-wider">
<svg class="w-3.5 h-3.5" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">
<path stroke-linecap="round" stroke-linejoin="round" d="M3 3h2l.4 2M7 13h10l4-8H5.4M7 13L5.4 5M7 13l-2.293 2.293c-.63.63-.184 1.707.707 1.707H17m0 0a2 2 0 100 4 2 2 0 000-4zm-8 2a2 2 0 11-4 0 2 2 0 014 0z" />
</svg>
{{ __('Basic Mode Features') }}
</span>
</div>
<!-- 一鍵全選/取消全選所有金流 -->
<div class="flex justify-between items-center px-4 py-3 rounded-xl bg-slate-50/50 dark:bg-slate-800/30 border border-slate-100 dark:border-slate-800">
<span class="text-xs font-black text-slate-400 dark:text-slate-500 uppercase tracking-widest">{{ __('Payment Type') }}</span>
<button type="button" @click="toggleAllPayments()" class="text-xs font-bold text-cyan-500 hover:text-cyan-600 transition-colors uppercase tracking-wider">
{{ __('Select All / Deselect All') }}
</button>
</div>
<!-- 刷卡機支付 -->
<div class="p-4 rounded-xl bg-slate-50/50 dark:bg-slate-800/50 border border-slate-100 dark:border-slate-700/50 hover:bg-slate-50 dark:hover:bg-slate-800 transition-colors space-y-4">
<div class="flex items-center justify-between">
<div class="flex items-center gap-3">
<h4 class="text-sm font-black text-slate-700 dark:text-slate-200">{{ __('Includes Credit Card/Mobile Pay') }}</h4>
<button type="button" x-show="machineSettings.card_terminal_enabled" x-transition @click="toggleAllCardTerminal()" class="text-[10px] font-bold text-cyan-500 hover:text-cyan-600 transition-colors uppercase tracking-wider">
{{ __('Select All / Deselect All') }}
</button>
</div>
<label class="relative inline-flex items-center cursor-pointer">
<input type="hidden" name="settings[card_terminal_enabled]" value="0">
<input type="checkbox" name="settings[card_terminal_enabled]" value="1"
x-model="machineSettings.card_terminal_enabled" class="peer sr-only">
<div class="w-9 h-5 bg-slate-200 peer-focus:outline-none rounded-full peer dark:bg-slate-700 peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-4 after:w-4 after:transition-all dark:border-gray-600 peer-checked:bg-cyan-500"></div>
</label>
</div>
<!-- 刷卡機子項目 -->
<div x-show="machineSettings.card_terminal_enabled" x-transition class="pl-4 border-l-2 border-slate-200 dark:border-slate-700 space-y-3">
<div class="flex flex-wrap gap-x-6 gap-y-2">
<label class="flex items-center gap-2 cursor-pointer">
<input type="hidden" name="settings[credit_card_enabled]" value="0">
<input type="checkbox" name="settings[credit_card_enabled]" value="1" x-model="machineSettings.credit_card_enabled" class="w-4 h-4 text-cyan-500 rounded border-slate-300 focus:ring-cyan-500 dark:bg-slate-800 dark:border-slate-700 dark:checked:bg-cyan-500 dark:checked:border-cyan-500 dark:focus:border-cyan-500">
<span class="text-xs font-bold text-slate-600 dark:text-slate-300">{{ __('Credit Card Payment') }}</span>
</label>
<label class="flex items-center gap-2 cursor-pointer">
<input type="hidden" name="settings[mobile_pay_enabled]" value="0">
<input type="checkbox" name="settings[mobile_pay_enabled]" value="1" x-model="machineSettings.mobile_pay_enabled" class="w-4 h-4 text-cyan-500 rounded border-slate-300 focus:ring-cyan-500 dark:bg-slate-800 dark:border-slate-700 dark:checked:bg-cyan-500 dark:checked:border-cyan-500 dark:focus:border-cyan-500">
<span class="text-xs font-bold text-slate-600 dark:text-slate-300">{{ __('Mobile Payment') }}</span>
</label>
<label class="flex items-center gap-2 cursor-pointer">
<input type="hidden" name="settings[card_pay_enabled]" value="0">
<input type="checkbox" name="settings[card_pay_enabled]" value="1" x-model="machineSettings.card_pay_enabled" class="w-4 h-4 text-cyan-500 rounded border-slate-300 focus:ring-cyan-500 dark:bg-slate-800 dark:border-slate-700 dark:checked:bg-cyan-500 dark:checked:border-cyan-500 dark:focus:border-cyan-500">
<span class="text-xs font-bold text-slate-600 dark:text-slate-300">{{ __('Card Payment') }}</span>
</label>
</div>
<!-- 卡片支付孫項目 (悠遊卡/一卡通/icash) -->
<div x-show="machineSettings.card_pay_enabled && machineSettings.card_terminal_enabled" x-transition class="pl-4 border-l border-dashed border-slate-200 dark:border-slate-700 flex flex-wrap gap-x-6 gap-y-2">
<label class="flex items-center gap-2 cursor-pointer">
<input type="hidden" name="settings[card_pay_easycard]" value="0">
<input type="checkbox" name="settings[card_pay_easycard]" value="1" x-model="machineSettings.card_pay_easycard" class="w-4 h-4 text-cyan-500 rounded border-slate-300 focus:ring-cyan-500 dark:bg-slate-800 dark:border-slate-700 dark:checked:bg-cyan-500 dark:checked:border-cyan-500 dark:focus:border-cyan-500">
<span class="text-xs font-bold text-slate-600 dark:text-slate-300">{{ __('EasyCard') }}</span>
</label>
<label class="flex items-center gap-2 cursor-pointer">
<input type="hidden" name="settings[card_pay_ipass]" value="0">
<input type="checkbox" name="settings[card_pay_ipass]" value="1" x-model="machineSettings.card_pay_ipass" class="w-4 h-4 text-cyan-500 rounded border-slate-300 focus:ring-cyan-500 dark:bg-slate-800 dark:border-slate-700 dark:checked:bg-cyan-500 dark:checked:border-cyan-500 dark:focus:border-cyan-500">
<span class="text-xs font-bold text-slate-600 dark:text-slate-300">{{ __('iPASS') }}</span>
</label>
<label class="flex items-center gap-2 cursor-pointer">
<input type="hidden" name="settings[card_pay_icash]" value="0">
<input type="checkbox" name="settings[card_pay_icash]" value="1" x-model="machineSettings.card_pay_icash" class="w-4 h-4 text-cyan-500 rounded border-slate-300 focus:ring-cyan-500 dark:bg-slate-800 dark:border-slate-700 dark:checked:bg-cyan-500 dark:checked:border-cyan-500 dark:focus:border-cyan-500">
<span class="text-xs font-bold text-slate-600 dark:text-slate-300">{{ __('icash') }}</span>
</label>
</div>
</div>
</div>
<!-- 掃碼支付 -->
<div class="p-4 rounded-xl bg-slate-50/50 dark:bg-slate-800/50 border border-slate-100 dark:border-slate-700/50 hover:bg-slate-50 dark:hover:bg-slate-800 transition-colors space-y-4">
<div class="flex items-center justify-between">
<div class="flex items-center gap-3">
<h4 class="text-sm font-black text-slate-700 dark:text-slate-200">{{ __('Scan Payment') }}</h4>
<button type="button" x-show="machineSettings.scan_pay_enabled" x-transition @click="toggleAllScanPay()" class="text-[10px] font-bold text-cyan-500 hover:text-cyan-600 transition-colors uppercase tracking-wider">
{{ __('Select All / Deselect All') }}
</button>
</div>
<label class="relative inline-flex items-center cursor-pointer">
<input type="hidden" name="settings[scan_pay_enabled]" value="0">
<input type="checkbox" name="settings[scan_pay_enabled]" value="1"
x-model="machineSettings.scan_pay_enabled" class="peer sr-only">
<div class="w-9 h-5 bg-slate-200 peer-focus:outline-none rounded-full peer dark:bg-slate-700 peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-4 after:w-4 after:transition-all dark:border-gray-600 peer-checked:bg-cyan-500"></div>
</label>
</div>
<!-- 掃碼子項目 -->
<div x-show="machineSettings.scan_pay_enabled" x-transition class="pl-4 border-l-2 border-slate-200 dark:border-slate-700 space-y-3">
<div class="flex flex-wrap gap-x-6 gap-y-2">
<label class="flex items-center gap-2 cursor-pointer">
<input type="hidden" name="settings[scan_pay_esun_enabled]" value="0">
<input type="checkbox" name="settings[scan_pay_esun_enabled]" value="1" x-model="machineSettings.scan_pay_esun_enabled" class="w-4 h-4 text-cyan-500 rounded border-slate-300 focus:ring-cyan-500 dark:bg-slate-800 dark:border-slate-700 dark:checked:bg-cyan-500 dark:checked:border-cyan-500 dark:focus:border-cyan-500">
<span class="text-xs font-bold text-slate-600 dark:text-slate-300">{{ __('E.SUN Pay') }}</span>
</label>
<label class="flex items-center gap-2 cursor-pointer">
<input type="hidden" name="settings[scan_pay_tappay_enabled]" value="0">
<input type="checkbox" name="settings[scan_pay_tappay_enabled]" value="1" x-model="machineSettings.scan_pay_tappay_enabled" class="w-4 h-4 text-cyan-500 rounded border-slate-300 focus:ring-cyan-500 dark:bg-slate-800 dark:border-slate-700 dark:checked:bg-cyan-500 dark:checked:border-cyan-500 dark:focus:border-cyan-500">
<span class="text-xs font-bold text-slate-600 dark:text-slate-300">{{ __('TapPay') }}</span>
</label>
</div>
<!-- TapPay 孫項目 -->
<div x-show="machineSettings.scan_pay_tappay_enabled && machineSettings.scan_pay_enabled" x-transition class="pl-4 border-l border-dashed border-slate-200 dark:border-slate-700 flex flex-wrap gap-x-6 gap-y-2">
<label class="flex items-center gap-2 cursor-pointer">
<input type="hidden" name="settings[tappay_linepay]" value="0">
<input type="checkbox" name="settings[tappay_linepay]" value="1" x-model="machineSettings.tappay_linepay" class="w-4 h-4 text-cyan-500 rounded border-slate-300 focus:ring-cyan-500 dark:bg-slate-800 dark:border-slate-700 dark:checked:bg-cyan-500 dark:checked:border-cyan-500 dark:focus:border-cyan-500">
<span class="text-xs font-bold text-slate-600 dark:text-slate-300">{{ __('Line Pay') }}</span>
</label>
<label class="flex items-center gap-2 cursor-pointer">
<input type="hidden" name="settings[tappay_jkopay]" value="0">
<input type="checkbox" name="settings[tappay_jkopay]" value="1" x-model="machineSettings.tappay_jkopay" class="w-4 h-4 text-cyan-500 rounded border-slate-300 focus:ring-cyan-500 dark:bg-slate-800 dark:border-slate-700 dark:checked:bg-cyan-500 dark:checked:border-cyan-500 dark:focus:border-cyan-500">
<span class="text-xs font-bold text-slate-600 dark:text-slate-300">{{ __('JKOPAY') }}</span>
</label>
<label class="flex items-center gap-2 cursor-pointer">
<input type="hidden" name="settings[tappay_pipay]" value="0">
<input type="checkbox" name="settings[tappay_pipay]" value="1" x-model="machineSettings.tappay_pipay" class="w-4 h-4 text-cyan-500 rounded border-slate-300 focus:ring-cyan-500 dark:bg-slate-800 dark:border-slate-700 dark:checked:bg-cyan-500 dark:checked:border-cyan-500 dark:focus:border-cyan-500">
<span class="text-xs font-bold text-slate-600 dark:text-slate-300">{{ __('Pi Wallet') }}</span>
</label>
<label class="flex items-center gap-2 cursor-pointer">
<input type="hidden" name="settings[tappay_pluspay]" value="0">
<input type="checkbox" name="settings[tappay_pluspay]" value="1" x-model="machineSettings.tappay_pluspay" class="w-4 h-4 text-cyan-500 rounded border-slate-300 focus:ring-cyan-500 dark:bg-slate-800 dark:border-slate-700 dark:checked:bg-cyan-500 dark:checked:border-cyan-500 dark:focus:border-cyan-500">
<span class="text-xs font-bold text-slate-600 dark:text-slate-300">{{ __('PlusPay') }}</span>
</label>
<label class="flex items-center gap-2 cursor-pointer">
<input type="hidden" name="settings[tappay_easywallet]" value="0">
<input type="checkbox" name="settings[tappay_easywallet]" value="1" x-model="machineSettings.tappay_easywallet" class="w-4 h-4 text-cyan-500 rounded border-slate-300 focus:ring-cyan-500 dark:bg-slate-800 dark:border-slate-700 dark:checked:bg-cyan-500 dark:checked:border-cyan-500 dark:focus:border-cyan-500">
<span class="text-xs font-bold text-slate-600 dark:text-slate-300">{{ __('EasyWallet') }}</span>
</label>
</div>
</div>
</div>
<!-- 現金支付 -->
<div class="p-4 rounded-xl bg-slate-50/50 dark:bg-slate-800/50 border border-slate-100 dark:border-slate-700/50 hover:bg-slate-50 dark:hover:bg-slate-800 transition-colors space-y-4">
<div class="flex items-center justify-between">
<div class="flex items-center gap-3">
<h4 class="text-sm font-black text-slate-700 dark:text-slate-200">{{ __('Cash Payment') }}</h4>
<button type="button" x-show="machineSettings.cash_module_enabled" x-transition @click="toggleAllCash()" class="text-[10px] font-bold text-cyan-500 hover:text-cyan-600 transition-colors uppercase tracking-wider">
{{ __('Select All / Deselect All') }}
</button>
</div>
<label class="relative inline-flex items-center cursor-pointer">
<input type="hidden" name="settings[cash_module_enabled]" value="0">
<input type="checkbox" name="settings[cash_module_enabled]" value="1"
x-model="machineSettings.cash_module_enabled" class="peer sr-only">
<div class="w-9 h-5 bg-slate-200 peer-focus:outline-none rounded-full peer dark:bg-slate-700 peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-4 after:w-4 after:transition-all dark:border-gray-600 peer-checked:bg-cyan-500"></div>
</label>
</div>
<!-- 現金面額子項目 -->
<div x-show="machineSettings.cash_module_enabled" x-transition class="pl-4 border-l-2 border-slate-200 dark:border-slate-700 space-y-3">
<div>
<span class="text-xs font-black text-slate-400 uppercase tracking-widest block mb-2">{{ __('Bill Denominations') }}</span>
<div class="flex flex-wrap gap-x-6 gap-y-2">
<label class="flex items-center gap-2 cursor-pointer">
<input type="hidden" name="settings[cash_bill_1000]" value="0">
<input type="checkbox" name="settings[cash_bill_1000]" value="1" x-model="machineSettings.cash_bill_1000" class="w-4 h-4 text-cyan-500 rounded border-slate-300 focus:ring-cyan-500 dark:bg-slate-800 dark:border-slate-700 dark:checked:bg-cyan-500 dark:checked:border-cyan-500 dark:focus:border-cyan-500">
<span class="text-xs font-bold text-slate-600 dark:text-slate-300">1000</span>
</label>
<label class="flex items-center gap-2 cursor-pointer">
<input type="hidden" name="settings[cash_bill_500]" value="0">
<input type="checkbox" name="settings[cash_bill_500]" value="1" x-model="machineSettings.cash_bill_500" class="w-4 h-4 text-cyan-500 rounded border-slate-300 focus:ring-cyan-500 dark:bg-slate-800 dark:border-slate-700 dark:checked:bg-cyan-500 dark:checked:border-cyan-500 dark:focus:border-cyan-500">
<span class="text-xs font-bold text-slate-600 dark:text-slate-300">500</span>
</label>
<label class="flex items-center gap-2 cursor-pointer">
<input type="hidden" name="settings[cash_bill_100]" value="0">
<input type="checkbox" name="settings[cash_bill_100]" value="1" x-model="machineSettings.cash_bill_100" class="w-4 h-4 text-cyan-500 rounded border-slate-300 focus:ring-cyan-500 dark:bg-slate-800 dark:border-slate-700 dark:checked:bg-cyan-500 dark:checked:border-cyan-500 dark:focus:border-cyan-500">
<span class="text-xs font-bold text-slate-600 dark:text-slate-300">100</span>
</label>
</div>
</div>
<div class="pt-2">
<span class="text-xs font-black text-slate-400 uppercase tracking-widest block mb-2">{{ __('Coin Denominations') }}</span>
<div class="flex flex-wrap gap-x-6 gap-y-2">
<label class="flex items-center gap-2 cursor-pointer">
<input type="hidden" name="settings[cash_coin_50]" value="0">
<input type="checkbox" name="settings[cash_coin_50]" value="1" x-model="machineSettings.cash_coin_50" class="w-4 h-4 text-cyan-500 rounded border-slate-300 focus:ring-cyan-500 dark:bg-slate-800 dark:border-slate-700 dark:checked:bg-cyan-500 dark:checked:border-cyan-500 dark:focus:border-cyan-500">
<span class="text-xs font-bold text-slate-600 dark:text-slate-300">50</span>
</label>
<label class="flex items-center gap-2 cursor-pointer">
<input type="hidden" name="settings[cash_coin_10]" value="0">
<input type="checkbox" name="settings[cash_coin_10]" value="1" x-model="machineSettings.cash_coin_10" class="w-4 h-4 text-cyan-500 rounded border-slate-300 focus:ring-cyan-500 dark:bg-slate-800 dark:border-slate-700 dark:checked:bg-cyan-500 dark:checked:border-cyan-500 dark:focus:border-cyan-500">
<span class="text-xs font-bold text-slate-600 dark:text-slate-300">10</span>
</label>
<label class="flex items-center gap-2 cursor-pointer">
<input type="hidden" name="settings[cash_coin_5]" value="0">
<input type="checkbox" name="settings[cash_coin_5]" value="1" x-model="machineSettings.cash_coin_5" class="w-4 h-4 text-cyan-500 rounded border-slate-300 focus:ring-cyan-500 dark:bg-slate-800 dark:border-slate-700 dark:checked:bg-cyan-500 dark:checked:border-cyan-500 dark:focus:border-cyan-500">
<span class="text-xs font-bold text-slate-600 dark:text-slate-300">5</span>
</label>
<label class="flex items-center gap-2 cursor-pointer">
<input type="hidden" name="settings[cash_coin_1]" value="0">
<input type="checkbox" name="settings[cash_coin_1]" value="1" x-model="machineSettings.cash_coin_1" class="w-4 h-4 text-cyan-500 rounded border-slate-300 focus:ring-cyan-500 dark:bg-slate-800 dark:border-slate-700 dark:checked:bg-cyan-500 dark:checked:border-cyan-500 dark:focus:border-cyan-500">
<span class="text-xs font-bold text-slate-600 dark:text-slate-300">1</span>
</label>
</div>
</div>
</div>
</div>
<!-- 取貨模組 -->
<div class="p-4 rounded-xl bg-slate-50/50 dark:bg-slate-800/50 border border-slate-100 dark:border-slate-700/50 hover:bg-slate-50 dark:hover:bg-slate-800 transition-colors space-y-4">
<div class="flex items-center justify-between">
<div class="flex items-center gap-3">
<h4 class="text-sm font-black text-slate-700 dark:text-slate-200">{{ __('Pickup Module') }}</h4>
<button type="button" x-show="machineSettings.pickup_module_enabled" x-transition @click="toggleAllPickup()" class="text-[10px] font-bold text-cyan-500 hover:text-cyan-600 transition-colors uppercase tracking-wider">
{{ __('Select All / Deselect All') }}
</button>
</div>
<label class="relative inline-flex items-center cursor-pointer">
<input type="hidden" name="settings[pickup_module_enabled]" value="0">
<input type="checkbox" name="settings[pickup_module_enabled]" value="1"
x-model="machineSettings.pickup_module_enabled" class="peer sr-only">
<div class="w-9 h-5 bg-slate-200 peer-focus:outline-none rounded-full peer dark:bg-slate-700 peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-4 after:w-4 after:transition-all dark:border-gray-600 peer-checked:bg-cyan-500"></div>
</label>
</div>
<div x-show="machineSettings.pickup_module_enabled" x-transition class="pl-4 border-l-2 border-slate-200 dark:border-slate-700 flex flex-wrap gap-x-6 gap-y-2">
<label class="flex items-center gap-2 cursor-pointer">
<input type="hidden" name="settings[pickup_code_enabled]" value="0">
<input type="checkbox" name="settings[pickup_code_enabled]" value="1" x-model="machineSettings.pickup_code_enabled" class="w-4 h-4 text-cyan-500 rounded border-slate-300 focus:ring-cyan-500 dark:bg-slate-800 dark:border-slate-700 dark:checked:bg-cyan-500 dark:checked:border-cyan-500 dark:focus:border-cyan-500">
<span class="text-xs font-bold text-slate-600 dark:text-slate-300">{{ __('Pickup Code') }}</span>
</label>
<label class="flex items-center gap-2 cursor-pointer">
<input type="hidden" name="settings[pass_code_enabled]" value="0">
<input type="checkbox" name="settings[pass_code_enabled]" value="1" x-model="machineSettings.pass_code_enabled" class="w-4 h-4 text-cyan-500 rounded border-slate-300 focus:ring-cyan-500 dark:bg-slate-800 dark:border-slate-700 dark:checked:bg-cyan-500 dark:checked:border-cyan-500 dark:focus:border-cyan-500">
<span class="text-xs font-bold text-slate-600 dark:text-slate-300">{{ __('Passcode') }}</span>
</label>
</div>
</div>
<!-- 購物車功能 -->
<div class="p-4 rounded-xl bg-slate-50/50 dark:bg-slate-800/50 border border-slate-100 dark:border-slate-700/50 hover:bg-slate-50 dark:hover:bg-slate-800 transition-colors">
<div class="flex items-center justify-between">
<h4 class="text-sm font-black text-slate-700 dark:text-slate-200">{{ __('Shopping Cart') }}</h4>
<label class="relative inline-flex items-center cursor-pointer">
<input type="hidden" name="settings[shopping_cart_enabled]" value="0">
<input type="checkbox" name="settings[shopping_cart_enabled]" value="1"
x-model="machineSettings.shopping_cart_enabled" class="peer sr-only">
<div class="w-9 h-5 bg-slate-200 peer-focus:outline-none rounded-full peer dark:bg-slate-700 peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-4 after:w-4 after:transition-all dark:border-gray-600 peer-checked:bg-cyan-500"></div>
</label>
</div>
</div>
<!-- 來店禮功能 -->
<div class="p-4 rounded-xl bg-slate-50/50 dark:bg-slate-800/50 border border-slate-100 dark:border-slate-700/50 hover:bg-slate-50 dark:hover:bg-slate-800 transition-colors">
<div class="flex items-center justify-between">
<h4 class="text-sm font-black text-slate-700 dark:text-slate-200">{{ __('Welcome Gift') }}</h4>
<label class="relative inline-flex items-center cursor-pointer">
<input type="hidden" name="settings[welcome_gift_enabled]" value="0">
<input type="checkbox" name="settings[welcome_gift_enabled]" value="1"
x-model="machineSettings.welcome_gift_enabled" class="peer sr-only">
<div class="w-9 h-5 bg-slate-200 peer-focus:outline-none rounded-full peer dark:bg-slate-700 peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-4 after:w-4 after:transition-all dark:border-gray-600 peer-checked:bg-cyan-500"></div>
</label>
</div>
</div>
</div>
<!-- 會員系統功能 -->
<div class="grid grid-cols-1 md:grid-cols-4 gap-4 items-center p-4 rounded-xl bg-slate-50/50 dark:bg-slate-800/50 border border-slate-100 dark:border-slate-700/50 hover:bg-slate-50 dark:hover:bg-slate-800 transition-colors">
<div class="md:col-span-1">
<h4 class="text-sm font-black text-slate-700 dark:text-slate-200">{{ __('Member System') }}</h4>
</div>
<div class="md:col-span-3 flex flex-wrap gap-x-8 gap-y-4">
<label class="flex items-center gap-3 cursor-pointer group">
<div class="relative inline-flex items-center">
<input type="hidden" name="settings[member_system_enabled]" value="0">
<input type="checkbox" name="settings[member_system_enabled]" value="1"
x-model="machineSettings.member_system_enabled" class="peer sr-only">
<div class="w-9 h-5 bg-slate-200 peer-focus:outline-none rounded-full peer dark:bg-slate-700 peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-4 after:w-4 after:transition-all dark:border-gray-600 peer-checked:bg-cyan-500"></div>
</div>
<span class="text-sm font-bold text-slate-600 dark:text-slate-300 group-hover:text-slate-900 dark:group-hover:text-white transition-colors">{{ __('Member System') }}</span>
</label>
</div>
</div>
<!-- 稅務系統 (電子發票) -->
<div class="grid grid-cols-1 md:grid-cols-4 gap-4 items-center p-4 rounded-xl bg-slate-50/50 dark:bg-slate-800/50 border border-slate-100 dark:border-slate-700/50 hover:bg-slate-50 dark:hover:bg-slate-800 transition-colors">
<div class="md:col-span-1"> <div class="md:col-span-1">
<h4 class="text-sm font-black text-slate-700 dark:text-slate-200">{{ __('Tax System') }}</h4> <h4 class="text-sm font-black text-slate-700 dark:text-slate-200">{{ __('Tax System') }}</h4>
</div> </div>
@ -449,176 +833,15 @@
<input type="hidden" name="settings[tax_invoice_enabled]" value="0"> <input type="hidden" name="settings[tax_invoice_enabled]" value="0">
<input type="checkbox" name="settings[tax_invoice_enabled]" value="1" <input type="checkbox" name="settings[tax_invoice_enabled]" value="1"
x-model="machineSettings.tax_invoice_enabled" class="peer sr-only"> x-model="machineSettings.tax_invoice_enabled" class="peer sr-only">
<div <div class="w-9 h-5 bg-slate-200 peer-focus:outline-none rounded-full peer dark:bg-slate-700 peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-4 after:w-4 after:transition-all dark:border-gray-600 peer-checked:bg-cyan-500"></div>
class="w-9 h-5 bg-slate-200 peer-focus:outline-none rounded-full peer dark:bg-slate-700 peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-4 after:w-4 after:transition-all dark:border-gray-600 peer-checked:bg-cyan-500">
</div>
</div> </div>
<span <span class="text-sm font-bold text-slate-600 dark:text-slate-300 group-hover:text-slate-900 dark:group-hover:text-white transition-colors">{{ __('Electronic Invoice') }}</span>
class="text-sm font-bold text-slate-600 dark:text-slate-300 group-hover:text-slate-900 dark:group-hover:text-white transition-colors">{{
__('Electronic Invoice') }}</span>
</label>
</div>
</div>
<!-- 刷卡機系統 -->
<div
class="grid grid-cols-1 md:grid-cols-4 gap-4 items-center p-4 rounded-xl bg-slate-50/50 dark:bg-slate-800/50 border border-slate-100 dark:border-slate-700/50 hover:bg-slate-50 dark:hover:bg-slate-800 transition-colors">
<div class="md:col-span-1">
<h4 class="text-sm font-black text-slate-700 dark:text-slate-200">{{ __('Card Machine System') }}</h4>
</div>
<div class="md:col-span-3 flex flex-wrap gap-x-8 gap-y-4">
<label class="flex items-center gap-3 cursor-pointer group">
<div class="relative inline-flex items-center">
<input type="hidden" name="settings[card_terminal_enabled]" value="0">
<input type="checkbox" name="settings[card_terminal_enabled]" value="1"
x-model="machineSettings.card_terminal_enabled" class="peer sr-only">
<div
class="w-9 h-5 bg-slate-200 peer-focus:outline-none rounded-full peer dark:bg-slate-700 peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-4 after:w-4 after:transition-all dark:border-gray-600 peer-checked:bg-cyan-500">
</div>
</div>
<span
class="text-sm font-bold text-slate-600 dark:text-slate-300 group-hover:text-slate-900 dark:group-hover:text-white transition-colors">{{
__('Includes Credit Card/Mobile Pay') }}</span>
</label>
</div>
</div>
<!-- 掃碼支付功能 -->
<div
class="grid grid-cols-1 md:grid-cols-4 gap-4 items-center p-4 rounded-xl bg-slate-50/50 dark:bg-slate-800/50 border border-slate-100 dark:border-slate-700/50 hover:bg-slate-50 dark:hover:bg-slate-800 transition-colors">
<div class="md:col-span-1">
<h4 class="text-sm font-black text-slate-700 dark:text-slate-200">{{ __('Scan Pay')
}}</h4>
</div>
<div class="md:col-span-3 flex flex-wrap gap-x-8 gap-y-4">
<label class="flex items-center gap-3 cursor-pointer group">
<div class="relative inline-flex items-center">
<input type="hidden" name="settings[scan_pay_esun_enabled]" value="0">
<input type="checkbox" name="settings[scan_pay_esun_enabled]" value="1"
x-model="machineSettings.scan_pay_esun_enabled" class="peer sr-only">
<div
class="w-9 h-5 bg-slate-200 peer-focus:outline-none rounded-full peer dark:bg-slate-700 peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-4 after:w-4 after:transition-all dark:border-gray-600 peer-checked:bg-cyan-500">
</div>
</div>
<span
class="text-sm font-bold text-slate-600 dark:text-slate-300 group-hover:text-slate-900 dark:group-hover:text-white transition-colors">{{
__('E.SUN QR Pay') }}</span>
</label>
<label class="flex items-center gap-3 cursor-pointer group">
<div class="relative inline-flex items-center">
<input type="hidden" name="settings[scan_pay_linepay_enabled]" value="0">
<input type="checkbox" name="settings[scan_pay_linepay_enabled]" value="1"
x-model="machineSettings.scan_pay_linepay_enabled" class="peer sr-only">
<div
class="w-9 h-5 bg-slate-200 peer-focus:outline-none rounded-full peer dark:bg-slate-700 peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-4 after:w-4 after:transition-all dark:border-gray-600 peer-checked:bg-cyan-500">
</div>
</div>
<span
class="text-sm font-bold text-slate-600 dark:text-slate-300 group-hover:text-slate-900 dark:group-hover:text-white transition-colors">{{
__('LinePay Payment') }}</span>
</label>
</div>
</div>
<!-- 購物車功能 -->
<div
class="grid grid-cols-1 md:grid-cols-4 gap-4 items-center p-4 rounded-xl bg-slate-50/50 dark:bg-slate-800/50 border border-slate-100 dark:border-slate-700/50 hover:bg-slate-50 dark:hover:bg-slate-800 transition-colors">
<div class="md:col-span-1">
<h4 class="text-sm font-black text-slate-700 dark:text-slate-200">{{ __('購物車功能') }}
</h4>
</div>
<div class="md:col-span-3 flex flex-wrap gap-x-8 gap-y-4">
<label class="flex items-center gap-3 cursor-pointer group">
<div class="relative inline-flex items-center">
<input type="hidden" name="settings[shopping_cart_enabled]" value="0">
<input type="checkbox" name="settings[shopping_cart_enabled]" value="1"
x-model="machineSettings.shopping_cart_enabled" class="peer sr-only">
<div
class="w-9 h-5 bg-slate-200 peer-focus:outline-none rounded-full peer dark:bg-slate-700 peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-4 after:w-4 after:transition-all dark:border-gray-600 peer-checked:bg-cyan-500">
</div>
</div>
<span
class="text-sm font-bold text-slate-600 dark:text-slate-300 group-hover:text-slate-900 dark:group-hover:text-white transition-colors">{{
__('購物車') }}</span>
</label>
</div>
</div>
<!-- 來店禮功能 -->
<div
class="grid grid-cols-1 md:grid-cols-4 gap-4 items-center p-4 rounded-xl bg-slate-50/50 dark:bg-slate-800/50 border border-slate-100 dark:border-slate-700/50 hover:bg-slate-50 dark:hover:bg-slate-800 transition-colors">
<div class="md:col-span-1">
<h4 class="text-sm font-black text-slate-700 dark:text-slate-200">{{ __('來店禮功能') }}
</h4>
</div>
<div class="md:col-span-3 flex flex-wrap gap-x-8 gap-y-4">
<label class="flex items-center gap-3 cursor-pointer group">
<div class="relative inline-flex items-center">
<input type="hidden" name="settings[welcome_gift_enabled]" value="0">
<input type="checkbox" name="settings[welcome_gift_enabled]" value="1"
x-model="machineSettings.welcome_gift_enabled" class="peer sr-only">
<div
class="w-9 h-5 bg-slate-200 peer-focus:outline-none rounded-full peer dark:bg-slate-700 peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-4 after:w-4 after:transition-all dark:border-gray-600 peer-checked:bg-cyan-500">
</div>
</div>
<span
class="text-sm font-bold text-slate-600 dark:text-slate-300 group-hover:text-slate-900 dark:group-hover:text-white transition-colors">{{
__('來店禮') }}</span>
</label>
</div>
</div>
<!-- 現金模組功能 -->
<div
class="grid grid-cols-1 md:grid-cols-4 gap-4 items-center p-4 rounded-xl bg-slate-50/50 dark:bg-slate-800/50 border border-slate-100 dark:border-slate-700/50 hover:bg-slate-50 dark:hover:bg-slate-800 transition-colors">
<div class="md:col-span-1">
<h4 class="text-sm font-black text-slate-700 dark:text-slate-200">{{ __('現金模組功能') }}
</h4>
</div>
<div class="md:col-span-3 flex flex-wrap gap-x-8 gap-y-4">
<label class="flex items-center gap-3 cursor-pointer group">
<div class="relative inline-flex items-center">
<input type="hidden" name="settings[cash_module_enabled]" value="0">
<input type="checkbox" name="settings[cash_module_enabled]" value="1"
x-model="machineSettings.cash_module_enabled" class="peer sr-only">
<div
class="w-9 h-5 bg-slate-200 peer-focus:outline-none rounded-full peer dark:bg-slate-700 peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-4 after:w-4 after:transition-all dark:border-gray-600 peer-checked:bg-cyan-500">
</div>
</div>
<span
class="text-sm font-bold text-slate-600 dark:text-slate-300 group-hover:text-slate-900 dark:group-hover:text-white transition-colors">{{
__('硬幣機/紙鈔機') }}</span>
</label>
</div>
</div>
<!-- 會員系統 -->
<div
class="grid grid-cols-1 md:grid-cols-4 gap-4 items-center p-4 rounded-xl bg-slate-50/50 dark:bg-slate-800/50 border border-slate-100 dark:border-slate-700/50 hover:bg-slate-50 dark:hover:bg-slate-800 transition-colors">
<div class="md:col-span-1">
<h4 class="text-sm font-black text-slate-700 dark:text-slate-200">{{ __('會員系統功能') }}
</h4>
</div>
<div class="md:col-span-3 flex flex-wrap gap-x-8 gap-y-4">
<label class="flex items-center gap-3 cursor-pointer group">
<div class="relative inline-flex items-center">
<input type="hidden" name="settings[member_system_enabled]" value="0">
<input type="checkbox" name="settings[member_system_enabled]" value="1"
x-model="machineSettings.member_system_enabled" class="peer sr-only">
<div
class="w-9 h-5 bg-slate-200 peer-focus:outline-none rounded-full peer dark:bg-slate-700 peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-4 after:w-4 after:transition-all dark:border-gray-600 peer-checked:bg-cyan-500">
</div>
</div>
<span
class="text-sm font-bold text-slate-600 dark:text-slate-300 group-hover:text-slate-900 dark:group-hover:text-white transition-colors">{{
__('會員系統') }}</span>
</label> </label>
</div> </div>
</div> </div>
<!-- 硬體周邊設定 --> <!-- 硬體周邊設定 -->
<div <div class="grid grid-cols-1 md:grid-cols-4 gap-4 items-center p-4 rounded-xl bg-slate-50/50 dark:bg-slate-800/50 border border-slate-100 dark:border-slate-700/50 hover:bg-slate-50 dark:hover:bg-slate-800 transition-colors">
class="grid grid-cols-1 md:grid-cols-4 gap-4 items-center p-4 rounded-xl bg-slate-50/50 dark:bg-slate-800/50 border border-slate-100 dark:border-slate-700/50 hover:bg-slate-50 dark:hover:bg-slate-800 transition-colors">
<div class="md:col-span-1"> <div class="md:col-span-1">
<h4 class="text-sm font-black text-slate-700 dark:text-slate-200">{{ __('Hardware Peripheral Settings') }}</h4> <h4 class="text-sm font-black text-slate-700 dark:text-slate-200">{{ __('Hardware Peripheral Settings') }}</h4>
</div> </div>
@ -628,13 +851,9 @@
<input type="hidden" name="settings[ambient_temp_monitoring_enabled]" value="0"> <input type="hidden" name="settings[ambient_temp_monitoring_enabled]" value="0">
<input type="checkbox" name="settings[ambient_temp_monitoring_enabled]" value="1" <input type="checkbox" name="settings[ambient_temp_monitoring_enabled]" value="1"
x-model="machineSettings.ambient_temp_monitoring_enabled" class="peer sr-only"> x-model="machineSettings.ambient_temp_monitoring_enabled" class="peer sr-only">
<div <div class="w-9 h-5 bg-slate-200 peer-focus:outline-none rounded-full peer dark:bg-slate-700 peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-4 after:w-4 after:transition-all dark:border-gray-600 peer-checked:bg-cyan-500"></div>
class="w-9 h-5 bg-slate-200 peer-focus:outline-none rounded-full peer dark:bg-slate-700 peer-checked:after:translate-x-full peer-checked:after:border-white after:content-[''] after:absolute after:top-[2px] after:left-[2px] after:bg-white after:border-gray-300 after:border after:rounded-full after:h-4 after:w-4 after:transition-all dark:border-gray-600 peer-checked:bg-cyan-500">
</div>
</div> </div>
<span <span class="text-sm font-bold text-slate-600 dark:text-slate-300 group-hover:text-slate-900 dark:group-hover:text-white transition-colors">{{ __('Ambient Temperature Monitoring') }}</span>
class="text-sm font-bold text-slate-600 dark:text-slate-300 group-hover:text-slate-900 dark:group-hover:text-white transition-colors">{{
__('Ambient Temperature Monitoring') }}</span>
</label> </label>
</div> </div>
</div> </div>

View File

@ -11,7 +11,7 @@
</span> </span>
<input type="text" x-model="machineSearch" @input.debounce.500ms="searchInTab('system_settings')" <input type="text" x-model="machineSearch" @input.debounce.500ms="searchInTab('system_settings')"
@keydown.enter.prevent="searchInTab('system_settings')" @keydown.enter.prevent="searchInTab('system_settings')"
placeholder="{{ __('搜尋機台名稱或代號...') }}" placeholder="{{ __('Search machine name or code...') }}"
class="luxury-input py-2.5 pl-11 pr-4 block w-full sm:w-72 text-sm font-bold"> class="luxury-input py-2.5 pl-11 pr-4 block w-full sm:w-72 text-sm font-bold">
</div> </div>
@ -84,13 +84,92 @@
@forelse($machines as $machine) @forelse($machines as $machine)
@php @php
$activeFeatures = []; $activeFeatures = [];
if ($machine->tax_invoice_enabled) $activeFeatures[] = __('Electronic Invoice'); $shoppingMode = $machine->settings['shopping_mode'] ?? 'basic';
if ($machine->card_terminal_enabled) $activeFeatures[] = __('Includes Credit Card/Mobile Pay');
if ($machine->scan_pay_esun_enabled) $activeFeatures[] = __('E.SUN Bank Scan'); if ($shoppingMode === 'employee_card') {
if ($machine->scan_pay_linepay_enabled) $activeFeatures[] = __('LinePay Payment'); $activeFeatures[] = __('Staff Card');
if ($machine->shopping_cart_enabled) $activeFeatures[] = __('Shopping Cart'); } elseif ($shoppingMode === 'pickup_sheet') {
if ($machine->welcome_gift_enabled) $activeFeatures[] = __('Welcome Gift'); $activeFeatures[] = __('Pickup Sheet (Material No.)');
if ($machine->cash_module_enabled) $activeFeatures[] = __('Coin/Banknote Machine'); } else {
$activeFeatures[] = __('Basic Mode');
if ($machine->tax_invoice_enabled) $activeFeatures[] = __('Electronic Invoice');
if ($machine->card_terminal_enabled) {
$terminals = [];
if ($machine->settings['credit_card_enabled'] ?? false) {
$terminals[] = __('Credit Card Payment');
}
if ($machine->settings['mobile_pay_enabled'] ?? false) {
$terminals[] = __('Mobile Payment');
}
if ($machine->settings['card_pay_enabled'] ?? false) {
$cards = [];
if ($machine->settings['card_pay_easycard'] ?? false) $cards[] = __('EasyCard');
if ($machine->settings['card_pay_ipass'] ?? false) $cards[] = __('iPASS');
if ($machine->settings['card_pay_icash'] ?? false) $cards[] = __('icash');
if (!empty($cards)) {
$terminals[] = __('Card Payment') . ' (' . implode('/', $cards) . ')';
} else {
$terminals[] = __('Card Payment');
}
}
if (!empty($terminals)) {
$activeFeatures[] = __('Includes Credit Card/Mobile Pay') . ' (' . implode(', ', $terminals) . ')';
} else {
$activeFeatures[] = __('Includes Credit Card/Mobile Pay');
}
}
if ($machine->settings['scan_pay_enabled'] ?? false) {
$scans = [];
if ($machine->scan_pay_esun_enabled) $scans[] = __('E.SUN Pay');
if ($machine->settings['scan_pay_tappay_enabled'] ?? false) {
$taps = [];
if ($machine->settings['tappay_linepay'] ?? false) $taps[] = __('Line Pay');
if ($machine->settings['tappay_jkopay'] ?? false) $taps[] = __('JKOPAY');
if ($machine->settings['tappay_pipay'] ?? false) $taps[] = __('Pi Wallet');
if ($machine->settings['tappay_pluspay'] ?? false) $taps[] = __('PlusPay');
if ($machine->settings['tappay_easywallet'] ?? false) $taps[] = __('EasyWallet');
if (!empty($taps)) {
$scans[] = 'TapPay (' . implode('/', $taps) . ')';
}
}
if (!empty($scans)) {
$activeFeatures[] = __('Scan Payment') . ' (' . implode(', ', $scans) . ')';
}
}
if ($machine->cash_module_enabled) {
$bills = [];
if (($machine->settings['cash_bill_1000'] ?? true) !== false) $bills[] = '1000';
if (($machine->settings['cash_bill_500'] ?? true) !== false) $bills[] = '500';
if (($machine->settings['cash_bill_100'] ?? true) !== false) $bills[] = '100';
$coins = [];
if (($machine->settings['cash_coin_50'] ?? true) !== false) $coins[] = '50';
if (($machine->settings['cash_coin_10'] ?? true) !== false) $coins[] = '10';
if (($machine->settings['cash_coin_5'] ?? true) !== false) $coins[] = '5';
if (($machine->settings['cash_coin_1'] ?? true) !== false) $coins[] = '1';
$cashStr = __('Cash Module');
if (!empty($bills) || !empty($coins)) {
$cashStr .= ' (';
if (!empty($bills)) $cashStr .= __('Bill') . ':' . implode('/', $bills);
if (!empty($bills) && !empty($coins)) $cashStr .= ' ';
if (!empty($coins)) $cashStr .= __('Coin') . ':' . implode('/', $coins);
$cashStr .= ')';
}
$activeFeatures[] = $cashStr;
}
$pickups = [];
if ($machine->settings['pickup_code_enabled'] ?? false) $pickups[] = __('Pickup Code');
if ($machine->settings['pass_code_enabled'] ?? false) $pickups[] = __('Passcode');
if (!empty($pickups)) {
$activeFeatures[] = __('Pickup Module') . ' (' . implode('/', $pickups) . ')';
}
if ($machine->shopping_cart_enabled) $activeFeatures[] = __('Shopping Cart');
if ($machine->welcome_gift_enabled) $activeFeatures[] = __('Welcome Gift');
}
if ($machine->member_system_enabled) $activeFeatures[] = __('Member System'); if ($machine->member_system_enabled) $activeFeatures[] = __('Member System');
if ($machine->ambient_temp_monitoring_enabled) $activeFeatures[] = __('Ambient Temperature Monitoring'); if ($machine->ambient_temp_monitoring_enabled) $activeFeatures[] = __('Ambient Temperature Monitoring');
@endphp @endphp
@ -142,13 +221,92 @@
@forelse($machines as $machine) @forelse($machines as $machine)
@php @php
$activeFeatures = []; $activeFeatures = [];
if ($machine->tax_invoice_enabled) $activeFeatures[] = __('Electronic Invoice'); $shoppingMode = $machine->settings['shopping_mode'] ?? 'basic';
if ($machine->card_terminal_enabled) $activeFeatures[] = __('Includes Credit Card/Mobile Pay');
if ($machine->scan_pay_esun_enabled) $activeFeatures[] = __('E.SUN Bank Scan'); if ($shoppingMode === 'employee_card') {
if ($machine->scan_pay_linepay_enabled) $activeFeatures[] = __('LinePay Payment'); $activeFeatures[] = __('Staff Card');
if ($machine->shopping_cart_enabled) $activeFeatures[] = __('Shopping Cart'); } elseif ($shoppingMode === 'pickup_sheet') {
if ($machine->welcome_gift_enabled) $activeFeatures[] = __('Welcome Gift'); $activeFeatures[] = __('Pickup Sheet (Material No.)');
if ($machine->cash_module_enabled) $activeFeatures[] = __('Coin/Banknote Machine'); } else {
$activeFeatures[] = __('Basic Mode');
if ($machine->tax_invoice_enabled) $activeFeatures[] = __('Electronic Invoice');
if ($machine->card_terminal_enabled) {
$terminals = [];
if ($machine->settings['credit_card_enabled'] ?? false) {
$terminals[] = __('Credit Card Payment');
}
if ($machine->settings['mobile_pay_enabled'] ?? false) {
$terminals[] = __('Mobile Payment');
}
if ($machine->settings['card_pay_enabled'] ?? false) {
$cards = [];
if ($machine->settings['card_pay_easycard'] ?? false) $cards[] = __('EasyCard');
if ($machine->settings['card_pay_ipass'] ?? false) $cards[] = __('iPASS');
if ($machine->settings['card_pay_icash'] ?? false) $cards[] = __('icash');
if (!empty($cards)) {
$terminals[] = __('Card Payment') . ' (' . implode('/', $cards) . ')';
} else {
$terminals[] = __('Card Payment');
}
}
if (!empty($terminals)) {
$activeFeatures[] = __('Includes Credit Card/Mobile Pay') . ' (' . implode(', ', $terminals) . ')';
} else {
$activeFeatures[] = __('Includes Credit Card/Mobile Pay');
}
}
if ($machine->settings['scan_pay_enabled'] ?? false) {
$scans = [];
if ($machine->scan_pay_esun_enabled) $scans[] = __('E.SUN Pay');
if ($machine->settings['scan_pay_tappay_enabled'] ?? false) {
$taps = [];
if ($machine->settings['tappay_linepay'] ?? false) $taps[] = __('Line Pay');
if ($machine->settings['tappay_jkopay'] ?? false) $taps[] = __('JKOPAY');
if ($machine->settings['tappay_pipay'] ?? false) $taps[] = __('Pi Wallet');
if ($machine->settings['tappay_pluspay'] ?? false) $taps[] = __('PlusPay');
if ($machine->settings['tappay_easywallet'] ?? false) $taps[] = __('EasyWallet');
if (!empty($taps)) {
$scans[] = 'TapPay (' . implode('/', $taps) . ')';
}
}
if (!empty($scans)) {
$activeFeatures[] = __('Scan Payment') . ' (' . implode(', ', $scans) . ')';
}
}
if ($machine->cash_module_enabled) {
$bills = [];
if (($machine->settings['cash_bill_1000'] ?? true) !== false) $bills[] = '1000';
if (($machine->settings['cash_bill_500'] ?? true) !== false) $bills[] = '500';
if (($machine->settings['cash_bill_100'] ?? true) !== false) $bills[] = '100';
$coins = [];
if (($machine->settings['cash_coin_50'] ?? true) !== false) $coins[] = '50';
if (($machine->settings['cash_coin_10'] ?? true) !== false) $coins[] = '10';
if (($machine->settings['cash_coin_5'] ?? true) !== false) $coins[] = '5';
if (($machine->settings['cash_coin_1'] ?? true) !== false) $coins[] = '1';
$cashStr = __('Cash Module');
if (!empty($bills) || !empty($coins)) {
$cashStr .= ' (';
if (!empty($bills)) $cashStr .= __('Bill') . ':' . implode('/', $bills);
if (!empty($bills) && !empty($coins)) $cashStr .= ' ';
if (!empty($coins)) $cashStr .= __('Coin') . ':' . implode('/', $coins);
$cashStr .= ')';
}
$activeFeatures[] = $cashStr;
}
$pickups = [];
if ($machine->settings['pickup_code_enabled'] ?? false) $pickups[] = __('Pickup Code');
if ($machine->settings['pass_code_enabled'] ?? false) $pickups[] = __('Passcode');
if (!empty($pickups)) {
$activeFeatures[] = __('Pickup Module') . ' (' . implode('/', $pickups) . ')';
}
if ($machine->shopping_cart_enabled) $activeFeatures[] = __('Shopping Cart');
if ($machine->welcome_gift_enabled) $activeFeatures[] = __('Welcome Gift');
}
if ($machine->member_system_enabled) $activeFeatures[] = __('Member System'); if ($machine->member_system_enabled) $activeFeatures[] = __('Member System');
if ($machine->ambient_temp_monitoring_enabled) $activeFeatures[] = __('Ambient Temperature Monitoring'); if ($machine->ambient_temp_monitoring_enabled) $activeFeatures[] = __('Ambient Temperature Monitoring');
@endphp @endphp