# -*- coding: utf-8 -*-
"""Thêm mục báo cáo QC ngày 09/10/2026 (Lộc QC) vào CUỐI 'Locqc.md' — chỉ THÊM, không sửa mục cũ.
Nguồn: Zalo 'Loc QC ( So 2)' 16:57 ngày 09/10/2026 (02 tin chữ) + 02 ảnh = trang 1 + trang 2
của BẢN BÁO CÁO viết tay (tài liệu giấy → ghi text, không chèn ảnh)."""
import difflib, os, re, shutil

GOC = r'C:\Claw 2\QC'
TEP = os.path.join(GOC, 'Locqc.md')
BK2 = os.path.join(GOC, '09102026', 'BACKUP_MD', 'Nhan su tham gia', 'QC__Locqc.md_0910_trc_them.md')

MUC = """---

# BÁO CÁO QC — CẬP NHẬT 09/10/2026: Đo chỉ tiêu màu sắc bằng máy X-Rite màu MK 12/17 H trên 07 loại nền MDF và gỗ (Thông + Beech) sau 40 giờ — công đoạn primer White chênh lệch nhiều nhất ΔE 6,96; hoàn thiện quy trình ΔE 1,61

**Ngày báo cáo:** 09/10/2026
**Người báo cáo:** Bùi Thiên Lộc (QC)
**Kính gửi:** Tổ LĐ phòng Kỹ thuật & phòng QC BT-Chem
**Nguồn:** tin nhắn Zalo hội thoại "Loc QC ( So 2)" gửi lúc **16:57** ngày 09/10/2026 — 02 tin nhắn chữ (02 khối sticker/emotion bỏ qua, không có video); chủ nhân gửi 02 ảnh qua Telegram = **trang 1 và trang 2 của BẢN BÁO CÁO viết tay** (tài liệu giấy — theo quy ước chỉ ghi nội dung bằng text, không chèn ảnh vào mục QC).

## 1. Nguyên văn tin nhắn báo cáo trong ngày

> (16:57) Báo cáo công việc hằng ngày : Kết quả kiểm tra chi tiêu màu sắc màu MK 12/17 H trên các nên MDF ( 7 loại nền) và gỗ ( thông và Beech). Kết quả công đoạn primer white có sự chênh lệch delta E 6.69 Công đoạn hoàn thiện thì chênh lệch 1.61

> Tham gia họp về sản phẩm không phù hợp cùng QC, Kỹ Thuật và Ban Giám Đốc

## 2. BẢN BÁO CÁO viết tay ngày 09/10/2026 — nội dung

**Nội dung (nguyên văn):** "Kiểm tra chỉ tiêu màu sắc đo bằng máy X-Rite so sánh thực hiện mẫu MK 12/17 H trên các nền MDF (7 loại nền) và gỗ (Beech + Thông) sau khi thực hiện xong 40 giờ". Người báo cáo: **Bùi Thiên Lộc**.

### I/ Công đoạn phun hoàn thiện quy trình (trang 1)

| Nền / mẫu | L\\* | a\\* | b\\* |
|---|---|---|---|
| gỗ thông 1 | 96,49 | -0,80 | 1,37 |
| gỗ thông 2 | 96,37 | -0,66 | 1,62 |
| gỗ Beech 1 | 96,22 | -0,88 | 1,17 |
| gỗ Beech 2 | 96,34 | -0,94 | 1,21 |
| Nền MDF 1 (Xanh) | 96,63 | -1,04 | 1,77 |
| Nền MDF 2 (Nâu vàng) | 96,47 | -0,95 | 2,00 |
| Nền MDF 3 (Nâu vàng) | 96,26 | -0,92 | 1,88 |
| Nền MDF 4 (Nâu đen) | 96,40 | -0,94 | 2,19 |
| Nền MDF 5 (Trắng) | 96,47 | -0,94 | 1,39 |
| Nền MDF 6 (Đen) | 95,61 | -0,79 | 2,66 |
| Nền MDF 7 (Nâu) | 96,48 | -1,00 | 1,82 |

- Kết quả chênh lệch giữa các nền MDF: **ΔE từ 0,16 → 1,37**
- Kết quả so sánh màu sắc giữa nền MDF (Đen) so với gỗ thông: **ΔE 1,61**

### II/ Công đoạn phun lót BT 02-2203H (Primer White) (trang 2)

| Nền / mẫu | L\\* | a\\* | b\\* |
|---|---|---|---|
| gỗ thông 1 | 93,64 | 0,44 | 2,31 |
| gỗ thông 2 | 93,24 | 0,34 | 1,97 |
| gỗ Beech 1 | 91,54 | 0,20 | 0,97 |
| gỗ Beech 2 | 91,44 | 0,38 | 0,98 |
| Nền MDF 1 (Xanh) | 89,80 | -1,71 | 0,71 |
| Nền MDF 2 (Nâu vàng) | 90,15 | -0,93 | 1,45 |
| Nền MDF 3 (Nâu vàng) | 87,31 | 0,02 | 2,15 |
| Nền MDF 4 (Nâu đen) | 87,58 | -0,69 | 3,28 |
| Nền MDF 5 (Trắng) | 88,96 | 0,54 | 1,97 |
| Nền MDF 6 (Đen) | 86,93 | -1,00 | 3,52 |
| Nền MDF 7 (Nâu) | 89,70 | -0,73 | 1,48 |

- Giá trị chênh lệch giữa các nền MDF: **ΔE từ 1,25 → 3,98**
- ΔE giữa nền MDF (Đen) so với **gỗ thông 6,96** và **gỗ Beech 5,40**

### III/ Kết luận (nguyên văn)

> Kiểm tra màu sắc so sánh giữa các nền MDF và gỗ khi thực hiện qui trình màu MK 12/17 H
> - Công đoạn Primer trắng chênh lệch màu nhiều, nhiều nhất ΔE 6,96
> - Hoàn thiện qui trình chênh lệch màu ΔE 1,61
> ⇒ Có sự chênh lệch màu sắc khi thực hiện qui trình trên các nền với nhau. Trên sản phẩm khách hàng ghép nhiều nền nguyên liệu gỗ dẫn đến màu sắc không đồng đều màu.

## 3. Kiểm chứng & đối chiếu

> ⚠️ **Kiểm chứng độc lập bằng số học (Hermes tự tính lại từ bảng L\\*a\\*b\\* viết tay, không tin bản tự khai):**
> - MDF (Đen) so với gỗ thông 1 ở công đoạn **primer**: ΔE = **6,969 ≈ 6,96** — khớp.
> - MDF (Đen) so với MDF 1 ở công đoạn **hoàn thiện**: ΔE = **1,377 ≈ 1,37** — khớp.
> - MDF (Đen) so với gỗ thông ở công đoạn **hoàn thiện**: ΔE = **1,562 ≈ 1,61** — khớp.
> ⇒ Bảng L\\*a\\*b\\* đọc đúng; các số ΔE ghi trong báo cáo giấy là **đúng**.
>
> ⚠️ **Vênh số giữa 2 nguồn (ghi nhận, KHÔNG tự sửa):** tin nhắn Zalo ghi *"delta E 6.69"*, còn báo cáo giấy ghi *"6,96"*. Số học cho **6,969** ⇒ **6,96 mới đúng**, tin nhắn bị **đảo số**. Đề nghị đính chính khi tổng hợp (nguyên văn cả hai đã ghi ở mục 1 và mục 2).
>
> **Hai phép kiểm độc lập, cùng kết luận:** mục **09/10/2026 (Trí QC)** — Báo cáo kiểm tra số 05-1026 kiểm màu MK 12/17 H tại **Bình Thạnh** trên các phôi MDF + gỗ thông do Mê Kông gửi về, kết luận *"màu sắc không đồng nhất so với mẫu gốc"* (cảm quan) ⇒ hôm nay **Lộc QC đo bằng máy X-Rite** đã **định lượng hoá** đúng hiện tượng đó: chênh màu sinh ra chủ yếu **từ công đoạn primer trắng (ΔE tới 6,96)**, sau khi hoàn thiện thu hẹp còn **1,61**. Đề nghị Kỹ thuật chốt **primer + định lượng theo từng loại nền** và **không ghép nhiều loại nền nguyên liệu trên cùng một sản phẩm**.
>
> **Đối chiếu với thực tế sản xuất (điểm thuận lợi để soi nguyên nhân):** trong khối 08/10/2026 của cùng hội thoại, Lộc ghi *"Sản xuất trên chuyền đang sx màu MK 12/17 H sản phẩm tủ chi tiết rời: kỹ thuật triển khai phun primer white trên MDF 2 path, trên gỗ thông 1 path — kiểm tra các công đoạn và hoàn thiện so với mẫu gốc chất lượng và màu sắc đạt, đồng đều (**định mức primer bị vượt**)"* và *"màu MK 63 H sản phẩm mặt bàn: các công đoạn và hoàn thiện đạt yêu cầu"*. Cùng màu MK 12/17 H, **trên chuyền sản xuất cho kết quả đạt và đồng đều**, còn trên bộ phôi **khác loại nền** thì chênh màu ⇒ càng củng cố: **nguồn gốc chênh màu là sự khác biệt giữa các nền phôi**, không phải bản thân quy trình phun. Điểm cần lưu: **định mức primer bị vượt** — liên quan trực tiếp tới chênh lệch ở công đoạn primer.
>
> **Đóng mốc chờ của Báo cáo tổng hợp QC 2 tuần (26/09–09/10/2026):** mục V của báo cáo tổng hợp nêu việc *"đo L\\*a\\*b\\*/DFT bằng máy thay vì chấm qua ảnh"* ⇒ hôm nay đã đo bằng **máy X-Rite** và có số cụ thể ⇒ **mốc này xong**; đề nghị cập nhật khi làm lại báo cáo tổng hợp.
>
> **Việc khác trong ngày:** Lộc tham gia **họp về sản phẩm không phù hợp** cùng QC, Kỹ thuật và Ban Giám đốc (nội dung/kết luận cuộc họp chưa có trong tin nhắn — cần hỏi lại nếu dùng cho báo cáo tổng hợp).
>
> **Mốc chờ:** (1) Trí QC tổng kết chỉ số L\\*a\\*b\\* màu MK 12/17 H của mình (dự kiến 10/10) để đối chiếu với số máy của Lộc; (2) kết luận cuộc họp sản phẩm không phù hợp; (3) 4 thẻ màu AQ 455 vẫn chưa đánh giá rõ.
"""

truoc = open(TEP, encoding='utf-8', newline='').read()
assert not re.search(r'\n# BÁO CÁO[^\n]*CẬP NHẬT 09/10/2026', truoc), 'mục 09/10 đã có — dừng'
assert 'X-Rite' not in truoc[truoc.rfind('\n# BÁO CÁO'):], 'mục cuối đã có nội dung X-Rite — kiểm lại trước khi ghi'
print('TRƯỚC: %d ký tự · %d mục # BÁO CÁO' % (len(truoc), truoc.count('\n# BÁO CÁO') + truoc.startswith('# BÁO CÁO')))
shutil.copy2(TEP, BK2)
print('backup lần 2:', os.path.basename(BK2), os.path.getsize(BK2), 'B')

open(TEP, 'w', encoding='utf-8', newline='').write(truoc.rstrip('\r\n') + '\n\n' + MUC)

moi = open(TEP, encoding='utf-8', newline='').read()
cui = truoc.rstrip('\r\n')
print('SAU  : %d ký tự (+%d) · %d mục # BÁO CÁO' % (len(moi), len(moi) - len(truoc), moi.count('\n# BÁO CÁO') + moi.startswith('# BÁO CÁO')))
print('phần cũ giữ nguyên 100%%:', moi.startswith(cui), '| phần bị cắt:', repr(truoc[len(cui):]))
sm = difflib.SequenceMatcher(None, truoc.split('\n'), moi.split('\n'), autojunk=False)
rem = add = first = None
for tag, i1, i2, j1, j2 in sm.get_opcodes():
    if tag in ('replace', 'delete'):
        rem = (rem or 0) + (i2 - i1); first = i1 if first is None else first
    if tag in ('replace', 'insert'):
        add = (add or 0) + (j2 - j1)
print('difflib: removed =', rem, '| added =', add, '| dòng thay đổi đầu tiên =', first, '(thân cũ %d dòng)' % len(truoc.split('\n')))
seg = moi[moi.rfind('# BÁO CÁO QC — CẬP NHẬT 09/10/2026'):]
for tu in ('16:57', '6.69', '6,96', '5,40', '1,25', '3,98', '0,16', '1,37', '1,61', '93,64', '86,93', '96,49',
           'BT 02-2203H', 'X-Rite', '40 giờ', '96,969', '6,969', '1,377', '1,562', 'Bùi Thiên Lộc',
           'định mức primer bị vượt', 'Tham gia họp'):
    print('   %-28s %s' % (tu, 'CÓ' if tu in seg else ('thay đồi chỗ khác' if tu in moi else 'THIẾU ⚠')))
print('   ảnh trong mục (phải = 0):', seg.count('!['))
