§
    _ ’j…  ã                  ó*  — d Z ddlmZ ddlZddlmZ ddlmZ ddlZddl	m
Z
 ddlmZ ddlmZ dd	lmZmZ  e
 e¦   «         ¦  «        Zd
diZ	 d$d%d„Zd&d„Zd&d„Zd&d„Zd&d„Zd&d„Zd&d„Zd&d„Zd&d„Zd&d„Zd&d„Zd„ Zd„ Z d„ Z!d „ Z"d&d!„Z#d&d"„Z$d#„ Z%dS )'z¤Unit & Integration Tests for Automated Drawing Takeoff & BoQ / WBS Engine.
Specialists: Quynh (QS & BoQ Takeoff), Hung (Site Engineering), Minh (Legal Norms 2026).
é    )ÚannotationsN©ÚDecimal)ÚPath©Ú
TestClient©ÚErpDatabaseClient)Ú
create_app)ÚDrawingTakeoffServiceÚget_drawing_takeoff_serviceÚAuthorizationzBearer dev-test-tokenúDWG_CONG_BEN_KEM.pdfÚtmp_pathr   ÚfilenameÚstrÚreturnc                ól  — | |z  }|j                              dd¬¦  «         t          j        ¦   «         }|                     dd¬¦  «        }|                     t          j        dddd¦  «        d	d
¬¦  «         |                     t          j        dd¦  «        ddd¬¦  «         |                     t          j        dd¦  «        ddd¬¦  «         |                     t          j        dd¦  «        dd¬¦  «         |                     t          j        dd¦  «        dd¬¦  «         |                     t          j        dd¦  «        dd¬¦  «         |                     t          j        dd¦  «        dd d!¬¦  «         | 	                    t          |¦  «        ¦  «         |                     ¦   «          |S )"z@Helper to generate a clean sample engineering CAD blueprint PDF.T)ÚparentsÚexist_okéJ  éS  ©ÚwidthÚheighté   i6  i?  )r   gš™™™™™Ù?gš™™™™™é?é   ©Úcolorr   é(   é<   u/   CÃ”NG TY TNHH XÃ‚Y Dá»°NG Ä�á»ŠNH SÆ N - DSConsé   )r   gš™™™™™É?g333333ã?)Úfontsizer   éZ   u=   Báº¢N Váº¼ CHI TIáº¾T: Cá»�NG Há»˜P Báº¾N KEM - KÃˆ Ä�A Ä�á»˜é   )r   r   r   éx   uU   ThÃ´ng sá»‘ thiáº¿t káº¿: DÃ i L=25.0m, Rá»™ng B=6.5m, Chiá»�u sÃ¢u há»‘ mÃ³ng H=2.2mé   ©r#   éŒ   u]   BÃª tÃ´ng lÃ³t Ä‘Ã¡y: MÃ¡c 100 Ä‘Ã¡ 4x6 dÃ y 10cm | BÃª tÃ´ng thÃ¢n cá»‘ng: MÃ¡c 300 Ä‘Ã¡ 1x2é    uK   Cá»‘t thÃ©p chá»‹u lá»±c: CB300-V D<=18mm | VÃ¡n khuÃ´n thÃ©p Ä‘á»‹nh hÃ¬nhé´   u*   Tá»· lá»‡: 1:100 | NgÃ y láº­p: 24/08/2026é
   )ç333333Ó?r-   r-   )ÚparentÚmkdirÚfitzÚopenÚnew_pageÚ	draw_rectÚRectÚinsert_textÚPointÚsaver   Úclose)r   r   Úpdf_pathÚdocÚpages        ú7C:\Projects\DSCons\tests\test_drawing_takeoff_engine.pyÚcreate_sample_drawing_pdfr=      sÞ  € ð ˜(Ñ"€HØ„O×Ò $°ÐÑ6Ô6Ð6Ý
Œ)‰+Œ+€CØ�<Š<˜c¨#ˆ<Ñ.Ô.€Dð 	‡N‚N•4”9˜R  S¨#Ñ.Ô.°mÈ1€NÑMÔMÐMØ×ÒÝŒ
�2�rÑÔØ9ØØð	 ñ ô ð ð 	×ÒÝŒ
�2�rÑÔØGØØð	 ñ ô ð ð 	×ÒÝŒ
�2�sÑÔØ_Øð ñ ô ð ð
 	×ÒÝŒ
�2�sÑÔØgØð ñ ô ð ð
 	×ÒÝŒ
�2�sÑÔØUØð ñ ô ð ð
 	×ÒÝŒ
�2�sÑÔØ4ØØð	 ñ ô ð ð ‡H‚H�S�‰]Œ]ÑÔÐØ‡I‚I�K„K€KØ€Oó    c                ó<  — t          | ¦  «        }t          ¦   «         }|                     |dd¬¦  «        }t          |¦  «        dk    sJ ‚d|d         v sJ ‚t          |d         d         ¦  «        dk    sJ ‚d|d         d         v sJ ‚d	|d         d         v sJ ‚d
S )zATest PyMuPDF raster rendering of CAD drawing PDF to Base64 image.r   éd   )Ú	max_pagesÚdpié   Úimage_base64r   ÚDSConsÚ
text_layerzL=25.0mN)r=   r   Úrender_pdf_to_imagesÚlen)r   Úpdf_fileÚserviceÚrendereds       r<   Útest_render_pdf_to_imagesrL   K   s¼   € å(¨Ñ2Ô2€HÝ)Ñ+Ô+€GØ×+Ò+¨HÀÀsÐ+ÑKÔK€Håˆx‰=Œ=˜AÒÐÐÐØ˜X aœ[Ð(Ð(Ð(Ð(Ýˆx˜Œ{˜>Ô*Ñ+Ô+¨cÒ1Ð1Ð1Ð1Ø�x ”{ <Ô0Ð0Ð0Ð0Ð0Ø˜ œ LÔ1Ð1Ð1Ð1Ð1Ð1Ð1r>   c                óÌ  — ddl }t          | d¦  «        }t          ¦   «         }|                     |                     |dd¬¦  «        ¦  «        }|d         dk    sJ ‚|d         }|d	         }|d
         }|d         €J ‚t          |¦  «        dk    sJ ‚|d         dk    sJ ‚|d         dk    sJ ‚|D ]‰}|d         €J ‚t          |d         t          ¦  «        r+t          |d                              ¦   «         ¦  «        dk    sJ ‚t          t          |d         ¦  «        ¦  «        t          d¦  «        k    sJ ‚ŒŠt          ¦   «         }	|	                     |d         ¦  «         dS )zYTest full takeoff processing pipeline including vision/fallback and database persistence.r   NzDWG_KE_DADO_M300.pdfu0   KÃ¨ Ä�a Ä�á»™ mÃ¡c 300 cá»‘ng há»™p thá»§y lá»£i©Ú	file_pathr   Údrawing_hintÚstatusÚsuccessÚtakeoffÚitemsÚmetricsÚidé   Útotal_estimated_cost_vndÚtotal_concrete_volume_m3Ú	norm_codeÚunitÚquantityz0.0000)Úasyncior=   r   ÚrunÚprocess_drawing_filerH   Ú
isinstancer   Ústripr   r
   Údelete_drawing_takeoff)
r   r]   rI   rJ   ÚresultrS   rT   rU   ÚitmÚ	db_clients
             r<   Ú(test_analyze_drawing_and_takeoff_servicerf   X   s›  € à€N€N€Nå(¨Ð3IÑJÔJ€HÝ)Ñ+Ô+€Gà�[Š[Ø×$Ò$ØØ+ØKð 	%ñ 	
ô 	
ñô €Fð �(Ô˜yÒ(Ð(Ð(Ð(Ø�YÔ€GØ�7ŒO€EØ�YÔ€Gà�4Œ=Ð$Ð$Ð$Ýˆu‰:Œ:˜Š?ˆ?ˆ?ˆ?ØÐ-Ô.°Ò2Ð2Ð2Ð2ØÐ-Ô.°Ò2Ð2Ð2Ð2ð ð Bð BˆØ�;ÔÐ+Ð+Ð+Ý˜#˜fœ+¥sÑ+Ô+ÐLµ°C¸´K×4EÒ4EÑ4GÔ4GÑ0HÔ0HÈ1Ò0LÐ0LÐ0LÐLÝ•s˜3˜zœ?Ñ+Ô+Ñ,Ô,µ¸Ñ0AÔ0AÒAÐAÐAÐAÐAõ "Ñ#Ô#€IØ×$Ò$ W¨T¤]Ñ3Ô3Ð3Ð3Ð3r>   c                óî  ‡— t          | d¦  «        }t          |d¦  «        5 }t                               ddd|dfiddit          ¬¦  «        }d	d	d	¦  «         n# 1 swxY w Y   |j        d
k    sJ |j        ¦   «         ‚|                     ¦   «         }|d         d         Š|d         d         d         }	 t                               dt          ¬¦  «        }|j        dk    sJ ‚|                     ¦   «         d         }t          ˆfd„|D ¦   «         ¦  «        sJ ‚t                               d‰› �t          ¬¦  «        }|j        dk    sJ ‚t          |                     ¦   «         d         ¦  «        dk    sJ ‚t                               d|› �ddddœt          ¬¦  «        }	|	j        dk    sJ ‚t          |	                     ¦   «         d         d         ¦  «        dk    sJ ‚t          ¦   «         }
|
                     ¦   «         }|rCt          |d         d         ¦  «        }t                               d‰› d�d|it          ¬¦  «        }t                               d‰› d �t          ¬¦  «        }|j        dk    sJ ‚|j        d!         dk    sJ ‚t          |j        ¦  «        d"k    sJ ‚	 t                               d‰› �t          ¬¦  «         d	S # t                               d‰› �t          ¬¦  «         w xY w)#z5Test complete REST API lifecycle for drawing takeoff.zAPI_TEST_DRAWING.pdfÚrbz/v1/takeoff/upload-and-analyzeÚfileúapplication/pdfrP   u(   Báº£n váº½ mÃ³ng cá»‘ng kiá»ƒm thá»­ API©ÚfilesÚdataÚheadersNéÉ   rS   rV   rT   r   z/v1/takeoff/list©rn   éÈ   rm   c              3  ó0   •K  — | ]}|d          ‰k    V — ŒdS )rV   N© )Ú.0ÚtÚ
takeoff_ids     €r<   ú	<genexpr>z-test_takeoff_api_crud_flow.<locals>.<genexpr>’   s,   øè è € Ð;Ð;¨Q�1�T”7˜jÒ(Ð;Ð;Ð;Ð;Ð;Ð;r>   ú/v1/takeoff/rC   z/v1/takeoff/items/g      Y@g     jè@u3   KÃ­ch thÆ°á»›c thá»±c táº¿ Ä‘iá»�u chá»‰nh 100.5 m3)r\   Úunit_price_vndÚdimension_formula©Újsonrn   Útotal_amount_vndg    :+SAz	/sync-wbsÚ
project_idz=/export-a3-pdf?orientation=landscape&color_scheme=print_readyúcontent-typeéè  )r=   r1   ÚclientÚpostÚAUTH_HEADERSÚstatus_codeÚtextr|   ÚgetÚanyrH   ÚputÚfloatr
   Úlist_projectsr   rn   ÚcontentÚdelete)r   rI   ÚfÚresprm   Úfirst_item_idÚ	list_respÚtakeoffsÚdetail_respÚupdate_respÚerp_dbÚprojectsÚtest_project_idÚ	sync_respÚa3_resprv   s                  @r<   Útest_takeoff_api_crud_flowr™   |   sz  ø€ å(¨Ð3IÑJÔJ€Hõ 
ˆh˜Ñ	Ô	ð 
 Ý�{Š{Ø,ØÐ2°AÐ7HÐIÐJØ Ð"LÐMÝ ð	 ñ 
ô 
ˆð
ð 
ð 
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
øøøð 
ð 
ð 
ð 
ð Ô˜sÒ"Ð"Ð" D¤IÑ"Ô"Ð"Ø�9Š9‰;Œ;€DØ�i” Ô&€JØ˜”M !Ô$ TÔ*€Mð,Iå—J’JÐ1½<�JÑHÔHˆ	ØÔ$¨Ò+Ð+Ð+Ð+Ø—>’>Ñ#Ô# FÔ+ˆÝÐ;Ð;Ð;Ð;°(Ð;Ñ;Ô;Ñ;Ô;Ð;Ð;Ð;õ —j’jÐ!<°
Ð!<Ð!<Ål�jÑSÔSˆØÔ&¨#Ò-Ð-Ð-Ð-Ý�;×#Ò#Ñ%Ô% gÔ.Ñ/Ô/°1Ò4Ð4Ð4Ð4õ —j’jØ0 Ð0Ð0à!Ø")Ø%Zðð õ
 !ð !ñ 
ô 
ˆð Ô&¨#Ò-Ð-Ð-Ð-Ý�[×%Ò%Ñ'Ô'¨Ô/Ð0BÔCÑDÔDÈÒWÐWÐWÐWõ #Ñ$Ô$ˆØ×'Ò'Ñ)Ô)ˆØð 	Ý! (¨1¤+¨dÔ"3Ñ4Ô4ˆOÝŸšØ4˜zÐ4Ð4Ð4Ø" OÐ4Ý$ð $ñ ô ˆIõ —*’*Ød˜:ÐdÐdÐdÝ ð ñ 
ô 
ˆð Ô" cÒ)Ð)Ð)Ð)ØŒ˜~Ô.Ð2CÒCÐCÐCÐCÝ�7”?Ñ#Ô# dÒ*Ð*Ð*Ð*Ð*å�ŠÐ1 ZÐ1Ð1½<ˆÑHÔHÐHÐHÐHø��ŠÐ1 ZÐ1Ð1½<ˆÑHÔHÐHÐHøøøs   ¢+AÁAÁ AÂ5G2K Ë&K4c           	     ó¬  — ddl }ddlm} t          ¦   «         }|                     d|                     ¦   «         j        dd…                              ¦   «         › �d |d¦  «        dd	œ¦  «        }t          |d
         ¦  «        }t          | d¦  «        }t          | d¦  «        }	 t          |d¦  «        5 }t                               ddd|dfidd|dœt          ¬¦  «        }	ddd¦  «         n# 1 swxY w Y   |	j        dk    sJ ‚|	                     ¦   «         d         d
         }
t          |d¦  «        5 }t                               ddd|dfidd|dœt          ¬¦  «        }ddd¦  «         n# 1 swxY w Y   |j        dk    sJ ‚|                     ¦   «         d         d
         }t                               d|
› �t          ¬¦  «        }|j        dk    sJ ‚|                     ¦   «         d         dk    sJ ‚t                               d|
› �t          ¬¦  «        }|j        dk    sJ ‚t                               d|› �t          ¬¦  «        }|j        dk    sJ ‚|                     ¦   «         d         dk    sJ ‚|                     ¦   «         d         d k    sJ ‚	 |                     |¬!¦  «         |                     ¦   «         5 }|                     ¦   «         5 }|                     d"|f¦  «         |                     ¦   «          ddd¦  «         n# 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS # |                     |¬!¦  «         |                     ¦   «         5 }|                     ¦   «         5 }|                     d"|f¦  «         |                     ¦   «          ddd¦  «         n# 1 swxY w Y   ddd¦  «         w # 1 swxY w Y   w xY w)#z[Test single deletion and batch clear-all endpoints for superadmin (scoped to test project).r   Nr   zDA-TEST-é   u   Dá»± Ã¡n Test Delete Scopedz1000000000.0000Úplanning)Úproject_codeÚproject_nameÚcontract_valuerQ   rV   zDRAWING_DEL_1.pdfzDRAWING_DEL_2.pdfrh   ú/v1/takeoff/uploadri   rj   u   Báº£n váº½ 1 cáº§n xÃ³aÚfalse)rP   Úauto_analyzer~   rk   ro   rS   u   Báº£n váº½ 2 cáº§n xÃ³arx   rp   rq   rQ   rR   i”  z!/v1/takeoff/clear-all?project_id=Údeleted_countrC   )r~   z"DELETE FROM projects WHERE id = %s)ÚuuidÚdecimalr   r
   Úcreate_projectÚuuid4ÚhexÚupperr   r=   r1   r�   r‚   rƒ   r„   r|   rŒ   r†   Údelete_all_drawing_takeoffsÚget_connectionÚcursorÚexecuteÚcommit)r   r¤   r   r”   Ú	test_projr–   Úpdf1Úpdf2r�   Úresp1Úid1Úresp2Úid2Ú
del_singleÚget_respÚ
clear_respÚconnÚcurs                     r<   Ú-test_superadmin_delete_and_clear_all_takeoffsr»   ¼   s†  € à€K€K€KØÐÐÐÐÐåÑ Ô €FØ×%Ò%àE t§z¢z¡|¤|Ô'7¸¸¸Ô';×'AÒ'AÑ'CÔ'CÐEÐEØ9Ø%˜gÐ&7Ñ8Ô8Ø ð		
ð 	
ñô €Iõ ˜) Dœ/Ñ*Ô*€OÝ$ XÐ/BÑCÔC€DÝ$ XÐ/BÑCÔC€Dð3å�$˜ÑÔð 
	 Ý—K’KØ$ØÐ 3°QÐ8IÐJÐKà$=Ø$+Ø"1ðð õ
 %ð  ñ 	ô 	ˆEð
	ð 
	ð 
	ñ 
	ô 
	ð 
	ð 
	ð 
	ð 
	ð 
	ð 
	øøøð 
	ð 
	ð 
	ð 
	ð Ô  CÒ'Ð'Ð'Ð'Ø�jŠj‰lŒl˜9Ô% dÔ+ˆõ �$˜ÑÔð 
	 Ý—K’KØ$ØÐ 3°QÐ8IÐJÐKà$=Ø$+Ø"1ðð õ
 %ð  ñ 	ô 	ˆEð
	ð 
	ð 
	ñ 
	ô 
	ð 
	ð 
	ð 
	ð 
	ð 
	ð 
	øøøð 
	ð 
	ð 
	ð 
	ð Ô  CÒ'Ð'Ð'Ð'Ø�jŠj‰lŒl˜9Ô% dÔ+ˆõ —]’]Ð#7°#Ð#7Ð#7Å�]ÑNÔNˆ
ØÔ%¨Ò,Ð,Ð,Ð,Ø�ŠÑ Ô  Ô*¨iÒ7Ð7Ð7Ð7õ —:’:Ð2¨SÐ2Ð2½L�:ÑIÔIˆØÔ# sÒ*Ð*Ð*Ð*õ —]’]ØA°ÐAÐAÍ<ð #ñ 
ô 
ˆ
ð Ô%¨Ò,Ð,Ð,Ð,Ø�ŠÑ Ô  Ô*¨iÒ7Ð7Ð7Ð7Ø�ŠÑ Ô  Ô1°QÒ6Ð6Ð6Ð6Ð6à×*Ò*°oÐ*ÑFÔFÐFØ×"Ò"Ñ$Ô$ð 	¨¨d¯kªk©m¬mð 	¸sØ�KŠKÐ<¸Ð>PÑQÔQÐQØ�KŠK‰MŒMˆMð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	øð 	×*Ò*°oÐ*ÑFÔFÐFØ×"Ò"Ñ$Ô$ð 	¨¨d¯kªk©m¬mð 	¸sØ�KŠKÐ<¸Ð>PÑQÔQÐQØ�KŠK‰MŒMˆMð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	øøøsÔ   Â&L8 Â6-C/Ã#L8 Ã/C3Ã3L8 Ã6C3Ã7A L8 Ä7-E0Å$L8 Å0E4Å4L8 Å7E4Å8D#L8 ËL+Ë,LÌL+ÌL	ÌL+ÌL	ÌL+Ì+L/Ì2L/Ì8+OÍ#OÍ8,N0	Î$OÎ0N4Î4OÎ7N4Î8OÎ;OÏOÏOÏOÏOc                óH  — t          | d¦  «        }t          |d¦  «        5 }t                               ddd|dfidddœt          ¬	¦  «        }d
d
d
¦  «         n# 1 swxY w Y   |j        dk    sJ |j        ¦   «         ‚|                     ¦   «         }|d         dk    sJ ‚|d         du sJ ‚|d         }|d         }|€J ‚|d                              d¦  «        sJ ‚t                               d|› d�dddœt          ¬¦  «        }|j        dk    sJ |j        ¦   «         ‚|                     ¦   «         }|d         dk    sJ ‚t          |d         ¦  «        dk    sJ ‚|d         d         dk    sJ ‚t           
                    d|› �t          ¬ ¦  «        }	|	j        dk    sJ ‚d
S )!zUTest decoupled fast upload (< 500ms) and background / on-demand AI analyze endpoints.zFAST_UPLOAD_TEST.pdfrh   r    ri   rj   u5   Báº£n váº½ kiá»ƒm thá»­ bÃ³c tÃ¡ch báº¥t Ä‘á»“ng bá»™Útrue©rP   r¢   rk   Nro   rQ   rR   Úis_asyncTrS   rV   Údrawing_codezDWG-rx   z/analyzeu   KÃ¨ Ä�a Ä�á»™ mÃ¡c 300r¡   )rP   Ú	run_async)rm   rn   rq   rT   rC   rU   rX   r   rp   )r=   r1   r�   r‚   rƒ   r„   r…   r|   Ú
startswithrH   rŒ   )
r   rI   r�   rŽ   rm   rS   rv   Úanalyze_respÚanalyze_dataÚdel_resps
             r<   Ú4test_fast_decoupled_takeoff_upload_and_async_analyzerÆ     s>  € å(¨Ð3IÑJÔJ€Hõ 
ˆh˜Ñ	Ô	ð 	
 Ý�{Š{Ø ØÐ2°AÐ7HÐIÐJà WØ &ðð õ !ð ñ 
ô 
ˆð	
ð 	
ð 	
ñ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
øøøð 	
ð 	
ð 	
ð 	
ð Ô˜sÒ"Ð"Ð" D¤IÑ"Ô"Ð"Ø�9Š9‰;Œ;€DØ�Œ>˜YÒ&Ð&Ð&Ð&Ø�
Ô˜tÐ#Ð#Ð#Ð#Ø�9Œo€GØ˜”€JØÐ!Ð!Ð!Ø�>Ô"×-Ò-¨fÑ5Ô5Ð5Ð5Ð5õ —;’;Ø+�zÐ+Ð+Ð+Ø6ÀWÐMÐMÝð ñ ô €Lð
 Ô# sÒ*Ð*Ð*¨LÔ,=Ñ*Ô*Ð*Ø×$Ò$Ñ&Ô&€LØ˜Ô! YÒ.Ð.Ð.Ð.Ýˆ|˜GÔ$Ñ%Ô%¨Ò*Ð*Ð*Ð*Ø˜	Ô"Ð#=Ô>ÀÒBÐBÐBÐBõ �}Š}Ð8¨JÐ8Ð8Å,ˆ}ÑOÔO€HØÔ 3Ò&Ð&Ð&Ð&Ð&Ð&s   ¡,AÁAÁ Ac                ó  — ddl }t          | d¦  «        }| dz  }t          ¦   «         }|                     ||ddd¬¦  «        }t	          |¦  «        d	k    sJ ‚|                     ¦   «         sJ ‚|                     t          |¦  «        ¦  «        }t	          |¦  «        d
k    sJ ‚|d         }|j        j	        dz  dz  }|j        j
        dz  dz  }	d|cxk    rdk    sn J ‚d|	cxk    rdk    sn J ‚|                     ¦   «          dS )zNTest A3 PDF export service directly on CAD drawing and verify page dimensions.r   NzTEST_CAD_FOR_A3.pdfzOUTPUT_SIZE_A3.pdfÚ	landscapeÚprint_readyé,  )rO   Úoutput_pdf_pathÚorientationÚcolor_schemerB   r€   rC   gffffff9@g      R@g      y@g     àz@g     €q@g     `s@)Úpymupdfr=   r   Úexport_drawing_to_a3_pdfrH   Úexistsr1   r   Úrectr   r   r8   )
r   rÎ   rI   Úoutput_a3_pathrJ   Ú	pdf_bytesr:   r;   Úwidth_mmÚ	height_mms
             r<   Ú)test_export_cad_drawing_to_a3_pdf_servicerÖ   -  sF  € à€N€N€Nå(¨Ð3HÑIÔI€HØÐ 4Ñ4€Nå)Ñ+Ô+€GØ×0Ò0ØØ&ØØ"Øð 1ñ ô €Iõ ˆy‰>Œ>˜DÒ Ð Ð Ð Ø× Ò Ñ"Ô"Ð"Ð"Ð"ð �,Š,•s˜>Ñ*Ô*Ñ
+Ô
+€CÝˆs‰8Œ8�qŠ=ˆ=ˆ=ˆ=ØˆqŒ6€DØŒyŒ Ñ%¨Ñ,€HØ”	Ô  4Ñ'¨$Ñ.€Ið �HÐ%Ð%Ò%Ð% Ò%Ð%Ð%Ð%Ð%Ð%Ø�IÐ&Ð&Ò&Ð& Ò&Ð&Ð&Ð&Ð&Ð&Ø‡I‚I�K„K€K€K€Kr>   c           	     ó€  — t          | d¦  «        }t          |d¦  «        5 }t                               ddd|dfidddd	œt          ¬
¦  «        }ddd¦  «         n# 1 swxY w Y   |j        dk    sJ ‚|j        d         dk    sJ ‚d|j                             dd¦  «        v sJ ‚t          |j	        ¦  «        dk    sJ ‚dS )z7Test direct POST upload and convert to A3 PDF endpoint.zDIRECT_CONVERT.pdfrh   z/v1/takeoff/convert-to-a3-pdfri   rj   rÈ   rÉ   rÊ   )rÌ   rÍ   rB   rk   Nrq   r   ÚA3zX-Paper-SizeÚ r€   )
r=   r1   r�   r‚   rƒ   r„   rn   r†   rH   r‹   )r   rI   r�   rŽ   s       r<   Ú*test_direct_convert_cad_to_a3_pdf_endpointrÚ   M  s+  € å(¨Ð3GÑHÔH€Hå	ˆh˜Ñ	Ô	ð 

 Ý�{Š{Ø+ØÐ0°!Ð5FÐGÐHà*Ø -Øðð õ
 !ð ñ 	
ô 	
ˆð

ð 

ð 

ñ 

ô 

ð 

ð 

ð 

ð 

ð 

ð 

øøøð 

ð 

ð 

ð 

ð Ô˜sÒ"Ð"Ð"Ð"ØŒ<˜Ô'Ð+<Ò<Ð<Ð<Ð<Ø�4”<×#Ò# N°BÑ7Ô7Ð7Ð7Ð7Ð7ÝˆtŒ|ÑÔ˜tÒ#Ð#Ð#Ð#Ð#Ð#s   ¡-AÁAÁ!Ac                ó:  — ddl }t          | d¦  «        }t          ¦   «         }|                     |                     |dd¬¦  «        ¦  «        }|d         dk    sJ ‚|d         }|d	         d
k    sJ ‚t          ¦   «         }|                     |d         ¦  «         dS )zaTest that AI Quynh uses Gemini 3.1 Pro High Reasoning model and records correct vision model tag.r   NzGEMINI_31_PRO_TEST.pdfu*   Kiá»ƒm thá»­ Gemini 3.1 Pro High ReasoningrN   rQ   rR   rS   Úai_vision_modelzgemini-3.1-pro-highrV   )r]   r=   r   r^   r_   r
   rb   )r   r]   rI   rJ   rc   rS   re   s          r<   Ú(test_quynh_gemini_3_1_pro_high_reasoningrÝ   c  s¿   € à€N€N€Nå(¨Ð3KÑLÔL€HÝ)Ñ+Ô+€Gà�[Š[Ø×$Ò$ØØ-ØEð 	%ñ 	
ô 	
ñô €Fð �(Ô˜yÒ(Ð(Ð(Ð(Ø�YÔ€GØÐ$Ô%Ð)>Ò>Ð>Ð>Ð>õ "Ñ#Ô#€IØ×$Ò$ W¨T¤]Ñ3Ô3Ð3Ð3Ð3r>   c                ó6  — ddl }t          ¦   «         }t          | d¦  «        }t          ¦   «         }|                     |                     |dd¬¦  «        ¦  «        }|d         dk    sJ ‚|d         }|d	         d
k    sJ ‚|d         dk    sJ ‚d|d         v sd|d         v sJ ‚d|d         v sJ ‚d|d         v sJ ‚t          | d¦  «        }|                     |                     |dd¬¦  «        ¦  «        }|d         dk    sJ ‚|d         }	|	d	         dk    sJ ‚|	d         dk    sJ ‚d|	d                              ¦   «         v sd|	d                              ¦   «         v sJ ‚|                     |d         ¦  «         |                     |	d         ¦  «         dS )zNTest AI Quynh QS proactive HSMT auto-discovery and confidence level reporting.r   NzNVH_DAI_THANG_TEST.pdfu#   NhÃ  vÄƒn hÃ³a thÃ´n Ä�áº¡i Tháº¯ngrN   rQ   rR   rS   Úconfidence_scorer$   Úconfidence_levelÚhsmt_verifiedu   Ä�áº¡i Tháº¯ngÚhsmt_reference_fileÚNVHu   ThÆ°a sáº¿pÚai_report_messagez98%zNEW_UNKNOWN_STRUCTURE.pdfu3   CÃ´ng trÃ¬nh káº¿t cáº¥u má»›i chÆ°a cÃ³ dá»± toÃ¡néK   Úpreliminaryu   chÆ°a cÃ³ há»“ sÆ¡ má»�i tháº§uu   chÆ°a tÃ¬m tháº¥yrV   )r]   r
   r=   r   r^   r_   Úlowerrb   )
r   r]   re   Úpdf_nvhrJ   Ú
result_nvhÚtakeoff_nvhÚpdf_newÚ
result_newÚtakeoff_news
             r<   Ú-test_quynh_hsmt_auto_discovery_and_confidencerî   {  s$  € à€N€N€Nå!Ñ#Ô#€Iõ (¨Ð2JÑKÔK€GÝ)Ñ+Ô+€Gà—’Ø×$Ò$ØØ-Ø>ð 	%ñ 	
ô 	
ñô €Jð �hÔ 9Ò,Ð,Ð,Ð,Ø˜YÔ'€KØÐ)Ô*¨bÒ0Ð0Ð0Ð0ØÐ)Ô*¨oÒ=Ð=Ð=Ð=à˜KÐ(=Ô>Ð>Ð>Ø�KÐ 5Ô6Ð6Ð6Ð6ð	7ð ˜KÐ(;Ô<Ð<Ð<Ð<Ð<Ø�KÐ 3Ô4Ð4Ð4Ð4Ð4õ (¨Ð2MÑNÔN€GØ—’Ø×$Ò$ØØ0ØNð 	%ñ 	
ô 	
ñô €Jð �hÔ 9Ò,Ð,Ð,Ð,Ø˜YÔ'€KØÐ)Ô*¨bÒ0Ð0Ð0Ð0ØÐ)Ô*¨mÒ;Ð;Ð;Ð;à)¨[Ð9LÔ-M×-SÒ-SÑ-UÔ-UÐUÐUØ +Ð.AÔ"B×"HÒ"HÑ"JÔ"JÐJÐJÐJð	Kð
 ×$Ò$ [°Ô%6Ñ7Ô7Ð7Ø×$Ò$ [°Ô%6Ñ7Ô7Ð7Ð7Ð7r>   c                ór  — t          | d¦  «        }t          ¦   «         }t          ¦   «         }|                     |dd¬¦  «        }|d         }	 t	          j        d¦  «        }t                               d|› d�dd	|d
fit          ¬¦  «        }|j	        dk    sJ ‚| 
                    ¦   «         }|d         dk    sJ ‚|                     |¦  «        }	|	d         dk    sJ ‚|	d         dk    sJ ‚|	d         d	k    sJ ‚d	|	d         v sJ ‚	 |                     |¦  «         dS # |                     |¦  «         w xY w)zSTest POST /v1/takeoff/{takeoff_id}/attach-hsmt endpoint upgrades confidence to 99%.zPRELIMINARY_DRAWING.pdfu   Báº£n váº½ sÆ¡ bá»™rN   rV   s   DUMMY EXCEL HSMT BOQ DATArx   z/attach-hsmtri   zTIEN_LUONG_BOQ_2026.xlsxúAapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet)rl   rn   rq   rQ   rR   rß   éc   rà   rá   râ   rä   N)r=   r   r
   Úcreate_pending_takeoffÚioÚBytesIOr�   r‚   rƒ   r„   r|   Úget_drawing_takeoffrb   )
r   rI   rJ   re   Úcreatedrv   Údummy_excelrŽ   Úres_dataÚupdateds
             r<   Útest_attach_hsmt_endpointrú   ®  s’  € å(¨Ð3LÑMÔM€HÝ)Ñ+Ô+€GÝ!Ñ#Ô#€Ið ×,Ò,ØØ*Ø*ð -ñ ô €Gð
 ˜”€Jð5å”jÐ!=Ñ>Ô>ˆÝ�{Š{Ø3˜:Ð3Ð3Ð3àØ.ØØWððõ !ð ñ 

ô 

ˆð Ô 3Ò&Ð&Ð&Ð&Ø—9’9‘;”;ˆØ˜Ô! YÒ.Ð.Ð.Ð.ð ×/Ò/°
Ñ;Ô;ˆØÐ)Ô*¨bÒ0Ð0Ð0Ð0ØÐ)Ô*¨oÒ=Ð=Ð=Ð=ØÐ,Ô-Ð1KÒKÐKÐKÐKØ)¨WÐ5HÔ-IÐIÐIÐIÐIÐIð 	×(Ò(¨Ñ4Ô4Ð4Ð4Ð4øˆ	×(Ò(¨Ñ4Ô4Ð4Ð4øøøs   ÁB9D ÄD6c                óÜ   — t          | d¦  «        }t          ¦   «         }|                     |d¬¦  «        }d|v sJ ‚d|d         v sJ ‚d|d         v sJ ‚d|d         v sd|d         v sJ ‚d	S d	S )
uf   Kiá»ƒm thá»­ trÃ­ch xuáº¥t dá»¯ liá»‡u PDF khÃ´ng gian vÃ  báº£ng biá»ƒu chuáº©n AI-Friendly Markdown.zTEST_AI_FRIENDLY.pdfé   )rA   Ústructured_markdownu    Há»’ SÆ  Báº¢N Váº¼ Ká»¸ THUáº¬TzTRANG 1u   KHUNG TÃŠN Báº¢N Váº¼u   THÃ”NG Sá»�N)r=   r   Ú!extract_ai_friendly_pdf_structure)r   rI   rJ   Ú	extracteds       r<   Ú)test_ai_friendly_pdf_structure_extractionr   Ù  sª   € å(¨Ð3IÑJÔJ€HÝ)Ñ+Ô+€Gà×9Ò9¸(ÈaÐ9ÑPÔP€IØ  IÐ-Ð-Ð-Ð-Ø-°Ð;PÔ1QÐQÐQÐQÐQØ˜	Ð"7Ô8Ð8Ð8Ð8Ð8à 9Ð-BÔ#CÐCÐCØ˜IÐ&;Ô<Ð<Ð<Ð<ð	=ÐCÐCØ<Ð<r>   c           
     ób  — t          | d¦  «        }t          | d¦  «        }t          |d¦  «        5 }t          |d¦  «        5 }t                               ddd|dffdd|dffgddd	œt          ¬
¦  «        }ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   |j        dk    sJ ‚|                     ¦   «         }|d         dk    sJ ‚|d         dk    sJ ‚t          |d         ¦  «        dk    sJ ‚t          ¦   «         }|d         D ]}| 	                    |d         ¦  «         ŒdS )ua   Kiá»ƒm thá»­ Endpoint POST /v1/takeoff/upload-batch táº£i lÃªn Ä‘á»“ng thá»�i nhiá»�u báº£n váº½.zBATCH_DRAWING_1.pdfzBATCH_DRAWING_2.pdfrh   ú/v1/takeoff/upload-batchrl   rj   u   GÃ³i tháº§u hÃ ng loáº¡t batchr¡   r¾   rk   Nro   rQ   rR   Úcountr   r‘   rV   )
r=   r1   r�   r‚   rƒ   r„   r|   rH   r
   rb   )	r   r°   r±   Úf1Úf2rŽ   rm   re   Úitems	            r<   Ú#test_batch_upload_drawings_endpointr  è  sê  € å$ XÐ/DÑEÔE€DÝ$ XÐ/DÑEÔE€Då	ˆd�DÑ	Ô	ð 	
˜R¥ d¨DÑ!1Ô!1ð 	
°RÝ�{Š{Ø&àÐ0°"Ð6GÐHÐIØÐ0°"Ð6GÐHÐIðð #CÐT[Ð\Ð\Ý ð ñ 
ô 
ˆð	
ð 	
ð 	
ñ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
øøøð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
ñ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
øøøð 	
ð 	
ð 	
ð 	
ð Ô˜sÒ"Ð"Ð"Ð"Ø�9Š9‰;Œ;€DØ�Œ>˜YÒ&Ð&Ð&Ð&Ø�Œ=˜AÒÐÐÐÝˆt�JÔÑ Ô  AÒ%Ð%Ð%Ð%õ "Ñ#Ô#€IØ�ZÔ ð 5ð 5ˆØ×(Ò(¨¨d¬Ñ4Ô4Ð4Ð4ð5ð 5s5   ±BÁ3BÁ5BÂB	ÂBÂB	Â	BÂBÂBc           
     óÈ  — t          | d¦  «        }| dz  }|                     d¦  «         t          |d¦  «        5 }t          |d¦  «        5 }t                               ddd|dffdd|dffgd	d
dœt
          ¬¦  «        }ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   |j        dk    sJ ‚|                     ¦   «         }|d         dk    sJ ‚|d         dk    sJ ‚|d         dk    sJ ‚t          |d         ¦  «        dk    sJ ‚|d         d         d         dk    sJ ‚t          ¦   «         }| 
                    |d         d         d         ¦  «         dS )u}   Kiá»ƒm thá»­ táº£i lÃªn Ä‘á»“ng thá»�i 1 file Báº£n váº½ PDF + 1 file TiÃªn lÆ°á»£ng Excel vÃ  ghÃ©p cáº·p kÃ©p tá»± Ä‘á»™ng.zBAN_VE_THI_CONG_CONG_HOP.pdfz TIEN_LUONG_DU_TOAN_CONG_HOP.xlsxs   PKDUMMY EXCEL HSMT DATArh   r  rl   rj   rð   u)   Báº£n váº½ cá»‘ng vÃ  dá»± toÃ¡n Ä‘i kÃ¨mr¡   r¾   rk   Nro   rQ   rR   Údrawings_countrC   Úhsmts_countr‘   r   Úattached_hsmt_filerV   )r=   Úwrite_bytesr1   r�   r‚   rƒ   r„   r|   rH   r
   rb   )r   Úpdf_drawingÚ
excel_hsmtÚf_dwgÚf_hsmtrŽ   rm   re   s           r<   Ú$test_smart_batch_upload_dual_pairingr    s/  € å+¨HÐ6TÑUÔU€KØÐ>Ñ>€JØ×ÒÐ=Ñ>Ô>Ð>å	ˆk˜4Ñ	 Ô	 ð 
 E­4°
¸DÑ+AÔ+Að 
ÀVÝ�{Š{Ø&àÐ9¸5ÐBSÐTÐUàà:ØØ[ððð
ð !LØ 'ðð õ !ð# ñ 
ô 
ˆð
ð 
ð 
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
øøøð 
ð 
ð 
ð 
ð 
ð 
ð 
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
øøøð 
ð 
ð 
ð 
ð* Ô˜sÒ"Ð"Ð"Ð"Ø�9Š9‰;Œ;€DØ�Œ>˜YÒ&Ð&Ð&Ð&ØÐ Ô! QÒ&Ð&Ð&Ð&Ø�Ô !Ò#Ð#Ð#Ð#Ýˆt�JÔÑ Ô  AÒ%Ð%Ð%Ð%àˆZÔ˜ÔÐ0Ô1Ð5WÒWÐWÐWÐWõ "Ñ#Ô#€IØ×$Ò$ T¨*Ô%5°aÔ%8¸Ô%>Ñ?Ô?Ð?Ð?Ð?s5   »B"Á3BÁ?B"ÂB	ÂB"ÂB	ÂB"Â"B&Â)B&c           
     óÀ  — ddl }t          ¦   «         }| dz  }|                     ¦   «         }|                     dd¬¦  «        }|                     |                     dddd	¦  «        d
d¬¦  «         |                     ddd¬¦  «         |                     t          |¦  «        ¦  «         | 	                    ¦   «          | dz  }|                     ¦   «         }|                     dd¬¦  «        }|                     ddd¬¦  «         |                     t          |¦  «        ¦  «         | 	                    ¦   «          | 
                    |¦  «        }	|	d         du sJ ‚|	d         du sJ ‚| 
                    |¦  «        }
|
d         du sJ ‚|
d         du sJ ‚t          |d¦  «        5 }t          |d¦  «        5 }t                               ddd|dffdd|dffgddd œt          ¬!¦  «        }ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   |j        d"k    sJ ‚|                     ¦   «         }|d#         d$k    sJ ‚|d%         d&k    s
J d'¦   «         ‚|d(         d&k    s
J d)¦   «         ‚t!          |d*         ¦  «        d&k    sJ ‚|d*         d         d+         dk    sJ ‚t#          ¦   «         }|                     |d*         d         d,         ¦  «         dS )-u~   Kiá»ƒm thá»­ trÆ°á»�ng há»£p Ä�áº¶C BIá»†T: Cáº£ 2 file táº£i lÃªn Ä�á»€U LÃ€ PDF (1 PDF Báº£n váº½ A3 + 1 PDF Dá»± toÃ¡n A4).r   Nz TAP_01_HO_SO_THIET_KE_BAN_VE.pdfi¦  r   r   é2   it  i  )r   r   rC   r   r   )i   iî  uS   KHUNG TÃŠN Báº¢N Váº¼: Cá»�NG Há»˜P PHONG Cáº¦U
Tá»¶ Lá»†: 1/50
KÃ� HIá»†U: BVTC-01r"   r(   z)TAP_02_THUYET_MINH_TIEN_LUONG_DU_TOAN.pdfr   )r  éP   u.  Cá»˜NG HÃ’A XÃƒ Há»˜I CHá»¦ NGHÄ¨A VIá»†T NAM
Ä�á»™c láº­p - Tá»± do - Háº¡nh phÃºc

BÃ�O CÃ�O KINH Táº¾ Ká»¸ THUáº¬T & TIÃŠN LÆ¯á»¢NG Má»œI THáº¦U
CHá»¦ Ä�áº¦U TÆ¯: UBND XÃƒ KIáº¾N MINH
Ä�Æ N GIÃ� Dá»° THáº¦U & Báº¢NG Tá»”NG Há»¢P KINH PHÃ�
CHÆ¯Æ NG V: YÃŠU Cáº¦U Vá»€ Ká»¸ THUáº¬T VÃ€ KHá»�I LÆ¯á»¢NGr'   Ú
is_drawingTÚis_hsmtFrh   r  rl   rj   u,   Báº£n váº½ vÃ  HSMT cÃ¹ng Ä‘á»‹nh dáº¡ng PDFr¡   r¾   rk   ro   rQ   rR   r	  rC   u>   Pháº£i nháº­n diá»‡n Ä‘Ãºng 1 file lÃ  Báº£n váº½ ká»¹ thuáº­tr
  u6   Pháº£i nháº­n diá»‡n Ä‘Ãºng 1 file lÃ  HSMT/Dá»± toÃ¡nr‘   r  rV   )rÎ   r   r1   r2   r3   r4   r5   r7   r   r8   Úclassify_pdf_content_typer�   r‚   rƒ   r„   r|   rH   r
   rb   )r   rÎ   rJ   Údrawing_pdf_pathÚdoc_dwgÚp_dwgÚhsmt_pdf_pathÚdoc_hsmtÚp_hsmtÚ	dwg_classÚ
hsmt_classr  r  rŽ   rm   re   s                   r<   Ú4test_dual_pdf_upload_auto_classification_and_pairingr   .  së  € à€N€N€Nå#Ñ%Ô%€Gð  Ð"DÑDÐØ�lŠl‰nŒn€GØ×Ò 4°ÐÑ4Ô4€EØ	‡O‚O�G—L’L  R¨¨sÑ3Ô3¸9ÈA€OÑNÔNÐNØ	×ÒØØ_Øð ñ ô ð ð
 ‡L‚L•Ð%Ñ&Ô&Ñ'Ô'Ð'Ø‡M‚M�O„O€Oð ÐJÑJ€MØ�|Š|‰~Œ~€HØ×Ò S°ÐÑ5Ô5€FØ
×ÒØð 	Øð ñ ô ð ð
 ‡M‚M•#�mÑ$Ô$Ñ%Ô%Ð%Ø‡N‚NÑÔÐð ×1Ò1Ð2BÑCÔC€IØ�\Ô" dÐ*Ð*Ð*Ð*Ø�YÔ 5Ð(Ð(Ð(Ð(à×2Ò2°=ÑAÔA€JØ�iÔ  DÐ(Ð(Ð(Ð(Ø�lÔ# uÐ,Ð,Ð,Ð,õ 
Ð Ñ	%Ô	%ð 
¨µ°]ÀDÑ0IÔ0Ið 
ÈVÝ�{Š{Ø&ð Ø7¸Ð@QÐRðð
 àCØØ)ðððð !OØ 'ðð õ !ð) ñ 
ô 
ˆð
ð 
ð 
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
øøøð 
ð 
ð 
ð 
ð 
ð 
ð 
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
øøøð 
ð 
ð 
ð 
ð0 Ô˜sÒ"Ð"Ð"Ð"Ø�9Š9‰;Œ;€DØ�Œ>˜YÒ&Ð&Ð&Ð&ØÐ Ô! QÒ&Ð&Ð&Ð(hÑ&Ô&Ð&Ø�Ô !Ò#Ð#Ð#Ð%]Ñ#Ô#Ð#Ýˆt�JÔÑ Ô  AÒ%Ð%Ð%Ð%àˆZÔ˜ÔÐ0Ô1Ø6ò	7ð 	7ð 	7ð 	7õ
 "Ñ#Ô#€IØ×$Ò$ T¨*Ô%5°aÔ%8¸Ô%>Ñ?Ô?Ð?Ð?Ð?s6   Æ'HÆ83G7Ç+HÇ7G;	Ç;HÇ>G;	Ç?HÈHÈHc                ó~  — t          ¦   «         }t          | d¦  «        }|                     |dd¬¦  «        }t          |d         ¦  «        }t	          ¦   «         }|                     |ddddd	d
dddddœ¦  «         |                     |dddddddddddœ¦  «         t                               d|› d�t          ¬¦  «        }|j	        dk    sJ ‚|j
        d         dk    sJ ‚d|j
        d          v sJ ‚t          |j        ¦  «        d!k    sJ ‚d"d#l}|                     t          j        |j        ¦  «        ¦  «        }t          |j        ¦  «        d$k    sJ ‚d%|j        v sJ ‚d&|j        v sJ ‚d'|j        v sJ ‚d(|j        v sJ ‚|d&         }	d)t          |	d*         j        ¦  «        v sJ ‚|                     |¦  «         d#S )+u�   Kiá»ƒm thá»­ tÃ­nh nÄƒng xuáº¥t toÃ n bá»™ báº£ng bÃ³c tÃ¡ch BoQ vÃ  Ä�Æ¡n giÃ¡ thá»‹ trÆ°á»�ng ra file Excel (.xlsx) chuáº©n doanh nghiá»‡p.zsample_takeoff_for_excel.pdfu   Xuáº¥t Excel TestrN   rV   rC   z1.1zAB.11110u'   Ä�Ã o mÃ³ng cÃ´ng trÃ¬nh Ä‘áº¥t cáº¥p IÚ	earthworkz100m x 2m x 1.5mÚm3g     Àr@g     pç@g    @wkA)rv   Ú
item_orderÚwbs_coderZ   Ú	item_nameÚcategoryrz   r[   r\   ry   r}   r   z2.1zAF.11110u#   Ä�á»• bÃª tÃ´ng mÃ³ng M250 Ä‘Ã¡ 1x2Úconcretez100m x 2m x 0.4mg      T@g    p±@Ag    ÌÝ¤Arx   z/export-excelrp   rq   r   rð   ÚDu_Toan_BoQzcontent-dispositionr€   r   NrW   u   1. TH Kinh PhÃ­ (NÄ� 206)u   2. BoQ Khá»‘i LÆ°á»£ngu"   3. Ä�Æ¡n GiÃ¡ Chi Tiáº¿t (VL+NC+M)u   4. Tá»•ng Há»£p Váº­t TÆ° (MR)u&   CÃ”NG TY TNHH XÃ‚Y Dá»°NG Ä�á»ŠNH SÆ NÚA1)r   r=   rò   r   r
   Úcreate_drawing_takeoff_itemr�   r†   rƒ   r„   rn   rH   r‹   ÚopenpyxlÚload_workbookró   rô   Ú
sheetnamesÚvaluerb   )
r   rJ   r9   rö   rv   re   rŽ   r,  ÚwbÚws1s
             r<   Ú"test_export_takeoff_excel_endpointr2    sQ  € å)Ñ+Ô+€GÝ(¨Ð3QÑRÔR€Hà×,Ò,ØØ/Ø(ð -ñ ô €Gõ
 �W˜T”]Ñ#Ô#€Jõ "Ñ#Ô#€IØ×)Ò)à$ØØØ#ØBØ#Ø!3ØØØ%Ø *ð	
ð 	
ñô ð ð ×)Ò)à$ØØØ#Ø>Ø"Ø!3ØØØ'Ø +ð	
ð 	
ñô ð õ" �:Š:Ð> ZÐ>Ð>Ð>Íˆ:ÑUÔU€DØÔ˜sÒ"Ð"Ð"Ð"àŒ�^Ô$ØNò	Oð 	Oð 	Oð 	Oð ˜DœLÐ)>Ô?Ð?Ð?Ð?Ð?ÝˆtŒ|ÑÔ˜tÒ#Ð#Ð#Ð#ð €O€O€Oà	×	Ò	¥¤
¨4¬<Ñ 8Ô 8Ñ	9Ô	9€BÝˆrŒ}ÑÔ Ò"Ð"Ð"Ð"Ø&¨"¬-Ð7Ð7Ð7Ð7Ø# r¤}Ð4Ð4Ð4Ð4Ø/°2´=Ð@Ð@Ð@Ð@Ø+¨r¬}Ð<Ð<Ð<Ð<à
Ð%Ô
&€CØ3µs¸3¸t¼9¼?Ñ7KÔ7KÐKÐKÐKÐKð ×$Ò$ ZÑ0Ô0Ð0Ð0Ð0r>   c           	     óN  — ddl m} ddlm} ddlm} ddlm}  ||¦  «        } |¦   «         } |¦   «         }t          | d¦  «        }| 	                    |dd¬¦  «        }	t          |	d	         ¦  «        }
	 |                     d
|
› d�dddœt          ¬¦  «        }|j        dk    sJ ‚d|j        d         v sJ ‚|j        }d|v sJ ‚d|v sJ ‚d|v sJ ‚|                     d
|
› d�t          ¬¦  «        }|j        dk    sJ ‚|                     ¦   «                              dg ¦  «        }t%          |¦  «        dk    sJ ‚|D ])}d|v sJ ‚d|v sJ ‚t%          |d         ¦  «        dk    sJ ‚Œ*|                     dt          ¬¦  «        }|j        dk    sJ ‚|                     ¦   «                              dg ¦  «        }t%          |¦  «        dk    sJ ‚|D ]u}|                     d¦  «        sJ ‚|                     d¦  «        sJ ‚|                     d ¦  «        sJ ‚|                     d!¦  «        sJ ‚|                     d"¦  «        sJ ‚Œv|                     d
|
› d�t          ¬¦  «        }|j        dk    sJ ‚|                     ¦   «         d#         d$k    sJ ‚|                     d
|
› d�t          ¬¦  «        }t%          |                     ¦   «                              dg ¦  «        ¦  «        dk    sJ ‚	 |                     ¦   «         5 }|                     ¦   «         5 }|                     d%|
d&f¦  «         |                     ¦   «          d'd'd'¦  «         n# 1 swxY w Y   d'd'd'¦  «         n# 1 swxY w Y   |                     |
¦  «         d'S # |                     ¦   «         5 }|                     ¦   «         5 }|                     d%|
d&f¦  «         |                     ¦   «          d'd'd'¦  «         n# 1 swxY w Y   d'd'd'¦  «         n# 1 swxY w Y   |                     |
¦  «         w xY w)(ut   Kiá»ƒm tra pháº£n há»“i SSE streaming thá»�i gian thá»±c vÃ  lÃ m má»›i lá»‹ch sá»­ huáº¥n luyá»‡n cá»§a AI Quá»³nh.r   r   r	   )Úapp)r   zsample_stream_test.pdfu0   Báº£n váº½ Test Pháº£n Há»“i Realtime AI Quá»³nhrN   rV   rx   z/chat-train-streamuC   Ä�Ã o váº­n chuyá»ƒn Ä‘áº¥t cáº¥p I 100m3 12.555 7,500,000 Ä‘/100m3T)Úfeedback_messageÚauto_apply_correctionsr{   rq   ztext/event-streamr   zevent: thinkingzevent: deltazevent: completez/chat-historyrp   rm   r   ÚmessageÚmessage_textz/v1/takeoff/learned-rules/listrC   Ú
rule_titleÚrule_categoryÚtrigger_patternÚcorrection_directiveÚcreated_by_rolerQ   rR   zXDELETE FROM erp_ai_takeoff_learned_rules WHERE takeoff_id = %s OR error_pattern LIKE %s;z%12.555%N)Úfastapi.testclientr   Úapp.core.postgres.erp_clientr
   Úapp.mainr4  Ú7app.modules.takeoff.application.drawing_takeoff_servicer   r=   rò   r   r‚   rƒ   r„   rn   r…   r†   r|   rH   rŒ   r«   r¬   r­   r®   rb   )r   r   r
   r4  r   r�   ÚdbrJ   r9   rö   rv   Ú
stream_resÚ	body_textÚhist_resÚmsgsÚmÚ	rules_resÚrulesÚrÚdel_resÚ	hist_res2r¹   rº   s                          r<   Ú4test_chat_train_streaming_and_clear_history_endpointrM  Ç  sð  € à-Ð-Ð-Ð-Ð-Ð-à>Ð>Ð>Ð>Ð>Ð>ØÐÐÐÐÐØcÐcÐcÐcÐcÐcàˆZ˜‰_Œ_€FØ	Ð	Ñ	Ô	€BØ)Ð)Ñ+Ô+€Gõ )¨Ð3KÑLÔL€HØ×,Ò,ØØ)ØGð -ñ ô €Gõ
 �W˜T”]Ñ#Ô#€Jð?.à—[’[Ø9˜:Ð9Ð9Ð9à$iØ*.ðð õ !ð !ñ 
ô 
ˆ
ð Ô%¨Ò,Ð,Ð,Ð,Ø" jÔ&8¸Ô&HÐHÐHÐHÐHà”Oˆ	Ø  IÐ-Ð-Ð-Ð-Ø Ð*Ð*Ð*Ð*Ø  IÐ-Ð-Ð-Ð-ð —:’:Ø4˜:Ð4Ð4Ð4½lð ñ 
ô 
ˆð Ô# sÒ*Ð*Ð*Ð*Ø�}Š}‰Œ×"Ò" 6¨2Ñ.Ô.ˆÝ�4‰yŒy˜AŠ~ˆ~ˆ~ˆ~Øð 	.ð 	.ˆAØ �>�>�>�>Ø! QÐ&Ð&Ð&Ð&Ý�q˜Ô(Ñ)Ô)¨AÒ-Ð-Ð-Ð-Ð-ð —J’JÐ?Í�JÑVÔVˆ	ØÔ$¨Ò+Ð+Ð+Ð+Ø—’Ñ Ô ×$Ò$ V¨RÑ0Ô0ˆÝ�5‰zŒz˜QŠˆˆˆØð 	,ð 	,ˆAØ—5’5˜Ñ&Ô&Ð&Ð&Ð&Ø—5’5˜Ñ)Ô)Ð)Ð)Ð)Ø—5’5Ð*Ñ+Ô+Ð+Ð+Ð+Ø—5’5Ð/Ñ0Ô0Ð0Ð0Ð0Ø—5’5Ð*Ñ+Ô+Ð+Ð+Ð+Ð+ð —-’-Ø4˜:Ð4Ð4Ð4½lð  ñ 
ô 
ˆð Ô" cÒ)Ð)Ð)Ð)Ø�|Š|‰~Œ~˜hÔ'¨9Ò4Ð4Ð4Ð4à—J’JØ4˜:Ð4Ð4Ð4½lð ñ 
ô 
ˆ	õ �9—>’>Ñ#Ô#×'Ò'¨°Ñ3Ô3Ñ4Ô4¸Ò9Ð9Ð9Ð9Ð9ð ×ÒÑ Ô ð 	 DØ—’‘”ð  #Ø—’ØnØ Ð,ñô ð ð —’‘”�ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	×!Ò! *Ñ-Ô-Ð-Ð-Ð-øð ×ÒÑ Ô ð 	 DØ—’‘”ð  #Ø—’ØnØ Ð,ñô ð ð —’‘”�ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	×!Ò! *Ñ-Ô-Ð-Ð-øøøs‹   Á6I7N	 ÌM'Ì-MÍM'ÍM	ÍM'ÍM	ÍM'Í'M+Í.M+Î	P$ÎPÎ3-O,	Ï PÏ,O0Ï0PÏ3O0Ï4PÏ7P$ÐPÐP$Ð
PÐP$c            
     óê  — ddl m}  dddddœddd	ddœd
ddddœdddddœdddddœdddddœg}|                      |dd¬¦  «        }d„ |d         D ¦   «         }d|v sJ ‚d|v sJ ‚d|v sJ ‚d|v sJ ‚|d          d!k     sJ ‚dddd"dœddd	d#dœd
ddd$dœdddd%dœdddddœdddd&dœg}|                      |dd'¬¦  «        }d(„ |d         D ¦   «         }d|vsJ ‚d|vsJ ‚d|vsJ ‚d|vsJ ‚|d          d)k    sJ ‚d*S )+zVTest 4 Automated Price Quality Gates (AUDIT-PRC-01 to AUDIT-PRC-04) in BoqAuditEngine.r   )ÚBoqAuditEngineu(   Ä�á»• bÃª tÃ´ng lÃ³t mÃ³ng M100 Ä‘Ã¡ 4x6r#  g      $@i` )r&  r[   r\   Ú
unit_priceu/   Ä�á»• bÃª tÃ´ng káº¿t cáº¥u mÃ³ng M250 Ä‘Ã¡ 1x2g      I@u   VÃ¡n khuÃ´n thÃ©p mÃ³ngÚ100m2g       @i�: u   Bá»‘c xáº¿p cÃ¡t rá»�i lÃªn xeg      Y@i�Ð u!   Ä�Ã³ng cá»« Larsen IV trÃªn cáº¡nÚ100mg      @i ªD u$   Nhá»• cá»« Larsen IV dÆ°á»›i nÆ°á»›ci€–˜ ÚculvertzFlawed Test)Údrawing_typeÚtakeoff_titlec                ó8   — g | ]}|                      d ¦  «        ‘ŒS ©Úcode©r†   ©rt   r�   s     r<   ú
<listcomp>z=test_boq_audit_engine_price_quality_gates.<locals>.<listcomp>M  s"   € Ð=Ð=Ð=˜qˆQ�UŠU�6‰]Œ]Ð=Ð=Ð=r>   ÚfindingszAUDIT-PRC-01zAUDIT-PRC-02zAUDIT-PRC-03zAUDIT-PRC-04Úquality_scorer  ið~ i@• i Åû iðU  iàg5 zHealed Testc                ó8   — g | ]}|                      d ¦  «        ‘ŒS rW  rY  rZ  s     r<   r[  z=test_boq_audit_engine_price_quality_gates.<locals>.<listcomp>€  s"   € ÐDÐDÐD a�A—E’E˜&‘M”MÐDÐDÐDr>   éU   N)Ú0app.modules.takeoff.application.boq_audit_enginerO  Úaudit_takeoff)rO  Úflawed_itemsÚflawed_auditÚcodesÚhealed_itemsÚhealed_auditÚhealed_codess          r<   Ú)test_boq_audit_engine_price_quality_gatesrh    s  € àOÐOÐOÐOÐOÐOð
 DØØØ!ð		
ð 	
ð KØØØ!ð		
ð 	
ð 3ØØØ!ð		
ð 	
ð :ØØØ ð		
ð 	
ð =ØØØ!ð		
ð 	
ð @ØØØ"ð		
ð 	
ð?%€LðN "×/Ò/Ø 9¸Mð 0ñ ô €Lð >Ð= L°Ô$<Ð=Ñ=Ô=€Eà˜UÐ"Ð"Ð"Ð"Ø˜UÐ"Ð"Ð"Ð"Ø˜UÐ"Ð"Ð"Ð"Ø˜UÐ"Ð"Ð"Ð"Ø˜Ô(¨2Ò-Ð-Ð-Ð-ð
 DØØØ ð		
ð 	
ð KØØØ!ð		
ð 	
ð 3ØØØ"ð		
ð 	
ð :ØØØð		
ð 	
ð =ØØØ!ð		
ð 	
ð @ØØØ!ð		
ð 	
ð?%€LðN "×/Ò/Ø 9¸Mð 0ñ ô €Lð EÐD¨<¸
Ô+CÐDÑDÔD€Là Ð-Ð-Ð-Ð-Ø Ð-Ð-Ð-Ð-Ø Ð-Ð-Ð-Ð-Ø Ð-Ð-Ð-Ð-Ø˜Ô(¨BÒ.Ð.Ð.Ð.Ð.Ð.r>   )r   )r   r   r   r   r   r   )r   r   )&Ú__doc__Ú
__future__r   ró   r¥   r   Úpathlibr   r0   r>  r   r?  r
   r@  r   rA  r   r   r�   rƒ   r=   rL   rf   r™   r»   rÆ   rÖ   rÚ   rÝ   rî   rú   r   r  r  r   r2  rM  rh  rs   r>   r<   ú<module>rl     sf  ððð ð #Ð "Ð "Ð "Ð "Ð "à 	€	€	€	Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à €€€Ø )Ð )Ð )Ð )Ð )Ð )à :Ð :Ð :Ð :Ð :Ð :Ø Ð Ð Ð Ð Ð ðð ð ð ð ð ð ð ð
 
ˆ�J�J‘L”LÑ	!Ô	!€ØÐ!8Ð9€ð %;ð/ð /ð /ð /ð /ðd
2ð 
2ð 
2ð 
2ð!4ð !4ð !4ð !4ðH=Ið =Ið =Ið =Ið@Eð Eð Eð EðP&'ð &'ð &'ð &'ðRð ð ð ð@$ð $ð $ð $ð,4ð 4ð 4ð 4ð008ð 08ð 08ð 08ðf(5ð (5ð (5ð (5ðVð ð ð5ð 5ð 5ð8'@ð '@ð '@ðTN@ð N@ð N@ðbE1ð E1ð E1ð E1ðPT.ð T.ð T.ð T.ðnh/ð h/ð h/ð h/ð h/r>   