§
    2™§júi  ã                   óà  — d Z ddlZddlZddlZddlZddlZddlZddlZdZg d¢Z	d„ Z
d„ Zd„ Zd„ Zd	„ Zd
Zedk    �r1 ej        ¦   «         Ze                     d¦  «         e                     dd¬¦  «         e                     ¦   «         Zej        pOej                             ej                             ej                             ej        ¦  «        ¦  «        d¦  «        Z eej        e¦  «        Z eded         › ded         › ded         › �¦  «          eded         d›ded         d›ded         d›ded         d ›d!�	¦  «          ed"ed#         d$ed%         d&›d'�¦  «         dS dS )(uó  BÃ�O CÃ�O HTML MUA HÃ€NG â€” Ä‘á»�c TRá»°C TIáº¾P tá»« Báº¢NG TÃ�NH Excel Ä‘Ã£ lÃ m sáº¡ch.

NguyÃªn táº¯c (chá»‘t 14/09/2026):
  * Nguá»“n dá»¯ liá»‡u = báº£ng tÃ­nh Excel `MUA_HANG_*_DA-LAM-SACH_SO-SANH.xlsx` (KHÃ”NG qua DOCX trung gian).
  * Tá»± nháº­n diá»‡n sá»‘ ká»³: cÃ¡c cá»™t "ThÃ¡ng NN 2026 (Khá»‘i lÆ°á»£ng Kg)" + cá»™t ká»³ Ä‘ang cháº¡y "Tá»« 1->N ThÃ¡ng MM 2026".
  * Sá»‘ ngÃ y má»—i ká»³: theo thÃ¡ng dÆ°Æ¡ng lá»‹ch (2026: T2=28); ká»³ Ä‘ang cháº¡y láº¥y N tá»« header.
  * Gáº¯n NHÃ€ MÃ�Y cho tá»«ng khÃ¡ch: join báº£ng `nha_may_alias` trong CSDL btchem.db (CRMG = Trendworld; má»�i cÃ¡ch viáº¿t
    sai nhÆ° Trendwood/Trenwood/TRENWORD Ä‘á»�u quy vá»� Trendworld).

DÃ¹ng:  python build_muahang_portal.py <file.xlsx> [--out <file.html>]
é    Nz(C:\c\deepseek-harness\claw2-db\btchem.db)é   é   r   é   r   r   r   r   r   r   r   r   c                 óh  — | €d S t          | t          t          f¦  «        rt          | ¦  «        S t          | ¦  «                             ¦   «                              dd¦  «                             dd¦  «                             dd¦  «        }|dv rd S 	 t          |¦  «        S # t          $ r Y d S w xY w)Nú,Ú ú+ú%)r   Ú-u   â€”)Ú
isinstanceÚintÚfloatÚstrÚstripÚreplaceÚ
ValueError)ÚvÚss     úOC:\Claw 2\Bao cao - Hanh chinh\bao cao mua hang\Bao_cao\build_muahang_portal.pyÚnumr      s³   € Ø€yØˆtÝ�!•c�5�\Ñ"Ô"ð Ý�Q‰xŒxˆÝˆA‰Œ�Š‰Œ×Ò˜s BÑ'Ô'×/Ò/°°RÑ8Ô8×@Ò@ÀÀbÑIÔI€AØÐÐÐØˆtðÝ�Q‰xŒxˆøÝð ð ð Øˆtˆtðøøøs   ÂB# Â#
B1Â0B1c                 ó�  — g g }}d\  }}}}}t          | ¦  «        D �]¢\  }}	t          |	pd¦  «                             ¦   «         }
t          j        d|
t          j        ¦  «        }|r[t          |                     d¦  «        ¦  «        }|                     |¦  «         |                     t          |dz
           ¦  «         Œ¦t          j        d|
t          j        ¦  «        }|rL|                     |¦  «         |                     t          |                     d¦  «        ¦  «        ¦  «         �Œt          j        d|
t          j        ¦  «        r|}�Œ8t          j        d|
t          j        ¦  «        r|}�Œ\t          j        d|
t          j        ¦  «        r|}�Œ€t          j        d	|
t          j        ¦  «        r|}�Œ¤||||||fS )
uJ   Tráº£ vá»� (cot_ky, ngay_ky, cot_tb_truoc, cot_tb_ky, cot_chenh, cot_pct).)NNNNNr   u#   ThÃ¡ng\s*(\d{1,2})\s*\d{0,4}\s*\(Khé   u*   Tá»«\s*1\s*->\s*(\d+)\s*ThÃ¡ng\s*(\d{1,2})u   TB NgÃ y ThÃ¡ng TrÆ°á»›cu   TB NgÃ y ThÃ¡ngu   ChÃªnh Lá»‡ch \(Kgu   ChÃªnh Lá»‡ch \(%\))
Ú	enumerater   r   ÚreÚmatchÚIr   ÚgroupÚappendÚ
NGAY_THANG)ÚhdrÚcot_kyÚngay_kyÚctÚcttÚctkÚccÚcpÚiÚhÚtÚmÚthangs                r   Úparse_headerr-   "   s‘  € à˜"ˆG€FØ7Ñ€BˆˆS�"�bÝ˜#‘”ð ?ñ ?‰ˆˆ1Ý���R‰LŒL×ÒÑ Ô ˆÝŒHÐ;¸QÅÄÑEÔEˆØð 	Ý˜Ÿš ™
œ
‘O”OˆEØ�MŠM˜!ÑÔÐ˜gŸnšn­Z¸À¹	Ô-BÑCÔCÐCØÝŒHÐBÀAÅrÄtÑLÔLˆØð 	Ø�MŠM˜!ÑÔÐ˜gŸnšn­S°·²¸±´©_¬_Ñ=Ô=Ð=ÙÝŒ8Ð/°µB´DÑ9Ô9ð 	?À¸2¹2ÝŒXÐ(¨!­R¬TÑ2Ô2ð 	?¸!°C±CÝŒXÐ+¨Qµ´Ñ5Ô5ð 	?¸A°r±rÝŒXÐ,¨aµ´Ñ6Ô6Ð>¸Q¸ùØ�7˜B  R¨Ð+Ð+ó    c                 ó’  ‡‡‡‡— t          j        | d¬¦  «        j        d         }t          |                     d¬¦  «        ¦  «        }t          d„ t          |¦  «        D ¦   «         ¦  «        }||         }t          |¦  «        \  }Š}}}}	t          |¦  «        }
t          t          j        dt          ||d                  ¦  «        ¦  «        pddgd         ¦  «        pd	}g d c}Š||dz   d …         D �]Št          ‰d         pd
¦  «                             ¦   «         t          ‰d         pd
¦  «                             ¦   «         }}|                     ¦   «                              d¦  «        r‰ŠŒ|r|sŒ„ˆfd„|D ¦   «         }g }t          |¦  «        D ]¦\  }}||
dz
  k    rT|�R|                     t#          ‰|         ¦  «        p(‰|         rt%          ||         ‰|         z  d¦  «        nd¦  «         Œb|                     ‰|         r'||         rt%          ||         ‰|         z  d¦  «        nd¦  «         Œ§|	�Dt          ‰|	         pd
¦  «                             d¦  «        st#          ‰|	         ¦  «        pddz  nt#          ‰|	         ¦  «        pd}|                     t)          t          |r‰d         pt          |¦  «        dz   ¦  «        ||||�t#          ‰|         ¦  «        pdnd|¬¦  «        ¦  «         �Œ‰€t+          d¦  «        ‚ˆfd„|D ¦   «         Šˆˆfd„t-          |
¦  «        D ¦   «         }|‰‰|||
fS )NT)Ú	data_onlyr   )Úvalues_onlyc              3   ó¢   K  — | ]J\  }}|¯t          |d          pd¦  «                             ¦   «                              ¦   «         dk    ¯F|V — ŒKdS )r   r   ÚsttN)r   r   Úlower)Ú.0r(   Úrs      r   ú	<genexpr>zload.<locals>.<genexpr>;   s\   è è € Ð^Ð^‘D�A�q¨qÐ^µS¸¸1¼¸À±_´_×5JÒ5JÑ5LÔ5L×5RÒ5RÑ5TÔ5TÐX]Ò5]Ð5]ˆaÐ5]Ð5]Ð5]Ð5]Ð^Ð^r.   u   ThÃ¡ng\s*(\d{1,2})éÿÿÿÿr   é	   r   é   u   Tá»”NG Cá»˜NGc                 ó>   •— g | ]}t          ‰|         ¦  «        pd ‘ŒS ©r   ©r   )r5   Úcr6   s     €r   ú
<listcomp>zload.<locals>.<listcomp>H   s'   ø€ Ð/Ð/Ð/ 1•�A�a”D‘	”	�˜QÐ/Ð/Ð/r.   r
   éd   )r3   ÚmaÚtenÚtbÚchenhÚpctu9   KhÃ´ng tÃ¬m tháº¥y dÃ²ng Tá»•ng cá»™ng trong báº£ng tÃ­nhc                 ó>   •— g | ]}t          ‰|         ¦  «        pd ‘ŒS r<   r=   )r5   r>   Útots     €r   r?   zload.<locals>.<listcomp>T   s(   ø€ Ð1Ð1Ð1 Q•�C˜”F‘”Ð ˜qÐ1Ð1Ð1r.   c                 ób   •— g | ]+}‰|         rt          ‰|         ‰|         z  d ¦  «        nd ‘Œ,S r<   )Úround)r5   r(   r"   Útong_arrs     €€r   r?   zload.<locals>.<listcomp>U   s>   ø€ ÐZÐZÐZÈ!°G¸A´JÐE�e�H˜Q”K '¨!¤*Ñ,¨aÑ0Ô0Ð0ÀAÐZÐZÐZr.   )ÚopenpyxlÚload_workbookÚ
worksheetsÚlistÚ	iter_rowsÚnextr   r-   Úlenr   r   Úsearchr   r   ÚupperÚ
startswithr   r   rI   ÚendswithÚdictÚ
SystemExitÚrange)ÚpathÚwsÚrowsÚhir    r!   r#   r%   r&   r'   ÚnkyÚthang_kyÚkhrA   rB   ÚtongrC   r(   r>   rE   Útb_arrr"   r6   rJ   rG   s                        @@@@r   Úloadrb   8   sw  øøøø€ Ý	Ô	 °Ð	5Ñ	5Ô	5Ô	@ÀÔ	C€BÝ�—’¨�Ñ.Ô.Ñ/Ô/€DÝ	Ð^Ð^�I d™OœOÐ^Ñ^Ô^Ñ	^Ô	^€BØ
ˆrŒ(€CÝ'3°CÑ'8Ô'8Ñ$€FˆG�R˜˜b "Ý
ˆf‰+Œ+€CÝ•B”IÐ3µS¸¸VÀB¼Z¼Ñ5IÔ5IÑJÔJÐTÈqÐRSÈfÐVWÔXÑYÔYÐ^Ð]^€Hà�$€G€BˆØ�"�q‘&�'�'Œ]ð Qñ QˆÝ�a˜”d�j˜b‘/”/×'Ò'Ñ)Ô)­3¨q°¬t¨z°r©?¬?×+@Ò+@Ñ+BÔ+BˆCˆØ�9Š9‰;Œ;×!Ò! /Ñ2Ô2ð 	ØˆC�XØð 	˜ð 	ØØ/Ð/Ð/Ð/¨Ð/Ñ/Ô/ˆØˆÝ˜fÑ%Ô%ð 	[ð 	[‰DˆAˆqØ�C˜!‘GŠ|ˆ|  Ø—	’	�#˜a œf™+œ+Ð^ÈGÐTUÌJÐ*]­%°°Q´¸'À!¼*Ñ0DÀaÑ*HÔ*HÐ*HÐ\]Ñ_Ô_Ð_Ð_à—	’	¸GÀA¼JÐYÈ4ÐPQÌ7ÐY�%  Q¤¨'°!¬*Ñ 4°aÑ8Ô8Ð8ÐXYÑZÔZÐZÐZØ)+¨ÅÀAÀbÄEÀKÈRÑ@PÔ@P×@YÒ@YÐZ]Ñ@^Ô@^¨�s�1�R”5‰zŒzˆ˜Q #Ñ%Ð%ÕehÐijÐkmÔinÑeoÔeoÐetÐstˆØ
�	Š	•$�3˜r˜{ a¨¤dÐ9­c°"©g¬g¸©kÑ:Ô:¸rÀsÈrØ02°�S  2¤™ZœZ˜_¨1øÀAÈ3ðPñ Pô Pñ 	Qô 	Qð 	Qñ 	Qà
€{ÝÐTÑUÔUÐUØ1Ð1Ð1Ð1¨&Ð1Ñ1Ô1€HØZÐZÐZÐZÐZÍuÐUXÉzÌzÐZÑZÔZ€FØˆx˜ &¨(°CÐ7Ð7r.   c                 ó¶  — 	 t          j        dt          › d�d¬¦  «        }d„ |                     d¦  «        D ¦   «         }t	          |                     d¦  «        ¦  «        }|                     ¦   «          n(# t          $ r}t          d|¦  «         Y d	}~d
S d	}~ww xY wd
}| D ]µ}|d                              ¦   «         }|D ]–\  }}	|	pd 	                    ¦   «                              ¦   «         }
t          |
¦  «        dk     rŒA|
|d                              ¦   «         k    st          |
¦  «        dk    r$|
|v r |                     |d¦  «        |d<   |dz  } nŒ—Œ¶|S )uq   Gáº¯n tÃªn nhÃ  mÃ¡y cho khÃ¡ch: khá»›p mÃ£ KH hoáº·c tÃªn phÃ¡p nhÃ¢n vá»›i báº£ng alias (1 nguá»“n duy nháº¥t).zfile:z?mode=roT)Úuric                 ó,   — i | ]}|d          |d         “ŒS )r   r   © )r5   r6   s     r   ú
<dictcomp>zgan_nha_may.<locals>.<dictcomp>]   s"   € ÐOÐOÐO �!�A”$˜˜!œÐOÐOÐOr.   zSELECT id, ten FROM nha_mayz+SELECT nha_may_id, alias FROM nha_may_aliasu4   ! KhÃ´ng Ä‘á»�c Ä‘Æ°á»£c CSDL Ä‘á»ƒ gáº¯n nhÃ  mÃ¡y:Nr   rB   r   é   rA   é   Únmr   )Úsqlite3ÚconnectÚDBPÚexecuterN   ÚcloseÚ	ExceptionÚprintrS   r   rQ   Úget)r_   r>   Úten_nmÚalsÚeÚnÚkÚupÚnidÚalÚas              r   Úgan_nha_mayr|   Y   su  € ðÝŒOÐ1¥CÐ1Ð1Ð1°tÐ<Ñ<Ô<ˆØOÐO a§i¢iÐ0MÑ&NÔ&NÐOÑOÔOˆÝ�1—9’9ÐJÑKÔKÑLÔLˆØ	�Š‰	Œ	ˆ	ˆ	øÝð ð ð ÝÐDÀaÑHÔHÐHØˆqˆqˆqˆqˆqøøøøðøøøð 	
€AØð 	ð 	ˆØˆuŒX�^Š^ÑÔˆØð 	ð 	‰GˆC�Ø��r× Ò Ñ"Ô"×(Ò(Ñ*Ô*ˆAÝ�1‰vŒv˜ŠzˆzØØ�A�d”G—M’M‘O”OÒ#Ð#­¨A©¬°!ª¨¸¸R¸¸Ø Ÿ*š* S¨"Ñ-Ô-��$‘Ø�Q‘�Ø�øøØ€Hs   ‚A4A7 Á7
BÂBÂBc                 óÄ  — t          | ¦  «        \  }}}}}}t          |¦  «        }t          d„ |D ¦   «         ¦  «        }	t          d„ |D ¦   «         ¦  «        }
t          d„ |D ¦   «         ¦  «        }|d         |d         z
  }|d         r||d         z  dz  nd}d„ t          |d	z
  ¦  «        D ¦   «         d
|› d|d         › d�gz   }d|› d|d         › d|d›d|d         d›d|d›d�}t          }|                     d|¦  «        }|                     dt          t          |¦  «        ¦  «        ¦  «        }|                     d|d         d›¦  «        }|                     d|d         d›¦  «        }|                     d|d›d|d›d�¦  «        }|                     d|d›d�¦  «        }|                     dt          |	¦  «        ¦  «        }|                     d t          |
¦  «        ¦  «        }|                     d!t          |¦  «        ¦  «        }|                     d"t          j	        |d#¬$¦  «        ¦  «        }|                     d%t          j	        |¦  «        ¦  «        }|                     d&t          j	        |d#¬$¦  «        ¦  «        }|                     d't          j	        |¦  «        ¦  «        }|                     d(t          j	        |¦  «        ¦  «        }t          |d)d*¬+¦  «        5 }|                     |¦  «         d d d ¦  «         n# 1 swxY w Y   t          t          |¦  «        ||d         |d         ||||t          |¦  «        |d         ¬,¦
  «
        S )-Nc              3   ó2   K  — | ]}|d          dk    ¯dV — ŒdS ©rD   r   r   Nrf   ©r5   rw   s     r   r7   zbuild.<locals>.<genexpr>t   ó*   è è € Ð1Ð1�q ! G¤*¨q¢. .� . . . .Ð1Ð1r.   c              3   ó2   K  — | ]}|d          dk     ¯dV — ŒdS r   rf   r€   s     r   r7   zbuild.<locals>.<genexpr>u   r�   r.   c              3   ó2   K  — | ]}|d          dk    ¯dV — ŒdS r   rf   r€   s     r   r7   zbuild.<locals>.<genexpr>v   s*   è è € Ð2Ð2�q ! G¤*°¢/ /� / / / /Ð2Ð2r.   r8   éþÿÿÿr@   r   c                 ó   — g | ]
}d |dz   › �‘ŒS )ÚTr   rf   )r5   r(   s     r   r?   zbuild.<locals>.<listcomp>y   s"   € Ð0Ð0Ð0˜Aˆi�!�A‘#ˆiˆiÐ0Ð0Ð0r.   r   r†   ú (u    ngÃ y)u   Ká»³ Tz (1-z): 01/Ú02du    â†’ ú/z/2026Ú__KY__Ú__N_KH__Ú__TONG_LAST__ú,.0fÚ__TB_LAST__Ú	__CHENH__ú+,.0fú+.1fú%)Ú__CHENH_PCT__r
   Ú
__N_TANG__Ú
__N_GIAM__Ú
__N_DUNG__Ú__KH__F)Úensure_asciiÚ__DAYS__Ú
__MONTHS__Ú__TONG__Ú	__TBARR__Úwzutf-8)Úencoding)
r_   Únha_mayr`   rC   ÚchrE   ÚkyÚoutÚsizeÚngay)rb   r|   ÚsumrX   ÚTEMPLATEr   r   rQ   ÚjsonÚdumpsÚopenÚwriterV   )Úsrcr¢   r_   rJ   Úngay_arrra   r^   r]   Ún_nmÚn_tangÚn_giamÚn_dungr    rE   ÚMONTHSÚKYÚhtmlÚfs                     r   Úbuildrµ   q   s†  € Ý48¸±I´IÑ1€Bˆ�(˜F H¨cÝ�r‰?Œ?€DÝÐ1Ð1˜BÐ1Ñ1Ô1Ñ1Ô1€FÝÐ1Ð1˜BÐ1Ñ1Ô1Ñ1Ô1€FÝÐ2Ð2˜BÐ2Ñ2Ô2Ñ2Ô2€FØ	�Œ�f˜R”jÑ	 €BØ%+¨B¤ZÐ
6ˆ2��r”
‰?˜SÑ Ð °Q€CØ0Ð0¥ s¨Q¡w¡¤Ð0Ñ0Ô0Ð4Y¸Ð4YÐ4YÀHÈRÄLÐ4YÐ4YÐ4YÐ3ZÑZ€FØ	m�(Ð	mÐ	m ¨¤Ð	mÐ	m°HÐ	mÐ	mÐ	mÀxÐPRÄ|Ð	mÐ	mÐ	mÐZbÐ	mÐ	mÐ	mÐ	m€Bå€DØ�<Š<˜ "Ñ%Ô%€DØ�<Š<˜
¥C­¨B©¬¡L¤LÑ1Ô1€DØ�<Š<˜¨H°R¬LÐ)?Ð)?Ñ@Ô@€DØ�<Š<˜¨&°¬*Ð';Ð';Ñ<Ô<€DØ�<Š<˜¨Ð%@Ð%@Ð%@°CÐ%@Ð%@Ð%@Ð%@ÑAÔA€DØ�<Š<˜¨C¨¨¨¨Ñ8Ô8€DØ�<Š<˜¥c¨&¡k¤kÑ2Ô2€DØ�<Š<˜¥c¨&¡k¤kÑ2Ô2€DØ�<Š<˜¥c¨&¡k¤kÑ2Ô2€DØ�<Š<˜¥$¤*¨R¸eÐ"DÑ"DÔ"DÑEÔE€DØ�<Š<˜
¥D¤J¨xÑ$8Ô$8Ñ9Ô9€DØ�<Š<˜¥d¤j°ÀeÐ&LÑ&LÔ&LÑMÔM€DØ�<Š<˜
¥D¤J¨xÑ$8Ô$8Ñ9Ô9€DØ�<Š<˜¥T¤Z°Ñ%7Ô%7Ñ8Ô8€DÝ	ˆc�3 Ð	)Ñ	)Ô	)ð ¨QØ	�Š�‰Œˆðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð å•3�r‘7”7 D¨x¸¬|ÀÀrÄ
ÈrÐWZØ˜3¥S¨¡Y¤Y°X¸b´\ðCñ Cô Cð Cs   Ë0LÌLÌL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>
Ú__main__r«   z--out)ÚdefaultzBao_cao_MuaHang_portal.htmlzKH: r_   u    | gáº¯n nhÃ  mÃ¡y: rŸ   z | r¡   u   Tá»•ng r`   r�   z	 Kg | TB rC   u    Kg/ngÃ y | chÃªnh r    r�   r‡   rE   r‘   r’   zSAVED:r¢   ú(r£   r   z chars))Ú__doc__Úosr   Úsysr§   rk   ÚargparserK   rm   r   r   r-   rb   r|   rµ   r¦   Ú__name__ÚArgumentParserÚapÚadd_argumentÚ
parse_argsr{   r¢   rY   ÚjoinÚdirnameÚabspathr«   r6   rq   rf   r.   r   ú<module>rÅ      s3  ðð
ð 
ð ,Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ð +Ø €€€à1€Ø=Ð=Ð=€
ðð ð ð,ð ,ð ,ð,8ð 8ð 8ðBð ð ð0Cð Cð Cð@E€ðP ˆzÒÑØ	 ˆÔ	 Ñ	"Ô	"€BØ‡O‚O�EÑÔÐØ‡O‚O�G T€OÑ*Ô*Ð*Ø
�Š‰Œ€AØ
Œ%ð ?�2”7—<’< ¤§¢°´·²ÀÄÑ0FÔ0FÑ GÔ GØ =ñ?ô ?€CàˆˆaŒe�SÑÔ€AØ	€EÐ
H��4”Ð
HÐ
H¨a°	¬lÐ
HÐ
H¸qÀ¼wÐ
HÐ
HÑIÔIÐIØ	€EÐ
p�A�f”IÐ
pÐ
pÐ
p¨Q¨t¬WÐ
pÐ
pÐ
pÈaÐPTÌgÐ
pÐ
pÐ
pÐ_`ÐafÔ_gÐ
pÐ
pÐ
pÐ
pÑqÔqÐqØ	€Eˆ(�A�e”HÐ6 ! F¤)Ð6Ð6Ð6Ð6Ñ7Ô7Ð7Ð7Ð7ð Ðr.   