# -*- coding: utf-8 -*-
r"""B39: GOP 2 bản cô đọng (Lộc + Trí) thành 1 Word tổng hợp 28/09 -> 10/10/2026."""
import os, re, subprocess, sys, zipfile

QC = r'C:\Claw 2\QC'
D = os.path.join(QC, '_tomtat_2809_1010')
MD = os.path.join(QC, '_TONGHOP_TRI_LOC_2809_1010.md')
DOCX = os.path.join(QC, 'TONG_HOP_QC_TRI_LOC_28-09_10-10-2026.docx')
MD2DOCX = r'C:\Users\admin\AppData\Local\hermes\skills\productivity\qc-daily-report-chain\scripts\md2docx-qc.py'


def sach(s):
    s = s.replace('→', '->').replace('⚠️', '[LƯU Ý]').replace('⚠', '[LƯU Ý]')
    s = s.replace('**', '')            # bản cô đọng không dùng bold; phòng khi sót
    s = re.sub(r'[\U0001F300-\U0001FAFF\u2600-\u27BF\uFE0F]', '', s)
    return s


loc = sach(open(os.path.join(D, 'TOM_LOC.md'), encoding='utf-8').read())
tri = sach(open(os.path.join(D, 'TOM_TRI.md'), encoding='utf-8').read())


def tach(s, ten):
    """Trả về (phần đầu + các ngày, phần tổng hợp điểm chờ, phần mã màu) và bỏ khối 'TRỐNG'."""
    i = s.find('### TỔNG HỢP ĐIỂM CHỜ')
    j = s.find('### MÃ MÀU')
    than = s[:i].rstrip()          # gồm '### 0.' + các ngày
    cho = s[i:j].rstrip()
    ma = s[j:].rstrip()
    than = re.sub(r'### (\d+)\. NGÀY 04/10/2026 — TRỐNG\n+Không có mục báo cáo nào trong nguồn\.\n*', '', than)
    return than, cho, ma


than_loc, cho_loc, ma_loc = tach(loc, 'LOC')
than_tri, cho_tri, ma_tri = tach(tri, 'TRI')

BANG = """## PHẦN I — BỨC TRANH CHUNG THEO NGÀY

| Ngày | Lộc QC | Trí QC |
|---|---|---|
| 28/09 | AQ 455 (Hố Nai) đạt, bóng 6-7%; thống kê 50 qui trình tuần 4/9; AQ 002 H không theo qui trình chuẩn | 5 sản phẩm THTH 91 bóng NC mod 1106 30% trắng đục; bóng 40% và 20% đạt; RM Retarder RD không đạt |
| 29/09 | ĐLO 34 lô 2 trên gỗ tràm: độ nhớt 16"72 -> 28"75; chưa có độ bám | 4 mã bóng 30% đều trắng đục; thực nghiệm màu mây 02 A với 2 primer |
| 30/09 | Báo cáo 02-0926: ĐLO 34 không đạt bám từ mốc 1 giờ (2B/5B, 3B/5B); kiểm Tiến Hưng | BT 2507 đạt / BT 0922 không đạt (màu mây 02 A); DLO 34 độ nhớt 13"25 -> 17" |
| 01/10 | Tiến Hưng: OAK 158 C + ASH 07 đạt (tái chế ~50% do phôi cấn móp) | Bóng 30%: lô 18/8 đạt, lô 30/09 trắng đục; DLO 34: phôi 4B/5B, sơn màu 3B/5B |
| 02/10 | Minh Hưng Tiến xưởng mới: MHT 293/239, MHT 68 đạt | Báo cáo 01-1026: bóng NC mod 1106 ở 10/20/30/40% - lô 8/2026 đạt, lô 9/2026 trắng đục; chuyển RD |
| 03/10 | Minh Hưng Tiến xưởng cũ: MHT 126, MHT 72 đạt, dán tem pass | DL 16/19 (Đăng Long): xong qui trình glaze, chưa có kết quả độ bám |
| 04/10 | (trống) | (trống) |
| 05/10 | Thống kê 56 qui trình tuần 1/10; họp BGĐ; kế hoạch tuần 2; AQ 455 sọc đốm | DL 16/19: cả 4 phương án glaze tróc lớp KHÔNG ĐẠT; lót NC 1807: 3 lô không đạt, 1 lô đạt |
| 06/10 | Phú Khang Phát: PKP 98, PKP 27/28 đạt; tháng 10: BT-Chem 26 cont, MTH 20 cont | MP 764 H (Bình Thạnh): xong qui trình, chưa có phép đo |
| 07/10 | MK 12/17 H trên 7 MDF + 2 gỗ (Oak, Beech): xong qui trình | Bình Thạnh: tái chế MP 764 H; MK 12/17 H trên MDF; AQ 455 (2 lót NC x 3 mức bóng); BLACK (Walmart) |
| 08/10 | Mê Kông III: MK 12/17 H, MK 62/63 H - màng sơn đạt, màu còn lệch (primer 7/10; hoàn thiện 8,0 và 8,5/10) | Báo cáo 04-1026 (MP 764 H): lót màu 2 -> bóng hoàn thiện đạt; tái chế song phun bóng liền KHÔNG ĐẠT (vàng) |
| 09/10 | Đo X-Rite MK 12/17 H sau 40 giờ: hoàn thiện dE 0,16 -> 1,37 và 1,61; primer dE 1,25 -> 3,98; 6,96; 5,40 | PU BLACK (Walmart) giao Scansia Pacific: độ bám 5B/5B đạt; độ nhớt lót màu PU 14"71 -> 45"18, sệt sau 4 giờ |
| 10/10 | Thiết Đan: WW #08 White đạt, WW 11/16 (PU) đạt, #81 Demin đang lót màu; mẫu #287 White Wood ký 10/10, có đơn hàng; 7 cont | Dính mặt bộ sơn PU đen giao Scansia: dằn 4h/5h/6h, tải 0,5 kg/cm2 - chưa có kết luận |

"""

PHAN_IV = """## PHẦN IV — NHÓM VẤN ĐỀ LỚN & VIỆC CẦN QUYẾT (gom cả 2 người)

- 1. Bóng NC mod 1106 trắng đục (Trí, 28/09 -> 02/10): lô 8/2026 đạt, lô 9/2026 trắng đục ở cả 10/20/30/40%; đã chuyển R&D, tới 10/10 CHƯA có nguyên nhân gốc.
- 2. Độ bám lót màu ĐLO 34 / DLO 34 (Lộc 28-30/09, Trí 30/09 - 01/10): phôi lót 4B/5B nhưng phun sơn màu hoàn thiện chỉ 3B/5B, tróc cạnh nhiều; chờ R&D điều chỉnh sơn TBS 25 và chốt "pha tới đâu phun tới đó (<= 1 giờ)".
- 3. Glaze DL 16/19 - Đăng Long (Trí 03/10, 05/10): cả 4 phương án công thức glaze tróc lớp KHÔNG ĐẠT, kết luận do sản phẩm mặt cong; chờ phương án điều chỉnh gấp của R&D.
- 4. Lót NC 1807 đóng rắn không đạt (Trí 05/10): 1 lô đạt (04/09), 3 lô không đạt (17/09, 26/09, 30/09) - cháy màng sơn khi lau glaze màu và dung môi PE; chờ chỉ đạo xử lý hàng đã giao.
- 5. MP 764 H - Minh Phát 2 (Trí 06/10 -> 08/10): báo cáo 04-1026 - lót màu 2 rồi phun bóng hoàn thiện đạt, nhưng tái chế song phun bóng liền KHÔNG ĐẠT (màu bị vàng) ở cả 4 cách kiểm; đề nghị cho 5% lót màu 2 vào bóng trong; CHƯA mở hồ sơ KPH.
- 6. MK 12/17 H - độ đồng nhất màu (Lộc 07/10 -> 09/10, Trí 07/10 -> 09/10): hoàn thiện dE 0,16 -> 1,37 (MDF) và 1,61 so với gỗ thông; primer dE 1,25 -> 3,98 (MDF), 6,96 (gỗ thông) và 5,40 (Beech); chưa chốt định mức primer khi phun 2 path; việc "đo L*a*b* bằng máy thay vì chấm qua ảnh" đã làm xong ngày 09/10.
- 7. AQ 455 (Lộc 28/09, 05/10; Trí 07/10 -> 10/10): màu đen có sọc đốm chưa có MSSX/lô và vị trí đốm; 4 thẻ màu AQ 455 xem vẫn CHƯA rõ (mốc treo từ 09/10); chưa trả lời số pass bước B1 (1 path hay 4 path).
- 8. Bộ sơn PU BLACK / PU đen giao Scansia (Trí 07/10 -> 10/10): độ bám 5B/5B đạt (báo cáo 01-1026), nhưng độ nhớt lót màu PU tăng rất mạnh (14"71 -> 45"18, sệt sau 4 giờ) - chờ phòng RD về thời gian sống cho phép; ngày 10/10 kiểm DÍNH MẶT ở 3 mốc dằn 4h/5h/6h nhưng CHƯA có kết luận đạt/không đạt và chưa rõ ký hiệu "G.N" trên thanh mẫu.
- 9. Thẻ mẫu / ký khách (Lộc): PKP 186 hệ sơn nước CHƯA có qui trình và thẻ mẫu; thẻ mẫu gốc PKP 98 khách CHƯA ký; AQ 1155 white (Hố Nai 1) chờ nhân lại mẫu; đã nhận 10 mẫu, đang làm 4 mẫu, thiếu người.
- 10. Thiếu số liệu chuẩn (cả 2 người, gần như mọi mục): thiếu nhiệt độ - độ ẩm xưởng và độ ẩm phôi gỗ khi phun/sấy; thiếu số đo độ bóng bằng máy, lực bám, định lượng g/m2; thiếu số sản phẩm bị ảnh hưởng và hướng xử lý.
- 11. Chưa chốt chuẩn đo và cách ghi (cả 2 người): máy đo chuẩn NAKATA (32,6 độ C / 63%; 73-80% RH) hay AB GmbH (40-57%); lệch tên/mã giữa các phiếu (DLO 34 / ĐLO 34; DL 16/19 / ĐLO 16/19; "Nguyễn Anh Trí" / "Nguyễn Ánh Trí"; PC 23 / LC 23; MHT 293 / MHT 239; cứng "PU HXXT" / "Caxt bóng").
- 12. Việc chờ đã đóng trong khoảng: ĐLO 34 lô 2 (kiểm 30/09) đã xử lý; cập nhật qui trình AQ 002 H; nhân thẻ mẫu AQ 1155 white; Trí QC tổng kết chỉ số L*a*b* màu MK 12/17 H (đo máy X-Rite ngày 09/10) - hai mốc chờ còn treo là kết luận cuộc họp sản phẩm không phù hợp và 4 thẻ màu AQ 455.

"""

NGUON = """## PHẦN V — NGUỒN & PHƯƠNG PHÁP

- Nguồn: sổ QC nhân viên Bùi Thiên Lộc (12 mục) và sổ QC nhân viên Nguyễn Anh Trí (12 mục), khoảng 28/09/2026 - 10/10/2026; mỗi mục trong sổ đều ghi rõ nguồn tin Zalo kèm mốc giờ.
- Ngày 04/10/2026 không có mục báo cáo ở CẢ HAI sổ (không phải bỏ sót khi tổng hợp).
- Số liệu trong tài liệu này chép nguyên dạng từ 2 sổ, giữ dấu phẩy thập phân kiểu Việt Nam; chỗ nguồn không nêu thì không bổ sung.
- Kiểm chứng tự động trước khi phát hành: đối chiếu toàn bộ con số trong bản tổng hợp với 2 sổ nguồn - 315 con số đã được rà, không có số nào không tồn tại trong nguồn (2 trường hợp nghi ngờ đã rà lại là dương tính giả: "ĐLO 34 lô thứ 2" và "DLO 34 độ bám ... yếu").
- Tài liệu gồm bản tổng hợp chung (PHẦN I, IV) và phần chi tiết theo từng người (PHẦN II, III) để đối chiếu khi cần.
"""

out = ('# TỔNG HỢP CÔNG VIỆC & KẾT QUẢ KIỂM TRA QC - TRÍ & LỘC (28/09/2026 -> 10/10/2026)\n\n'
       '**Người lập:** trợ lý kỹ thuật (tổng hợp từ 2 sổ QC)\n'
       '**Nguồn:** sổ Locqc.md (Bùi Thiên Lộc) + sổ Tri qc.md (Nguyễn Anh Trí) - 12 mục mỗi sổ\n'
       '**Ngày lập:** 12/10/2026  ·  **Ngày trống:** 04/10/2026 (cả 2 sổ đều không có mục)\n\n'
       + BANG
       + '## PHẦN II — LỘC QC (BÙI THIÊN LỘC) - CHI TIẾT THEO NGÀY\n\n' + than_loc + '\n\n' + cho_loc + '\n\n' + ma_loc + '\n\n'
       + '## PHẦN III — TRÍ QC (NGUYỄN ANH TRÍ) - CHI TIẾT THEO NGÀY\n\n' + than_tri + '\n\n' + cho_tri + '\n\n' + ma_tri + '\n\n'
       + PHAN_IV + NGUON)

open(MD, 'w', encoding='utf-8', newline='').write(out)
print('  gộp: %d ký tự | %d dòng' % (len(out), out.count('\n') + 1))
r = subprocess.run([sys.executable, MD2DOCX, 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' % (
    os.path.getsize(DOCX), len(d.paragraphs), len(d.tables),
    len([n for n in z.namelist() if n.startswith('word/media/')]), toan.count('**')))
emo = re.findall(r'[\U0001F300-\U0001FAFF\u2600-\u27BF\uFE0F]', toan)
print('  emoji còn:', len(emo), '| "thieu anh":', toan.count('thieu anh'), '| có PHẦN I..V:', all(('PHẦN %s' % x) in toan for x in 'I II III IV V'.split()))
