# -*- coding: utf-8 -*-
r"""B83: (A) backup + GÁN KTV (Lê Văn Hòa, id 114) cho 6 mẫu Liên Minh tuần 41;
(B) xuất DOCX 'DANH SÁCH MẪU CHƯA DỨT ĐIỂM T38→T41' gửi phòng Kỹ thuật."""
import os, sqlite3, time
from docx import Document
from docx.shared import Pt, Cm
from docx.enum.text import WD_ALIGN_PARAGRAPH

DB = r'C:\c\deepseek-harness\claw2-db\btchem.db'
RA = r'C:\Claw 2\Bao cao - Hanh chinh\Bao cao lam mau\Danh-sach-mau-chua-dut-diem_T38-T41_12-10-2026.docx'

# ---------- A. gán KTV cho 6 mẫu Liên Minh ----------
con = sqlite3.connect(DB)
con.row_factory = sqlite3.Row
kt = con.execute("select id, ten from phai_vien_kt where id=114").fetchone()
print('  KTV id 114 =', dict(kt) if kt else None)
ids = [r['id'] for r in con.execute("""select id from mau_lam where tuan='T41' and nha_may_id=28 and ifnull(ky_thuat_id,'')='' """)]
print('  mẫu Liên Minh chưa gán KTV:', len(ids), ids)

bak = DB.replace('btchem.db', 'btchem.db_bak_%s_truoc_gan_kt_lienminh' % time.strftime('%Y%m%d_%H%M%S'))
src = sqlite3.connect(DB); dst = sqlite3.connect(bak)
with dst:
    src.backup(dst)
dst.close(); src.close()
print('  backup:', os.path.basename(bak), os.path.getsize(bak), 'B')

truoc = con.execute('select count(*) from mau_lam').fetchone()[0]
con.executemany("update mau_lam set ky_thuat_id=114 where id=?", [(i,) for i in ids])
con.commit()
sau = con.execute('select count(*) from mau_lam').fetchone()[0]
print('  ĐÃ GÁN: %d dòng | tổng mau_lam %d -> %d (chỉ UPDATE, không thêm/xoá dòng)' % (len(ids), truoc, sau))
print('  đọc lại:')
for r in con.execute("""select m.tuan, m.ma_mau, ifnull(k.ten,'(trống)') as ktv from mau_lam m left join phai_vien_kt k on k.id=m.ky_thuat_id
                        where m.tuan='T41' and m.nha_may_id=28 order by m.ma_mau"""):
    print('     %s | %-16s | %s' % (r['tuan'], str(r['ma_mau'])[:16], r['ktv']))

# ---------- B. DOCX danh sách mẫu chưa dứt điểm ----------
rows = con.execute("""select m.tuan as tuan, ifnull(n.ten,'(chưa rõ)') as nm, m.ma_mau as ma, ifnull(m.khach_hang,'') as kh,
                             m.ngay_nhan as nn, ifnull(m.ngay_ht,'') as ht, ifnull(k.ten,'') as ktv, ifnull(m.ghi_chu,'') as gh,
                             ifnull(m.loai_mau,'') as loai, ifnull(m.so_luong,'') as sl, ifnull(m.co_don_hang,'') as dh
                      from mau_lam m left join nha_may n on n.id=m.nha_may_id left join phai_vien_kt k on k.id=m.ky_thuat_id
                      where m.tuan in ('T38','T39','T40','T41') and ifnull(m.trang_thai,'') in ('Đang làm','ĐL')
                      order by m.tuan, nm, m.ma_mau""").fetchall()
con.close()

d = Document()
st = d.styles['Normal']; st.font.name = 'Calibri'; st.font.size = Pt(11)
h = d.add_paragraph(); r = h.add_run('DANH SÁCH MẪU CHƯA DỨT ĐIỂM — 4 TUẦN (T38 → T41)')
r.bold = True; r.font.size = Pt(15); h.alignment = WD_ALIGN_PARAGRAPH.CENTER
p = d.add_paragraph('Ngày lập: 12/10/2026 · Nguồn: CSDL báo cáo làm mẫu (btchem.db, bảng mau_lam) · Người lập: Phòng QC (tổng hợp tự động)')
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
d.add_paragraph('Tiêu chí lọc: trạng thái = “Đang làm” hoặc “ĐL” trong các tuần T38, T39, T40, T41 (mẫu chưa có kết quả ký/hoàn thành).')
from collections import Counter
dem = Counter(x['tuan'] for x in rows)
d.add_paragraph('Tổng: %d mẫu — T38: %d · T39: %d · T40: %d · T41: %d'
                % (len(rows), dem.get('T38', 0), dem.get('T39', 0), dem.get('T40', 0), dem.get('T41', 0)))
d.add_paragraph('Cảnh báo cần lưu ý: ① mẫu để trống “Kỹ thuật” = chưa gán người ⇒ không có báo cáo cá nhân; '
                '② mẫu ghi “MÀU K ĐẠT LÀM LẠI” (Hoàng Minh Tuấn) đã kéo từ T40 sang T41; '
                '③ mã nào có ngày HT vô lý (Rayten PB288: 2026-03-10) cần chỉnh nguồn.')

t = d.add_table(rows=1, cols=8)
t.style = 'Table Grid'
hdr = ['Tuần', 'Nhà máy', 'Mã mẫu', 'Khách hàng', 'Ngày nhận', 'Ngày HT', 'Kỹ thuật', 'Ghi chú']
for i, x in enumerate(hdr):
    c = t.rows[0].cells[i].paragraphs[0]; rr = c.add_run(x); rr.bold = True; rr.font.size = Pt(9.5)
for x in rows:
    c = t.add_row().cells
    vals = [x['tuan'], x['nm'], x['ma'], x['kh'], x['nn'], x['ht'], x['ktv'] or '— CHƯA GÁN —', x['gh']]
    for i, v in enumerate(vals):
        rr = c[i].paragraphs[0].add_run(str(v)); rr.font.size = Pt(9)

d.add_paragraph()
d.add_paragraph('Ghi chú cuối: danh sách lấy từ dữ liệu CSDL đã nạp (T41 nạp ngày 12/10/2026). '
                'Các mẫu T38/T39/T40 nếu thực tế đã xong mà chưa cập nhật trạng thái thì đề nghị Kỹ thuật xác nhận để cập nhật lại.')
os.makedirs(os.path.dirname(RA), exist_ok=True)
d.save(RA)
print()
print('  DOCX: %s | %d B | %d dòng bảng' % (os.path.basename(RA), os.path.getsize(RA), len(t.rows) - 1))
