⏳ Moondust Portal 雲端同步處理中,請稍候...
{{ toast.message }}
Moondust Logo
Moondust Artistry

Moondust Portal (MP)

工作室課堂預約及學員系統

請輸入手提電話(免打 852 亦可)或電郵登入

🔐

老師管理員 — 兩步驟驗證

請打開手機 Google Authenticator 輸入 6 位數驗證碼。

{{ announcement.level === 'urgent' ? '🚨' : (announcement.level === 'warning' ? '⚠️' : '📣') }}
公告 {{ announcement.message }} ({{ announcement.updatedAt }})
🚨 注意:目前有 {{ rejectedPendingCount }} 筆學生異議 及 {{ penaltyReviewCount }} 筆取消 Penalty 待決定!
MP
Moondust Portal (MP) 👩‍🏫 老師後台
Moondust Artistry|工作室課堂預約及學員系統
📅 確認{{ bookingConfirmModal.enrollmentType === 'waitlist' ? '候補排隊' : '預約課堂' }}
課堂:{{ bookingConfirmModal.slot?.date }} ({{ bookingConfirmModal.slot?.day }}) {{ bookingConfirmModal.slot?.time }}
內容:{{ bookingConfirmModal.slot?.title }}
模式:{{ modeLabel(bookingConfirmModal.mode) }}

提示:以 30 分鐘為單位,最遲為完堂前 2 小時。

{{ penaltyModal.willTriggerPenalty ? '⚠️ 臨時取消預約警告 (觸發 Penalty 審批)' : '✅ 免費取消課堂預約確認' }}

取消課堂:{{ penaltyModal.slot?.date }} ({{ penaltyModal.slot?.day }}) {{ penaltyModal.slot?.time }}

{{ penaltyModal.statusText }}

📌 取消規則:報名後 15 分鐘內,或於課堂前一日 23:59 前取消免 Penalty;逾時取消將移交老師作最終決定。
✋ 對課後時數提出異議 / 拒絕確認
課堂:{{ rejectModal.req.classTitle }} ({{ rejectModal.req.classDate }})
老師發動扣減:-{{ Number(rejectModal.req.actualHours).toFixed(1) }} 小時

✏️ 修改已開課堂時段

開放模式:

➕ 創建新學生 Profile

✏️ 編輯學生個人檔案

{{ ledgerMediaModal.targetType === 'enrollment' ? '🎨 課堂進行中即時紀錄 (確認課時後自動轉入存案)' : '📖 歷史存案紀錄' }}

📸 課堂備註及多張作品相片

{{ ledgerMediaModal.titleText }}
學員:{{ ledgerMediaModal.studentName }} ({{ modeLabel(ledgerMediaModal.mode) }})
系統自動生成・只讀不可修改
{{ ledgerMediaModal.systemNote }}
只有老師看到及修改
{{ currentRole === 'teacher' ? '老師可修改' : '學生只讀' }}
{{ ledgerMediaModal.teacherSharedNote || '(暫無老師備註)' }}
{{ currentRole === 'student' ? '學生可修改' : '老師只讀' }}
{{ ledgerMediaModal.studentSharedNote || '(學生暫無填寫備註)' }}
{{ waQuickModal.emailSent ? '📧 系統已自動寄出 Email 通知' : '💡 提示:可透過下方按鈕一鍵發送 WhatsApp' }}

💬 {{ waQuickModal.title }}

👤 對象:{{ waQuickModal.studentName }} 📱 電話:{{ waQuickModal.phone || '無' }}
💬 一鍵打開 WhatsApp 發送
Moondust Portal (MP) {{ greetingPrefix }},歡迎您~~

{{ formatStudentName(currentStudent) }}

📍 {{ currentStudent.district }} 📱 {{ formatPhoneDisplay(currentStudent.phone) }} ⏳ 到期日:{{ currentStudent.expiryDate }} 過期
你目前未有生效中的課程或時數,請聯絡老師報讀課程。
🎨 作品課程 (不限時) 進行中
📌 {{ proj }}
🖌️ 花漾
可用剩餘時數
{{ Number(currentStudent.projectHours).toFixed(1) }} h
📖 自修班
可用剩餘時數
{{ Number(currentStudent.selfStudyHours).toFixed(1) }} h
🔔 課時結算及審批通知(如有疑問可按「有異議/拒絕」):
{{ modeShortLabel(req.mode) }} {{ req.classTitle }} ({{ req.classDate }}) ⚖️ 臨時取消 Penalty (待老師決定) ✋ 已拒絕確認 {{ formatElapsedLabel(req.hoursElapsed) }}
預計扣除:-{{ Number(req.actualHours).toFixed(1) }} 小時
🤖 {{ req.systemNote }}
📢 老師備註:{{ req.teacherSharedNote }}
✅

我的已確認課堂 ({{ myBookedSlots.length }})

課堂中可隨時記錄

💡 上課期間可隨時點擊下方「📸 課堂筆記 / 相片」記錄作品進度,課後確認時數時將自動存入檔案!

目前暫無已報名的課堂,請於下方「開放預約時段」報名。
✓ 已確認席位 {{ modeShortLabel(item.booking.mode) }} 🕒 預計 {{ item.booking.arrivalTime }} 到達
🗓️ {{ item.slot.date }} ({{ item.slot.day }}) {{ item.slot.time }}
{{ item.slot.title }}
📢 老師備註:{{ item.booking.teacherSharedNote }}
📝 我的課堂筆記:{{ item.booking.studentSharedNote }}

⏳ 我的候補排隊清單 ({{ myWaitlistSlots.length }})

排第 {{ item.position }} 位 ({{ modeShortLabel(item.waitEntry.mode) }})
{{ item.slot.date }} ({{ item.slot.day }}) {{ item.slot.time }}
🗓️

開放預約時段 ({{ upcomingOpenSlots.length }})

15分鐘內或前一日23:59前免費取消
目前暫無開放中的課堂時段
{{ slot.date }} ({{ slot.day }}) {{ slot.time }} 已滿額 (候補 {{ slot.waitlist.length }}人) 尚餘 {{ slot.capacity - slot.bookings.length }} 位
{{ slot.title }} | 名額:{{ slot.bookings.length }} / {{ slot.capacity }} 人
✅ 你已報名此堂({{ modeShortLabel(getStudentBookingInSlot(slot).mode) }})
🕒 預計 {{ getStudentBookingInSlot(slot).arrivalTime }} 到達
⏳ 候補第 {{ getStudentWaitlistPosition(slot) }} 位({{ modeShortLabel(getStudentWaitlistInSlot(slot).mode) }})
⏳ 名額已滿,可排候補:

📖 購買及使用記錄

此篩選條件下暫無紀錄
{{ logTypeLabel(log) }} {{ log.date }} {{ modeShortLabel(log.mode) }}
{{ log.actionType === 'buy' ? '➕ 開通項目' : `簽到 (${log.hoursLogged}h)` }} {{ log.change > 0 ? '+' : '' }}{{ Number(log.change).toFixed(1) }}h {{ log.mode === 'unlimited_project' ? '不限時' : `結餘 ${Number(log.balanceAfter).toFixed(1)}h` }}
{{ log.description }} ⏳ 到期日:{{ log.newExpiry }}
🤖 {{ log.systemNote }}
📢 老師備註:{{ log.teacherSharedNote }}
📝 學生備註:{{ log.studentSharedNote }}

👤 個人檔案及密碼設定

選擇你喜愛的代表頭像並更新個人聯絡資料。

📣 頂部工作室公告欄設定

➕ 開放上課時段

開放模式:

📋 課堂時段、堂上筆記與候補管理

目前尚無開放中的課堂時段
{{ slot.date }} ({{ slot.day }}) {{ slot.time }} {{ slot.title }} 正式:{{ slot.bookings.length }}/{{ slot.capacity }}人 ⏳ 候補:{{ slot.waitlist.length }}人
✅ 正式報名學生 (點擊「📸 堂上筆記」可檢視學生筆記或加入老師評語):
暫無學生報名
{{ b.studentName }} {{ modeShortLabel(b.mode) }} 🕒 {{ b.arrivalTime }}
⏳ 候補排隊名單:
#{{ idx + 1 }} {{ w.studentName }} 💬 詢問
➕ 老師代學生加入:
{{ slot.status === 'completed' ? '✓ 已完成' : '✕ 已取消' }} {{ slot.date }} ({{ slot.day }}) {{ slot.time }} - {{ slot.title }}

⏱️ 課後發動實際時數結算

⚠️ 此課堂目前無正式報名學生!
🤖 系統備註預覽 (確認後自動寫入,師生只讀不可修改):
{{ settleSystemNotePreview }}

⏳ 待確認及臨時取消 Penalty 裁決 ({{ pendingRequests.length }})

目前沒有任何待辦項目!
{{ modeShortLabel(req.mode) }} {{ req.studentName }} ⚖️ 取消 Penalty 待決定 🚨 學生已拒絕 {{ formatElapsedLabel(req.hoursElapsed) }}
{{ req.classDate }} — {{ req.classTitle }}
決定扣減時數: h
扣除:-{{ Number(req.actualHours).toFixed(1) }}h
🤖 {{ req.systemNote }}
📢 老師備註:{{ req.teacherSharedNote }}
✋ 拒絕原因:{{ req.rejectReason }}
支援購買套票、+0h 續期及負數金額退款 (自動出收據)

💳 新增課時 / 續期 / 退款調整

💡 到期日計算:{{ expiryCalculationRuleNote }}
🤖 系統備註預覽 確認後自動寫入・只讀不可修改
{{ topupSystemNotePreview }}
{{ selectedTopupStudent.avatar || '🎨' }}
當前選中學生即時對照

{{ formatStudentName(selectedTopupStudent) }}

🔒 內部Remark:{{ selectedTopupStudent.adminRemark }}
⏳ 到期:{{ selectedTopupStudent.expiryDate }}
🖌️ 時數 (花漾)
{{ Number(selectedTopupStudent.projectHours || 0).toFixed(1) }} h
📖 時數 (自修班)
{{ Number(selectedTopupStudent.selfStudyHours || 0).toFixed(1) }} h
🎨 作品課程 (不限時)
{{ p }}
未開通 (0)
{{ logTypeLabel(log) }} {{ log.date }} {{ modeShortLabel(log.mode) }} {{ log.paymentMethod }} HK$ {{ Number(log.pricePaid).toLocaleString() }}
{{ log.mode === 'unlimited_project' ? (log.actionType === 'buy' ? '+開通' : `簽到(${log.hoursLogged}h)`) : `${log.change > 0 ? '+' : ''}${Number(log.change).toFixed(1)}h` }} (餘 {{ Number(log.balanceAfter).toFixed(1) }}h)
{{ log.description }}
🤖 {{ log.systemNote }}
🔒 老師備註(私密):{{ log.teacherPrivateNote }}
📢 老師備註:{{ log.teacherSharedNote }}
📝 學生備註:{{ log.studentSharedNote }}

👥 雲端資料庫學生名冊 (共 {{ filteredStudentList.length }} 人)

頭像 & 姓名 (Nickname) 性別 / 生日 / 地區 聯絡資料 & 內部Remark 有效期 當下結餘 操作
{{ s.avatar || '🎨' }} {{ s.lastName }}{{ s.firstName }} ({{ s.nickname }}) {{ s.gender }} | 🎂{{ s.birthMonth }}月{{ s.birthDay }}日 | {{ s.district }}
📱 {{ formatPhoneDisplay(s.phone) }}
{{ s.email || '-' }}
🔒 {{ s.adminRemark }}
{{ s.expiryDate }}
🖌️ 花漾: {{ Number(s.projectHours).toFixed(1) }}h
📖 自修班: {{ Number(s.selfStudyHours).toFixed(1) }}h
WA

💰 學費及貨品收入流水賬 (含退款)

當前篩選淨總額 ({{ filteredFinancialLogs.length }}筆)
HK$ {{ filteredRevenueTotal.toLocaleString() }}
日期學生模式時數項目及備註方式實收/退款金額
{{ fin.date }} {{ fin.studentName }} {{ modeShortLabel(fin.mode) }} {{ fin.mode === 'unlimited_project' ? '開通' : `${fin.change >= 0 ? '+' : ''}${Number(fin.change).toFixed(1)}h` }}
{{ fin.description }}
🤖 {{ fin.systemNote }}
🔒 私密:{{ fin.teacherPrivateNote }}
📢 老師備註:{{ fin.teacherSharedNote }}
{{ fin.paymentMethod || '-' }} HK$ {{ Number(fin.pricePaid || 0).toLocaleString() }}

🛡️ 全系統操作日誌 (HKT 香港時間)

香港時間操作者類別詳細紀錄
{{ item.timestamp }} {{ item.actorRole }} {{ item.actorName }} {{ item.category }} {{ item.detail }}
{{ smtpConfigured ? '🟢 自動 Email 引擎已連線' : '🟡 WhatsApp 範本模式 (未設定自動 Email)' }}

✉️ Moondust Portal 自動 Email 及 WhatsApp 通知中心

發信帳號:{{ smtpSender }} | 系統登入連結:{{ studioLoginUrl }}

💡 提示:在 Vercel 設定 SMTP_EMAIL 及 SMTP_PASSWORD 即可開啟 100% 全自動背景寄信!

🔔 上課前一日溫馨提示 (T-1 雷達)

自動抓取指定日期的所有已報名學員,一鍵發送提醒

📅 {{ reminderTargetDate }} 暫無已預約上課的學員
{{ item.studentName }} {{ modeShortLabel(item.mode) }}
{{ item.slot.time }} | 預計到達:{{ item.arrivalTime || '準時到達' }}

⏳ 課時即將到期 (14天內) 或 低時數 (≤3h) 名單

溫馨提醒學員預約餘下課堂或購買新套票順延有效期

共 {{ expiringOrLowBalanceStudents.length }} 人
目前沒有即將到期或低時數的學員
{{ st.avatar || '🎨' }} {{ formatStudentName(st) }}
⏳ 到期:{{ st.expiryDate }} | 花漾:{{ Number(st.projectHours).toFixed(1) }}h / 自修:{{ Number(st.selfStudyHours).toFixed(1) }}h
📋 選擇要修改的通知範本 (共 {{ notificationTemplates.length }} 款)
範本代碼:{{ activeTemplateForm.code }}

{{ activeTemplateForm.name }}

✨ 點擊下方標籤可將「動態變數」插入訊息內容中: