# Create Demo Hotel Order Command 使用說明

## 指令名稱

```bash
php artisan hotel:create-demo-order
```

## 功能說明

建立 demo 用訂單資料（**互動式流程**）：
- **互動式選擇會員**：從該 merchant 下的前 5 個會員中選擇，或建立新會員
- **互動式選擇寵物**：從該會員的寵物中選擇（可多選），不足 3 隻時自動新增
- 以今天為起始日，隨機建立 1-3 日的住宿訂單
- 可指定訂單狀態（待確認 PENDING 或已確認 CONFIRMED）

## 基本語法

```bash
php artisan hotel:create-demo-order [room_id] [選項]
```

## 參數說明

### 可選參數

- `room_id` - 房間 ID（可選）
  - 如果未提供，command 會互動式詢問
  - 必須是資料庫中存在的房間 ID
  - 房間必須有關聯的房型

## 選項說明

### `--status` (選填)
- **預設值**: `PENDING`
- **可用值**: 
  - `PENDING` - 待確認（保留訂單，會有保留時間）
  - `CONFIRMED` - 已確認（不會有保留時間）
- **範例**: `--status=CONFIRMED`

### `--created_by` (選填)
- **預設值**: `1`
- **說明**: 建立者 ID
- **範例**: `--created_by=2`

### 其他 Laravel 標準選項

- `-h, --help` - 顯示幫助訊息
- `-q, --quiet` - 不輸出任何訊息
- `-v, -vv, -vvv` - 增加詳細程度（用於查看錯誤詳情）
- `-n, --no-interaction` - 不詢問任何互動問題

## 使用範例

### 1. 互動式流程（不提供 room_id）

```bash
# 在 Docker 容器中執行，會逐步詢問
docker exec dingsomething-php-fpm php artisan hotel:create-demo-order
```

### 2. 提供房間 ID（仍會互動式選擇會員和寵物）

```bash
docker exec dingsomething-php-fpm php artisan hotel:create-demo-order 1
```

### 3. 建立已確認訂單

```bash
docker exec dingsomething-php-fpm php artisan hotel:create-demo-order 1 --status=CONFIRMED
```

### 4. 指定建立者 ID

```bash
docker exec dingsomething-php-fpm php artisan hotel:create-demo-order 1 --status=PENDING --created_by=2
```

### 5. 查看詳細錯誤資訊

```bash
docker exec dingsomething-php-fpm php artisan hotel:create-demo-order 1 -v
```

### 6. 查看幫助

```bash
docker exec dingsomething-php-fpm php artisan hotel:create-demo-order --help
```

## 執行流程（互動式）

1. **輸入房間 ID** - 如果未提供，會詢問用戶輸入
2. **驗證參數** - 檢查房間 ID 和狀態是否有效
3. **取得房間資料** - 載入房間和房型資訊，顯示房間資訊
4. **檢查價格設定** - 如果房型沒有價格，自動建立預設價格
5. **選擇會員**（互動式）
   - 查詢該 merchant 下的前 5 個會員
   - 顯示會員列表供選擇
   - 可選擇「建立新會員」
6. **確保寵物數量**（自動）
   - 查詢該會員下的寵物
   - 如果不足 3 隻（但不超過 maxPets），自動隨機新增
7. **選擇寵物**（互動式，可多選）
   - 顯示寵物列表
   - 可輸入多個編號（用逗號分隔，例如：`1,2,3`）
   - 最多可選擇 `maxPets` 隻
   - 輸入 `0` 或空白完成選擇
8. **產生訂單日期** - 以今天為起始日，隨機選擇 1-3 天
9. **建立訂單** - 使用 `CreateHotelOrder` action 建立完整訂單

## 輸出範例

### 互動式執行流程

```
請輸入房間 ID: 1

房間資訊:
  - 房間ID: 1
  - 房間號碼: 101
  - 房型: 標準房
  - 最大寵物數: 2
  - 商家ID: xxx-xxx-xxx

使用現有價格設定 (sizeId: 1, price: 1500)

請選擇會員:
  1. 王小明 (+886-912345678)
  2. 李小華 (+886-923456789)
  3. 張小美 (+886-934567890)
  4. 建立新會員
請選擇 [4]: 1

已選擇會員: 王小明 (+886-912345678)

該會員只有 1 隻寵物，自動新增 2 隻...

請選擇寵物（可多選，最多 2 隻）:
  1. 球球 (黃金獵犬)
  2. 小白 (拉布拉多)
  3. 小黑 (柴犬)
請輸入寵物編號（可輸入多個編號，用逗號分隔，例如: 1,2,3，或輸入 0 完成選擇）: 1,2
已選擇: 球球
已選擇: 小白

已選擇 2 隻寵物: 球球, 小白

訂單資訊:
  - 入住日期: 2026-01-19
  - 退房日期: 2026-01-21
  - 住宿天數: 2
  - 訂單狀態: PENDING

訂單建立成功！
  - 訂單ID: xxx-xxx-xxx
  - 顯示編號: HOT-20260119-001
  - 容器UUID: xxx-xxx-xxx
  - 價格: 3000.00
  - 總金額: 3000.00
  - 寵物數量: 2
  - 預約天數: 2
```

### 當房型沒有價格時

```
警告: 房型沒有設定價格，將使用預設價格
已建立預設價格 (sizeId: 1, basePrice: 1500, extraPrice: 500)
```

## 錯誤處理

### 常見錯誤

#### 1. 找不到房間

```
找不到房間 ID: 999
```

**解決方法**: 確認房間 ID 是否正確，或先建立房間資料

#### 2. 無效的狀態

```
狀態必須是 PENDING 或 CONFIRMED
```

**解決方法**: 使用正確的狀態值

#### 3. 房間沒有關聯的房型

```
房間沒有關聯的房型
```

**解決方法**: 確認房間已正確關聯到房型

#### 4. 建立預設價格失敗

```
建立預設價格失敗: [錯誤訊息]
```

**解決方法**: 檢查資料庫連線和權限，或手動建立價格

## 查詢可用房間

如果需要查詢可用的房間 ID，可以使用：

```bash
docker exec dingsomething-php-fpm php artisan tinker --execute="
\$rooms = \DaydreamLab\Dddream\Models\Hotel\HotelRoom::with('roomType')->get();
if (\$rooms->count() > 0) {
    foreach (\$rooms as \$room) {
        echo 'ID: ' . \$room->id . ' | 號碼: ' . \$room->number . ' | 房型: ' . (\$room->roomType ? \$room->roomType->title : 'N/A') . ' | maxPets: ' . (\$room->roomType ? \$room->roomType->maxPets : 'N/A') . PHP_EOL;
    }
} else {
    echo '資料庫中沒有房間資料' . PHP_EOL;
}
"
```

## 注意事項

1. **資料庫連線**: 確保 Docker 容器可以連接到資料庫
2. **房間資料**: 需要先有房間資料才能建立訂單
3. **價格設定**: 如果房型沒有價格，command 會自動建立預設價格
   - 預設 `basePrice`: 1500
   - 預設 `price`: 1500
   - 預設 `extraBasePrice`: 500
   - 預設 `extraPrice`: 500
   - 預設 `sizeId`: 1
4. **互動式流程**: 
   - 需要手動選擇會員和寵物
   - 如果該 merchant 下沒有會員，可選擇建立新會員
   - 如果會員的寵物不足 3 隻，會自動新增到 3 隻（但不超過 maxPets）
5. **寵物選擇**: 
   - 可多選，最多選擇 `maxPets` 隻
   - 輸入多個編號時用逗號分隔（例如：`1,2,3`）
   - 輸入 `0` 或空白可完成選擇
6. **會員關聯**: 新建立的會員會自動關聯到該 merchant（透過 `merchants_members_maps`）
7. **住宿天數**: 隨機選擇 1-3 天，以今天為起始日
8. **非互動模式**: 使用 `-n, --no-interaction` 選項時，command 會失敗（因為需要互動）

## 相關檔案

- Command 檔案: `src/Commands/CreateDemoHotelOrderCommand.php`
- 測試檔案: `tests/Unit/Commands/CreateDemoHotelOrderCommandTest.php`
- 註冊位置: `src/DddreamServiceProvider.php`
- 訂單狀態定義: `src/Models/Hotel/HotelOrder/Status.php`

## 快速參考

```bash
# 互動式流程（不提供 room_id，會詢問）
docker exec dingsomething-php-fpm php artisan hotel:create-demo-order

# 提供房間 ID（仍會互動式選擇會員和寵物）
docker exec dingsomething-php-fpm php artisan hotel:create-demo-order 1

# 建立已確認訂單
docker exec dingsomething-php-fpm php artisan hotel:create-demo-order 1 --status=CONFIRMED

# 指定建立者
docker exec dingsomething-php-fpm php artisan hotel:create-demo-order 1 --created_by=2

# 查看幫助
docker exec dingsomething-php-fpm php artisan hotel:create-demo-order --help
```

## 互動式操作說明

### 選擇會員
- 會顯示該 merchant 下的前 5 個會員
- 選擇編號或選擇「建立新會員」
- 如果該 merchant 下沒有會員，會詢問是否建立新會員

### 選擇寵物
- 會顯示該會員的寵物列表（至少 3 隻，但不超過 maxPets）
- 如果寵物不足，會自動新增
- 可輸入多個編號，用逗號分隔（例如：`1,2,3`）
- 最多可選擇 `maxPets` 隻
- 輸入 `0` 或空白完成選擇
