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
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-api → cu-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 ผิด → ดึงผิด sourceDB | check 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 ที่จะดู