// --- 依存関係のフォールバック (プレビュー環境でのクラッシュ回避用) --- if (typeof window !== 'undefined') { if (!window.React) { window.React = { useState: () => [null, ()=>{}], useEffect: ()=>{}, useMemo: (f)=>f() }; } if (!window.Icons) { window.Icons = new Proxy({}, { get: () => function DummyIcon(props) { return window.React.createElement('span', {style:{display:'inline-block', width:'1em', height:'1em', backgroundColor:'#4b5563', borderRadius:'50%'}}, ''); } }); } if (!window.getCourseDisplay) window.getCourseDisplay = c => c === '30min' ? '30分' : (c === '60min' ? '60分' : c); if (!window.getCourseShortDisplay) window.getCourseShortDisplay = c => c === '30min' ? '30分' : (c === '60min' ? '60分' : c); if (!window.fetchApi) window.fetchApi = async () => ({ success: true }); } const { useState, useEffect, useMemo } = window.React; const Icons = window.Icons; const getCourseDisplay = window.getCourseDisplay; const getCourseShortDisplay = window.getCourseShortDisplay; const fetchApi = window.fetchApi; // --- ユーティリティ --- const checkIsAdmin = (user) => { return user && (String(user.is_admin) === '1' || user.is_admin === true); }; const CONSULTATION_METHODS = ['電話', 'LINE', 'Zoom', 'Google Meet', 'Skype', 'FaceTime', 'Teams']; // --- トースト通知コンポーネント (UI改善) --- const Toast = ({ message, type = 'success', onClose }) => { useEffect(() => { const timer = setTimeout(onClose, 3000); return () => clearTimeout(timer); }, [onClose]); return (
プロフィール画像
お客様との対話方法を設定します。
チェックを入れた項目が、お客様の予約画面で選択可能になります。各ツールで使用する「あなたのIDやURL」を入力しておくと、支払いが完了したお客様へ自動で送信されます。管理者専用の機密情報です。
このタブに入力された情報はサイト上に公開されず、業務連絡用の情報として厳重に管理されます。{t.role}
¥{stats.total.toLocaleString()}
¥{stats.totalCommission.toLocaleString()}
| 鑑定師 | 件数 | 売上金額 | 歩合率 | 報酬額 (支払額) | {isAdmin &&本部利益 | }
|---|---|---|---|---|---|
| {t.image_url ? |
{t.count}件 | ¥{t.totalSales.toLocaleString()} | {t.commission_rate}% | ¥{t.commissionAmount.toLocaleString()} | {isAdmin &&¥{(t.totalSales - t.commissionAmount).toLocaleString()} | }
| この月のデータはありません | |||||
| 顧客名 / メール | 総予約 | キャンセル | 操作 |
|---|---|---|---|
{c.user_name} {c.user_email} {isBl && |
{c.total_bookings} | {c.cancel_count} | |
| 該当する顧客が見つかりません | |||
| コード | 説明 | 割引 | 有効期限 | 状態 | 操作 |
|---|---|---|---|---|---|
| {c.code} | {c.description} | {c.discount_type === 'fixed' ? `¥${c.discount_value} OFF` : `${c.discount_value}% OFF`} | {c.expiry_date ? c.expiry_date : '無期限'} | ||
| クーポンが登録されていません | |||||
| 公開日 | タイトル | {isAdmin &&執筆者 | }公開 | 操作 |
|---|---|---|---|---|
| {b.published_date} | {b.title} {b.category || '未分類'} |
{isAdmin && {b.author_name || '運営'} | }{parseInt(b.is_visible) ? ● : ●} | |
| 記事がありません | ||||
| 日付 / タグ | 内容 | 公開 | 操作 |
|---|---|---|---|
| {n.published_date} {n.tag} | {n.text} |
{parseInt(n.is_visible) ? ● : ●} | |
| お知らせがありません | |||
| お名前 / 年代 | 対象鑑定師 | レビュー内容 | 公開 | 操作 |
|---|---|---|---|---|
{t.customer_name} {t.age_group} |
{t.teller_name} | {[...Array(t.rating||5)].map((_,i)=> {t.testimonial_text} |
{parseInt(t.is_visible) ? ● : ●} | |
| レビューがありません | ||||
| 順序 | 質問 / 回答 | 公開 | 操作 |
|---|---|---|---|
| {f.sort_order} |
Q. {f.question}
A. {f.answer}
|
{parseInt(f.is_visible) ? ● : ●} | |
| FAQがありません | |||