# Checklist release production — plugin Đặt vé tàu

Áp dụng cho **datvetaucaotoc.net** (WordPress + theme hiện có). Dữ liệu đơn vé, chuyến, cài đặt nằm trong **database WordPress**, không nằm trong file plugin.

---

## Câu hỏi thường gặp: upload zip mới có mất DB không?

| Thao tác | Mất đơn / chuyến / cài đặt admin? |
|----------|-----------------------------------|
| **Ghi đè** thư mục plugin (FTP/SFTP, zip) khi plugin **vẫn đang Bật** | **Không** — bảng `wp_*_datvetau_*` và option `datvetau_booking_settings` giữ nguyên |
| **Tắt** plugin (Deactivate) rồi cập nhật file rồi **Bật** lại | **Không** — deactivate không xóa data (đúng thiết kế hiện tại) |
| **Import Excel lại** sau khi sửa code | **Không xóa đơn đặt vé** — import chỉ thêm/cập nhật **chuyến** (theo chế độ trùng: Cập nhật / Bỏ qua) |
| **Gỡ cài đặt** (Delete) plugin trên WP | **File plugin mất**; bảng DB **vẫn còn** (plugin **chưa** có `uninstall.php` xóa bảng). Đơn vẫn trong MySQL nhưng không vào admin được cho đến khi cài lại plugin |
| **Xóa / restore DB** hoặc migrate site sang database trống | **Có** — mất toàn bộ đơn, chuyến, cài đặt |

**Kết luận:** Cập nhật bản zip **không** làm mất dữ liệu đã lưu. Chỉ backup DB trước mỗi lần deploy là thói quen an toàn.

---

## Trước khi build (máy dev)

- [ ] Sửa xong code PHP + (nếu có) React trong `frontend/`
- [ ] Chạy build wizard (bắt buộc nếu đụng FE):

  ```bash
  cd wordpress-plugin/datvetaucaotoc-booking/frontend
  npm ci
  npm run build
  ```

- [ ] Kiểm tra tồn tại `assets/build/wizard.js` (không rỗng)
- [ ] **Tăng `Version`** trong `datvetaucaotoc-booking.php` (và `DATVETAU_BOOKING_VERSION`) — giúp cache trình duyệt/CDN nhận bản JS/CSS mới
- [ ] Test local: đặt vé thử → **Đơn đặt vé → Chi tiết**; import Excel mẫu

---

## Đóng gói zip upload lên host

**Tự động (dev):** sau `npm run build`:

```powershell
powershell -ExecutionPolicy Bypass -File wordpress-plugin/datvetaucaotoc-booking/tools/build-release.ps1
```

File ra (cùng thư mục source):  
`wordpress-plugin/datvetaucaotoc-booking/datvetaucaotoc-booking.zip`

Zip **phẳng** (gốc là `datvetaucaotoc-booking.php`, không lồng thêm folder trong zip).

**Cài trên host (khuyến nghị — tránh lỗi *Plugin file does not exist*):**

1. Xóa folder plugin cũ / lỗi trong `wp-content/plugins/`.
2. Tạo thư mục `wp-content/plugins/datvetaucaotoc-booking/`.
3. Upload `datvetaucaotoc-booking.zip` **vào trong** thư mục đó → **Giải nén**.
4. Kiểm tra có file `.../datvetaucaotoc-booking/datvetaucaotoc-booking.php`.
5. WordPress → **Plugins → Kích hoạt**.

Upload qua **Plugins → Add New → Upload** trên một số host vẫn có thể lồng folder; nếu lỗi, dùng cách FTP/cPanel ở trên.

**Bao gồm:** PHP, `assets/build/wizard.js`, CSS, `data/`, v.v.

**Không cần** (có thể bỏ để zip nhẹ): `frontend/node_modules/`, `frontend/src/` nếu muốn — nhưng nên giữ `frontend/` + source nếu team sau này build trên server (khuyến nghị: build sẵn trên dev, production chỉ cần `assets/build/`).

---

## Lần đầu lên production

- [ ] Backup site (file + **database**) trước khi cài
- [ ] PHP ≥ 8.1, WordPress ≥ 6.0 (production 8.3 OK)
- [ ] Upload & kích hoạt plugin **Đặt vé tàu cao tốc**
- [ ] Activate chạy: tạo bảng DB, cài đặt mặc định, seed 2 tuyến **nếu chưa có tuyến**
- [ ] **Cài đặt:** QR ngân hàng (Media), copy thanh toán, link quy định hủy đổi
- [ ] **Import Excel** lịch tháng (file mẫu admin)
- [ ] Trang `/lich-tau/` (hoặc tương đương): shortcode `[datvetau_booking route="rach-gia-phu-quoc"]` hoặc block **Đặt vé tàu**
- [ ] Không trùng FAB hotline/Zalo theme — plugin không render dock nổi
- [ ] Smoke test (xem mục cuối)

---

## Cập nhật bản mới (đã chạy production, có đơn thật)

1. [ ] **Backup database** (và snapshot file nếu host hỗ trợ)
2. [ ] **Maintenance** (tùy chọn): thông báo ngắn nếu giờ cao điểm
3. [ ] Upload zip **ghi đè** `wp-content/plugins/datvetaucaotoc-booking/`  
       - Plugin **có thể giữ trạng thái Bật** — không bắt buộc tắt
4. [ ] Nếu bản mới **đổi cấu trúc bảng DB** (hiếm): **Tắt → Bật** plugin một lần để chạy lại `dbDelta` (activate hook). Hỏi dev trước khi release có migration không.
5. [ ] Hard refresh trang đặt vé (Ctrl+F5) / xóa cache plugin cache (LiteSpeed, WP Rocket, v.v.)
6. [ ] Smoke test — **không** cần import lại Excel trừ khi muốn **cập nhật lịch chuyến**
7. [ ] Xem **Đơn đặt vé** — đơn cũ vẫn phải còn

**Import lại Excel sau update code:** an toàn cho đơn; chỉ ảnh hưởng bảng chuyến. Chọn **Cập nhật** nếu sửa giá/ghế; **Bỏ qua** nếu chỉ thêm chuyến mới.

---

## Sau khi import lịch (vận hành)

- [ ] **Chuyến:** lọc tháng, kiểm tra giá NL, ghế còn/trống
- [ ] Wizard: chọn đúng ngày có chuyến, khứ hồi nếu cần
- [ ] Một đơn thử → trạng thái **Chờ thanh toán** → admin **Chi tiết** (giá từng loại hành khách)
- [ ] Hủy đơn thử (nếu cần) → ghế **cộng lại** `seats_remaining`

---

## Smoke test nhanh (5–10 phút)

| # | Việc | Kỳ vọng |
|---|------|---------|
| 1 | `GET /wp-json/datvetau/v1/routes` | JSON có tuyến active |
| 2 | `GET /wp-json/datvetau/v1/trips?route_slug=...&date=dd-mm-yyyy&seat_class=eco` | Có chuyến ngày test |
| 3 | Trang shortcode: tìm chuyến → bước thanh toán | UI load, không lỗi console nặng |
| 4 | POST đặt vé (form thật hoặc test) | Đơn trong admin |
| 5 | **Cài đặt → public** | QR hiển thị trên wizard |

---

## Rollback

- [ ] Khôi phục **thư mục plugin** bản cũ (zip đã lưu `datvetaucaotoc-booking-vX.Y.Z.zip`)
- [ ] Nếu bản mới đã chạy migration DB lỗi: restore **backup MySQL** (chỉ khi cần)
- [ ] Không rollback bằng cách xóa plugin — bảng DB vẫn còn nhưng dễ nhầm với file code cũ

---

## Việc **không** nên làm trên production

- Xóa plugin rồi cài lại **mà không backup** (đơn vẫn trong DB nhưng dễ mất file cấu hình host)
- Import Excel với **Cập nhật** và file sai `so_ghe` / giá — ghi đè chuyến đang bán
- Deploy thiếu `wizard.js` (build chưa chạy) — trang trắng / không wizard
- Commit `.env` / mật khẩu vào zip

---

## Ghi chú kỹ thuật (cho dev)

- Bảng: `{prefix}datvetau_routes`, `datvetau_trips`, `datvetau_bookings`, `datvetau_passengers`
- Cài đặt: option `datvetau_booking_settings`
- `Database::install()` chạy khi **activate**, không chạy mỗi request — bản có đổi schema cần hướng dẫn ops **deactivate/activate** hoặc thêm upgrade hook sau này
