# -*- coding: utf-8 -*-
r"""B99: ghi MỤC 13/10/2026 (Trí QC: kiểm tra lại màu AQ 455 tại Hố Nai 1 — 3 phôi MDF) vào 'Tri qc.md' + DOCX.
Ảnh chèn: đọc danh sách 'KẾT LUẬN CHỌN ẢNH' trong NOI_DUNG_AGY.md (tối đa 3)."""
import os, re, shutil, subprocess, sys, difflib, zipfile

QC = r'C:\Claw 2\QC'
SRC = os.path.join(QC, 'Tri qc.md')
BKP = os.path.join(QC, r'13102026\BACKUP_MD\Nhan su tham gia\QC__Tri qc.md')
AGY = os.path.join(QC, r'images\_zalo_tri_1310_today')
MUC_MD = os.path.join(QC, '_muc_tri_1310.md')
DOCX = os.path.join(QC, 'BAO_CAO_QC_13-10-2026_Nguyen_Anh_Tri.docx')
MD2DOCX = r'C:\Users\admin\AppData\Local\hermes\skills\productivity\qc-daily-report-chain\scripts\md2docx-qc.py'

# ---- ảnh chèn (theo AGY chọn) ----
s_agy = open(os.path.join(AGY, 'NOI_DUNG_AGY.md'), encoding='utf-8').read()
chon = re.findall(r'^\s*([A-Za-z0-9_.\-]+\.jpg)\s*$', s_agy.split('KẾT LUẬN CHỌN ẢNH')[-1], re.M)[:3]
print('  AGY chọn:', chon)
for k, ten in enumerate(chon, 1):
    shutil.copy2(os.path.join(AGY, ten), os.path.join(QC, 'images', 'tri_aq455_hoinai1_%02d_1310.jpg' % k))
    print('  chèn ảnh:', 'tri_aq455_hoinai1_%02d_1310.jpg' % k, os.path.getsize(os.path.join(QC, 'images', 'tri_aq455_hoinai1_%02d_1310.jpg' % k)), 'B')
ANH_MD = '\n\n'.join('![](images/tri_aq455_hoinai1_%02d_1310.jpg)' % k for k in range(1, len(chon) + 1))

MUC = """# BÁO CÁO QC — CẬP NHẬT 13/10/2026: **Kiểm tra lại màu AQ 455 tại Công ty Hố Nai 1** — phối hợp kỹ thuật nhà máy thực hiện **03 phôi MDF** với 3 cách xử lý khác nhau (bóng pha **7 bóng 5% + 3 bóng 10%** · lót màu NC lần 2 rồi lót NCKH · hoàn thiện bóng 5%); **ngày 14/10 màng khô hẳn mới đánh giá và đem thẻ về cho Giám đốc**

**Ngày báo cáo:** 13/10/2026
**Người báo cáo:** Nguyễn Anh Trí (QC BT Chem)
**Kính gửi:** Ban Giám đốc (anh Tâm, anh Minh) và BLĐ phòng Kỹ thuật – QC
**Nhà máy:** Công ty **Hố Nai 1** · **Nền:** MDF cán UV màu
**Nguồn:** tin nhắn Zalo của Nguyễn Anh Trí, hội thoại “Trí QC”, tin cuối lúc **17:28 ngày 13/10/2026** kèm **15 ảnh** (ảnh gửi theo **album** — đã tải **bản gốc từng ảnh, cap 1400 px**, md5 khử trùng; các tin/ảnh phía trước trong hội thoại thuộc ngày 12/10 nên đã tách riêng).

## 1. Nguyên văn tin nhắn Zalo trong ngày

> **Báo cáo a công việc hôm nay ở cty hố nai 1 : cùng kỹ thuật thực hiện kiểm tra lại màu AQ 455 tại cty Hố Nai 1**
> **Quy trình thực hiện**
> Mdf cán uv màu -> lót màu nc 2 lần -> dặm lót màu nc -> bóng nc t2012 1505 5% ( thực hiện trên 3 phôi mdf :1 phôi công đoạn bóng pha 7 bóng 5%+3 bóng 10% ; 1 thẻ phun tới lót màu nc lần 2 sau đó lót nckh lên ;1 thẻ phun hoàn thiện sử dụng bóng 5 % )
> Hôm nay đã thực hiện xong quy trinh -> mai khô hẳn sẽ đánh giá màng sơn và đem thẻ kiểm tra về cho sếp Tâm xem ).

## 2. Quy trình đang kiểm tra (theo báo cáo)

| Bước | Công đoạn |
|---|---|
| 1 | **MDF cán UV màu** |
| 2 | **Lót màu NC 2 lần** |
| 3 | **Dặm lót màu NC** |
| 4 | **Bóng NC T2012 1505 5%** |

**Ba phôi MDF đối chứng (thực hiện trong cùng ngày):**

| Phôi | Cách làm (nguyên văn) | Diễn giải của QC ghi nhận |
|---|---|---|
| ① | *“1 phôi công đoạn bóng pha 7 bóng 5% + 3 bóng 10%”* | pha trộn **7 phần bóng 5% với 3 phần bóng 10%** (tạo mức bóng trung gian giữa 5% và 10%) |
| ② | *“1 thẻ phun tới lót màu NC lần 2 sau đó lót NCKH lên”* | dừng ở lót màu NC lần 2, sau đó phủ **lót NCKH** lên trên |
| ③ | *“1 thẻ phun hoàn thiện sử dụng bóng 5%”* | phôi đối chứng **hoàn thiện chuẩn — bóng 5%** |

**Kết quả trong ngày:** **đã thực hiện xong quy trình** trên cả 3 phôi — **chưa đánh giá**; **ngày 14/10** khi màng khô hẳn mới đánh giá màng sơn và **đem thẻ kiểm tra về cho Giám đốc Trần Quyết Tâm xem**.

**Ghi nhận từ 15 ảnh hiện trường/ mẫu thử (đọc bằng AI trên ảnh gốc):** ảnh ghi lại thao tác **phun sơn tại xưởng Hố Nai 1** (súng phun, có kỹ thuật viên hỗ trợ quan sát), **3 phôi MDF đối chứng** đặt trên giá đỡ (một số ảnh chụp riêng từng phôi, một số chụp toàn cảnh 3 phôi đứng cạnh nhau), **thẻ mẫu có dán nhãn quy trình**, phôi ướt đang ráo và các phôi đã ráo mặt; trên kệ vật tư có **can lót NCKH**. Hình ảnh ghi nhận bề mặt phôi phẳng, màng sơn đều — **chưa có kết luận về độ bóng/màu**, phải chờ đo ngày 14/10.

## 3. Hình ảnh minh họa

""" + ANH_MD + """

## 4. Ghi chú đối chiếu & theo dõi

> ⚠️ **Ghi chú đối chiếu:**
> - **NỐI CHUỖI AQ 455 (mốc treo từ 10/10/2026):** mục 10/10 ghi *“Còn 4 thẻ màu AQ 455 hôm nay xem vẫn chưa thấy rõ được ạ. Mai a có vào cty e đưa a xem lại ạ”* ⇒ hôm nay QC đã **cùng kỹ thuật nhà máy kiểm tra lại tại Hố Nai 1** và làm **3 phôi MDF** để đối chứng cách xử lý bóng — tức mốc treo **đang được xử lý**, kết quả chờ **14/10**.
> - **Liên hệ mục 07–08/10/2026:** đã làm lại quy trình AQ 455 (2 mức đen TCL3 × 3 mức bóng) trên thẻ; hôm nay chuyển sang **đối chứng mức bóng bằng cách pha trộn bóng 5% + bóng 10%** và **đối chứng lớp lót (lót NCKH)**.
> - **Điểm cần chốt khi đánh giá (14/10):** so **chỉ tiêu màu sắc và độ bóng** giữa 3 phôi, đối chiếu **thẻ mẫu lưu phòng QC**; đặc biệt xác nhận **phôi ① pha 7 bóng 5% + 3 bóng 10%** cho ra độ bóng nào so với yêu cầu của khách.
> - **Thiếu số liệu thực đo (đề nghị bổ sung khi có kết quả):** MSSX/lô của **lót màu NC**, **bóng NC T2012 1505 5%**, **lót NCKH** và **đèn UV**; tỉ lệ pha và **độ nhớt (cốc NK2)** từng lớp; nhiệt độ – độ ẩm xưởng khi phun; **số đo độ bóng và L/a/b/ΔE** của 3 phôi; số lượng phôi/gỗ nền (MDF loại nào).
> - **Ảnh:** ảnh gửi kèm ở dạng **album 15 ảnh** — đã tải bản gốc (1400×1867 / 1920×2560) và **khử trùng theo md5**; chọn tối đa **03 ảnh** chèn vào báo cáo theo quy ước (chỉ ảnh hiện trường/mẫu thử).
> - **Chưa có:** kết quả đánh giá màng sơn; số liệu 04 thẻ AQ 455 (xem trực tiếp tại công ty); kết luận cuộc họp sản phẩm không phù hợp; kết quả phun tái chế TVT White (đang chờ khô 18 giờ).
"""

s = open(SRC, encoding='utf-8', newline='').read()
old = open(BKP, encoding='utf-8', newline='').read()
assert not re.search(r'\n# BÁO CÁO[^\n]*CẬP NHẬT 13/10/2026', s), 'MỤC 13/10 ĐÃ CÓ — DỪNG'
n_truoc = s.count('# BÁO CÁO')
new = s.rstrip('\r\n') + '\n\n---\n\n' + MUC
open(SRC, 'w', encoding='utf-8', newline='').write(new)
s2 = open(SRC, encoding='utf-8', newline='').read()

sm = difflib.SequenceMatcher(None, old.split('\n'), s2.split('\n'), autojunk=False)
removed = sum(i2 - i1 for tag, i1, i2, j1, j2 in sm.get_opcodes() if tag in ('replace', 'delete'))
added = sum(j2 - j1 for tag, i1, i2, j1, j2 in sm.get_opcodes() if tag in ('replace', 'insert'))
print('  Tri qc.md: %d -> %d B | mục # BÁO CÁO: %d -> %d' % (len(old), len(s2), n_truoc, s2.count('# BÁO CÁO')))
print('  difflib: removed=%d added=%d | startswith(bản cũ rstrip): %s' % (removed, added, s2.startswith(old.rstrip('\r\n'))))

open(MUC_MD, 'w', encoding='utf-8', newline='').write(MUC)
r = subprocess.run([sys.executable, MD2DOCX, MUC_MD, DOCX, QC], capture_output=True, text=True, encoding='utf-8', errors='replace', cwd=QC)
print('  md2docx:', r.returncode, ((r.stdout or '') + (r.stderr or '')).strip()[-200:])
from docx import Document
d = Document(DOCX)
toan = '\n'.join(p.text for p in d.paragraphs) + '\n'.join(c.text for t in d.tables for row in t.rows for c in row.cells)
z = zipfile.ZipFile(DOCX)
print('  DOCX: %d B | đoạn %d | bảng %d | ảnh %d | dấu ** còn %d | "thiếu ảnh" %d' % (
    os.path.getsize(DOCX), len(d.paragraphs), len(d.tables),
    len([n for n in z.namelist() if n.startswith('word/media/')]), toan.count('**'), toan.count('thiếu ảnh')))
