Files
solution-erp/.claude/workflows/runs/2026-07-27-S155-pe-delete-approver/cicd-verify-dot2.md
2026-07-27 14:18:06 +07:00

7.7 KiB
Raw Blame History

CI/CD verify — S155 đợt 2 (4464a46)

Ghi-đĩa-trong-lúc-làm (#53). File này là SẢN PHẨM CHÍNH. Mỗi mục ghi ngay khi có bằng chứng. Bắt đầu: 2026-07-27.

0. Ngữ cảnh

  • Commit: 4464a464c58b062d1d5a0fbeaf558753799baf28[CLAUDE] PurchaseEvaluation: nut XOA phieu o man duyet + menu 3 muc + man "Da xoa" (dot 2)
  • Author date: 2026-07-27 14:06:14 +0700
  • Push: b1bae77..4464a46 → main, git log origin/main..HEAD = RỖNG (đã push thật).
  • 15 file đổi: 8 FE (fe-admin ×4 + fe-user ×4), 6 BE, 1 test.
    • BE: PurchaseEvaluationsController.cs, PurchaseEvaluationDtos.cs, PeSoftDeleteFeatures.cs, PurchaseEvaluationFeatures.cs, MenuKeys.cs, DbInitializer.cs
    • Test: tests/SolutionErp.Infrastructure.Tests/Application/PeDeleteByApproverTests.cs
  • 🔴 KHÔNG có file nào trong *Migrations* ⇒ đợt 2 NO-MIG (đúng như lead nói).
  • Không file nào khớp paths-ignore 7-glob ⇒ CI PHẢI chạy.

0bis. PRE-DEPLOY BASELINE (chụp 14:0714:08, khi run #417 còn running)

Chụp TRƯỚC khi deploy xong ⇒ mọi thay đổi thấy sau này là DO ĐỢT NÀY, không phải "sẵn có".

Bundle (14:07:54): admin js CiUBEEJr css DX5ew0wg · eoffice js DFh7GK0t css BHsBUA8e (= đúng baseline đợt 1 run #416 ⇒ chưa ship đợt 2 tại thời điểm chụp)

Menu Pe_* (10 hàng, KHÔNG có _Approved/_Deleted):

Pe_DuyetNcc | Duyệt NCC | vis=1          Pe_DuyetNccPhuongAn | Duyệt NCC và Giải pháp | vis=0
Pe_DuyetNcc_Create | Thao tác            Pe_DuyetNccPhuongAn_Create | Thao tác
Pe_DuyetNcc_List | Danh sách             Pe_DuyetNccPhuongAn_List | Danh sách
Pe_DuyetNcc_Pending | Duyệt   ← NHÃN CŨ  Pe_DuyetNccPhuongAn_Pending | Duyệt   ← NHÃN CŨ
Pe_DuyetNcc_WfView | Luồng duyệt         Pe_DuyetNccPhuongAn_WfView | Luồng duyệt

🔑 Kỹ thuật đọc nhãn tiếng Việt qua ssh→sqlcmd: output mặc định mangle (Duy?t) không phân biệt được "Duyệt" vs "Đang duyệt" đủ chắc ⇒ dùng CONVERT(varchar(400), CAST(Label AS varbinary(400)), 2) → hex, decode utf-16-le phía client. Pre-deploy hex-decode CHÍNH XÁC: Pe_DuyetNcc_Pending -> 'Duyệt' · Pe_DuyetNccPhuongAn_Pending -> 'Duyệt'.

Mig top: 20260727033522_AddPeAllowApproverDelete (Mig 68) · sys.tables(is_ms_shipped=0) = 89

1. Gitea Actions run — ĐANG ĐO

PASS. Run #417 (task id=530), head_sha=4464a464.

Test gate — số THẬT trích từ log CI (…/actions/runs/417/jobs/0/logs, 17.864 B):

07:06:53Z Passed!  - Failed: 0, Passed:  45, Skipped: 0, Total:  45 — SolutionErp.Domain.Tests.dll
07:09:25Z Passed!  - Failed: 0, Passed: 517, Skipped: 0, Total: 517 — SolutionErp.Infrastructure.Tests.dll

562 PASS / 0 FAIL / 0 SKIP (45 + 517). Khớp CHÍNH XÁC số lead đo local (562) = cross-check 2 nguồn độc lập. Tăng +11 so với run #416 đợt 1 (551) — khớp file test mới PeDeleteByApproverTests.cs. Gate chạy TRƯỚC build/deploy ⇒ success ⟹ gate đã qua.

2. Menu prod — PASS (TRỌNG-TÂM, gồm cả chỗ dễ trượt nhất)

Đo lúc 14:12 (sau success), cùng câu lệnh hex-decode như baseline 14:08 ⇒ so được 1:1.

Pe_DuyetNcc                   'Duyệt NCC'              vis=1 ord=1
Pe_DuyetNcc_WfView            'Luồng duyệt'            vis=1 ord=2
Pe_DuyetNcc_List              'Danh sách'              vis=1 ord=3
Pe_DuyetNcc_Create            'Thao tác'               vis=1 ord=4
Pe_DuyetNcc_Pending           'Đang duyệt'  🔴ĐÃ ĐỔI   vis=1 ord=5
Pe_DuyetNcc_Approved          'Đã duyệt'    🆕MỚI      vis=1 ord=6
Pe_DuyetNcc_Deleted           'Đã xóa'      🆕MỚI      vis=1 ord=7
Pe_DuyetNccPhuongAn           'Duyệt NCC và Giải pháp' vis=0 ord=8
Pe_DuyetNccPhuongAn_WfView    'Luồng duyệt'            vis=1 ord=9
Pe_DuyetNccPhuongAn_List      'Danh sách'              vis=1 ord=10
Pe_DuyetNccPhuongAn_Create    'Thao tác'               vis=1 ord=11
Pe_DuyetNccPhuongAn_Pending   'Đang duyệt'  🔴ĐÃ ĐỔI   vis=1 ord=12
Pe_DuyetNccPhuongAn_Approved  'Đã duyệt'    🆕MỚI      vis=1 ord=13
Pe_DuyetNccPhuongAn_Deleted   'Đã xóa'      🆕MỚI      vis=1 ord=14
Điểm kiểm Kỳ vọng Thật
Pe_{code}_Approved nhãn "Đã duyệt" 2/2 type 2/2 có, nhãn ĐÚNG
Pe_{code}_Deleted nhãn "Đã xóa" 2/2 type 2/2 có, nhãn ĐÚNG
🔴 Pe_{code}_Pending "Duyệt"→"Đang duyệt" 2/2 đổi 2/2 đổi (pre-deploy 14:08 còn là 'Duyệt')
Pe_* tổng 10 → 14 10 → 14 (+4)

🔑 3 chứng cứ cùng lúc, khoá chặt trọng-tâm "API phải restart thì seed mới ăn": (i) 4 key mới KHÔNG có ở baseline 14:08 và CÓ ở 14:12 ⇒ seeder chạy TRONG cửa-sổ deploy, không phải sẵn có; (ii) nhãn Pending đổi được ⇒ labelBackfill (DbInitializer.cs:1918-1924) ĐÃ CHẠY THẬT — đây là đường RIÊNG, không đi qua upsert :1893-1905 (upsert gặp key cũ chỉ update Order rồi continue, không đụng Label). Nhãn vẫn "Duyệt" sẽ là FAIL đáng báo động — KHÔNG xảy ra; (iii) Order cả cụm được ghi lại liền mạch 1→14 (Approved=6/13, Deleted=7/14 chèn sau Pending) ⇒ nhánh upsert cũng chạy trọn, không nửa vời.

3. Permission seed — PASS (cả 2 danh sách đều ăn)

Permissions prod (cột thật: RoleId + MenuKey nvarchar, KHÔNG phải FK MenuItemId). Prod có 13 role. Gom nhóm theo MenuKey LIKE 'Pe[_]%':

Pe_DuyetNcc                   rows=13 read=13 cre=13 upd=7 del=1
Pe_DuyetNcc_WfView            rows=13 read=13 cre=13 upd=7 del=1
Pe_DuyetNcc_List              rows=13 read=13 cre=13 upd=7 del=1
Pe_DuyetNcc_Create            rows=13 read=13 cre=13 upd=7 del=1
Pe_DuyetNcc_Pending           rows=13 read=13 cre=13 upd=7 del=1
Pe_DuyetNcc_Approved   🆕     rows=13 read=13 cre=13 upd=7 del=1
Pe_DuyetNcc_Deleted    🆕     rows=13 read=13 cre=13 upd=7 del=1
   … (khối `DuyetNccPhuongAn` 7 dòng GIỐNG HỆT, kể cả 2 key mới)

4 key mới đều có đủ 13 hàng/13 role, và profile quyền (13/13/7/1) trùng khít key Pe_* cũ ⇒ CẢ HAI danh sách được vá (DbInitializer.cs:2110-2111 UpgradeReviewModulePermissions… :2514-2515 SeedPurchaseEvaluationPermissionDefaults…) — không lệch bên nào. Tổng: Permissions 718 hàng / 68 MenuKey distinct · MenuItems 105 hàng.

Số canonical KHÔNG đổi (đúng chủ đích): đếm từ mã MenuKeys.All = 54 phần tử · Actions = 4 ⇒ Policies = 216. Trong All chỉ có root PurchaseEvaluations, KHÔNG có Pe_* leaf. Diff MenuKeys.cs đợt này chỉ 1 hunk @@ -135,6 +135,15 @@ (2 factory + chú thích), không chạm mảng All (dòng 156).

NO-MIG confirm: git diff HEAD~1 HEAD -- '*Migrations*' = RỖNG · __EFMigrationsHistory top vẫn 20260727033522_AddPeAllowApproverDelete (Mig 68) · sys.tables(is_ms_shipped=0) = 89. Đúng kỳ vọng "đợt 2 không có migration".

4. Endpoint mới — ĐANG ĐO

(chưa có)

5. Smoke chống hồi quy — ĐANG ĐO

(chưa có)

6. Bundle FE ×2 — ĐANG ĐO

(chưa có)

7. Verdict — ĐANG ĐO

(chưa có)