# ks_checker（ホテル空室チェッカー）

## 概要
hotenavi.com からホテルの空室・準備中状況をスクレイピングし、一覧表示・グラフ表示するツール。
対象ホテルの空室数・清掃待ち数をリアルタイムに把握する用途。

## Tech Stack
- PHP（mysqli で MySQL 接続）
- Goutte（Symfony BrowserKit / HttpClient / DomCrawler）によるスクレイピング
- Monolog（ログ出力）
- Chart.js（週次グラフ表示）

## ディレクトリ構成
```
ks_checker/
├── config.php           # DB・ホテル・スクレイプ・ログ設定
├── include.php          # 共通関数（getConfig, getLogger, getDbConnection, getHttpBrowser, syncHotelsToDb）
├── view.php             # 一覧画面（List）: 空室・準備中ルーム一覧
├── weekly_view.php      # グラフ画面（Graph）: 曜日×時間帯の平均空室数
├── weekly_availability.php  # JSON API: グラフ用データ取得
├── fetch_status.php     # CLI: 空室・準備中状況のスクレイピング → DB 保存
├── fetch_rooms.php     # CLI: ルーム価格のスクレイピング → DB 保存
├── .htaccess           # アクセス制御（Satisfy Any）
├── logs/               # 日次ログ（YYYYMMDD.log）
└── vendor/             # Composer 依存（Goutte, Monolog, Symfony 系）
```

## データフロー
```
hotenavi.com
    ↓ スクレイピング（fetch_status.php / fetch_rooms.php）
MySQL（hotels, hotel_statuses, room_statuses, rooms）
    ↓ 参照
view.php / weekly_view.php / weekly_availability.php
    ↓ 表示
ブラウザ（一覧・グラフ）
```

## 主要ファイルの責務

| ファイル | 責務 |
|---------|------|
| **config.php** | 環境変数（DB_HOST, DB_NAME, DB_USER, DB_PASS）と hotels 定義。hotels は name, slug, facility_id を持つ |
| **include.php** | 共通関数。DB・ログ・HTTP クライアントの取得、config の hotels を DB に同期 |
| **view.php** | 最新 hotel_statuses を取得し、空室（empty）・準備中（cleanup）を一覧表示。行色は空室数で変化（緑≥3, 黄≥1, 赤=0かつ準備中≥1） |
| **weekly_view.php** | Chart.js で曜日×時間帯の平均空室数を折れ線グラフ表示。hotel_id・range（1w/1m/3m/6m/1y）で絞り込み |
| **weekly_availability.php** | hotel_statuses を集計し JSON 返却。weekly_view.php から fetch される |
| **fetch_status.php** | hotenavi.com/{facility_id}/empty をクロールし、空室・準備中ルーム番号を取得 → hotel_statuses, room_statuses に INSERT |
| **fetch_rooms.php** | hotenavi.com/{facility_id}/room をクロールし、ルーム番号・平日/休日価格を取得 → rooms に INSERT/UPDATE。config に hotels が無い場合は DB の hotels を使用 |

## DB スキーマ（推測）
- **hotels**: id, name, slug, facility_id
- **hotel_statuses**: id, hotel_id, empty_count, cleanup_count, updated_at
- **room_statuses**: id, hotel_status_id, room_number, status（empty/cleanup）, last_entered_at
- **rooms**: hotel_id, room_number, price_weekday, price_holiday, updated_at

## 設定（config.php）
- **db**: host, name, user, pass（環境変数で上書き可）
- **hotels**: name, slug, facility_id（hotenavi.com の施設識別子）
- **scrape**: base_url, sleep_seconds, http_client（verify_peer 等）
- **log**: path（logs/YYYYMMDD.log）, level（warning 等）

## 実行方法
```bash
# 空室・準備中状況の取得（cron 等で定期実行想定）
php fetch_status.php

# ルーム価格の取得
php fetch_rooms.php

# Web 画面
# view.php       → 一覧
# weekly_view.php → グラフ
```

## 共通ルール
- コメント・ドキュメントは**日本語**で記載
- 既存の設計・責務分割・命名規則を尊重する
- 変更は必要最小限に留める
- コミットメッセージは日本語で記述

## 注意事項
- fetch_status.php / fetch_rooms.php は外部サイトへのリクエストを行う。sleep_seconds で間隔を空けている
- facility_id が未設定のホテルはスクレイピング対象外
- fetch_rooms.php は config に hotels がある場合そのまま使用するが、config の hotels には id が無い。DB への INSERT/UPDATE には hotel_id が必要なため、config のみの場合は id 補完（fetch_status.php と同様の dbHotelsByFacility 参照）の追加を検討すること
- ログは logs/ に日次で出力。logs/ ディレクトリの存在・書込権限を要確認
