KATA OPERATIONS · STAFF
ออก
🌳 TREE
BAANBAAN
PHIROM
OPS DAILY
CREDS REF
เติมเงิน
Family Tree
โครงสร้างระบบทั้งหมด · ดูครั้งเดียวจำได้ตลอด · สีทอง = entry point ลูกค้า · สีแดง = staff-only
baanbaan.design ◄─── Cloudflare Pages · auto-deploy ทุก 30 นาที (Task Scheduler)
│
├── / หน้าหลัก (landing) · 2 routes: ลูกค้าใหม่/เจ้าของบ้าน
├── /services หน้าบริการ + CTA LINE
├── /workshops/ เลือก Workshop A–O
│
├── /app/auth/login login เบอร์ + OTP (รองรับ ?phone=66XXX&autoreq=1 autofill)
├── /app/ Customer Portal ─┐
│ ├── Pre-con view ├ Pre-contract │ ดูได้แค่ลูกค้า/เจ้าของบ้าน
│ ├── BB Dashboard view ├ BB Active │ (มี OTP + customer-stage gate)
│ └── Project Picker └ 2+ projects ─┘
│
├── /admin/ Admin Panel (staff role required)
│ ├── + เพิ่มลูกค้า ─► call /api/admin/create-customer
│ ├── + เปิดโครงการ ─► call /api/admin/create-project
│ ├── + เพิ่มสมาชิก ─► call /api/admin/add-member (cap 1/5)
│ ├── 📩 ส่ง SMS ─► call /api/admin/resend-welcome
│ └── 🔗 issue magic link ─► call /api/admin/issue-magic-link
│
├── /kata/ เอกสารระบบนี้ (password 99 weak gate)
│
└── /api/admin/* Cloudflare Pages Functions (server-side)
│
│ requires Bearer JWT + profile.role IN staff_roles
│ uses Supabase service_role for cross-schema writes
│
└─ helper: sendVonageSms() = multi-provider chain ▼
Supabase ◄─── project lufcntasklknveeofvhi (Singapore)
│
├── Auth (GoTrue)
│ ├── Phone OTP (signInWithOtp)
│ ├── Hook: Send SMS ─────────► Edge Function ▼
│ └── Membership cap trigger (Pre-con=1 / BB=5)
│
├── DB tables
│ ├── auth.users · profiles · projects · project_members
│ ├── installments · pre_con_charges · attachments
│ ├── change_orders · sign_offs · activity_logs
│ └── RLS policies + SECURITY DEFINER RPCs
│
└── Edge Function send-sms-hook (v11)
│
│ verifies webhook signature
│ tries providers in SMS_PROVIDER_CHAIN order
│ MUST return Content-Type: application/json
│
└─ multi-provider chain ▼
SMS Providers (env: SMS_PROVIDER_CHAIN=thaibulksms,vonage)
│
├── ThaiBulkSMS (primary) ◄─── ที่ใช้ส่งจริงตอนนี้
│ endpoint: api-v2.thaibulksms.com
│ sender: default (no DEMO) · "BAANBAAN" รอ KYC
│ credit: pre-paid · เติมที่ account.thaibulksms.com
│ ราคา: ฿0.30/SMS std · ฿0.45 corporate
│
└── Vonage (fallback)
endpoint: rest.nexmo.com/sms/json · type=unicode
sender: "BAANBAAN" · AIS รีเจค error 29 (trial whitelist)
ใช้ตอน: ThaiBulkSMS ล่ม + ปลายทาง verified ใน Vonage dashboard
Phirom ◄─── separate project
│
├── phirom.health (Porkbun → Cloudflare Pages phirom-clinic)
│ ├── ebook · admin-web (pwd katikatakaton + inner 88)
│ └── source: Desktop\phirom-deploy\
│
└── 4-channel system Desktop\phirom-deploy\_channels\
├── MAIN · BOOKS · MISC · COORD
├── COORD loops: 30m consolidate+gdrive-backup · 60m cloudflare-deploy
└── Launch: _channels\scripts\start-all.cmd
External
├── LINE OA @okbaanbaan (https://lin.ee/2dy7hPp) · BaanBaan customer channel
├── LINE OA @405diwon · Phirom Clinic
├── Cloudflare DNS baanbaan.design + phirom.health zones
└── Google Drive AppSync G:\My Drive\AppSync\ ─► secrets + backups + sync
การไหลของข้อมูล (login flow)
ลูกค้าได้ Welcome SMS ──► แตะลิงก์ baanbaan.design/app/auth/login?phone=66XXX&autoreq=1
│
▼
phone autofill 0.7s → handleSend()
│
▼ POST /auth/v1/otp { phone, channel:sms, create_user:false }
Supabase GoTrue
│
├─ ตรวจ user exists + token cleared
│
▼ hook payload { user, sms.otp }
Edge Function send-sms-hook
│
├─ verify webhook signature
▼
try ThaiBulkSMS → POST api-v2.thaibulksms.com/sms
│ ✓ status 200 + msg_id
▼
ลูกค้าได้ SMS OTP 6 หลัก ──► กรอกใน input field
│
▼ verifyOtp({ phone, token, type:sms })
Supabase set session ──► redirect /app/
│
▼ query project_members + project info
render portal view (Pre-con / BB / picker)
baanbaan.design
Customer portal + admin · Supabase auth · multi-provider SMS
Architecture quick
| Source | C:\Users\PC\BaanBaan\ |
|---|---|
| Deploy | powershell scripts\deploy.ps1 · auto ทุก 30 นาที (9-18 น.) ผ่าน Task Scheduler |
| DB / Auth | Supabase ref lufcntasklknveeofvhi · region Singapore |
| SMS | ThaiBulkSMS primary · Vonage fallback · switch ด้วย env SMS_PROVIDER_CHAIN |
Pages Functions
POST /api/admin/create-customer— สร้าง user+project+welcome SMSPOST /api/admin/create-project— เปิด projectPOST /api/admin/add-member— เพิ่ม user ใน project (cap 1/5 enforced)POST /api/admin/resend-welcome— ส่ง welcome SMS ซ้ำPOST /api/admin/issue-magic-link— gen 1-tap login URLGET /api/admin/list— รายชื่อ customers + projectsGET /api/search— geocoding proxy (Nominatim)
Critical fixes (2026-05-27)
- GoTrue admin createUser ทิ้ง
confirmation_token→ block OTP · แก้ด้วย SECURITY DEFINER RPCadmin_clear_confirmation_token(uuid) - Edge function default Content-Type = text/plain → Supabase reject · แก้: explicit
application/jsonทุก Response - ThaiBulkSMS sender "BAANBAAN" = error 110 (unapproved) · แก้: omit sender field → use default
Membership rules
- Pre-con stage: 1 customer ต่อโครงการ (trigger block ถ้าเกิน)
- BB Active stage: 5 customers ต่อโครงการ (รับครอบครัว)
- SQL:
sql/11-customer-membership-cap.sql
phirom.health
Phirom Clinic ebook + admin · 4-channel content system
Quick reference
| Domain | phirom.health (Porkbun) → Cloudflare Pages phirom-clinic |
|---|---|
| Source | C:\Users\PC\Desktop\phirom-deploy\ |
| Deploy | cloudflare-deploy.ps1 · COORD loop ทุก 60 นาที |
| Local serve | serve-phirom.ps1 (localhost:8765) — PDF.js ebook ต้อง HTTP origin |
| Admin page | phirom.health/admin-web · password katikatakaton + inner 88 |
| F5 helper | Desktop\phirom-deploy\f5-phirom.ps1 — refresh Chrome tab อัตโนมัติ |
4-Channel
- MAIN · เนื้อหาหลัก
- BOOKS · ebook content
- MISC · assets ทั่วไป
- COORD · ตัวประสาน · loops 30m (consolidate+backup) + 60m (deploy)
- Launch ทุก channel:
_channels\scripts\start-all.cmd
Handed off to secretary on 2026-05-25 — Min step back, content edits = secretary's job
Daily operations
งานที่คุณจะทำเป็นประจำ · เวลาทำงานปกติ
1 · เพิ่มลูกค้าใหม่ (พบลูกค้าครั้งแรก)
1เปิด
baanbaan.design/admin/ → login ด้วยเบอร์คุณ + OTP2กด + เพิ่มลูกค้า ปุ่มทอง
3กรอก: เบอร์ · ชื่อ · Stage (Pre-con/BB) · (เลือก) ชื่อโครงการ + workshop + ที่ตั้ง
4กด สร้าง customer → ระบบ auto-ส่ง welcome SMS ลิงก์เข้าระบบให้ลูกค้า
2 · เพิ่มสมาชิกครอบครัวเข้า BB project
1ใน
/admin/ หาการ์ดโครงการ → กด + เพิ่มสมาชิก2กรอกเบอร์ + ชื่อ → กด เพิ่มสมาชิก
3ถ้าเต็ม cap → ปุ่ม disabled (Pre-con=1 · BB=5)
3 · ลูกค้าบอก "ไม่ได้ SMS"
1การ์ดโครงการ → หาแถวลูกค้านั้น → กด 📩 ส่ง SMS
2SMS ส่งซ้ำทันที · ✓ เขียวขึ้น = ผ่าน
4 · เปิดโครงการเพิ่ม (ลูกค้าเดิม)
1กด + เปิดโครงการ → กรอกชื่อ · workshop · ที่ตั้ง
2เลือก "ผูกกับลูกค้า" → dropdown หาเลือก user เดิม → สร้าง
5 · เปลี่ยน Pre-con → BB เมื่อลูกค้าเซ็นสัญญา
ยังไม่มี UI button (จะทำเพิ่ม) — ตอนนี้บอก Claude → assistant จะ update DB ให้
เช็คสถานะ — ที่ไหน
| ลูกค้า/โครงการทั้งหมด | baanbaan.design/admin/ |
|---|---|
| SMS credit เหลือ | account.thaibulksms.com มุมขวาบน "เครดิตคงเหลือ" |
| SMS ที่ส่งออก | ThaiBulkSMS dashboard → รายงาน |
| Vonage balance + history | dashboard.vonage.com |
Credentials reference
รายการ credentials ทั้งหมดที่ระบบใช้ · ค่าจริงเก็บที่ PRIVATE-TOKEN.txt เท่านั้น
กฎหลัก: ห้ามฝัง token ใน deployed HTML / Git commit / chat screenshot · ทุก credential ดูที่
G:\My Drive\AppSync\PRIVATE-TOKEN.txtCloudflare
| API Token | ใช้ deploy + edit env vars · ใน PRIVATE-TOKEN.txt section #1 |
|---|---|
| Account ID | ใน PRIVATE-TOKEN.txt section #2 · ใช้ในทุก API call |
| Login dashboard | dash.cloudflare.com · email + password ใน PRIVATE-TOKEN section #4 |
Supabase (baanbaan)
| Project ref | lufcntasklknveeofvhi |
|---|---|
| Project URL | lufcntasklknveeofvhi.supabase.co |
| Anon key | ใส่ใน frontend ได้ (มี RLS protect) · ในไฟล์ app/auth/config.js |
| Service role | SECRET · CF Pages env var SUPABASE_SERVICE_ROLE_KEY · ใน PRIVATE-TOKEN section #6 |
| Personal Access Token | SECRET · Management API · ใน PRIVATE-TOKEN เท่านั้น (อย่าใส่ใน deployed code) |
| Dashboard | supabase.com/dashboard/project/lufcntasklknveeofvhi |
ThaiBulkSMS (primary)
| API Key | CF Pages env THAIBULKSMS_API_KEY + Supabase secret · สร้างจาก portal → SMS API → API Key |
|---|---|
| API Secret | มาคู่กับ Key · ใช้ทำ BasicAuth · ดูได้ใน account.thaibulksms.com → API Keys |
| Endpoint | https://api-v2.thaibulksms.com/sms |
| Sender | default (ไม่ใส่) · "BAANBAAN" รอ KYC อนุมัติ 3-7 วัน |
| Dashboard | account.thaibulksms.com |
Vonage (fallback)
| API Key + Secret | CF Pages env VONAGE_API_KEY + VONAGE_API_SECRET · ใน PRIVATE-TOKEN section #8 |
|---|---|
| Endpoint | https://rest.nexmo.com/sms/json · type=unicode สำหรับไทย |
| Limit | Trial mode: ส่งได้แค่ verified destinations · upgrade ที่ dashboard.vonage.com → Billing |
LINE OA
| @okbaanbaan | Messaging API channel · channel ID + secret ใน PRIVATE-TOKEN section #5 |
|---|---|
| Access token | หมดอายุทุก 30 วัน · regenerate จาก Channel ID + Secret |
| Manager URL | manager.line.biz |
อื่นๆ
- Google Drive — บัญชี
nawamin.lawa@gmail.com(200GB plan) · ใช้ sync .claude + AppSync - Gemini API key — ใน user env
GEMINI_API_KEY(ไม่ sync, อยู่บนเครื่องอย่างเดียว)
เติมเงิน & เครดิต
วิธีเติมเครดิต SMS + ดูสถานะการใช้งาน
1 · ThaiBulkSMS (primary)
1เปิด
account.thaibulksms.com → login2มุมขวาบน → กดปุ่มฟ้า สั่งซื้อเครดิต ▾
3เลือก package:
| Package (ตัวอย่าง) | 1,000 std ≈ ฿300 · 5,000 std ≈ ฿1,300 · 10,000 std ≈ ฿2,500 |
|---|---|
| ประเภท | Standard = sender default (ใช้ทันที) · Corporate = sender ที่ผ่าน TRC (ดูมืออาชีพ ราคา×1.5) |
| ชำระ | โอนผ่านธนาคาร/PromptPay · บัตรเครดิต |
| เข้าระบบ | 5-15 นาที (โอน) · ทันที (บัตร) |
แนะนำ: ซื้อ Standard 1,000-3,000 ก่อน (~฿300-฿800) · ใช้ได้นานเป็นเดือนๆ · ไม่หมดอายุ · Corporate ค่อยซื้อหลัง "BAANBAAN" KYC อนุมัติ
2 · Vonage (fallback) — เพิ่มเครดิต
1เปิด
dashboard.vonage.com → Billing2Add payment method (บัตรเครดิต) → set auto-recharge
3Account ก็จะขยับ trial → paid · ปลด whitelist destination จำกัด
3 · Sender Name "BAANBAAN" (ขอ KYC ที่ ThaiBulkSMS)
1เข้า ThaiBulkSMS → เมนู SMS → Sender Name หรือ จัดการ SMS OTP
2กด + ขอ Sender Name → กรอก "BAANBAAN" + ประเภท OTP/Notify + วัตถุประสงค์
3แนบเอกสาร: บัตรประชาชน (จำเป็น) + ภพ.20 ถ้ามี
4รอ TRC อนุมัติ 3-7 วันทำการ
5เมื่ออนุมัติ → บอก Claude → flip 1 บรรทัด env
THAIBULKSMS_SENDER=BAANBAANราคาต่อเดือนโดยประมาณ
| ลูกค้า 50 คน · login 2x/mo | ~100 SMS = ฿30/mo (std) · ฿45 (corp) |
|---|---|
| ลูกค้า 100 · login 3x/mo | ~300 SMS = ฿90/mo (std) · ฿135 (corp) |
| ลูกค้า 500 · login 3x/mo | ~1,500 SMS = ฿450/mo (std) · ฿675 (corp) |
เช็ค credit เหลือเท่าไหร่
- ThaiBulkSMS:
account.thaibulksms.comมุมขวาบน "เครดิตคงเหลือ" - หรือ API:
GET /creditที่api-v2.thaibulksms.com(มีใน assistant tools) - Vonage:
dashboard.vonage.comมุมขวาบน หรือ Settings → Billing
เมื่อ credit ใกล้หมด: ระบบยังไม่ alert อัตโนมัติ · เช็คทุกอาทิตย์ใน dashboard · เติมล่วงหน้าก่อนหมด