[CLAUDE] Contract: KHKK go 2 nut phu, nut + tren dong, header chi ma, xoa duoc phieu Tra lai
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 7m0s
All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 7m0s
Anh gui 2 anh + 1 dong nhan, gom 6 diem:
(1) "bo nut sua voi ve lai form": go TRON dai 2 nut goc phai cua KhkkCreatePage
(Sua + X Ve form tao). Ca hai deu la duong PHU:
- vao che-do sua -> but chi o DANH SACH trai (onEditPlan) = duong DUY NHAT, GIU.
- roi che-do xem -> bam PE bat ky o cay trai, pickPe() tu setViewPlanId(null).
Dinh chinh chu-thich S175 tung dung do ("bo han thi nguoi dung ket, khong co
duong lui"): SAI ngay luc viet — pickPe mang nhan [S174] tuc DA TON TAI truoc
cau canh-bao do. Thu duy nhat mat di la duong quay lai man rong huong-dan.
Go luon import Pencil/X (het cho dung).
(2) "To dam" (ma) + (3) "Bo di" (ten): header muc 2 gio CHI con MA, in dam.
Fallback ve TEN khi thieu ma: peWorkItemCode null khi PE khong gan hang muc
(WorkItemId loose-Guid Mig 49, duoc phep rong) — bo ten VO DIEU KIEN thi ca do
header tro moi chu "Hang muc (du an)", trong nhu loi render.
(4) "Them dau + them o day" + (5) "bo di": thay khoi "Them hang muc cho: [NCC...]"
bang nut + o COT HANH-DONG cua TUNG DONG. Nut o dong nao thi BIET SAN NCC cua
dong do (l.supplierId) nen bo duoc buoc chon NCC. Khoi cu ton tai chi vi no dung
NGOAI moi dong nen buoc phai hoi "cho NCC nao".
Vong doi khoi nay tron 3 nac trong CUNG luot S177 (S175 duoi bang -> doi vao
tbody -> go han) — giu 1 dong vet de khoi ai dung lai.
(6) "Trang thai tra lai cho xoa dc luon nhe": allow-list xoa phieu
{DangSoanThao, TuChoi} -> +TraLai.
🔴 Day la VA LECH 2 TANG chu khong phai noi quyen: FE DA hien nut Xoa cho phieu
TraLai tu truoc (canEdit gom TraLai => readOnly=false => thanh nut day hien),
BE thi nem 409 — bam duoc ma khong xoa duoc (gotcha #82).
+1 test DeleteContractSigningPlan_Allows_TraLai, DA CHUNG CO RANG: stash ban va
-> test DO; tra ban va -> XANH. Test (8) cu khong bat duoc vi ve nghich dung
ChoDuyet (cam ca truoc lan sau) va ve thuan dung TuChoi (cho ca truoc lan sau)
— TraLai la phase DUY NHAT doi verdict va no vang mat khoi moi test.
645/645 test pass (+1) · 2 app build sach · SHA IDENTICAL (da verify identical @HEAD
TRUOC khi copy de) · dist local doi chieu: "Ve form tao" = 0.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@ -576,6 +576,45 @@ public class ContractSigningPlanCrudTests
|
||||
.Should().Be(admin.UserId, "người xoá thật được ghi lại là Admin, không phải chủ phiếu");
|
||||
}
|
||||
|
||||
// ===================================================================
|
||||
// (8-bis) [S177 — anh: "Trạng thái trả lại cho xóa đc luôn nhé"] `TraLai` vào allow-list xoá.
|
||||
//
|
||||
// Đây là ĐỔI SPEC (allow-list {Nháp, Từ chối} → {Nháp, Từ chối, Trả lại}) nên test đi
|
||||
// CÙNG commit, không để test-after.
|
||||
//
|
||||
// 🔴 Vì sao test cũ (8) KHÔNG bắt được thiếu sót này, dù nó có cả vế thuận lẫn vế
|
||||
// nghịch: vế nghịch của nó dùng `ChoDuyet` — vẫn bị cấm ĐÚNG cả trước lẫn sau bản
|
||||
// vá; vế thuận dùng `TuChoi` — được phép ĐÚNG cả trước lẫn sau. `TraLai` là phase
|
||||
// DUY NHẤT đổi verdict, và nó không có mặt trong test nào ⇒ allow-list thiếu một
|
||||
// phase mà toàn bộ hàng test vẫn xanh. Trục nào KHÔNG có ca thì trục đó không được đo.
|
||||
//
|
||||
// 🔸 Nền của bản vá là LỆCH 2 TẦNG chứ không phải nới quyền: FE đã hiện nút Xoá cho
|
||||
// phiếu `TraLai` từ trước (`canEdit` gồm `TraLai`), BE thì 409 ⇒ bấm được mà không
|
||||
// xoá được. Test này neo tầng BE — tầng có răng thật.
|
||||
[Fact]
|
||||
public async Task DeleteContractSigningPlan_Allows_TraLai()
|
||||
{
|
||||
using var f = new KhkkFixture();
|
||||
var seeded = await SeedPeAsync(f, supplierCount: 2, winnerIndexes: [0], quotes: [[100m, 7m]]);
|
||||
var created = await CreateAsync(f, seeded.PeId, seeded.WorkflowId);
|
||||
|
||||
await using (var db = f.NewDb())
|
||||
{
|
||||
var plan = db.ContractSigningPlans.Single(p => p.Id == created.Id);
|
||||
plan.Phase = ContractSigningPlanPhase.TraLai;
|
||||
db.SaveChanges();
|
||||
}
|
||||
|
||||
await DeleteAsync(f, created.Id, "Phiếu bị trả lại, soạn lại từ đầu", f.Actor);
|
||||
|
||||
await using var final = f.NewDb();
|
||||
final.ContractSigningPlans.Count(p => p.Id == created.Id)
|
||||
.Should().Be(0, "phiếu Trả lại đã nằm trong tay người soạn, không chiếm lượt duyệt của ai");
|
||||
final.ContractSigningPlans.IgnoreQueryFilters().AsNoTracking()
|
||||
.Single(p => p.Id == created.Id).IsDeleted
|
||||
.Should().BeTrue("xoá MỀM — vết phải còn để truy, không phải bốc hơi khỏi DB");
|
||||
}
|
||||
|
||||
// ===================================================================
|
||||
// (9) [gate-K4b MAJOR-A @S166] Màn "Đã xoá" phải LỌC NHÓM ở SERVER
|
||||
// (`ListDeletedContractSigningPlansQueryHandler` :896-897, vá @K4b).
|
||||
|
||||
Reference in New Issue
Block a user