# TourApp: ผลตรวจเครื่องใหม่ — 6 ตุลาคม 2026

Root: `C:\Users\Admin\Downloads\TourAppProject\travelin_app`

Runtime หลักเปิดได้หลังแก้ dependency/cache และ launcher โดยไม่ได้แก้ Dart/Flutter/React business logic, schema หรือข้อมูล DB และไม่ได้ upgrade package version

## PASS

| รายการ | ผลตรวจจริง |
|---|---|
| MariaDB | 10.4.32, mysqld PID 22888, port 3306, data directory `C:\xampp\mysql\data\` |
| Database | `tourist_grouping_db` มี 33 tables; schema และข้อมูลอ่านได้ |
| Backend DB credential | บัญชี `travelin_app` ต่อ `127.0.0.1:3306/tourist_grouping_db` ได้จริง |
| Dart Backend | เปิด entry point `server/gemini_proxy.dart` สำเร็จ; Dart PID 17880 listen ที่ `127.0.0.1:8787` ในการตรวจรอบล่าสุด |
| Health | `/api/health`: `ok=true`, `databaseConfigured=true`, `aiConfigured=true` |
| DB API | `POST /api/groups` เป็นการอ่านข้อมูล; HTTP 200 และส่งกลับ 77 กลุ่ม |
| Flutter dependency | `flutter pub get --enforce-lockfile` ผ่าน |
| Static analysis | `flutter analyze`: No issues found หลังแก้ครบ |
| Android build/run | build APK ใหม่สำเร็จ, ติดตั้งและรันบน Pixel_6, emulator-5554, Android 16/API 36 x86_64 |
| App screens | Home, Login และฟอร์ม Preference/AI ในโหมด guest แสดงได้ |
| Flutter → Backend | login ด้วยข้อมูลสมมติที่ไม่มีบัญชี ได้ข้อความรหัสผ่าน/บัญชีไม่ถูกต้องจาก API แทน connection error |
| ADB | `adb devices` เห็น emulator-5554 เป็น device; reverse TCP 8787 ตั้งสำเร็จ |
| Portal dependency | ติดตั้งใหม่ด้วย `pnpm install --frozen-lockfile --force` ตาม `pnpm-lock.yaml` เดิม |
| Portal build/lint | `npm.cmd run build` และ `npm.cmd run lint` ผ่าน |
| Portal runtime | Vite PID 25336 listen ที่ `127.0.0.1:4173`; Agency/Admin Login แสดงได้ |
| Portal → Backend | Vite `/api` proxy ไป `127.0.0.1:8787`; `/api/health` ผ่าน และหน้า Admin ได้ invalid-login response จริง |
| Local configuration | Gemini โหลดจาก `server/gemini_key.txt`; PromptPay และ SlipOK configuration พร้อม |
| Tests | 96 tests ผ่าน: login widget, app widget, PromptPay QR และ SlipOK verifier ที่ใช้ mock |
| DB preservation | `CHECKSUM TABLE ... EXTENDED` ก่อน/หลังตรงกันทั้ง 33 tables |

Health flag `databaseConfigured` บอกว่า config มีอยู่ ไม่ได้พิสูจน์การเชื่อมต่อเอง จึงตรวจบัญชี DB และ endpoint ที่อ่าน DB เพิ่มด้วย

## FAIL / ยังไม่ยืนยัน

- ไม่พบ runtime failure ที่ยังค้างสำหรับ Android, Backend และ Vite หลังแก้แล้ว
- ยังไม่ได้ทดสอบ login สำเร็จด้วยบัญชีจริง, member Home/Matching/Existing group และ Agency/Admin dashboard หลัง login จึงยังรับรอง flows เหล่านี้ไม่ได้
- Member login เรียก `_dissolveExpiredGroupForUser`; group/matching/poll flows บางตัวอาจเปลี่ยน DB แม้ดูเหมือนเป็นการโหลดหน้า จึงไม่ได้เรียกภายใต้ข้อกำหนดห้ามเขียนข้อมูล
- ไม่ได้ส่ง Gemini request, เรียก SlipOK จริง, สร้าง payment/QR สำหรับชำระจริง, upload slip, สร้างกลุ่ม, bid, vote, rating หรือรัน migration/import
- `flutter doctor -v` แจ้งขาด Visual Studio C++ สำหรับ Windows desktop เท่านั้น; Android toolchain ผ่าน

## FIXED

| ไฟล์/ตำแหน่ง | สิ่งที่แก้ |
|---|---|
| `start_ai.bat:4,20` | จำกัด environment ใน launcher และโหลด `config/local_secrets.bat` โดยไม่แสดงค่า ก่อนเปิด Backend |
| `start_android_test.bat:73-74` | fallback ที่เปิด Backend เองโหลด local secrets และปิด delayed expansion เพื่อรักษาค่า secret |
| `start_tourapp.bat:277-305` | ตรวจ dependency ที่หาย/ไม่ครบและ restore ด้วย pnpm frozen lockfile หรือ npm ci ตาม lockfile แทน npm install ที่ resolve version ใหม่ |
| `tools/show_demo_member_credentials.ps1:5` | เปลี่ยน `C:\Users\Asus\...` เป็น `Join-Path $env:LOCALAPPDATA ...` |
| Portal `node_modules` | สร้างใหม่ เพราะ copy มาแล้ว `typescript/bin/tsc` หาไม่พบ |
| Flutter generated output | `flutter clean` แล้ว pub get/build ใหม่; build cache เดิมอ้าง `C:\Users\Asus\Desktop\TourAppProject\travelin_app\build\...` |
| Gradle transform cache | หยุด Gradle daemon แล้วเก็บ cache เดิมไว้ที่ `C:\Users\Admin\.gradle\caches\8.11.1\transforms.before-tourapp-machine-check-20261006`; ให้ Gradle สร้าง transforms ใหม่ |

ไม่มีการแก้ `lib/`, `server/`, Portal UI source, package manifest, version constraint หรือ SQL

เพิ่มไฟล์ diagnostic ใน `work/`:

- `new_machine_config_check.dart`: ตรวจ SET/MISSING และ readiness โดยไม่เรียก network/DB และไม่แสดงค่า secret
- `new_machine_backend_smoke.ps1`: เปิด Backend ชั่วคราว 45 วินาที ตรวจ API ที่ปลอดภัย ปิด seed/bootstrap ใน diagnostic child และหยุดก่อน scheduler รอบแรก
- `new_machine_tests.log`, checksum ก่อน/หลัง และ runtime logs
- `new_machine_flutter.png`: ภาพ Preference/AI form บน Emulator
- `new_machine_portal.png`: ภาพ Admin Login ได้รับ invalid-login response จาก Backend

## MISSING

- ไม่ขาดโปรแกรมที่จำเป็นต่อ Android + Backend + Portal runtime
- `mysql`/`mariadb` และ `emulator` ไม่ได้อยู่บน PATH แต่พบ executable และเรียกผ่าน full path ได้
- ไม่พบ `%LOCALAPPDATA%\TourAppE2E\member-credentials.xml` บนเครื่องใหม่ เครื่องมือดูบัญชี demo จึงยังใช้ไม่ได้แม้แก้ path แล้ว
- Visual Studio C++ ไม่ได้ติดตั้ง; ต้องมีเฉพาะถ้าจะ build Windows desktop
- Gemini และ DB ไม่ได้อยู่ใน `config/local_secrets.bat` แต่มี fallback credential files ที่ Backend โหลดได้ จึงไม่จำเป็นต้องคัดลอกค่าเข้า bat

### Versions

| เครื่องมือ | Version / ตำแหน่ง |
|---|---|
| Flutter | 3.35.6 stable — `C:\src\flutter` |
| Dart | 3.9.2 |
| JDK ที่ Flutter ใช้จริง | Android Studio JBR 21.0.7 — `C:\Program Files\Android\Android Studio\jbr` |
| Java บน PATH | Eclipse Adoptium 25; Flutter ใช้ JBR 21 ตาม config จึงไม่ต้องเปลี่ยน |
| Android SDK | Platform android-36, build-tools 36.1.0 — `%LOCALAPPDATA%\Android\Sdk` |
| ADB | 1.0.41 / platform-tools 36.0.0 |
| Emulator | 36.2.11.0 |
| Android Studio | 2025.1.3 |
| Node.js | 24.21.0 |
| npm | 11.19.0 |
| pnpm | 11.19.0 |
| Vite / TypeScript / React | 7.3.6 / 5.8.3 / 19.3.0 ตาม pnpm lockfile |
| MariaDB client/server | 10.4.32 |
| Git | 2.51.1.windows.1 |
| VS Code | 1.137.0 |

### Structure

- Flutter: `pubspec.yaml`, `pubspec.lock`, `lib/`, `android/`, `assets/`, `test/`
- Backend: `server/gemini_proxy.dart` ใช้ dependencies จาก Flutter package root
- Portal: `portal/package.json`, `portal/pnpm-lock.yaml`, `portal/vite.config.ts`, `portal/src/`
- Secrets: `config/local_secrets.bat`, `server/database_key.txt`, `server/gemini_key.txt`, `server/.env`; `.gitignore` ครอบคลุม credential files เหล่านี้
- Launchers: `start_tourapp.bat`, `start_ai.bat`, `start_android_test.bat`
- Database: `database/` มี SQL/migrations/backups; ไม่ได้เรียกใช้
- Android: `android/local.properties` ชี้ Admin SDK และ `C:\src\flutter` ถูกต้องแล้ว
- SQL dump ระดับ workspace: `..\tourist_grouping_db (1).sql` มี 33 CREATE TABLE statements; `database/tourist_grouping_db_complete.sql` มีเพียง 9 จึงไม่ถือว่าแทน schema ปัจจุบันได้ ตรวจพบ DB อยู่แล้วจึงไม่ต้อง import

## CURRENT RUN COMMANDS

คำสั่งต่อไปนี้ใช้ใน PowerShell เปิดแยกหน้าต่าง terminal ตามองค์ประกอบ

### 1. MariaDB

ขณะตรวจมี process ทำงานอยู่แล้ว ไม่ต้องเปิดซ้ำ หากหยุดอยู่ ใช้ XAMPP Control Panel หรือ:

```powershell
& 'C:\xampp\mysql_start.bat'
```

### 2. Backend 8787

สำหรับตรวจโดยรักษาข้อจำกัดไม่เขียน DB ใช้ diagnostic ที่หยุดเองใน 45 วินาที:

```powershell
Set-Location 'C:\Users\Admin\Downloads\TourAppProject\travelin_app'
powershell.exe -NoProfile -ExecutionPolicy Bypass -File work\new_machine_backend_smoke.ps1
```

สำหรับเปิด Backend ตามปกติเป็นเวลานาน:

```powershell
Set-Location 'C:\Users\Admin\Downloads\TourAppProject\travelin_app'
cmd.exe /d /c 'call "config\local_secrets.bat" >nul 2>&1 & set "TRAVELIN_ENABLE_DEVELOPMENT_ACCOUNTS=0" & dart run server\gemini_proxy.dart'
```

คำสั่งปกติยังมี poll scheduler ทุก 60 วินาทีตาม source เดิม จึงอาจเขียน DB; ไม่ได้เปิดค้างไว้ในการตรวจครั้งนี้ Launcher เดิมยังตั้ง development accounts=1 ตามพฤติกรรมเดิม จึงไม่ใช้ launcher นั้นสำหรับ read-only diagnostic

### 3. Portal 4173

```powershell
Set-Location 'C:\Users\Admin\Downloads\TourAppProject\travelin_app\portal'
npm.cmd run dev -- --host 127.0.0.1 --port 4173 --strictPort
```

เปิด `http://127.0.0.1:4173/agency/login` หรือ `/admin/login`

หากต้อง restore dependencies:

```powershell
pnpm.cmd install --frozen-lockfile
npm.cmd run build
```

### 4. Android Emulator

ขณะตรวจ Pixel_6 เปิดอยู่แล้ว หากยังไม่เปิด:

```powershell
& "$env:LOCALAPPDATA\Android\Sdk\emulator\emulator.exe" -avd Pixel_6 -netdelay none -netspeed full
```

มี AVD อื่นด้วย: Medium_Phone_API_36.0, Pixel_8, flutter_emulator, flutter_emulator_2, flutter_emulator_3

### 5. Flutter App

```powershell
Set-Location 'C:\Users\Admin\Downloads\TourAppProject\travelin_app'
adb -s emulator-5554 reverse tcp:8787 tcp:8787
flutter run -d emulator-5554
```

หาก device ID เปลี่ยน ให้ใช้ ID จาก `flutter devices` และ `adb devices`

## IMPORTANT

- ต้องใช้ `adb reverse` เพราะ Android client ใช้ `http://127.0.0.1:8787` และ Backend bind เฉพาะ loopback
- DB ที่ต่อจริงคือ `tourist_grouping_db` บน `127.0.0.1:3306` บัญชี `travelin_app`
- Backend process/port ถูกต้องในช่วง smoke test แต่ตอนจบหยุดแล้ว เพื่อไม่ให้ scheduler เปลี่ยน active poll 2 รอบที่ตรวจพบ
- MariaDB และ Portal ยังเปิดอยู่ แอป Flutter ยังเปิดบน Emulator
- `SLIPOK_API_KEY`, `SLIPOK_BRANCH_ID`, `TRAVELIN_PAYMENT_MODE`, `TRAVELIN_PROMPTPAY_ID`, `TRAVELIN_PAYMENT_RECEIVER`: SET และตรวจ payment runtime readiness ผ่าน
- `GEMINI_API_KEY`: SET จาก `server/gemini_key.txt`; `server/.env` เป็น MISSING แต่ fallback ทำงาน
- `DB_HOST`, `DB_PORT`, `DB_NAME`, `DB_USER`, `DB_PASSWORD`: SET จาก `server/database_key.txt`
- `TRAVELIN_ALLOW_PAYMENT_TEST_OVERRIDE`, `TRAVELIN_PAYMENT_TEST_AMOUNT` และ slip replay test flags: MISSING ใน configuration ที่ตรวจ ไม่พบการอ่าน test amount override ใน payment runtime source
- Payment ใช้ยอดที่ส่งเข้า configuration ตาม source เดิม ไม่มีการทดสอบชำระ 1 บาทจริง และไม่แก้ secret
- path เครื่องเก่าที่ทำ Android build พังถูกแก้ด้วย regeneration แล้ว ไม่พบ `Asus` ใน app/backend/Portal runtime source หลังแก้ เครื่องมือ thesis capture/เอกสาร/audit/SQL backup เก่ายังมี path เครื่องเก่าและไม่ได้แก้ เพราะไม่ได้ใช้รันระบบหลัก
- ตรวจเฉพาะการโหลด configuration ไม่ได้ยืนยัน API key validity/quota กับ Google หรือ SlipOK

หลักฐาน DB preservation: `work/new_machine_db_checksums_before.tsv` เทียบกับ `work/new_machine_db_checksums_after.tsv` ตรงกันทั้ง 33 tables
