# -*- coding: utf-8 -*-
"""Dựng HTML báo cáo tổng hợp QC 2 tuần (Lộc + Trí, 26/09–09/10/2026) → in PDF bằng Chrome headless.
Nguồn: _trich_xuat_2tuan.json (22 mốc). Ảnh copy + co về img/ (ASCII)."""
import json, os, re, shutil, subprocess, sys
from PIL import Image

GOC = r'C:\Claw 2\QC'
DICH = os.path.join(GOC, 'BAOCAOTONGHOP', 'QC_2tuan_0910')
IMG = os.path.join(DICH, 'img')
os.makedirs(IMG, exist_ok=True)
ra = json.load(open(os.path.join(DICH, '_trich_xuat_2tuan.json'), encoding='utf-8'))

def anh_cua(nguoi, ngay, chua):
    for e in ra:
        if e['nguoi'] == nguoi and e['ngay'] == ngay:
            for a in e['anh']:
                if chua in a:
                    return a
    return None

CHON = [  # (người, ngày, phần tên file chứa, chú thích)
    ('Trí', '28/09/2026', 'thanhphoi_bong30_trangduc', 'Thanh phôi gỗ phun bóng NC MOD 1106 30 % cho màu THTH 91 — màng sơn trắng đục (28/09/2026).'),
    ('Trí', '01/10/2026', 'bong30_trang-duc_0110', 'Kéo song song trên CÙNG tấm phôi gỗ cao su: lô bóng cũ 18/08 (màng trong, đạt) và lô mới sản xuất 30/09 (trắng đục, không đạt) — 01/10/2026.'),
    ('Trí', '02/10/2026', 'bangketqua_10-20-40', 'Bảng kết quả kiểm tra bóng NC mod 1106 ở 4 cấp độ 10 % · 20 % · 30 % · 40 % theo từng mã số sản xuất — 02/10/2026.'),
    ('Trí', '05/10/2026', 'DL1619_caro-troc-lop', 'Ô cắt ca-rô thẻ mẫu màu DL 16/19 (Đăng Long): lớp glaze TRÓC LỚP — không đạt (05/10/2026).'),
    ('Trí', '05/10/2026', 'lot-NC-1807_the-mau-4lo', 'Thẻ mẫu 4 lô Lót NC 1807 sau khi lau glaze màu: lô 04/09 đạt, 3 lô 17/09 · 26/09 · 30/09 màng sơn bị rút — không đạt (05/10/2026).'),
    ('Trí', '30/09/2026', 'primer_BT0922_khongdat', 'Phôi màu mây 02 A dùng primer BT 0922 — độ bám KHÔNG ĐẠT (đối chứng: primer BT 2507 đạt) — 30/09/2026.'),
    ('Lộc', '29/09/2026', 'phoi_go_tram_5moc', '5 phôi gỗ tràm phun Lót màu ĐLO 34 theo 5 mốc thời gian sống của hỗn hợp (mới pha 16"72 → sau 4 giờ 28"15) — 29/09/2026.'),
    ('Lộc', '28/09/2026', 'aq455_caro_giang_bangkeo', 'Kiểm tra độ bám dính màu AQ 455 (cắt ca-rô, giật băng keo) sau khi điều chỉnh lót NC PC 23 — ĐẠT, màng sơn không đốm (28/09/2026).'),
    ('Lộc', '07/10/2026', '7-thanh-mau-nen-MDF', 'Hiện trường 7 thanh nền vật liệu (MDF + gỗ) kiểm tra màu MK 12/17 H tại xưởng — 07/10/2026.'),
    ('Trí', '06/10/2026', 'MP-764-H_sau-boc-che', 'Thẻ mẫu màu MP 764 H sau khi bóc chế đối chứng, kiểm tra tại Công ty Bình Thạnh — 06/10/2026.'),
    ('Lộc', '08/10/2026', '7-panel-nen-phoi', '7 panel nền phôi (MDF + gỗ thông + gỗ Beech) kiểm tra màu MK 12/17 H tại Công ty Mê Kông III — 08/10/2026.'),
    ('Lộc', '08/10/2026', 'mat-ban-louis-thu-hoa-chat', 'Mặt bàn LOUIS thử chỉ tiêu kháng hoá chất (dải băng keo ghi tên chất + mốc giờ) tại Mê Kông III — 08/10/2026.'),
]
ds_anh = []
for i, (nguoi, ngay, chua, chu) in enumerate(CHON, 1):
    a = anh_cua(nguoi, ngay, chua)
    if not a:
        print('THIẾU ẢNH:', nguoi, ngay, chua); continue
    nguon = os.path.join(GOC, a.replace('/', os.sep))
    ten = 'anh%02d.jpg' % i
    try:
        im = Image.open(nguon).convert('RGB')
        if im.width > 1100:
            im = im.resize((1100, round(im.height * 1100 / im.width)), Image.LANCZOS)
        im.save(os.path.join(IMG, ten), 'JPEG', quality=82, optimize=True)
        ds_anh.append({'ten': ten, 'chu': chu, 'rong': im.width, 'cao': im.height})
    except Exception as e:
        print('LỖI ẢNH', nguon, e)
print('ảnh dùng:', len(ds_anh), '| dung lượng img/:', round(sum(os.path.getsize(os.path.join(IMG, f)) for f in os.listdir(IMG)) / 1e6, 2), 'MB')

# ------------------------------------------------------------------ nội dung
TT = {'dat': ('ĐẠT', 'dat'), 'khong': ('KHÔNG ĐẠT', 'khong'), 'dang': ('ĐANG XỬ LÝ', 'dang'), 'theo': ('THEO DÕI', 'theo')}
HANG = [
    ('26/09', 'Lộc', 'Hố Nai (chi tiết băng tầng)', 'AQ 1190 · AQ 455', 'AQ 1190 test hoá chất 6 chỉ tiêu (dầu ăn, cà phê, nước tương, tương ớt, nước nóng, nước lạnh) <b>đạt</b>. AQ 455 bị đốm → thử điều chỉnh lót NC PC 23: giảm độ nhớt 17"78 → 13"54 và 1 → 2 path. Kèm Báo cáo thống kê quy trình tuần 4/9 (50 quy trình).', 'dang'),
    ('26/09', 'Trí', 'Thành Thắng (Xưởng 2 &amp; 4)', 'THTH 91 · bóng NC MOD 1106 30 %', 'Số liệu nhiệt – ẩm: đầu ca 26,7 °C – 80 %; 10:46 xưởng 2 <b>33,4 °C – 71 %</b>; độ ẩm gỗ 12,0 – 15,0 %. Chênh lệch lớn giữa 2 máy đo (máy đen 71 % / máy trắng 40 %).', 'theo'),
    ('28/09', 'Lộc', 'Hố Nai', 'AQ 455', 'Kết quả màng sơn <b>ĐẠT, không đốm</b>; độ bám dính (cắt ca-rô giật băng keo) đạt; <b>độ bóng 6 – 7 %</b> (yêu cầu 5 %±3 %). Báo cáo kiểm tra số 01-0926 đã có kết quả.', 'dat'),
    ('28/09', 'Trí', 'Thành Thắng', 'THTH 91 · bóng 30 %', '5 sản phẩm phun bóng 30 % <b>đều bị trắng đục</b>; hàng chạy bóng 40 % + 20 % màng sơn trong, đạt.', 'khong'),
    ('29/09', 'Lộc', 'Đăng Long', 'Lót màu ĐLO 34 (lô 2)', 'Phun 5 phôi gỗ tràm theo 5 mốc thời gian sống của hỗn hợp lót (16"72 → 28"15), sơn màu ĐLO 34 H 10 %; chờ đọc độ bám sau hơn 20 giờ.', 'dang'),
    ('29/09', 'Trí', 'Thành Thắng · mây 02 A', 'bóng NC mod 1106 30 % (4 MSSX)', 'Cả 4 mã lô 5070926 · 2100926 · 2150926 · 1170926 đều <b>trắng đục</b> trên cả gỗ cao su và gỗ OAK.', 'khong'),
    ('30/09', 'Lộc', 'Đăng Long · Tiến Hưng', 'ĐLO 34 · BlueRock Oak', 'Báo cáo số 02-0926: hỗn hợp lót <b>mới pha đạt</b>; <b>từ mốc 1 giờ trở đi KHÔNG ĐẠT</b> (độ nhớt tăng dần). Kèm thẻ mẫu BlueRock gỗ Oak bóng 5 % màu Natural.', 'khong'),
    ('30/09', 'Trí', 'Thịnh Việt (mây) · Đăng Long', 'Mây 02 A · ĐLO 34', 'Độ bám 2 loại primer <b>tách rõ</b>: <b>BT 2507 đạt</b> · <b>BT 0922 không đạt</b>. Lô ĐLO 34 kiểm độ bám theo thời gian pha, độ nhớt chỉnh 13 – 14 giây.', 'khong'),
    ('01/10', 'Lộc', 'Tiến Hưng', 'OAK 158 C · ASH 07', 'Chuyền màu OAK 158 C (hệ lót NC T2012 · bóng NC NY 5 %) và mặt bàn ASH 07: màu sắc – màng sơn <b>đạt</b>. BT-Chem chiếm 95 % đơn hàng; sản phẩm phải tái chế do phôi cấn móp ~50 %.', 'dat'),
    ('01/10', 'Trí', 'Thành Thắng · Đăng Long', 'bóng NC MOD 1106 30 % · ĐLO 34', '<b>Kéo song song</b> trên cùng tấm phôi gỗ cao su: lô cũ 18/08 màng trong (<b>đạt</b>) · lô mới sản xuất 30/09 trắng đục (<b>không đạt</b>) ⇒ lỗi nằm ở lô bóng 30 % đang sản xuất.', 'khong'),
    ('02/10', 'Lộc', 'Minh Hưng Tiến (xưởng mới)', 'MHT 293 · MHT 68', 'Kiểm tra theo thẻ công đoạn: chuyền treo màu MHT 293 (Excess) và chuyền trượt MHT 68 (Fxiload) <b>đạt</b>. Quy trình mới (pha phụ gia vào stain) thử đạt nhưng <b>chưa áp dụng</b> sản xuất.', 'dat'),
    ('02/10', 'Trí', 'Bình Thạnh', 'bóng NC mod 1106 4 cấp độ', 'Kéo thước 150 µm: lô sản xuất tháng 8 màng trong (<b>đạt</b>) · lô tháng 9 <b>trắng đục</b>; thống kê đầy đủ MSSX đạt / không đạt theo từng cấp bóng 10 – 40 %.', 'khong'),
    ('03/10', 'Lộc', 'Minh Hưng Tiến (xưởng cũ)', 'MHT 126 · MHT 72', 'Chuyền treo màu MHT 126 (Excess) và khu QC màu MHT 72 (Fxiload): <b>đạt</b> theo thẻ công đoạn. Sản phẩm lợt màu được dặm stain + 10 % bóng trên băng trượt — lưu ý thời gian khô trước đóng gói.', 'dat'),
    ('03/10', 'Trí', 'Bình Thạnh (Đăng Long)', 'DL 16/19', 'Thực hiện xong quy trình pha glaze màu theo phiếu hướng dẫn HD-KT-THMM (Phụ lục 04 · DL 16/19); chờ kết quả độ bám.', 'dang'),
    ('05/10', 'Lộc', 'Nội bộ / kế hoạch tuần', 'Thống kê tuần 1/10', 'Báo cáo thống kê – đánh giá quy trình sản xuất thực tế <b>tuần 1 tháng 10 (56 quy trình)</b>: kỹ thuật xác nhận đạt, chưa thấy bất thường. Kèm biên bản chỉ đạo BGĐ (Hố Nai 1 – AQ 1155 white dùng Primer BT 2507; AQ 455 đen bị sọc đốm chờ báo cáo).', 'dat'),
    ('05/10', 'Trí', 'Bình Thạnh', 'DL 16/19 · Lót NC 1807', '<b>Cả 4 phương án công thức glaze đều TRÓC LỚP — không đạt</b> ⇒ chuyển R&amp;D điều chỉnh. Lót NC 1807 (4 lô): lô 04/09 <b>đạt</b> · 3 lô 17/09 · 26/09 · 30/09 <b>không đạt</b> (màng sơn bị rút khi lau glaze màu + dung môi PE).', 'khong'),
    ('06/10', 'Lộc', 'Phú Khang Phát', 'PKP 98 · PKP 27 · PKP 28', 'Chuyền treo màu PKP 98 và khu bóng hoàn thiện PKP 27 · PKP 28: <b>hoàn thiện đạt</b> (bóng 5 %±3 % và 10 %±5 %). Ghi nhận khu vực QC sửa nguội lỗi bề mặt.', 'dat'),
    ('06/10', 'Trí', 'Bình Thạnh', 'MP 764 H', 'Làm thẻ mẫu màu MP 764 H với <b>lót màu 2 MP 764 H</b> theo quy trình kỹ thuật gửi về (có che đối chứng); chờ kiểm màng sơn phần phun tái chế.', 'dang'),
    ('07/10', 'Lộc', 'Xưởng (Mê Kông)', 'MK 12/17 H', 'Kiểm tra màu MK 12/17 H theo quy trình thực tế trên <b>7 loại MDF + gỗ Oak, Beech</b>; kỹ thuật điều chỉnh thêm <b>5 % past trắng 3012 H (HM)</b> vào primer white. Phiếu mẫu màu kèm theo là mã khác (157 H).', 'dang'),
    ('07/10', 'Trí', 'Nội bộ Bình Thạnh', 'MK 12/17 H · AQ 455 · BLACK (Walmart)', 'Thực hiện xong quy trình MK 12/17 H trên MDF (Mê Kông); màu AQ 455 trên 2 loại lót NC × 3 mức bóng song song; làm chuẩn khối quy trình bộ sơn BLACK (Walmart): nhúng – lót – bóng PU.', 'dang'),
    ('08/10', 'Lộc', 'Mê Kông III · Thiết Đan', 'MK 12/17 H · MK 63 H · TDan #46 · ww #07', 'Màng sơn <b>ĐẠT</b> nhưng <b>còn chênh lệch màu giữa 7 loại nền</b> (7/10 ở primer → 8,0 – 8,5/10 ở hoàn thiện). Mặt bàn LOUIS thử kháng hoá chất 6 chỉ tiêu; 2 chuyền treo tại Thiết Đan hoàn thiện đạt.', 'dat'),
    ('08/10', 'Trí', 'Minh Phát 2', 'MP 764 H (báo cáo số 04-1026)', 'Bóng hoàn thiện <b>màu sắc không thay đổi (đạt)</b> · <b>phun tái chế KHÔNG ĐẠT (màu bị vàng)</b> ⇒ quy trình sản xuất chưa phù hợp, đề nghị cho 5 % lót màu 2 MP 764 H vào bóng trong. Kèm tiếp tục kiểm tra bộ sơn BLACK (Walmart).', 'khong'),
]
VAN_DE = [
    ('1. Bóng NC MOD 1106 30 % (giao Công ty Thành Thắng) — màng sơn trắng đục',
     ['<b>26 – 29/09:</b> các sản phẩm phun bóng 30 % cho màu THTH 91 đều trắng đục; cả 4 mã lô hữu lưu QC (5070926 · 2100926 · 2150926 · 1170926) đều trắng đục trên gỗ cao su và gỗ OAK — trong khi hàng chạy bóng 40 % và 20 % màng sơn trong, đạt.',
      '<b>01/10 — phép kéo song song quyết định:</b> trên <b>cùng một tấm phôi gỗ cao su ghép thanh</b>, kéo song song lô bóng cũ 18/08 (màng trong, đạt) và lô mới sản xuất 30/09 (trắng đục) ⇒ <b>lỗi nằm ở lô bóng 30 % đang sản xuất</b>, không do phôi/môi trường.',
      '<b>02/10:</b> quét 4 cấp độ 10 % · 20 % · 30 % · 40 % bằng phép kéo thước 150 µm → tách rõ danh sách MSSX màng sơn đạt và bị trắng đục theo từng cấp (lô sản xuất tháng 8 màng trong · lô tháng 9 trắng đục).'],
     ['anh01.jpg', 'anh02.jpg', 'anh03.jpg']),
    ('2. Độ bám màu DL 16/19 (Đăng Long) và Lót NC 1807 — tróc lớp, chuyển R&amp;D',
     ['<b>03/10:</b> thực hiện pha glaze màu theo phiếu hướng dẫn HD-KT-THMM (Phụ lục 04 · DL 16/19) tại Bình Thạnh.',
      '<b>05/10: cả 4 phương án công thức glaze đều TRÓC LỚP — không đạt</b> (MDF cắt ca-rô và thẻ sản phẩm dán băng keo giật đều tróc) ⇒ chuyển R&amp;D điều chỉnh gấp.',
      '<b>Lót NC 1807 — 4 lô sản xuất:</b> lô <b>04/09 đạt</b>; 3 lô <b>17/09 · 26/09 · 30/09 không đạt</b>, màng sơn bị rút khi lau glaze màu và dung môi PE cháy màng sơn.'],
     ['anh04.jpg', 'anh05.jpg']),
    ('3. Lót màu ĐLO 34 — độ bám theo thời gian sống của hỗn hợp',
     ['<b>29/09:</b> phun 5 phôi gỗ tràm theo 5 mốc thời gian sống của hỗn hợp lót (mới pha 16"72 → sau 4 giờ 28"15), độ nhớt tăng dần theo thời gian.',
      '<b>30/09 (báo cáo số 02-0926):</b> hỗn hợp <b>mới pha đạt</b>; <b>từ mốc 1 giờ trở đi KHÔNG ĐẠT</b> (độ bám ~2B/5B – 3B/5B). Khuyến nghị: chỉ dùng hỗn hợp trong khoảng thời gian sống ngắn sau khi pha, kiểm soát độ nhớt trước khi phun.'],
     ['anh07.jpg']),
    ('4. Mây 02 A — 2 loại primer tách rõ kết quả',
     ['<b>30/09:</b> quy trình dùng <b>primer BT 2507 → độ bám ĐẠT</b>; quy trình dùng <b>primer BT 0922 → độ bám KHÔNG ĐẠT</b>. Kết quả này tách rõ để chọn primer cho các đơn hàng mây tiếp theo.'],
     ['anh06.jpg']),
    ('5. Màu AQ 455 (Hố Nai) — từ lỗi đốm đến quy trình đạt',
     ['<b>26/09:</b> sản phẩm chi tiết băng tầng bị đốm màu; thử chuyển từ lót NC KH sang <b>Lót NC PC 23</b>, giảm độ nhớt <b>17"78 → 13"54</b> và phun <b>1 → 2 path</b> ở bước 3.',
      '<b>28/09 (báo cáo số 01-0926): màng sơn ĐẠT, không còn đốm</b>; độ bám dính đạt; <b>độ bóng 6 – 7 %</b>.',
      '<b>Còn chờ:</b> Hố Nai – màu AQ 455 (đen) vẫn ghi nhận màng sơn bị <b>sọc đốm</b> trên chuyền, đã giao Trưởng phòng QC báo cáo kết quả và hướng xử lý.'],
     ['anh08.jpg']),
    ('6. Màu MK 12/17 H (Mê Kông) — 7 loại nền, còn chênh màu',
     ['<b>07/10:</b> kiểm màu MK 12/17 H theo quy trình sản xuất thực tế trên <b>7 loại MDF + gỗ Oak, Beech</b>; kỹ thuật điều chỉnh thêm <b>5 % past trắng 3012 H (HM)</b> vào công đoạn primer white.',
      '<b>08/10 (Mê Kông III):</b> màng sơn <b>ĐẠT</b> (láng, phẳng) nhưng còn <b>chênh lệch màu giữa các nền</b>: 7/10 điểm ở công đoạn primer → 8,0 – 8,5/10 ở công đoạn hoàn thiện. Đề nghị đo <b>L*a*b* từng nền bằng máy quang phổ</b> (kèm DFT, định lượng g/m²) thay vì đánh giá qua ảnh.',
      'Cùng ngày ghi nhận: mặt bàn <b>LOUIS</b> đang thử kháng hoá chất 6 chỉ tiêu (nước, nước nóng, xà bông, cà phê, rượu, dầu ăn) — cần mốc đọc kết quả sau 24 giờ; xưởng <b>Thiết Đan</b> 2 chuyền treo hoàn thiện đạt (TDan #46 Black hệ NC Mod · ww #07 PU).'],
     ['anh09.jpg', 'anh11.jpg', 'anh12.jpg']),
    ('7. Màu MP 764 H (Minh Phát 2) — bóng hoàn thiện đạt, phun tái chế không đạt',
     ['<b>06/10:</b> làm thẻ mẫu với <b>lót màu 2 MP 764 H</b> theo quy trình kỹ thuật gửi về, có che đối chứng.',
      '<b>08/10 (báo cáo số 04-1026, MSSX 1070926):</b> bóng hoàn thiện <b>màu sắc không thay đổi — đạt</b> (cả 4 quy trình); <b>phun tái chế KHÔNG ĐẠT — màu bị vàng</b>.',
      '<b>Kết luận của QC:</b> quy trình sản xuất <b>chưa phù hợp</b>; đề nghị cho <b>5 % lót màu 2 MP 764 H vào bóng trong</b>.'],
     ['anh10.jpg']),
    ('8. Điều kiện môi trường xưởng &amp; thiết bị đo',
     ['<b>26/09 (Thành Thắng, Xưởng 2 &amp; 4):</b> đầu ca 26,7 °C – 80 %; 10:46 – 11:09 xưởng 2 <b>33,4 °C – 71 %</b>; giữa ca 28,5 °C – 73 %; chuyền treo 31,9 °C – 40 %. Độ ẩm gỗ (MC) đo trên phôi: <b>12,0 – 15,0 %</b>; nhiệt độ bề mặt phôi 30,7 – 38,3 °C.',
      '<b>Chênh lệch giữa 2 máy đo</b> tại cùng thời điểm (máy đen Nakata NJ-2099TH vs máy trắng AB GmbH): ví dụ 71 % so với 40 % lúc 10:46 – 11:09 ⇒ QC đã đưa máy còn hiệu chuẩn sang kiểm tra đối chứng; cần thống nhất máy/góc đo trước khi kết luận.',
      '<b>Khuyến nghị in trên phiếu quy trình:</b> ngày nắng nóng (≥ 35 °C) pha thêm 3 → 7 % chất chậm khô Retarder vào hỗn hợp lót/bóng; ngày mưa ẩm tăng nhiệt lò sấy hoặc kéo dài thời gian hong phơi trước khi đóng gói.'],
     []),
]
CHUAN_BI = [
    ('ĐO số lượng thay vì đánh giá bằng ảnh với các phép đo màu/độ bóng', 'Màu MK 12/17 H (7 loại nền), AQ 455, các lô bóng — đo L*a*b* bằng máy quang phổ đúng góc đo, kèm DFT và định lượng g/m² thay vì chấm điểm qua ảnh.'),
    ('Mốc đọc kết quả chưa chốt', 'DL 16/19: 4 phương án glaze không đạt — chờ R&amp;D điều chỉnh. Mặt bàn LOUIS: mốc đọc kháng hoá chất sau 24 giờ + tiêu chí đạt. Bộ sơn BLACK (Walmart): hạng mục độ bám/độ nhớt/thời gian khô.'),
    ('Việc đã giao nhưng chưa có kết quả', 'Hố Nai — màu AQ 455 (đen) sọc đốm: chờ báo cáo kết quả kiểm tra và hướng xử lý của Trưởng phòng QC. Quy trình mới (pha phụ gia vào stain) tại Minh Hưng Tiến: thử đạt nhưng chưa áp dụng sản xuất.'),
    ('Con số chưa thống nhất giữa các nguồn', 'Tỉ lệ lỗi tróc sơn vụ Đăng Long (30 % so với 70 %) vẫn chưa thống nhất giữa các hồ sơ. Hệ số khách AQ 455: cùng màu nhưng có thay đổi tỉ lệ (15 % → 12 %) và bóng 20/40 % → 10 % cần xác nhận ai chỉ đạo.'),
    ('Thiết bị / hiệu chuẩn', 'Hai máy đo nhiệt – ẩm cho kết quả lệch lớn tại cùng thời điểm; máy trắng AB GmbH có tem hiệu chuẩn 14/12/2023 — cần rà hạn hiệu chuẩn của các máy đang dùng.'),
]

def badge(k):
    ten, cls = TT[k]
    return '<span class="bd %s">%s</span>' % (cls, ten)

html = ['''<!doctype html><html lang="vi"><meta charset="utf-8"><title>BÁO CÁO TỔNG HỢP QC 2 TUẦN — 26/09–09/10/2026</title>
<style>
@page { size: A4; margin: 13mm 12mm 15mm 12mm }
*{box-sizing:border-box}
body{font:10.5pt/1.45 'Segoe UI',Arial,sans-serif;color:#14212b;margin:0}
h1{font-size:17pt;text-align:center;margin:0 0 2mm}
h2{font-size:12.5pt;color:#0b3d2c;border-bottom:2px solid #0b3d2c;padding-bottom:1mm;margin:7mm 0 3mm;page-break-after:avoid}
h3{font-size:11pt;margin:4mm 0 1.5mm;page-break-after:avoid}
.head{border:1px solid #b9c6cf;border-radius:3mm;padding:4mm;text-align:center;margin-bottom:4mm}
.head .cty{font-weight:700;font-size:12pt;letter-spacing:.5px}
.head .sub{font-size:9.5pt;color:#3d4b57}
table{width:100%;border-collapse:collapse;margin:2mm 0 3mm;font-size:9pt}
th,td{border:1px solid #b9c6cf;padding:1.4mm 1.8mm;vertical-align:top;text-align:left}
th{background:#eef1f4;font-weight:700}
tr{break-inside:avoid}
.bd{display:inline-block;padding:.4mm 1.6mm;border-radius:2mm;font-size:7.5pt;font-weight:700;white-space:nowrap}
.dat{background:#d6f4e0;color:#0b5c2e}.khong{background:#ffd9d9;color:#8a1414}.dang{background:#fff3cd;color:#7a5b00}.theo{background:#e6eaee;color:#37474f}
.box{border:1px solid #b9c6cf;border-left:3px solid #0b3d2c;background:#f7fafa;border-radius:2mm;padding:2.5mm 3mm;margin:2mm 0 3mm;break-inside:avoid}
ul{margin:1mm 0 2mm 5mm;padding:0}li{margin:.6mm 0}
figure{margin:2mm 0 4mm;break-inside:avoid;page-break-inside:avoid;text-align:center}
figure img{width:100%;max-height:105mm;object-fit:contain;border:1px solid #cfd8dd;border-radius:2mm}
figure.doc img{max-height:78mm}
figcaption{font-size:8.5pt;color:#3d4b57;margin-top:1mm;text-align:left}
.two{display:flex;gap:3mm;break-inside:avoid;page-break-inside:avoid}
.two figure{flex:1;margin:0}
.two figure img{width:100%;max-height:80mm;object-fit:contain}
.foot{margin-top:5mm;font-size:8.5pt;color:#5d6b7a;border-top:1px solid #cfd8dd;padding-top:2mm}
.sig{margin-top:6mm;width:100%;font-size:9.5pt}
.sig td{border:0;text-align:center;padding-top:9mm}
</style>
<div class="head">
<div class="cty">CÔNG TY TNHH BT-CHEM</div>
<div class="sub">PHÒNG KỸ THUẬT · PHÒNG QC</div>
<h1>BÁO CÁO TỔNG HỢP KẾT QUẢ KIỂM TRA CHẤT LƯỢNG</h1>
<div class="sub"><b>Hai tuần: 26/09/2026 – 09/10/2026</b><br>
Người lập báo cáo gốc: <b>Bùi Thiên Lộc</b> (QC) · <b>Nguyễn Ánh Trí</b> (QC) · Ngày lập bản tổng hợp: 09/10/2026<br>
Kính gửi: Ban Giám đốc · Phòng Kỹ thuật · Phòng QC</div>
</div>
<h2>I. KHÁI QUÁT</h2>
<table>
<tr><th style="width:34%">Nội dung</th><th>Số liệu</th></tr>
<tr><td>Số mốc báo cáo trong kỳ</td><td><b>22 mốc</b> — Lộc: 11 mốc · Trí: 11 mốc (đủ cả 2 tuần, không thiếu ngày làm việc nào)</td></tr>
<tr><td>Khách hàng / nhà máy có mặt trong báo cáo</td><td>Hố Nai (Hố Nai 1) · Thành Thắng · Đăng Long · Tiến Hưng · Minh Hưng Tiến (xưởng mới &amp; cũ) · Phú Khang Phát · Mê Kông (Mê Kông III) · Minh Phát 2 · Thịnh Việt (mây) · Thiết Đan · Bình Thạnh (kiểm tra nội bộ)</td></tr>
<tr><td>Mốc có kết quả <b>KHÔNG ĐẠT</b></td><td><b>7 mốc</b> — tập trung vào 3 vấn đề: bóng NC MOD 1106 30 % trắng đục · độ bám glaze DL 16/19 &amp; Lót NC 1807 · phun tái chế màu MP 764 H</td></tr>
<tr><td>Mốc đang xử lý / chờ kết quả</td><td>6 mốc (chờ độ bám, chờ R&amp;D, chờ đo màu bằng máy)</td></tr>
<tr><td>Ảnh minh chứng kèm theo trong kỳ</td><td>68 ảnh trong sổ QC của 2 nhân viên (bản tổng hợp này chọn 12 ảnh trọng yếu)</td></tr>
<tr><td>Kết quả tổng quát</td><td>Các vấn đề lặp lại đều đã khoanh vùng được: <b>theo lô bóng/lô lót</b> (chứ không theo nhà máy hay theo phôi), và <b>theo thời gian sống của hỗn hợp lót màu</b>. Các chuyền kiểm tra tại khách (Tiến Hưng, Minh Hưng Tiến, Phú Khang Phát) đều đạt theo thẻ công đoạn.</td></tr>
</table>
<h2>II. BẢNG TÓM TẮT 22 MỐC BÁO CÁO</h2>
<table>
<tr><th style="width:8%">Ngày</th><th style="width:6%">Người</th><th style="width:17%">Khách hàng / xưởng</th><th style="width:16%">Mã màu – sản phẩm</th><th>Nội dung kiểm tra &amp; kết quả chính</th><th style="width:11%">Trạng thái</th></tr>''']
for ngay, nguoi, khach, ma, nd, tt in HANG:
    html.append('<tr><td><b>%s</b></td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>' % (ngay, nguoi, khach, ma, nd, badge(tt)))
html.append('</table>')

html.append('<h2>III. CÁC VẤN ĐỀ KỸ THUẬT CHÍNH TRONG 2 TUẦN</h2>')
for tieu_de, y, anh in VAN_DE:
    html.append('<h3>%s</h3><ul>%s</ul>' % (tieu_de, ''.join('<li>%s</li>' % x for x in y)))
    if anh:
        # ảnh NGANG (rộng/cao > 1,25) cho hiển thị full chiều rộng; ảnh đứng/vuông ghép cặp
        def lay(t):
            return next((d for d in ds_anh if d['ten'] == t), None)
        nhom, i = [], 0
        while i < len(anh):
            a = lay(anh[i])
            if not a:
                i += 1; continue
            if a['cao'] and a['rong'] / a['cao'] <= 1.25 and i + 1 < len(anh):
                b = lay(anh[i + 1])
                if b and b['cao'] and b['rong'] / b['cao'] <= 1.25:
                    nhom.append([a, b]); i += 2; continue
            nhom.append([a]); i += 1
        for g in nhom:
            if len(g) == 2:
                html.append('<div class="two">' + ''.join(
                    '<figure><img src="img/%s"><figcaption>%s</figcaption></figure>' % (x['ten'], x['chu']) for x in g) + '</div>')
            else:
                x = g[0]
                html.append('<figure><img src="img/%s"><figcaption>%s</figcaption></figure>' % (x['ten'], x['chu']))

html.append('<h2>IV. TỔNG HỢP THEO TỪNG NHÂN VIÊN</h2>')
for nguoi, mo_ta in (('Lộc', 'Bùi Thiên Lộc — kiểm tra tại khách hàng, thống kê &amp; đánh giá quy trình sản xuất thực tế'),
                     ('Trí', 'Nguyễn Ánh Trí — kiểm tra nội bộ tại Bình Thạnh, thẻ mẫu, lô bóng/lô lót, primer')):
    html.append('<h3>%s (%s)</h3><table><tr><th style="width:9%%">Ngày</th><th style="width:22%%">Khách / nội dung</th><th>Việc &amp; kết quả</th><th style="width:11%%">Trạng thái</th></tr>' % (nguoi, mo_ta))
    for ngay, n2, khach, ma, nd, tt in HANG:
        if n2 == nguoi:
            html.append('<tr><td><b>%s</b></td><td>%s</td><td>%s</td><td>%s</td></tr>' % (ngay, khach, nd, badge(tt)))
    html.append('</table>')

html.append('<h2>V. ĐIỂM CẦN XÁC NHẬN / VIỆC CẦN LÀM TIẾP</h2><table><tr><th style="width:34%">Nhóm việc</th><th>Diễn giải</th></tr>')
for a, b in CHUAN_BI:
    html.append('<tr><td><b>%s</b></td><td>%s</td></tr>' % (a, b))
html.append('</table>')

html.append('''<h2>VI. NGUỒN DỮ LIỆU</h2>
<table><tr><th style="width:34%">Nguồn</th><th>Phạm vi sử dụng</th></tr>
<tr><td><code>Locqc.md</code> — sổ báo cáo QC của Bùi Thiên Lộc</td><td>11 mốc từ 26/09/2026 đến 08/10/2026</td></tr>
<tr><td><code>Tri qc.md</code> — sổ báo cáo QC của Nguyễn Ánh Trí</td><td>11 mốc từ 26/09/2026 đến 08/10/2026</td></tr>
<tr><td>Ảnh minh chứng</td><td>12 ảnh trọng yếu (thư mục <code>img/</code>), lấy từ 68 ảnh trong 2 sổ QC; giữ nguyên chú thích theo nguồn</td></tr>
<tr><td>Nguyên tắc biên soạn</td><td>Giữ nguyên văn số liệu, mã màu, mã số sản xuất của báo cáo gốc; các điểm chưa thống nhất giữa hồ sơ được nêu ở mục V, không tự chọn một số</td></tr>
</table>
<table class="sig"><tr><td style="width:50%"><b>Người tổng hợp</b><br><br><br>……………………………………</td>
<td style="width:50%"><b>Xác nhận Phòng QC</b><br><br><br>……………………………………</td></tr></table>
<div class="foot">Bản tổng hợp lập ngày 09/10/2026 từ sổ báo cáo QC hằng ngày của 2 nhân viên, phạm vi 26/09/2026 – 09/10/2026.</div>
</html>''')

duong = os.path.join(DICH, 'BAO_CAO_TONG_HOP_QC_2TUAN_2609_0910.html')
open(duong, 'w', encoding='utf-8').write(''.join(html))
print('HTML:', duong, os.path.getsize(duong), 'B')

# ------------------------------------------------------------------ in PDF
chrome = None
for p in (r'C:/Program Files/Google/Chrome/Application/chrome.exe',
          r'C:/Program Files (x86)/Google/Chrome/Application/chrome.exe',
          os.path.expandvars(r'%LOCALAPPDATA%/Google/Chrome/Application/chrome.exe')):
    if os.path.exists(p):
        chrome = p; break
print('Chrome:', chrome)
pdf = os.path.join(DICH, 'BAO_CAO_TONG_HOP_QC_2TUAN_2609_0910.pdf')
subprocess.run([chrome, '--headless=new', '--disable-gpu', '--no-sandbox',
                '--user-data-dir=' + os.path.join(DICH, 'chrome_tmp'), '--virtual-time-budget=8000',
                '--print-to-pdf=' + pdf, '--no-pdf-header-footer',
                'file:///' + duong.replace('\\', '/')], capture_output=True, timeout=180)
print('PDF:', pdf, os.path.getsize(pdf) if os.path.exists(pdf) else 'KHÔNG TẠO ĐƯỢC', 'B')
