=== Shed Booking ===
Contributors: wpshed
Tags: booking, reservation, calendar
Requires at least: 6.0
Tested up to: 7.1
Requires PHP: 8.1
Stable tag: 0.9.12
License: GPL-2.0-or-later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

予約対象を期間だけ押さえる汎用の予約・レンタル管理プラグイン（開発中）。

== Description ==

時間枠の予約や物品レンタルなど、「予約対象をある期間だけ押さえる」仕組みを1つのプラグインで扱う。

現在Milestone 1（プラグイン基盤・予約対象の管理画面）まで実装済み。予約の受付・カレンダー表示・通知・Zoom連携は今後のバージョンで追加する。

カスタマイズが必要な場合は [カスタム依頼](https://wpshed.jp/custom/) をご利用ください。

== Installation ==

1. ZIPファイルをダウンロード
2. WordPress管理画面 → プラグイン → 新規追加 → プラグインのアップロード
3. ZIPファイルを選択してインストール
4. 有効化

== Frequently Asked Questions ==

= 動作確認済みのWordPressバージョンは？ =

readme.txt の「Tested up to」をご確認ください。

= 商用利用できますか？ =

はい、GPL-2.0-or-later のもとで、無料で商用利用できます。

= カスタマイズしたい場合は？ =

[カスタム依頼ページ](https://wpshed.jp/custom/) からご相談ください。

== Changelog ==

= 0.9.12 =
* WordPress.org公開の準備として、画面の文言をすべて英語の原文＋翻訳ファイルに変更（日本語訳は languages フォルダーに同梱）。翻訳用の shed-booking.pot とGPLライセンス全文（LICENSE）を追加
* 通知文面の差し込みタグ名を英語に変更（例: {reservation_number}・{cancel_url}・{zoom_info}）。以前の日本語のタグ名で保存した文面は、そのまま使え、自動的に新しいタグ名へ変換される
* メール・予約ページの日付表記を、サイトの言語に合わせるように変更
* Googleチャットの Webhook を https のURLだけに限定し、安全なHTTP関数で送信するように変更。日時の入力を厳密に検証し、利用可能時間は保存時に形式を確認する
* 公開の予約フォームの乱用対策: IPアドレスごと・メールアドレスごとに1時間あたりの回数を制限（フィルター `shedbook_rate_limit` で変更可能）。人には見えない隠し欄で自動入力を拒否。二重予約の警告で他の予約のIDなどを返さないようにし、公開APIは予約画面に必要な項目だけを返す。カレンダー取得は最大70日・有効な対象のみ
* 設定 > プライバシー のプライバシーポリシー案に、このプラグインが保存する個人データの説明を追加
* Zoomのホストキーを暗号化して保存し、設定画面には再表示しないように変更（空欄のままなら保持）。旧バージョンで保存済みのホストキーは、更新時に自動で暗号化される
* プラグイン削除時に、Zoom関連のテーブル・同期状況・メール失敗の記録・予備の暗号鍵・定期同期の予定も削除するように変更

= 0.9.11 =
* 予約一覧に「修正」を追加。予約者から氏名・メールアドレスの入力間違いの連絡があった場合に、管理者が修正できる。メールアドレスを変更するときは、取消・確認のリンクを新しく発行して以前のメールのリンク（誤って別の人に届いたものを含む）を無効にでき、修正後の内容で確認メールを送り直せる。日時・対象・会議名は変更できない

= 0.9.10 =
* Plugin Check の警告に対応: Googleチャット Webhook のテスト送信の入力処理を調整（動作の変更なし）

= 0.9.9 =
* 通知先メールアドレスを、TO と CC に対応（それぞれ複数可・カンマ区切り。テスト送信は両方に送る）。画面・メールの「事務所」「事務局」の名称をやめ、「通知先」「担当者」に変更

= 0.9.8 =
* 予約対象の編集画面に、Zoomの「Server-to-Server OAuthアプリ」の作成手順（認証情報の取得・必要な権限スコープ・有効化・この画面での入力と接続テスト）を、1から順番に記載

= 0.9.7 =
* Plugin Check の指摘に対応: ライセンスを GPL-2.0-or-later に変更、readme.txt を英語に変更（日本語版は readme-ja.txt として保持）、テスト送信の入力処理を厳格化（動作の変更なし）

= 0.9.6 =
* 通知メール・Googleチャットの文面を設定画面で編集できるように（予約確定・取消 × 予約者宛て・事務所宛て・チャットの6種類）。差し込みタグ、標準の文面に戻す、プレビューに対応。取消URLとZoom情報は、入れ忘れても自動で付く。チャットでは個人情報のタグは使えない

= 0.9.5 =
* 設定画面の事務所通知先メールとGoogleチャットWebhook URLに「テスト送信」ボタンを追加（入力中の値で、テストと分かる文面を1件だけ送信。予約データには触れない）

= 0.9.4 =
* スマートフォンの日表示を再設計: 予約対象を1つずつ表示（対象の切り替えボタン付き）、内側スクロールをやめてページ全体でスクロール、1行の高さを32px以上に確保、ボタン・入力欄を44px以上／16px文字に、選択した時間帯と「予約内容を入力」ボタンを画面下に固定表示

= 0.9.3 =
* Plugin Check の指摘に対応（動作の変更なし）: 存在しない languages フォルダーを指していた Domain Path ヘッダーを削除。読み取り専用の管理画面パラメータ・動的に組み立てるSQL・nonce検証済みの入力処理について、理由つきの phpcs:ignore／disable を整理。未使用の変数を削除

= 0.9.2 =
* 管理画面の予約一覧: 検索（予約番号・代表者名・メールアドレス）と期間（開始日〜終了日）の絞り込み、件数サマリ（予約中／取消済み／要対応）、状態のバッジ表示を追加。Zoomミーティングを発行できていない予約に「Zoom未発行」、通知メールの送信処理が失敗した予約に警告を表示。Zoom削除失敗の技術的な詳細は、小さく補足表示に変更
* Zoom予定の同期が60分以上行われていない、または失敗している場合に、管理画面上部に警告を表示（設定画面の同期表にも「60分以上更新されていません」を表示）
* 通知メールの送信失敗（wp_mail()の失敗）を予約ごとに記録。「メール再送」が成功すると記録が消える（受信箱への到達までは判定できない）
* 予約対象の編集画面: Zoom連携の認証情報を折りたたみ表示に変更（未登録・入力エラー時は開く）
* 用語の変更: 「バッファー」→「予約前後の準備時間」、「同一代表者の二重予約」→「同じメールアドレスでの重複予約」、「同時に貸せる数」→「同時予約可能数」、「休業にする」→「終日予約不可」、状態「有効」→「予約受付中」
* 「Zoom未発行」の判定を、Zoom連携を登録した後に確定した、未終了の予約に限定

= 0.9.1 =
* 予約カレンダーの日表示で、Zoom側の予定の表示を「ウェビナー」から「Zoom予約済み」に変更（実際の予定種別がウェビナーとは限らないため）
* スマートフォンで、日表示のヘッダー（月表示に戻る／今日／前日／翌日）のボタンの文字が折り返して縦に割れる問題を修正。「予約する」「取り消す」ボタンを押しやすい大きさに変更
* 予約内容の確認・取消画面で、Zoom連携の予約には「この予約を取り消すと、Zoomミーティングも削除されます」を表示
* 予約完了画面に、メールが届かない場合の案内（迷惑メールフォルダの確認、事務局への問い合わせ）を追加
* Zoom連携の予約対象で、Zoomミーティングを発行できなかった場合に、完了画面と確認メールに「Zoomミーティングの情報は、準備でき次第、事務局からご連絡します」を表示

= 0.9.0 =
* 予約一覧の「メール再送」で、取消URLを変えずに再送できるように変更。取消トークンを、予約ごとの乱数の種と鍵（SHEDBOOK_ENCRYPTION_KEY／AUTH_SALT）からHMACで導出する方式にした（トークン自体はDBに保存しない。DBだけが流出しても取消URLは再現できない）。この版より前に作られた予約は、初回の再送でのみ取消URLが新しくなる（以前のメールのURLは使えなくなる）。再送前の確認ダイアログで、どちらになるかを表示する
* 取消済み・存在しない・無効な取消URLにアクセスしたときに、予約カレンダーへ自動で移動する動作（v0.8.23）を廃止し、「この予約は取り消し済み、または見つかりませんでした…」と状況を表示して、「予約カレンダーへ移動」ボタンを出すように変更

= 0.8.24 =
* 設定画面に「鍵を生成」を追加。Zoom連携のClient Secretの暗号鍵（SHEDBOOK_ENCRYPTION_KEY）を、ブラウザ内で乱数から作り、wp-config.phpに貼り付ける1行をコピーボタン付きで表示する（鍵はサーバーへ送らず、保存もしない）。貼り付け後は、登録済みのClient Secretが自動で新しい鍵に切り替わる

= 0.8.23 =
* 予約内容の確認・取消の画面（取消完了・見つからない画面を含む）に、「予約カレンダーへ移動」ボタンを追加
* 管理画面の予約一覧で、Zoomで直接作成された予定（取り込み）には「取消」を表示しないように変更（Zoom側で変更する旨を表示。サーバー側でも取消を受け付けない）
* 事務所宛の予約通知メールにも、Zoomの参加URL・ミーティングID・パスコードを記載
* 予約者宛の確認メールに、「予約内容を変更する場合は、一度この予約を取り消してから、あらためて予約してください」の案内を追加
* 取消済み・存在しない取消URLにアクセスした場合、予約カレンダーのページへ自動で移動し、「この予約は取り消し済み、または見つかりませんでした」と案内するように変更

= 0.8.22 =
* 予約の取消でZoomミーティングの削除に失敗した場合に、15分ごとの同期で自動的に再試行するように変更（取消時を含めて最大4回）。4回目も失敗したら事務所へメールで通知（1回のみ）し、参加URL・ミーティングIDを知らせて手動削除を依頼する
* 管理画面の予約一覧の取消済みの行に、Zoomミーティングの削除状況（再試行中／要手動削除）を表示。設定画面の「今すぐ同期」では、上限に達したものも再試行する（Zoomで手動削除した後に実行すると記録が整理される）
* 削除失敗の理由にHTTPステータスとZoomのメッセージを含めるように変更

= 0.8.21 =
* 予約を取り消してZoomのミーティングを削除したとき、システム内に残っていたZoomの参加URL・ミーティングID・パスコードも削除するように変更（Zoom側の削除に失敗した場合は、ミーティングが残っているため記録を残す）
* 管理画面の予約一覧で、取消済みの予約にはZoom情報を表示しないように変更

= 0.8.20 =
* 予約内容の確認・取消画面に、「予約内容を変更する場合は、一度この予約を取り消してから、あらためて予約してください。」の案内を追加

= 0.8.19 =
* Zoomミーティングのパスコードが保存されていない予約（v0.8.13以前に発行したもの）について、Zoomから読み取って補完するように変更（15分ごとの同期・今すぐ同期の最後に、1回あたり最大20件。読み取りのみ）
* ミーティング発行の応答にパスコードが含まれない場合は、読み取りで補うように変更

= 0.8.18 =
* 不具合修正: Zoomから取り込んだ予定が、終了後の同期で「取消済み」に変わってしまう問題を修正。終了済みの取り込み予定は、同期で取消扱いにせず、予約の実績として残す

= 0.8.17 =
* 不具合修正: v0.8.14〜v0.8.16で、Zoom予定の同期（15分ごとの自動同期・手動同期・初回同期）と、同期状況の表示（設定画面・予約対象の編集画面）が致命的エラーになっていた問題を修正（同期状況の保存名の定義が抜けていた）
* Zoomミーティングの詳細（アジェンダ）に、予約番号と予約のUID（shedbook:サイト識別子:予約ID）を記載するように変更。Zoom側の画面から、どの予約のミーティングか判別できる。個人情報は含めない
* Zoomとの同期で、詳細にこのサイトのUIDがあり対応する予約が実在するミーティングは、記録が失われていても自分の予約として扱う（古いバックアップの復元後などに、自分の予約が外部予定として重複して取り込まれるのを防ぐ）。他サイトのUID・UIDなし・対応する予約が無いものは、これまでどおり外部予定として枠をふさぐ

= 0.8.16 =
* 管理画面の予約一覧に「メール再送」を追加。予約者へ確認メール（Zoomの参加URL・ミーティングID・パスコードを含む）を再送できる。取消リンクは新しいものに置き換わり、以前のメールのリンクは使えなくなる
* メールの取消リンクから開く画面を「予約内容の確認・取消」に変更し、予約番号・日時・会議名・詳細・代表者・Zoomの参加URL・ミーティングID・パスコードを表示（取消もこの画面から行える）

= 0.8.15 =
* 管理画面の予約一覧に「予約番号」の列を追加（メール・完了画面の予約番号と照合できる）
* 予約一覧で、Zoom連携の予約に参加URL・ミーティングID・パスコードを表示
* Zoom連携の予約を取り消すときの確認文に、Zoomのミーティングも削除される旨を追記

= 0.8.14 =
* 予約完了画面に、予約時の情報（予約番号・対象・日時・会議名・詳細・代表者氏名・メールアドレス）を一覧表示。Zoom連携の対象では、参加URL・ミーティングID・パスコードも表示
* 予約確定メール（代表者宛）にも、代表者氏名・メールアドレス、Zoomの参加URL・ミーティングID・パスコードを記載（Zoomのパスコードは今回から保存。過去の予約には含まれない場合がある）

= 0.8.13 =
* 日表示のタイムラインで、時間の刻み（5〜60分）を変えても1時間分の高さが一定になるように変更（刻みに応じて1行の高さを割り振る。これまでは刻みごとに行の高さが固定で、1時間の高さがばらついていた）

= 0.8.12 =
* 設定画面に「時間の刻み」を追加（5・10・15・20・30・60分から選択。標準は15分）。予約ページのカレンダーの行の間隔、時刻入力の刻み、サーバー側の検証に反映。既存の予約は変更されない

= 0.8.11 =
* 予約ページを開いたまま長時間放置し、署名の自動更新もできなかった場合（パスワード認証の期限切れ等）に、「ページの有効期限が切れました」と表示するだけでなく、ページを自動で読み込み直すように変更（入力途中のフォームがある場合は内容が消えるため再読み込みしない。30秒以内の再実行もしない）

= 0.8.10 =
* 予約完了画面で、予約対象の凡例（色の一覧）と「色のついた時間・印は予約済みです…」の説明文を表示しないように変更

= 0.8.9 =
* 予約対象の編集画面のZoom連携で、「Account ID」などのラベルが折り返して表示される問題を修正（Zoom連携専用のスタイルに分離）

= 0.8.8 =
* Zoom連携のClient Secretの暗号鍵を、wp-config.phpに定義する専用定数 SHEDBOOK_ENCRYPTION_KEY（32文字以上）から導出できるように変更（未定義の場合は従来どおりAUTH_SALTを使用）。ソルトを再生成しても、別サーバーへ移行しても、同じ定数を引き継げばZoom設定を再入力せずに済む
* 暗号形式をv2に更新。予約対象ごとに鍵を導出し、認証データに予約対象IDを含めるため、暗号文を別の行へコピーしても復号できない。旧形式（v0.8.7まで）の設定は読み取り互換で、定数の設定後に管理画面を開くと自動で新形式へ移行する
* Client Secretを復号できない場合の可視化: 管理画面上部の警告、設定画面の同期状況への失敗記録、予約確定時に事務所へ手動発行を依頼するメール通知（これまでは黙って動かなくなっていた）
* 暗号鍵の出どころの表示と警告（AUTH_SALT・DB保存の場合に定数の設定を案内）
* 復号できない登録に新しいClient Secretを入力しても保存されない不具合を修正

= 0.8.7 =
* Zoom連携を初めて登録したときに、15分のCRONを待たずにその場で既存のZoom予定を取り込むように変更
* 設定画面に「Zoom予定の同期」を追加。予約対象ごとのホストユーザー・最終同期日時・結果を表示し、「今すぐ同期」ボタンで手動同期できるように変更（読み取りのみ）
* 予約対象一覧のZoom連携欄に、登録済みのホストユーザー（メールアドレス）を表示。編集画面には最終同期の結果を表示
* 同期の不具合修正: ミーティングが100件を超えると取り込み済みの予定が誤って取消扱いになる問題を、全ページ取得に対応して解消。Zoomからの取得に失敗した場合は、既存の取り込み結果を変更しないように変更
* 終了済みのZoom予定は取り込まないように変更

= 0.8.6 =
* Zoom連携の入力不備（連携チェック漏れ・ID未入力・ホストユーザー未入力・Client Secret未入力）を、保存ボタンを押した時点で画面上に表示して送信を止めるように変更（これまでは保存後に画面が戻り、入力値が消えていた）

= 0.8.5 =
* Zoom連携の接続テストで、アカウント内のユーザーを一覧表示し、選択したユーザーを「ホストユーザー」欄へ入力できるように変更（読み取りのみ。一覧の取得にはZoomアプリへのユーザー読み取り権限スコープの追加が必要で、不足時は不足スコープ名を表示）
* 接続テストを保存前の入力値でも実行できるように変更（Client Secretが空欄なら保存済みの値を使用）
* Zoom連携を有効にして保存する際、ホストユーザーを必須に変更

= 0.8.4 =
* 予約対象の編集画面に、Zoom連携の「接続テスト」ボタンを追加。保存済みの認証情報で、アクセストークン取得とホストユーザーのミーティング一覧の読み取り（1件）のみを行い、Zoom側のデータは作成・変更・削除しない。失敗時は原因の段階（認証／ホストユーザー・スコープ）とZoomのエラー理由を表示
* ZoomのOAuthエラー（reason/error形式）の理由を表示できるように修正

= 0.8.3 =
* Zoom連携の設定保存を改善。「連携する」にチェックを入れずに入力して保存すると入力が黙って破棄されていた問題を修正し、警告を表示して既存設定も消さないように変更。必須項目の不足や保存失敗も画面に表示するように変更
* 予約対象の一覧と編集画面に、Zoom連携の登録状況（登録済み・Account ID・ホスト）を表示

= 0.8.2 =
* 予約ページを開いたまま長時間放置すると「予約できませんでした」と表示される問題を修正。APIアクセス用の署名を期限前と期限切れ時に自動で更新し、再試行するように変更（パスワード保護ページの認証が切れている場合は、再読み込みを案内するメッセージを表示）

= 0.8.1 =
* Zoom連携に「ホストユーザー」設定を追加。同一Zoomアカウントに複数ユーザーがいる場合に、ミーティングを作成・一覧取得するユーザー（メールアドレスまたはユーザーID）を指定できるように変更（未設定時はこれまでどおり`me`）

= 0.8.0 =
* Zoom連携アドオンを追加（Server-to-Server OAuth）。予約対象ごとにZoomアカウントの認証情報を登録でき、予約確定時に自動でZoomミーティングを発行・確認メールへ参加URLを記載、取消時に自動削除。15分おきのCRON同期でZoom側の直接予定も取り込み、予約確定直前のライブ空き確認にも対応（docs/shed-booking/design.md §11参照）
* Client Secret等の認証情報はXChaCha20-Poly1305による暗号化のうえDBに保存
* （内部）カレンダー表示時に外部連携フィルタをライブ呼び出ししていた実装を、WP-Cron同期済みデータを読むだけの設計どおりの形に修正

= 0.7.4 =
* 日表示のタイムラインで、予約対象が多く横スクロールが必要な場合に、上側にも横スクロールバーを表示するように変更（これまで下端までスクロールしないと横スクロールバーが見えなかったため）

= 0.7.3 =
* 日表示のタイムラインで、予約対象の数が多い場合に各列（対象名・予約ラベル）が折り返して潰れていたのを修正。1行表示を保ったまま横スクロールするように変更

= 0.7.2 =
* 管理画面の「利用可能時間帯」「特定日の例外」テーブルが横に間延びして表示されていたのを修正（列幅を固定し、コンパクトな表示に変更）

= 0.7.1 =
* 月表示で、「特定日の例外」で休業(終日利用不可)に設定した日に、対象名入りの「受付停止」表示をするように変更(休業日が月カレンダー上で把握できるように)

= 0.7.0 =
* 予約対象に「特定日の例外」を追加。祝日などの個別休業や、通常時間外の特別営業（例: 普段休みの曜日・時間外をその日だけ利用可能にする）を、曜日ごとの設定より優先して日付単位で指定できます

= 0.6.2 =
* 予約対象の「利用可能時間帯」設定を、JSON直接入力から曜日ごとのチェック+開始・終了時刻によるシンプル設定に変更

= 0.6.1 =
* 管理画面の設定に「週の始まり」(日曜日始まり/月曜日始まり)を追加。デフォルトは日曜日始まり

= 0.6.0 =
* 月表示・日表示に「今日」ボタンを追加(クリックで現在の月/日へ戻る)
* 月表示で、今日の日付を円で囲んで強調表示するように変更(Googleカレンダー風)

= 0.5.3 =
* 日表示のタイムラインに、30分位置(0:30, 1:30…)の区切り線を薄い色で追加(正時の線とは濃さを変えて区別)

= 0.5.2 =
* 日表示のタイムラインに、データ取得中の「読み込み中…」表示を追加(空欄のまま表示され「予約が無い」と誤解されるのを防止)

= 0.5.1 =
* 日表示で、カレンダーのデータ読み込み完了後に右の入力フォームより高さが長くなっていたのを修正(flexboxのstretchがコンテナ高さauto時に効かない問題のため、CSS Gridに変更)

= 0.5.0 =
* 日表示に前日・翌日ボタンを追加
* 月表示・日表示のURLに日付/月を反映し、特定の日・月を直接開けるリンクとして共有できるように対応

= 0.4.2 =
* 日表示で、カレンダー(タイムライン)と右側の入力フォームの高さが揃っていなかったのを修正(幅だけでなく高さも一致するように)

= 0.4.1 =
* 日表示で、カレンダー(タイムライン)と右側の入力フォームの幅が揃っていなかったのを修正

= 0.4.0 =
* 予約フォームに任意入力の「詳細・利用目的」欄を追加（会議名とは別に、議題やメモなどを記入できる。Zoom・Googleカレンダーのタイトル/説明分離にならった構成）。管理画面の予約一覧・通知メールにも表示

= 0.3.0 =
* 管理画面に「予約一覧」画面を追加（日時・対象・代表者・状態の一覧表示、絞り込み、取消操作）

= 0.2.4 =
* 日表示タイムラインで、時刻ラベルのある行だけ高さが変わって見える不具合を修正（全行の高さを統一）

= 0.2.3 =
* 時間の区切り線が行ごとに高さがずれて見える不具合を修正（枠線の確保を常時1pxに統一）

= 0.2.2 =
* 日表示のタイムラインの罫線を調整（時間の区切り線は通常の太さに、30分ごとの区切り線は非表示に）

= 0.2.1 =
* 日表示のタイムラインに、0:00・1:00…など各時間の開始位置を示す線を追加

= 0.2.0 =
* UI・操作性レビューで見つかった問題をまとめて修正（プレーンパーマリンク対応、capacity/バッファーを加味した空き状況表示、PCドラッグの双方向対応、通知メール文面の改善など）

= 0.1.0 =
* Milestone 1: プラグイン基盤・予約対象の管理画面（一覧・追加・編集・アーカイブ）を実装
