BAT: 予約・空き状況管理ツール
Unit、Event、State、Bookingの管理基盤を提供する、Drupal向けの汎用的な予約・空き状況管理フレームワーク。
bat
概要
BAT(Booking and Availability Management Tools)は、空き状況管理、予約、予約管理など幅広いユースケースに対応できる基盤を提供するDrupal向けの包括的なフレームワークです。もともとRoomifyによって開発されたBATは、ホテル予約、機材レンタル、予約スケジューリング、リソース管理アプリケーションなどの複雑な予約システムを構築することを可能にします。
このモジュールは、Unit(予約可能なもの)、Event(ユニットに適用される時間ベースの状態)、Booking(特定の期間にユーザーとユニットを紐付ける予約)を中心とした柔軟なEntityベースのアーキテクチャを導入しています。BATは、日・時間・分単位の粒度で状態変更を追跡するための効率的なデータベースストレージ構造を使用しています。
主要なアーキテクチャ機能には、関連するユニットタイプを整理するためのType Group、カスタム状態を持つ設定可能なEvent Type、日単位と時間単位の両方の粒度のサポート、視覚的管理のためのFullCalendar統合、定期的な予約のためのEvent Seriesが含まれます。このモジュールは、PHP関数とhook実装の両方を通じてカスタマイズのための広範なAPIを提供します。
Features
- 部屋、機材、サービスなどの予約可能なリソースを表すカスタマイズ可能なバンドル(Type)を持つUnit Entity管理
- 設定可能な状態とターゲットEntityリファレンスを持つEventシステム。日/時間/分テーブルに空き状況データを効率的に保存
- EventおよびUnitにリンクされた予約を管理するためのBooking Entity
- 関連するユニットタイプを整理・グループ化するためのType Groupシステム
- 視覚的なイベント管理のためのタイムラインとスケジューラービューを備えたFullCalendar統合
- カスタマイズ可能なルールで定期的なイベントを作成するためのEvent Seriesサポート
- 任意のフィールド追加可能なEntityにユニットの空き状況カレンダーを埋め込むためのCalendar Referenceフィールド
- 日単位と時間単位の両方のイベント追跡のための粒度サポート
- バンドルレベルのアクセス制御(自分の/すべての表示/編集/削除)を持つ包括的なパーミッションシステム
- hookベースのカスタマイズによるEntityリストのクエリレベルアクセス制御
- 設定可能な保持期間を持つcronによる自動イベント状態クリーンアップ
- カスタムフィールドハンドラーを持つUnit、Event、BookingのViews統合
- Search APIおよびFacetsモジュール統合によるファセット検索サポート
- BAT Optionsサブモジュールを通じた価格オプションのCommerce統合
- 複雑な空き状況ルールを定義するためのConstraintシステム
Use Cases
ホテル客室予約システム
ルームタイプ(シングル、ダブル、スイート)、個々の客室ユニット、空き状況イベント、ゲスト予約を持つホテル予約システムを作成します。客室分類にはType Bundle、客室カテゴリにはUnit Type、個々の客室にはUnit、空き状況/価格設定にはEvent Type、予約にはBookingを使用します。FullCalendar UIは客室の空き状況の視覚的管理を提供します。
機材レンタル管理
カメラ、工具、車両などのアイテムの機材レンタルシステムを構築します。Type Bundleで機材カテゴリを定義し、Unit Typeで機材モデルを作成し、Unitで個々のアイテムを管理し、Eventでレンタル期間を追跡します。Calendar Referenceフィールドで製品ページに機材の空き状況を表示できます。
予約スケジューリングシステム
医療相談やサロン予約などのサービスの予約システムを作成します。サービス提供者または部屋にはUnit、時間単位の粒度を持つ予約枠にはEvent Type、確定した予約にはBookingを使用します。Event Seriesで定期的な空き状況パターンを処理できます。
施設のリソース予約
会議室、スポーツ施設、イベントスペースの予約を管理します。施設タイプを定義し、予約可能な各スペースのユニットを作成し、日単位と時間単位の両方の予約粒度をサポートするEventで空き状況を追跡します。
バケーションレンタル物件管理
物件タイプ、個々のレンタルユニット、季節料金イベント、メンテナンスブロッキングイベント、ゲスト予約を持つバケーションレンタルプラットフォームを構築します。Type Groupを使用して物件を場所やカテゴリごとに整理し、ファセット検索統合を活用して空き状況フィルタリングを行います。
Tips
- bat_event_get_calendar()関数を使用して複数のユニット全体の空き状況を効率的にクエリできます - カレンダーセットアップをキャッシュしてパフォーマンスを向上させます。
- Event Typeを作成する際は、粒度(日単位 vs 時間単位)がデータベースストレージに影響し、後から簡単に変更できないため、慎重に検討してください。
- 標準のCRUDパーミッションを超えたカスタムアクセス制御ロジックにはhook_bat_entity_access()を実装してください。
- Type Groupを使用して関連するユニットタイプを整理し、より良い管理組織と潜在的に共有設定を実現してください。
- Event Seriesモジュールは、毎週の営業時間や季節ごとの休業などの定期的な空き状況パターンに最適です。
- プレミアムタイムライン/リソースビューを使用する場合は、コンソール警告を避けるためにFullCalendar Schedulerライセンスを適切に設定してください。
- bat_date_range_fields()を使用してカスタムフォームで一貫したペアの日付ピッカーフィールドを作成してください。
- 高トラフィックサイトでは、データベースサイズとcron実行時間のバランスを取るために古いイベントのクリーンアップ設定を調整してください。
Technical Details
Admin Pages 20
/admin/bat
Unit、Event、Booking、Group、設定を含むすべてのBAT管理エリアへのアクセスを提供するメインBAT管理ランディングページ。
/admin/bat/config/date
イベント、検索サマリー、カレンダーポップアップでBAT全体で使用される日付形式を設定します。
/admin/bat/config/bat_event
cron実行中の古いイベントの自動削除の設定を構成します。
/admin/bat/config/fullcalendar
時間範囲、高さ、ビュー、ライセンスを含むFullCalendar表示のグローバル設定を構成します。
/admin/bat/config/maintenance
古いイベントの削除やテーブル整合性の修正を含むBATイベントテーブルのデータベースメンテナンスツール。
/admin/bat/unit
Unit、Type、Type Bundle、Unit Bundleへのアクセスを提供するユニット管理セクション。
/admin/bat/unit/unit
すべてのユニットを一覧表示・管理します。ユニットは個々の予約可能なリソースです。
/admin/bat/unit/unit_type
ユニットタイプを一覧表示・管理します。ユニットタイプは類似のユニット(例:シングルルーム、ダブルルーム)をグループ化します。
/admin/bat/unit/type-bundles
ユニットタイプの構造を定義するType Bundle(設定Entity)を管理します。
/admin/bat/unit/unit-bundles
ユニットの構造を定義するUnit Bundle(設定Entity)を管理します。
/admin/bat/events
Event、Event State、Event Type、Event Seriesへのアクセスを提供するイベント管理セクション。
/admin/bat/events/event
すべてのイベントを一覧表示・管理します。イベントはユニットに適用される時間ベースの状態を表します。
/admin/bat/events/state
イベント状態を管理します。状態はユニットが取りうる条件(例:空き、予約済み、メンテナンス中)を定義します。
/admin/bat/events/event/event-types
イベントタイプを管理します。イベントタイプはイベント(例:空き状況、価格設定)を分類します。
/admin/bat/events/event_series
定期的なイベントのイベントシリーズを一覧表示・管理します。
/admin/bat/booking
予約を管理するための予約管理セクション。
/admin/bat/config/booking
すべての予約を一覧表示・管理します。
/admin/bat/group
関連するユニットタイプを整理するためのType Group管理セクション。
/admin/bat/group/type-group
関連するユニットタイプを整理するためのType Groupを一覧表示・管理します。
/admin/bat/calendar/{unit_type}/{event_type}
特定のユニットタイプとイベントタイプの組み合わせのイベントを一括表示・編集するためのカレンダービュー。BAT Event UIモジュールが必要です。
権限 27
Hooks 6
hook_bat_entity_access
他のアクセスチェックが行われる前に、BAT Entityに対する非表示操作をユーザーが実行することを拒否または許可することをモジュールに許可します。FALSEを返すと拒否、TRUEを返すと許可、何も返さないと通常のパーミッションチェックが行われます。
hook_bat_event_target_entity_types
BAT Eventによって参照され、BATライブラリにUnitとして提供されるEntityタイプをモジュールが定義することを許可します。EntityタイプはgetEventDefaultValue()とformatEventValue()メソッドを実装する必要があります。
hook_bat_event_constraints_info
空き状況をチェックする際に適用されるイベント制約をモジュールが定義することを許可します。
hook_bat_event_constraints_info_alter
定義されたイベント制約をモジュールが変更することを許可します。
hook_bat_facets_search_results_alter
ファセット検索の結果をモジュールが変更することを許可します。
hook_bat_entity_access_OP_condition_ENTITY_TYPE_alter
特定の操作とEntityタイプのEntityアクセスクエリに条件を追加することをモジュールに許可します。
Troubleshooting 5
Event Typeが正しいターゲットEntityタイプ(bat_unit)で適切に設定されていること、およびそのEvent TypeにEvent Stateが存在することを確認してください。FullCalendarモジュールが有効化され、/admin/bat/config/fullcalendarで設定されていることを確認してください。
BATは詳細なパーミッションシステムを使用しています。ユーザーが特定のEntityタイプとバンドルに対する適切な「作成」パーミッションを持っていることを確認してください。/admin/people/permissionsでパーミッションを確認し、bat_unit、bat_event、またはbat_bookingのパーミッションを探してください。
/admin/bat/config/bat_eventで古いイベントの自動クリーンアップを有効化してください。保持日数とcron実行ごとに削除するイベント数を設定します。/admin/bat/config/maintenanceから手動でクリーンアップをトリガーすることもできます。
次のことを確認してください:1)参照されたユニットが存在する、2)選択されたイベントタイプにイベントが存在する、3)フィールドフォーマッターがタイムラインまたは月表示に設定されている、4)過去のデータを表示する場合、ユーザーが「過去のイベント情報を表示」パーミッションを持っている。
Event StateがEvent Typeに対して正しく設定されていることを確認してください。bat_event_get_matching_units()関数はIDではなく状態のマシン名を使用します。検索コードで参照している状態が存在し、正しいEvent Typeに関連付けられていることを確認してください。
Security Notes 5
- BATはhook_query_TAG_alterを通じてクエリレベルのアクセス制御を実装し、ユーザーがリストで表示する権限のあるEntityのみを確実に見えるようにします。
- 「バイパス」パーミッションは、それぞれのEntityタイプに対する他のすべてのアクセスチェックを上書きするため、慎重に付与する必要があります。
- イベントデータはDrupalの標準Entityアクセスを継承しないカスタムテーブル(bat_event_*)に保存されます - カスタムアクセスチェックはbat_entity_access()で実装されています。
- BAT Facetsモジュールはhook_bat_facets_search_results_alterを通じてユーザーパーミッションに基づいて検索結果をフィルタリングします。
- hook_bat_event_constraints_infoを通じてカスタム制約を実装する場合、機密性の高い空き状況データが公開されないようにしてください。