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

เมนู Home และสิทธิ์

หน้านี้อธิบายว่า Home screen ของ mobile ใช้เงื่อนไขอะไรในการตัดสินใจว่าเมนูไหนมองเห็นได้, shortcut ไหนใช้งานได้, และแต่ละ action จะพาไปหน้าไหน

ขอบเขต

อิงจาก:

  • apps/mobile/src/screens/homeScreen/index.tsx
  • apps/mobile/src/navigation/RootNavigator.tsx

หมายเหตุ parity ของ POS Terminal

ณ 2026-06-09 POS Terminal เพิ่มเมนู ใบสั่งขาย และ ตรวจสอบใบสั่งขาย ให้ตาม mobile แล้วในรูปแบบ split panel:

  • panel 1 ใช้ permission set เดียวกับ mobile (MENU_ORDER, MENU_ORDER_REVIEW)
  • panel 2 โหลดรายการจาก /orders ผ่าน service ของ terminal ที่ mirror mobile services/orders
  • ตรวจสอบใบสั่งขาย ใช้ mode เทียบเท่า mobile shipping-review: orderStatus=WAITING_PAYMENT และกรองรายการที่ hasShipment === 0
  • panel 2 รองรับ search, status filter, refresh, และ load-more pagination
  • panel 3 โหลดรายละเอียดจาก /orders/:id และใช้ OrderDetailForm เฉพาะสำหรับใบสั่งขาย แสดง customer/status/shipping type, summary ยอด/น้ำหนัก/ส่วนลด, และรายการสินค้า
  • panel 3 รองรับ action ลบรายการสินค้าในใบสั่งขาย DRAFT สำหรับ owner ตาม mobile gate พร้อม PATCH totals และ refresh detail/list หลังสำเร็จ
  • panel 3 แสดงสิทธิ์ส่วนลดที่ใช้อยู่ (point/coupon/credit note) และลบสิทธิ์ส่วนลดได้ตาม mobile owner/status gate
  • panel 3 รองรับการกรอกรหัสคูปองและใช้คูปองผ่าน POST /orders/:id/coupon ตาม mobile coupon flow
  • panel 3 รองรับใช้คะแนนตาม mobile point flow: โหลดคะแนนลูกค้า, ส่ง/ยืนยัน OTP จากเบอร์ลูกค้า, กรอกยอดเงินที่ใช้คะแนน และ POST /orders/:id/point
  • panel 3 รองรับใช้ส่วนลดเครดิตตาม mobile credit note discount flow: โหลด credit note ของลูกค้า, validate ยอดตาม company ของ order, ใช้ credit note, ส่ง OTP, และ confirm OTP
  • panel 3 รองรับพิมพ์เอกสารใบสั่งขายผ่าน shared print templates: ใบจัดหน้าร้าน, ใบเบิกไม่มี Lots, และใบเบิกมี Lots โดยบันทึก remark, ขยับ DRAFT เป็น NEW, refresh detail/list, และบันทึก print log
  • panel 3 รองรับ core payment flow ตาม mobile OrderPayment: โหลดใบแจ้งหนี้ของ order, guard prefix ซ้ำ, เลือก CASH/TRANSFER/QR, สร้าง QR Payment preview, validate เงินสด, และ POST /payment
  • panel 3 รองรับ payment invoice actions เพิ่มเติม: พิมพ์ใบแจ้งหนี้รายใบ และ retry ส่งข้อมูลใบแจ้งหนี้ใหม่ตาม mobile payment screen
  • panel 3 รองรับแนบสลิปโอนเงินและแชร์ QR Payment: upload slip ไป /orders/:orderNo/files, ส่ง slipPath ใน payment payload, และแชร์ QR ด้วย native share sheet
  • panel 3 รองรับเพิ่ม/แก้ไขรายการสินค้าใน order DRAFT สำหรับ owner ผ่าน product picker ของ terminal และ endpoint POST/PATCH /orders/:id/items
  • invoice detail รองรับ duplicate invoice/order flow ตาม mobile: เปิดใบสั่งขายจากใบแจ้งหนี้, เลือก vehicleRelease/documentMove เมื่อเป็นสาขาย่อย, replay สินค้าจาก invoice พร้อม progress overlay รายขั้นตอน/รายสินค้า, และเปิด order detail ที่สร้างใหม่

ส่วน order detail/action หลักของ mobile ถูกยกเข้ารูปแบบ split panel แล้ว

ณ 2026-06-09 POS Terminal เพิ่มเมนู จัดการที่อยู่ลูกค้า ให้ตาม mobile แล้ว:

  • panel 1 ใช้ permission set เดียวกับ การจัดการลูกค้า (MENU_CUSTOMER_MANAGEMENT)
  • panel 2 โหลดรายการจาก /customer-draft/address-lat-lng พร้อม search, refresh, และ load-more pagination
  • panel 3 โหลด /customer-draft/address-lat-lng/:id และแสดงข้อมูลคำขอ, ที่อยู่เดิม, เส้นทาง, พิกัดเก่า/ใหม่ พร้อม Google Map preview ของพิกัดเก่า/ใหม่ใน split panel
  • คำขอที่ status PENDING แสดง action อนุมัติ และ ไม่อนุมัติ โดยยิง endpoint /approve และ /reject ตาม mobile

ณ 2026-06-09 POS Terminal ปรับเมนู เปิด/ปิด สถานะลูกค้า ให้ตาม mobile request mode แล้ว:

  • panel 1 ใช้ permission set เดียวกับ mobile (MENU_CAN_ACTIVE_CUSTOMER)
  • panel 2 โหลดรายการลูกค้าจาก /customers ด้วย isRequest=1 ผ่าน customer service เดียวกับ mobile customer list พร้อม search, route filter, shipping type filter (สายส่ง/หน้าร้าน), refresh, และ load-more pagination
  • panel 3 โหลด customer detail ล่าสุด แล้วแสดงข้อมูลคำขอเปลี่ยนสถานะ พร้อม action อนุมัติคำขอ และ ปฏิเสธคำขอ
  • action ยิง PATCH /customers/:customerCode/approve หรือ /customers/:customerCode/reject ตาม mobile และหลังสำเร็จจะ refresh list แล้วปิด detail กลับไปหน้า list
  • route filter โหลดตัวเลือกจาก getRoutesByBranch ด้วย branch code ปัจจุบัน และส่ง routeCode เข้า /customers เหมือน mobile

ณ 2026-06-09 POS Terminal ปรับเมนู สินค้า ให้ตาม mobile product inventory list แล้ว:

  • panel 1 ใช้ permission set เดียวกับ mobile (MENU_PRODUCT)
  • panel 2 โหลด inventory snapshot ตามสาขาจาก Firestore service ของ terminal แทน generic MST /products
  • panel 2 รองรับ search, refresh, load-more pagination, tab ทั้งหมด / ติดจอง, และ card สีตาม product color พร้อมตัวเลขราคา, SAP, POS, จอง
  • panel 3 โหลดรายละเอียดสินค้าจาก inventory snapshot ล่าสุด และแสดงข้อมูล stock, คลัง, หน่วยขาย, น้ำหนัก/หน่วย, คุมน้ำหนัก, บริษัท และ step price เมื่อมี
  • panel 3 รองรับ action เพิ่มสินค้าเข้าใบสั่งขายจาก mobile ProductDetail: กรอกจำนวน/ราคา/น้ำหนัก, เลือกลูกค้าผ่าน customer picker mode salesOrder, สร้าง order draft, เพิ่ม item, ปรับ totals, และเปิด order detail ที่สร้างใหม่

ณ 2026-06-09 POS Terminal ปรับเมนู ลดหนี้ / คืนสินค้า ให้ตาม mobile credit note list/detail มากขึ้นแล้ว:

  • panel 1 ใช้ permission set เดียวกับ mobile (MENU_CREDIT_NOTE)
  • panel 2 โหลดรายการจาก /credit-notes พร้อม search, status filter, return-only filter, refresh, และ load-more pagination
  • panel 3 โหลด /credit-notes/:id และแสดง header/status, invoice/customer/reason/warehouse/totals, รูปแนบ, และรายการสินค้า/Location/Lot
  • panel 3 รองรับ action บันทึกสถานะ, ส่ง B1, ลบรายการสินค้า, และลบรูปแนบตาม mobile permission/status gate
  • panel 3 รองรับ upload image, update item modal สำหรับรายการเดิม, และ edit location/lot picker ตาม mobile credit note detail
  • invoice detail รองรับ เปิดใบคืนสินค้า: เปิด draft credit note จาก invoice, เลือกเหตุผล, เพิ่ม item ใหม่จาก invoice picker, POST /credit-notes, POST /items, แล้วเปิด detail/list ล่าสุดใน split panel

ณ 2026-06-09 POS Terminal เริ่มปรับเมนู ย้ายสินค้าระหว่างคลัง ให้ตาม mobile transfer warehouse แล้ว:

  • panel 1 ใช้ permission set เดียวกับ mobile stock menu (MENU_STOCK)
  • panel 2 โหลดรายการจาก /transfer-branches ผ่าน service เฉพาะของ terminal พร้อม branch context เดียวกับ mobile
  • panel 3 โหลด /transfer-branches/:id และแสดงเลขที่, คลังต้นทาง/ปลายทาง, บริษัท, ผู้บันทึก, หมายเหตุ, จำนวนรวม และรายการสินค้า/Batch
  • panel 3 รองรับ action ส่งเข้า B1 ผ่าน /transfer-branches/:id/to-b1 และลบรายการสินค้าผ่าน DELETE /items/:itemId
  • panel 3 รองรับสร้าง/แก้ไขใบย้ายสินค้าแบบ terminal: เปิด draft จากปุ่มบวก, เลือกคลังปลายทาง, บันทึก header ผ่าน POST/PATCH /transfer-branches, เพิ่ม/แก้รายการสินค้า, เลือก Batch, และบันทึก item ผ่าน POST/PATCH /items
  • stock menu หลักที่ mobile อัปเดตเพิ่มแล้วถูกยกเข้า terminal แล้ว เหลือ follow-up เฉพาะ validation/UX รายละเอียด Batch เชิงลึกที่ต้องทดสอบกับข้อมูลจริง

ณ 2026-06-09 POS Terminal ปรับเมนู รับสินค้าเข้าตรง ให้ตาม mobile goods receipt มากขึ้นแล้ว:

  • panel 1 ใช้ permission set เดียวกับ mobile stock menu (MENU_STOCK)
  • panel 2 โหลดรายการจาก /goods-receipt-po ผ่าน service เฉพาะของ terminal พร้อม branch context และ dedupe key แบบ mobile
  • panel 3 ใช้ GoodsReceiptDetailForm แสดงเลขที่, วันที่, พนักงาน, หมายเหตุ, จำนวนรวม Batch และรายการสินค้า/Lot
  • panel 3 รองรับเพิ่มสินค้าใหม่จาก inventory picker พร้อม dummy product ตาม company, แก้หมายเหตุรายการ, เพิ่ม/แก้/ลบ Batch, คำนวณจำนวนรับจากยอด Batch และลบสินค้าใหม่ก่อน submit
  • panel 3 Batch editor รองรับ date picker สำหรับ วันที่รับเข้า, วันที่ผลิต, และ วันหมดอายุ เหมือน mobile BatchLotEditorModal
  • panel 3 validate จำนวนสินค้า/Batch และ submit payload ไป POST /stock-in ตาม mobile createGoodsReceiptStockIn แล้ว refresh list หลังบันทึก
  • Batch date picker parity ของ stock receipt/transfer หลักถูกยกเข้า terminal แล้ว เหลือ follow-up เฉพาะ UX รายละเอียด Batch เชิงลึกที่ต้องทดสอบกับข้อมูลจริง

ณ 2026-06-09 POS Terminal ปรับเมนู โอนสินค้าไปสาขา ให้ตาม mobile transfer out มากขึ้นแล้ว:

  • panel 1 ใช้ permission set เดียวกับ mobile stock menu (MENU_STOCK)
  • panel 2 โหลดรายการจาก /transfers-out ผ่าน service เฉพาะของ terminal พร้อม whGrpCode context และ dedupe key แบบ mobile
  • panel 3 ใช้ TransferOutDetailForm แสดงเลขที่, วันที่, ต้นทาง/ปลายทาง, พนักงาน, หมายเหตุ, ยอด Batch ที่เลือก และรายการสินค้า
  • panel 3 รองรับเลือก Batch จาก lot API ตามสินค้า/คลัง/company, ค้นหา Batch, แก้จำนวน, ลบ Batch, ตรวจยอดค้างเบิก และป้องกันเลือก Batch ซ้ำหรือเกินยอดคงเหลือ
  • panel 3 Batch editor รองรับ date picker สำหรับ วันที่รับเข้า, วันที่ผลิต, และ วันหมดอายุ เหมือน mobile BatchLotEditorModal
  • panel 3 validate ให้ทุก line เลือก Batch ครบตามจำนวนเบิก แล้ว submit payload ไป POST /transfer-out ตาม mobile createTransferOut พร้อม refresh list หลังบันทึก
  • follow-up ที่เหลือคือการทดสอบ UX รายละเอียด Batch กับข้อมูลจริง

ณ 2026-06-09 POS Terminal ปรับเมนู รับสินค้าจากสาขา ให้ตาม mobile transfer in มากขึ้นแล้ว:

  • panel 1 ใช้ permission set เดียวกับ mobile stock menu (MENU_STOCK)
  • panel 2 โหลดรายการจาก /transfers-in ผ่าน service เฉพาะของ terminal โดยรวมคลังหลักและ NF- tab แบบ mobile แล้ว dedupe ใน list เดียวตามรูปแบบ terminal
  • panel 3 ใช้ TransferInDetailForm แสดงเลขที่, วันที่, สาขาต้นทาง, พนักงาน, หมายเหตุ, จำนวนรวม Batch และรายการสินค้า
  • panel 3 รองรับเพิ่มสินค้าใหม่จาก inventory picker พร้อม dummy product ตาม company, auto batch สำหรับ dummy, แก้หมายเหตุรายการ, เลือก Batch จาก lot API, แก้/ลบ Batch, sync จำนวนรับจากยอด Batch และลบสินค้าใหม่ก่อน submit
  • panel 3 Batch editor รองรับ date picker สำหรับ วันที่รับเข้า, วันที่ผลิต, และ วันหมดอายุ เหมือน mobile BatchLotEditorModal
  • panel 3 validate จำนวนสินค้า แล้ว submit payload ไป POST /transfer-in ตาม mobile createTransferIn พร้อม refresh list หลังบันทึก
  • stock menu หลักที่ mobile อัปเดตเพิ่มแล้วถูกยกเข้า terminal แล้ว เหลือ follow-up เฉพาะการทดสอบ UX รายละเอียด Batch กับข้อมูลจริง

ณ 2026-06-09 ตรวจ permission gate ของ stock menu เทียบ mobile แล้ว:

  • terminal มีเมนู Home ครบชุดเดียวกับ mobile (การขาย, คลังสินค้า, ข้อมูล, อื่นๆ)
  • ปรับ canAccessMenu ให้ stock menu ทั้ง 4 รายการ (รับสินค้าเข้าตรง, โอนสินค้าไปสาขา, รับสินค้าจากสาขา, ย้ายสินค้าระหว่างคลัง) เปิดให้สาขาย่อยได้ด้วยเงื่อนไข branch.isMain === false เหมือน mobile ที่ใช้ isNonMainBranch || MENU_STOCK.has(deptCode)
  • เมนูที่ต้องเป็นสาขาหลักยังคง gate เดิม: ใบจัดสินค้าสายส่ง, ขนส่ง, บิลน้ำมัน

ณ 2026-06-09 POS Terminal ปรับเมนู ลูกค้า ให้ตาม mobile customer list/detail มากขึ้นแล้ว:

  • panel 2 โหลดรายการลูกค้าผ่าน getCustomerSapList service เดียวกับ mobile customer list แทน generic API call เดิม
  • panel 3 โหลดรายละเอียดผ่าน /customers/:id ด้วย getCustomerSplitDetail แล้วใช้ CustomerDetailForm แสดงข้อมูลลูกค้าหลัก, ประเภทจัดส่ง, tier, เครดิต, คะแนน, ที่อยู่, เส้นทาง และสาขาที่เกี่ยวข้อง
  • panel 3 รองรับ action จาก mobile customer detail แล้ว: บันทึก call log และเปิด dialer (/customers/:id/re-call), ขอเปิด/ปิดสถานะลูกค้า (/customers/:code/status), เปิด Google Maps จากพิกัดที่อยู่, ตั้งที่อยู่จัดส่งเริ่มต้น (/addresses/:addressId/default), และส่งคำขออัปเดตพิกัดที่อยู่ (/customer-draft/address-lat-lng) โดย reload detail หลัง action สำเร็จ
  • panel 3 รองรับฟอร์ม เพิ่มที่อยู่ แบบ bypass จาก mobile CustomerDetail: เลือก BillTo/ShipTo, กรอกที่อยู่, ค้นหาตำบล/อำเภอ/จังหวัด/รหัสไปรษณีย์จาก dbAddress, เลือกสายส่งจาก /routes?branchCode=..., ดึงพิกัดจากอุปกรณ์, เลือกพิกัดผ่าน WebView Google Maps picker, แล้ว PATCH /customers/:code/addresses
  • customer profile action หลักจาก mobile CustomerDetail ถูกยกเข้า terminal split panel แล้ว; รอบ audit ถัดไปควรตรวจเมนูอื่นหรือรายละเอียด UX เฉพาะจุดที่ mobile อัปเดตเพิ่มหลังชุดลูกค้า

ณ 2026-06-09 POS Terminal ปรับเมนู การจัดการลูกค้า ให้ตาม mobile customer management detail มากขึ้นแล้ว:

  • panel 2 โหลด draft ผ่าน getCustomerDrafts service เฉพาะเดียวกับ mobile แทน generic /customer-draft call เดิม
  • panel 3 โหลด /customer-draft/:id, /addresses, และ /branches ด้วย getCustomerManagementSplitDetail
  • panel 3 ใช้ CustomerManagementDetailForm แสดงข้อมูล draft, ที่อยู่, สาขาที่เปิดบิลได้ และรองรับ action อนุมัติข้อมูล / ไม่อนุมัติ ด้วย endpoint /approve และ /reject ตาม mobile
  • action approve/reject ใช้ gate เดียวกับ mobile (isAdmin, approveCustomer, หรือ dept 7/29)
  • panel 3 รองรับแก้ไข core draft fields แล้ว (ชื่อ, นามสกุล, ฉายา, Tax ID, วันเกิด, เบอร์โทร, อีเมล, shippingType, ผู้รับผิดชอบ, สาขาหลัก, ประเภทลูกค้า, รู้จักเราจาก) ผ่าน PATCH /customer-draft/:id และ reload detail/list หลังบันทึก
  • panel 3 รองรับ address child CRUD ผ่าน POST/PATCH/DELETE /customer-draft/:id/addresses และ branch child CRUD ผ่าน POST/DELETE /customer-draft/:id/branches; การลบสาขาใช้ guard ต้องเหลืออย่างน้อย 1 สาขาเหมือน mobile
  • panel 2 มีปุ่มสร้าง draft ลูกค้าใหม่ เปิด panel 3 แบบ draft, prefill user/branch ปัจจุบัน, validate core required fields ตาม mobile, POST /customer-draft, สร้าง branch child ตั้งต้น แล้วเปิด detail ที่ server สร้างกลับมา
  • panel 3 ใช้ picker แบบ mobile สำหรับ ประเภทลูกค้า ผ่าน /customer-types, รู้จักเราจาก ผ่าน /knowus, และ สายส่ง ใน address editor ผ่าน /routes?branchCode=...
  • panel 3 address editor รองรับค้นหาตำบล/อำเภอ/จังหวัด/รหัสไปรษณีย์จาก dbAddress แบบ mobile และเติม U_BFP_Tambon, U_BFP_Amphur, city, zipCode, block อัตโนมัติ
  • panel 3 address editor รองรับ ดึงพิกัดจากอุปกรณ์ ด้วย react-native-geolocation-service และเติม U_BFP_Latitude/U_BFP_Longitude ลง address payload
  • panel 3 address editor รองรับ เลือกจากแผนที่ ด้วย WebView Google Maps picker, drag/click/search ตำแหน่ง และเติม U_BFP_Latitude/U_BFP_Longitude เมื่อกดใช้พิกัดนี้
  • CustomerManagementEdit parity หลักของ draft create/edit, address/branch child CRUD, master-data picker, address search และ map/GPS picker ถูกยกเข้า terminal split panel แล้ว

ณ 2026-06-09 POS Terminal ปรับเมนู ผู้ใช้ทั้งหมด ให้ตาม mobile employee list/detail แล้ว:

  • panel 1 ใช้ permission set เดียวกับ mobile (MENU_EMPLOYEE)
  • panel 2 โหลดรายชื่อผู้ใช้จาก /users พร้อม search, refresh, และ load-more pagination
  • panel 2 card แสดงชื่อผู้ใช้, อีเมล, และแผนก ตาม mobile EmployeeListCard
  • panel 3 โหลด /users/:id และแสดงข้อมูลพื้นฐานกับ permission flags
  • panel 3 รองรับการแก้ไข permission flags และบันทึกกลับ /users/:id รวมถึง reset password salt endpoint ตาม mobile
  • panel 3 มี section ตั้งค่ารับโอนสินค้าภายในสาขา ตาม mobile: เลือกสาขา, โหลดคลังย่อย, และ toggle สิทธิ์รับโอนสินค้าภายในสาขาของพนักงาน

หน้าที่ของหน้า Home

หน้า Home ไม่ได้เป็นแค่ landing page แต่ทำหน้าที่เป็น:

  • authenticated navigation hub แรกของระบบ
  • permission gate ชั้นแรกของ flow ถัดไป
  • จุดที่บังคับ branch-specific access
  • จุด logout ของ mobile app

ข้อมูลตั้งต้นที่ใช้ตัดสินใจ

หน้า Home โหลด state จาก storage สองส่วน:

  • user จาก getUser()
  • branch จาก getBranch()

แล้วคำนวณ:

  • deptCode = Number(user?.deptCode ?? -999)
  • isMainBranch = branch?.isMain === true

สองค่านี้เป็นตัวตัดสินหลักของการแสดงเมนูและ shortcut แต่ตอนนี้ isMainBranch ถูกใช้กับเพียงบางเมนูเท่านั้น

ขั้นตอนการตัดสินใจ

กลุ่มเมนูหลัก

ตอนนี้ Home แสดง 4 กลุ่มหลัก:

  • การขาย
  • คลังสินค้า
  • ข้อมูล
  • อื่นๆ

โมเดล permission

implementation ปัจจุบันใช้ Set<number> แบบ hard-coded สำหรับ visibility และ create-shortcut

ชุดสิทธิ์การมองเห็น

  • MENU_ORDER
  • MENU_ORDER_REVIEW
  • MENU_BOOKING
  • MENU_INVOICE
  • MENU_SHIPPING
  • MENU_STOREFRONT
  • MENU_BORROW
  • MENU_STOCK
  • MENU_PRODUCT
  • MENU_CUSTOMER
  • MENU_TRANSPORT
  • MENU_CUSTOMER_MANAGEMENT
  • MENU_CAN_ACTIVE_CUSTOMER
  • MENU_CREDIT_NOTE
  • MENU_EMPLOYEE
  • MENU_DEPOSIT
  • MENU_EXPENSE

ชุดสิทธิ์ shortcut สร้างเอกสาร

  • CAN_CREATE_ORDER
  • CAN_CREATE_SHIPPING
  • CAN_CREATE_TRANSPORT
  • CAN_CREATE_DEPOSIT

หมายเหตุล่าสุดตามแผนก

  • ตอนนี้ deptCode 20 ถูกใส่ไว้ใน MENU_ORDER, MENU_ORDER_REVIEW, MENU_BOOKING, MENU_INVOICE, MENU_STOREFRONT, MENU_BORROW, MENU_PRODUCT และ CAN_CREATE_ORDER
  • ในทางปฏิบัติ แผนก 20 จะเห็น ใบสั่งขาย, ตรวจสอบใบสั่งขาย, ใบจองราคา, ใบแจ้งหนี้, ใบจัดส่งสินค้าหน้าร้าน และ สินค้า และใช้ create shortcut ที่อิง CAN_CREATE_ORDER ได้
  • ลูกค้า มี deptCode 20 อยู่ใน MENU_CUSTOMER แล้วเช่นกัน และตอนนี้ไม่ถูก gate ด้วย isMainBranch แล้ว
  • isMainBranch ยังถูกบังคับใช้เฉพาะ ใบจัดส่งสินค้าสายส่ง, ขนส่ง และ บิลน้ำมัน

Matrix สิทธิ์

Menu labelVisible whenต้องเป็น main branchShortcut rule
ใบสั่งขายMENU_ORDER.has(deptCode)ไม่ต้องCAN_CREATE_ORDER
ตรวจสอบใบสั่งขายMENU_ORDER_REVIEW.has(deptCode)ไม่ต้องไม่มี
ใบจองราคาMENU_BOOKING.has(deptCode)ไม่ต้องCAN_CREATE_ORDER
ใบแจ้งหนี้MENU_INVOICE.has(deptCode)ไม่ต้องไม่มี
ใบจัดส่งสินค้าสายส่งMENU_SHIPPING.has(deptCode)ต้องเป็นCAN_CREATE_SHIPPING
ใบจัดส่งสินค้าหน้าร้านMENU_STOREFRONT.has(deptCode)ไม่ต้องไม่มี
ใบเบิกยืมดูปลาMENU_BORROW.has(deptCode)ไม่ต้องCAN_CREATE_ORDER
รับสินค้าเข้าตรง`branch.isMain === falseMENU_STOCK.has(deptCode)`
โอนสินค้าไปสาขา`branch.isMain === falseMENU_STOCK.has(deptCode)`
รับสินค้าจากสาขา`branch.isMain === falseMENU_STOCK.has(deptCode)`
ย้ายสินค้าระหว่างคลัง`branch.isMain === falseMENU_STOCK.has(deptCode)`
สินค้าMENU_PRODUCT.has(deptCode)ไม่ต้องไม่มี
ลูกค้าMENU_CUSTOMER.has(deptCode)ไม่ต้องไม่มี
ขนส่งMENU_TRANSPORT.has(deptCode)ต้องเป็นCAN_CREATE_TRANSPORT
การจัดการลูกค้าMENU_CUSTOMER_MANAGEMENT.has(deptCode)ไม่ต้องไม่มี
จัดการที่อยู่ลูกค้าMENU_CUSTOMER_MANAGEMENT.has(deptCode)ไม่ต้องไม่มี
เปิด/ปิด สถานะลูกค้าMENU_CAN_ACTIVE_CUSTOMER.has(deptCode)ไม่ต้องไม่มี
ลดหนี้ / คืนสินค้าMENU_CREDIT_NOTE.has(deptCode)ไม่ต้องไม่มี
ผู้ใช้ทั้งหมดMENU_EMPLOYEE.has(deptCode)ไม่ต้องไม่มี
ยานพาหนะMENU_EMPLOYEE.has(deptCode)ไม่ต้องไม่มี
ฝากเงินMENU_DEPOSIT.has(deptCode)ไม่ต้องCAN_CREATE_DEPOSIT
บิลน้ำมันMENU_EXPENSE.has(deptCode)ต้องเป็นไม่มี

สำหรับเมนูคลังสินค้า branch ที่ไม่ใช่ main จะ bypass deptCode check ที่ Home menu ส่วนหน้า list/detail ของเมนูคลังสินค้าไม่ได้เพิ่ม deptCode gate ของ action ที่มีอยู่; action ถูกคุมด้วยสถานะเอกสารและความครบของข้อมูลแทน

Mapping การนำทาง

เมื่อกด card หลัก

Menu labelNavigation target
ใบสั่งขายOrderList พร้อม { mode: 'default' }
ตรวจสอบใบสั่งขายOrderList พร้อม { mode: 'shipping-review' }
ใบจองราคาBookingPriceList
ใบเบิกยืมดูปลาBorrowList
สินค้าProductList
ใบแจ้งหนี้InvoiceList
ใบจัดส่งสินค้าสายส่งShippingList
ใบจัดส่งสินค้าหน้าร้านStorefrontList
ขนส่งTransportList
รับสินค้าเข้าตรงGoodsReceiptList
โอนสินค้าไปสาขาTransferOutList
รับสินค้าจากสาขาTransferInList
ย้ายสินค้าระหว่างคลังTransferWarehouseList
ฝากเงินDepositList
บิลน้ำมันExpenseBillList
ลดหนี้ / คืนสินค้าCreditNoteList
ลูกค้าCustomerList พร้อม { mode: 'default' }
เปิด/ปิด สถานะลูกค้าCustomerList พร้อม { mode: 'request' }
การจัดการลูกค้าCustomerManagementList
จัดการที่อยู่ลูกค้าCustomerManagementAddressList
ผู้ใช้ทั้งหมดEmployeeList
ยานพาหนะVehicleList

พฤติกรรม shortcut

shortcut จะมีเฉพาะบางเมนู และจะใช้งานได้เมื่อ CAN_CREATE_* อนุญาตเท่านั้น

Menu labelShortcut target
ใบสั่งขายCustomerList พร้อม { mode: 'default', origin: { screen: 'Home' } }
ใบจองราคาCustomerList พร้อม { mode: 'booking', origin: { screen: 'Home' } }
ใบเบิกยืมดูปลาCustomerList พร้อม { mode: 'borrow', origin: { screen: 'Home' } }
ใบจัดส่งสินค้าสายส่งShippingDetail พร้อม { deliveryId: null, mode: 'create' }
ขนส่งTransportDetail พร้อม { transportId: null }
ฝากเงินDepositDetail พร้อม { depositId: null }

พฤติกรรมที่ควร note

  • บางเมนูมองเห็นได้ แต่ไม่มี shortcut
  • ตอนนี้มีเฉพาะ ใบจัดส่งสินค้าสายส่ง, ขนส่ง และ บิลน้ำมัน เท่านั้นที่ถูกซ่อนทั้งหมดเมื่อ branch ไม่ใช่ main branch
  • shortcut visibility แยกจาก card visibility ดังนั้นผู้ใช้อาจเห็นการ์ดแต่ไม่เห็น create action
  • Home จะกรองเมนูในแต่ละ section ก่อน แล้วตัด section ที่ไม่มีรายการออก
  • Home จะโหลด user และ branch จาก storage ใหม่ทุกครั้งที่หน้ากลับมา focus เพื่อให้ visibility ของเมนูตรงกับคลังที่เลือกล่าสุด โดยเฉพาะกรณีเปลี่ยนจากคลังรอง isMain: false กลับมาเป็นคลังหลัก isMain: true

การออกจากระบบ

Home ส่งการ logout ผ่าน HeaderHome

เมื่อ logout:

  • เรียก clearAllStorage()
  • เรียก onLogout?.()
  • แอปจะกลับไปยัง unauthenticated navigation state

จุดเสี่ยงด้าน maintenance

permission model ปัจจุบันกระจุกอยู่ในไฟล์ screen เดียวและกระจายอยู่หลายจุด:

  • MENU_SECTIONS
  • visibility Sets
  • create-shortcut Sets
  • onPress navigation mapping
  • onShortcutPress navigation mapping

ถ้าจะเพิ่มหรือแก้ Home menu item ให้แก้ทั้งหมดนี้พร้อมกัน:

  1. menu definition
  2. visibility rule
  3. shortcut rule ถ้ามี
  4. navigation target
  5. หน้า wiki นี้
  6. changelog ถ้า behavior เปลี่ยนอย่างมีนัยสำคัญ