Appearance
Bàn giao triển khai (Delivery Index) — Chấm công đa đơn vị trên shared tenant
v3.1.4 — 21/04/2026
| Thay đổi | Section | Ảnh hưởng |
|---|---|---|
Chốt T-06: Day-1 không thêm flag remote ở shift, không auto-approve, nhóm nhỏ tiếp tục dùng flow legacy khi đã approved | Quyết định chờ xử lý | TL, FE, BE, QA |
| Làm rõ trong handoff rằng Daisy break linh hoạt Day-1 chỉ là metadata + export 4 mốc, không hard-validate theo tolerance window | Điều đã chốt | TL, FE, BE, QA |
| Trường (Field) | Giá trị (Value) |
|---|---|
| Feature | Chấm công đa đơn vị chấm công trên shared tenant |
| Version | 3.1.4 |
| Date | 21/04/2026 |
| Complexity | M-L |
Changelog
| Version | Date | Author | Thay đổi |
|---|---|---|---|
| 3.1.4 | 21/04/2026 | PO/BA | Đóng T-06 theo contract remote legacy Day-1 và làm rõ trong handoff rằng Daisy break linh hoạt chỉ là metadata + export 4 mốc để HR đối soát |
| 3.1.3 | 15/04/2026 | PO/BA | Đổi Công chuẩn sang model nhóm áp dụng công chuẩn + map department -> scope, để PN/Daisy triển khai đúng theo xác nhận HCNS mới nhất |
| 3.0 | 07/04/2026 | PO/BA | Initial delivery index cho package multi-unit timekeeping |
| 3.0.1 | 07/04/2026 | PO/BA | Đồng bộ blockers canonical và wording rollout |
| 3.1 | 13/04/2026 | PO/BA | Cập nhật delivery handoff theo contract triển khai mới: assignment đủ branch/department, soft-disable mapping, readiness checklist và tab Triển khai |
| 3.1.1 | 13/04/2026 | PO/BA | Làm rõ handoff GPS: branch coordinates tiếp tục dùng branch master data hiện có, còn bán kính là override per-unit trong SCR-00 và có fallback global |
| 3.1.2 | 14/04/2026 | PO/BA | Chuyển contract tính công xuống Ca làm việc: reuse workday làm công tối đa của ca, thêm workday_calculation_mode + standard_hours ở shift; đồng thời chuyển yêu cầu GPS của ca sang gps_required ở shift |
Danh sách tài liệu (Files)
| Tài liệu | Mục đích |
|---|---|
| PRD | Scope nhỏ, an toàn, timekeeping-only |
| Đặc tả giao diện (UI Spec) | Delta UI trên shell timekeeping/settings/mobile hiện có |
| Đặc tả kỹ thuật (Dev Spec) | Data model, runtime, migration, rollout |
| Kế hoạch kiểm thử (QA Test Plan) | Coverage và regression cho timekeeping |
| Checklist triển khai (Go-Live Checklist) | Gates và evidence pilot |
| Báo cáo Stakeholder | Tổng hợp cho Ban GĐ: bối cảnh, yêu cầu, phương án, timeline, ảnh hưởng |
| Câu hỏi Daisy | 4 câu hỏi xác nhận — đã nhận phản hồi |
| Câu hỏi Phương Nam | 4 câu hỏi xác nhận — đã nhận phản hồi |
Điều đã chốt (v3.1.2)
- Dùng
timekeeping_unit, không dùngbusiness_unitglobal. - Không đụng dashboard/report/payroll legacy.
- Daisy và PN dùng app Diva để chấm công.
- Day-1 GPS on-site. Remote hỗ trợ nhóm nhỏ (Daisy Ca 3 Marketing + PN 3-4 NV).
- PN và Daisy cùng rollout 1B — cả 2 đều cần 4 mốc (PN ca gãy, Daisy khối DV).
- PN mặc định dùng ca tính công theo giờ thực tế (
workday = actual_hours / standard_hours × max_workday). Daisy mặc định dùng ca fixed 0/0.5/1.0. - Báo cáo phép năm bắt buộc Day-1 cho PN.
- Daisy break BS/Phụ tá: 12:00–14:00,
break_flex_minutes = 60chỉ là metadata Day-1; hệ thống không phạt/block theo khung nghỉ linh hoạt, chỉ yêu cầu đủ 4 mốc và export đủ 4 mốc. - Daisy Tạp vụ: 6 ca cố định mới, 7 NV.
- Daisy "hạn chế update" = gộp release, không deploy lẻ tẻ.
- Settings Module toàn diện: tất cả config per unit trên UI, backend đọc DB, không hardcode (DEC-026).
- Penalty engine Day-1:
timekeeping_penalty_ruleper unit,exempt_pool = 'individual'(PN) /'shared'(Daisy) (DEC-012 v3, DEC-027). - Công chuẩn Day-1: dùng nhóm áp dụng công chuẩn + map
department -> scope. PN cóPN_OFFICE/PN_SERVICE; Daisy có ít nhấtDAISY_OFFICE_ACCOUNTING,DAISY_OFFICE_TELE_CSKH_PAGE_BRANCH,DAISY_SERVICE. - OT rate Day-1: PN 50k/BS 150k, Daisy 35k/BS 150k.
- Entry point quản lý assignment/unit là
Settings→Internal Settings→Đơn vị chấm công(SCR-00), không đặt trong màn tạo/sửa nhân viên. - Assignment Day-1 phải lưu
primary_branch_id+primary_department_id+ ngày hiệu lực. Chi nhánh áp dụng/Phòng ban áp dụngdùngsoft-disable, không xóa cứng.SCR-00cóReadiness Checklist+ tabTriển khai; chỉ bật rollout khi không còn badge❌.- GPS Day-1 không build màn master riêng: tọa độ chi nhánh tiếp tục quản lý ở branch master data, còn bán kính/rule GPS nằm trong
SCR-00 > Quy định. Cách tính côngkhông cấu hình ởĐơn vị chấm công; Day-1 đặt ởCa làm việc, đổi labelSố ngày côngthànhCông tối đa của ca, và thêmGiờ chuẩn của cakhi chọn modeTheo giờ.- Yêu cầu GPS không cấu hình ở
Đơn vị chấm công; Day-1 đặt ởCa làm việcdưới dạnggps_required = Bắt buộc / Không bắt buộc, còn unit chỉ giữ bán kính mặc định. Logicremote_onetime/remote_weeklytiếp tục là flow riêng.
Kế hoạch rollout (v3.1.2)
| Wave | Scope |
|---|---|
| 1A — Foundation | Schema + canonical_key migration + Settings Module + non-regression Diva. Không feature mới cho end-user |
| 1B — PN + Daisy đồng thời | Runtime 4 mốc + 2 mốc, GPS, admin, mobile, export, approver scope, báo cáo phép năm PN, tính công theo giờ PN, remote nhóm nhỏ, penalty engine, công chuẩn per unit, OT rate per unit |
| 1C — Hardening | Bugfix, tối ưu performance, mở rộng rollout |
Thay đổi vs v2.0: PN ca gãy cần 4 mốc → PN + Daisy cùng rollout 1B. Settings Module toàn diện đưa penalty + công chuẩn + OT rate vào Day-1 (1B).
Blocker trước khi bắt đầu (Start)
| ID | Hạng mục (Item) | Người phụ trách (Owner) | Trạng thái (Status) |
|---|---|---|---|
| BLK-001 | Chốt schema timekeeping_unit* + overlap constraint cho assignment + primary_department_id | TL + BE | — |
| BLK-002 | Chốt runtime time_slot_user_id + segment_index + GPS validation | TL + BE | — |
| BLK-003 | Chốt backfill canonical_key và bỏ propagation theo name | TL + BE | — |
| BLK-004 | Chốt scope approver timekeeping riêng | TL + BE | — |
| BLK-004A | Chốt soft-disable cho timekeeping_unit_branch / timekeeping_unit_department + behavior reactivate | TL + BE | — |
| BLK-004B | Chốt payload aggregate cho Readiness Checklist + persistence tab Triển khai | TL + BE + FE | — |
| BLK-005 | Chốt matrix non-regression + GPS oracle cho Diva timekeeping hiện tại | QA + TL | — |
| BLK-006 | PN ca gãy = 4 mốc (DEC-014 confirmed) | PO + HR PN | Done |
| BLK-007 | Daisy = 2 cấp (DEC-015 confirmed) | PO + Daisy Ops | Done |
| BLK-008 | Remote Day-1 cho nhóm nhỏ — TL chọn phương án kỹ thuật | TL | Pending |
| BLK-009 | HR Daisy + PN OK — penalty + công chuẩn Day-1 nhờ Settings Module v3 | PO + HR | Done |
Lưu ý tương thích (Compatibility Reminder)
- Không sửa report/dashboard legacy.
- Không sửa salary/payroll legacy.
- Không đổi company boundary của
branch/department. - Chỉ mở scope mới trong module timekeeping.
- Remote: chỉ hỗ trợ nhóm nhỏ (Daisy Ca 3 + PN 3-4 NV), không mở full remote attendance.
- Báo cáo phép năm PN: bắt buộc Day-1 (DEC-023). Daisy chưa mở entry báo cáo phép năm trong rollout này.
- Export Day-1 tính tiền phạt + tiền OT tự động từ Settings Module config (DEC-012 v3, DEC-026). Công chuẩn Day-1 resolve qua
primary_department_id -> standard_workday_scope_key -> rule(DEC-013 v4). - Daisy Ca 3 Marketing dùng workaround
remote_onetime(DEC-016). - Cron auto-schedule skip Daisy (DEC-017).
Quyết định chờ xử lý (Pending Decisions) — trạng thái sau phản hồi
| Decision | Trạng thái | Kết quả |
|---|---|---|
| DEC-014 | Confirmed | PN ca gãy = 4 mốc |
| DEC-015 | Confirmed | Daisy = 2 cấp duyệt |
| DEC-016 | Locked | Remote cho nhóm nhỏ Day-1 — cần TL chọn phương án kỹ thuật |
| ASM-005 | Superseded by DEC-012 v3 | Penalty engine Day-1 thay thế tính thủ công |
| ASM-006 | Superseded by DEC-013 v3 | Công chuẩn Day-1 thay thế tính thủ công |
Câu hỏi mở cho TL (chưa trả lời)
| # | Câu hỏi |
|---|---|
| T-01 | Backfill canonical_key cần downtime không? |
| T-02 | Audit toàn bộ code dùng name matching |
| T-03 | Cronjob +400 NV có vượt timeout? Goroutine isolation? |
| T-04 | resolveUnit(user) cache hay query? Lock double-tap? |
| T-05 | Hasura: role mới hay extend? JWT claim? |
| T-06 | Đã chốt: Day-1 không thêm flag remote ở shift và không auto-approve. Nhóm nhỏ tiếp tục dùng flow legacy remote_onetime / remote_weekly khi đã approved |
| T-07 | Staging riêng hay production + flag? Rollback plan? |
| T-08 | Non-regression suite viết bằng gì? |