## Single DB mode (giữ `Model::on($tenantConnection)` nhưng luôn dùng DB gốc)

### Bật chế độ

- Thêm vào `.env`:

```bash
TENANT_SINGLE_DB_MODE=true
```

Khi bật:
- Các connection dạng `lms_tenant_*` sẽ **trỏ về DB gốc** (connection mặc định `config('database.default')`).
- Code hiện có dạng `Model::on($tenantConnection)` / `DB::connection($tenantConnection)` vẫn chạy, nhưng không còn switch sang DB tenant physical.

### Migration

Chạy migration để thêm cột `hocmai_tenant_id` cho bảng `api_moodle` (DB gốc):

```bash
php artisan migrate
```

## Tool kéo dữ liệu từ DB tenant physical → DB gốc (generic)

Command: `tenant:pull-table` (file `app/Console/Commands/TenantPullTable.php`)

### Ví dụ kéo `api_moodle` từ tenant `lms_tenant_icc`

1) Dry-run:

```bash
php artisan tenant:pull-table --source-db=lms_tenant_icc --table=api_moodle --tenant-id=1 --unique-by=id --chunk=1000 --dry-run
```

2) Chạy thật:

```bash
php artisan tenant:pull-table --source-db=lms_tenant_icc --table=api_moodle --tenant-id=1 --unique-by=id --chunk=1000
```

Ghi chú:
- `--tenant-id` sẽ inject `hocmai_tenant_id` vào DB gốc (nếu bảng đích có cột này).
- Kết nối nguồn được tạo dưới dạng `tenant_src_<db>` và **không bị ảnh hưởng** bởi `TENANT_SINGLE_DB_MODE`.
- Thông tin kết nối nguồn lấy từ env `DB_TENANT_HOST/PORT/USERNAME/PASSWORD` (fallback sang `DB_HOST/...` nếu thiếu).

### Sync các bảng khác

- Sync theo lọc:

```bash
php artisan tenant:pull-table --source-db=lms_tenant_icc --table=some_table --where=status=1 --chunk=2000
```

- Set hằng số cột (repeatable):

```bash
php artisan tenant:pull-table --source-db=lms_tenant_icc --table=some_table --set=some_col:ICC --set=flag:true
```

- Giới hạn/loại trừ cột:

```bash
php artisan tenant:pull-table --source-db=lms_tenant_icc --table=some_table --only-columns=id,name,created_at
php artisan tenant:pull-table --source-db=lms_tenant_icc --table=some_table --exclude-columns=updated_at,deleted_at
```

