# -*- coding: utf-8 -*-
"""Bước 5-6: thêm khối vụ TTH270 vào portal KPH + cập nhật portal_map.json + số vụ 37→38."""
import os, io, re, json, datetime

CL2 = r"C:\Claw 2\Bao cao - Hanh chinh\BAOCAOTONGHOP\HTML\KPH_TongHop_0508"
P = os.path.join(CL2, "index.html")
MAP = r"C:\Claw\Khieu Nai KHach Hang\portal_map.json"
h = io.open(P, encoding="utf-8", newline="").read()
print("trước: khối", h.count('class="inc"'), "| số vụ ghi", re.findall(r"(\d+)\s*vụ việc", h))
print("có class proc trong CSS:", ".proc" in h, "| có .callout:", ".callout" in h)

BLOCK = """    <!-- ============ 38. tienhung-tth270 ============ -->
    <div class="inc" id="tienhung-tth270" data-st="watch">
      <div class="inc-head"><span class="no">38</span><div class="tt"><h3>Tiến Hưng — Màu sơn TTH270 (Wilmslow White) bị vàng/chạy màu giữa các lô — khách GF + MK khiếu nại</h3><span>Biên bản làm việc 01-2026/BB-LV-BT ngày 16/09/2026 · Phòng Kỹ thuật BT họp cùng nhà máy 09h00 · theo dõi</span></div><span class="chev">▾</span></div>
      <div class="inc-body">
        <div class="kv">
          <div><b>Nhà máy:</b> Tiến Hưng</div>
          <div><b>Sản phẩm/màu:</b> Màu sơn TTH270 (Wilmslow White) — FBO-WD03PKLR/FMT, chi tiết tủ/giường; khách cuối GF + MK</div>
        </div>
        <div class="sub">Phản ánh: màu sơn bị chạy màu/không đúng màu khách đã ký lưu; màu TTH270 bị vàng, khác màu khi khách mở sản phẩm so với lúc còn ở kho — mail Hữu Thoa (P.ĐHSX Tiến Hưng) 16/09/2026 17:58 · Họp 09h00–09h45 ngày 16/09/2026 tại VP Tiến Hưng</div>
        <div class="txt"><ul>
          <li><b>I. Nội dung khiếu nại:</b> khách/QC-KH của nhà máy phản ánh màu sơn bị chạy màu, không đúng màu khách đã ký lưu. Đặc biệt màu sơn TTH270 bị khách <b>GF và MK</b> khiếu nại: màu bị vàng, khác màu khi khách mở sản phẩm so với lúc đang ở kho.</li>
          <li><b>II. Kiểm tra &amp; kết quả:</b> nhà máy mời P.Kỹ thuật Bình Thạnh cùng kiểm tra quy trình sơn và <b>toàn bộ bảng màu ký lưu năm 2025</b>. Kết quả: <b>một số bảng màu ký lưu đã bị khác màu do bị dơ, cầm tay nhiều lần, bảo quản và vệ sinh chưa tốt</b>; nhà máy và kỹ thuật sơn đã <b>lấy chính bảng màu ký lưu bị khác màu đó để kiểm tra màu cho hàng sản xuất đại trà</b>.</li>
          <li><b>III. Thống nhất xử lý &amp; phòng ngừa (KP–PN):</b>
            <ul>
              <li>Các bảng màu bị khác màu sẽ được lựa ra và <b>hủy</b>, không áp dụng cho sản xuất đại trà.</li>
              <li>Mỗi lô màu sơn trắng (pigment) khi BT giao: trước khi sơn đại trà, <b>Kỹ thuật BT sơn mẫu 1 bảng màu A4 so với bảng màu gold ký lưu</b>, Kỹ thuật sơn BT &amp; TH cùng ký, ghi rõ ngày tháng, <b>lưu tại VP của BQĐ-XS</b>.</li>
              <li>Bảng màu ký lưu mỗi đợt: <b>10 tấm/lần — lưu gold 3 tấm</b>, còn lại làm bảng màu áp dụng sản xuất đại trà; cấp/mượn theo quy định của nhà máy.</li>
              <li>Nhà máy trao đổi với khách để <b>mượn lại chi tiết trên lô đang khiếu nại và lô trước khi bị khiếu nại</b> (khách đang lưu kho) để so lại với bảng màu đang lưu tại nhà máy; có thể làm lại bảng màu gửi khách ký lưu lại.</li>
              <li>Tuân thủ việc nhận bảng màu dựa trên thông số đo <b>∆E &lt; 0,5</b>, ghi thông số đo trên bảng màu gold seal.</li>
              <li>Sử dụng bảng màu gold seal &amp; bảng màu sản xuất theo thứ tự → <b>so lại màu/3 lần sản xuất</b>; nhà máy làm bảng màu lưu/cont hoặc lô sản xuất (QC và QĐ-XS ký).</li>
              <li>Chi phí giải quyết khiếu nại: nếu GF gửi nhà máy thì <b>nhà máy gửi BT để BT hỗ trợ giải quyết</b>.</li>
              <li>Sau khi cùng xem lại lô hàng màu TTH270 xuất cho <b>cụm cont GF 16~20</b> → <b>nhà máy quyết định cho xuất hàng</b>.</li>
            </ul>
          </li>
          <li><b>IV. Đề nghị của nhà máy:</b> BT hỗ trợ cung cấp <b>máy đo màu hiệu SPECTRO</b> để kiểm soát tốt hơn các màu sơn/màu lau (pigment) tại nhà máy.</li>
          <li><b>V. Quy trình do nhà máy soạn (bản nháp 16/09/2026, chờ BT góp ý trước khi ban hành):</b> Bước 1 — nhà máy báo BT chuẩn bị nguyên liệu sơn pigment, nhà máy chuẩn bị nguyên liệu làm bảng màu; Bước 2 — BT giao sơn pigment cho nhà máy; Bước 3 — thông báo mượn bảng màu gold seal, Kỹ thuật BT sơn mẫu và cùng BQĐ-XS so với gold seal: đạt thì hai bên ký lưu và áp dụng cho sản xuất đại trà (bảng lưu VP BQĐ-XS), không đạt thì làm lại; so lại các bảng màu/3 lô với nhau và với gold seal; Bước 4 — nhà máy ký và lưu bảng màu theo hàng sản xuất đại trà. <i>Ghi chú: kiểm soát &amp; mượn trả bảng màu theo quy định; <b>hủy bảng màu nếu sau 3 lần sản xuất bị chạy/phát sinh khác</b>.</i></li>
        </ul></div>
        <div class="gallery">
          <figure class="fig"><img src="assets/images/tienhung_tth270_gf_kho_1609.png" alt="Khách GF kiểm tra màu tại kho" loading="lazy" style="height:auto;object-fit:contain"><figcaption>Khách GF kiểm tra màu tại kho: 2 chi tiết trắng — một trắng tinh, một ngả kem/vàng</figcaption></figure>
          <figure class="fig"><img src="assets/images/tienhung_tth270_mail_gf_2101.png" alt="Mail khiếu nại thị trường 21/01/2026" loading="lazy" style="height:auto;object-fit:contain"><figcaption>Mail khiếu nại 21/01/2026 — range Wilmslow White (TTH-270): swatch không khớp màu sản phẩm</figcaption></figure>
          <figure class="fig"><img src="assets/images/tienhung_tth270_qc_th_1609.png" alt="QC nhà máy áp bảng mẫu chuẩn" loading="lazy" style="height:auto;object-fit:contain"><figcaption>QC nhà máy áp bảng mẫu chuẩn vào tủ: sản phẩm ngả vàng/kem hơn mẫu</figcaption></figure>
        </div>
        <p class="src">Biên bản làm việc số 01-2026/BB-LV-BT ngày 16/09/2026 (mail Hữu Thoa — P.ĐHSX Tiến Hưng 16/09/2026 17:58) + mail khiếu nại thị trường 21/01/2026 — đã ghi CSDL chính (su_co_kph #57) + CSDL KPH (hồ sơ #824).</p>
      </div>
    </div>

"""
NL = "\r\n" if "\r\n" in h else "\n"
i = h.rindex("</section>")
j = i
while j > 0 and h[j - 1] in "\r\n \t":
    j -= 1
blk = BLOCK.replace("\n", NL).rstrip(NL)
new = h[:j] + NL + NL + blk + NL + NL + h[j:]
# cập nhật số vụ 37 → 38 ở 2 chỗ (logo nav + hero badge)
new, c1 = re.subn(r"(<small>)37(\s*vụ việc)", lambda m: m.group(1) + "38" + m.group(2), new)
new, c2 = re.subn(r"(badge\">\s*(?:🏭\s*)?)37(\s*vụ việc)", lambda m: m.group(1) + "38" + m.group(2), new)
assert c1 == 1 and c2 == 1, f"⚠ số chỗ sửa không như mong đợi: {c1}, {c2}"
assert new.count('class="inc"') == 38, new.count('class="inc"')
assert new.count("<div") == new.count("</div>"), (new.count("<div"), new.count("</div>"))
assert new.count("<figure") == new.count("</figure>")
io.open(P, "w", encoding="utf-8", newline="").write(new)

chk = io.open(P, encoding="utf-8").read()
print("sau : khối", chk.count('class="inc"'), "| số vụ ghi", re.findall(r"(\d+)\s*vụ việc", chk),
      "| div cân bằng", chk.count("<div") == chk.count("</div>"),
      "| figure", chk.count("<figure"), "| có khối mới:", 'id="tienhung-tth270"' in chk)

m = json.load(io.open(MAP, encoding="utf-8"))
m.setdefault("by_hoso", {})["824"] = "tienhung-tth270"
if isinstance(m.get("blocks"), list):
    if "tienhung-tth270" not in m["blocks"]: m["blocks"].append("tienhung-tth270")
elif isinstance(m.get("blocks"), dict):
    m["blocks"]["tienhung-tth270"] = {"no": 38}
io.open(MAP, "w", encoding="utf-8").write(json.dumps(m, ensure_ascii=False, indent=1))
print("portal_map: by_hoso", len(m["by_hoso"]), "| blocks:", type(m.get("blocks")).__name__, len(m.get("blocks") or []))
print("map #824 →", m["by_hoso"]["824"])
