§
    =Ø™jç‡  ã                  óD  — d Z ddlmZ ddlZddlmc 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òt	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        t          ¦  «        rt	          j	        t          ¦  «        nddt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        t	          j	        |¦  «        d	œz  }d
d|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}}d}	|d         }
|	|
v }|slt	          j        d|fd|	|
f¦  «        t	          j	        |	¦  «        t	          j	        |
¦  «        dœz  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}	x}}
|d         d         }t          |¦  «        }
d}|
|k    }|sÇt	          j        d|fd|
|f¦  «        dt          j        ¦   «         v st	          j        t          ¦  «        rt	          j	        t          ¦  «        ndt	          j	        |¦  «        t	          j	        |
¦  «        t	          j	        |¦  «        dœz  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}
x}}d}	|d         d         }
|	|
v }|slt	          j        d|fd|	|
f¦  «        t	          j	        |	¦  «        t	          j	        |
¦  «        dœz  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}	x}}
d}	|d         d         }
|	|
v }|slt	          j        d|fd|	|
f¦  «        t	          j	        |	¦  «        t	          j	        |
¦  «        dœz  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}	x}}
dS )zATest PyMuPDF raster rendering of CAD drawing PDF to Base64 image.r   éd   )Ú	max_pagesÚdpié   ©ú>=©z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)sÚlenÚrendered©Úpy0Úpy1Úpy3Úpy6úassert %(py8)sÚpy8NÚimage_base64r   ©Úin©z%(py1)s in %(py4)s©rK   Úpy4úassert %(py6)srM   ©ú>©z/%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} > %(py7)s©rJ   Úpy2rU   Úpy7úassert %(py9)sÚpy9ÚDSConsÚ
text_layerzL=25.0m)r=   r   Úrender_pdf_to_imagesrG   Ú
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanation)r   Úpdf_fileÚservicerH   Ú@py_assert2Ú@py_assert5Ú@py_assert4Ú@py_format7Ú@py_format9Ú@py_assert0Ú@py_assert3Ú@py_format5Ú@py_assert1Ú@py_assert6Ú@py_format8Ú@py_format10s                   r<   Útest_render_pdf_to_imagesrx   K   s^  € å(¨Ñ2Ô2€HÝ)Ñ+Ô+€GØ×+Ò+¨HÀÀsÐ+ÑKÔK€Håˆx‰=Œ=Ð˜AÐˆ=˜AÒÐÐÐÕÔÐÐÐÐˆ=˜AÐÑÔÐÕÔÑÔÐÐÕÔ�3ÑÔÐÕÔ�3ÑÔÐÐÐÕÔÑÔÐÐÕÔˆxÑÔÐÕÔˆxÑÔÐÐÕÔˆ=ÑÔÕÔ˜AÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐØÐ(˜X aœ[Ð(ˆ>˜[Ð(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(ˆ>˜[Ð(Ñ(Ô(Õ(Ô(ˆ>Ñ(Ô(Õ(Ô(˜[Ñ(Ô(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ø˜Œ{˜>Ô*Ð1�3Ð*Ñ+Ô+Ð1¨cÐ1Ð+¨cÒ1Ð1Ð1Ð1Õ1Ô1Ð1Ð1Ð1Ð1Ð+¨cÐ1Ñ1Ô1Ð1Õ1Ô1Ñ1Ô1Ð1Ð1Õ1Ô1�3Ñ1Ô1Ð1Õ1Ô1�3Ñ1Ô1Ð1Ð1Õ1Ô1Ð*Ñ1Ô1Õ1Ô1Ð+Ñ1Ô1Õ1Ô1¨cÑ1Ô1Ð1Ð1Ñ1Ð1Ð1Ð1Ð1Ð1Ñ1Ð1Õ1Õ1Ô1Ð1Ñ1Ô1Ñ1Ô1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1ØÐ0�x ”{ <Ô0Ð0ˆ8Ð0Ð0Ð0Ð0Ð0Õ0Ô0Ð0Ð0Ð0Ð0ˆ8Ð0Ð0Ñ0Ô0Õ0Ô0ˆ8Ñ0Ô0Õ0Ô0Ð0Ñ0Ô0Ð0Ð0Ñ0Ð0Ð0Ð0Ð0Ð0Ñ0Ð0Õ0Õ0Ô0Ð0Ñ0Ô0Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0Ð0ØÐ1˜ œ LÔ1Ð1ˆ9Ð1Ð1Ð1Ð1Ð1Õ1Ô1Ð1Ð1Ð1Ð1ˆ9Ð1Ð1Ñ1Ô1Õ1Ô1ˆ9Ñ1Ô1Õ1Ô1Ð1Ñ1Ô1Ð1Ð1Ñ1Ð1Ð1Ð1Ð1Ð1Ñ1Ð1Õ1Õ1Ô1Ð1Ñ1Ô1Ñ1Ô1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1r>   c                óÄ  — ddl }t          | d¦  «        }t          ¦   «         }|                     |                     |dd¬¦  «        ¦  «        }|d         }d}||k    }|slt          j        d|fd	||f¦  «        t          j        |¦  «        t          j        |¦  «        d
œz  }dd|iz  }	t          t          j	        |	¦  «        ¦  «        ‚dx}x}}|d         }
|d         }|d         }|
d         }d}||u}|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        d
œz  }dd|iz  }	t          t          j	        |	¦  «        ¦  «        ‚dx}x}}t          |¦  «        }d}||k    }|sòt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }	dd|	iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}}|d         }d}||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        d
œz  }dd|iz  }	t          t          j	        |	¦  «        ¦  «        ‚dx}x}}|d         }d}||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        d
œz  }dd|iz  }	t          t          j	        |	¦  «        ¦  «        ‚dx}x}}|D �]®}|d         }d}||u}|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        d
œz  }dd|iz  }	t          t          j	        |	¦  «        ¦  «        ‚dx}x}}g }|d         }t          |t          ¦  «        }|}|r2|d         }|j        } |¦   «         }t          |¦  «        }d}||k    }|}|�sôd d!t          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nd!t          j        |¦  «        d"t          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nd"t          j        |¦  «        d#œz  }|                     |¦  «         |rát          j        d|fd$||f¦  «        dt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        d%œz  }d&d'|iz  }|                     |¦  «         t          j        |d¦  «        i z  }d(d)|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}x}x}x}x}x}x}x}}|d*         }t          |¦  «        }t'          |¦  «        }d+}t'          |¦  «        }||k    }|�s}t          j        d|fd,||f¦  «        d-t          j        ¦   «         v st          j        t&          ¦  «        rt          j        t&          ¦  «        nd-d"t          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nd"t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        d-t          j        ¦   «         v st          j        t&          ¦  «        rt          j        t&          ¦  «        nd-t          j        |¦  «        t          j        |¦  «        d.œz  }d/d0|iz  } t          t          j	        | ¦  «        ¦  «        ‚dx}x}x}x}x}}�Œ°t)          ¦   «         }!|!                     |
d         ¦  «         dS )1zYTest 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©ú==©z%(py1)s == %(py4)srT   rV   rM   ÚtakeoffÚitemsÚmetricsÚid©úis not)z%(py1)s is not %(py4)sé   rD   rF   rG   rI   rN   rO   Útotal_estimated_cost_vndrW   ©z%(py1)s > %(py4)sÚtotal_concrete_volume_m3Ú	norm_codeÚunitz.%(py7)s
{%(py7)s = %(py2)s(%(py4)s, %(py5)s)
}Ú
isinstancer   )r[   rU   Úpy5r\   )zi%(py17)s
{%(py17)s = %(py9)s(%(py15)s
{%(py15)s = %(py13)s
{%(py13)s = %(py11)s.strip
}()
})
} > %(py20)s)r^   Úpy11Úpy13Úpy15Úpy17Úpy20z%(py22)sÚpy22zassert %(py25)sÚpy25Úquantityz0.0000)zo%(py7)s
{%(py7)s = %(py0)s(%(py5)s
{%(py5)s = %(py1)s(%(py3)s)
})
} >= %(py13)s
{%(py13)s = %(py9)s(%(py11)s)
}r   )rJ   rK   rL   r�   r\   r^   r�   r‘   úassert %(py15)sr’   )Úasyncior=   r   ÚrunÚprocess_drawing_filerb   rc   rg   rh   ri   rG   rd   re   rf   rŽ   r   ÚstripÚappendÚ_format_boolopr   r
   Údelete_drawing_takeoff)"r   r™   rj   rk   Úresultrq   rr   rl   rs   ro   r‚   rƒ   r„   rm   rn   rp   Úitmrt   ru   Ú@py_assert10Ú@py_assert12Ú@py_assert14Ú@py_assert16Ú@py_assert19Ú@py_assert18rv   Ú@py_format21Ú@py_format23Ú@py_format24Ú@py_format26Ú@py_assert8Ú@py_format14Ú@py_format16Ú	db_clients"                                     r<   Ú(test_analyze_drawing_and_takeoff_servicer°   X   sf	  € à€N€N€Nå(¨Ð3IÑJÔJ€HÝ)Ñ+Ô+€Gà�[Š[Ø×$Ò$ØØ+ØKð 	%ñ 	
ô 	
ñô €Fð �(ÔÐ(˜yÐ(Ð˜yÒ(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(Ð˜yÐ(Ñ(Ô(Õ(Ô(ÐÑ(Ô(Õ(Ô(˜yÑ(Ô(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ø�YÔ€GØ�7ŒO€EØ�YÔ€Gà�4Œ=Ð$ Ð$ˆ= Ð$Ð$Ð$Ð$Õ$Ô$Ð$Ð$Ð$Ð$ˆ= Ð$Ñ$Ô$Õ$Ô$ˆ=Ñ$Ô$Õ$Ô$ Ñ$Ô$Ð$Ð$Ñ$Ð$Ð$Ð$Ð$Ð$Ñ$Ð$Õ$Õ$Ô$Ð$Ñ$Ô$Ñ$Ô$Ð$Ð$Ð$Ð$Ð$Ð$Ð$Ýˆu‰:Œ:Ð˜Ðˆ:˜Š?ÐÐÐÕÔÐÐÐÐˆ:˜ÐÑÔÐÕÔÑÔÐÐÕÔ�3ÑÔÐÕÔ�3ÑÔÐÐÐÕÔÑÔÐÐÕÔˆuÑÔÐÕÔˆuÑÔÐÐÕÔˆ:ÑÔÕÔ˜ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐØÐ-Ô.Ð2°Ð2Ð.°Ò2Ð2Ð2Ð2Õ2Ô2Ð2Ð2Ð2Ð2Ð.°Ð2Ñ2Ô2Õ2Ô2Ð.Ñ2Ô2Õ2Ô2°Ñ2Ô2Ð2Ð2Ñ2Ð2Ð2Ð2Ð2Ð2Ñ2Ð2Õ2Õ2Ô2Ð2Ñ2Ô2Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Ð2Ð2ØÐ-Ô.Ð2°Ð2Ð.°Ò2Ð2Ð2Ð2Õ2Ô2Ð2Ð2Ð2Ð2Ð.°Ð2Ñ2Ô2Õ2Ô2Ð.Ñ2Ô2Õ2Ô2°Ñ2Ô2Ð2Ð2Ñ2Ð2Ð2Ð2Ð2Ð2Ñ2Ð2Õ2Õ2Ô2Ð2Ñ2Ô2Ñ2Ô2Ð2Ð2Ð2Ð2Ð2Ð2Ð2ð ð Bñ BˆØ�;ÔÐ+ tÐ+Ð tÐ+Ð+Ð+Ð+Õ+Ô+Ð+Ð+Ð+Ð+Ð tÐ+Ñ+Ô+Õ+Ô+ÐÑ+Ô+Õ+Ô+ tÑ+Ô+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+ØLÐL˜#˜fœ+ÐL�z˜+¥sÑ+Ô+ÐLÐ+ÐLÐ+ÐL°C¸´KÐL°KÔ4EÐLÐ4EÐ4EÑ4GÔ4GÐLµÐ4GÑ0HÔ0HÐLÈ1ÐLÐ0HÈ1Ò0LÐLÐLÐLÐLÑLÐLÐLÕLÔLÑLÔLÐLÐLÕLÔL�zÑLÔLÐLÕLÔL�zÑLÔLÐLÐLÕLÔL˜+ÑLÔLÐLÕLÔLÑLÔLÐLÐLÕLÔL¥sÑLÔLÐLÕLÔL¥sÑLÔLÐLÐLÕLÔLÐ+ÑLÔLÐLÐLÑLÐLÐL×LÒLÐLÑLÔLÐLÐ+ÐLÕLÔLÐLÐLÐLÐLÐ0HÈ1ÐLÑLÔLÐLÕLÔLÑLÔLÐLÐLÕLÔLµÑLÔLÐLÕLÔLµÑLÔLÐLÐLÕLÔL°KÑLÔLÕLÔLÐ4EÑLÔLÕLÔLÐ4GÑLÔLÕLÔLÐ0HÑLÔLÕLÔLÈ1ÑLÔLÐLÐLÑLÐLÐLÐLÐLÐLÑLÐLÐL×LÒLÐLÑLÔLÐLÕLÔLÐLÐLÑLÔLÐLÑLÐLÐLÐLÐLÐLÑLÐLÕLÕLÔLÐLÑLÔLÑLÔLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLØ˜zœ?ÐA•s˜?Ñ+Ô+ÐA�wÐ+Ñ,Ô,ÐA¸ÐAµ¸Ñ0AÔ0AÐAÐ,Ð0AÒAÐAÐAÑAÕAÔAÐAÐAÐAÐAÐ,Ð0AÐAÑAÔAÐAÕAÔAÑAÔAÐAÐAÕAÔA�wÑAÔAÐAÕAÔA�wÑAÔAÐAÐAÐAÕAÔAÑAÔAÐAÐAÕAÔA•sÑAÔAÐAÕAÔA•sÑAÔAÐAÐAÕAÔA˜?ÑAÔAÕAÔAÐ+ÑAÔAÕAÔAÐ,ÑAÔAÐAÕAÔAÑAÔAÐAÐAÕAÔAµÑAÔAÐAÕAÔAµÑAÔAÐAÐAÕAÔA¸ÑAÔAÕAÔAÐ0AÑAÔAÐAÐAÑAÐAÐAÐAÐAÐAÑAÐAÕAÕAÔAÐAÑAÔAÑAÔAÐAÐAÐAÐAÐAÐAÐAÐAÐAÐ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Ät          j        d|fd||f¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }t          j        |j        ¦  «        dz   d|iz  }t          t          j        |¦  «        ¦  «        ‚d	x}x}}|                     ¦   «         }	|	d         d         Š%|	d         d         d         }
	 t                               dt          ¬¦  «        }|j        }d}||k    }|sªt          j        d|fd||f¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d	x}x}}|                     ¦   «         d         }ˆ%fd„|D ¦   «         }t%          |¦  «        }|s•ddt          j	        ¦   «         v st          j
        t$          ¦  «        rt          j        t$          ¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }t          t          j        |¦  «        ¦  «        ‚d	x}}t                               d‰%› �t          ¬¦  «        }|j        }d}||k    }|sªt          j        d|fd||f¦  «        d t          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nd t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d	x}x}}|                     ¦   «         d         }t'          |¦  «        }d!}||k    }|sÇt          j        d"|fd#||f¦  «        d$t          j	        ¦   «         v st          j
        t&          ¦  «        rt          j        t&          ¦  «        nd$t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        d%œz  }d&d'|iz  }t          t          j        |¦  «        ¦  «        ‚d	x}x}x}}t                               d(|
› �d)d*d+d,œt          ¬-¦  «        }|j        }d}||k    }|sªt          j        d|fd||f¦  «        d.t          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nd.t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d	x}x}}|                     ¦   «         d         d/         }t+          |¦  «        }d)}d*}||z  }||k    }|sÚt          j        d|fd0||f¦  «        d1t          j	        ¦   «         v st          j
        t*          ¦  «        rt          j        t*          ¦  «        nd1t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        d2œz  }d3d4|iz  }t          t          j        |¦  «        ¦  «        ‚d	x}x}x}x}x}}t-          ¦   «         }dd	l}dd5lm} |                     d6|                     ¦   «         j        d	d7…         › �d8 |d9¦  «        d:d;œ¦  «        }t;          |d         ¦  «        }t                               d‰%› d<�d=|it          ¬-¦  «        }|j        }d}||k    }|sªt          j        d|fd||f¦  «        d>t          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nd>t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d	x}x}}t                               d‰%› d?�t          ¬¦  «        }|j        }d}||k    }|sªt          j        d|fd||f¦  «        d@t          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nd@t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d	x}x}}|j        dA         }d}||k    }|slt          j        d|fdB||f¦  «        t          j        |¦  «        t          j        |¦  «        dCœz  }dDdE|iz  } t          t          j        | ¦  «        ¦  «        ‚d	x}x}}|j        }t'          |¦  «        }dF}!||!k    }|�st          j        dG|fdH||!f¦  «        d$t          j	        ¦   «         v st          j
        t&          ¦  «        rt          j        t&          ¦  «        nd$d@t          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nd@t          j        |¦  «        t          j        |¦  «        t          j        |!¦  «        dIœz  }"dJdK|"iz  }t          t          j        |¦  «        ¦  «        ‚d	x}x}x}}!t                                d‰%› �t          ¬¦  «         dLt          ¦   «         v rŸ|rŸ| !                    ¦   «         5 }#|# "                    ¦   «         5 }$|$ #                    dM|f¦  «         |$ #                    dN|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 d	S d	S # t                                d‰%› �t          ¬¦  «         dLt          ¦   «         v r�|rœ| !                    ¦   «         5 }#|# "                    ¦   «         5 }$|$ #                    dM|f¦  «         |$ #                    dN|f¦  «         d	d	d	¦  «         n# 1 swxY w Y   |# $                    ¦   «          d	d	d	¦  «         w # 1 swxY w Y   w w w xY w)Oz5Test complete REST API lifecycle for drawing takeoff.zAPI_TEST_DRAWING.pdfÚrbz/v1/takeoff/upload-and-analyzeÚfileúapplication/pdfr|   u(   Báº£n váº½ mÃ³ng cá»‘ng kiá»ƒm thá»­ API©ÚfilesÚdataÚheadersNéÉ   r   ©z3%(py2)s
{%(py2)s = %(py0)s.status_code
} == %(py5)sÚresp©rJ   r[   r�   ú
>assert %(py7)sr\   r‚   r…   rƒ   r   z/v1/takeoff/list©r¸   éÈ   Ú	list_respúassert %(py7)sr·   c              3  ó0   •K  — | ]}|d          ‰k    V — ŒdS )r…   N© )Ú.0ÚtÚ
takeoff_ids     €r<   ú	<genexpr>z-test_takeoff_api_crud_flow.<locals>.<genexpr>’   s,   øè è € Ð;Ð;¨Q�1�T”7˜jÒ(Ð;Ð;Ð;Ð;Ð;Ð;r>   z,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}Úany©rJ   r[   rU   ú/v1/takeoff/Údetail_resprC   rD   ©z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} >= %(py7)srG   rZ   r]   r^   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©Újsonr¸   Úupdate_respÚtotal_amount_vnd)z<%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == (%(py7)s * %(py9)s)Úfloat)rJ   r[   rU   r\   r^   zassert %(py12)sÚpy12r   z
TEST-SYNC-é   zTest Project for WBS SyncÚ	500000000Úplanning©Úproject_codeÚproject_nameÚcontract_valuer}   z	/sync-wbsÚ
project_idÚ	sync_respz=/export-a3-pdf?orientation=landscape&color_scheme=print_readyÚa3_respúcontent-typer�   rT   rV   rM   éè  rW   ©zL%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.content
})
} > %(py8)s©rJ   rK   rL   r�   rO   úassert %(py10)sÚpy10Útest_project_idz2DELETE FROM erp_project_wbs WHERE project_id = %s;z#DELETE FROM projects WHERE id = %s;)%r=   r1   ÚclientÚpostÚAUTH_HEADERSÚstatus_coderb   rc   rd   re   rf   rg   Ú_format_assertmsgÚtextrh   ri   rÐ   ÚgetrÈ   rG   ÚputrÓ   r
   ÚuuidÚdecimalr   Úcreate_projectÚuuid4Úhexr   r¸   ÚcontentÚdeleteÚget_connectionÚcursorÚexecuteÚcommit)&r   rj   Úfr»   rt   rn   rr   Ú@py_format6rv   r·   Úfirst_item_idrÀ   Útakeoffsrs   rË   ru   rm   rw   rÑ   r¬   r¢   Ú@py_format11Ú@py_format13Úerp_dbrî   r   Ú	test_projrå   rÝ   rÞ   rq   rl   ro   Ú@py_assert7rp   ÚconnÚcurrÆ   s&                                        @r<   Útest_takeoff_api_crud_flowr  |   si  ø€ å(¨Ð3IÑJÔJ€Hõ 
ˆh˜Ñ	Ô	ð 
 Ý�{Š{Ø,ØÐ2°AÐ7HÐIÐJØ Ð"LÐMÝ ð	 ñ 
ô 
ˆð
ð 
ð 
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
øøøð 
ð 
ð 
ð 
ð ÔÐ-˜sÐ-Ð˜sÒ"Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-Ð˜sÐ-Ñ-Ô-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô-ˆ4Ñ-Ô-Ð-Õ-Ô-ˆ4Ñ-Ô-Ð-Ð-Õ-Ô-ÐÑ-Ô-Õ-Ô-˜sÑ-Ô-Ð-Ð-Ñ-Ð-Õ-Ô- D¤IÑ-Ô-Ð-Ñ-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ø�9Š9‰;Œ;€DØ�i” Ô&€JØ˜”M !Ô$ TÔ*€Mð;å—J’JÐ1½<�JÑHÔHˆ	ØÔ$Ð+¨Ð+Ð$¨Ò+Ð+Ð+Ð+Õ+Ô+Ð+Ð+Ð+Ð+Ð$¨Ð+Ñ+Ô+Ð+Õ+Ô+Ñ+Ô+Ð+Ð+Õ+Ô+ˆyÑ+Ô+Ð+Õ+Ô+ˆyÑ+Ô+Ð+Ð+Õ+Ô+Ð$Ñ+Ô+Õ+Ô+¨Ñ+Ô+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ø—>’>Ñ#Ô# FÔ+ˆØ;Ð;Ð;Ð;°(Ð;Ñ;Ô;Ð;�sÐ;Ñ;Ô;Ð;Ð;Ð;Ð;Ð;Õ;Ô;Ñ;Ô;Ð;Ð;Õ;Ô;�sÑ;Ô;Ð;Õ;Ô;�sÑ;Ô;Ð;Ð;Õ;Ô;Ð;Ñ;Ô;Õ;Ô;Ð;Ñ;Ô;Ð;Ð;Ñ;Ð;Õ;Õ;Ô;Ð;Ñ;Ô;Ñ;Ô;Ð;Ð;Ð;Ð;Ð;õ —j’jÐ!<°
Ð!<Ð!<Ål�jÑSÔSˆØÔ&Ð-¨#Ð-Ð&¨#Ò-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-Ð&¨#Ð-Ñ-Ô-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô-ˆ{Ñ-Ô-Ð-Õ-Ô-ˆ{Ñ-Ô-Ð-Ð-Õ-Ô-Ð&Ñ-Ô-Õ-Ô-¨#Ñ-Ô-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ø×#Ò#Ñ%Ô% gÔ.Ð4�sÐ.Ñ/Ô/Ð4°1Ð4Ð/°1Ò4Ð4Ð4Ð4Õ4Ô4Ð4Ð4Ð4Ð4Ð/°1Ð4Ñ4Ô4Ð4Õ4Ô4Ñ4Ô4Ð4Ð4Õ4Ô4�sÑ4Ô4Ð4Õ4Ô4�sÑ4Ô4Ð4Ð4Õ4Ô4Ð.Ñ4Ô4Õ4Ô4Ð/Ñ4Ô4Õ4Ô4°1Ñ4Ô4Ð4Ð4Ñ4Ð4Ð4Ð4Ð4Ð4Ñ4Ð4Õ4Õ4Ô4Ð4Ñ4Ô4Ñ4Ô4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ð4õ —j’jØ0 Ð0Ð0à!Ø")Ø%Zðð õ
 !ð !ñ 
ô 
ˆð Ô&Ð-¨#Ð-Ð&¨#Ò-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-Ð&¨#Ð-Ñ-Ô-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô-ˆ{Ñ-Ô-Ð-Õ-Ô-ˆ{Ñ-Ô-Ð-Ð-Õ-Ô-Ð&Ñ-Ô-Õ-Ô-¨#Ñ-Ô-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ø ×%Ò%Ñ'Ô'¨Ô/Ð0BÔCÐW�uÐCÑDÔDÐWÈÐWÐPWÐWÈÐPWÉÐWÐDÈÒWÐWÐWÐWÕWÔWÐWÐWÐWÐWÐDÈÐWÑWÔWÐWÕWÔWÑWÔWÐWÐWÕWÔW�uÑWÔWÐWÕWÔW�uÑWÔWÐWÐWÕWÔWÐCÑWÔWÕWÔWÐDÑWÔWÕWÔWÈÑWÔWÕWÔWÐPWÑWÔWÐWÐWÑWÐWÐWÐWÐWÐWÑWÐWÕWÕWÔWÐWÑWÔWÑWÔWÐWÐWÐWÐWÐWÐWÐWÐWÐWÐWÐWÐWÐWõ #Ñ$Ô$ˆØˆˆˆØ#Ð#Ð#Ð#Ð#Ð#Ø×)Ò)à C¨T¯ZªZ©\¬\Ô-=¸b¸q¸bÔ-AÐ CÐ CØ ;Ø") '¨+Ñ"6Ô"6Ø$ð	ð ñ
ô 
ˆ	õ ˜i¨œoÑ.Ô.ˆÝ—K’KØ0˜:Ð0Ð0Ð0Ø Ð0Ý ð  ñ 
ô 
ˆ	ð
 Ô$Ð+¨Ð+Ð$¨Ò+Ð+Ð+Ð+Õ+Ô+Ð+Ð+Ð+Ð+Ð$¨Ð+Ñ+Ô+Ð+Õ+Ô+Ñ+Ô+Ð+Ð+Õ+Ô+ˆyÑ+Ô+Ð+Õ+Ô+ˆyÑ+Ô+Ð+Ð+Õ+Ô+Ð$Ñ+Ô+Õ+Ô+¨Ñ+Ô+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+å—*’*Ød˜:ÐdÐdÐdÝ ð ñ 
ô 
ˆð Ô"Ð) cÐ)Ð" cÒ)Ð)Ð)Ð)Õ)Ô)Ð)Ð)Ð)Ð)Ð" cÐ)Ñ)Ô)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô)ˆwÑ)Ô)Ð)Õ)Ô)ˆwÑ)Ô)Ð)Ð)Õ)Ô)Ð"Ñ)Ô)Õ)Ô) cÑ)Ô)Ð)Ð)Ñ)Ð)Ð)Ð)Ð)Ð)Ñ)Ð)Õ)Õ)Ô)Ð)Ñ)Ô)Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)ØŒ˜~Ô.ÐCÐ2CÐCÐ.Ð2CÒCÐCÐCÐCÕCÔCÐCÐCÐCÐCÐ.Ð2CÐCÑCÔCÕCÔCÐ.ÑCÔCÕCÔCÐ2CÑCÔCÐCÐCÑCÐCÐCÐCÐCÐCÑCÐCÕCÕCÔCÐCÑCÔCÑCÔCÐCÐCÐCÐCÐCÐCÐCØ”?Ð*�s�?Ñ#Ô#Ð* dÐ*Ð# dÒ*Ð*Ð*Ñ*Õ*Ô*Ð*Ð*Ð*Ð*Ð# dÐ*Ñ*Ô*Ð*Õ*Ô*Ñ*Ô*Ð*Ð*Õ*Ô*�sÑ*Ô*Ð*Õ*Ô*�sÑ*Ô*Ð*Ð*Ð*Õ*Ô*Ñ*Ô*Ð*Ð*Õ*Ô*�7Ñ*Ô*Ð*Õ*Ô*�7Ñ*Ô*Ð*Ð*Õ*Ô*�?Ñ*Ô*Õ*Ô*Ð#Ñ*Ô*Õ*Ô* dÑ*Ô*Ð*Ð*Ñ*Ð*Ð*Ð*Ð*Ð*Ñ*Ð*Õ*Õ*Ô*Ð*Ñ*Ô*Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ð*å�ŠÐ1 ZÐ1Ð1½<ˆÑHÔHÐHØ¥¡¤Ð(Ð(¨_Ð(Ø×&Ò&Ñ(Ô(ð ¨DØ—[’[‘]”]ð [ cØ—K’KÐ TÐWfÐVhÑiÔiÐiØ—K’KÐ EÈÐGYÑZÔZÐZð[ð [ð [ñ [ô [ð [ð [ð [ð [ð [ð [øøøð [ð [ð [ð [ð —’‘”�ð	ð ð ñ ô ð ð ð ð ð ð ð øøøð ð ð ð ð ð ð )Ð(Ð(Ð(øõ 	�ŠÐ1 ZÐ1Ð1½<ˆÑHÔHÐHØ¥¡¤Ð(Ð(¨_Ð(Ø×&Ò&Ñ(Ô(ð ¨DØ—[’[‘]”]ð [ cØ—K’KÐ TÐWfÐVhÑiÔiÐiØ—K’KÐ EÈÐGYÑZÔZÐZð[ð [ð [ñ [ô [ð [ð [ð [ð [ð [ð [øøøð [ð [ð [ð [ð —’‘”�ð	ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð ð )Ð(øøøs�   ¢+AÁAÁ AÅ6f#o0 í#oí8/n3î'oî3n7	î7oî:n7	î;oïo#ï&o#ï0Asð;r6ñ/r	ñ?r6òròr6òròr6ò*sò6r:ò:sò=r:ò>sc           	     óv  — 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ªt          j        d|fd|
|f¦  «        dt#          j        ¦   «         v st          j        |	¦  «        rt          j        |	¦  «        ndt          j        |
¦  «        t          j        |¦  «        dœz  }dd|iz  }t+          t          j        |¦  «        ¦  «        ‚dx}
x}}|	                     ¦   «         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ªt          j        d|fd|
|f¦  «        dt#          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |
¦  «        t          j        |¦  «        dœz  }dd|iz  }t+          t          j        |¦  «        ¦  «        ‚dx}
x}}|                     ¦   «         d         d
         }t                               d|› �t          ¬ ¦  «        }|j        }
d!}|
|k    }|sªt          j        d|fd|
|f¦  «        d"t#          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd"t          j        |
¦  «        t          j        |¦  «        dœz  }dd|iz  }t+          t          j        |¦  «        ¦  «        ‚dx}
x}}|                     ¦   «         d#         }d$}||k    }|slt          j        d|fd%||f¦  «        t          j        |¦  «        t          j        |¦  «        d&œz  }d'd(|iz  }t+          t          j        |¦  «        ¦  «        ‚dx}x}}t                               d|› �t          ¬ ¦  «        }|j        }
d)}|
|k    }|sªt          j        d|fd|
|f¦  «        d*t#          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd*t          j        |
¦  «        t          j        |¦  «        dœz  }dd|iz  }t+          t          j        |¦  «        ¦  «        ‚dx}
x}}t                               d+|› �t          ¬ ¦  «        }|j        }
d!}|
|k    }|sªt          j        d|fd|
|f¦  «        d,t#          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd,t          j        |
¦  «        t          j        |¦  «        dœz  }dd|iz  }t+          t          j        |¦  «        ¦  «        ‚dx}
x}}|                     ¦   «         d#         }d$}||k    }|slt          j        d|fd%||f¦  «        t          j        |¦  «        t          j        |¦  «        d&œz  }d'd(|iz  }t+          t          j        |¦  «        ¦  «        ‚dx}x}}|                     ¦   «         d-         }d.}||k    }|slt          j        d/|fd0||f¦  «        t          j        |¦  «        t          j        |¦  «        d&œz  }d'd(|iz  }t+          t          j        |¦  «        ¦  «        ‚dx}x}}|                     |¬1¦  «         |                     ¦   «         5 }|                     ¦   «         5 }|                     d2|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 # |                     |¬1¦  «         |                     ¦   «         5 }|                     ¦   «         5 }|                     d2|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)3z[Test single deletion and batch clear-all endpoints for superadmin (scoped to test project).r   Nr   zDA-TEST-rÕ   u   Dá»± Ã¡n Test Delete Scopedz1000000000.0000r×   rØ   r…   zDRAWING_DEL_1.pdfzDRAWING_DEL_2.pdfr²   ú/v1/takeoff/uploadr³   r´   u   Báº£n váº½ 1 cáº§n xÃ³aÚfalse)r|   Úauto_analyzerÜ   rµ   r¹   r   rº   Úresp1r¼   rÁ   r\   r‚   u   Báº£n váº½ 2 cáº§n xÃ³aÚresp2rÊ   r¾   r¿   Ú
del_singler}   r~   r�   rT   rV   rM   i”  Úget_respz!/v1/takeoff/clear-all?project_id=Ú
clear_respÚdeleted_countrC   rD   ©z%(py1)s >= %(py4)s)rÜ   z"DELETE FROM projects WHERE id = %s)rî   rï   r   r
   rð   rñ   rò   Úupperr   r=   r1   ræ   rç   rè   ré   rb   rc   rd   re   rf   rg   rh   ri   rÐ   rô   rì   Údelete_all_drawing_takeoffsrõ   rö   r÷   rø   )r   rî   r   rÿ   r   rå   Úpdf1Úpdf2rù   r	  rt   rn   rr   rú   rv   Úid1r
  Úid2r  rq   rl   rs   ro   r  r  r  r  s                              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Ð'Ð  CÒ'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'Ð  CÐ'Ñ'Ô'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'ˆuÑ'Ô'Ð'Õ'Ô'ˆuÑ'Ô'Ð'Ð'Õ'Ô'Ð Ñ'Ô'Õ'Ô' CÑ'Ô'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ø�jŠj‰lŒl˜9Ô% dÔ+ˆõ �$˜ÑÔð 
	 Ý—K’KØ$ØÐ 3°QÐ8IÐJÐKà$=Ø$+Ø"1ðð õ
 %ð  ñ 	ô 	ˆEð
	ð 
	ð 
	ñ 
	ô 
	ð 
	ð 
	ð 
	ð 
	ð 
	ð 
	øøøð 
	ð 
	ð 
	ð 
	ð Ô Ð' CÐ'Ð  CÒ'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'Ð  CÐ'Ñ'Ô'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'ˆuÑ'Ô'Ð'Õ'Ô'ˆuÑ'Ô'Ð'Ð'Õ'Ô'Ð Ñ'Ô'Õ'Ô' CÑ'Ô'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ø�jŠj‰lŒl˜9Ô% dÔ+ˆõ —]’]Ð#7°#Ð#7Ð#7Å�]ÑNÔNˆ
ØÔ%Ð,¨Ð,Ð%¨Ò,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,Ð%¨Ð,Ñ,Ô,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô,ˆzÑ,Ô,Ð,Õ,Ô,ˆzÑ,Ô,Ð,Ð,Õ,Ô,Ð%Ñ,Ô,Õ,Ô,¨Ñ,Ô,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ø�ŠÑ Ô  Ô*Ð7¨iÐ7Ð*¨iÒ7Ð7Ð7Ð7Õ7Ô7Ð7Ð7Ð7Ð7Ð*¨iÐ7Ñ7Ô7Õ7Ô7Ð*Ñ7Ô7Õ7Ô7¨iÑ7Ô7Ð7Ð7Ñ7Ð7Ð7Ð7Ð7Ð7Ñ7Ð7Õ7Õ7Ô7Ð7Ñ7Ô7Ñ7Ô7Ð7Ð7Ð7Ð7Ð7Ð7Ð7õ —:’:Ð2¨SÐ2Ð2½L�:ÑIÔIˆØÔ#Ð* sÐ*Ð# sÒ*Ð*Ð*Ð*Õ*Ô*Ð*Ð*Ð*Ð*Ð# sÐ*Ñ*Ô*Ð*Õ*Ô*Ñ*Ô*Ð*Ð*Õ*Ô*ˆxÑ*Ô*Ð*Õ*Ô*ˆxÑ*Ô*Ð*Ð*Õ*Ô*Ð#Ñ*Ô*Õ*Ô* sÑ*Ô*Ð*Ð*Ñ*Ð*Ð*Ð*Ð*Ð*Ñ*Ð*Õ*Õ*Ô*Ð*Ñ*Ô*Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*õ —]’]ØA°ÐAÐAÍ<ð #ñ 
ô 
ˆ
ð Ô%Ð,¨Ð,Ð%¨Ò,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,Ð%¨Ð,Ñ,Ô,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô,ˆzÑ,Ô,Ð,Õ,Ô,ˆzÑ,Ô,Ð,Ð,Õ,Ô,Ð%Ñ,Ô,Õ,Ô,¨Ñ,Ô,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ø�ŠÑ Ô  Ô*Ð7¨iÐ7Ð*¨iÒ7Ð7Ð7Ð7Õ7Ô7Ð7Ð7Ð7Ð7Ð*¨iÐ7Ñ7Ô7Õ7Ô7Ð*Ñ7Ô7Õ7Ô7¨iÑ7Ô7Ð7Ð7Ñ7Ð7Ð7Ð7Ð7Ð7Ñ7Ð7Õ7Õ7Ô7Ð7Ñ7Ô7Ñ7Ô7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ø�ŠÑ Ô  Ô1Ð6°QÐ6Ð1°QÒ6Ð6Ð6Ð6Õ6Ô6Ð6Ð6Ð6Ð6Ð1°QÐ6Ñ6Ô6Õ6Ô6Ð1Ñ6Ô6Õ6Ô6°QÑ6Ô6Ð6Ð6Ñ6Ð6Ð6Ð6Ð6Ð6Ñ6Ð6Õ6Õ6Ô6Ð6Ñ6Ô6Ñ6Ô6Ð6Ð6Ð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Ô   Â&` Â6-C/Ã#` Ã/C3Ã3` Ã6C3Ã7C4` Ç+-H$È` È$H(È(` È+H(È,U` Þ+`ß ,_8ß,`ß8_<	ß<`ß?_<	à `à`à`à+b8áb,á,b	â	b,âbâb,âbâb,â b8â,b0â0b8â3b0â4b8c                ó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Ät          j        d|fd||f¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }t          j        |j        ¦  «        dz   d|iz  }t          t          j        |¦  «        ¦  «        ‚d
x}x}}|                     ¦   «         }	|	d         }
d}|
|k    }|slt          j        d|fd|
|f¦  «        t          j        |
¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d
x}
x}}|	d         }
d}|
|u }|slt          j        d|fd|
|f¦  «        t          j        |
¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d
x}
x}}|	d         }|d         }d
}||u}|s—t          j        d|fd||f¦  «        d t          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nd t          j        |¦  «        d!œz  }d"d#|iz  }t          t          j        |¦  «        ¦  «        ‚d
x}}|d$         }
|
j        }d%} ||¦  «        }|ssd&t          j        |
¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        d'œz  }t          t          j        |¦  «        ¦  «        ‚d
x}
x}x}}t                               d(|› d)�d*d+d,œt          ¬-¦  «        }|j        }d.}||k    }|sÄt          j        d|fd||f¦  «        d/t          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nd/t          j        |¦  «        t          j        |¦  «        dœz  }t          j        |j        ¦  «        dz   d|iz  }t          t          j        |¦  «        ¦  «        ‚d
x}x}}|                     ¦   «         }|d         }
d}|
|k    }|slt          j        d|fd|
|f¦  «        t          j        |
¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d
x}
x}}|d0         }t%          |¦  «        }d1}||k    }|sÇt          j        d2|fd3||f¦  «        d4t          j	        ¦   «         v st          j
        t$          ¦  «        rt          j        t$          ¦  «        nd4t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        d5œz  }d6d7|iz  }t          t          j        |¦  «        ¦  «        ‚d
x}x}x}}|d8         d9         }
d:}|
|k    }|slt          j        d;|fd<|
|f¦  «        t          j        |
¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚d
x}
x}}t                               d(|› �t          ¬=¦  «        }|j        }d.}||k    }|sªt          j        d|fd||f¦  «        d>t          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        nd>t          j        |¦  «        t          j        |¦  «        dœz  }d?d|iz  }t          t          j        |¦  «        ¦  «        ‚d
x}x}}d
S )@zUTest decoupled fast upload (< 500ms) and background / on-demand AI analyze endpoints.zFAST_UPLOAD_TEST.pdfr²   r  r³   r´   u5   Báº£n váº½ kiá»ƒm thá»­ bÃ³c tÃ¡ch báº¥t Ä‘á»“ng bá»™Útrue©r|   r  rµ   Nr¹   r   rº   r»   r¼   r½   r\   r}   r~   r�   rT   rV   rM   Úis_asyncT©Úis©z%(py1)s is %(py4)sr‚   r…   r†   )z%(py0)s is not %(py3)srÆ   )rJ   rL   úassert %(py5)sr�   Údrawing_codezDWG-zLassert %(py7)s
{%(py7)s = %(py3)s
{%(py3)s = %(py1)s.startswith
}(%(py5)s)
})rK   rL   r�   r\   rÊ   z/analyzeu   KÃ¨ Ä�a Ä�á»™ mÃ¡c 300r  )r|   Ú	run_async)r·   r¸   r¿   Úanalyze_resprƒ   rC   rD   rÌ   rG   rZ   r]   r^   r„   r‰   r   rW   rŠ   r¾   Údel_resprÁ   )r=   r1   ræ   rç   rè   ré   rb   rc   rd   re   rf   rg   rê   rë   rh   ri   rÐ   Ú
startswithrG   rô   )r   rj   rù   r»   rt   rn   rr   rú   rv   r·   rq   rl   rs   ro   r‚   rÆ   Ú@py_format4ru   r!  Úanalyze_datarm   rw   r"  s                          r<   Ú4test_fast_decoupled_takeoff_upload_and_async_analyzer&    s,	  € å(¨Ð3IÑJÔJ€Hõ 
ˆh˜Ñ	Ô	ð 	
 Ý�{Š{Ø ØÐ2°AÐ7HÐIÐJà WØ &ðð õ !ð ñ 
ô 
ˆð	
ð 	
ð 	
ñ 	
ô 	
ð 	
ð 	
ð 	
ð 	
ð 	
ð 	
øøøð 	
ð 	
ð 	
ð 	
ð ÔÐ-˜sÐ-Ð˜sÒ"Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-Ð˜sÐ-Ñ-Ô-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô-ˆ4Ñ-Ô-Ð-Õ-Ô-ˆ4Ñ-Ô-Ð-Ð-Õ-Ô-ÐÑ-Ô-Õ-Ô-˜sÑ-Ô-Ð-Ð-Ñ-Ð-Õ-Ô- D¤IÑ-Ô-Ð-Ñ-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ø�9Š9‰;Œ;€DØ�Œ>Ð&˜YÐ&ˆ>˜YÒ&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&ˆ>˜YÐ&Ñ&Ô&Õ&Ô&ˆ>Ñ&Ô&Õ&Ô&˜YÑ&Ô&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ø�
ÔÐ#˜tÐ#Ð˜tÐ#Ð#Ð#Ð#Õ#Ô#Ð#Ð#Ð#Ð#Ð˜tÐ#Ñ#Ô#Õ#Ô#ÐÑ#Ô#Õ#Ô#˜tÑ#Ô#Ð#Ð#Ñ#Ð#Ð#Ð#Ð#Ð#Ñ#Ð#Õ#Õ#Ô#Ð#Ñ#Ô#Ñ#Ô#Ð#Ð#Ð#Ð#Ð#Ð#Ð#Ø�9Œo€GØ˜”€JØ!Ð!ˆ:˜TÐ!Ð!Ð!Ð!Õ!Ô!Ð!Ð!Ð!Ð!ˆ:˜TÐ!Ñ!Ô!Ð!Õ!Ô!Ñ!Ô!Ð!Ð!Õ!Ô!ˆ:Ñ!Ô!Ð!Õ!Ô!ˆ:Ñ!Ô!Ð!Ð!Õ!Ô!˜TÑ!Ô!Ð!Ð!Ñ!Ð!Ð!Ð!Ð!Ð!Ñ!Ð!Õ!Õ!Ô!Ð!Ñ!Ô!Ñ!Ô!Ð!Ð!Ð!Ð!Ð!Ø�>Ô"Ð5Ð"Ô-Ð5¨fÐ5Ð-Ð-¨fÑ5Ô5Ð5Ð5Ð5Ð5Õ5Ô5Ð"Ñ5Ô5Õ5Ô5Ð-Ñ5Ô5Õ5Ô5¨fÑ5Ô5Õ5Ô5Ð5Ñ5Ô5Ð5Ð5Ñ5Ð5Õ5Õ5Ô5Ð5Ñ5Ô5Ñ5Ô5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5Ð5õ —;’;Ø+�zÐ+Ð+Ð+Ø6ÀWÐMÐMÝð ñ ô €Lð
 Ô#Ð= sÐ=Ð# sÒ*Ð=Ð=Ð=Õ=Ô=Ð=Ð=Ð=Ð=Ð# sÐ=Ñ=Ô=Ð=Õ=Ô=Ñ=Ô=Ð=Ð=Õ=Ô=ˆ<Ñ=Ô=Ð=Õ=Ô=ˆ<Ñ=Ô=Ð=Ð=Õ=Ô=Ð#Ñ=Ô=Õ=Ô= sÑ=Ô=Ð=Ð=Ñ=Ð=Õ=Ô=¨LÔ,=Ñ=Ô=Ð=Ñ=Ð=Ð=Ð=Ñ=Ð=Õ=Õ=Ô=Ð=Ñ=Ô=Ñ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=Ð=Ø×$Ò$Ñ&Ô&€LØ˜Ô!Ð. YÐ.Ð! YÒ.Ð.Ð.Ð.Õ.Ô.Ð.Ð.Ð.Ð.Ð! YÐ.Ñ.Ô.Õ.Ô.Ð!Ñ.Ô.Õ.Ô. YÑ.Ô.Ð.Ð.Ñ.Ð.Ð.Ð.Ð.Ð.Ñ.Ð.Õ.Õ.Ô.Ð.Ñ.Ô.Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ø˜GÔ$Ð*�3Ð$Ñ%Ô%Ð*¨Ð*Ð%¨Ò*Ð*Ð*Ð*Õ*Ô*Ð*Ð*Ð*Ð*Ð%¨Ð*Ñ*Ô*Ð*Õ*Ô*Ñ*Ô*Ð*Ð*Õ*Ô*�3Ñ*Ô*Ð*Õ*Ô*�3Ñ*Ô*Ð*Ð*Õ*Ô*Ð$Ñ*Ô*Õ*Ô*Ð%Ñ*Ô*Õ*Ô*¨Ñ*Ô*Ð*Ð*Ñ*Ð*Ð*Ð*Ð*Ð*Ñ*Ð*Õ*Õ*Ô*Ð*Ñ*Ô*Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ø˜	Ô"Ð#=Ô>ÐBÀÐBÐ>ÀÒBÐBÐBÐBÕBÔBÐBÐBÐBÐBÐ>ÀÐBÑBÔBÕBÔBÐ>ÑBÔBÕBÔBÀÑBÔBÐBÐBÑBÐBÐBÐBÐBÐBÑBÐBÕBÕBÔBÐBÑBÔBÑBÔBÐBÐBÐBÐBÐBÐBÐBõ �}Š}Ð8¨JÐ8Ð8Å,ˆ}ÑOÔO€HØÔÐ& 3Ð&Ð 3Ò&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&Ð 3Ð&Ñ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&ˆ8Ñ&Ô&Ð&Õ&Ô&ˆ8Ñ&Ô&Ð&Ð&Õ&Ô&ÐÑ&Ô&Õ&Ô& 3Ñ&Ô&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&s   ¡,AÁAÁ Ac                óô	  — ddl }t          | d¦  «        }| dz  }t          ¦   «         }|                     ||ddd¬¦  «        }t	          |¦  «        }d	}||k    }|sòt          j        d
|fd||f¦  «        dt          j        ¦   «         v st          j	        t          ¦  «        rt          j
        t          ¦  «        nddt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        t          j
        |¦  «        dœz  }	dd|	iz  }
t          t          j        |
¦  «        ¦  «        ‚dx}x}}|j        } |¦   «         }|s‹ddt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        t          j
        |¦  «        dœz  }t          t          j        |¦  «        ¦  «        ‚dx}}|                     t          |¦  «        ¦  «        }t	          |¦  «        }d}||k    }|sòt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j	        t          ¦  «        rt          j
        t          ¦  «        nddt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        t          j
        |¦  «        dœz  }	dd|	iz  }
t          t          j        |
¦  «        ¦  «        ‚dx}x}}|d         }|j        j        dz  dz  }|j        j        dz  dz  }d}||k    }d}||k    }|r|s¬t          j        d||fd|||f¦  «        t          j
        |¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        dœz  }	dd|	iz  }
t          t          j        |
¦  «        ¦  «        ‚dx}x}x}}d }||k    }d!}||k    }|r|s¬t          j        d||fd|||f¦  «        t          j
        |¦  «        d"t          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        nd"t          j
        |¦  «        dœz  }	dd|	iz  }
t          t          j        |
¦  «        ¦  «        ‚dx}x}x}}|                     ¦   «          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é,  )r{   Úoutput_pdf_pathÚorientationÚcolor_schemerB   rà   rW   )z/%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} > %(py6)srG   Ú	pdf_bytesrI   rN   rO   zAassert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}Úoutput_a3_pathrÉ   rC   rD   rF   r:   gffffff9@g      R@g      y@g     àz@)ú<=r0  )z%(py1)s <= %(py4)sz%(py4)s <= %(py6)sÚwidth_mm)rK   rU   rM   g     €q@g     `s@Ú	height_mm)Úpymupdfr=   r   Úexport_drawing_to_a3_pdfrG   rb   rc   rd   re   rf   rg   rh   ri   Úexistsr1   r   Úrectr   r   r8   )r   r3  rj   r/  rk   r.  rl   rm   rn   ro   rp   rt   rr   rs   r:   r;   r1  r2  rq   s                      r<   Ú)test_export_cad_drawing_to_a3_pdf_servicer7  <  s‡  € à€N€N€Nå(¨Ð3HÑIÔI€HØÐ 4Ñ4€Nå)Ñ+Ô+€GØ×0Ò0ØØ&ØØ"Øð 1ñ ô €Iõ ˆy‰>Œ>Ð ˜DÐ ˆ>˜DÒ Ð Ð Ð Õ Ô Ð Ð Ð Ð ˆ>˜DÐ Ñ Ô Ð Õ Ô Ñ Ô Ð Ð Õ Ô �3Ñ Ô Ð Õ Ô �3Ñ Ô Ð Ð Ð Õ Ô Ñ Ô Ð Ð Õ Ô ˆyÑ Ô Ð Õ Ô ˆyÑ Ô Ð Ð Õ Ô ˆ>Ñ Ô Õ Ô ˜DÑ Ô Ð Ð Ñ Ð Ð Ð Ð Ð Ñ Ð Õ Õ Ô Ð Ñ Ô Ñ Ô Ð Ð Ð Ð Ð Ð Ð ØÔ Ð"Ð Ð Ñ"Ô"Ð"Ð"Ð"Ð"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"ˆ>Ñ"Ô"Ð"Õ"Ô"ˆ>Ñ"Ô"Ð"Ð"Õ"Ô"Ð Ñ"Ô"Õ"Ô"Ð"Ñ"Ô"Ð"Ð"Ñ"Ð"Õ"Õ"Ô"Ð"Ñ"Ô"Ñ"Ô"Ð"Ð"Ð"Ð"Ð"ð �,Š,•s˜>Ñ*Ô*Ñ
+Ô
+€CÝˆs‰8Œ8Ð�qÐˆ8�qŠ=ÐÐÐÕÔÐÐÐÐˆ8�qÐÑÔÐÕÔÑÔÐÐÕÔ�3ÑÔÐÕÔ�3ÑÔÐÐÐÕÔÑÔÐÐÕÔˆsÑÔÐÕÔˆsÑÔÐÐÕÔˆ8ÑÔÕÔ�qÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐØˆqŒ6€DØŒyŒ Ñ%¨Ñ,€HØ”	Ô  4Ñ'¨$Ñ.€Ið Ð%ˆ5�HÒ%Ð% Ð%�H Ò%Ð%Ð%Ð%Ð%Ð%Õ%Ô%Ð%Ð%Ð%Ð%Ð%ˆ5�H Ð%Ñ%Ô%Õ%Ô%ˆ5Ñ%Ô%Ð%Õ%Ô%Ñ%Ô%Ð%Ð%Õ%Ô%�HÑ%Ô%Ð%Õ%Ô%�HÑ%Ô%Ð%Ð%Õ%Ô% Ñ%Ô%Ð%Ð%Ñ%Ð%Ð%Ð%Ð%Ð%Ñ%Ð%Õ%Õ%Ô%Ð%Ñ%Ô%Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Ð%Ð%Ð%Ð%ØÐ&ˆ5�IÒ&Ð& Ð&�I Ò&Ð&Ð&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&Ð&ˆ5�I Ð&Ñ&Ô&Õ&Ô&ˆ5Ñ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&�IÑ&Ô&Ð&Õ&Ô&�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ªt          j        d|fd||f¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|j        d         }	d}|	|k    }
|
slt          j        d|
fd|	|f¦  «        t          j        |	¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}	x}
}d}	|j        }|j        }d}d} |||¦  «        }|	|v }
|
söt          j        d|
fd|	|f¦  «        t          j        |	¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}	x}
x}x}x}x}}|j        }
t#          |
¦  «        }d }||k    }|�st          j        d!|fd"||f¦  «        d#t          j	        ¦   «         v st          j
        t"          ¦  «        rt          j        t"          ¦  «        nd#dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |
¦  «        t          j        |¦  «        t          j        |¦  «        d$œz  }d%d&|iz  }t          t          j        |¦  «        ¦  «        ‚dx}
x}x}}dS )'z7Test direct POST upload and convert to A3 PDF endpoint.zDIRECT_CONVERT.pdfr²   z/v1/takeoff/convert-to-a3-pdfr³   r´   r(  r)  r*  )r,  r-  rB   rµ   Nr¿   r   rº   r»   r¼   rÁ   r\   rß   r�   rT   rV   rM   ÚA3zX-Paper-SizeÚ rQ   )zr%(py1)s in %(py13)s
{%(py13)s = %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s.headers
}.get
}(%(py9)s, %(py11)s)
})rK   rL   r�   r\   r^   r�   r‘   r˜   r’   rà   rW   rá   rG   râ   rã   rä   )r=   r1   ræ   rç   rè   ré   rb   rc   rd   re   rf   rg   rh   ri   r¸   rì   ró   rG   )r   rj   rù   r»   rt   rn   rr   rú   rv   rq   rl   rs   ro   ru   r¬   r¢   r£   r­   r®   r  rp   rý   s                         r<   Ú*test_direct_convert_cad_to_a3_pdf_endpointr;  \  sá  € å(¨Ð3GÑHÔH€Hå	ˆh˜Ñ	Ô	ð 

 Ý�{Š{Ø+ØÐ0°!Ð5FÐGÐHà*Ø -Øðð õ
 !ð ñ 	
ô 	
ˆð

ð 

ð 

ñ 

ô 

ð 

ð 

ð 

ð 

ð 

ð 

øøøð 

ð 

ð 

ð 

ð ÔÐ"˜sÐ"Ð˜sÒ"Ð"Ð"Ð"Õ"Ô"Ð"Ð"Ð"Ð"Ð˜sÐ"Ñ"Ô"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"ˆ4Ñ"Ô"Ð"Õ"Ô"ˆ4Ñ"Ô"Ð"Ð"Õ"Ô"ÐÑ"Ô"Õ"Ô"˜sÑ"Ô"Ð"Ð"Ñ"Ð"Ð"Ð"Ð"Ð"Ñ"Ð"Õ"Õ"Ô"Ð"Ñ"Ô"Ñ"Ô"Ð"Ð"Ð"Ð"Ð"Ð"Ð"ØŒ<˜Ô'Ð<Ð+<Ð<Ð'Ð+<Ò<Ð<Ð<Ð<Õ<Ô<Ð<Ð<Ð<Ð<Ð'Ð+<Ð<Ñ<Ô<Õ<Ô<Ð'Ñ<Ô<Õ<Ô<Ð+<Ñ<Ô<Ð<Ð<Ñ<Ð<Ð<Ð<Ð<Ð<Ñ<Ð<Õ<Õ<Ô<Ð<Ñ<Ô<Ñ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<Ð<ØÐ7�4”<Ð7�<Ô#Ð7 NÐ7°BÐ7Ð#Ð# N°BÑ7Ô7Ð7ˆ4Ð7Ð7Ð7Ð7Ð7Õ7Ô7Ð7Ð7Ð7Ð7ˆ4Ð7Ð7Ñ7Ô7Õ7Ô7ˆ4Ñ7Ô7Ð7Õ7Ô7Ñ7Ô7Ð7Ð7Õ7Ô7�4Ñ7Ô7Ð7Õ7Ô7�4Ñ7Ô7Ð7Ð7Õ7Ô7�<Ñ7Ô7Õ7Ô7Ð#Ñ7Ô7Õ7Ô7 NÑ7Ô7Õ7Ô7°BÑ7Ô7Õ7Ô7Ð7Ñ7Ô7Ð7Ð7Ñ7Ð7Ð7Ð7Ð7Ð7Ñ7Ð7Õ7Õ7Ô7Ð7Ñ7Ô7Ñ7Ô7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ð7ØŒ|Ð#�3ˆ|ÑÔÐ#˜tÐ#Ð˜tÒ#Ð#Ð#Ñ#Õ#Ô#Ð#Ð#Ð#Ð#Ð˜tÐ#Ñ#Ô#Ð#Õ#Ô#Ñ#Ô#Ð#Ð#Õ#Ô#�3Ñ#Ô#Ð#Õ#Ô#�3Ñ#Ô#Ð#Ð#Ð#Õ#Ô#Ñ#Ô#Ð#Ð#Õ#Ô#ˆtÑ#Ô#Ð#Õ#Ô#ˆtÑ#Ô#Ð#Ð#Õ#Ô#ˆ|Ñ#Ô#Õ#Ô#ÐÑ#Ô#Õ#Ô#˜tÑ#Ô#Ð#Ð#Ñ#Ð#Ð#Ð#Ð#Ð#Ñ#Ð#Õ#Õ#Ô#Ð#Ñ#Ô#Ñ#Ô#Ð#Ð#Ð#Ð#Ð#Ð#Ð#Ð#Ð#Ð#Ð#s   ¡-AÁAÁ!Ac                ó  — ddl }t          | d¦  «        }t          ¦   «         }|                     |                     |dd¬¦  «        ¦  «        }|d         }d}||k    }|slt          j        d|fd	||f¦  «        t          j        |¦  «        t          j        |¦  «        d
œz  }dd|iz  }	t          t          j	        |	¦  «        ¦  «        ‚dx}x}}|d         }
|
d         }d}||k    }|slt          j        d|fd	||f¦  «        t          j        |¦  «        t          j        |¦  «        d
œz  }dd|iz  }	t          t          j	        |	¦  «        ¦  «        ‚dx}x}}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 Reasoningrz   r}   r~   r   r�   rT   rV   rM   r‚   Úai_vision_modelzgemini-3.1-pro-highr…   )r™   r=   r   rš   r›   rb   rc   rg   rh   ri   r
   rŸ   )r   r™   rj   rk   r    rq   rr   rl   rs   ro   r‚   r¯   s               r<   Ú(test_quynh_gemini_3_1_pro_high_reasoningr>  r  sè  € à€N€N€Nå(¨Ð3KÑLÔL€HÝ)Ñ+Ô+€Gà�[Š[Ø×$Ò$ØØ-ØEð 	%ñ 	
ô 	
ñô €Fð �(ÔÐ(˜yÐ(Ð˜yÒ(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(Ð˜yÐ(Ñ(Ô(Õ(Ô(ÐÑ(Ô(Õ(Ô(˜yÑ(Ô(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ø�YÔ€GØÐ$Ô%Ð>Ð)>Ð>Ð%Ð)>Ò>Ð>Ð>Ð>Õ>Ô>Ð>Ð>Ð>Ð>Ð%Ð)>Ð>Ñ>Ô>Õ>Ô>Ð%Ñ>Ô>Õ>Ô>Ð)>Ñ>Ô>Ð>Ð>Ñ>Ð>Ð>Ð>Ð>Ð>Ñ>Ð>Õ>Õ>Ô>Ð>Ñ>Ô>Ñ>Ô>Ð>Ð>Ð>Ð>Ð>Ð>Ð>õ "Ñ#Ô#€IØ×$Ò$ W¨T¤]Ñ3Ô3Ð3Ð3Ð3r>   c                óÆ  — ddl }t          ¦   «         }t          | d¦  «        }t          ¦   «         }|                     |                     |dd¬¦  «        ¦  «        }|d         }d}||k    }|slt          j        d|fd	||f¦  «        t          j        |¦  «        t          j        |¦  «        d
œz  }	dd|	iz  }
t          t          j
        |
¦  «        ¦  «        ‚dx}x}}|d         }|d         }d}||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        d
œz  }	dd|	iz  }
t          t          j
        |
¦  «        ¦  «        ‚dx}x}}|d         }d}||k    }|slt          j        d|fd	||f¦  «        t          j        |¦  «        t          j        |¦  «        d
œz  }	dd|	iz  }
t          t          j
        |
¦  «        ¦  «        ‚dx}x}}g }d}|d         }||v }|}|sd}|d         }||v }|}|�st          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }
dd|
iz  }|                     |¦  «         |s`t          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }|                     |¦  «         t          j        |d ¦  «        i z  }d!d"|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}x}x}x}x}x}}d#}|d$         }||v }|slt          j        d|fd%||f¦  «        t          j        |¦  «        t          j        |¦  «        d
œz  }	dd|	iz  }
t          t          j
        |
¦  «        ¦  «        ‚dx}x}}d&}|d$         }||v }|slt          j        d|fd%||f¦  «        t          j        |¦  «        t          j        |¦  «        d
œz  }	dd|	iz  }
t          t          j
        |
¦  «        ¦  «        ‚dx}x}}t          | d'¦  «        }|                     |                     |d'd(¬¦  «        ¦  «        }|d         }d}||k    }|slt          j        d|fd	||f¦  «        t          j        |¦  «        t          j        |¦  «        d
œz  }	dd|	iz  }
t          t          j
        |
¦  «        ¦  «        ‚dx}x}}|d         }|d         }d)}||k    }|slt          j        d|fd	||f¦  «        t          j        |¦  «        t          j        |¦  «        d
œz  }	dd|	iz  }
t          t          j
        |
¦  «        ¦  «        ‚dx}x}}|d         }d*}||k    }|slt          j        d|fd	||f¦  «        t          j        |¦  «        t          j        |¦  «        d
œz  }	dd|	iz  }
t          t          j
        |
¦  «        ¦  «        ‚dx}x}}g }d+}|d$         }|j        } |¦   «         }||v }|}|s!d,}|d$         }|j        } |¦   «         }||v } | }|�sNt          j        d|fd-||f¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        d.œz  }!d/d0|!iz  }"|                     |"¦  «         |s†t          j        d| fd1||f¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        d2œz  }#d3d4|#iz  }$|                     |$¦  «         t          j        |d ¦  «        i z  }%d5d6|%iz  }&t          t          j
        |&¦  «        ¦  «        ‚dx}x}x}x}x}x}x}x}x} x}x}}|                     |d7         ¦  «         |                     |d7         ¦  «         dS )8zNTest 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áº¯ngrz   r}   r~   r   r�   rT   rV   rM   r‚   Úconfidence_scorer$   rD   r  Úconfidence_levelÚhsmt_verifiedu   Ä�áº¡i Tháº¯ngÚhsmt_reference_fileÚNVHrQ   ©z%(py3)s in %(py6)s©rL   rM   ú%(py8)srO   ©z%(py11)s in %(py14)s©r�   Úpy14ú%(py16)sÚpy16rC   úassert %(py19)sÚpy19u   ThÆ°a sáº¿pÚai_report_messagerS   z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áº¥y)zF%(py3)s in %(py10)s
{%(py10)s = %(py8)s
{%(py8)s = %(py6)s.lower
}()
})rL   rM   rO   rä   z%(py12)srÔ   )zJ%(py15)s in %(py22)s
{%(py22)s = %(py20)s
{%(py20)s = %(py18)s.lower
}()
})r’   Úpy18r”   r•   z%(py24)sÚpy24zassert %(py27)sÚpy27r…   )r™   r
   r=   r   rš   r›   rb   rc   rg   rh   ri   r�   rž   ÚlowerrŸ   )'r   r™   r¯   Úpdf_nvhrk   Ú
result_nvhrq   rr   rl   rs   ro   Útakeoff_nvhrt   rm   rn   r¢   Ú@py_assert13r£   rp   Ú@py_format15Ú@py_format17Ú@py_format18Ú@py_format20Úpdf_newÚ
result_newÚtakeoff_newr  Ú@py_assert9r¤   Ú@py_assert17r¦   Ú@py_assert21r¥   rý   rþ   r©   Ú@py_format25r«   Ú@py_format28s'                                          r<   Ú-test_quynh_hsmt_auto_discovery_and_confidencerf  Š  s!  € à€N€N€Nå!Ñ#Ô#€Iõ (¨Ð2JÑKÔK€GÝ)Ñ+Ô+€Gà—’Ø×$Ò$ØØ-Ø>ð 	%ñ 	
ô 	
ñô €Jð �hÔÐ, 9Ð,Ð 9Ò,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,Ð 9Ð,Ñ,Ô,Õ,Ô,ÐÑ,Ô,Õ,Ô, 9Ñ,Ô,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ø˜YÔ'€KØÐ)Ô*Ð0¨bÐ0Ð*¨bÒ0Ð0Ð0Ð0Õ0Ô0Ð0Ð0Ð0Ð0Ð*¨bÐ0Ñ0Ô0Õ0Ô0Ð*Ñ0Ô0Õ0Ô0¨bÑ0Ô0Ð0Ð0Ñ0Ð0Ð0Ð0Ð0Ð0Ñ0Ð0Õ0Õ0Ô0Ð0Ñ0Ô0Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0Ð0ØÐ)Ô*Ð=¨oÐ=Ð*¨oÒ=Ð=Ð=Ð=Õ=Ô=Ð=Ð=Ð=Ð=Ð*¨oÐ=Ñ=Ô=Õ=Ô=Ð*Ñ=Ô=Õ=Ô=¨oÑ=Ô=Ð=Ð=Ñ=Ð=Ð=Ð=Ð=Ð=Ñ=Ð=Õ=Õ=Ô=Ð=Ñ=Ô=Ñ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=Ð=ðð ØðØ'Ð(=Ô>ðØÐ>Ð>ðð ð ð ð àðàÐ 5Ô6ðàÐ6Ð6ðð ð ð ñ õ ìðð ð ð ØÐ>ðñ ô õ ìð 	ñô õ ìð ?ñô ð ð ñ ð ð ð ð ð ñ ð ð ïê ðéì è ðð õ ìðð ð ð àÐ6ðñ ô õ ìð ñô õ ìð 7ñô ð ð ñ ð ð ð ð ð ñ ð ð ïê ðéì è õìðð ñ ô ð ñ ð ð ð ð ð ñ ð õ õ ìðñ ô ñ ô ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð Ð<˜KÐ(;Ô<Ð<ˆ=Ð<Ð<Ð<Ð<Ð<Õ<Ô<Ð<Ð<Ð<Ð<ˆ=Ð<Ð<Ñ<Ô<Õ<Ô<ˆ=Ñ<Ô<Õ<Ô<Ð<Ñ<Ô<Ð<Ð<Ñ<Ð<Ð<Ð<Ð<Ð<Ñ<Ð<Õ<Õ<Ô<Ð<Ñ<Ô<Ñ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<Ð<ØÐ4�KÐ 3Ô4Ð4ˆ5Ð4Ð4Ð4Ð4Ð4Õ4Ô4Ð4Ð4Ð4Ð4ˆ5Ð4Ð4Ñ4Ô4Õ4Ô4ˆ5Ñ4Ô4Õ4Ô4Ð4Ñ4Ô4Ð4Ð4Ñ4Ð4Ð4Ð4Ð4Ð4Ñ4Ð4Õ4Õ4Ô4Ð4Ñ4Ô4Ñ4Ô4Ð4Ð4Ð4Ð4Ð4Ð4Ð4õ (¨Ð2MÑNÔN€GØ—’Ø×$Ò$ØØ0ØNð 	%ñ 	
ô 	
ñô €Jð �hÔÐ, 9Ð,Ð 9Ò,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,Ð 9Ð,Ñ,Ô,Õ,Ô,ÐÑ,Ô,Õ,Ô, 9Ñ,Ô,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ø˜YÔ'€KØÐ)Ô*Ð0¨bÐ0Ð*¨bÒ0Ð0Ð0Ð0Õ0Ô0Ð0Ð0Ð0Ð0Ð*¨bÐ0Ñ0Ô0Õ0Ô0Ð*Ñ0Ô0Õ0Ô0¨bÑ0Ô0Ð0Ð0Ñ0Ð0Ð0Ð0Ð0Ð0Ñ0Ð0Õ0Õ0Ô0Ð0Ñ0Ô0Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0Ð0ØÐ)Ô*Ð;¨mÐ;Ð*¨mÒ;Ð;Ð;Ð;Õ;Ô;Ð;Ð;Ð;Ð;Ð*¨mÐ;Ñ;Ô;Õ;Ô;Ð*Ñ;Ô;Õ;Ô;¨mÑ;Ô;Ð;Ð;Ñ;Ð;Ð;Ð;Ð;Ð;Ñ;Ð;Õ;Õ;Ô;Ð;Ñ;Ô;Ñ;Ô;Ð;Ð;Ð;Ð;Ð;Ð;Ð;ðð Ø)ðØ-8Ð9LÔ-MðØ-MÔ-SðØ-SÐ-SÑ-UÔ-UðØ)Ð-UÐUðð ð ð ð àðà"-Ð.AÔ"Bðà"BÔ"Hðà"HÐ"HÑ"JÔ"JðàÐ"JÐJðð ð ð ñ õ ìðð ð ð Ø)Ð-Uðñ ô õ ìð 	*ñô õ ìð .Nñô õ ìð .Tñô õ ìð .Vñô ð ð ñ ð ð ð ð ð ñ ð ð ïê ðéì è ðð õ ìðð ð ð àÐ"Jðñ ô õ ìð ñô õ ìð #Cñô õ ìð #Iñô õ ìð #Kñô ð ð ñ ð ð ð ð ð ñ ð ð ïê ðéì è õìðð ñ ô ð ñ ð ð ð ð ð ñ ð õ õ ìðñ ô ñ ô ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ×$Ò$ [°Ô%6Ñ7Ô7Ð7Ø×$Ò$ [°Ô%6Ñ7Ô7Ð7Ð7Ð7r>   c                ót  — t          | d¦  «        }t          ¦   «         }t          ¦   «         }|                     |dd¬¦  «        }|d         }	 t	          j        d¦  «        }t                               d|› d�dd	|d
fit          ¬¦  «        }|j	        }d}	||	k    }
|
sªt          j        d|
fd||	f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |	¦  «        dœz  }dd|iz  }t!          t          j        |¦  «        ¦  «        ‚dx}x}
}	|                     ¦   «         }|d         }d}
||
k    }|slt          j        d|fd||
f¦  «        t          j        |¦  «        t          j        |
¦  «        dœz  }dd|iz  }t!          t          j        |¦  «        ¦  «        ‚dx}x}}
|                     |¦  «        }|d         }d}
||
k    }|slt          j        d|fd||
f¦  «        t          j        |¦  «        t          j        |
¦  «        dœz  }dd|iz  }t!          t          j        |¦  «        ¦  «        ‚dx}x}}
|d         }d}
||
k    }|slt          j        d|fd||
f¦  «        t          j        |¦  «        t          j        |
¦  «        dœz  }dd|iz  }t!          t          j        |¦  «        ¦  «        ‚dx}x}}
|d         }d	}
||
k    }|slt          j        d|fd||
f¦  «        t          j        |¦  «        t          j        |
¦  «        dœz  }dd|iz  }t!          t          j        |¦  «        ¦  «        ‚dx}x}}
d	}|d         }
||
v }|slt          j        d |fd!||
f¦  «        t          j        |¦  «        t          j        |
¦  «        dœz  }dd|iz  }t!          t          j        |¦  «        ¦  «        ‚dx}x}}
|                     |¦  «         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á»™rz   r…   s   DUMMY EXCEL HSMT BOQ DATArÊ   z/attach-hsmtr³   zTIEN_LUONG_BOQ_2026.xlsxúAapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet)r¶   r¸   r¿   r   rº   r»   r¼   rÁ   r\   Nr}   r~   r�   rT   rV   rM   r@  éc   rA  rB  rC  rO  rQ   rS   )r=   r   r
   Úcreate_pending_takeoffÚioÚBytesIOræ   rç   rè   ré   rb   rc   rd   re   rf   rg   rh   ri   rÐ   Úget_drawing_takeoffrŸ   )r   rj   rk   r¯   ÚcreatedrÆ   Údummy_excelr»   rt   rn   rr   rú   rv   Úres_datarq   rl   rs   ro   Úupdateds                      r<   Útest_attach_hsmt_endpointrr  ½  sA  € å(¨Ð3LÑMÔM€HÝ)Ñ+Ô+€GÝ!Ñ#Ô#€Ið ×,Ò,ØØ*Ø*ð -ñ ô €Gð
 ˜”€Jð5å”jÐ!=Ñ>Ô>ˆÝ�{Š{Ø3˜:Ð3Ð3Ð3àØ.ØØWððõ !ð ñ 

ô 

ˆð ÔÐ& 3Ð&Ð 3Ò&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&Ð 3Ð&Ñ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&ˆtÑ&Ô&Ð&Õ&Ô&ˆtÑ&Ô&Ð&Ð&Õ&Ô&ÐÑ&Ô&Õ&Ô& 3Ñ&Ô&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ø—9’9‘;”;ˆØ˜Ô!Ð. YÐ.Ð! YÒ.Ð.Ð.Ð.Õ.Ô.Ð.Ð.Ð.Ð.Ð! YÐ.Ñ.Ô.Õ.Ô.Ð!Ñ.Ô.Õ.Ô. YÑ.Ô.Ð.Ð.Ñ.Ð.Ð.Ð.Ð.Ð.Ñ.Ð.Õ.Õ.Ô.Ð.Ñ.Ô.Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.Ð.ð ×/Ò/°
Ñ;Ô;ˆØÐ)Ô*Ð0¨bÐ0Ð*¨bÒ0Ð0Ð0Ð0Õ0Ô0Ð0Ð0Ð0Ð0Ð*¨bÐ0Ñ0Ô0Õ0Ô0Ð*Ñ0Ô0Õ0Ô0¨bÑ0Ô0Ð0Ð0Ñ0Ð0Ð0Ð0Ð0Ð0Ñ0Ð0Õ0Õ0Ô0Ð0Ñ0Ô0Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0Ð0ØÐ)Ô*Ð=¨oÐ=Ð*¨oÒ=Ð=Ð=Ð=Õ=Ô=Ð=Ð=Ð=Ð=Ð*¨oÐ=Ñ=Ô=Õ=Ô=Ð*Ñ=Ô=Õ=Ô=¨oÑ=Ô=Ð=Ð=Ñ=Ð=Ð=Ð=Ð=Ð=Ñ=Ð=Õ=Õ=Ô=Ð=Ñ=Ô=Ñ=Ô=Ð=Ð=Ð=Ð=Ð=Ð=Ð=ØÐ,Ô-ÐKÐ1KÐKÐ-Ð1KÒKÐKÐKÐKÕKÔKÐKÐKÐKÐKÐ-Ð1KÐKÑKÔKÕKÔKÐ-ÑKÔKÕKÔKÐ1KÑKÔKÐKÐKÑKÐKÐKÐKÐKÐKÑKÐKÕKÕKÔKÐKÑKÔKÑKÔKÐKÐKÐKÐKÐKÐKÐKØ)ÐI¨WÐ5HÔ-IÐIÐ)Ð-IÐIÐIÐIÐIÕIÔIÐIÐIÐIÐIÐ)Ð-IÐIÑIÔIÕIÔIÐ)ÑIÔIÕIÔIÐ-IÑIÔIÐIÐIÑIÐIÐIÐIÐIÐIÑIÐIÕIÕIÔIÐIÑIÔIÑIÔIÐIÐIÐIÐIÐIÐIÐIð 	×(Ò(¨Ñ4Ô4Ð4Ð4Ð4øˆ	×(Ò(¨Ñ4Ô4Ð4Ð4øøøs   ÁN;P  Ð P7c                ó0  — t          | d¦  «        }t          ¦   «         }|                     |d¬¦  «        }d}||v }|s—t          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nddœz  }d	d
|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}}d}|d         }||v }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }	dd|	iz  }
t          t          j
        |
¦  «        ¦  «        ‚dx}x}}d}|d         }||v }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }	dd|	iz  }
t          t          j
        |
¦  «        ¦  «        ‚dx}x}}g }d}|d         }||v }|}|sd}|d         }||v }|}|�st          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }
dd|
iz  }|                     |¦  «         |s`t          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }|                     |¦  «         t          j        |d¦  «        i z  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}x}x}x}x}x}}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_markdownrQ   ©z%(py1)s in %(py3)sÚ	extracted©rK   rL   r  r�   Nu    Há»’ SÆ  Báº¢N Váº¼ Ká»¸ THUáº¬TrS   rT   rV   rM   zTRANG 1u   KHUNG TÃŠN Báº¢N Váº¼u   THÃ”NG Sá»�rE  rF  rG  rO   rH  rI  rK  rL  rC   rM  rN  )r=   r   Ú!extract_ai_friendly_pdf_structurerb   rc   rg   rd   re   rf   rh   ri   r�   rž   )r   rj   rk   rw  rq   rl   r$  rú   rr   rs   ro   rt   rm   rn   r¢   rY  r£   rp   rZ  r[  r\  r]  s                         r<   Ú)test_ai_friendly_pdf_structure_extractionrz  è  sæ  € å(¨Ð3IÑJÔJ€HÝ)Ñ+Ô+€Gà×9Ò9¸(ÈaÐ9ÑPÔP€IØ Ð-Ð  IÐ-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-Ð  IÐ-Ñ-Ô-Õ-Ô-Ð Ñ-Ô-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô- IÑ-Ô-Ð-Õ-Ô- IÑ-Ô-Ð-Ð-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ø-ÐQ°Ð;PÔ1QÐQÐ-Ð1QÐQÐQÐQÐQÕQÔQÐQÐQÐQÐQÐ-Ð1QÐQÑQÔQÕQÔQÐ-ÑQÔQÕQÔQÐ1QÑQÔQÐQÐQÑQÐQÐQÐQÐQÐQÑQÐQÕQÕQÔQÐQÑQÔQÑQÔQÐQÐQÐQÐQÐQÐQÐQØÐ8˜	Ð"7Ô8Ð8ˆ9Ð8Ð8Ð8Ð8Ð8Õ8Ô8Ð8Ð8Ð8Ð8ˆ9Ð8Ð8Ñ8Ô8Õ8Ô8ˆ9Ñ8Ô8Õ8Ô8Ð8Ñ8Ô8Ð8Ð8Ñ8Ð8Ð8Ð8Ð8Ð8Ñ8Ð8Õ8Õ8Ô8Ð8Ñ8Ô8Ñ8Ô8Ð8Ð8Ð8Ð8Ð8Ð8Ð8ðð ØðØ#,Ð-BÔ#CðØÐ#CÐCðð ð ð ð àðà%Ð&;Ô<ðàÐ<Ð<ðð ð ð ñ õ ìðð ð ð ØÐ#Cðñ ô õ ìð 	 ñô õ ìð $Dñô ð ð ñ ð ð ð ð ð ñ ð ð ïê ðéì è ðð õ ìðð ð ð àÐ<ðñ ô õ ìð ñô õ ìð =ñô ð ð ñ ð ð ð ð ð ñ ð ð ïê ðéì è õìðð ñ ô ð ñ ð ð ð ð ð ñ ð õ õ ìðñ ô ñ ô ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð r>   c           
     óL  — 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ªt          j        d|fd||f¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }	dd|	iz  }
t          t          j        |
¦  «        ¦  «        ‚dx}x}}|                     ¦   «         }|d         }d}||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|d         }d}||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|d         }t          |¦  «        }d}||k    }|sÇt          j        d|fd||f¦  «        dt          j	        ¦   «         v st          j
        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }
dd |
iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}}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.pdfr²   ú/v1/takeoff/upload-batchr¶   r´   u   GÃ³i tháº§u hÃ ng loáº¡t batchr  r  rµ   Nr¹   r   rº   r»   r¼   rÁ   r\   r}   r~   r�   rT   rV   rM   Úcountr   rü   ©z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)srG   rZ   r]   r^   r…   )r=   r1   ræ   rç   rè   ré   rb   rc   rd   re   rf   rg   rh   ri   rÐ   rG   r
   rŸ   )r   r  r  Úf1Úf2r»   rt   rn   rr   rú   rv   r·   rq   rl   rs   ro   ru   rm   rw   r¯   Ú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Ð"Ð˜sÒ"Ð"Ð"Ð"Õ"Ô"Ð"Ð"Ð"Ð"Ð˜sÐ"Ñ"Ô"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"ˆ4Ñ"Ô"Ð"Õ"Ô"ˆ4Ñ"Ô"Ð"Ð"Õ"Ô"ÐÑ"Ô"Õ"Ô"˜sÑ"Ô"Ð"Ð"Ñ"Ð"Ð"Ð"Ð"Ð"Ñ"Ð"Õ"Õ"Ô"Ð"Ñ"Ô"Ñ"Ô"Ð"Ð"Ð"Ð"Ð"Ð"Ð"Ø�9Š9‰;Œ;€DØ�Œ>Ð&˜YÐ&ˆ>˜YÒ&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&ˆ>˜YÐ&Ñ&Ô&Õ&Ô&ˆ>Ñ&Ô&Õ&Ô&˜YÑ&Ô&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ø�Œ=Ð˜AÐˆ=˜AÒÐÐÐÕÔÐÐÐÐˆ=˜AÐÑÔÕÔˆ=ÑÔÕÔ˜AÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐØ�JÔÐ%�3ÐÑ Ô Ð% AÐ%Ð  AÒ%Ð%Ð%Ð%Õ%Ô%Ð%Ð%Ð%Ð%Ð  AÐ%Ñ%Ô%Ð%Õ%Ô%Ñ%Ô%Ð%Ð%Õ%Ô%�3Ñ%Ô%Ð%Õ%Ô%�3Ñ%Ô%Ð%Ð%Õ%Ô%ÐÑ%Ô%Õ%Ô%Ð Ñ%Ô%Õ%Ô% 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ªt          j        d|fd||f¦  «        dt          j
        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }	dd|	iz  }
t          t          j        |
¦  «        ¦  «        ‚dx}x}}|                     ¦   «         }|d         }d}||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|d         }d}||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|d         }d}||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|d         }t!          |¦  «        }d}||k    }|sÇt          j        d|fd||f¦  «        d t          j
        ¦   «         v st          j        t           ¦  «        rt          j        t           ¦  «        nd t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        d!œz  }
d"d#|
iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}}|d         d$         d%         }d}||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}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 DATAr²   r|  r¶   r´   rh  u)   Báº£n váº½ cá»‘ng vÃ  dá»± toÃ¡n Ä‘i kÃ¨mr  r  rµ   Nr¹   r   rº   r»   r¼   rÁ   r\   r}   r~   r�   rT   rV   rM   Údrawings_countrC   Úhsmts_countrü   r~  rG   rZ   r]   r^   r   Úattached_hsmt_filer…   )r=   Úwrite_bytesr1   ræ   rç   rè   ré   rb   rc   rd   re   rf   rg   rh   ri   rÐ   rG   r
   rŸ   )r   Úpdf_drawingÚ
excel_hsmtÚf_dwgÚf_hsmtr»   rt   rn   rr   rú   rv   r·   rq   rl   rs   ro   ru   rm   rw   r¯   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Ð"Ð˜sÒ"Ð"Ð"Ð"Õ"Ô"Ð"Ð"Ð"Ð"Ð˜sÐ"Ñ"Ô"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"ˆ4Ñ"Ô"Ð"Õ"Ô"ˆ4Ñ"Ô"Ð"Ð"Õ"Ô"ÐÑ"Ô"Õ"Ô"˜sÑ"Ô"Ð"Ð"Ñ"Ð"Ð"Ð"Ð"Ð"Ñ"Ð"Õ"Õ"Ô"Ð"Ñ"Ô"Ñ"Ô"Ð"Ð"Ð"Ð"Ð"Ð"Ð"Ø�9Š9‰;Œ;€DØ�Œ>Ð&˜YÐ&ˆ>˜YÒ&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&ˆ>˜YÐ&Ñ&Ô&Õ&Ô&ˆ>Ñ&Ô&Õ&Ô&˜YÑ&Ô&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&ØÐ Ô!Ð& QÐ&Ð! QÒ&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&Ð! QÐ&Ñ&Ô&Õ&Ô&Ð!Ñ&Ô&Õ&Ô& QÑ&Ô&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ø�ÔÐ# !Ð#Ð !Ò#Ð#Ð#Ð#Õ#Ô#Ð#Ð#Ð#Ð#Ð !Ð#Ñ#Ô#Õ#Ô#ÐÑ#Ô#Õ#Ô# !Ñ#Ô#Ð#Ð#Ñ#Ð#Ð#Ð#Ð#Ð#Ñ#Ð#Õ#Õ#Ô#Ð#Ñ#Ô#Ñ#Ô#Ð#Ð#Ð#Ð#Ð#Ð#Ð#Ø�JÔÐ%�3ÐÑ Ô Ð% AÐ%Ð  AÒ%Ð%Ð%Ð%Õ%Ô%Ð%Ð%Ð%Ð%Ð  AÐ%Ñ%Ô%Ð%Õ%Ô%Ñ%Ô%Ð%Ð%Õ%Ô%�3Ñ%Ô%Ð%Õ%Ô%�3Ñ%Ô%Ð%Ð%Õ%Ô%ÐÑ%Ô%Õ%Ô%Ð Ñ%Ô%Õ%Ô% AÑ%Ô%Ð%Ð%Ñ%Ð%Ð%Ð%Ð%Ð%Ñ%Ð%Õ%Õ%Ô%Ð%Ñ%Ô%Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Ð%Ð%Ð%Ð%àˆZÔ˜ÔÐ0Ô1ðØ5WðØ1Ð5WÒWðð ð õ ìðð ð ð Ø1Ð5Wðñ ô õ ìð 	2ñô õ ìð 6Xñô ð ð ñ ð ð ð ð ð ñ ð õ õ ìðñ ô ñ ô ð ð ð ð ð ð ð õ
 "Ñ#Ô#€IØ×$Ò$ T¨*Ô%5°aÔ%8¸Ô%>Ñ?Ô?Ð?Ð?Ð?s5   »B"Á3BÁ?B"ÂB	ÂB"ÂB	ÂB"Â"B&Â)B&c           
     óf  — 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 }|slt          j        d|fd|
|f¦  «        t          j        |
¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}
x}}|	d         }
d}|
|u }|slt          j        d|fd|
|f¦  «        t          j        |
¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}
x}}| 
                    |¦  «        }|d         }
d}|
|u }|slt          j        d|fd|
|f¦  «        t          j        |
¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}
x}}|d         }
d}|
|u }|slt          j        d|fd|
|f¦  «        t          j        |
¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}
x}}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ªt          j        d(|fd)||f¦  «        d*t)          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd*t          j        |¦  «        t          j        |¦  «        d+œz  }d,d-|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|                     ¦   «         }|d.         }
d/}|
|k    }|slt          j        d(|fd0|
|f¦  «        t          j        |
¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}
x}}|d1         }
d2}|
|k    }|s�t          j        d(|fd0|
|f¦  «        t          j        |
¦  «        t          j        |¦  «        dœz  }t          j        d3¦  «        d4z   d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}
x}}|d5         }
d2}|
|k    }|s�t          j        d(|fd0|
|f¦  «        t          j        |
¦  «        t          j        |¦  «        dœz  }t          j        d6¦  «        d4z   d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}
x}}|d7         }t3          |¦  «        }d2}||k    }|sÇt          j        d(|fd8||f¦  «        d9t)          j        ¦   «         v st          j        t2          ¦  «        rt          j        t2          ¦  «        nd9t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        d:œz  }d;d<|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}}|d7         d         d=         }
d}|
|k    }|slt          j        d(|fd0|
|f¦  «        t          j        |
¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}
x}}t5          ¦   «         }|                     |d7         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_drawingTr  r  rT   rV   rM   Úis_hsmtFr²   r|  r¶   r´   u,   Báº£n váº½ vÃ  HSMT cÃ¹ng Ä‘á»‹nh dáº¡ng PDFr  r  rµ   r¹   r   rº   r»   r¼   rÁ   r\   r}   r~   r�   r„  rC   u>   Pháº£i nháº­n diá»‡n Ä‘Ãºng 1 file lÃ  Báº£n váº½ ká»¹ thuáº­tz
>assert %(py6)sr…  u6   Pháº£i nháº­n diá»‡n Ä‘Ãºng 1 file lÃ  HSMT/Dá»± toÃ¡nrü   r~  rG   rZ   r]   r^   r†  r…   )r3  r   r1   r2   r3   r4   r5   r7   r   r8   Úclassify_pdf_content_typerb   rc   rg   rh   ri   ræ   rç   rè   ré   rd   re   rf   rÐ   rê   rG   r
   rŸ   )r   r3  rk   Údrawing_pdf_pathÚdoc_dwgÚp_dwgÚhsmt_pdf_pathÚdoc_hsmtÚp_hsmtÚ	dwg_classrq   rr   rl   rs   ro   Ú
hsmt_classrŠ  r‹  r»   rt   rn   rú   rv   r·   ru   rm   rw   r¯   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Ð*Ð" dÐ*Ð*Ð*Ð*Õ*Ô*Ð*Ð*Ð*Ð*Ð" dÐ*Ñ*Ô*Õ*Ô*Ð"Ñ*Ô*Õ*Ô* dÑ*Ô*Ð*Ð*Ñ*Ð*Ð*Ð*Ð*Ð*Ñ*Ð*Õ*Õ*Ô*Ð*Ñ*Ô*Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ø�YÔÐ( 5Ð(Ð 5Ð(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(Ð 5Ð(Ñ(Ô(Õ(Ô(ÐÑ(Ô(Õ(Ô( 5Ñ(Ô(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(à×2Ò2°=ÑAÔA€JØ�iÔ Ð( DÐ(Ð  DÐ(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(Ð  DÐ(Ñ(Ô(Õ(Ô(Ð Ñ(Ô(Õ(Ô( DÑ(Ô(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ø�lÔ#Ð, uÐ,Ð# uÐ,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,Ð# uÐ,Ñ,Ô,Õ,Ô,Ð#Ñ,Ô,Õ,Ô, uÑ,Ô,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,õ 
Ð Ñ	%Ô	%ð 
¨µ°]ÀDÑ0IÔ0Ið 
ÈVÝ�{Š{Ø&ð Ø7¸Ð@QÐRðð
 àCØØ)ðððð !OØ 'ðð õ !ð) ñ 
ô 
ˆð
ð 
ð 
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
øøøð 
ð 
ð 
ð 
ð 
ð 
ð 
ñ 
ô 
ð 
ð 
ð 
ð 
ð 
ð 
øøøð 
ð 
ð 
ð 
ð0 ÔÐ"˜sÐ"Ð˜sÒ"Ð"Ð"Ð"Õ"Ô"Ð"Ð"Ð"Ð"Ð˜sÐ"Ñ"Ô"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"ˆ4Ñ"Ô"Ð"Õ"Ô"ˆ4Ñ"Ô"Ð"Ð"Õ"Ô"ÐÑ"Ô"Õ"Ô"˜sÑ"Ô"Ð"Ð"Ñ"Ð"Ð"Ð"Ð"Ð"Ñ"Ð"Õ"Õ"Ô"Ð"Ñ"Ô"Ñ"Ô"Ð"Ð"Ð"Ð"Ð"Ð"Ð"Ø�9Š9‰;Œ;€DØ�Œ>Ð&˜YÐ&ˆ>˜YÒ&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&ˆ>˜YÐ&Ñ&Ô&Õ&Ô&ˆ>Ñ&Ô&Õ&Ô&˜YÑ&Ô&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&ØÐ Ô!Ðh QÐhÐ! QÒ&ÐhÐhÐhÕhÔhÐhÐhÐhÐhÐ! QÐhÑhÔhÕhÔhÐ!ÑhÔhÕhÔh QÑhÔhÐhÐhÑhÐhÕhÔhÐ(hÑhÔhÐhÑhÐhÐhÐhÑhÐhÕhÕhÔhÐhÑhÔhÑhÔhÐhÐhÐhÐhÐhÐhÐhØ�ÔÐ] !Ð]Ð !Ò#Ð]Ð]Ð]Õ]Ô]Ð]Ð]Ð]Ð]Ð !Ð]Ñ]Ô]Õ]Ô]ÐÑ]Ô]Õ]Ô] !Ñ]Ô]Ð]Ð]Ñ]Ð]Õ]Ô]Ð%]Ñ]Ô]Ð]Ñ]Ð]Ð]Ð]Ñ]Ð]Õ]Õ]Ô]Ð]Ñ]Ô]Ñ]Ô]Ð]Ð]Ð]Ð]Ð]Ð]Ð]Ø�JÔÐ%�3ÐÑ Ô Ð% AÐ%Ð  AÒ%Ð%Ð%Ð%Õ%Ô%Ð%Ð%Ð%Ð%Ð  AÐ%Ñ%Ô%Ð%Õ%Ô%Ñ%Ô%Ð%Ð%Õ%Ô%�3Ñ%Ô%Ð%Õ%Ô%�3Ñ%Ô%Ð%Ð%Õ%Ô%ÐÑ%Ô%Õ%Ô%Ð Ñ%Ô%Õ%Ô% AÑ%Ô%Ð%Ð%Ñ%Ð%Ð%Ð%Ð%Ð%Ñ%Ð%Õ%Õ%Ô%Ð%Ñ%Ô%Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Ð%Ð%Ð%Ð%àˆZÔ˜ÔÐ0Ô1ðà6ðØ1Ø6ò	7ðð ð õ ìðð ð ð Ø1Ø6ðñ ô õ ìð 	2ñô õ ìð 7ñô ð ð ñ ð ð ð ð ð ñ ð õ õ ìðñ ô ñ ô ð ð ð ð ð ð ð õ "Ñ#Ô#€IØ×$Ò$ T¨*Ô%5°aÔ%8¸Ô%>Ñ?Ô?Ð?Ð?Ð?s6   Í?O&Î3OÏO&ÏO	ÏO&ÏO	ÏO&Ï&O*Ï-O*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ªt          j        d|	fd||f¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        d œz  }
d!d"|
iz  }t!          t          j        |¦  «        ¦  «        ‚d#x}x}	}|j        d$         }d%}	||	k    }|slt          j        d|fd&||	f¦  «        t          j        |¦  «        t          j        |	¦  «        d'œz  }d(d)|iz  }t!          t          j        |¦  «        ¦  «        ‚d#x}x}}	d*}|j        d+         }	||	v }|slt          j        d,|fd-||	f¦  «        t          j        |¦  «        t          j        |	¦  «        d'œz  }d(d)|iz  }t!          t          j        |¦  «        ¦  «        ‚d#x}x}}	|j        }t)          |¦  «        }d.}||k    }|�st          j        d/|fd0||f¦  «        d1t          j        ¦   «         v st          j        t(          ¦  «        rt          j        t(          ¦  «        nd1dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        d2œz  }d3d4|iz  }t!          t          j        |¦  «        ¦  «        ‚d#x}x}x}}d5d#l}|                     t/          j        |j        ¦  «        ¦  «        }|j        }t)          |¦  «        }d6}||k    }|�st          j        d|fd7||f¦  «        d1t          j        ¦   «         v st          j        t(          ¦  «        rt          j        t(          ¦  «        nd1d8t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd8t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        d2œz  }d3d4|iz  }t!          t          j        |¦  «        ¦  «        ‚d#x}x}x}}d9}|j        }||v }|sªt          j        d,|fd:||f¦  «        t          j        |¦  «        d8t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd8t          j        |¦  «        d;œz  }
d!d"|
iz  }t!          t          j        |¦  «        ¦  «        ‚d#x}x}}d<}|j        }||v }|sªt          j        d,|fd:||f¦  «        t          j        |¦  «        d8t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd8t          j        |¦  «        d;œz  }
d!d"|
iz  }t!          t          j        |¦  «        ¦  «        ‚d#x}x}}d=}|j        }||v }|sªt          j        d,|fd:||f¦  «        t          j        |¦  «        d8t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd8t          j        |¦  «        d;œz  }
d!d"|
iz  }t!          t          j        |¦  «        ¦  «        ‚d#x}x}}d>}|j        }||v }|sªt          j        d,|fd:||f¦  «        t          j        |¦  «        d8t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd8t          j        |¦  «        d;œz  }
d!d"|
iz  }t!          t          j        |¦  «        ¦  «        ‚d#x}x}}|d<         }d?}|d@         }|j        }t          |¦  «        }||v }|sÚt          j        d,|fdA||f¦  «        t          j        |¦  «        dBt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndBt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dCœz  }dDdE|iz  }t!          t          j        |¦  «        ¦  «        ‚d#x}x}x}x}}|                     |¦  «         d#S )Fu�   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 Testrz   r…   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)rÆ   Ú
item_orderÚwbs_coderŒ   Ú	item_nameÚcategoryrÎ   r�   r—   rÍ   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    ÌÝ¤ArÊ   z/export-excelr¾   r¿   r   rº   r»   r¼   rÁ   r\   Nrß   rh  r�   rT   rV   rM   ÚDu_Toan_BoQzcontent-dispositionrQ   rS   rà   rW   rá   rG   râ   rã   rä   r   rˆ   )zP%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.sheetnames
})
} == %(py8)sÚwbu   1. TH Kinh PhÃ­ (NÄ� 206))z2%(py1)s in %(py5)s
{%(py5)s = %(py3)s.sheetnames
})rK   rL   r�   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)zK%(py1)s in %(py9)s
{%(py9)s = %(py3)s(%(py7)s
{%(py7)s = %(py5)s.value
})
}r   )rK   rL   r�   r\   r^   zassert %(py11)sr�   )r   r=   rj  r   r
   Úcreate_drawing_takeoff_itemræ   rì   rè   ré   rb   rc   rd   re   rf   rg   rh   ri   r¸   ró   rG   ÚopenpyxlÚload_workbookrk  rl  Ú
sheetnamesÚvaluerŸ   )r   rk   r9   rn  rÆ   r¯   r»   rt   rn   rr   rú   rv   rq   rl   rs   ro   r  ru   rp   rý   r¨  r¥  Úws1r¬   rw   Ú@py_format12s                             r<   Ú"test_export_takeoff_excel_endpointr®  Ž  s  € å)Ñ+Ô+€GÝ(¨Ð3QÑRÔR€Hà×,Ò,ØØ/Ø(ð -ñ ô €Gõ
 �W˜T”]Ñ#Ô#€Jõ "Ñ#Ô#€IØ×)Ò)à$ØØØ#ØBØ#Ø!3ØØØ%Ø *ð	
ð 	
ñô ð ð ×)Ò)à$ØØØ#Ø>Ø"Ø!3ØØØ'Ø +ð	
ð 	
ñô ð õ" �:Š:Ð> ZÐ>Ð>Ð>Íˆ:ÑUÔU€DØÔÐ"˜sÐ"Ð˜sÒ"Ð"Ð"Ð"Õ"Ô"Ð"Ð"Ð"Ð"Ð˜sÐ"Ñ"Ô"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"ˆ4Ñ"Ô"Ð"Õ"Ô"ˆ4Ñ"Ô"Ð"Ð"Õ"Ô"ÐÑ"Ô"Õ"Ô"˜sÑ"Ô"Ð"Ð"Ñ"Ð"Ð"Ð"Ð"Ð"Ñ"Ð"Õ"Õ"Ô"Ð"Ñ"Ô"Ñ"Ô"Ð"Ð"Ð"Ð"Ð"Ð"Ð"àŒ�^Ô$ðàNðØ$ØNò	Oðð ð õ ìðð ð ð Ø$ØNðñ ô õ ìð 	%ñô õ ìð Oñô ð ð ñ ð ð ð ð ð ñ ð õ õ ìðñ ô ñ ô ð ð ð ð ð ð ð ð Ð?˜DœLÐ)>Ô?Ð?ˆ=Ð?Ð?Ð?Ð?Ð?Õ?Ô?Ð?Ð?Ð?Ð?ˆ=Ð?Ð?Ñ?Ô?Õ?Ô?ˆ=Ñ?Ô?Õ?Ô?Ð?Ñ?Ô?Ð?Ð?Ñ?Ð?Ð?Ð?Ð?Ð?Ñ?Ð?Õ?Õ?Ô?Ð?Ñ?Ô?Ñ?Ô?Ð?Ð?Ð?Ð?Ð?Ð?Ð?ØŒ|Ð#�3ˆ|ÑÔÐ#˜tÐ#Ð˜tÒ#Ð#Ð#Ñ#Õ#Ô#Ð#Ð#Ð#Ð#Ð˜tÐ#Ñ#Ô#Ð#Õ#Ô#Ñ#Ô#Ð#Ð#Õ#Ô#�3Ñ#Ô#Ð#Õ#Ô#�3Ñ#Ô#Ð#Ð#Ð#Õ#Ô#Ñ#Ô#Ð#Ð#Õ#Ô#ˆtÑ#Ô#Ð#Õ#Ô#ˆtÑ#Ô#Ð#Ð#Õ#Ô#ˆ|Ñ#Ô#Õ#Ô#ÐÑ#Ô#Õ#Ô#˜tÑ#Ô#Ð#Ð#Ñ#Ð#Ð#Ð#Ð#Ð#Ñ#Ð#Õ#Õ#Ô#Ð#Ñ#Ô#Ñ#Ô#Ð#Ð#Ð#Ð#Ð#Ð#Ð#Ð#Ð#ð €O€O€Oà	×	Ò	¥¤
¨4¬<Ñ 8Ô 8Ñ	9Ô	9€BØŒ}Ð"�3ˆ}ÑÔÐ" Ð"Ð Ò"Ð"Ð"Ñ"Õ"Ô"Ð"Ð"Ð"Ð"Ð Ð"Ñ"Ô"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"�3Ñ"Ô"Ð"Õ"Ô"�3Ñ"Ô"Ð"Ð"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"ˆrÑ"Ô"Ð"Õ"Ô"ˆrÑ"Ô"Ð"Ð"Õ"Ô"ˆ}Ñ"Ô"Õ"Ô"ÐÑ"Ô"Õ"Ô" Ñ"Ô"Ð"Ð"Ñ"Ð"Ð"Ð"Ð"Ð"Ñ"Ð"Õ"Õ"Ô"Ð"Ñ"Ô"Ñ"Ô"Ð"Ð"Ð"Ð"Ð"Ð"Ð"Ð"Ð"Ø&Ð7¨"¬-Ð7Ð&¨-Ð7Ð7Ð7Ð7Õ7Ô7Ð7Ð7Ð7Ð7Ð&¨-Ð7Ñ7Ô7Õ7Ô7Ð&Ñ7Ô7Ð7Õ7Ô7Ñ7Ô7Ð7Ð7Õ7Ô7¨"Ñ7Ô7Ð7Õ7Ô7¨"Ñ7Ô7Ð7Ð7Õ7Ô7¨-Ñ7Ô7Ð7Ð7Ñ7Ð7Ð7Ð7Ð7Ð7Ñ7Ð7Õ7Õ7Ô7Ð7Ñ7Ô7Ñ7Ô7Ð7Ð7Ð7Ð7Ð7Ð7Ð7Ø#Ð4 r¤}Ð4Ð# }Ð4Ð4Ð4Ð4Õ4Ô4Ð4Ð4Ð4Ð4Ð# }Ð4Ñ4Ô4Õ4Ô4Ð#Ñ4Ô4Ð4Õ4Ô4Ñ4Ô4Ð4Ð4Õ4Ô4 rÑ4Ô4Ð4Õ4Ô4 rÑ4Ô4Ð4Ð4Õ4Ô4 }Ñ4Ô4Ð4Ð4Ñ4Ð4Ð4Ð4Ð4Ð4Ñ4Ð4Õ4Õ4Ô4Ð4Ñ4Ô4Ñ4Ô4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ø/Ð@°2´=Ð@Ð/°=Ð@Ð@Ð@Ð@Õ@Ô@Ð@Ð@Ð@Ð@Ð/°=Ð@Ñ@Ô@Õ@Ô@Ð/Ñ@Ô@Ð@Õ@Ô@Ñ@Ô@Ð@Ð@Õ@Ô@°2Ñ@Ô@Ð@Õ@Ô@°2Ñ@Ô@Ð@Ð@Õ@Ô@°=Ñ@Ô@Ð@Ð@Ñ@Ð@Ð@Ð@Ð@Ð@Ñ@Ð@Õ@Õ@Ô@Ð@Ñ@Ô@Ñ@Ô@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ø+Ð<¨r¬}Ð<Ð+¨}Ð<Ð<Ð<Ð<Õ<Ô<Ð<Ð<Ð<Ð<Ð+¨}Ð<Ñ<Ô<Õ<Ô<Ð+Ñ<Ô<Ð<Õ<Ô<Ñ<Ô<Ð<Ð<Õ<Ô<¨rÑ<Ô<Ð<Õ<Ô<¨rÑ<Ô<Ð<Ð<Õ<Ô<¨}Ñ<Ô<Ð<Ð<Ñ<Ð<Ð<Ð<Ð<Ð<Ñ<Ð<Õ<Õ<Ô<Ð<Ñ<Ô<Ñ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<Ð<à
Ð%Ô
&€CØ3ÐK¸3¸t¼9ÐK¸9¼?ÐKµs¸?Ñ7KÔ7KÐKÐ3Ð7KÐKÐKÐKÐKÕKÔKÐKÐKÐKÐKÐ3Ð7KÐKÑKÔKÕKÔKÐ3ÑKÔKÐKÕKÔKÑKÔKÐKÐKÕKÔKµsÑKÔKÐKÕKÔKµsÑKÔKÐKÐKÕKÔK¸9ÑKÔKÕKÔK¸?ÑKÔKÕKÔKÐ7KÑKÔKÐKÐKÑKÐKÐKÐKÐKÐKÑKÐKÕKÕKÔKÐKÑKÔKÑKÔKÐKÐKÐKÐKÐKÐKÐKÐKÐKÐKÐKð ×$Ò$ ZÑ0Ô0Ð0Ð0Ð0r>   c                óà$  — 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ªt          j        d|fd||f¦  «        dt!          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t)          t          j        |¦  «        ¦  «        ‚dx}x}}d}|j        d         }||v }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t)          t          j        |¦  «        ¦  «        ‚dx}x}}|j        }d}||v }|s—t          j        d|fd ||f¦  «        t          j        |¦  «        d!t!          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd!d"œz  }d#d$|iz  }t)          t          j        |¦  «        ¦  «        ‚dx}}d%}||v }|s—t          j        d|fd ||f¦  «        t          j        |¦  «        d!t!          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd!d"œz  }d#d$|iz  }t)          t          j        |¦  «        ¦  «        ‚dx}}d&}||v }|s—t          j        d|fd ||f¦  «        t          j        |¦  «        d!t!          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd!d"œz  }d#d$|iz  }t)          t          j        |¦  «        ¦  «        ‚dx}}|                     d
|
› d'�t          ¬(¦  «        }|j        }d}||k    }|sªt          j        d|fd||f¦  «        d)t!          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd)t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t)          t          j        |¦  «        ¦  «        ‚dx}x}}|                     ¦   «                              d*g ¦  «        }t5          |¦  «        }d+}||k    }|sòt          j        d,|fd-||f¦  «        d.t!          j        ¦   «         v st          j        t4          ¦  «        rt          j        t4          ¦  «        nd.d/t!          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd/t          j        |¦  «        t          j        |¦  «        d0œz  }d1d2|iz  }t)          t          j        |¦  «        ¦  «        ‚dx}x}}|D �]9}d3}||v }|s—t          j        d|fd ||f¦  «        t          j        |¦  «        d4t!          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd4d"œz  }d#d$|iz  }t)          t          j        |¦  «        ¦  «        ‚dx}}d5}||v }|s—t          j        d|fd ||f¦  «        t          j        |¦  «        d4t!          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd4d"œz  }d#d$|iz  }t)          t          j        |¦  «        ¦  «        ‚dx}}|d5         }t5          |¦  «        }d}||k    }|sÇt          j        d6|fd7||f¦  «        d.t!          j        ¦   «         v st          j        t4          ¦  «        rt          j        t4          ¦  «        nd.t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        d8œz  }d9d:|iz  }t)          t          j        |¦  «        ¦  «        ‚dx}x}x}}�Œ;|                     d;t          ¬(¦  «        }|j        }d}||k    }|sªt          j        d|fd||f¦  «        d<t!          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd<t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t)          t          j        |¦  «        ¦  «        ‚dx}x}}|                     ¦   «                              d*g ¦  «        }t5          |¦  «        }d=}||k    }|sòt          j        d,|fd-||f¦  «        d.t!          j        ¦   «         v st          j        t4          ¦  «        rt          j        t4          ¦  «        nd.d>t!          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd>t          j        |¦  «        t          j        |¦  «        d0œz  }d1d2|iz  }t)          t          j        |¦  «        ¦  «        ‚dx}x}}|D �]¥} | j        }d?} ||¦  «        }|sžd@dAt!          j        ¦   «         v st          j        | ¦  «        rt          j        | ¦  «        ndAt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dBœz  }t)          t          j        |¦  «        ¦  «        ‚dx}x}}| j        }dC} ||¦  «        }|sžd@dAt!          j        ¦   «         v st          j        | ¦  «        rt          j        | ¦  «        ndAt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dBœz  }t)          t          j        |¦  «        ¦  «        ‚dx}x}}| j        }dD} ||¦  «        }|sžd@dAt!          j        ¦   «         v st          j        | ¦  «        rt          j        | ¦  «        ndAt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dBœz  }t)          t          j        |¦  «        ¦  «        ‚dx}x}}| j        }dE} ||¦  «        }|sžd@dAt!          j        ¦   «         v st          j        | ¦  «        rt          j        | ¦  «        ndAt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dBœz  }t)          t          j        |¦  «        ¦  «        ‚dx}x}}| j        }dF} ||¦  «        }|sžd@dAt!          j        ¦   «         v st          j        | ¦  «        rt          j        | ¦  «        ndAt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dBœz  }t)          t          j        |¦  «        ¦  «        ‚dx}x}}�Œ§|                     d
|
› d'�t          ¬(¦  «        }!|!j        }d}||k    }|sªt          j        d|fd||f¦  «        dGt!          j        ¦   «         v st          j        |!¦  «        rt          j        |!¦  «        ndGt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t)          t          j        |¦  «        ¦  «        ‚dx}x}}|!                     ¦   «         dH         }dI}||k    }|slt          j        d|fdJ||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t)          t          j        |¦  «        ¦  «        ‚dx}x}}|                     d
|
› d'�t          ¬(¦  «        }"|"j        } |¦   «         }|j        }d*}#g }$ ||#|$¦  «        }%t5          |%¦  «        }&d}'|&|'k    }(|(�sdt          j        d|(fdK|&|'f¦  «        d.t!          j        ¦   «         v st          j        t4          ¦  «        rt          j        t4          ¦  «        nd.dLt!          j        ¦   «         v st          j        |"¦  «        rt          j        |"¦  «        ndLt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |#¦  «        t          j        |$¦  «        t          j        |%¦  «        t          j        |&¦  «        t          j        |'¦  «        dMœ
z  })dNdO|)iz  }*t)          t          j        |*¦  «        ¦  «        ‚dx}x}x}x}#x}$x}%x}&x}(}'|                     ¦   «         5 }+|+                     ¦   «         5 },|,                     dP|
dQf¦  «         |+                     ¦   «          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 },|,                     dP|
dQf¦  «         |+                     ¦   «          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)Rut   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á»³nhrz   r…   rÊ   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Ï   r¿   r   rº   Ú
stream_resr¼   rÁ   r\   Nztext/event-streamrß   rQ   rS   rT   rV   rM   zevent: thinkingrv  Ú	body_textrx  r  r�   zevent: deltazevent: completez/chat-historyr¾   Úhist_resr·   r   rD   rF   rG   ÚmsgsrI   rN   rO   ÚmessageÚmÚmessage_textrW   rY   rZ   r]   r^   z/v1/takeoff/learned-rules/listÚ	rules_resrC   ÚrulesÚ
rule_titlezEassert %(py6)s
{%(py6)s = %(py2)s
{%(py2)s = %(py0)s.get
}(%(py4)s)
}Úr)rJ   r[   rU   rM   Úrule_categoryÚtrigger_patternÚcorrection_directiveÚcreated_by_roleÚdel_resr}   r~   r�   )z§%(py15)s
{%(py15)s = %(py0)s(%(py13)s
{%(py13)s = %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s
{%(py3)s = %(py1)s.json
}()
}.get
}(%(py9)s, %(py11)s)
})
} == %(py18)sÚ	hist_res2)
rJ   rK   rL   r�   r\   r^   r�   r‘   r’   rR  zassert %(py20)sr”   zXDELETE FROM erp_ai_takeoff_learned_rules WHERE takeoff_id = %s OR error_pattern LIKE %s;z%12.555%)!Úfastapi.testclientr   Úapp.core.postgres.erp_clientr
   Úapp.mainr°  Ú7app.modules.takeoff.application.drawing_takeoff_servicer   r=   rj  r   rç   rè   ré   rb   rc   rd   re   rf   rg   rh   ri   r¸   rë   rì   rÐ   rG   rô   rõ   rö   r÷   rø   rŸ   )-r   r   r
   r°  r   ræ   Údbrk   r9   rn  rÆ   r³  rt   rn   rr   rú   rv   rq   rl   rs   ro   r´  r$  rµ  r¶  rm   rp   r¸  ru   rw   rº  r»  r½  rÂ  rÃ  r¬   r¢   r£   r¤   rb  r¥   Ú@py_format19r¨   r  r  s-                                                r<   Ú4test_chat_train_streaming_and_clear_history_endpointrÊ  Ö  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Ø*.ðð õ !ð !ñ 
ô 
ˆ
ð Ô%Ð,¨Ð,Ð%¨Ò,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,Ð%¨Ð,Ñ,Ô,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô,ˆzÑ,Ô,Ð,Õ,Ô,ˆzÑ,Ô,Ð,Ð,Õ,Ô,Ð%Ñ,Ô,Õ,Ô,¨Ñ,Ô,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ø"ÐH jÔ&8¸Ô&HÐHÐ"Ð&HÐHÐHÐHÐHÕHÔHÐHÐHÐHÐHÐ"Ð&HÐHÑHÔHÕHÔHÐ"ÑHÔHÕHÔHÐ&HÑHÔHÐHÐHÑHÐHÐHÐHÐHÐHÑHÐHÕHÕHÔHÐHÑHÔHÑHÔHÐHÐHÐHÐHÐHÐHÐHà”Oˆ	Ø Ð-Ð  IÐ-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-Ð  IÐ-Ñ-Ô-Õ-Ô-Ð Ñ-Ô-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô- IÑ-Ô-Ð-Õ-Ô- IÑ-Ô-Ð-Ð-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-ØÐ*ˆ~ Ð*Ð*Ð*Ð*Õ*Ô*Ð*Ð*Ð*Ð*ˆ~ Ð*Ñ*Ô*Õ*Ô*ˆ~Ñ*Ô*Ð*Õ*Ô*Ñ*Ô*Ð*Ð*Õ*Ô* Ñ*Ô*Ð*Õ*Ô* Ñ*Ô*Ð*Ð*Ð*Ð*Ñ*Ð*Ð*Ð*Ð*Ð*Ñ*Ð*Õ*Õ*Ô*Ð*Ñ*Ô*Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ø Ð-Ð  IÐ-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-Ð  IÐ-Ñ-Ô-Õ-Ô-Ð Ñ-Ô-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô- IÑ-Ô-Ð-Õ-Ô- IÑ-Ô-Ð-Ð-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-ð —:’:Ø4˜:Ð4Ð4Ð4½lð ñ 
ô 
ˆð Ô#Ð* sÐ*Ð# sÒ*Ð*Ð*Ð*Õ*Ô*Ð*Ð*Ð*Ð*Ð# sÐ*Ñ*Ô*Ð*Õ*Ô*Ñ*Ô*Ð*Ð*Õ*Ô*ˆxÑ*Ô*Ð*Õ*Ô*ˆxÑ*Ô*Ð*Ð*Õ*Ô*Ð#Ñ*Ô*Õ*Ô* sÑ*Ô*Ð*Ð*Ñ*Ð*Ð*Ð*Ð*Ð*Ñ*Ð*Õ*Õ*Ô*Ð*Ñ*Ô*Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ø�}Š}‰Œ×"Ò" 6¨2Ñ.Ô.ˆÝ�4‰yŒyÐ˜AÐˆy˜AŠ~ÐÐÐÕÔÐÐÐÐˆy˜AÐÑÔÐÕÔÑÔÐÐÕÔ�sÑÔÐÕÔ�sÑÔÐÐÐÕÔÑÔÐÐÕÔ�4ÑÔÐÕÔ�4ÑÔÐÐÕÔˆyÑÔÕÔ˜AÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐØð 	.ñ 	.ˆAØÐ!�9 �>Ð!Ð!Ð!Õ!Ô!Ð!Ð!Ð!Ð!�9 Ð!Ñ!Ô!Õ!Ô!�9Ñ!Ô!Ð!Õ!Ô!Ñ!Ô!Ð!Ð!Õ!Ô! Ñ!Ô!Ð!Õ!Ô! Ñ!Ô!Ð!Ð!Ð!Ð!Ñ!Ð!Ð!Ð!Ð!Ð!Ñ!Ð!Õ!Õ!Ô!Ð!Ñ!Ô!Ñ!Ô!Ð!Ð!Ð!Ð!Ð!Ø!Ð&�> QÐ&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&�> QÐ&Ñ&Ô&Õ&Ô&�>Ñ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô& QÑ&Ô&Ð&Õ&Ô& QÑ&Ô&Ð&Ð&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ø˜Ô(Ð-•3Ð(Ñ)Ô)Ð-¨AÐ-Ð)¨AÒ-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-Ð)¨AÐ-Ñ-Ô-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô-•3Ñ-Ô-Ð-Õ-Ô-•3Ñ-Ô-Ð-Ð-Õ-Ô-Ð(Ñ-Ô-Õ-Ô-Ð)Ñ-Ô-Õ-Ô-¨AÑ-Ô-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ñ-ð —J’JÐ?Í�JÑVÔVˆ	ØÔ$Ð+¨Ð+Ð$¨Ò+Ð+Ð+Ð+Õ+Ô+Ð+Ð+Ð+Ð+Ð$¨Ð+Ñ+Ô+Ð+Õ+Ô+Ñ+Ô+Ð+Ð+Õ+Ô+ˆyÑ+Ô+Ð+Õ+Ô+ˆyÑ+Ô+Ð+Ð+Õ+Ô+Ð$Ñ+Ô+Õ+Ô+¨Ñ+Ô+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ø—’Ñ Ô ×$Ò$ V¨RÑ0Ô0ˆÝ�5‰zŒzÐ˜QÐˆz˜QŠÐÐÐÕÔÐÐÐÐˆz˜QÐÑÔÐÕÔÑÔÐÐÕÔ�sÑÔÐÕÔ�sÑÔÐÐÐÕÔÑÔÐÐÕÔ�5ÑÔÐÕÔ�5ÑÔÐÐÕÔˆzÑÔÕÔ˜QÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐØð 	,ñ 	,ˆAØ”5Ð&˜Ð&�5�5˜Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&�1Ñ&Ô&Ð&Õ&Ô&�1Ñ&Ô&Ð&Ð&Õ&Ô&�5Ñ&Ô&Õ&Ô&˜Ñ&Ô&Õ&Ô&Ð&Ñ&Ô&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ø”5Ð)˜Ð)�5�5˜Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô)�1Ñ)Ô)Ð)Õ)Ô)�1Ñ)Ô)Ð)Ð)Õ)Ô)�5Ñ)Ô)Õ)Ô)˜Ñ)Ô)Õ)Ô)Ð)Ñ)Ô)Ð)Ð)Ñ)Ð)Õ)Õ)Ô)Ð)Ñ)Ô)Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ø”5Ð+Ð*Ð+�5�5Ð*Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Õ+Ô+Ñ+Ô+Ð+Ð+Õ+Ô+�1Ñ+Ô+Ð+Õ+Ô+�1Ñ+Ô+Ð+Ð+Õ+Ô+�5Ñ+Ô+Õ+Ô+Ð*Ñ+Ô+Õ+Ô+Ð+Ñ+Ô+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ø”5Ð0Ð/Ð0�5�5Ð/Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Õ0Ô0Ñ0Ô0Ð0Ð0Õ0Ô0�1Ñ0Ô0Ð0Õ0Ô0�1Ñ0Ô0Ð0Ð0Õ0Ô0�5Ñ0Ô0Õ0Ô0Ð/Ñ0Ô0Õ0Ô0Ð0Ñ0Ô0Ð0Ð0Ñ0Ð0Õ0Õ0Ô0Ð0Ñ0Ô0Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0Ð0Ø”5Ð+Ð*Ð+�5�5Ð*Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Õ+Ô+Ñ+Ô+Ð+Ð+Õ+Ô+�1Ñ+Ô+Ð+Õ+Ô+�1Ñ+Ô+Ð+Ð+Õ+Ô+�5Ñ+Ô+Õ+Ô+Ð*Ñ+Ô+Õ+Ô+Ð+Ñ+Ô+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ñ+ð —-’-Ø4˜:Ð4Ð4Ð4½lð  ñ 
ô 
ˆð Ô"Ð) cÐ)Ð" cÒ)Ð)Ð)Ð)Õ)Ô)Ð)Ð)Ð)Ð)Ð" cÐ)Ñ)Ô)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô)ˆwÑ)Ô)Ð)Õ)Ô)ˆwÑ)Ô)Ð)Ð)Õ)Ô)Ð"Ñ)Ô)Õ)Ô) cÑ)Ô)Ð)Ð)Ñ)Ð)Ð)Ð)Ð)Ð)Ñ)Ð)Õ)Õ)Ô)Ð)Ñ)Ô)Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ø�|Š|‰~Œ~˜hÔ'Ð4¨9Ð4Ð'¨9Ò4Ð4Ð4Ð4Õ4Ô4Ð4Ð4Ð4Ð4Ð'¨9Ð4Ñ4Ô4Õ4Ô4Ð'Ñ4Ô4Õ4Ô4¨9Ñ4Ô4Ð4Ð4Ñ4Ð4Ð4Ð4Ð4Ð4Ñ4Ð4Õ4Õ4Ô4Ð4Ñ4Ô4Ñ4Ô4Ð4Ð4Ð4Ð4Ð4Ð4Ð4à—J’JØ4˜:Ð4Ð4Ð4½lð ñ 
ô 
ˆ	ð ”>Ð9�>�>Ñ#Ô#Ð9Ð#Ô'Ð9¨Ð9°Ð9Ð'Ð'¨°Ñ3Ô3Ð9�sÐ3Ñ4Ô4Ð9¸Ð9Ð4¸Ò9Ð9Ð9Ñ9Õ9Ô9Ð9Ð9Ð9Ð9Ð4¸Ð9Ñ9Ô9Ð9Õ9Ô9Ñ9Ô9Ð9Ð9Õ9Ô9�sÑ9Ô9Ð9Õ9Ô9�sÑ9Ô9Ð9Ð9Ð9Õ9Ô9Ñ9Ô9Ð9Ð9Õ9Ô9�9Ñ9Ô9Ð9Õ9Ô9�9Ñ9Ô9Ð9Ð9Õ9Ô9�>Ñ9Ô9Õ9Ô9Ð#Ñ9Ô9Õ9Ô9Ð'Ñ9Ô9Õ9Ô9¨Ñ9Ô9Õ9Ô9°Ñ9Ô9Õ9Ô9Ð3Ñ9Ô9Õ9Ô9Ð4Ñ9Ô9Õ9Ô9¸Ñ9Ô9Ð9Ð9Ñ9Ð9Ð9Ð9Ð9Ð9Ñ9Ð9Õ9Õ9Ô9Ð9Ñ9Ô9Ñ9Ô9Ð9Ð9Ð9Ð9Ð9Ð9Ð9Ð9Ð9Ð9Ð9Ð9Ð9Ð9Ð9Ð9Ð9Ð9Ð9ð ×ÒÑ Ô ð 	 DØ—’‘”ð  #Ø—’ØnØ Ð,ñô ð ð —’‘”�ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	×!Ò! *Ñ-Ô-Ð-Ð-Ð-øð ×ÒÑ Ô ð 	 DØ—’‘”ð  #Ø—’ØnØ Ð,ñô ð ð —’‘”�ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	×!Ò! *Ñ-Ô-Ð-Ð-øøøs¹   Á6ACAG ÁEAF0ÁE -AFÁFAF0ÁFAF	ÁFAF0ÁF AF	ÁF!AF0ÁF0AF4ÁF7AF4ÁGAI-ÁG'AIÁG<-AH5	ÁH)AIÁH5AH9ÁH9AIÁH<AH9ÁH=AIÁI AI-ÁIAIÁIAI-ÁIAIÁIAI-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—t          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndd œz  }d!d"|iz  }t          t          j
        |¦  «        ¦  «        ‚d#x}}d$}||v }|s—t          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndd œz  }d!d"|iz  }t          t          j
        |¦  «        ¦  «        ‚d#x}}d%}||v }|s—t          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndd œz  }d!d"|iz  }t          t          j
        |¦  «        ¦  «        ‚d#x}}d&}||v }|s—t          j        d|fd||f¦  «        t          j        |¦  «        dt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndd œz  }d!d"|iz  }t          t          j
        |¦  «        ¦  «        ‚d#x}}|d'         }d(}||k     }|slt          j        d)|fd*||f¦  «        t          j        |¦  «        t          j        |¦  «        d+œz  }	d,d-|	iz  }
t          t          j
        |
¦  «        ¦  «        ‚d#x}x}}dddd.dœddd	d/dœd
ddd0dœdddd1dœdddddœdddd2dœg}|                      |dd3¬¦  «        }d4„ |d         D ¦   «         }d}||v}|s—t          j        d5|fd6||f¦  «        t          j        |¦  «        d7t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd7d œz  }d!d"|iz  }t          t          j
        |¦  «        ¦  «        ‚d#x}}d$}||v}|s—t          j        d5|fd6||f¦  «        t          j        |¦  «        d7t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd7d œz  }d!d"|iz  }t          t          j
        |¦  «        ¦  «        ‚d#x}}d%}||v}|s—t          j        d5|fd6||f¦  «        t          j        |¦  «        d7t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd7d œz  }d!d"|iz  }t          t          j
        |¦  «        ¦  «        ‚d#x}}d&}||v}|s—t          j        d5|fd6||f¦  «        t          j        |¦  «        d7t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd7d œz  }d!d"|iz  }t          t          j
        |¦  «        ¦  «        ‚d#x}}|d'         }d8}||k    }|slt          j        d9|fd:||f¦  «        t          j        |¦  «        t          j        |¦  «        d+œz  }	d,d-|	iz  }
t          t          j
        |
¦  «        ¦  «        ‚d#x}x}}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ì   ©rÄ   rù   s     r<   ú
<listcomp>z=test_boq_audit_engine_price_quality_gates.<locals>.<listcomp>\  s"   € Ð=Ð=Ð=˜qˆQ�UŠU�6‰]Œ]Ð=Ð=Ð=r>   ÚfindingszAUDIT-PRC-01rQ   rv  Úcodesrx  r  r�   NzAUDIT-PRC-02zAUDIT-PRC-03zAUDIT-PRC-04Úquality_scorer�  )ú<)z%(py1)s < %(py4)srT   rV   rM   ið~ i@• i Åû iðU  iàg5 zHealed Testc                ó8   — g | ]}|                      d ¦  «        ‘ŒS rÔ  rÖ  r×  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>   )únot in)z%(py1)s not in %(py3)sÚhealed_codeséU   rD   r  )Ú0app.modules.takeoff.application.boq_audit_enginerÌ  Úaudit_takeoffrb   rc   rg   rd   re   rf   rh   ri   )rÌ  Úflawed_itemsÚflawed_auditrÚ  rq   rl   r$  rú   rr   rs   ro   Úhealed_itemsÚhealed_auditrß  s                 r<   Ú)test_boq_audit_engine_price_quality_gatesrç  -  s-	  € àOÐOÐOÐOÐOÐOð
 DØØØ!ð		
ð 	
ð KØØØ!ð		
ð 	
ð 3ØØØ!ð		
ð 	
ð :ØØØ ð		
ð 	
ð =ØØØ!ð		
ð 	
ð @ØØØ"ð		
ð 	
ð?%€LðN "×/Ò/Ø 9¸Mð 0ñ ô €Lð >Ð= L°Ô$<Ð=Ñ=Ô=€EàÐ"ˆ>˜UÐ"Ð"Ð"Ð"Õ"Ô"Ð"Ð"Ð"Ð"ˆ>˜UÐ"Ñ"Ô"Õ"Ô"ˆ>Ñ"Ô"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"˜UÑ"Ô"Ð"Õ"Ô"˜UÑ"Ô"Ð"Ð"Ð"Ð"Ñ"Ð"Ð"Ð"Ð"Ð"Ñ"Ð"Õ"Õ"Ô"Ð"Ñ"Ô"Ñ"Ô"Ð"Ð"Ð"Ð"Ð"ØÐ"ˆ>˜UÐ"Ð"Ð"Ð"Õ"Ô"Ð"Ð"Ð"Ð"ˆ>˜UÐ"Ñ"Ô"Õ"Ô"ˆ>Ñ"Ô"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"˜UÑ"Ô"Ð"Õ"Ô"˜UÑ"Ô"Ð"Ð"Ð"Ð"Ñ"Ð"Ð"Ð"Ð"Ð"Ñ"Ð"Õ"Õ"Ô"Ð"Ñ"Ô"Ñ"Ô"Ð"Ð"Ð"Ð"Ð"ØÐ"ˆ>˜UÐ"Ð"Ð"Ð"Õ"Ô"Ð"Ð"Ð"Ð"ˆ>˜UÐ"Ñ"Ô"Õ"Ô"ˆ>Ñ"Ô"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"˜UÑ"Ô"Ð"Õ"Ô"˜UÑ"Ô"Ð"Ð"Ð"Ð"Ñ"Ð"Ð"Ð"Ð"Ð"Ñ"Ð"Õ"Õ"Ô"Ð"Ñ"Ô"Ñ"Ô"Ð"Ð"Ð"Ð"Ð"ØÐ"ˆ>˜UÐ"Ð"Ð"Ð"Õ"Ô"Ð"Ð"Ð"Ð"ˆ>˜UÐ"Ñ"Ô"Õ"Ô"ˆ>Ñ"Ô"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"˜UÑ"Ô"Ð"Õ"Ô"˜UÑ"Ô"Ð"Ð"Ð"Ð"Ñ"Ð"Ð"Ð"Ð"Ð"Ñ"Ð"Õ"Õ"Ô"Ð"Ñ"Ô"Ñ"Ô"Ð"Ð"Ð"Ð"Ð"Ø˜Ô(Ð-¨2Ð-Ð(¨2Ò-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-Ð(¨2Ð-Ñ-Ô-Õ-Ô-Ð(Ñ-Ô-Õ-Ô-¨2Ñ-Ô-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-ð
 DØØØ ð		
ð 	
ð KØØØ!ð		
ð 	
ð 3ØØØ"ð		
ð 	
ð :ØØØð		
ð 	
ð =ØØØ!ð		
ð 	
ð @ØØØ!ð		
ð 	
ð?%€LðN "×/Ò/Ø 9¸Mð 0ñ ô €Lð EÐD¨<¸
Ô+CÐDÑDÔD€LàÐ-ˆ> Ð-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-ˆ> Ð-Ñ-Ô-Õ-Ô-ˆ>Ñ-Ô-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô- Ñ-Ô-Ð-Õ-Ô- Ñ-Ô-Ð-Ð-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-ØÐ-ˆ> Ð-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-ˆ> Ð-Ñ-Ô-Õ-Ô-ˆ>Ñ-Ô-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô- Ñ-Ô-Ð-Õ-Ô- Ñ-Ô-Ð-Ð-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-ØÐ-ˆ> Ð-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-ˆ> Ð-Ñ-Ô-Õ-Ô-ˆ>Ñ-Ô-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô- Ñ-Ô-Ð-Õ-Ô- Ñ-Ô-Ð-Ð-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-ØÐ-ˆ> Ð-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-ˆ> Ð-Ñ-Ô-Õ-Ô-ˆ>Ñ-Ô-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô- Ñ-Ô-Ð-Õ-Ô- Ñ-Ô-Ð-Ð-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ø˜Ô(Ð.¨BÐ.Ð(¨BÒ.Ð.Ð.Ð.Õ.Ô.Ð.Ð.Ð.Ð.Ð(¨BÐ.Ñ.Ô.Õ.Ô.Ð(Ñ.Ô.Õ.Ô.¨BÑ.Ô.Ð.Ð.Ñ.Ð.Ð.Ð.Ð.Ð.Ñ.Ð.Õ.Õ.Ô.Ð.Ñ.Ô.Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.r>   )r   )r   r   r   r   r   r   )r   r   ),Ú__doc__Ú
__future__r   Úbuiltinsrd   Ú_pytest.assertion.rewriteÚ	assertionÚrewriterb   rk  rï   r   Úpathlibr   r0   rÄ  r   rÅ  r
   rÆ  r   rÇ  r   r   ræ   rè   r=   rx   r°   r  r  r&  r7  r;  r>  rf  rr  rz  r‚  rŒ  r›  r®  rÊ  rç  rÃ   r>   r<   ú<module>rï     s€  ððð ð #Ð "Ð "Ð "Ð "Ð "à  € € € € € € € € € € € € €	€	€	€	Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à €€€Ø )Ð )Ð )Ð )Ð )Ð )à :Ð :Ð :Ð :Ð :Ð :Ø Ð Ð Ð Ð Ð ðð ð ð ð ð ð ð ð
 
ˆ�J�J‘L”LÑ	!Ô	!€ØÐ!8Ð9€ð %;ð/ð /ð /ð /ð /ðd
2ð 
2ð 
2ð 
2ð!4ð !4ð !4ð !4ðHLð Lð Lð Lð^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>   