Skip to content

1.10 · เวลาทำงาน (Time Attendance)

บทนี้อธิบาย flow เวลาทำงาน — ฟีเจอร์เล็กที่สุดใน VTRC เพราะเป็น read-only ทั้งหมด


VTRC ไม่ได้เก็บข้อมูลเวลาทำงาน

พนักงานสแกนนิ้ว/บัตรที่เครื่องสแกนหน้าอาคาร → ข้อมูลเข้า HRMI โดยตรง — VTRC ไม่มีส่วนเกี่ยวข้องตรงนี้

VTRC แค่ read ข้อมูลจาก HRMI มาแสดงในหน้า "เวลาทำงาน" ของ mobile/web app


typeDef ทั้งหมด

vtrc-api/api/src/typeDefs/timeAttendance.js:1-30 — มีแค่ query เดียว ไม่มี mutation

graphql
type Query {
  timeAttendanceByDate(
    date: Date!
    sorting: sortingTimeAttendance  # ASC | DESC
    profileKey: String
  ): TimeAttendanceResponse @auth(accessRole: ["USER"])
}

type TimeAttendanceResponse {
  date: String
  times: [TimeAttendanceEntry]
}

type TimeAttendanceEntry {
  timeAttendanceId: String
  timestamp: String
}

sorting enum — ASC (เก่า → ใหม่) หรือ DESC (ใหม่ → เก่า)


แผนภาพ flow

พนักงานสแกนนิ้ว 08:32

    │  เครื่องสแกน → HRMI (MSSQL)
    │  (วันต่อมา)

พนักงานเปิดหน้าเวลาทำงาน


vtrc-web: timeAttendanceByDate(2025-01-15)


vtrc-api @auth(USER)


centralize bridge → cu-central-api GraphQL
(END_POINT_CENTRALIZE + API_CENTRALIZE_KEY)


cu-central-api → MSSQL / HRMI


ส่งกลับ [{08:32}, {12:01}, {13:00}, {17:05}]
(ไม่มี Redis บน active path)

หมายเหตุ — live path คือ vtrc-apicu-central-api ผ่าน END_POINT_CENTRALIZE (centralize/controllers/timeAttendance.js) — ไม่ใช่ NestJS centralize-api


ความหมายของแต่ละ timestamp

VTRC ไม่ได้ tag ว่า timestamp ไหนคือ "เข้าเช้า" / "ออกกลางวัน" / "เข้าบ่าย" / "ออกเย็น"

มันแค่ list ทั้งหมดที่สแกนในวันนั้น — frontend คือคนตีความ (เช่น ครั้งแรก = เข้า, ครั้งสุดท้าย = ออก)

ผลคือถ้าพนักงานสแกนผิดพลาดหลายครั้ง (เช่นลืมบัตรแล้วแตะหลายรอบ) — ข้อมูลที่แสดงจะดูแปลก แต่ไม่ใช่ bug


เมื่อไรข้อมูลไม่ตรง — ปัญหาที่ไหน

อาการสาเหตุที่ตรวจ
สแกนแล้วไม่ขึ้นใน appเครื่องสแกน → HRMI ยังไม่ syncถามทีมเครื่องสแกน / HRMI
ขึ้นผิดวันtimezone ของ HRMI vs VTRCดู timezone container
เห็นเฉพาะวันนี้ ไม่เห็นเมื่อวานHRMI ยังไม่ sync / archive แล้ว (path นี้ไม่มี Redis)ตรวจ HRMI / cu-central-api
พนักงาน CU ไม่เห็นprofileKey ผิด → ดึงผิด sourceDBcheck currentProfile

อย่าเริ่ม debug ที่ VTRC — เริ่มที่ HRMI ก่อนเสมอเพราะเป็น source of truth


Controller source

vtrc-api/api/src/lib/controllers/timeAttendance/timeAttendance.jsvtrc-api/api/src/centralize/controllers/timeAttendance.js — proxy GraphQL ไป cu-central-api ผ่าน END_POINT_CENTRALIZE (ไม่ใช่ NestJS centralize-api)

cu-central-api query ตรงไปยัง MSSQL (table/view ใน HRMI ที่เก็บสแกน)


ข้อจำกัด

  • ไม่สามารถแก้ไขเวลาผ่าน VTRC — ถ้าสแกนผิด ต้องแจ้ง HR ให้แก้ใน HRMI
  • ไม่มี export — VTRC ไม่มี endpoint สำหรับ export ข้อมูลเวลาเป็น Excel
  • ไม่มีรายงาน late, early-leave, overtime — รายงานเหล่านี้ถ้ามี อยู่ใน HRMI ไม่ใช่ VTRC
  • profileKey สำคัญ — พนักงานที่มี 2 profile (RC + CU) ต้องเลือก profile ที่จะดู

ขั้นตอนถัดไป

ไป บท 1.11 การชำระผ่าน KBANK K-Cash →