ข้ามไปยังเนื้อหาหลัก

Flow ตั้งแต่เปิดแอปของ Mobile และ Terminal

หน้านี้สรุป flow การใช้งานตั้งแต่เปิดแอปจนเข้าถึงเมนูหลักของทั้ง apps/mobile และ apps/pos-terminal โดยอิงจากโค้ดปัจจุบันใน repository

ขอบเขต

  • Mobile: apps/mobile/App.tsx, RootNavigator, loginScreen, branchScreen, homeScreen
  • POS Terminal: apps/pos-terminal/App.tsx, BranchScreen, UserSelectionScreen, HomeScreen, StorefrontPosStack
  • Shared behavior: auth token, login date, selected branch/warehouse, tax cache, required app update, alcohol check

ภาพรวมความต่างหลัก

เรื่องMobilePOS Terminal
ลำดับเริ่มต้นLogin ก่อน แล้วเลือกสาขา/คลังเลือกสาขา/คลังก่อน แล้วเลือก/เข้าสู่ระบบพนักงาน
หน้าล็อกอินกรอก username/password โดยตรงแสดงรายชื่อพนักงานขายตามคลังที่เลือก และมี employee login fallback
การเลือกสาขาหลัง login ถ้ายังไม่มี branch ใน storageก่อน login เพื่อผูกเครื่องกับสาขา/คลัง
HomeGrid menu แยก sectionSplit-pane menu/list/detail สำหรับจอใหญ่
POS หน้าร้านไม่มี screen POS แยกมี StorefrontPos เต็มจอเฉพาะ Terminal

เปรียบเทียบขั้นตอนเริ่มต้น

Guard ร่วมก่อนเข้าระบบ

ทั้ง Mobile และ POS Terminal ใช้ guard หลักเหมือนกัน:

  • Required app update: อ่าน native app version และเทียบกับ Firestore version/vapp
  • Auth API: เรียก signIn
  • Alcohol check: เรียก verifyAlcoholCheckBeforeLogin ก่อนยอมให้ login สำเร็จ
  • Token/session storage: เก็บ auth token, user, และ login_date รูปแบบ DD-MM-YYYY
  • FCM token: refresh แล้ว patch กลับไปที่ user เมื่อทำได้
  • Password reset: ถ้า login response แจ้ง missing required values จะพาเข้า flow ตั้งรหัสผ่านใหม่

Mobile flow ทีละขั้น

1. Login

Mobile เปิดหน้า Login เมื่อยังไม่มี session หรือ session หมดอายุ

  • ผู้ใช้กรอก username/password
  • ระบบตรวจ required app update
  • ระบบ login และตรวจ alcohol rule
  • ระบบบันทึก token, user, login date
  • ถ้ายังไม่เคยตั้งรหัสผ่าน จะสลับไป reset password

2. Select branch

หลัง login ถ้ายังไม่มี branch ใน storage จะเข้า SelectBranch

Payload ที่เก็บใน branch storage:

{
BranchId: string | number;
BranchCode: string;
whsGrpName: string;
whsGrpCode: string;
isMain: boolean;
}

3. Home

Mobile Home ทำหน้าที่เป็นทั้ง landing page และ permission gate:

  • โหลด user และ branch จาก storage เมื่อ focus
  • ถ้า login_date ไม่ใช่วันนี้ จะ logout
  • กรองเมนูด้วย deptCode, branch.isMain, และบางกรณีด้วย userCode
  • แสดง shortcut สร้างเอกสารเฉพาะเมนูที่อนุญาต

POS Terminal flow ทีละขั้น

1. Select branch ก่อน login

Terminal ต้องเลือกสาขา/คลังก่อน เพื่อให้เครื่อง POS รู้ context ของคลังที่จะใช้งาน

  • Step 1: เลือกสาขาหลัก
  • Step 2: เลือกคลังจริง
  • บันทึก branch payload แบบเดียวกับ Mobile
  • โหลด tax แบบ best effort หลังบันทึก branch

2. User selection / login

หลังเลือกคลัง Terminal จะโหลดรายชื่อพนักงานขายจาก whsGrpCode ของคลังที่เลือก

Terminal จึงต่างจาก Mobile ตรงที่ branch context มาก่อน user context และรายชื่อ login ถูกจำกัดด้วยคลังที่เลือก

3. Terminal Home

Terminal Home เป็น layout แบบ split-pane:

  • ซ้าย: เมนูและปุ่ม POS หน้าร้าน
  • กลาง: list ของเมนูที่เลือก
  • ขวา: detail/form/action ของรายการที่เลือก

เมนูหลักเกือบตรงกับ Mobile แต่ใช้ terminalMenus และ canAccessMenu ใน HomeScreen/config.ts สำหรับคำนวณสิทธิ์

4. POS หน้าร้าน เฉพาะ Terminal

StorefrontPos เป็น flow เต็มจอเฉพาะ Terminal สำหรับขายหน้าร้าน:

  • เปิดจากปุ่ม POS หน้าร้าน ใน menu pane
  • ไม่ใช่เมนู grid ของ Mobile
  • เริ่มจากระบุ/ค้นหาลูกค้า หรือขายสดไม่ระบุชื่อ
  • ต่อไปยังขั้นเลือกสินค้าและ checkout สำหรับหน้าร้าน

การหมดอายุของ session

  • Mobile ตรวจ login_date เมื่อ Home focus ถ้าไม่ใช่วันปัจจุบันจะ clear session และกลับไป Login
  • POS Terminal ใช้ login date เช่นกันใน Home context และพาออกจาก session เมื่อข้อมูลไม่พร้อมหรือหมดอายุ
  • การ logout จะ clear session storage เพื่อบังคับให้เริ่ม flow ใหม่ตามประเภทแอป

Checklist การดูแล

เมื่อเปลี่ยน startup/auth/branch behavior ให้ตรวจเอกสารเหล่านี้ด้วย:

  • workflows/mobile-terminal-end-to-end
  • workflows/login-branch-home
  • workflows/complete-menu-map
  • workflows/home-menu-and-permissions
  • governance/change-log