§
    ¯—§jWa  ã                   óz  — d Z ddlZddlZddlZddlmZ ej                             ej                             e	¦  «        ¦  «        Z
ej                             e
d¦  «        Zej                             e
d¦  «        Zd„ Z ee¦  «        Zej        d         ej        d         cZZg Zej        dd…         D ]¢Zd„ ej        D ¦   «         Zed         sŒ ee¦  «        d	k    red	         n ee¦  «        d
k    red
         ndZe                      eed          eed         ¦  «         eed         ¦  «         eed         ¦  «        e¬¦  «        ¦  «         Œ£d„ eD ¦   «         Zd„ eD ¦   «         Zd„ eD ¦   «         Zered         ndZde› ded›d�Zddddddddd e› d!�g	Z g Z! ee¦  «        Z"dZ#de"z   Z$ej        dd…         D �]VZd"„ ej        D ¦   «         Z ee¦  «        de"z   dz   xZ%k     rŒ,ed         ed         ed         cZ&Z'Z(e'r)e(r'e( )                    ¦   «          *                    d#¦  «        rŒqd$„  e+e#e$¦  «        D ¦   «         Z,d%„ e,D ¦   «         Z, eee$         ¦  «        pdZ-ee$dz            Z.	  e/e. 0                    d&d¦  «         0                    d'd¦  «         1                    ¦   «         ¦  «        Z2n# e3e4f$ r d(Z2Y nw xY we!                      ee& 5                    ¦   «         r e6e&¦  «        n ee!¦  «        dz   e'e(e,e-e2¬)¦  «        ¦  «         �ŒXddl7Z7d*Z8	  e7j9        d+e8› d,�d-¬.¦  «        Z:d/„ e: ;                    d0¦  «        D ¦   «         Z< e=e: ;                    d1¦  «        ¦  «        Z>dZ?e!D ]­Z@e@d2          )                    ¦   «         ZAe>D ]Ž\  ZBZCeCpd 1                    ¦   «          )                    ¦   «         ZD eeD¦  «        d
k     rŒ=eDe@d3          )                    ¦   «         k    s eeD¦  «        d4k    r$eDeAv r e< E                    eBd¦  «        e@d5<   e?dz  Z? nŒ�Œ®e: F                    ¦   «           eGd6e?d7¦  «         n# eH$ rZI eGd8eI¦  «         Y dZI[IndZI[Iww xY w eJd9„ e!D ¦   «         ¦  «        ZK eJd:„ e!D ¦   «         ¦  «        ZL eJd;„ e!D ¦   «         ¦  «        ZMed         ed<         z
  ZNed<         reNed<         z  d=z  ndZO eGd> ee!¦  «        d?eKd@eLdAeM¦  «          eGdBed         dC›dDed         dC›dEeNdF›dGeOdH›dI�¦  «         dJZPeP 0                    dKe¦  «        ZPeP 0                    dL eQ ee!¦  «        ¦  «        ¦  «        ZPeP 0                    dMed         dC›¦  «        ZPeP 0                    dNed         dC›¦  «        ZPeP 0                    dOeNdF›dGeOdH›dI�¦  «        ZPeP 0                    dPeOdH›d&�¦  «        ZPeP 0                    dQ eQeK¦  «        ¦  «        ZPeP 0                    dR eQeL¦  «        ¦  «        ZPeP 0                    dS eQeM¦  «        ¦  «        ZPeP 0                    dT ejR        e!dU¬V¦  «        ¦  «        ZPeP 0                    dW ejR        e¦  «        ¦  «        ZPeP 0                    dX ejR        e dU¬V¦  «        ¦  «        ZPeP 0                    dY ejR        e¦  «        ¦  «        ZPeP 0                    dZ ejR        e¦  «        ¦  «        ZP eSed[d\¬]¦  «        5 ZTeT U                    eP¦  «         ddd¦  «         n# 1 swxY w Y    eGd^e¦  «          eGd_ eeP¦  «        d`¦  «         dS )auâ   Portal HTML bÃ¡o cÃ¡o MUA HÃ€NG thÃ¡ng 9/2026 â€” Ká»³ T9 (12 ngÃ y Ä‘áº§u thÃ¡ng 9).
Nguá»“n: BAO_CAO_SO_SANH_MUA_HANG_T9.docx (2 báº£ng: KPI + chi tiáº¿t 188 KH).
LÆ°u: Baocaomuahangthang9-T1.html â€” cáº¡nh file DOCX gá»‘c.é    N)ÚDocumentz BAO_CAO_SO_SANH_MUA_HANG_T9.docxzBaocaomuahangthang9-T1.htmlc                 ó  — | €dS t          | ¦  «                             ¦   «                              dd¦  «                             dd¦  «        } | dv rdS 	 t          t	          | ¦  «        ¦  «        S # t
          t          f$ r Y dS w xY w)z$'1,458' -> 1458; '-'/''/None -> NoneNú,Ú Ú )r   Ú-u   â€”)ÚstrÚstripÚreplaceÚintÚfloatÚ
ValueErrorÚ	TypeError)Úss    úRC:\Claw 2\Bao cao - Hanh chinh\bao cao mua hang\Bao_cao\build_muahang_t9_portal.pyÚpnumr      sŽ   € à€yØˆtÝˆA‰Œ�Š‰Œ×Ò˜s BÑ'Ô'×/Ò/°°RÑ8Ô8€AØÐÐÐØˆtðÝ•5˜‘8”8‰}Œ}ÐøÝ�	Ð"ð ð ð Øˆtˆtðøøøs   ÁA1 Á1BÂBé   c                 ó@   — g | ]}|j                              ¦   «         ‘ŒS © ©Útextr
   ©Ú.0Úcs     r   ú
<listcomp>r      ó"   € Ð-Ð-Ð- ˆQŒV�\Š\‰^Œ^Ð-Ð-Ð-ó    é   é   r   é   é   )ÚtenÚtongÚngayÚtbÚpctc                 ó   — g | ]
}|d          ‘ŒS )r#   r   ©r   Úps     r   r   r   %   ó   € Ð$Ð$Ð$˜!ˆAˆfŒIÐ$Ð$Ð$r   c                 ó   — g | ]
}|d          ‘ŒS )r%   r   r(   s     r   r   r   &   s   € Ð	 Ð	 Ð	 �aˆ!ˆDŒ'Ð	 Ð	 Ð	 r   c                 ó   — g | ]
}|d          ‘ŒS )r$   r   r(   s     r   r   r   '   r*   r   éÿÿÿÿé   u   Ká»³ T9 (1-u   ): 01/09 â†’ Ú02dz/09/2026ÚT1ÚT2ÚT3ÚT4ÚT5ÚT6ÚT7ÚT8zT9 (u    ngÃ y)c                 ó@   — g | ]}|j                              ¦   «         ‘ŒS r   r   r   s     r   r   r   4   r   r   u   Tá»”NG Cá»˜NGc                 óB   — g | ]}t          t          |         ¦  «        ‘ŒS r   )r   Úcells)r   Úis     r   r   r   :   s"   € Ð	DÐ	DÐ	D˜Q�$�u�QŒx‰.Œ.Ð	DÐ	DÐ	Dr   c                 ó   — g | ]}|€dn|‘Œ	S )Nr   r   )r   Úvs     r   r   r   ;   s    € Ð	,Ð	,Ð	, Aˆqˆyˆ!ˆ!˜aÐ	,Ð	,Ð	,r   ú%ú+g        )ÚsttÚmar"   r%   Úchenhr&   z(C:\c\deepseek-harness\claw2-db\btchem.dbzfile:z?mode=roT)Úuric                 ó,   — i | ]}|d          |d         “ŒS )r   r   r   )r   Úrs     r   ú
<dictcomp>rF   J   s"   € ÐJÐJÐJ˜1ˆAˆaŒD�!�A”$ÐJÐJÐJr   zSELECT id, ten FROM nha_mayz+SELECT nha_may_id, alias FROM nha_may_aliasr"   rA   é   ÚnmzGan nha may choz
khach hangz! Khong gan duoc nha may:c              #   ó2   K  — | ]}|d          dk    ¯dV — ŒdS ©rB   r   r   Nr   ©r   Úks     r   ú	<genexpr>rM   ]   ó*   è è € Ð-Ð-�1˜a œj¨1šn˜nˆQ˜n˜n˜n˜nÐ-Ð-r   c              #   ó2   K  — | ]}|d          dk     ¯dV — ŒdS rJ   r   rK   s     r   rM   rM   ^   rN   r   c              #   ó2   K  — | ]}|d          dk    ¯dV — ŒdS rJ   r   rK   s     r   rM   rM   _   s*   è è € Ð.Ð.�1˜a œj¨Ašo˜oˆQ˜o˜o˜o˜oÐ.Ð.r   éþÿÿÿéd   zKH:z| Tang:z| Giam:z| Dung:zTong Kg T9:r   z| TB/ngay T9:z| Chenh vs T8:z+,z (z+.1fz%)uÝL  <!DOCTYPE html>
<html lang="vi">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>BÃ¡o cÃ¡o Mua hÃ ng â€” ThÃ¡ng 9/2026 (Ká»³ T9) | BT Chem</title>
<style>
:root{
  --xanh:#1F3A5F; --xanh2:#2E5E9E; --do:#C00000; --vang:#E6A817; --xanhla:#1E7D32;
  --xam:#f4f6f9; --xam2:#e9edf3; --den:#1a1a1a; --trang:#fff; --tim:#6a3fc0;
}
*{box-sizing:border-box;margin:0;padding:0}
body{font-family:'Segoe UI',Tahoma,Arial,sans-serif;background:var(--xam);color:var(--den);font-size:14px;line-height:1.5}
.wrap{max-width:1320px;margin:0 auto;padding:0 16px}

/* ===== HEADER ===== */
header{background:linear-gradient(135deg,var(--xanh) 0%,var(--xanh2) 100%);color:#fff;padding:26px 0 18px;box-shadow:0 3px 12px rgba(0,0,0,.18)}
header .wrap{display:flex;flex-wrap:wrap;align-items:center;gap:16px;justify-content:space-between}
.logo h1{font-size:22px;font-weight:700;letter-spacing:.3px}
.logo p{font-size:12.5px;opacity:.92;margin-top:3px}
.kpi{display:flex;gap:10px;flex-wrap:wrap}
.kpi .box{background:rgba(255,255,255,.14);border:1px solid rgba(255,255,255,.28);border-radius:10px;padding:8px 16px;text-align:center;min-width:96px}
.kpi .box b{display:block;font-size:20px;line-height:1.2}
.kpi .box span{font-size:10.5px;opacity:.9;text-transform:uppercase;letter-spacing:.5px}

/* ===== NAV ===== */
nav{background:var(--xanh);border-top:1px solid rgba(255,255,255,.15)}
nav .wrap{display:flex;gap:4px;flex-wrap:wrap}
nav button{background:transparent;color:#cfd8e8;border:none;padding:12px 18px;font-size:14px;cursor:pointer;border-bottom:3px solid transparent;font-weight:600;transition:.15s}
nav button:hover{color:#fff;background:rgba(255,255,255,.08)}
nav button.on{color:#fff;border-bottom-color:var(--vang);background:rgba(255,255,255,.10)}

/* ===== SECTIONS ===== */
section{display:none;padding:22px 0 40px}
section.on{display:block}
h2.sec{font-size:19px;color:var(--xanh);margin:6px 0 4px;border-left:5px solid var(--do);padding-left:10px}
p.sub{color:#5a6472;font-size:12.5px;margin-bottom:14px}

/* ===== CARDS ===== */
.cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:12px;margin:14px 0}
.card{background:#fff;border-radius:12px;padding:14px 16px;box-shadow:0 1px 4px rgba(0,0,0,.08);border-top:4px solid var(--xanh2)}
.card b{font-size:26px;display:block;color:var(--xanh)}
.card span{font-size:12px;color:#5a6472}
.card.red{border-top-color:var(--do)} .card.green{border-top-color:var(--xanhla)} .card.yellow{border-top-color:var(--vang)}

/* ===== CHART ===== */
.chart-box{background:#fff;border-radius:12px;padding:16px;box-shadow:0 1px 4px rgba(0,0,0,.08);margin:12px 0}
.chart-box h3{font-size:14.5px;color:var(--xanh);margin-bottom:12px}
.bar-row{display:flex;align-items:center;gap:8px;margin:5px 0}
.bar-row .lbl{width:220px;font-size:12px;text-align:right;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.bar-row .track{flex:1;background:var(--xam2);border-radius:6px;height:22px;position:relative;overflow:hidden}
.bar-row .fill{height:100%;border-radius:6px;background:linear-gradient(90deg,var(--xanh2),#4a8ad4);display:flex;align-items:center;justify-content:flex-end;padding-right:8px;color:#fff;font-size:11px;font-weight:700;min-width:34px;white-space:nowrap;transition:width .5s}
.bar-row .fill.red{background:linear-gradient(90deg,var(--do),#e04545)}
.bar-row .fill.green{background:linear-gradient(90deg,var(--xanhla),#35a54e)}
.bar-row .val{width:70px;font-size:12px;font-weight:700;color:var(--xanh)}
.legend{display:flex;gap:14px;flex-wrap:wrap;font-size:12px;margin-top:8px}
.legend i{display:inline-block;width:12px;height:12px;border-radius:3px;margin-right:4px;vertical-align:-1px}

/* ===== TABLE ===== */
.controls{background:#fff;border-radius:12px;padding:12px 14px;box-shadow:0 1px 4px rgba(0,0,0,.08);margin:12px 0;display:flex;gap:10px;flex-wrap:wrap;align-items:center}
.controls input[type=text]{flex:1;min-width:180px;padding:8px 12px;border:1px solid #c9d2dd;border-radius:8px;font-size:13px}
.controls select{padding:8px 10px;border:1px solid #c9d2dd;border-radius:8px;font-size:13px;background:#fff}
.controls label{font-size:12px;color:#5a6472}
.tbl-wrap{background:#fff;border-radius:12px;box-shadow:0 1px 4px rgba(0,0,0,.08);overflow:auto;max-height:640px}
table{border-collapse:collapse;width:100%;font-size:12.5px;min-width:1180px}
thead th{position:sticky;top:0;background:var(--xanh);color:#fff;padding:9px 10px;text-align:left;cursor:pointer;user-select:none;white-space:nowrap;z-index:2}
thead th:hover{background:var(--xanh2)}
thead th.asc::after{content:' â–²';font-size:10px}
thead th.desc::after{content:' â–¼';font-size:10px}
tbody td{padding:7px 10px;border-bottom:1px solid #e7ebf1;vertical-align:top}
tbody tr:nth-child(even){background:#f8fafc}
tbody tr:hover{background:#eef4fb}
td.num{text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap}
.pill{display:inline-block;padding:2px 9px;border-radius:20px;font-size:11px;font-weight:700;white-space:nowrap}
.pill.duong{background:#e8f5e9;color:var(--xanhla)}
.pill.do{background:#fdecea;color:var(--do)}
.pill.xam{background:#eef0f3;color:#5a6472}
.hint{font-size:11.5px;color:#7b8494;margin-top:6px;font-style:italic}
.diff-up{color:var(--xanhla);font-weight:700}
.diff-down{color:var(--do);font-weight:700}
.diff-zero{color:#7b8494}

footer{background:var(--xanh);color:#c9d4e4;padding:18px 0;text-align:center;font-size:12px;margin-top:30px}
.src{font-size:11px;color:#8a94a6;margin-top:4px}
@media(max-width:768px){.bar-row .lbl{width:130px}.kpi .box{min-width:78px}.kpi .box b{font-size:16px}}
</style>
</head>
<body>

<header>
  <div class="wrap">
    <div class="logo">
      <h1>ðŸ›’ BÃ�O CÃ�O MUA HÃ€NG â€” THÃ�NG 9/2026</h1>
      <p>CÃ”NG TY TNHH SXâ€“TM HÃ“A KEO BÃŒNH THáº NH Â· PHÃ’NG KINH DOANH Â· <b>__KY__</b></p>
    </div>
    <div class="kpi">
      <div class="box"><b>__N_KH__</b><span>KhÃ¡ch hÃ ng mua</span></div>
      <div class="box"><b>__TONG_LAST__</b><span>Tá»•ng Kg Ká»³ T9</span></div>
      <div class="box"><b>__TB_LAST__</b><span>TB/ngÃ y Ká»³ T9</span></div>
      <div class="box"><b>__CHENH__</b><span>vs ThÃ¡ng 8</span></div>
    </div>
  </div>
</header>

<nav>
  <div class="wrap">
    <button class="on" data-tab="tongquan">ðŸ�  Tá»•ng quan</button>
    <button data-tab="chitiet">ðŸ�­ Chi tiáº¿t khÃ¡ch hÃ ng</button>
    <button data-tab="top">ðŸ“ˆ Top tÄƒng / giáº£m</button>
    <button data-tab="sosanh">âš–ï¸� So sÃ¡nh khÃ¡ch hÃ ng</button>
  </div>
</nav>

<div class="wrap">

<!-- ==================== Tá»”NG QUAN ==================== -->
<section id="tongquan" class="on">
  <h2 class="sec">Tá»•ng quan toÃ n cÃ´ng ty â€” 8 thÃ¡ng Ä‘áº§u nÄƒm + Ká»³ T9 (01/09 â†’ 12/09/2026)</h2>
  <p class="sub">LÆ°á»£ng bÃ¡n trung bÃ¬nh ngÃ y (Kg/ngÃ y) quy Ä‘á»•i tá»« tá»•ng sáº£n lÆ°á»£ng mua hÃ ng theo sá»‘ ngÃ y thá»±c táº¿ tá»«ng ká»³. Ká»³ T9 = __TB_LAST__ Kg/ngÃ y (__CHENH_PCT__ so vá»›i ThÃ¡ng 8).</p>

  <div class="cards">
    <div class="card"><b>__TB_LAST__</b><span>TB/ngÃ y Ká»³ T9 (12 ngÃ y)</span></div>
    <div class="card green"><b>__N_TANG__</b><span>KH tÄƒng so vá»›i T8</span></div>
    <div class="card red"><b>__N_GIAM__</b><span>KH giáº£m so vá»›i T8</span></div>
    <div class="card yellow"><b>__N_DUNG__</b><span>KH khÃ´ng Ä‘á»•i</span></div>
  </div>

  <div class="chart-box">
    <h3>ðŸ“Š Tá»•ng sáº£n lÆ°á»£ng (Kg) theo ká»³</h3>
    <div id="chartTong"></div>
  </div>

  <div class="chart-box">
    <h3>ðŸ“ˆ LÆ°á»£ng bÃ¡n trung bÃ¬nh ngÃ y (Kg/ngÃ y) theo ká»³</h3>
    <div id="chartTB"></div>
  </div>

  <div class="chart-box">
    <h3>ðŸ�† Top 15 khÃ¡ch hÃ ng theo TB/ngÃ y Ká»³ T9 (Kg/ngÃ y)</h3>
    <div id="chartTop"></div>
    <div class="legend"><span><i style="background:var(--xanhla)"></i>TÄƒng so T8</span><span><i style="background:var(--do)"></i>Giáº£m so T8</span></div>
  </div>
</section>

<!-- ==================== CHI TIáº¾T ==================== -->
<section id="chitiet">
  <h2 class="sec">Chi tiáº¿t tá»«ng khÃ¡ch hÃ ng (__N_KH__ KH)</h2>
  <p class="sub">Báº¥m tiÃªu Ä‘á»� cá»™t Ä‘á»ƒ sáº¯p xáº¿p. ChÃªnh lá»‡ch = TB/ngÃ y Ká»³ T9 so vá»›i ThÃ¡ng 8.</p>
  <div class="controls">
    <input type="text" id="khSearch" placeholder="ðŸ”� TÃ¬m mÃ£ KH, tÃªn khÃ¡ch hÃ ng...">
    <select id="khTrend"><option value="">Táº¥t cáº£ xu hÆ°á»›ng</option><option value="up">ðŸ“ˆ TÄƒng</option><option value="down">ðŸ“‰ Giáº£m</option><option value="flat">âž– KhÃ´ng Ä‘á»•i</option></select>
    <select id="khMin"><option value="0">Táº¥t cáº£ TB/ngÃ y</option><option value="100">â‰¥ 100 Kg/ngÃ y</option><option value="300">â‰¥ 300 Kg/ngÃ y</option><option value="500">â‰¥ 500 Kg/ngÃ y</option><option value="1000">â‰¥ 1.000 Kg/ngÃ y</option></select>
    <button id="khReset" style="border:none;padding:9px 16px;border-radius:8px;font-size:13px;font-weight:700;cursor:pointer;background:#fff;border:1.5px solid var(--xanh);color:var(--xanh)">âŸ² Reset</button>
  </div>
  <div class="tbl-wrap">
    <table id="khTable">
      <thead><tr>
        <th data-k="stt">STT</th><th data-k="ma">MÃ£ KH</th><th data-k="ten">TÃªn khÃ¡ch hÃ ng</th>
        <th data-k="nm">NhÃ  mÃ¡y</th>
        <th data-k="t0" class="num">TB T1</th><th data-k="t1" class="num">TB T2</th><th data-k="t2" class="num">TB T3</th>
        <th data-k="t3" class="num">TB T4</th><th data-k="t4" class="num">TB T5</th><th data-k="t5" class="num">TB T6</th>
        <th data-k="t6" class="num">TB T7</th><th data-k="t7" class="num">TB T8</th><th data-k="t8" class="num">TB T9</th>
        <th data-k="chenh" class="num">ChÃªnh lá»‡ch</th><th data-k="pct" class="num">%</th>
      </tr></thead>
      <tbody></tbody>
    </table>
  </div>
  <p class="hint" id="khCount"></p>
</section>

<!-- ==================== TOP TÄ‚NG/GIáº¢M ==================== -->
<section id="top">
  <h2 class="sec">Top khÃ¡ch hÃ ng tÄƒng / giáº£m máº¡nh nháº¥t (Ká»³ T9 vs ThÃ¡ng 8)</h2>
  <p class="sub">Theo chÃªnh lá»‡ch TB/ngÃ y tuyá»‡t Ä‘á»‘i (Kg/ngÃ y).</p>

  <div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(320px,1fr));gap:16px">
    <div class="chart-box">
      <h3 style="color:var(--xanhla)">ðŸš€ Top 10 khÃ¡ch hÃ ng tÄƒng máº¡nh nháº¥t</h3>
      <div id="topUp"></div>
    </div>
    <div class="chart-box">
      <h3 style="color:var(--do)">ðŸ”» Top 10 khÃ¡ch hÃ ng sá»¥t giáº£m nhiá»�u nháº¥t</h3>
      <div id="topDown"></div>
    </div>
  </div>
</section>

<!-- ==================== SO SÃ�NH ==================== -->
<section id="sosanh">
  <h2 class="sec">So sÃ¡nh trá»±c tiáº¿p 2 khÃ¡ch hÃ ng</h2>
  <p class="sub">Ä�á»‘i chiáº¿u xu hÆ°á»›ng sáº£n lÆ°á»£ng trung bÃ¬nh ngÃ y qua cÃ¡c ká»³ giá»¯a 2 Ä‘Æ¡n vá»‹.</p>
  <div class="controls">
    <label>KhÃ¡ch hÃ ng A:</label>
    <select id="cmpA"><option value="">-- Chá»�n khÃ¡ch hÃ ng A --</option></select>
    <label>KhÃ¡ch hÃ ng B:</label>
    <select id="cmpB"><option value="">-- Chá»�n khÃ¡ch hÃ ng B --</option></select>
    <button id="cmpGo" style="border:none;padding:9px 18px;border-radius:8px;font-size:13px;font-weight:700;cursor:pointer;background:var(--xanh);color:#fff">Ä�á»‘i chiáº¿u</button>
  </div>
  <div id="cmpResult" style="display:none;margin-top:14px"></div>
</section>

</div>

<footer>
  <div class="wrap">
    <p><b>BÃ�O CÃ�O PHÃ‚N TÃ�CH MUA HÃ€NG â€” CÃ”NG TY TNHH SXâ€“TM HÃ“A KEO BÃŒNH THáº NH</b></p>
    <p class="src">Nguá»“n dá»¯ liá»‡u: BAO_CAO_SO_SANH_MUA_HANG_T9.docx Â· Cáº­p nháº­t tá»± Ä‘á»™ng ngÃ y 14/09/2026</p>
  </div>
</footer>

<script>
const KH = __KH__;
const MONTHS = __MONTHS__;
const TONG = __TONG__;
const TBARR = __TBARR__;
const DAYS = __DAYS__;

const num = n => n == null ? '-' : Number(n).toLocaleString('vi-VN');
const fmtPct = p => (p>0?'+':'') + p.toFixed(1) + '%';
const esc = s => String(s||'').replace(/&/g,'&amp;').replace(/</g,'&lt;').replace(/>/g,'&gt;').replace(/"/g,'&quot;');

// Tabs
document.querySelectorAll('nav button').forEach(btn => {
  btn.addEventListener('click', () => {
    document.querySelectorAll('nav button').forEach(b => b.classList.remove('on'));
    document.querySelectorAll('section').forEach(s => s.classList.remove('on'));
    btn.classList.add('on');
    document.getElementById(btn.dataset.tab).classList.add('on');
    if (btn.dataset.tab === 'sosanh') fillCmp();
  });
});

// Render Tá»•ng Sáº£n LÆ°á»£ng
(()=>{
  const max = Math.max(...TONG);
  document.getElementById('chartTong').innerHTML = MONTHS.map((m, i) => `
    <div class="bar-row">
      <div class="lbl">${m} (${DAYS[i]}N)</div>
      <div class="track"><div class="fill" style="width:${(TONG[i]/max*100).toFixed(1)}%">${num(TONG[i])} Kg</div></div>
      <div class="val">${num(TONG[i])}</div>
    </div>`).join('');
})();

// Render TB/ngÃ y
(()=>{
  const max = Math.max(...TBARR);
  document.getElementById('chartTB').innerHTML = MONTHS.map((m, i) => `
    <div class="bar-row">
      <div class="lbl">${m}</div>
      <div class="track"><div class="fill" style="width:${(TBARR[i]/max*100).toFixed(1)}%">${num(TBARR[i])} Kg/N</div></div>
      <div class="val">${num(TBARR[i])}</div>
    </div>`).join('');
})();

// Top 15 KH
(()=>{
  const top15 = [...KH].sort((a,b) => b.tb[b.tb.length-1] - a.tb[a.tb.length-1]).slice(0, 15);
  const max = top15[0].tb[top15[0].tb.length-1] || 1;
  document.getElementById('chartTop').innerHTML = top15.map(k => {
    const val = k.tb[k.tb.length-1];
    const cls = k.chenh > 0 ? 'green' : (k.chenh < 0 ? 'red' : '');
    return `<div class="bar-row">
      <div class="lbl" title="${esc(k.ten)}">${esc(k.ten)}</div>
      <div class="track"><div class="fill ${cls}" style="width:${(val/max*100).toFixed(1)}%">${num(val)}</div></div>
      <div class="val">${num(val)}</div>
    </div>`;
  }).join('');
})();

// Table chi tiáº¿t
let sortKey = 'stt', sortAsc = true;
function diffHtml(d, pct){
  if (d > 0) return `<span class="pill duong">+${num(d)} (+${pct.toFixed(1)}%)</span>`;
  if (d < 0) return `<span class="pill do">${num(d)} (${pct.toFixed(1)}%)</span>`;
  return `<span class="pill xam">0 (0.0%)</span>`;
}

function renderTable(){
  const q = document.getElementById('khSearch').value.toLowerCase().trim();
  const tr = document.getElementById('khTrend').value;
  const min = Number(document.getElementById('khMin').value) || 0;

  let list = KH.filter(k => {
    const lastTb = k.tb[k.tb.length-1];
    if (min > 0 && lastTb < min) return false;
    if (tr === 'up' && k.chenh <= 0) return false;
    if (tr === 'down' && k.chenh >= 0) return false;
    if (tr === 'flat' && k.chenh !== 0) return false;
    if (q && !k.ma.toLowerCase().includes(q) && !k.ten.toLowerCase().includes(q) && !(k.nm||'').toLowerCase().includes(q)) return false;
    return true;
  });

  list.sort((a, b) => {
    let va = a[sortKey], vb = b[sortKey];
    if (sortKey.startsWith('t') && sortKey.length <= 3) {
      const idx = Number(sortKey.slice(1));
      va = a.tb[idx] || 0; vb = b.tb[idx] || 0;
    }
    if (typeof va === 'string') return sortAsc ? va.localeCompare(vb, 'vi') : vb.localeCompare(va, 'vi');
    return sortAsc ? (va - vb) : (vb - va);
  });

  const tbody = document.querySelector('#khTable tbody');
  tbody.innerHTML = list.map(k => `
    <tr>
      <td>${k.stt}</td><td><b>${esc(k.ma)}</b></td><td title="${esc(k.ten)}">${esc(k.ten)}</td>
      <td>${k.nm ? esc(k.nm) : "â€”"}</td>
      ${k.tb.map(v => `<td class="num">${v ? num(v) : '-'}</td>`).join('')}
      <td class="num ${k.chenh>0?'diff-up':(k.chenh<0?'diff-down':'diff-zero')}">${k.chenh>0?'+':''}${num(k.chenh)}</td>
      <td class="num">${diffHtml(k.chenh, k.pct)}</td>
    </tr>`).join('');

  document.getElementById('khCount').textContent = `Hiá»ƒn thá»‹ ${list.length} / ${KH.length} khÃ¡ch hÃ ng`;
}

document.querySelectorAll('#khTable thead th').forEach(th => {
  th.addEventListener('click', () => {
    const k = th.dataset.k;
    if (sortKey === k) sortAsc = !sortAsc;
    else { sortKey = k; sortAsc = (k === 'ten' || k === 'ma' || k === 'stt'); }
    document.querySelectorAll('#khTable thead th').forEach(h => h.classList.remove('asc','desc'));
    th.classList.add(sortAsc ? 'asc' : 'desc');
    renderTable();
  });
});

['khSearch','khTrend','khMin'].forEach(id => {
  document.getElementById(id).addEventListener('input', renderTable);
});
document.getElementById('khReset').addEventListener('click', () => {
  document.getElementById('khSearch').value = '';
  document.getElementById('khTrend').value = '';
  document.getElementById('khMin').value = '0';
  renderTable();
});
renderTable();

// Top TÄƒng / Giáº£m
(()=>{
  const up = [...KH].filter(k => k.chenh > 0).sort((a, b) => b.chenh - a.chenh).slice(0, 10);
  const down = [...KH].filter(k => k.chenh < 0).sort((a, b) => a.chenh - b.chenh).slice(0, 10);
  const maxU = Math.max(...up.map(k => k.chenh), 1);
  const maxD = Math.max(...down.map(k => -k.chenh), 1);

  document.getElementById('topUp').innerHTML = up.map(k => `
    <div class="bar-row"><div class="lbl" title="${esc(k.ten)}">${esc(k.ten)}</div>
    <div class="track"><div class="fill green" style="width:${(k.chenh/maxU*100).toFixed(1)}%">+${num(k.chenh)}</div></div>
    <div class="val">${fmtPct(k.pct)}</div></div>`).join('');

  document.getElementById('topDown').innerHTML = down.map(k => `
    <div class="bar-row"><div class="lbl" title="${esc(k.ten)}">${esc(k.ten)}</div>
    <div class="track"><div class="fill red" style="width:${(-k.chenh/maxD*100).toFixed(1)}%">${num(k.chenh)}</div></div>
    <div class="val">${fmtPct(k.pct)}</div></div>`).join('');
})();

// So sÃ¡nh
function fillCmp(){
  const opts = [...KH].sort((a, b) => a.ten.localeCompare(b.ten, 'vi')).map(k => `<option value="${k.stt}">${esc(k.ten)} (${esc(k.ma)})${k.nm ? " Â· NM " + esc(k.nm) : ""}</option>`).join('');
  ['cmpA','cmpB'].forEach(id => {
    const sel = document.getElementById(id);
    if (sel.options.length < 2) sel.innerHTML = opts;
  });
}

document.getElementById('cmpGo').addEventListener('click', () => {
  const a = KH.find(k => k.stt == Number(document.getElementById('cmpA').value));
  const b = KH.find(k => k.stt == Number(document.getElementById('cmpB').value));
  if (!a || !b) {
    document.getElementById('cmpResult').innerHTML = '<p class="hint">âš ï¸� Vui lÃ²ng chá»�n Ä‘á»§ 2 khÃ¡ch hÃ ng.</p>';
    document.getElementById('cmpResult').style.display = 'block';
    return;
  }
  const max = Math.max(...a.tb, ...b.tb, 1);
  const card = k => `
    <div style="flex:1;min-width:300px;background:#f8fafc;border-radius:10px;padding:14px;border:1px solid #e3e8ef">
      <h4 style="color:var(--xanh);margin-bottom:8px;font-size:13.5px">${esc(k.ten)} <span style="color:#8a94a6;font-weight:400">(${esc(k.ma)})</span></h4>
      ${k.nm ? `<p style="font-size:12px;color:#8a94a6;margin:-4px 0 8px">NhÃ  mÃ¡y: <b style="color:#2E5E9E">${esc(k.nm)}</b></p>` : ""}
      ${MONTHS.map((m, i) => `
        <div class="bar-row" style="margin:3px 0"><div class="lbl" style="width:74px;font-size:11px">${m}</div>
        <div class="track" style="height:16px"><div class="fill" style="width:${(k.tb[i]/max*100).toFixed(1)}%;font-size:10px;min-width:26px">${num(k.tb[i])}</div></div>
        <div class="val" style="width:44px;font-size:11px">${num(k.tb[i])}</div></div>`).join('')}
      <p style="font-size:12px;margin-top:8px">TB/ngÃ y Ká»³ T9: <b style="color:var(--xanh)">${num(k.tb[k.tb.length-1])}</b> Kg/ngÃ y â€” ${diffHtml(k.chenh, k.pct)}</p>
    </div>`;
  document.getElementById('cmpResult').innerHTML = `<div style="display:flex;gap:14px;flex-wrap:wrap">${card(a)}${card(b)}</div>`;
  document.getElementById('cmpResult').style.display = 'block';
});
</script>
</body>
</html>
Ú__KY__Ú__N_KH__Ú__TONG_LAST__Ú__TB_LAST__Ú	__CHENH__Ú__CHENH_PCT__Ú
__N_TANG__Ú
__N_GIAM__Ú
__N_DUNG__Ú__KH__F)Úensure_asciiÚ__DAYS__Ú
__MONTHS__Ú__TONG__Ú	__TBARR__Úwzutf-8)ÚencodingzSAVED:zSize:Úchars)VÚ__doc__ÚjsonÚreÚosÚdocxr   ÚpathÚdirnameÚabspathÚ__file__ÚBASEÚjoinÚSRCÚOUTr   ÚdocÚtablesÚt0Út1ÚperiÚrowsrE   r:   ÚlenÚpct_valÚappendÚdictÚtong_arrÚtb_arrÚngay_arrÚ	last_daysÚKYÚMONTHSÚkhÚnum_periodsÚtb_cols_startÚtb_cols_endÚdetail_expectedr@   rA   r"   ÚupperÚ
startswithÚranger%   rB   Úpct_strr   r   r
   r&   r   r   Úisdigitr   Úsqlite3ÚDBPÚconnectÚ_cÚexecuteÚ_tenÚlistÚ_alsÚ_ganrL   ÚupÚnidÚalÚaÚgetÚcloseÚprintÚ	ExceptionÚeÚsumÚn_tangÚn_giamÚn_dungÚch_t9Úpct_t9Úhtmlr	   ÚdumpsÚopenÚfÚwriter   r   r   ú<module>r©      s	  ððAð Að Ð Ð Ð Ð Ð Ð Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à	„w‡‚�r”w—’ xÑ0Ô0Ñ1Ô1€Ø„g‡l‚l�4Ð;Ñ<Ô<€Ø„g‡l‚l�4Ð6Ñ7Ô7€ð
ð 
ð 
ð €hˆs�m„m€Ø	Œ�AŒ˜œ
 1œ€€€Bð 
€Ø	Œ���Œð 6ð 6€AØ-Ð- Q¤WÐ-Ñ-Ô-€EØ�Œ8ð ØØ˜#˜e™*œ* qš.˜.ˆe�AŒhˆh¸3¸3¸u¹:¼:Èº>¸>¨u°Q¬x¨xÈr€GØ‡K‚K��˜˜qœ¨¨¨U°1¬X©¬¸T¸TÀ%ÈÄ(¹^¼^Ø˜˜U 1œX™œ¨Gð5ñ 5ô 5ñ 6ô 6ð 6ð 6ð %Ð$˜tÐ$Ñ$Ô$€Ø	 Ð	 ˜4Ð	 Ñ	 Ô	 €Ø$Ð$˜tÐ$Ñ$Ô$€à$Ð,ˆH�RŒLˆL¨"€	ØB�9ÐBÐB¨9ÐBÐBÐBÐB€Ø
ˆt�D˜˜d 4¨¨TÐ3L¸)Ð3LÐ3LÐ3LÐ	M€ð €Øˆc�$‰iŒi€Ø€Ø�+‰o€à	Œ���Œð 1ñ 1€AØ-Ð- Q¤WÐ-Ñ-Ô-€EØ
€sˆ5�z„z¨¨K©¸!Ñ(;Ð;�_Ò<Ð<ØØ˜”8˜U 1œX u¨Q¤x€L€CˆˆSØð �Sð ˜CŸIšI™KœK×2Ò2°?ÑCÔCð ØØ	DÐ	D % %¨°{Ñ"CÔ"CÐ	DÑ	DÔ	D€BØ	,Ð	,¨Ð	,Ñ	,Ô	,€BØˆD��{Ô#Ñ$Ô$Ð)¨€EØ�K !‘OÔ$€GðØˆe�G—O’O C¨Ñ,Ô,×4Ò4°S¸"Ñ=Ô=×CÒCÑEÔEÑFÔFˆˆøØ˜	Ð"ð ð ð Øˆˆˆðøøøà‡I‚Iˆdˆd 3§;¢;¡=¤=Ð?�s�s˜3‘x”x�x°c°c¸"±g´g¸a±iÀBÈCØ ¨3ð0ñ 0ô 0ñ 1ô 1ð 1ñ 1ð €€€Ø1€ð*Ø	ˆŒÐ. Ð.Ð.Ð.°DÐ	9Ñ	9Ô	9€BØJÐJ §
¢
Ð+HÑ IÔ IÐJÑJÔJ€DØˆ4�—
’
ÐHÑIÔIÑJÔJ€DØ€DØð 	ð 	ˆØˆuŒX�^Š^ÑÔˆØð 	ð 	‰GˆC�Ø��r× Ò Ñ"Ô"×(Ò(Ñ*Ô*ˆAØˆs�1‰vŒv˜ŠzˆzØØ�A�d”G—M’M‘O”OÒ#Ð#¨¨¨A©¬°!ª¨¸¸R¸¸ØŸ(š( 3¨Ñ+Ô+��$‘Ø˜‘	�Ø�øøØ‡H‚H�J„J€JØ	€EÐ
˜T <Ñ0Ô0Ð0Ð0øØð *ð *ð *Ø	€EÐ
% qÑ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)øøøøð*øøøð 
ˆÐ-Ð-˜Ð-Ñ-Ô-Ñ	-Ô	-€Ø	ˆÐ-Ð-˜Ð-Ñ-Ô-Ñ	-Ô	-€Ø	ˆÐ.Ð.˜Ð.Ñ.Ô.Ñ	.Ô	.€àˆrŒ
�V˜B”ZÑ€Ø'-¨b¤zÐ	8ˆ%�&˜”*Ñ
˜sÑ
"Ð
"°q€à €€eˆSˆS�‰WŒW�i ¨°F¸IÀvÑ NÔ NÐ NØ €€m˜ œÐ(Ð(¨/¸fÀR¼jÐ;LÐ;LÐN^ÐchÐ`~Ð`~Ð`~ÐouÐ`~Ð`~Ð`~Ð`~Ñ Ô Ð ðE€ðN ‡|‚|�H˜bÑ!Ô!€Ø‡|‚|�J   C C¨¡G¤G¡¤Ñ-Ô-€Ø‡|‚|�O¨°¬Ð%8Ð%8Ñ9Ô9€Ø‡|‚|�M f¨R¤jÐ#4Ð#4Ñ5Ô5€Ø‡|‚|�K EÐ!?Ð!?Ð!?°Ð!?Ð!?Ð!?Ð!?Ñ@Ô@€Ø‡|‚|�O¨Ð%6Ð%6Ð%6Ð%6Ñ7Ô7€Ø‡|‚|�L # # f¡+¤+Ñ.Ô.€Ø‡|‚|�L # # f¡+¤+Ñ.Ô.€Ø‡|‚|�L # # f¡+¤+Ñ.Ô.€Ø‡|‚|�H˜j˜dœj¨¸%Ð@Ñ@Ô@ÑAÔA€Ø‡|‚|�J 
 ¤
¨8Ñ 4Ô 4Ñ5Ô5€Ø‡|‚|�L * $¤*¨VÀ%Ð"HÑ"HÔ"HÑIÔI€Ø‡|‚|�J 
 ¤
¨8Ñ 4Ô 4Ñ5Ô5€Ø‡|‚|�K  ¤¨FÑ!3Ô!3Ñ4Ô4€à	€Tˆ#ˆs˜WÐ%Ñ%Ô%ð ¨Ø‡G‚GˆD�M„M€Mðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð à €€h�Ñ Ô Ð Ø €€gˆsˆs�4‰yŒy˜'Ñ "Ô "Ð "Ð "Ð "s>   É8AJ>Ê>	K
Ë	K
Ì%D&Q ÑQ'ÑQ"Ñ"Q'Û,\Ü\Ü\