Initial commit: SmoothSchedule multi-tenant scheduling platform

This commit includes:
- Django backend with multi-tenancy (django-tenants)
- React + TypeScript frontend with Vite
- Platform administration API with role-based access control
- Authentication system with token-based auth
- Quick login dev tools for testing different user roles
- CORS and CSRF configuration for local development
- Docker development environment setup

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
poduck
2025-11-27 01:43:20 -05:00
commit 2e111364a2
567 changed files with 96410 additions and 0 deletions

View File

@@ -0,0 +1,688 @@
{
"common": {
"loading": "読み込み中...",
"error": "エラー",
"success": "成功",
"save": "保存",
"saveChanges": "変更を保存",
"cancel": "キャンセル",
"delete": "削除",
"edit": "編集",
"create": "作成",
"update": "更新",
"close": "閉じる",
"confirm": "確認",
"back": "戻る",
"next": "次へ",
"search": "検索",
"filter": "フィルター",
"actions": "アクション",
"settings": "設定",
"reload": "再読み込み",
"viewAll": "すべて表示",
"learnMore": "詳細を見る",
"poweredBy": "提供元",
"required": "必須",
"optional": "任意",
"masquerade": "なりすまし",
"masqueradeAsUser": "ユーザーになりすます"
},
"auth": {
"signIn": "ログイン",
"signOut": "ログアウト",
"signingIn": "ログイン中...",
"username": "ユーザー名",
"password": "パスワード",
"enterUsername": "ユーザー名を入力",
"enterPassword": "パスワードを入力",
"welcomeBack": "おかえりなさい",
"pleaseEnterDetails": "ログインするには詳細を入力してください。",
"authError": "認証エラー",
"invalidCredentials": "無効な認証情報",
"orContinueWith": "または以下でログイン",
"loginAtSubdomain": "ビジネスのサブドメインでログインしてください。スタッフと顧客はメインサイトからログインできません。",
"forgotPassword": "パスワードをお忘れですか?",
"rememberMe": "ログイン状態を保持",
"twoFactorRequired": "二要素認証が必要です",
"enterCode": "確認コードを入力",
"verifyCode": "コードを確認"
},
"nav": {
"dashboard": "ダッシュボード",
"scheduler": "スケジューラー",
"customers": "顧客",
"resources": "リソース",
"payments": "支払い",
"messages": "メッセージ",
"staff": "スタッフ",
"businessSettings": "ビジネス設定",
"profile": "プロフィール",
"platformDashboard": "プラットフォームダッシュボード",
"businesses": "ビジネス",
"users": "ユーザー",
"support": "サポート",
"platformSettings": "プラットフォーム設定"
},
"dashboard": {
"title": "ダッシュボード",
"welcome": "ようこそ、{{name}}さん!",
"todayOverview": "今日の概要",
"upcomingAppointments": "今後の予約",
"recentActivity": "最近のアクティビティ",
"quickActions": "クイックアクション",
"totalRevenue": "総収益",
"totalAppointments": "予約総数",
"newCustomers": "新規顧客",
"pendingPayments": "保留中の支払い"
},
"scheduler": {
"title": "スケジューラー",
"newAppointment": "新規予約",
"editAppointment": "予約を編集",
"deleteAppointment": "予約を削除",
"selectResource": "リソースを選択",
"selectService": "サービスを選択",
"selectCustomer": "顧客を選択",
"selectDate": "日付を選択",
"selectTime": "時間を選択",
"duration": "所要時間",
"notes": "メモ",
"status": "ステータス",
"confirmed": "確認済み",
"pending": "保留中",
"cancelled": "キャンセル",
"completed": "完了",
"noShow": "無断キャンセル",
"today": "今日",
"week": "週",
"month": "月",
"day": "日",
"timeline": "タイムライン",
"agenda": "アジェンダ",
"allResources": "全リソース"
},
"customers": {
"title": "顧客",
"description": "顧客データベースを管理し、履歴を表示します。",
"addCustomer": "顧客を追加",
"editCustomer": "顧客を編集",
"customerDetails": "顧客詳細",
"name": "名前",
"fullName": "氏名",
"email": "メールアドレス",
"emailAddress": "メールアドレス",
"phone": "電話番号",
"phoneNumber": "電話番号",
"address": "住所",
"city": "市区町村",
"state": "都道府県",
"zipCode": "郵便番号",
"tags": "タグ",
"tagsPlaceholder": "例: VIP, 紹介",
"tagsCommaSeparated": "タグ(カンマ区切り)",
"appointmentHistory": "予約履歴",
"noAppointments": "まだ予約がありません",
"totalSpent": "総支払額",
"totalSpend": "総利用額",
"lastVisit": "最終来店",
"nextAppointment": "次回の予約",
"contactInfo": "連絡先情報",
"status": "ステータス",
"active": "有効",
"inactive": "無効",
"never": "なし",
"customer": "顧客",
"searchPlaceholder": "名前、メール、電話番号で検索...",
"filters": "フィルター",
"noCustomersFound": "検索条件に一致する顧客が見つかりません。",
"addNewCustomer": "新規顧客を追加",
"createCustomer": "顧客を作成",
"errorLoading": "顧客の読み込みエラー"
},
"staff": {
"title": "スタッフと管理",
"description": "ユーザーアカウントと権限を管理します。",
"inviteStaff": "スタッフを招待",
"name": "名前",
"role": "役割",
"bookableResource": "予約可能リソース",
"makeBookable": "予約可能にする",
"yes": "はい",
"errorLoading": "スタッフの読み込みエラー",
"inviteModalTitle": "スタッフを招待",
"inviteModalDescription": "ユーザー招待フローがここに表示されます。"
},
"resources": {
"title": "リソース",
"description": "スタッフ、部屋、機材を管理します。",
"addResource": "リソースを追加",
"editResource": "リソースを編集",
"resourceDetails": "リソース詳細",
"resourceName": "リソース名",
"name": "名前",
"type": "タイプ",
"resourceType": "リソースタイプ",
"availability": "空き状況",
"services": "サービス",
"schedule": "スケジュール",
"active": "有効",
"inactive": "無効",
"upcoming": "今後",
"appointments": "予約",
"viewCalendar": "カレンダーを見る",
"noResourcesFound": "リソースが見つかりません。",
"addNewResource": "新規リソースを追加",
"createResource": "リソースを作成",
"staffMember": "スタッフメンバー",
"room": "部屋",
"equipment": "機材",
"resourceNote": "リソースはスケジューリングのためのプレースホルダーです。スタッフは予約に個別に割り当てることができます。",
"errorLoading": "リソースの読み込みエラー"
},
"services": {
"title": "サービス",
"addService": "サービスを追加",
"editService": "サービスを編集",
"name": "名前",
"description": "説明",
"duration": "所要時間",
"price": "価格",
"category": "カテゴリー",
"active": "有効"
},
"payments": {
"title": "支払い",
"transactions": "取引",
"invoices": "請求書",
"amount": "金額",
"status": "ステータス",
"date": "日付",
"method": "方法",
"paid": "支払い済み",
"unpaid": "未払い",
"refunded": "返金済み",
"pending": "保留中",
"viewDetails": "詳細を見る",
"issueRefund": "返金を発行",
"sendReminder": "リマインダーを送信",
"paymentSettings": "支払い設定",
"stripeConnect": "Stripe Connect",
"apiKeys": "APIキー"
},
"settings": {
"title": "設定",
"businessSettings": "ビジネス設定",
"businessSettingsDescription": "ブランディング、ドメイン、ポリシーを管理します。",
"domainIdentity": "ドメインとアイデンティティ",
"bookingPolicy": "予約とキャンセルポリシー",
"savedSuccessfully": "設定が正常に保存されました",
"general": "一般",
"branding": "ブランディング",
"notifications": "通知",
"security": "セキュリティ",
"integrations": "連携",
"billing": "請求",
"businessName": "ビジネス名",
"subdomain": "サブドメイン",
"primaryColor": "メインカラー",
"secondaryColor": "サブカラー",
"logo": "ロゴ",
"uploadLogo": "ロゴをアップロード",
"timezone": "タイムゾーン",
"language": "言語",
"currency": "通貨",
"dateFormat": "日付形式",
"timeFormat": "時間形式",
"oauth": {
"title": "OAuth設定",
"enabledProviders": "有効なプロバイダー",
"allowRegistration": "OAuthでの登録を許可",
"autoLinkByEmail": "メールアドレスで自動リンク",
"customCredentials": "カスタムOAuth認証情報",
"customCredentialsDesc": "ホワイトラベル体験のために独自のOAuth認証情報を使用",
"platformCredentials": "プラットフォーム認証情報",
"platformCredentialsDesc": "プラットフォーム提供のOAuth認証情報を使用",
"clientId": "クライアントID",
"clientSecret": "クライアントシークレット",
"paidTierOnly": "カスタムOAuth認証情報は有料プランでのみ利用可能です"
}
},
"profile": {
"title": "プロフィール設定",
"personalInfo": "個人情報",
"changePassword": "パスワードを変更",
"twoFactor": "二要素認証",
"sessions": "アクティブセッション",
"emails": "メールアドレス",
"preferences": "設定",
"currentPassword": "現在のパスワード",
"newPassword": "新しいパスワード",
"confirmPassword": "パスワードを確認",
"passwordChanged": "パスワードが正常に変更されました",
"enable2FA": "二要素認証を有効にする",
"disable2FA": "二要素認証を無効にする",
"scanQRCode": "QRコードをスキャン",
"enterBackupCode": "バックアップコードを入力",
"recoveryCodes": "リカバリーコード"
},
"platform": {
"title": "プラットフォーム管理",
"dashboard": "プラットフォームダッシュボード",
"overview": "プラットフォーム概要",
"overviewDescription": "全テナントのグローバル指標。",
"mrrGrowth": "MRR成長率",
"totalBusinesses": "ビジネス総数",
"totalUsers": "ユーザー総数",
"monthlyRevenue": "月間収益",
"activeSubscriptions": "アクティブなサブスクリプション",
"recentSignups": "最近の登録",
"supportTickets": "サポートチケット",
"supportDescription": "テナントから報告された問題を解決。",
"reportedBy": "報告者",
"priority": "優先度",
"businessManagement": "ビジネス管理",
"userManagement": "ユーザー管理",
"masquerade": "なりすまし",
"masqueradeAs": "なりすまし対象",
"exitMasquerade": "なりすましを終了",
"businesses": "ビジネス",
"businessesDescription": "テナント、プラン、アクセスを管理。",
"addNewTenant": "新しいテナントを追加",
"searchBusinesses": "ビジネスを検索...",
"businessName": "ビジネス名",
"subdomain": "サブドメイン",
"plan": "プラン",
"status": "ステータス",
"joined": "登録日",
"userDirectory": "ユーザーディレクトリ",
"userDirectoryDescription": "プラットフォーム全体のユーザーを表示・管理。",
"searchUsers": "名前またはメールでユーザーを検索...",
"allRoles": "全ての役割",
"user": "ユーザー",
"role": "役割",
"email": "メール",
"noUsersFound": "フィルターに一致するユーザーが見つかりません。",
"roles": {
"superuser": "スーパーユーザー",
"platformManager": "プラットフォーム管理者",
"businessOwner": "ビジネスオーナー",
"staff": "スタッフ",
"customer": "顧客"
},
"settings": {
"title": "プラットフォーム設定",
"description": "プラットフォーム全体の設定と連携を構成",
"tiersPricing": "プランと料金",
"oauthProviders": "OAuthプロバイダー",
"general": "一般",
"oauth": "OAuthプロバイダー",
"payments": "支払い",
"email": "メール",
"branding": "ブランディング"
}
},
"errors": {
"generic": "エラーが発生しました。もう一度お試しください。",
"networkError": "ネットワークエラー。接続を確認してください。",
"unauthorized": "この操作を行う権限がありません。",
"notFound": "リクエストされたリソースが見つかりませんでした。",
"validation": "入力内容を確認して、もう一度お試しください。",
"businessNotFound": "ビジネスが見つかりません",
"wrongLocation": "場所が違います",
"accessDenied": "アクセス拒否"
},
"validation": {
"required": "この項目は必須です",
"email": "有効なメールアドレスを入力してください",
"minLength": "{{min}}文字以上で入力してください",
"maxLength": "{{max}}文字以下で入力してください",
"passwordMatch": "パスワードが一致しません",
"invalidPhone": "有効な電話番号を入力してください"
},
"time": {
"minutes": "分",
"hours": "時間",
"days": "日",
"today": "今日",
"tomorrow": "明日",
"yesterday": "昨日",
"thisWeek": "今週",
"thisMonth": "今月",
"am": "午前",
"pm": "午後"
},
"marketing": {
"tagline": "ビジネスを精密に調整する。",
"description": "あらゆる規模のビジネス向けオールインワンスケジューリングプラットフォーム。リソース、スタッフ、予約を簡単に管理。",
"copyright": "Smooth Schedule Inc.",
"nav": {
"features": "機能",
"pricing": "料金",
"about": "会社概要",
"contact": "お問い合わせ",
"login": "ログイン",
"getStarted": "はじめる",
"startFreeTrial": "無料トライアル"
},
"hero": {
"headline": "シンプルな予約管理",
"subheadline": "予約、リソース、顧客を一元管理するオールインワンプラットフォーム。無料で始めて、成長に合わせて拡張。",
"cta": "無料トライアルを開始",
"secondaryCta": "デモを見る",
"trustedBy": "1,000社以上の企業に信頼されています"
},
"features": {
"title": "必要なすべてを",
"subtitle": "サービスビジネスのための強力な機能",
"scheduling": {
"title": "スマートスケジューリング",
"description": "ドラッグ&ドロップカレンダー、リアルタイム空き状況、自動リマインダー、重複検出機能を搭載。"
},
"resources": {
"title": "リソース管理",
"description": "スタッフ、部屋、設備を管理。空き状況、スキル、予約ルールを設定。"
},
"customers": {
"title": "顧客ポータル",
"description": "セルフサービス予約ポータル。履歴確認、予約管理、決済方法の保存が可能。"
},
"payments": {
"title": "統合決済",
"description": "Stripeでオンライン決済を受付。デポジット、全額払い、自動請求に対応。"
},
"multiTenant": {
"title": "複数拠点サポート",
"description": "複数の拠点やブランドを単一ダッシュボードで管理。データは完全分離。"
},
"whiteLabel": {
"title": "ホワイトラベル対応",
"description": "カスタムドメイン、ブランディング、SmoothScheduleロゴの非表示で一体感のある体験を。"
},
"analytics": {
"title": "分析とレポート",
"description": "売上、予約、顧客トレンドを美しいダッシュボードで追跡。"
},
"integrations": {
"title": "豊富な連携機能",
"description": "Google カレンダー、Zoom、Stripeなどと連携。カスタム連携用APIも利用可能。"
}
},
"howItWorks": {
"title": "数分で始められます",
"subtitle": "3つの簡単なステップでスケジューリングを変革",
"step1": {
"title": "アカウント作成",
"description": "無料登録して、数分でビジネスプロフィールを設定。"
},
"step2": {
"title": "サービスを追加",
"description": "サービス、料金、利用可能なリソースを設定。"
},
"step3": {
"title": "予約を開始",
"description": "予約リンクを共有して、顧客に即座に予約してもらいましょう。"
}
},
"pricing": {
"title": "シンプルで透明な料金",
"subtitle": "無料から始めて、成長に合わせてアップグレード。隠れた費用なし。",
"monthly": "月払い",
"annual": "年払い",
"annualSave": "20%お得",
"perMonth": "/月",
"period": "月",
"popular": "人気No.1",
"mostPopular": "人気No.1",
"getStarted": "はじめる",
"contactSales": "営業に問い合わせ",
"freeTrial": "14日間無料トライアル",
"noCredit": "クレジットカード不要",
"features": "機能",
"tiers": {
"free": {
"name": "無料",
"description": "お試しに最適",
"price": "0",
"features": [
"リソース2件まで",
"基本スケジューリング",
"顧客管理",
"Stripe直接連携",
"サブドメイン (business.smoothschedule.com)",
"コミュニティサポート"
],
"transactionFee": "取引あたり2.5% + ¥50"
},
"professional": {
"name": "プロフェッショナル",
"description": "成長中のビジネス向け",
"price": "29",
"annualPrice": "290",
"features": [
"リソース10件まで",
"カスタムドメイン",
"Stripe Connect (手数料削減)",
"ホワイトラベル",
"メールリマインダー",
"優先メールサポート"
],
"transactionFee": "取引あたり1.5% + ¥40"
},
"business": {
"name": "ビジネス",
"description": "確立したチーム向け",
"price": "79",
"annualPrice": "790",
"features": [
"リソース無制限",
"全プロフェッショナル機能",
"チーム管理",
"高度な分析",
"APIアクセス",
"電話サポート"
],
"transactionFee": "取引あたり0.5% + ¥30"
},
"enterprise": {
"name": "エンタープライズ",
"description": "大規模組織向け",
"price": "お問い合わせ",
"features": [
"全ビジネス機能",
"カスタム連携",
"専任サクセスマネージャー",
"SLA保証",
"カスタム契約",
"オンプレミス対応"
],
"transactionFee": "カスタム取引手数料"
}
}
},
"testimonials": {
"title": "世界中の企業に愛されています",
"subtitle": "お客様の声をご覧ください"
},
"stats": {
"appointments": "予約件数",
"businesses": "企業数",
"countries": "対応国数",
"uptime": "稼働率"
},
"signup": {
"title": "アカウント作成",
"subtitle": "今すぐ無料トライアルを開始。クレジットカード不要。",
"steps": {
"business": "ビジネス",
"account": "アカウント",
"plan": "プラン",
"confirm": "確認"
},
"businessInfo": {
"title": "ビジネスについて教えてください",
"name": "ビジネス名",
"namePlaceholder": "例Acme サロン&スパ",
"subdomain": "サブドメインを選択",
"checking": "利用可能か確認中...",
"available": "利用可能です!",
"taken": "既に使用されています"
},
"accountInfo": {
"title": "管理者アカウントを作成",
"firstName": "名",
"lastName": "姓",
"email": "メールアドレス",
"password": "パスワード",
"confirmPassword": "パスワード(確認)"
},
"planSelection": {
"title": "プランを選択"
},
"confirm": {
"title": "内容を確認",
"business": "ビジネス",
"account": "アカウント",
"plan": "選択したプラン",
"terms": "アカウントを作成することで、利用規約とプライバシーポリシーに同意したことになります。"
},
"errors": {
"businessNameRequired": "ビジネス名は必須です",
"subdomainRequired": "サブドメインは必須です",
"subdomainTooShort": "サブドメインは3文字以上必要です",
"subdomainInvalid": "サブドメインには小文字、数字、ハイフンのみ使用できます",
"subdomainTaken": "このサブドメインは既に使用されています",
"firstNameRequired": "名は必須です",
"lastNameRequired": "姓は必須です",
"emailRequired": "メールアドレスは必須です",
"emailInvalid": "有効なメールアドレスを入力してください",
"passwordRequired": "パスワードは必須です",
"passwordTooShort": "パスワードは8文字以上必要です",
"passwordMismatch": "パスワードが一致しません",
"generic": "問題が発生しました。もう一度お試しください。"
},
"success": {
"title": "Smooth Schedule へようこそ!",
"message": "アカウントが正常に作成されました。",
"yourUrl": "予約URL",
"checkEmail": "確認メールを送信しました。すべての機能を有効にするには、メールを確認してください。",
"goToLogin": "ログインへ"
},
"back": "戻る",
"next": "次へ",
"creating": "アカウント作成中...",
"createAccount": "アカウント作成",
"haveAccount": "すでにアカウントをお持ちですか?",
"signIn": "ログイン"
},
"faq": {
"title": "よくある質問",
"subtitle": "ご質問にお答えします",
"questions": {
"trial": {
"question": "無料トライアルはありますか?",
"answer": "はいすべての有料プランに14日間の無料トライアルが含まれています。開始時にクレジットカードは不要です。"
},
"cancel": {
"question": "いつでも解約できますか?",
"answer": "はい。いつでもキャンセル料なしでサブスクリプションを解約できます。"
},
"payment": {
"question": "どの支払い方法に対応していますか?",
"answer": "Stripe経由でVisa、Mastercard、American Expressなど主要なクレジットカードに対応しています。"
},
"migrate": {
"question": "他のプラットフォームから移行できますか?",
"answer": "はい!他のスケジューリングプラットフォームからの既存データの移行をお手伝いします。"
},
"support": {
"question": "どのようなサポートがありますか?",
"answer": "無料プランはコミュニティサポート、プロフェッショナル以上はメールサポート、ビジネス/エンタープライズは電話サポートが利用可能です。"
},
"customDomain": {
"question": "カスタムドメインはどのように機能しますか?",
"answer": "プロフェッショナル以上のプランでは、サブドメインの代わりに独自のドメインbooking.yourcompany.comを使用できます。"
}
}
},
"about": {
"title": "Smooth Schedule について",
"subtitle": "世界中の企業のスケジューリングをシンプルにすることが私たちの使命です。",
"story": {
"title": "私たちのストーリー",
"content": "Smooth Schedule は「スケジューリングは複雑であるべきではない」というシンプルな信念のもとに設立されました。あらゆる規模の企業が予約、リソース、顧客を簡単に管理できるプラットフォームを構築しました。"
},
"mission": {
"title": "私たちの使命",
"content": "サービスビジネスが成長に必要なツールを提供し、顧客にシームレスな予約体験を提供すること。"
},
"values": {
"title": "私たちの価値観",
"simplicity": {
"title": "シンプルさ",
"description": "パワフルなソフトウェアでも、使いやすさは両立できると信じています。"
},
"reliability": {
"title": "信頼性",
"description": "お客様のビジネスは私たちにかかっています。稼働率に妥協はしません。"
},
"transparency": {
"title": "透明性",
"description": "隠れた費用なし、サプライズなし。見たままの料金です。"
},
"support": {
"title": "サポート",
"description": "お客様の成功のために、あらゆるステップでお手伝いします。"
}
}
},
"contact": {
"title": "お問い合わせ",
"subtitle": "ご質問がありましたらお気軽にどうぞ。",
"form": {
"name": "お名前",
"namePlaceholder": "山田 太郎",
"email": "メールアドレス",
"emailPlaceholder": "you@example.com",
"subject": "件名",
"subjectPlaceholder": "どのようなご用件ですか?",
"message": "メッセージ",
"messagePlaceholder": "ご要望をお聞かせください...",
"submit": "メッセージを送信",
"sending": "送信中...",
"success": "お問い合わせありがとうございます!近日中にご連絡いたします。",
"error": "問題が発生しました。もう一度お試しください。"
},
"info": {
"email": "support@smoothschedule.com",
"phone": "+1 (555) 123-4567",
"address": "123 Schedule Street, San Francisco, CA 94102"
},
"sales": {
"title": "営業へのお問い合わせ",
"description": "エンタープライズプランにご興味がありますか?営業チームがお話しします。"
}
},
"cta": {
"ready": "始める準備はできましたか?",
"readySubtitle": "SmoothScheduleを利用する数千の企業に加わりましょう。",
"startFree": "無料トライアルを開始",
"noCredit": "クレジットカード不要"
},
"footer": {
"product": "製品",
"company": "企業情報",
"legal": "法的情報",
"features": "機能",
"pricing": "料金",
"integrations": "連携",
"about": "会社概要",
"blog": "ブログ",
"careers": "採用情報",
"contact": "お問い合わせ",
"terms": "利用規約",
"privacy": "プライバシー",
"cookies": "Cookie",
"allRightsReserved": "All rights reserved."
}
}
}