# -*- coding: utf-8 -*-
"""BẢN TÍNH NHÁP (XLSX) — 3 công thức nghiền màu OXID SẮT: đen · nâu đất · vàng đất.
Nhựa: Alkyd mạch dài. Phân tán: LPN 22836 (đen) / Disperbyk 106 (nâu, vàng).
Giá: lấy số MỚI NHẤT trong btchem.db (bảng gia_nguyen_lieu) — ghi rõ ngày."""
import os
from openpyxl import Workbook
from openpyxl.styles import Font, Alignment, PatternFill, Border, Side
from openpyxl.utils import get_column_letter

RA = r'C:\Claw\nghiên-cứu\04-Mau-sac-Dye-Pigment\Ban-tinh-nhap_3-CT-nghien-mau-oxit-sat_2026-10-09.xlsx'
ME = 100.0  # kg mẻ

# (tên, vai trò, [đen phần, đ/kg, giá ngày], [nâu...], [vàng...])
NL = [
    ('Bột màu ĐEN oxid sắt — Iron oxide Black VAP-330M (P.Bk.11)', 'Bột màu', (40.0, 66000, '05/09/2026'), (0, 0, ''), (0, 0, '')),
    ('Bột màu NÂU ĐẤT — Umber Pigment 645 (P.Br7)', 'Bột màu', (0, 0, ''), (45.0, 92000, '10/09/2026'), (0, 0, '')),
    ('Bột màu VÀNG ĐẤT — Ferrispec FP YB-2087 (oxid sắt vàng)', 'Bột màu', (0, 0, ''), (0, 0, ''), (42.0, 58000, '10/09/2026')),
    ('Nhựa Alkyd MẠCH DÀI — Alkyd 360 (Setal)', 'Nhựa mang', (35.0, 81000, '08/09/2026'), (31.5, 81000, '08/09/2026'), (33.0, 81000, '08/09/2026')),
    ('Dung môi Xylene : Butyl acetate = 1:1', 'Phân tán/chỉnh nhớt', (22.0, 33500, '06/10 & 11/09/2026'), (21.0, 33500, '06/10 & 11/09/2026'), (22.5, 33500, '06/10 & 11/09/2026')),
    ('Trợ phân tán BYK LPN 22836', 'Trợ phân tán (đen)', (2.0, 596000, '14/09/2026'), (0, 0, ''), (0, 0, '')),
    ('Trợ phân tán Disperbyk 106', 'Trợ phân tán (nâu/vàng)', (0, 0, ''), (1.5, 443000, '14/09/2026'), (1.5, 443000, '14/09/2026')),
    ('Chống lắng (organo-clay gel hoặc fumed silica)', 'Chống lắng', (1.0, None, ''), (1.0, None, ''), (1.0, None, '')),
]
CT = ['ĐEN', 'NÂU ĐẤT', 'VÀNG ĐẤT']

wb = Workbook()
do = Font(bold=True, color='FFFFFF')
nau = PatternFill('solid', fgColor='305496')
xam = PatternFill('solid', fgColor='EDEDED')
vien = Border(*[Side(style='thin', color='BFBFBF')] * 4)


def tieu_de(ws, t, dong):
    ws.cell(row=dong, column=1, value=t).font = Font(bold=True, size=13)
    ws.merge_cells(start_row=dong, start_column=1, end_row=dong, end_column=12)


# ---------- Sheet 1: bản tính nháp
ws = wb.active
ws.title = 'Nhap_3CT'
tieu_de(ws, 'BẢN TÍNH NHÁP — 3 CÔNG THỨC NGHIỀN MÀU OXID SẮT: ĐEN · NÂU ĐẤT · VÀNG ĐẤT  (09/10/2026)', 1)
ws.cell(row=2, column=1, value='Khối lượng mẻ (kg):').font = Font(italic=True, size=9)
ws.cell(row=2, column=2, value=ME).font = Font(bold=True, size=10)
ws.cell(row=3, column=1, value='Nháp để chỉnh — số liệu ĐỀ NGHỊ THỬ, chưa phải định mức sản xuất. Nhựa: Alkyd mạch dài. Sửa ô B2 để tính lại theo mẻ khác.').font = Font(italic=True, size=9)
cot = ['Thành phần', 'Vai trò']
for c in CT:
    cot += ['%s — phần' % c, '%s — đ/kg' % c, '%s — thành tiền' % c]
ws.append([])
ws.append(cot)
HDR = ws.max_row
for i, cl in enumerate(ws[HDR], start=1):
    cl.font = do; cl.fill = nau; cl.alignment = Alignment(horizontal='center', wrap_text=True); cl.border = vien
R_DAU = HDR + 1
for ten, vai, *ct in NL:
    ws.append([ten, vai])
    r = ws.max_row
    for k, c in enumerate(ct):
        phan, gia, _ = c
        c1 = 3 + k * 3
        if phan:
            ws.cell(row=r, column=c1, value=phan)
        if gia:
            ws.cell(row=r, column=c1 + 1, value=gia)
            ws.cell(row=r, column=c1 + 2, value='=%s%d*$B$2/100*%s%d' % (get_column_letter(c1), r, get_column_letter(c1 + 1), r))
# dòng TỔNG
r0 = ws.max_row + 1
ws.cell(row=r0, column=1, value='TỔNG').font = Font(bold=True)
for k, c in enumerate(CT):
    c1 = 3 + k * 3
    ws.cell(row=r0, column=c1, value='=SUM(%s%d:%s%d)' % (get_column_letter(c1), R_DAU, get_column_letter(c1), r0 - 1)).font = Font(bold=True)
    ws.cell(row=r0, column=c1 + 2, value='=SUM(%s%d:%s%d)' % (get_column_letter(c1 + 2), R_DAU, get_column_letter(c1 + 2), r0 - 1)).font = Font(bold=True)
# dòng kiểm tổng 100 + giá vốn/kg
r1 = r0 + 1
ws.cell(row=r1, column=1, value='KIỂM TỔNG = 100,0 ?').font = Font(bold=True)
ws.cell(row=r1 + 1, column=1, value='GIÁ VỐN / kg (chưa gồm chống lắng)').font = Font(bold=True)
for k in range(len(CT)):
    c1 = 3 + k * 3
    ws.cell(row=r1, column=c1, value='=IF(ABS(%s%d-100)<=0.05,"ĐẠT","SAI")' % (get_column_letter(c1), r0)).font = Font(bold=True)
    o = ws.cell(row=r1 + 1, column=c1, value='=%s%d/$B$2' % (get_column_letter(c1 + 2), r0))
    o.font = Font(bold=True); o.number_format = '#,##0'
for i, w in enumerate([52, 24] + [11, 12, 15] * 3, start=1):
    ws.column_dimensions[get_column_letter(i)].width = w
for r in range(5, r1 + 2):
    for c in range(1, 12):
        ws.cell(row=r, column=c).border = vien

# ---------- Sheet 2: giá nguyên liệu dùng trong bản tính
ws2 = wb.create_sheet('Gia_NL')
tieu_de(ws2, 'GIÁ NGUYÊN LIỆU DÙNG TRONG BẢN TÍNH (số mới nhất từ btchem.db)', 1)
ws2.append([])
ws2.append(['Nguyên liệu', 'Giá dùng (đ/kg)', 'Ngày giá', 'Loại giá', 'Cần chốt'])
for cl in ws2[3]:
    cl.font = do; cl.fill = nau; cl.border = vien
gia_rows = [
    ('Iron oxide Black VAP-330M (P.Bk.11) — MATAPEL/ECKART', 66000, '05/09/2026', 'Giá báo', ''),
    ('Umber Pigment 645 (P.Br7) — Venator/Rockwood', 92000, '10/09/2026', 'Giá báo', ''),
    ('Ferrispec FP YB-2087 (oxid sắt vàng) — Ming Hui', 58000, '10/09/2026', 'Giá báo', 'Cần xác nhận C.I. (P.Y.42/43) — chưa có TDS'),
    ('Alkyd 360 (Setal) — alkyd rất dài dầu', 81000, '08/09/2026', 'Giá báo', 'Thay thế: Alkyphoenix S77-100LV (alkyd dài) 56.000 đ/kg — rẻ 25.000 đ/kg'),
    ('Dung môi Xylene Isomer', 36200, '06/10/2026', 'Giá báo', ''),
    ('Dung môi N Butyl Acetate 180', 30800, '11/09/2026', 'Đặt hàng', ''),
    ('BYK LPN 22836 — trợ phân tán cho ĐEN', 596000, '14/09/2026', 'Giá báo', '⚠ Bảng giá ghi theo TÊN NHÓM, chưa chắc là mã sản phẩm để đặt hàng'),
    ('Disperbyk 106 — trợ phân tán cho NÂU/VÀNG', 443000, '14/09/2026', 'Giá báo', 'Tồn kho 250 kg; thay thế Disperbyk 110 (423.000)'),
    ('Chống lắng (organo-clay gel / fumed silica)', None, '', '', 'CHƯA CÓ GIÁ trong CSDL — cần bổ sung để tính đủ giá vốn'),
]
for r in gia_rows:
    ws2.append(list(r))
for i, w in enumerate([50, 15, 13, 12, 60], start=1):
    ws2.column_dimensions[get_column_letter(i)].width = w

# ---------- Sheet 3: cách nghiền + tỷ lệ dùng
ws3 = wb.create_sheet('Cach_nghien')
tieu_de(ws3, 'CÁCH NGHIỀN & TỶ LỆ DÙNG (áp dụng chung 3 công thức)', 1)
ws3.append([])
for t in ['1. Nạp dung môi + trợ phân tán vào thùng nghiền, khuấy 300–500 v/p trong 5 phút.',
          '2. Rắc bột màu TỪ TỪ vào xoáy dung môi, nâng dần 800–1.200 v/p, khuấy 15–20 phút cho bột ướt đều, không vón.',
          '3. Nạp nhựa alkyd (có thể chia 2 lần) — giữ khối nghiền không quá nhớt.',
          '4. Nghiền bi / nghiền cát 30–60 phút; kiểm độ mịn mỗi 15 phút; đạt Hegman ≥ 6–7 (hạt lớn nhất ≤ 15–25 µm) thì dừng.',
          '5. Nhiệt khối nghiền ≤ 50–55 °C (làm mát thùng nếu cần).',
          '6. Cho chống lắng sau cùng, khuấy 10 phút tốc độ thấp; lọc 60–100 µm khi đóng thùng.',
          '— Tỷ lệ dùng: stain/glaze lau 3–8 % · lót màu / bóng màu 5–12 % (đen oxid che tốt hơn umber) · dặm màu 20–40 % pha loãng.',
          '— Muốn đen sâu/đậm hơn: thêm carbon black (MA 100 hoặc Carbon 30L) liều 0,5–2 % — cường độ cực cao, dễ kết tụ.',
          '— Kiểm tra sau nghiền: Hegman · nhớt cốc NK2 · độ lắng 24 h và 7 ngày · cường độ màu 5 % trong base trắng (đo ΔE bằng X-Rite, cần ΔE ≤ 1,0 giữa các mẻ).']:
    ws3.append([t])
ws3.column_dimensions['A'].width = 150

# ---------- Sheet 4: ghi chú phân lớp số liệu
ws4 = wb.create_sheet('Ghi_chu')
tieu_de(ws4, 'GHI CHÚ — PHÂN LỚP SỐ LIỆU & ĐIỂM CẦN CHỐT', 1)
ws4.append([])
for t in ['(1) Theo CSDL/tài liệu: tên – nhóm – giá nguyên liệu (btchem.db, bảng gia_nguyen_lieu, số mới nhất); Umber = P.Br7 (C.I. 77491) oxid sắt + MnO₂, bán trong, dạng bột; yêu cầu nghiền Hegman ≥ 6–7 và tỷ lệ stain 3–8 % theo chuyên luận bột màu của phòng; Alkyd 360 (Setal) = alkyd rất dài dầu (very long oil) theo TDS Allnex.',
          '(2) Phép tính: tổng phần = 100,0 cho từng công thức (đã kiểm bằng máy); thành tiền = phần × mẻ 100 kg / 100 × đ/kg; giá vốn/kg = tổng thành tiền / 100 kg.',
          '(3) ĐỀ NGHỊ THỬ (phải kéo ô thử trước khi chốt): liều bột màu 40–45 %, liều trợ phân tán 1,5–2,0 phần, tỷ lệ dung môi, thứ tự nạp liệu.',
          'Khoảng trống: chưa có TDS của VAP-330M / Umber 645 / Ferrispec YB-2087 (dầu hấp thụ, D50, solid) ⇒ liều có thể phải chỉnh sau mẻ thử đầu; chưa có giá chống lắng.',
          'Công thức này là mẫu thử — KHÔNG phải định mức sản xuất.']:
    ws4.append([t])
ws4.column_dimensions['A'].width = 150

os.makedirs(os.path.dirname(RA), exist_ok=True)
wb.save(RA)
print('ĐÃ LƯU:', RA, os.path.getsize(RA), 'B')

# ---- kiểm chứng độc lập (Python, không tin Excel)
print()
for k, ten in enumerate(CT):
    phan = [c[k][0] for _, _, *c in NL]
    gia = [c[k][1] for _, _, *c in NL]
    tong_phan = sum(phan)
    von = sum(p * g for p, g in zip(phan, gia) if g) * ME / 100
    print('%-10s tổng phần = %5.1f  ⇒ %s | giá vốn = %8.0f đ/kg (chưa gồm chống lắng)'
          % (ten, tong_phan, 'ĐẠT' if abs(tong_phan - 100) < 0.051 else 'SAI ⚠', von / ME))
