=== Smart Booking ===
Contributors: liberdadeinc
Tags: booking, reservation, appointment, calendar, schedule
Requires at least: 6.0
Tested up to: 7.0
Requires PHP: 7.4
Stable tag: 0.2.2
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

完全無料・多機能のWordPress予約プラグイン。面談・相談型の予約に最適化された、入力→確認→完了の3ステップフロー。

== Description ==

Smart Booking は、人（担当者）に紐づく面談・相談型の予約に特化した、完全無料のWordPress予約プラグインです。弁護士・士業、結婚相談所、整体院・治療院、学習塾・予備校といった業種での利用を想定して設計されています。

= 主な機能 =

* **完全無料・制限なし** — Pro版・有料アドオン・ライセンス認証は一切ありません。すべての機能を無料で利用できます。
* **最短5分で導入** — プラグインを有効化すると、デフォルトの店舗・担当者と3つの基本項目（氏名・メールアドレス・電話番号）が自動作成されます。あとは投稿や固定ページに `[smart_booking]` ショートコードを貼るだけで予約フォームが表示されます。
* **日本の予約フローに最適化** — 「入力 → 確認 → 完了」の3ステップフロー。予約を確定する前に、専用の確認画面で入力内容を見直せます。
* **複数店舗・複数担当者の管理** — 店舗ごと・担当者ごとにスケジュールを管理できます。店舗選択・担当者選択のステップを予約者に表示するかどうかは、有効なレコードの数に応じて自動的に判定されます（1件のみの場合はスキップ）。
* **柔軟なスケジュール設定** — 30分／60分／90分／120分単位の時間枠、枠ごとの予約可能数、曜日パターンによる一括コピー、既存スケジュールの上書きオプションに対応します。
* **カレンダー表示モード** — 日表示（横スクロール）、月表示（カレンダーグリッド）、または両者の切替から選択でき、管理画面で設定できます。
* **カスタムフィールド** — 3つの基本項目（氏名・メールアドレス・電話番号）に加えて、管理者がテキスト・メール・電話番号・テキストエリア・セレクトボックス・ラジオボタン・チェックボックスの項目を追加できます。
* **メール通知** — 予約受付時に予約者と管理者へ自動でメールを送信し、承認時には予約者へ確認メールを送信します。すべてのテンプレートは管理画面で編集できます。
* **デザインカスタマイズ** — ボタン色、日付選択色、時間枠色、必須マーク色、フォーカス色を、すべて管理画面から設定できます。
* **同時予約の競合防止** — 1回のアトミックなSQL UPDATEによって予約可能数を厳密に管理し、複数のユーザーが同時に送信した場合でも二重予約を防止します。
* **Googleタグマネージャー（GTM）連携** — 各予約ステップ（`store_select`、`staff_select`、`date_select`、`time_select`、`form_input`、`confirm`、`complete`）が自動的に `window.dataLayer` へプッシュされます。コードを書かずに、GTM経由でGA4のファネルやGoogle広告のコンバージョンタグを設定できます。なお、GTMコンテナタグ自体は別途サイトへの設置が必要です。
* **WordPress.orgガイドライン準拠** — 外部CDNのスクリプト／スタイル不使用、PHPセッション不使用、全クエリで `$wpdb->prepare()` を使用、全出力をエスケープ、全RESTエンドポイントで nonce ＋ `current_user_can('manage_options')` を検証します。

= 対応する予約フロー =

[店舗選択] → [担当者選択] → [日付選択] → [時間選択] → [フォーム入力] → [確認] → [完了]

店舗選択・担当者選択のステップは、有効な店舗／担当者が複数存在する場合にのみ表示されます。店舗が1つ・担当者が1人の場合、予約者は日付選択から直接始まります。

= 任意の外部連携（デフォルトはオフ） =

以下の外部連携は**デフォルトでオフ**です。管理者が「外部連携」タブで明示的に有効化し、必要な認証情報（APIキー等）を入力した場合にのみ、外部への通信が発生します。

* **Googleカレンダー連携** — 予約受付時にカレンダーへイベントを作成し、キャンセル時にイベントを削除します。
* **ChatWork通知** — 予約受付時に、指定したChatWorkルームへ通知メッセージを投稿します。

詳細は下記の「External services」セクションをご覧ください。

= カスタマイズ・機能リクエスト =

機能リクエストやカスタマイズのご相談は、開発元の [Liberdade Inc.](https://www.liberdade-inc.com/) までお問い合わせいただくか、サービスサイト [wp-smart-booking.com](https://www.wp-smart-booking.com/) をご覧ください。

= ソースコード =

`src/` 配下の非圧縮のJavaScript・CSSソースを含む完全なソースコードは、GitHubで公開しています。

https://github.com/KeisukeYokoyama/SmartBooking

== Installation ==

1. WordPress管理画面の「プラグイン > 新規追加」からプラグインのZIPをアップロードするか、アーカイブを `/wp-content/plugins/smart-booking` に展開します。
2. 「プラグイン」画面から **Smart Booking** を有効化します。
3. 有効化時に、デフォルトの店舗1つ・担当者1人と、3つのカスタムフィールド（氏名・メールアドレス・電話番号）が自動作成されます。
4. 管理画面サイドバーの **Smart Booking** メニューから、店舗・担当者・スケジュール・フォーム項目を設定します。
5. 投稿や固定ページに `[smart_booking]` ショートコードを貼り付けて公開すると、予約フォームが表示されます。

特定の店舗に限定したフォームを表示するには、`store_id` 属性を指定します（例: `[smart_booking store_id="1"]`）。

== Frequently Asked Questions ==

= 本当に完全無料ですか？ =

はい。Pro版・有料アドオン・ライセンス認証は一切ありません。すべての機能を無料でご利用いただけます。

= デフォルトの状態で外部への通信は発生しますか？ =

いいえ。初期状態では、Smart Booking はいかなる外部サービスにも接続しません。Googleカレンダー連携とChatWork通知は、管理者が「外部連携」タブで明示的に有効化し、必要なAPI認証情報を入力した場合にのみデータを送信します。

= 予約フォームはスマートフォンに対応していますか？ =

はい。フロントの予約フォーム、確認画面、完了画面はすべてレスポンシブ対応で、スマートフォン幅（375px）はもちろん、タブレット・デスクトップでの動作も確認済みです。

= 複数の予約者が同じ時間枠を同時に予約しようとした場合はどうなりますか？ =

予約可能数は1回のアトミックなSQL UPDATE文で管理されるため、枠の定員を超える予約は受け付けられません。ページ読み込みから送信までの間に枠が埋まった場合、予約は成立せず、ユーザーにはエラーメッセージが表示されます。

= 毎週の繰り返しスケジュールを一括で設定できますか？ =

はい。スケジュール管理画面で「スケジュールをコピー」→「パターン」を選び、曜日（日〜土）と期間を指定すると、該当するすべての日付にスケジュールが複製されます。既存スケジュールを上書きするかどうかも選択できます。

= 予約者は自分で予約をキャンセルできますか？ =

v1では、予約者側からのキャンセル機能はありません。電話やメールでキャンセルの連絡を受けた後、管理画面の予約一覧からステータスを「キャンセル」に変更してください。

= 予約フォームに項目を追加できますか？ =

はい。「フォーム設定」画面から、テキスト・メール・電話番号・テキストエリア・セレクトボックス・ラジオボタン・チェックボックスの各種項目を追加・並び替え・削除できます。

= 予約一覧をエクスポートできますか？ =

はい。予約一覧画面の「CSVエクスポート」ボタンから、現在絞り込んでいる予約をCSVファイルとしてダウンロードできます。

= プラグインを削除するとデータはどうなりますか？ =

WordPressの「削除」操作を実行すると、Smart Booking が作成した6つのカスタムテーブルと、すべてのオプションが削除されます。データを残したい場合は、プラグインを「削除」せず「停止」のみにしてください。

== Screenshots ==

1. フロントの予約フォーム（デスクトップ。横スクロールの日付ピッカー＋時間枠選択）
2. 管理画面 — スケジュール管理（月カレンダー＋スケジュールリスト）
3. 管理画面 — 予約一覧（フィルタ＋ステータス管理＋CSVエクスポート）
4. 管理画面 — フォーム設定（フィールドタイプカード＋フィールド一覧）

== External services ==

このプラグインは以下の外部サービスと通信する場合があります。**いずれもデフォルトはオフ**であり、管理者が「設定 > 外部連携」タブで明示的に連携を有効化し、必要な認証情報を入力した場合にのみ、外部への通信が発生します。

= Google Calendar API =

* **エンドポイント**: `https://www.googleapis.com/calendar/v3/`
* **目的**: 予約受付時にGoogleカレンダーのイベントを作成し、予約キャンセル時にイベントを削除します。
* **送信データ**: 予約日時、予約者名、店舗名、担当者名、予約番号。
* **タイミング**: 予約受付時（イベント作成）／予約キャンセル時（イベント削除）。
* **認証方式**: サービスアカウントのJSONキー（管理者が設定画面でアップロード）。
* **デフォルト**: オフ
* **利用規約**: [Google APIs Terms of Service](https://developers.google.com/terms)
* **プライバシーポリシー**: [Google Privacy Policy](https://policies.google.com/privacy)

= ChatWork API =

* **エンドポイント**: `https://api.chatwork.com/v2/`
* **目的**: 予約受付時に、指定したChatWorkルームへ通知メッセージを投稿します。
* **送信データ**: 予約者名、予約日時、店舗名、担当者名、予約番号。
* **タイミング**: 予約者が予約フォームを送信した直後。
* **認証方式**: APIトークン（管理者が設定画面で入力）。
* **デフォルト**: オフ
* **利用規約**: [ChatWork Terms of Service](https://go.chatwork.com/ja/terms/)
* **プライバシーポリシー**: [ChatWork Privacy Policy](https://www.kubell.com/privacy/)

いずれの連携も有効化されていない場合、Smart Booking は外部サービスへの通信を一切行いません。

== Changelog ==

= 0.2.2 - 2026-06-24 =
* 変更: WordPress.orgのレビューで指摘されたプレフィックスの一貫性に対応するため、データベースのプレフィックスを `smart_booking_` に統一しました（従来は `smart_booking_` と `smabo_` が混在）。

= 0.2.1 - 2026-06-22 =
* 修正: readme.txt 内のChatWork URL（利用規約・プライバシーページ）を訂正しました。
* 改善: 配布パッケージから開発用ファイル（assets/）を除外しました。
* 追加: readme.txt にソースコードリポジトリのURLを記載しました。
* 改善: 他のプラグインへの影響を避けるため、uninstall.php でLIKEのワイルドカードを使わず、明示的なオプションリストを使用するようにしました。
* 変更: WordPress.orgの4文字プレフィックス要件を満たすため、データベースのプレフィックスを `smb_` から `smabo_` に変更しました。

= 0.2.0 =
* 予約フォーム、確認画面、完了画面のフロントUIを刷新しました。
* 店舗選択・担当者選択のカードレイアウトを改善しました（カード高さの統一、カード全体のクリック対応、ホバー状態）。
* 店舗・担当者を選択した後、その内容を保持して表示する「選択情報」バーを追加しました。
* 日付・時間枠選択の背景色のリグレッションを修正しました（選択状態が設定した色を正しく反映するようになりました）。
* レスポンシブ対応とE2Eテストスイートを拡充しました（ピッカー検証、確認・完了画面、レスポンシブレイアウト）。
* Googleカレンダー連携からデバッグログを削除しました。
* 各予約ステップ（`store_select`、`staff_select`、`date_select`、`time_select`、`form_input`、`confirm`、`complete`）にGoogleタグマネージャー（GTM）のdataLayerイベントを追加し、GTM経由でGA4ファネルやGoogle広告のコンバージョンタグを設定できるようにしました。

= 0.1.0 =
* 初回リリース。
* 予約フォーム、店舗・担当者管理、スケジュール管理、予約一覧、フォーム設定、5タブ構成の設定画面。
* メール通知（予約受付・予約承認）。
* 任意のGoogleカレンダー連携（デフォルトはオフ）。
* 任意のChatWork通知（デフォルトはオフ）。

== Upgrade Notice ==

= 0.2.0 =
フロント予約フローのUI刷新とバグ修正。データベースのマイグレーションは不要です。

= 0.1.0 =
初回リリース。
