diff --git a/fe-admin/src/components/pe/PeDetailTabs.tsx b/fe-admin/src/components/pe/PeDetailTabs.tsx index 568eb51..84a11f4 100644 --- a/fe-admin/src/components/pe/PeDetailTabs.tsx +++ b/fe-admin/src/components/pe/PeDetailTabs.tsx @@ -1520,10 +1520,27 @@ function HistoryTab({ ev }: { ev: PeDetailBundle }) { queryFn: async () => (await api.get(`/purchase-evaluations/${ev.id}/changelogs`)).data, }) if (logs.isLoading) return

Đang tải…

- if (!logs.data || logs.data.length === 0) return

Chưa có lịch sử.

+ // User UAT 2026-05-08: chỉ track events liên quan Trả lại + Gửi duyệt lại. + // Bỏ trạng thái duyệt (Cấp 1 → Cấp 2 → DaDuyet) + bỏ thay đổi trước Trả lại. + // Filter giữ: + // - Workflow transition về TraLai (phaseAtChange = TraLai = 98) + // - Workflow transition từ TraLai → khác (Drafter gửi lại — summary chứa "TraLai →") + // - Mọi thay đổi nội dung khi phaseAtChange = TraLai (sửa trong giai đoạn chờ gửi lại) + // BE giữ data đầy đủ (audit trail) — chỉ filter ở UI, reversible. + const PE_PHASE_TRALAI = 98 + const PE_ENTITY_WORKFLOW = 5 + const filtered = (logs.data ?? []).filter(l => { + if (l.entityType === PE_ENTITY_WORKFLOW) { + if (l.phaseAtChange === PE_PHASE_TRALAI) return true + if (l.summary?.includes('TraLai →')) return true + return false + } + return l.phaseAtChange === PE_PHASE_TRALAI + }) + if (filtered.length === 0) return

Chưa có lịch sử trả lại / gửi duyệt lại.

return (
    - {logs.data.map(l => ( + {filtered.map(l => (
  1. {l.userName ?? 'Hệ thống'} diff --git a/fe-user/src/components/pe/PeDetailTabs.tsx b/fe-user/src/components/pe/PeDetailTabs.tsx index 568eb51..84a11f4 100644 --- a/fe-user/src/components/pe/PeDetailTabs.tsx +++ b/fe-user/src/components/pe/PeDetailTabs.tsx @@ -1520,10 +1520,27 @@ function HistoryTab({ ev }: { ev: PeDetailBundle }) { queryFn: async () => (await api.get(`/purchase-evaluations/${ev.id}/changelogs`)).data, }) if (logs.isLoading) return

    Đang tải…

    - if (!logs.data || logs.data.length === 0) return

    Chưa có lịch sử.

    + // User UAT 2026-05-08: chỉ track events liên quan Trả lại + Gửi duyệt lại. + // Bỏ trạng thái duyệt (Cấp 1 → Cấp 2 → DaDuyet) + bỏ thay đổi trước Trả lại. + // Filter giữ: + // - Workflow transition về TraLai (phaseAtChange = TraLai = 98) + // - Workflow transition từ TraLai → khác (Drafter gửi lại — summary chứa "TraLai →") + // - Mọi thay đổi nội dung khi phaseAtChange = TraLai (sửa trong giai đoạn chờ gửi lại) + // BE giữ data đầy đủ (audit trail) — chỉ filter ở UI, reversible. + const PE_PHASE_TRALAI = 98 + const PE_ENTITY_WORKFLOW = 5 + const filtered = (logs.data ?? []).filter(l => { + if (l.entityType === PE_ENTITY_WORKFLOW) { + if (l.phaseAtChange === PE_PHASE_TRALAI) return true + if (l.summary?.includes('TraLai →')) return true + return false + } + return l.phaseAtChange === PE_PHASE_TRALAI + }) + if (filtered.length === 0) return

    Chưa có lịch sử trả lại / gửi duyệt lại.

    return (
      - {logs.data.map(l => ( + {filtered.map(l => (
    1. {l.userName ?? 'Hệ thống'}