# -*- coding: utf-8 -*-
r"""B35: ghi MỤC 10/10/2026 (Trí QC - dằn dính mặt bộ sơn PU đen giao Scansia) vào 'Tri qc.md' + DOCX.
Đã backup trước: QC\12102026\BACKUP_MD\Nhan su tham gia\QC__Tri qc.md"""
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'12102026\BACKUP_MD\Nhan su tham gia\QC__Tri qc.md')
SRCDIR = os.path.join(QC, r'images\_tri_1010')
MUC_MD = os.path.join(QC, '_muc_tri_1010.md')
DOCX = os.path.join(QC, 'BAO_CAO_QC_10-10-2026_Nguyen_Anh_Tri.docx')
MD2DOCX = r'C:\Users\admin\AppData\Local\hermes\skills\productivity\qc-daily-report-chain\scripts\md2docx-qc.py'

ANH = [('tri_1010_01.jpg', 'tri_binhthanh_dan-dinh-mat-pu-den_1010.jpg'),
       ('tri_1010_02.jpg', 'tri_binhthanh_mau-pu-den-gian-treo_1010.jpg'),
       ('tri_1010_03.jpg', 'tri_binhthanh_mau-pu-den-gian-treo-2_1010.jpg')]
for a, b in ANH:
    shutil.copy2(os.path.join(SRCDIR, a), os.path.join(QC, 'images', b))
    print('  chèn ảnh:', b, os.path.getsize(os.path.join(QC, 'images', b)), 'B')

MUC = """# BÁO CÁO QC — CẬP NHẬT 10/10/2026: Kiểm tra **dằn dính mặt** bộ sơn **PU màu đen** giao khách **Scansia** (thực hiện tại **Công ty Bình Thạnh**) — tải dằn **0,5 kg/cm²** ở các mốc khô tự nhiên **4 giờ · 5 giờ · 6 giờ**

**Ngày báo cáo:** 10/10/2026
**Người báo cáo:** Nguyễn Anh Trí (QC BT Chem)
**Kính gửi:** BLĐ phòng Kỹ thuật & phòng QC BT-Chem
**Nguồn:** tin nhắn Zalo của Nguyễn Anh Trí, hội thoại “Trí QC” — gửi lúc **18:56 ngày 10/10/2026**: 01 tin nhắn chữ + **03 ảnh** (không có file/PDF đính kèm).

## 1. Nguyên văn tin nhắn Zalo

> Báo cáo a công việc hôm nay ở cty bình thạnh : kiểm tra chất lượng dính mặt bộ sơn pu giao cho scansia
> Quy trình thực hiện sp đã nhúng lót pu rồi -> phun lót màu pu ( để khổ sau 2,5 giờ ) -> phun sơn màu pu
> -> để khô tự nhiên sau 4 giờ dằn ; 5 giờ dằn và 6 giờ dằn kiểm tra dính mặt ( khối lượng dằn 0,5kg / cm vuông ) .

## 2. Quy trình & thông số kiểm tra

| Nội dung | Chi tiết |
|---|---|
| Nhà máy thực hiện | **Công ty Bình Thạnh** (kiểm tra nội bộ) |
| Đối tượng giao hàng | Bộ sơn **PU màu đen** giao khách **Scansia** |
| Nội dung kiểm tra | **Dính mặt** (blocking) khi màng sơn chịu tải dằn sau khi khô tự nhiên |
| Quy trình sản phẩm | 1/ Nhúng **lót PU** → 2/ Phun **lót màu PU** (để khô **2,5 giờ**) → 3/ Phun **sơn màu PU** → 4/ Để khô tự nhiên |
| Mốc dằn kiểm tra | Sau khi khô tự nhiên **4 giờ · 5 giờ · 6 giờ** |
| Khối lượng dằn | **0,5 kg/cm²** (nguyên văn: 0,5kg / cm vuông) |
| Mốc giờ thực tế ghi trên mẫu | **15h00** — khô sau **4H** dằn · **16h00** — khô sau **5H** · **17h00** — khô sau **6H** |
| Mẫu thử | 03 thanh mẫu sơn **PU màu đen**; thanh giữa có ký hiệu viết tay **`G.N`** (theo đọc ảnh) |

## 3. Hình ảnh mẫu thử & hiện trường

![](images/tri_binhthanh_dan-dinh-mat-pu-den_1010.jpg)

![](images/tri_binhthanh_mau-pu-den-gian-treo_1010.jpg)

![](images/tri_binhthanh_mau-pu-den-gian-treo-2_1010.jpg)

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

> ⚠️ **Ghi chú đối chiếu:**
> - **Tin nhắn CHƯA nêu kết luận đạt/không đạt** cho từng mốc dằn (4h · 5h · 6h) và chưa nêu có **vết hằn/lún** hay không ⇒ **cần Trí xác nhận kết quả dính mặt** trước khi dùng cho báo cáo tổng hợp. (Mục **Báo cáo 02-0826** trước đây từng ghi nhận **vết hằn lún** ở mốc dằn 5 giờ ⇒ đây là điểm phải đối chiếu kỹ.)
> - **Nối chuỗi cùng khách:** mục **09/10/2026** của cùng người là bộ sơn **PU BLACK (khách Walmart)** giao **Scansia Pacific**, kết quả **độ bám ca-rô 5B/5B** (Báo cáo kiểm tra số **01-1026**) ⇒ hôm nay là bước kiểm tiếp theo: **dính mặt** trên cùng bộ sơn.
> - **Khác cách thử so với các mục trước:** mục 18–19/08 (màu **MD 2153**) dùng mốc khô **15 giờ / 24 giờ**; hôm nay dùng mốc ngắn **4 / 5 / 6 giờ** với tải **0,5 kg/cm²** ⇒ **hai cách thử khác nhau, không so trực tiếp số liệu**.
> - **Ảnh:** chọn **3/3 ảnh** — cả ba đều là ảnh **mẫu thử/bề mặt màng sơn và hiện trường xưởng** (giàn treo sấy + bàn dằn); **không có ảnh phiếu in, báo cáo viết tay hay ảnh chụp màn hình** nên **không ảnh nào bị loại**.
> - **Mốc chờ mới:** ① kết quả **dính mặt** ở 3 mốc (4h · 5h · 6h) đạt hay không, có vết hằn không; ② xác nhận ký hiệu **`G.N`** trên thanh mẫu là mã gì (trợ lý chỉ ghi theo đọc ảnh, chưa đối chiếu được với danh mục sản phẩm).
> - **Chưa kiểm:** chưa có **nhiệt độ/độ ẩm xưởng** tại thời điểm dằn, chưa có **thời gian khô và độ bóng của lớp sơn màu PU**, chưa có khối lượng sơn tiêu hao của bộ này.
"""

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 10/10/2026', s), 'MỤC 10/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()[-300:])
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')))
