Skip to content

Type — Event, Scheduler And Notification Boundary

1. Event triggers cho branch/staff KPI

kpi_branch

TriggerĐiều kiện kích hoạtÝ nghĩa
kpi_branch_insertinsert row mớiGửi assign notification nếu total_target > 0
kpi_branch_updateupdate cột total_targetTách assign lần đầu và change target
kpi_branch_deletedelete rowGửi delete notification nếu target cũ > 0

kpi_staff

TriggerĐiều kiện kích hoạtÝ nghĩa
kpi_staff_insertinsert row mớiGửi assign notification nếu total_target > 0
kpi_staff_updateupdate cột total_targetTách assign lần đầu và change target
kpi_staff_deletedelete rowGửi delete notification nếu target cũ > 0

Observation

Notification ở các flows này không phụ thuộc KPI core header kpi; nó gắn trực tiếp vào kpi_branchkpi_staff.

2. Scheduler kpi_notification

Metadata hiện chạy kpi_notification theo lịch:

  • 0 14 * * * vào {\{ECOMMERCE_BASE_URL}\}/schedulers

Scheduler này gọi 4 nhánh:

NhánhVai trò
kpiStaffNotificationNhắc staff chưa đạt target tháng
kpiDayBranchNotificationTổng hợp ngày cho nhóm all-branch/BOD-like audience
kpiMonthBranchNotificationTổng hợp tháng giữa kỳ/cuối kỳ
kpiRemindBranchNotificationNhắc branch managers khi branch chưa đạt target tháng

Rule nổi bật

IDRule
ESN-001kpiMonthBranchNotification chỉ chạy vào ngày 15 hoặc ngày cuối tháng.
ESN-002Staff remind chỉ gửi khi total_revenue_target > 0total_revenue < total_revenue_target.
ESN-003Branch remind chỉ gửi cho branch có target > 0 nhưng actual chưa đạt target.

3. Scheduler kpi_hotline

Metadata hiện chạy kpi_hotline theo lịch:

  • 0 16 * * * vào {\{CRM_BASE_URL}\}/schedulers

Khác với kpi_notification, scheduler này không gửi notification trực tiếp; nó ghi KPI logs hotline vào runtime layer.

4. kpi_permission là audience/config table

kpi_permission có fields:

  • role_id
  • type
  • web_view
  • web_update
  • web_delete

Trong các file đã đọc, runtime đang dùng type nhiều nhất để nhóm audience:

type exampleCách dùng
all_branchChọn role nhận tổng hợp branch day/month
branch_managerChọn role nhận branch remind

Điểm đáng chú ý là FE route access và participant detail permission không đọc trực tiếp từ kpi_permission trong phần code đã đọc.

5. Template triggers sử dụng

Trigger code familyUse case
noti_staff_kpi_assignassign KPI staff
noti_staff_kpi_changeđổi target KPI staff
noti_staff_kpi_deletexóa KPI staff
noti_staff_kpi_remindstaff reminder
noti_branch_kpi_assignassign KPI branch
noti_branch_kpi_changeđổi target KPI branch
noti_branch_kpi_deletexóa KPI branch
noti_branch_kpi_remindnhắc branch chưa đạt
noti_kpi_branch_day_bodtổng hợp ngày cho audience all-branch
noti_kpi_branch_month_bodtổng hợp tháng cho audience all-branch

6. Rủi ro kỹ thuật đáng chú ý

Inconsistency giữa FE permission và notification audience

  • FE route/detail có permission logic riêng.
  • Scheduler notification lại đi qua kpi_permission.
  • Một role có thể xem KPI nhưng không nhận noti, hoặc ngược lại, nếu config drift.

Dấu hiệu bug ở kpi_staff_update

Trong nhánh change notification, code xây biến template bằng query.KpiStaffResults[0] sau nhánh lỗi/trường hợp rỗng.

Điều này tạo risk:

  1. query lỗi hoặc trả rỗng,
  2. code vẫn dereference phần tử đầu,
  3. runtime có thể panic hoặc gửi biến thiếu dữ liệu.

Trigger coverage hạn chế

  • kpi_branch_updatekpi_staff_update chỉ bắn khi cột total_target đổi.
  • Nếu business muốn notify khi sửa các field khác như month, year, total_sales_target, thì metadata hiện chưa cover.

7. Findings

IDFinding
ESN-F01Notification runtime của KPI bị tách thành nhiều lớp và không có một source-of-truth permission duy nhất.
ESN-F02kpi_staff_update có risk truy cập query.KpiStaffResults[0] dù query có thể lỗi/rỗng.
ESN-F03Event triggers branch/staff chỉ quan tâm mạnh đến total_target; các thay đổi nghiệp vụ khác có thể không phát noti.