Skip to content

Kế hoạch kiểm thử (QA Test Plan) — Chấm công đa đơn vị trên shared tenant

v3.1.4 — 21/04/2026

Thay đổiSectionẢnh hưởng
Sửa oracle missing_break: không auto ép workday = 0.5 chỉ vì thiếu mốc giữa caD2) Danh sách test caseQA, FE, BE
Đổi coverage Daisy break linh hoạt sang mô hình Day-1: đủ 4 mốc, tính actual_hours, export đủ mốc; không test tolerance window như rule đang enforceD2) Danh sách test caseQA, BE
Chốt test contract remote: không có entry mới trong attendance shell, nhưng flow legacy vẫn dùng cho nhóm nhỏ đã approvedD2) Danh sách test caseQA, FE
Sửa oracle part-time PN thành (4/4) x 0.5 = 0.5 để tránh copy nhầm rule cho ca khácD2) Danh sách test caseQA

Tham chiếu (Ref): PRD v3.1.4 | Ngày (Date): 21/04/2026

Changelog

VersionDateAuthorThay đổi
3.1.421/04/2026PO/BASửa oracle missing_break, remote và PN part-time; đồng thời đổi coverage Daisy break linh hoạt sang hướng Day-1 metadata + actual-hours thay vì tolerance window đang enforce
3.1.315/04/2026PO/BAĐổi oracle Công chuẩn sang test theo nhóm áp dụng công chuẩn và mapping department -> scope, thêm case riêng cho Daisy Kế toán / Daisy Tele-CSKH-Page-CN
3.007/04/2026PO/BAInitial QA coverage cho multi-unit timekeeping
3.0.107/04/2026PO/BAĐồng bộ test/go-live wording theo break_mode, annual leave Day-1 và PN/Daisy runtime đã chốt
3.113/04/2026PO/BAMở rộng test matrix cho assignment theo branch/department, readiness checklist, rollout gating và hidden filters theo mapping disabled
3.1.113/04/2026PO/BALàm rõ GPS test oracle: branch coordinates lấy từ branch master data hiện có, còn bán kính ưu tiên gps_radius_meters của unit rồi mới fallback global
3.1.214/04/2026PO/BAChuyển test matrix mode tính công xuống Ca làm việc, bỏ expectation cũ ở Tab Quy định, thêm test cho Công tối đa của ca / Giờ chuẩn của ca, và chuyển yêu cầu GPS của ca sang gps_required = Bắt buộc / Không bắt buộc ở shift

D1) Phạm vi kiểm thử (Test Scope)

FRMô tảPriority
FR-001Timekeeping unit scopeMust
FR-001AUser assignment / headcount scopeMust
FR-001BTriển khai rollout theo đơn vịMust
FR-002Daisy 4 mốcMust
FR-003Runtime multi-clockMust
FR-004Admin working schedule / working sheetMust
FR-005Mobile attendanceMust
FR-006Timekeeping approver / requestMust
FR-007Export vận hành chấm côngMust
FR-008Rollout guardrails / non-regression timekeepingMust

Regression Impact Map

SurfaceMức độBắt buộc test lạiWave
timekeeping admin webRất caoFilter unit, working sheet, popup detail, export1A, 1B
Mobile attendanceRất caoPN 2 mốc, Daisy 4 mốc, CTA, history, GPS1A, 1B
Shift settingsCaoFilter unit, contract nghỉ giữa ca (break_time, break_clocking_required, break_mode, break_flex_minutes), canonical key1A, 1B
Timekeeping approver settingsCaoScope đúng unit, không lẫn approver1A, 1B
Diva timekeeping hiện tạiCaoNon-regression chấm công hiện tại trong scope Diva1A, 1B, 1C
Dashboard/report legacyKhông thuộc scopeKhông retest trong package này
Salary/payroll legacyKhông thuộc scopeKhông retest trong package này

D2) Danh sách test case (Test Cases)

TC-FR-001: Timekeeping unit scope

TCMô tảExpectedPriority
TC-001-01HR Daisy vào working sheet của DaisyChỉ thấy dữ liệu DaisyP0
TC-001-02HR PN vào working sheet của PNChỉ thấy dữ liệu PNP0
TC-001-03User Daisy cố xem unit PNBị chặnP0
TC-001-04GPS gần branch ngoài unitKhông bind nhầmP0
TC-001-05Đổi timekeeping_unit trên admin filterReset branch/department/shift group đúngP1

TC-FR-001A: Assignment

TCMô tảExpectedPriority
TC-001A-01Một user có active unitHiển thị đúng unitP0
TC-001A-02User đổi unit giữa thángRecord cũ không hồi tốP0
TC-001A-03Save assignment trùng active unitBị chặnP0
TC-001A-04Headcount theo unitCount đúng theo assignment activeP1
TC-001A-05Tạo 2 assignment overlap ngày hiệu lựcBị chặn ở DB/serviceP0
TC-001A-06Bulk import mã NV vào unitMatch đúng user hợp lệ, trả danh sách mã không hợp lệP0
TC-001A-07Dán danh sách mã NV nhiều dòngPreview đúng danh sách match/unmatchP1
TC-001A-08Re-assignment user sang unit khácĐóng assignment cũ, tạo assignment mới đúng ngày hiệu lựcP0
TC-001A-09Xóa nhân viên khỏi đơn vịAssignment chuyển Đã hết hiệu lực, không hard deleteP0
TC-001A-10Assignment có primary_department_idFilter/approver/export đọc đúng phòng ban áp dụngP0

TC-FR-001B: Triển khai rollout

TCMô tảExpectedPriority
TC-001B-01Checklist readiness đủ dữ liệuTất cả badge ra đúng count/statusP0
TC-001B-02Click badge checklistĐiều hướng đúng tab còn thiếuP1
TC-001B-03Còn badge Nút Bật rollout bị disableP0
TC-001B-04Không còn badge Cho phép Bật rolloutP0
TC-001B-05Lưu ghi chú triển khaiSnapshot checklist + ghi chú được lưuP1

TC-FR-002: Daisy 4 mốc

TCMô tảExpectedPriority
TC-002-01Chấm đủ 4 mốccomplete, workday = 1.0P0
TC-002-02Thiếu Ra nghỉ (chỉ 3 mốc: vào ca, vào lại, ra về)missing_breakP0
TC-002-03Punch thứ 5Reject "Đã chấm đủ mốc"P1
TC-002-04Daisy VP user chấm ca 2 mốc (break_clocking_required = false)CTA chỉ Vào ca/Ra về, không hiện 4 CTAP0
TC-002-05Daisy DV user đi trễ segment 0 >60 phútBị flag vi phạm theo rule ca fixed/flex đang áp dụng; không suy diễn thêm rule missing_breakP1
TC-002-06Daisy DV user thiếu cả segment 1missing_break; hệ thống không auto ép workday = 0.5 chỉ vì thiếu mốc giữa caP1

TC-FR-003: Runtime multi-clock

TCMô tảExpectedPriority
TC-003-01Map đúng time_slot_user_idPassP0
TC-003-02Double tapKhông tạo duplicate saiP0
TC-003-03User không có ca ngày đóReject + message phù hợpP1

TC-FR-004: Admin working sheet

TCMô tảExpectedPriority
TC-004-01PN ngày đủ 2 mốcHiện Đủ mốcP0
TC-004-02Daisy ngày thiếu giữa trưaHiện Thiếu giữa trưaP0
TC-004-03Popup chi tiết ngàyHiện đúng số mốc theo caP0

TC-FR-005: Mobile attendance

TCMô tảExpectedPriority
TC-005-01PN app 2 mốcCTA đúng Vào ca/Ra vềP0
TC-005-02Daisy DV app 4 mốcCTA đúng 4 trạng thái theo state machineP0
TC-005-03GPS ngoài branch hợp lệChặn punch + hiện lý doP0
TC-005-04Diva user ngoài rolloutKhông đổi hành vi cũP0
TC-005-05User rollout mở request list mobileKhông có CTA/request entry remote mới trên attendance shell; nhóm nhỏ vẫn dùng flow legacy đã được cấp quyền/approvedP1
TC-005-06PN ca gãy (break 3h) — 4 CTA (DEC-014 confirmed)CTA Vào ca/Ra nghỉ/Vào lại/Ra về theo state machine 4 mốcP0
TC-005-07Daisy VP user (ca 2 mốc)CTA Vào ca/Ra vềP0
TC-005-08Daisy DV double-tap <5sReject "Vui lòng đợi"P1
TC-005-09Daisy DV chấm vào ca → ra nghỉ → vào lại → ra về (happy path 4 mốc)2 records segment 0+1, status completeP0
TC-005-10User không có ca hôm nayReject "Không có ca hôm nay"P1

TC-FR-006: Timekeeping approver / request

TCMô tảExpectedPriority
TC-006-01Request quên chấm của DaisyResolve đúng approver DaisyP0
TC-006-02Approver cấu hình khác unitKhông được dùngP0
TC-006-03Tab remote trên approver settingsVẫn tồn tại theo UI legacy nếu tenant đang dùng; feature này không redesign hay mở config remote mới trong scope Day-1P1
TC-006-04Flow ngoài timekeepingKhông đổi vì feature nàyP1

TC-FR-007: Export vận hành

TCMô tảExpectedPriority
TC-007-01Export bảng công tháng PNFile đúng, cột 2 mốcP0
TC-007-02Export chi tiết ngày Daisy DVCó đủ 4 cột mốc (vào ca, ra nghỉ, vào lại, ra về)P0
TC-007-03Export chi tiết ngày Daisy VPChỉ 2 cột mốc (vào ca, ra về)P0
TC-007-04Export trễ/sớmCó cột phút trễ/sớm + cột tiền phạt (tự tính từ penalty_rule)P0
TC-007-05Annual leave report PNHR PN mở → hiện data PN. Daisy không thấy entry report trong rollout này. Diva giữ nguyênP0
TC-007-06PN export OT request < 30 phútBỏ qua, không hiện trong exportP1
TC-007-07PN export OT request >= 30 phútHiện đúng ot_hoursP1
TC-007-08Export quên chấm: đếm số lần missing per typeHiện missing_start_count, missing_end_count, missing_break_countP1
TC-007-09Export bảng công tháng PN có cột "Tiền phạt" tự tính đúngTiền phạt khớp penalty_rule (exempt_count = 0 cho quên vào ca, = 3 cho quên trưa)P0
TC-007-10Export bảng công tháng Daisy có cột "Tiền phạt" (shared pool exempt)Tiền phạt = 0 khi tổng lần quên <= 3 (shared pool), có phạt khi vượt 3P0
TC-007-11Export bảng công tháng có cột "Tiền OT" tự tính đúngTiền OT = ot_hours × ot_rate per role (PN thường 50k, PN BS 150k, Daisy 35k)P0

TC-FR-009: Seed shift templates

TCMô tảExpectedPriority
TC-009-01PN ca gãy 7:00 14:00 (break 11:00-14:00)Template có break_time=true, break đúng 3hP0
TC-009-02Cronjob tính late/early cho PN ca gãyRa 11:00 = không tính về sớm; vào 14:00 = không tính đi trễP0
TC-009-03Daisy ca BS 4 mốc templatebreak_clocking_required = trueP0
TC-009-04Daisy ca Kế toán 2 mốc templatebreak_clocking_required = falseP0

TC-FR-010: Daisy ca xoay

TCMô tảExpectedPriority
TC-010-01Cron generate_working_shift cho Daisy (auto_schedule_disabled=true)Skip, không tạo lịch tự độngP0
TC-010-02Cron generate_working_shift cho PN (auto_schedule_disabled=false)Copy tuần trước → tuần sau bình thườngP0
TC-010-03HR Daisy import Excel lịch tuầnLịch tuần mới override đúngP1

TC-FR-011: Phân quyền HR 3 bên

TCMô tảExpectedPriority
TC-011-01HR Daisy mở Working SheetAuto-select unit Daisy, chỉ thấy NV DaisyP0
TC-011-02HR PN mở Working SheetAuto-select unit PN, chỉ thấy NV PNP0
TC-011-03HR Daisy cố query data PN qua APIBị chặn (Hasura permission)P0
TC-011-04System Admin mở Working Sheet chưa chọn unitEmpty state, bắt buộc chọnP1
TC-011-05Diva native user (không thuộc unit) mở Working SheetKhông thấy filter unit, data legacy bình thườngP0
TC-011-06Manager Daisy mở Working SheetChỉ thấy NV thuộc department/branch mình quản lý, trong scope DaisyP0
TC-011-07HR Daisy mở filter Chi nhánhChỉ thấy 6 CN + 3 VP Daisy, không thấy CN PNP0
TC-011-08HR PN mở filter Chi nhánhChỉ thấy 3 PK + 1 VP PN, không thấy CN DaisyP0
TC-011-09Chi nhánh đã Ngưng áp dụngKhông hiện ở filter mặc địnhP1
TC-011-10Phòng ban đã Ngưng áp dụngKhông hiện ở filter mặc địnhP1

TC-FR-012: Đơn đi trễ/về sớm — rule per unit

TCMô tảExpectedPriority
TC-012-01NV Daisy tạo đơn đi trễ 45 phútOK, cho tạoP0
TC-012-02NV Daisy tạo đơn đi trễ 70 phútReject "Vượt quá 60 phút"P0
TC-012-03NV PN tạo đơn đi trễ 90 phútOK, cho tạo (PN không giới hạn)P0
TC-012-04NV Daisy đã có 3 đơn approved trong tháng, tạo đơn thứ 4Hiện cảnh báo "4/3 lần", vẫn cho tạoP1
TC-012-05Mobile hiển thị "2/3 lần" khi NV đã dùng 2 đơnĐúng count, scoped per unitP0
TC-012-06NV Diva (không có unit) tạo đơn trễ/sớmDùng global count legacy, không có max durationP1

TC-FR-013: Đơn quên chấm — count per unit

TCMô tảExpectedPriority
TC-013-01NV PN đã có 2 đơn quên chấm approved, tạo đơn 3Hiện "3/3 lần", cho tạoP0
TC-013-02Count chỉ đếm approved + pendingĐơn rejected/canceled không đếmP0

TC-FR-014: Daisy ca linh hoạt (4 mốc, break metadata 12:00–14:00)

TCMô tảExpectedPriority
TC-014-01Daisy BS chấm 08:00 -> 12:30 -> 13:30 -> 17:00actual_hours = 4.5 + 3.5 = 8.0hP0
TC-014-02Daisy BS chấm 08:00 -> 10:50 -> 14:10 -> 17:00Không block/phạt vì lệch khung break; export đủ 4 mốcP0
TC-014-03Daisy BS thiếu mốc 2 hoặc 3Mark missing_break, vẫn ghi nhận segment đủ dữ liệuP0
TC-014-04Daisy BS đủ 4 mốc nhưng tổng giờ < chuẩn caTính workday theo logic của ca, không dùng break window để phạt giữa caP0
TC-014-05Export chi tiết ngày DaisyHiện đủ 4 mốc để HR tự đối soát/tính nếu cầnP0

TC-FR-015: PN tính công theo giờ (DEC-022)

TCMô tảExpectedPriority
TC-015-01PN NV Khối DV ca 8h, làm đủ 8h, không đơnworkday = 1.0P0
TC-015-02PN NV Khối DV ca 8h, về sớm (7h), KHÔNG có đơnworkday = 7/8 = 0.875P0
TC-015-03PN NV Khối DV ca 8h, về sớm (7h), CÓ đơn trễ/sớm approvedworkday = 1.0 (full)P0
TC-015-04PN NV Khối VP ca 7.5h chuẩn, làm đủworkday = 1.0P0
TC-015-05PN NV Khối VP ca 7.5h, về sớm (5.5h), không đơnworkday = 5.5/7.5 = 0.73P0
TC-015-06PN part-time ca 4h, đi đủ 4hworkday = (4/4) x 0.5 = 0.5P1
TC-015-07PN NV ca gãy 4 mốc, đủ mốc, tổng 8hworkday = 1.0P0
TC-015-08PN NV ca gãy 4 mốc, thiếu chiều (4h sáng), không đơnworkday = 4/8 = 0.5P0
TC-015-09Daisy NV cùng scenario (7h, không đơn)workday = 1.0 (Daisy dùng fixed, KHÔNG hourly)P0
TC-015-10Diva NV cùng scenarioworkday = logic legacy (không đổi)P0

TC-FR-016: Báo cáo phép năm PN — reuse AnnualLeaveReport (DEC-023)

TCMô tảExpectedPriority
TC-016-01HR PN mở Báo cáo phép năm (reuse AnnualLeaveReport.tsx)Hiện filter Timekeeping Unit auto-select PN, chỉ thấy NV PNP0
TC-016-02PN NV nghỉ phép 2 ngày → count đã dùng tăng 2Đúng, remaining_leave_days giảm 2P0
TC-016-03Daisy mở report/timekeeping menu Day-1Không thấy entry báo cáo phép năm trong rollout nàyP1
TC-016-04Diva HR mở báo cáo phép nămGiữ nguyên — không thấy filter unit, data Diva bình thườngP0
TC-016-05Cron add_annual_leave ngày 1 tháng mớiNV PN/Daisy cũng được +1 phép (cron query ALL, không filter unit)P0
TC-016-06annual_leave_logs NV PN có timekeeping_unit_id = PNRecord audit có unit_id đúngP1

TC-FR-017: PN ca gãy 4 mốc

TCMô tảExpectedPriority
TC-017-01PN NV ca gãy 7:00 14:00, chấm 4 mốc đủcomplete, CTA đúng 4 trạng tháiP0
TC-017-02PN NV ca gãy, thiếu mốc vào lại chiềumissing_breakP0
TC-017-03PN NV ca gãy, trễ đầu ca chiều 15pSegment 1 late = 15pP0
TC-017-04PN NV ca thường (Ca HC, 2 mốc)Chỉ 2 CTA: Vào ca, Ra vềP0

TC-STD: Công chuẩn — theo nhóm áp dụng công chuẩn

TCMô tảExpectedPriority
TC-STD-01PN NV thuộc department map vào scope PN_SERVICE, tháng 30 ngày 4 CNCông chuẩn = 26 (days_minus_sun)P0
TC-STD-02PN NV thuộc department map vào scope PN_OFFICE, tháng 30 ngày 4 CN 4 T7Công chuẩn = 24 (days_minus_sun_half_sat)P0
TC-STD-03Daisy NV Kế toán thuộc scope DAISY_OFFICE_ACCOUNTINGCông chuẩn = 24P0
TC-STD-04Daisy NV Tele/CSKH/Page/Chi nhánh thuộc scope DAISY_OFFICE_TELE_CSKH_PAGE_BRANCHCông chuẩn = 26P0
TC-STD-05Daisy NV Khối Dịch vụ thuộc scope DAISY_SERVICECông chuẩn = 26P0
TC-STD-06Diva NV (unit_id = NULL)Dùng logic cũ InitThisMonthSalaryData() — kết quả KHÔNG ĐỔIP0
TC-STD-07Admin đổi formula scope PN_OFFICE từ days_minus_sun_half_satdays_minus_sunTháng sau công chuẩn VP = 26P1
TC-STD-08Admin tạo scope mới cho Daisy và gán 1 department vào scope đóNV department đó dùng công chuẩn của scope mới từ tháng sauP1
TC-STD-09Department không có scope mappingFallback 26.0 và có log cảnh báo để Ops xử lýP1

TC-PENALTY: Penalty engine — timekeeping_penalty_rule

TCMô tảExpectedPriority
TC-PEN-01PN NV quên chấm vào ca lần 1Phạt 30.000đ ngay (exempt_count = 0, individual)P0
TC-PEN-02PN NV quên chấm giữa trưa lần 1-3Miễn (exempt_count = 3, individual pool)P0
TC-PEN-03PN NV quên chấm giữa trưa lần 4Phạt 30.000đP0
TC-PEN-04Daisy NV quên chấm vào ca lần 1-3Miễn (exempt_count = 3, shared pool)P0
TC-PEN-05Daisy NV quên vào ca 2 lần + quên trưa 1 lần = 3 lần gộp, quên ra ca lần 4Phạt trừ 0.5 công (shared pool vượt 3)P0
TC-PEN-06Daisy NV trễ lần 4, 15 phútPhạt 15 × 10.000 = 150.000đP0
TC-PEN-07Diva NV trễ 15 phútDùng logic cũ hardcode 10k/phút — KHÔNG query penalty_ruleP0
TC-PEN-08Export bảng công PN hiện cột "Tiền phạt" tự tínhĐúng theo rule, HR không cần ExcelP0

TC-OT-RATE: OT rate tự động

TCMô tảExpectedPriority
TC-OTR-01PN NV thường OT 2hTiền OT = 2 × 50.000 = 100.000đP0
TC-OTR-02PN BS OT 2hTiền OT = 2 × 150.000 = 300.000đP0
TC-OTR-03Daisy NV thường OT 2hTiền OT = 2 × 35.000 = 70.000đP0
TC-OTR-04PN OT request 20p (< threshold 30p)Bỏ qua, tiền OT = 0P0
TC-OTR-05Diva NV OTDùng logic cũ — KHÔNG query ot_rateP0

TC-CFG: Settings Module — Tab Quy định

TCMô tảExpectedPriority
TC-CFG-01System Admin mở Tab Quy định cho PNKhông còn field Cách tính công; chỉ thấy policy unit như đơn từ, OT, GPSP0
TC-CFG-02System Admin mở Tab Quy định cho DaisyKhông còn field Cách tính công; không còn field break tolerance ở cấp unitP0
TC-CFG-03Đổi Daisy max phút trễ/sớm từ 60 → 90 → LưuNV Daisy tạo đơn 75 phút → OK (trước đó bị reject)P1
TC-CFG-04Đổi config → record hôm nay KHÔNG bị ảnh hưởngChỉ áp dụng từ ngày maiP0
TC-CFG-05HR (không phải System Admin) cố mở Tab Quy địnhBị chặn hoặc readonlyP0
TC-CFG-06Đổi config → audit log ghi đúng (ai, đổi gì, lúc nào)Có record trong audit logP1
TC-CFG-07Đổi PN OT threshold từ 30 → 0 → export OTOT request 20p xuất hiện trong export (trước đó bị skip)P1

TC-SHIFT-CFG: Cấu hình cách tính công ở Ca làm việc

TCMô tảExpectedPriority
TC-SHIFT-01Mở popup sửa ca PN ca DVHiện Cách tính công = Theo giờ, Công tối đa của ca = 1.0, Giờ chuẩn của ca = 8.0P0
TC-SHIFT-02Mở popup sửa ca PN ca VPHiện Cách tính công = Theo giờ, Giờ chuẩn của ca = 7.5P0
TC-SHIFT-03Mở popup sửa ca DaisyHiện Cách tính công = Theo ngày công, ẩn Giờ chuẩn của caP0
TC-SHIFT-04Đổi một ca từ Theo giờTheo ngày côngGiờ chuẩn của ca ẩn đi; cron ngày hôm sau dùng logic fixed cho đúng ca nàyP0
TC-SHIFT-05Đổi một ca part-time sang Theo giờ, Giờ chuẩn = 4, Công tối đa = 0.5Đi đủ 4h thì bảng công = 0.5P0
TC-SHIFT-06Chọn Theo giờ nhưng để trống Giờ chuẩn của caKhông cho lưu, hiện validationP0
TC-SHIFT-07Chọn GPS cho ca này = Bắt buộcLưu thành công; ca này bắt buộc check GPS khi punchP0
TC-SHIFT-08Chọn GPS cho ca này = Không bắt buộcLưu thành công; ca này không check GPS khi punchP1

TC-FR-018: Mobile lịch sử cá nhân

TCMô tảExpectedPriority
TC-018-01NV PN ca thường xem lịch sửca 2 mốc, running totalP0
TC-018-02NV PN ca gãy xem lịch sửCa 4 mốc hiện 4 dòngP0
TC-018-03NV Daisy DV xem lịch sửCa 4 mốc hiện 4 dòngP0
TC-018-04NV xem tổng thángĐúng: ngày công, lần trễ, lần sớm, lần quênP1

TC-FR-008: Guardrails

TCMô tảExpectedPriority
TC-008-01Tắt rollout flag unitUnit đó không chấm được path mớiP0
TC-008-02Diva timekeeping legacyKhông regressP0
TC-008-03Update template cùng tên khác unitKhông rewrite chéo unitP0

D3) Dữ liệu seed (Seed Data)

sql
-- timekeeping units
-- DIVA, DAISY, PHUONG_NAM

-- users
-- 1 HR + 1 manager + 2 staff cho mỗi unit

-- shifts
-- PN: 1 ca 2 mốc + 1 ca gãy 4 mốc
-- Daisy: 1 ca 4 mốc (BS/Phụ tá) + 1 ca 2 mốc (VP)

-- requests
-- forget_clock
-- late_early
-- overtime

-- penalty_rule
-- PN: quên vào ca (exempt_count=0, individual), quên trưa (exempt_count=3, individual)
-- Daisy: quên chấm (exempt_count=3, shared pool)

-- ot_rate
-- PN thường: 50.000đ/h, PN BS: 150.000đ/h, Daisy thường: 35.000đ/h

-- explicit deferred
-- remote_request (không seed vào Day-1 flow)

D4) Quy tắc đối chiếu kết quả (Test Oracle)

ArtifactMục đích
timekeeping-isolation-matrix.csvCase expected theo từng unit
timekeeping-working-sheet-sample.xlsxĐối chiếu working sheet/export
mobile-cta-state-matrix.mdOracle cho CTA mobile
gps-branch-validation-matrix.csvOracle cho GPS đúng/sai theo branch trong unit
penalty-calculation-matrix.csvOracle cho tiền phạt theo penalty_rule per unit
ot-rate-calculation-matrix.csvOracle cho tiền OT theo ot_rate per role

D5) Điều kiện vào / ra (Entry / Exit)

Entry

  • Seed data cho 3 unit có sẵn
  • Shift PN 2 mốc, PN ca gãy 4 mốc, và Daisy 4 mốc có sẵn
  • Approver timekeeping có cấu hình mẫu
  • GPS test points cho ít nhất 1 branch đúng unit và 1 branch ngoài unit
  • Penalty rules và OT rates đã seed theo D3

Exit

  • Tất cả P0 pass
  • Không có regression P0/P1 với Diva timekeeping hiện tại
  • Export vận hành khớp working sheet
  • Daisy 4 mốc, PN 4 mốc (ca gãy) và PN 2 mốc (ca thường) pass pilot smoke
  • GPS validation matrix pass
  • Penalty + OT export khớp test oracle