Skip to content

Checklist triển khai (Go-Live Checklist) — Chấm công đa đơn vị trên shared tenant

v3.1.4 — 21/04/2026

Thay đổiSectionẢnh hưởng
Đổi gate Daisy break linh hoạt sang contract Day-1: đủ 4 mốc, tính actual_hours, export đủ 4 mốc; không coi tolerance window là rule go-live bắt buộcE1) Cổng kiểm soát triển khaiQA, BE, Ops
Chốt wording rollout remote: không có request entry mới trên attendance shell, nhưng nhóm nhỏ vẫn dùng đúng flow legacy đã approvedE2) Kiểm tra trước triển khai, E4) Xác minh sau triển khaiQA, FE, Ops

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

Changelog

VersionDateAuthorThay đổi
3.1.421/04/2026PO/BAĐồng bộ gate/go-live wording cho Daisy break linh hoạt Day-1 và contract remote legacy: không build entry mới nhưng vẫn không chặn nhóm nhỏ đã approved
3.1.315/04/2026PO/BACập nhật pre-check/go-live cho model Công chuẩn mới: kiểm tra scope + department mapping, không còn check theo branch_label_id
3.007/04/2026PO/BAInitial go-live gates/pre-checks cho rollout PN + Daisy
3.0.107/04/2026PO/BAĐồng bộ wording pilot 2 mốc/4 mốc, annual leave Day-1 và seed hiện tại
3.113/04/2026PO/BABổ sung pre-check mới cho schema mapping/assignment và readiness gating trước khi bật rollout
3.1.113/04/2026PO/BALàm rõ GPS rollout contract: tọa độ dùng branch master data hiện có, còn bán kính ưu tiên unit override rồi mới fallback global
3.1.214/04/2026PO/BAChuyển gate mode tính công xuống Ca làm việc, bổ sung pre-check cho field shift-level workday_calculation_mode + standard_hours, và chuyển yêu cầu GPS của ca sang gps_required ở shift

E1) Cổng kiểm soát triển khai (Gates)

#Cổng kiểm soát (Gate)Người phụ trách (Owner)Trạng thái (Status)
1PO sign-off PRDPOPending
2TL sign-off Đặc tả kỹ thuật (Dev Spec)TLPending
3QA passQAPending
4GPS validation pass cho PN pilotQA + HR PNPending
5PN app 2 mốc + 4 mốc ca gãy pilot passQA + HR PNPending
6Daisy 4 mốc pilot passQA + Daisy OpsPending
7Diva timekeeping non-regression passQA + TLPending
8PN ca gãy cronjob pass (late/early không tính nhầm break)QA + BEPending
9Daisy VP 2 mốc pass (CTA đúng, export đúng)QAPending
10Cron generate_working_shift skip Daisy (auto_schedule_disabled)QA + BEPending
11DEC-014 confirmed (PN 4 mốc), DEC-015 confirmed (2 cấp)PODone
12HR Daisy/PN auto-filter đúng unit, không cross-unitQAPending
13Đơn trễ/sớm Daisy reject >60 phút passQAPending
14Mobile quota "X/3 lần" hiển thị đúng per unitQAPending
15PN tính công theo giờ pass (DEC-022, FORMULA-009)QA + BEPending
16Báo cáo phép năm PN export pass (DEC-023)QA + FEPending
17Daisy Tạp vụ 6 ca mới seed + smoke passQA + BEPending
18Daisy break linh hoạt Day-1 pass cho BS/Phụ tá: đủ 4 mốc, tính actual_hours theo mốc thực tế, export đủ 4 mốcQA + BEPending
19Settings Module Tab Quy định + Ca làm việc: CRUD config, audit log, conditional displayQA + FEPending
20Backend đọc config từ DB không hardcode — cronjob + action dùng config đúng unitQA + BEPending
21Rollback test: tắt rollout flag → verify quay về legacy, Diva không ảnh hưởngQA + TLPending
22Công chuẩn Day-1: PN DV = 26, PN VP = 24, Daisy Kế toán = 24, Daisy nhóm Tele/CSKH/Page/CN = 26 — đúng theo scope mappingQA + BEPending
23Penalty engine: PN quên vào ca = phạt ngay, Daisy quên vào ca = miễn (pool shared) — đúng ruleQA + BEPending
24OT rate: PN BS = 150k/h, PN thường = 50k/h, Daisy thường = 35k/h — đúng configQA + BEPending
25Diva legacy: công chuẩn, penalty, OT — tất cả KHÔNG ĐỔIQAPending

E2) Kiểm tra trước triển khai (Pre-checks)

BE

  • [ ] timekeeping_unit* tables tồn tại (gồm auto_schedule_disabled, ot_min_threshold_minutes)
  • [ ] timekeeping_unit_branch, timekeeping_unit_department có cột disabled
  • [ ] timekeeping_unit_userprimary_branch_id + primary_department_id
  • [ ] time_slot_template, time_slot_user, time_slot_time_keeping, request_working_scheduletimekeeping_unit_id
  • [ ] time_slot_templateworkday_calculation_mode + standard_hours cho ca tính theo giờ
  • [ ] time_slot_templategps_required cho ca cần cấu hình Bắt buộc / Không bắt buộc GPS
  • [ ] time_slot_time_keepingsegment_index
  • [ ] request_working_schedulesegment_index
  • [ ] time_slot_template_update.go không còn update theo name
  • [ ] log_time_keeping_flag cronjob hỗ trợ multi-segment (4 mốc)
  • [ ] log_time_keeping_flag cronjob tính đúng cho ca gãy PN (break >2h)
  • [ ] logTimeKeeping action hỗ trợ state machine 4 mốc
  • [ ] generate_working_shift cron skip unit có auto_schedule_disabled = true
  • [ ] OT request validation: reject nếu duration < ot_min_threshold_minutes
  • [ ] Seed shift templates: PN 16 ca + Daisy 17 ca
  • [ ] timekeeping_penalty_rule table tồn tại với seed data đúng (PN: exempt_pool = 'individual', Daisy: exempt_pool = 'shared')
  • [ ] timekeeping_standard_workday_rule + timekeeping_standard_workday_scope_department tồn tại với mapping đúng theo scope + department
  • [ ] Cronjob đọc penalty rules từ DB (không hardcode late_early_fine = phút × 10,000)
  • [ ] Cronjob đọc công chuẩn từ DB (không hardcode branchLabelID == "general" → 26.0)
  • [ ] OT rate per unit áp dụng đúng trong export (PN BS 150k/h, PN thường 50k/h, Daisy 35k/h)

FE Admin

  • [ ] WorkingSchedule lọc được theo timekeeping_unit
  • [ ] WorkingTimeSheet render đúng 2 mốc/4 mốc
  • [ ] WorkingTimeSheet có filter Chi nhánh scoped theo unit
  • [ ] HR Daisy auto-select unit Daisy, không đổi được sang PN
  • [ ] HR PN auto-select unit PN, không đổi được sang Daisy
  • [ ] System Admin chọn được tất cả unit
  • [ ] Diva native user không thấy filter unit
  • [ ] Export bảng công tháng (tổng hợp) có đủ cột: tổng công, trễ, sớm, OT, quên chấm
  • [ ] Export bảng công tháng includes cột Tiền phạt + Tiền OT
  • [ ] Export báo cáo trễ/sớm có cột "có đơn xin phép"
  • [ ] Export vận hành chạy được
  • [ ] Tab Quy định: CRUD config, audit log, conditional display
  • [ ] SCR-00 checklist readiness hiển thị đúng count/status
  • [ ] Tab Triển khai: Bật rollout chỉ bật được khi không còn badge

FE Mobile

  • [ ] PN ca thường 2 mốc pass smoke
  • [ ] PN ca gãy 4 mốc pass smoke
  • [ ] Daisy DV 4 mốc pass smoke (happy path 4 CTA)
  • [ ] Daisy VP 2 mốc pass smoke (chỉ 2 CTA)
  • [ ] GPS reject/pass đúng theo branch trong unit
  • [ ] User Diva hiện tại không đổi behavior ngoài rollout
  • [ ] Không có CTA/request entry remote mới trên attendance shell Day-1; nhóm nhỏ vẫn dùng được flow legacy remote_onetime / remote_weekly khi đã approved
  • [ ] Double-tap guard (<5s) hoạt động

E3) Các bước triển khai (Deploy Steps)

#Bước (Step)Người phụ trách (Owner)
1Deploy schema timekeeping_unit* + timekeeping_penalty_rule + timekeeping_standard_workday_ruleBE
2Deploy runtime timekeeping_unit_id + multi-clock + penalty engine + công chuẩn từ DBBE
3Deploy admin UI settings/schedule/sheet + Tab Quy địnhFE
4Deploy PN mobile 2 mốc + GPSFE Mobile
5Run PN pilot smoke + GPS matrixQA
6Deploy Daisy 4 mốcFE Mobile + BE
7Run Daisy pilot smokeQA
8Final non-regression for Diva timekeepingQA + TL

E4) Xác minh sau triển khai (Verification)

  • [ ] HR PN xem đúng working sheet của PN
  • [ ] HR Daisy xem đúng working sheet của Daisy
  • [ ] PN chấm công app 2 mốc thành công
  • [ ] Daisy chấm công app 4 mốc thành công
  • [ ] GPS ngoài branch hợp lệ bị chặn đúng
  • [ ] Export bảng công tháng thành công
  • [ ] Export chi tiết ngày Daisy có đủ 4 mốc
  • [ ] Diva timekeeping hiện tại không regress
  • [ ] Không thấy CTA/request entry remote mới trong rollout wave; flow legacy cho nhóm nhỏ vẫn hoạt động đúng theo approval
  • [ ] Export bảng công PN có cột Tiền phạt tính đúng
  • [ ] Export bảng công Daisy có cột Tiền phạt (shared pool exempt đúng)
  • [ ] Export có cột Tiền OT tính đúng theo rate per unit

E5) Bộ bằng chứng (Evidence Pack)

  • [ ] Video PN 2 mốc
  • [ ] Video Daisy 4 mốc
  • [ ] GPS pass/reject evidence
  • [ ] Sample working sheet export PN
  • [ ] Sample working sheet export Daisy
  • [ ] Isolation matrix pass
  • [ ] Non-regression note cho Diva timekeeping
  • [ ] Sample penalty calculation PN vs Daisy (khác exempt_pool)
  • [ ] Sample OT rate calculation (PN BS 150k/h, PN thường 50k/h, Daisy 35k/h)