|
|
|
|
@ -8,6 +8,76 @@
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## LƯỢT 1-2 — scaffold + đọc nguồn
|
|
|
|
|
## LƯỢT 1-2 — đọc nguồn + ĐO DỮ LIỆU TRƯỚC KHI VIẾT MÃ
|
|
|
|
|
|
|
|
|
|
(đang đọc key ô + file sở hữu)
|
|
|
|
|
### A. Key ô — đọc THẲNG từ đĩa, KHÔNG chế
|
|
|
|
|
|
|
|
|
|
Nguồn: `fe-user/src/lib/contractBody/body002_02.ts` (36 slot) + `body002_03.ts` (46 slot).
|
|
|
|
|
`types.ts:17-18` nói rõ: *"`slot.key` ĐI THẲNG vào `ContractDraftData.body` và SỐNG TRONG DB"* ⇒ chỉ
|
|
|
|
|
dùng key đã tồn tại.
|
|
|
|
|
`ContractBodyView.tsx:225` chốt kiểu: **`body` là `Record<string,string>` PHẲNG** ⇒ mọi giá trị đổ
|
|
|
|
|
xuống phải là **CHUỖI JSON**, không phải số.
|
|
|
|
|
|
|
|
|
|
### B. ĐO DỮ LIỆU (LocalDB `SolutionErp_Dev`, `WHERE IsDeleted = 0`)
|
|
|
|
|
|
|
|
|
|
Lệnh: `sqlcmd -S "(localdb)\MSSQLLocalDB" -d SolutionErp_Dev -i …\measure.sql`
|
|
|
|
|
Vị từ rỗng = `NULLIF(LTRIM(RTRIM(col)),'') IS NULL` (bắt cả NULL lẫn chuỗi trắng).
|
|
|
|
|
|
|
|
|
|
| Bảng | n | Cột | rỗng | % rỗng |
|
|
|
|
|
|---|---|---|---|---|
|
|
|
|
|
| Suppliers | 24 | `Name` | 0 | **0%** |
|
|
|
|
|
| Suppliers | 24 | `Address` | 2 | 8,3% |
|
|
|
|
|
| Suppliers | 24 | `Phone` | 2 | 8,3% |
|
|
|
|
|
| Suppliers | 24 | `ContactPhone` | 20 | 83,3% |
|
|
|
|
|
| Suppliers | 24 | `BankAccount` | 20 | **83,3%** 🔴 |
|
|
|
|
|
| Suppliers | 24 | `TaxCode` | 6 | 25,0% |
|
|
|
|
|
| Suppliers | 24 | `LegalRepresentative` | 20 | **83,3%** 🔴 |
|
|
|
|
|
| Suppliers | 24 | `LegalRepTitle` | 20 | **83,3%** 🔴 |
|
|
|
|
|
| Suppliers | 24 | `Fax` | 23 | **95,8%** 🔴 |
|
|
|
|
|
| Suppliers | 24 | `ContactPerson` | 7 | 29,2% |
|
|
|
|
|
| Suppliers | 24 | `ContactTitle` | 20 | 83,3% |
|
|
|
|
|
| Projects | 69 | `Name` | 0 | **0%** |
|
|
|
|
|
| Projects | 69 | `Investor` | 64 | **92,8%** 🔴 |
|
|
|
|
|
| Projects | 69 | `Location` | 64 | **92,8%** 🔴 |
|
|
|
|
|
| PurchaseEvaluations | 4 | `DiaDiem` | 0 | **0%** ✅ |
|
|
|
|
|
| PurchaseEvaluations | 4 | `TenGoiThau` | 0 | **0%** ✅ |
|
|
|
|
|
| ContractSigningPlanLines | 2 | `TenHangMuc` | 0 | **0%** |
|
|
|
|
|
|
|
|
|
|
🔴 = nguồn rỗng > 50% ⇒ **nối đúng nhưng thực tế sẽ TRẮNG**.
|
|
|
|
|
|
|
|
|
|
Số đo TRÙNG KHỚP MEMORY-PACK (BankAccount 83% · người đại diện 83% · Investor 93% · Location 93% ·
|
|
|
|
|
MST 25% · `pe.DiaDiem` 0%) ⇒ xác nhận lệnh *"địa điểm lấy `pe.DiaDiem`, KHÔNG lấy `Project.Location`"*
|
|
|
|
|
là đúng bằng số, không phải theo cảm tính.
|
|
|
|
|
|
|
|
|
|
⚠️ **CAVEAT MẪU SỐ (tự khai, đừng đọc quá số):** `PurchaseEvaluations` **n = 4** và
|
|
|
|
|
`ContractSigningPlanLines` **n = 2** trên Dev. "0% rỗng" trên n=4 là **tín hiệu yếu** — nó nói
|
|
|
|
|
"chưa thấy ca rỗng", KHÔNG nói "không thể rỗng". Cả hai cột đều `nullable` ở Domain
|
|
|
|
|
(`PurchaseEvaluation.cs:19` `string? DiaDiem`) ⇒ mã vẫn phải null-safe, và đã null-safe.
|
|
|
|
|
|
|
|
|
|
### C. Chọn cột nguồn khi có ≥2 ứng viên (khai để người sau khỏi đoán)
|
|
|
|
|
|
|
|
|
|
- **`ben_b_dien_thoai`** → `Supplier.Phone` (8,3% rỗng), **KHÔNG** `ContactPhone` (83,3% rỗng).
|
|
|
|
|
Lý do NGỮ NGHĨA trước, số sau: ô nằm trong khối "BÊN NHẬN THẦU (Bên B)" cùng Tên/Địa chỉ/MST ⇒ đó
|
|
|
|
|
là điện thoại **công ty**; `ContactPhone` là "SĐT người liên hệ" (`Supplier.cs:31`). Số đo chỉ xác
|
|
|
|
|
nhận thêm là chọn đúng cột cũng là chọn cột đầy hơn.
|
|
|
|
|
- **`ben_b_nguoi_dai_dien` / `ben_b_chuc_vu`** → `LegalRepresentative` / `LegalRepTitle`
|
|
|
|
|
(`Supplier.cs:24-25`), **KHÔNG** `ContactPerson`/`ContactTitle`. Ô này đứng ngay trên khối ký
|
|
|
|
|
"ĐẠI DIỆN BÊN B" ⇒ phải là **đại diện pháp luật**, không phải người liên hệ.
|
|
|
|
|
🔴 Đây là ca **chọn cột ĐÚNG NGHĨA dù RỖNG HƠN**: `ContactPerson` chỉ rỗng 29,2% còn
|
|
|
|
|
`LegalRepresentative` rỗng 83,3%. Lấy `ContactPerson` cho "đầy bảng thành tích" = điền **sai người
|
|
|
|
|
ký** vào hợp đồng — tức là đổ một giá trị SAI trông như đã điền xong, tệ hơn hẳn ô trống.
|
|
|
|
|
|
|
|
|
|
### D. Ô CÓ trong mẫu nhưng CỐ Ý KHÔNG đổ
|
|
|
|
|
|
|
|
|
|
| key | vì sao bỏ |
|
|
|
|
|
|---|---|
|
|
|
|
|
| `gia_tri_bang_chu` | phải sinh chữ-số-tiếng-Việt (thuật toán mới) — ngoài phạm vi lane, và đọc-số-thành-chữ sai thì sai trong văn bản pháp lý |
|
|
|
|
|
| `ben_a_so_tai_khoan` · `ben_a_ngan_hang` · `ben_a_nguoi_dai_dien` · `ben_a_chuc_vu` | Bên A = Solutions, **0 nguồn trong DB** (không có bảng thông tin công ty mình) |
|
|
|
|
|
| `bia_thang` · `bia_nam` · `ngay_ky_*` · `ngay_hoan_thanh` | ngày do người soạn chốt; lấy `DateTime.UtcNow` = **bịa** một ngày ký |
|
|
|
|
|
| `hd_chinh_so` · `hd_chinh_ngay` | HĐ giao thầu chính giữa Solutions ⟂ Chủ đầu tư — hệ chưa có ô này |
|
|
|
|
|
| `bhld_*` (9 ô, chỉ 002.03) | đơn giá bảo hộ lao động — không có danh mục nguồn |
|
|
|
|
|
| bảng (`bang_gia_tri`, `bang_tom_tat`, `pl0*`) | ô bảng, không phải slot phẳng; lược đồ `body` là map phẳng |
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## LƯỢT 3 — MÃ (đang viết)
|
|
|
|
|
|