BOOK 23/25พนักงานและระบบ
ตั้งค่าร้าน
หน้า “ตั้งค่าร้าน” รวมค่าคอนฟิกของทั้งระบบไว้หลายแท็บ: ข้อมูลร้าน/ภาษี/ใบเสร็จ, การทำงานหน้าร้าน, ค่าขั้นสูง/ความปลอดภัย, CRM/สมาชิกเชิงลึก, Secrets เชื่อมต่อระบบภายนอก และเครื่องมือเฉพาะเจ้าของ — ตั้งค่าโหมด QR รับเงินและ Sync ข้ามเครื่องมีคู่มือแยกของตัวเอง (ดูคู่มือ PromptPay และซิงค์ข้อมูล)
ข้อมูลร้าน ภาษี และใบเสร็จ
ตั้งชื่อร้านและเวลาทำการ
เข้าเมนู “ตั้งค่า” แท็บ “ทั่วไป” กรอกชื่อร้าน เวลาเปิด และเวลาปิด — รองรับข้ามเที่ยงคืน (เช่น เปิด 17:00 ปิด 02:00) เว้นว่างทั้งคู่ = ไม่ทราบเวลาเปิด-ปิด ระบบทำงานเหมือนเดิมทุกประการ
เวลาทำการนี้ใช้ลดความถี่ heartbeat ของระบบกับฐานข้อมูลคลาวด์นอกเวลาร้านเปิด เพื่อประหยัดการใช้งานคลาวด์เท่านั้น ไม่ได้บังคับปิด/เปิดฟีเจอร์ใดๆ นอกเวลาที่ตั้งไว้

เปิดภาพเต็ม ภาษีมูลค่าเพิ่ม ค่าบริการ ข้อมูลใบเสร็จ และภาษาระบบ
เปิด/ปิด VAT และ Service Charge ได้อิสระต่อกัน — ราคาสินค้าทุกตัวในระบบถือว่า “รวม VAT แล้ว” เสมอ ระบบคำนวณแยกแสดงในใบเสร็จให้เอง ไม่ต้องตั้งราคาแบบไม่รวมภาษีเอง ส่วน Service Charge คำนวณจากยอดก่อน VAT แล้วบวกเพิ่มอัตโนมัติทุกบิลเมื่อเปิดใช้
ที่อยู่ร้าน เลขประจำตัวผู้เสียภาษี (Tax ID) และเบอร์โทรศัพท์ที่กรอกในแท็บนี้จะไปแสดงบนหัวใบเสร็จทุกใบที่พิมพ์
การ์ด “ภาษาที่แสดงในระบบ” เลือกได้ว่าจะเปิดให้พนักงานสลับภาษาไทย/อังกฤษ/พม่าได้บ้าง — ไทยเปิดล็อกไว้เสมอปิดไม่ได้ ปิดภาษาใดจะทำให้พนักงานที่เลือกภาษานั้นไว้ถูก reset กลับเป็นไทยอัตโนมัติ (การตั้งค่านี้ไม่มีผลกับหน้าลูกค้า LIFF ซึ่งแสดงแค่ไทย/อังกฤษเสมอไม่ว่าจะตั้งอย่างไร)

เปิดภาพเต็ม
การทำงานหน้าร้าน
เวลาแจ้งเตือนค้างและพิมพ์ใหม่อัตโนมัติ
แท็บ “การทำงาน” ตั้งเวลาที่ระบบจะไฮไลท์/กระพริบเตือนพนักงานเมื่อค้างเกินกำหนด แยก 4 จุด: โต๊ะที่ยังไม่ปิดบิล, ออเดอร์บาร์ที่ยังไม่ทำ, ออเดอร์ครัวที่ยังไม่ทำ และเมนู “พร้อมเสิร์ฟ” ที่ปักหน้าจอครัว/บาร์นานเกินไปก่อนจะหายไปเอง
ถ้าส่งใบงานไปเครื่องพิมพ์ไม่สำเร็จ (เน็ตหลุด/เครื่องพิมพ์ดับ) ระบบลองส่งใหม่อัตโนมัติตามจำนวนครั้งและกรอบเวลาที่ตั้งไว้ก่อนจะเก็บไว้ให้กดพิมพ์ใหม่เองที่หน้า POS — ตั้งจำนวนครั้งเป็น 0 = ปิดการลองใหม่อัตโนมัติทั้งหมด

เปิดภาพเต็ม ล็อกคีย์ออเดอร์หลังส่งครัว และส่วนลดพนักงาน
ล็อกคีย์ออเดอร์: หลังกด “ส่งเข้าครัว/บาร์” ครั้งแรกของบิลนั้น ถ้าเกินเวลาที่ตั้งไว้จะคีย์เมนูเพิ่มในบิลนั้นไม่ได้อีก ต้องมีสิทธิ์ order.after_timelock ยืนยัน PIN ก่อนถึงจะคีย์ต่อได้ — ตั้งเป็น 0 = ปิดฟีเจอร์นี้ (ไม่ล็อก)
ส่วนลดพนักงาน: ตั้ง % ส่วนลดกลางตัวเดียว + เลือกหมวดเมนูที่ใช้ส่วนลดนี้ได้ พนักงานเลือกโหมด “ส่วนลดพนักงาน” ที่หน้าคิดเงินได้เท่านั้น พิมพ์ % เองไม่ได้ — ถ้าตั้ง % เป็น 0 หรือยังไม่เลือกหมวดเมนูเลยแม้แต่หมวดเดียว ปุ่มส่วนลดพนักงานจะกดยืนยันไม่ได้เลย

เปิดภาพเต็ม หน้าโต๊ะและช่องทางรับชำระที่เปิดใช้
หน้าโต๊ะ: เลือกให้แท็บ “เมนูงดจำหน่าย” ในหน้าผังโต๊ะจัดกลุ่มตามหมวด (Category) หรือกลุ่ม (Group) — มีผลแค่การจัดกลุ่มแสดงผล ไม่กระทบสถานะงดจำหน่ายของเมนูเอง
ช่องทางรับชำระที่เปิดใช้ (คนละส่วนกับโหมดตรวจสลิป — ดูคู่มือ PromptPay): เลือกได้ 3 ทาง เงินสด/QR-PromptPay/บัตร EDC — ทางที่ไม่ติ๊กจะไม่ขึ้นเป็นตัวเลือกในหน้าคิดเงินเลย ถ้าไม่ติ๊กเลยสักทางระบบจะเปิดให้ทั้งหมดอัตโนมัติแทน ส่วนปุ่ม “แสดง QR ชำระเงิน” ที่หน้าโต๊ะ/หน้าคิดเงิน ปิดแยกอิสระได้โดยไม่กระทบ QR ท้ายใบเสร็จหรือ QR สะสมแต้มแต่อย่างใด
ยืนยันเงินเข้าอัตโนมัติ: เปิด/ปิดระบบจับคู่เงินโอนเข้ากับบิลที่เปิดอยู่ได้ พร้อมตั้งช่วงเวลาที่ยอมให้จับคู่ (นับจากบิลเปิด) — เป็นคนละกลไกกับหน้า “เงินเข้า PromptPay (Alerts)” ที่ใช้จับคู่ด้วยมือเมื่อจับคู่อัตโนมัติไม่ได้ (รายละเอียดเต็มอยู่ในคู่มือ PromptPay)

เปิดภาพเต็ม
ขั้นสูงและความปลอดภัย
รายชื่อยี่ห้อเหล้าและการอนุมัติสองชั้น
แท็บ “ขั้นสูง” เพิ่ม/แก้/ลบรายชื่อยี่ห้อเหล้าที่จะขึ้นเป็นตัวเลือกในฟอร์มฝากเหล้าของพนักงาน — มีตัวเลือก “อื่นๆ” ให้กรอกเองเสมอไม่ว่าจะตั้งรายชื่อไว้กี่ยี่ห้อก็ตาม
เปิด “คืนเงินต้องอนุมัติ 2 คน” (dual control) แล้วทุกการคืนเงินต้องมีผู้มีสิทธิ์ bill.refund สองคนที่ต่างกันกรอก PIN ยืนยันคนละครั้ง — พนักงานคนเดียวกดยืนยันซ้ำสองครั้งแทนกันไม่ได้

เปิดภาพเต็ม
CRM / สมาชิก — ตั้งค่าเชิงลึก
อัตราสะสมแต้ม วันเกิดสมาชิก และของแจกฟรีจากคูปอง
แท็บ “CRM / สมาชิก” ตั้งอัตราแปลงยอดใช้จ่ายเป็นแต้ม (ทุกกี่บาทได้กี่แต้ม) ใช้ร่วมกันทุกช่องทางสะสมแต้มของสมาชิก
ตั้งช่วงวันก่อน/หลังวันเกิดจริงที่จะให้ขึ้นสัญลักษณ์วันเกิดบนโต๊ะให้พนักงานเห็น — ตั้ง 0 = ขึ้นเฉพาะวันเกิดจริงวันเดียว
คูปองแถมสินค้า (free item) ที่ตั้งเป้าหมายไว้มากกว่า 1 รายการ เลือกได้ว่าจะให้ลูกค้า/พนักงานเลือกเมนูเองตอนใช้คูปอง (ค่าเริ่มต้น) หรือให้ระบบเลือกเมนูที่ถูกที่สุดในบิลให้อัตโนมัติแทน — ไม่มีผลใดๆ กับคูปองที่ตั้งเป้าหมายไว้แค่รายการเดียว (ได้ของนั้นฟรีทันทีทุกโหมดอยู่แล้ว)

เปิดภาพเต็ม ระดับสมาชิก (Tier) และอายุแต้มสะสม
ตั้งขีดยอดใช้จ่ายสะสม (บาท) ของระดับ Silver/Gold พร้อมช่วงเวลาที่นับยอด (เดือน) — ต้องตั้งทั้งขีดเงินและช่วงเวลาถึงจะเริ่มทำงาน ถ้าเว้นว่างช่องใดช่องหนึ่ง ระบบจะไม่คำนวณระดับสมาชิกอัตโนมัติเลย เปลี่ยนได้เฉพาะตอนพนักงานแก้เองที่หน้าศูนย์สมาชิกเท่านั้น (ดูคู่มือสมาชิก/แต้มสะสมสำหรับขั้นตอนแก้ระดับด้วยมือ)
ตั้งอายุแต้มต่อก้อน (เดือน) นับจากวันที่ได้รับแต้มก้อนนั้น พร้อมจำนวนวันแจ้งเตือนล่วงหน้าก่อนหมดอายุ — เว้นว่างช่องอายุแต้ม = แต้มของสมาชิกไม่หมดอายุเลย

เปิดภาพเต็ม แจ้งเตือนอัตโนมัติผ่าน LINE
ตั้งชั่วโมงที่ระบบจะส่งแจ้งเตือนประจำวัน (0-23 น.) แล้วเปิด/ปิดแยกแต่ละหัวข้อได้อิสระ: เหล้าฝากใกล้หมดอายุ (ตั้งจำนวนวันล่วงหน้าที่จะแจ้งเพิ่มได้เอง), วันเกิดจริง, และวันที่ 1 ของเดือนเกิด — แก้ข้อความแม่แบบของแต่ละหัวข้อได้เอง ใส่ตัวแปร {name} {item} {days} {date} ในข้อความได้
ทดสอบส่งจริงได้ทันทีโดยไม่ต้องรอรอบส่งประจำวัน — เลือกสมาชิกที่ผูก LINE ไว้แล้วจากช่องค้นหาด้านบน แล้วกดปุ่ม “ส่งทดสอบ” ใต้หัวข้อที่ต้องการ (ต้องมีสมาชิกอย่างน้อย 1 คนที่เคย login LIFF ผูก LINE ไว้แล้วถึงจะเลือกได้)

เปิดภาพเต็ม สะสมแต้ม QR ท้ายใบเสร็จ และสรุปการจองรายวัน → LINE กลุ่มพนักงาน
เปิดใช้ QR สะสมแต้มท้ายใบเสร็จ + ตั้งอายุ QR (ชั่วโมง) — ต้องตั้ง “URL สาธารณะของระบบ” (โดเมนที่มือถือลูกค้าเข้าถึงได้จริงจากนอกร้าน) ในช่องเดียวกันนี้ก่อน มิฉะนั้น QR สะสมแต้มจะใช้งานไม่ได้เลย
สรุปการจองโต๊ะวันนี้ส่งเข้ากลุ่ม LINE พนักงานอัตโนมัติทุกวันตามเวลาที่ตั้ง — ต้องตั้งค่า “LINE Channel Secret” ในแท็บ “เชื่อมต่อ / Secrets” ก่อน แล้วไปตั้ง webhook ที่ LINE Developers Console ให้ครบ จากนั้นพิมพ์ข้อความอะไรก็ได้ในกลุ่มพนักงาน 1 ครั้ง แล้วกดปุ่ม “โหลดรายชื่อกลุ่มที่จับได้” ในหน้านี้เพื่อเลือกรหัสกลุ่ม — แก้แม่แบบข้อความ (มีตัวแปร {date} {count} {checkedIn} {cutCount} {list}) และทดสอบส่งได้ทันทีเช่นกัน

เปิดภาพเต็ม
เชื่อมต่อระบบภายนอกและเครื่องมือดูแลระบบ
จัดการ Secret สำหรับ LINE, JARVIS, AI และแจ้งเตือน Discord
แท็บ “เชื่อมต่อ / Secrets” รวมคีย์ที่ไม่ใช่คีย์ฝั่งชำระเงินไว้ที่เดียว (คีย์ฝั่งชำระเงินอยู่ในแท็บ “การชำระเงิน” — ดูคู่มือ PromptPay): LIFF ID + LINE Login Channel ID + LINE OA Token + LINE Channel Secret สำหรับ LINE Login/webhook, Gemini API Key สำหรับ OCR/แปลภาษา, ชุด JARVIS Staff Import และ JARVIS Accounting Ingest (URL+Token คู่ละ 2 ค่า สำหรับดึงพนักงานและส่งยอดขายปิดกะเข้าระบบบัญชี JARVIS), Discord Webhook URL สำหรับแจ้งเตือนสรุปยอดขายปิดร้านและเคสที่ส่งเข้า JARVIS ไม่สำเร็จจนต้องมีคนตรวจ, และ Cron Secret
คีย์ที่ทำเครื่องหมายอ่อนไหว (sensitive) จะไม่แสดงค่าจริงซ้ำในหน้าจอหลังบันทึกแล้ว — ทั้งแท็บนี้ต้องมีสิทธิ์ system.admin ถึงจะเห็น/แก้ได้ (มีแค่ settings.manage ไม่พอ — ดูจุดที่มักสับสน)

เปิดภาพเต็ม ติดตาม Outbox เชื่อม JARVIS และรันงานตั้งเวลาด้วยตนเอง
แท็บ “เชื่อม JARVIS” แสดงคิวเหตุการณ์บัญชี (ปิดบิล/จ่ายเงินออก/รายได้จองโต๊ะ) ที่รอส่งเข้า JARVIS พร้อมสถิติจำนวนรวม/รอ retry/ต้องคนดู/ส่งสำเร็จแล้ว — ระบบ retry อัตโนมัติทุก 5 นาที (สูงสุด 10 ครั้งต่อเหตุการณ์) รายการที่ retry ครบโควต้าแล้วจะขึ้นสถานะ “ต้องคนดู” ให้ตรวจเอง และมีการ์ดสถานะ backup รายวันแยกต่างหากแสดงในหน้าเดียวกัน (คนละระบบกับ outbox ด้านบน)
แท็บ “ตรวจระบบ” กดรันงานตั้งเวลาได้ทันทีโดยไม่ต้องรอถึงเวลาจริง (สรุปยอดสิ้นวัน, แจ้งเตือนรายวัน, สรุปการจองรายวัน) — กดซ้ำได้อย่างปลอดภัยเพราะแต่ละงานมีตัวกันส่งซ้ำ (single-flight/day-claim) ของตัวเองอยู่แล้ว

เปิดภาพเต็ม เครื่องมือเฉพาะเจ้าของ
แท็บ “🔒 เจ้าของ” มีเครื่องมือความเสี่ยงสูง: อัปเดตเวอร์ชันจากเว็บ (ดึงโค้ดใหม่ + build + restart อัตโนมัติ ไม่ต้องเข้าเครื่อง), แก้ Database URL ของ Neon จากเว็บโดยตรง (ต้องกดทดสอบการเชื่อมต่อให้ผ่านก่อนถึงจะบันทึกได้ และมีผลหลัง restart เซิร์ฟเวอร์เท่านั้น ไม่ hot-swap ทันที), และส่งยอดกะย้อนหลังเข้าบัญชี JARVIS ซ้ำ (สำหรับกะที่ปิดไปแล้วแต่ยอดยังไม่เข้าบัญชี เช่น ตอนปิดกะยังไม่ได้ตั้งค่าเชื่อมต่อ JARVIS)
โซนอันตรายมี 2 ปุ่ม: “เริ่มใช้งานจริง” ล้างออเดอร์/บิล/การชำระ/คิวพิมพ์ทั้งหมด (ใช้ตอนเลิกใช้ข้อมูลทดสอบแล้วเปิดร้านจริง) และ “ล้างสมาชิกทั้งหมด (CRM)” ล้างสมาชิก+คูปอง+การจองโต๊ะ+ฝากเหล้าทั้งหมด — ทั้งสองปุ่มต้องกรอก PIN ยืนยันอีกชั้นก่อนทำงานจริงเสมอ

เปิดภาพเต็ม
จุดที่มักสับสน
มี settings.manage อย่างเดียวเห็นได้แค่แท็บ “ตรวจระบบ” เท่านั้น — ต้องมี system.admin ถึงจะเห็นแท็บอื่นทั้งหมด
หน้านี้เช็คสิทธิ์ซ้อนกัน 2 ชั้น: ชั้นแรกต้องมี settings.manage ถึงจะเข้าหน้าได้เลย (ไม่งั้นขึ้น “ไม่มีสิทธิ์” ทันที) ชั้นที่สอง — ถ้ามีแค่ settings.manage แต่ไม่มี system.admin ระบบจะตัดกลับไปแสดงเฉพาะแท็บ “ตรวจระบบ” เท่านั้น ไม่มีแท็บบาร์ ไม่มีฟอร์มตั้งค่าใดๆ เลย รวมถึงแท็บ “เจ้าของ” (อัปเดตเวอร์ชัน/แก้ Database URL/ล้างข้อมูล) ก็ถูกกันไว้ด้วย — เจ้าของร้านต้องมอบสิทธิ์ system.admin ให้ role อื่นเองอย่างจงใจถึงจะเห็นหน้าตั้งค่าเต็ม การให้แค่ settings.manage เพียงอย่างเดียว (ซึ่งเป็นสิทธิ์เริ่มต้นของ manager/ผู้ช่วยผู้จัดการอยู่แล้วในระบบ) ไม่พอให้เข้าถึงส่วนอื่นของหน้านี้เลยนอกจากตรวจระบบ
ราคาสินค้าถือว่ารวม VAT แล้วเสมอ — ไม่ใช่ราคาก่อนภาษี
ระบบไม่มีโหมด “ราคาไม่รวมภาษี” — ราคาที่ตั้งไว้ที่เมนูทุกตัวถือเป็นราคารวม VAT แล้วโดยอัตโนมัติเมื่อเปิดใช้ VAT ระบบจะแยกคำนวณเฉพาะยอด VAT ออกมาแสดงในใบเสร็จให้เอง ไม่ต้องคำนวณราคาตั้งต้นใหม่เองแต่อย่างใด ส่วน Service Charge คิดจากยอดก่อนหัก VAT เสมอ ไม่ใช่ยอดสุทธิหลังภาษี
ส่วนลดพนักงานปิดใช้งานเองถ้าตั้งไม่ครบ — ไม่มีข้อความเตือนตอนแก้
ปุ่ม “ส่วนลดพนักงาน” ที่หน้าคิดเงินจะกดยืนยันไม่ได้เลยถ้าเงื่อนไขข้อใดข้อหนึ่งไม่ครบ: อัตรา % เป็น 0 หรือยังไม่ได้เลือกหมวดเมนูที่อนุญาตแม้แต่หมวดเดียว — ต้องตั้งทั้ง % ที่ไม่ใช่ 0 และเลือกอย่างน้อย 1 หมวดเมนูพร้อมกันถึงจะใช้งานได้จริง
ช่องรอเชื่อมต่อเครื่องพิมพ์ (ms) พิมพ์ 0 แล้วไม่ได้ 0 — กลับไปใช้ค่าเริ่มต้นแทน
ช่องตัวเลขส่วนใหญ่ในหน้านี้ ถ้าพิมพ์ 0 หรือค่าติดลบจะถูกปัดกลับไปใช้ค่าต่ำสุดที่กำหนด แต่ช่อง “รอเชื่อมต่อเครื่องพิมพ์ (ms)” ใช้ตัวแปลงค่าคนละแบบจากช่องอื่น — พิมพ์ 0 (หรือค่าที่แปลงเป็นตัวเลขไม่ได้) จะถูกตีความเป็น “ยังไม่เคยตั้งค่า” แล้วย้อนกลับไปใช้ค่าเริ่มต้นของระบบทันที ไม่ใช่ถูกดันขึ้นไปเป็นค่าต่ำสุดที่อนุญาตเหมือนช่องตัวเลขอื่นๆ ในหน้าเดียวกัน
Cron Secret ที่กรอกในหน้านี้ไม่มีผลกับ cron บนคลาวด์
ค่า Cron Secret ที่บันทึกผ่านหน้านี้เก็บไว้ใช้อ้างอิง/สำรอง (เช่น ปุ่ม “Force-run EOD summary” ในแท็บตรวจระบบ) เท่านั้น — งานที่รันอัตโนมัติทุกวันบนคลาวด์ (แจ้งเตือนวันเกิด/เหล้าใกล้หมดอายุจากคลาวด์โดยไม่ง้อเครื่องในร้าน) อ่านค่านี้จาก environment variable ของเซิร์ฟเวอร์คลาวด์โดยตรงเท่านั้น ต้องไปตั้งที่ฝั่งนั้นแยกต่างหากถึงจะมีผลจริงกับ cron บนคลาวด์
อัปเดตเวอร์ชันจากเว็บทำให้ POS ดับชั่วคราวและทุกเครื่อง logout อัตโนมัติ
การกด “อัปเดตเวอร์ชัน” ในแท็บเจ้าของจะดึงโค้ดใหม่ + build + restart เซิร์ฟเวอร์จริง ใช้เวลาประมาณ 1-2 นาทีที่ระบบใช้งานไม่ได้เลย และเมื่อเสร็จสมบูรณ์ ทุกเครื่อง/อุปกรณ์ที่เปิดหน้าเว็บของระบบอยู่ (ไม่ใช่แค่เครื่องที่กดอัปเดต) จะถูก logout และรีเฟรชหน้าอัตโนมัติ — ควรทำตอนปิดร้านหรือช่วงที่ไม่มีลูกค้าใช้งาน
แก้ Database URL มีผลแค่เครื่องนี้เครื่องเดียว และต้อง restart ก่อนถึงจะใช้ค่าใหม่
ค่า Database URL ที่บันทึกผ่านหน้านี้เก็บไว้ในเครื่องนั้นเท่านั้น (ไม่ถูกส่งขึ้นคลาวด์ให้เครื่องอื่นเห็น) และต้องกด “ทดสอบการเชื่อมต่อ” ให้ผ่านก่อนเสมอถึงจะกดบันทึกได้ — ค่าที่ระบบใช้งานจริงตอนนั้นยังเป็นค่าเดิมจนกว่าจะรีสตาร์ทเซิร์ฟเวอร์ ไม่ hot-swap ทันทีที่บันทึก บนเครื่องที่รันผ่าน Vercel (เช่น instance สแตนด์บาย) การ์ดนี้จะเป็นแบบอ่านอย่างเดียว เพราะค่านั้นมาจาก environment variable ของ Vercel โดยตรง แก้จากหน้านี้ไม่ได้
ปุ่มในโซนอันตรายลบข้อมูลจริงด้วย — ระบบไม่แยกข้อมูลทดสอบกับข้อมูลจริง
ปุ่ม “เริ่มใช้งานจริง” และ “ล้างสมาชิกทั้งหมด (CRM)” ลบข้อมูลทุกรายการในหมวดนั้นแบบไม่แยกว่าเป็นข้อมูลทดสอบหรือข้อมูลจริงที่ใช้งานอยู่ — ทำแล้วกู้คืนไม่ได้ ต้องกรอก PIN ยืนยันอีกชั้นก่อนเสมอ ควรใช้เฉพาะตอนล้างข้อมูลทดสอบก่อนเปิดร้านจริงครั้งแรกเท่านั้น
ส่งยอดกะย้อนหลังซ้ำได้อย่างปลอดภัย — กะที่เคยส่งสำเร็จแล้วจะไม่ถูกนับซ้ำ
เครื่องมือ “ส่งยอดกะย้อนหลังเข้าบัญชี JARVIS ซ้ำ” กดส่งกะเดิมซ้ำกี่ครั้งก็ได้อย่างปลอดภัย — ฝั่ง JARVIS ตรวจรหัสอ้างอิงเฉพาะของแต่ละกะ+ช่องทาง กะ/ช่องทางที่เคยบันทึกสำเร็จแล้วจะขึ้นสถานะ “ซ้ำ (duplicate)” และไม่ถูกนับยอดซ้ำ มีแค่ช่องทางที่ยังไม่เคยส่งสำเร็จเท่านั้นที่จะถูกบันทึกใหม่จริง