§
    ~Ø”jš   ã                  ó´   — 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mZ d dlmZ d dlmZ d dlmZ d d	lmZmZ d
diZd„ Zd„ Zd„ Zd„ Zd„ ZdS )é    )ÚannotationsN)ÚPath)Ú
TestClient)ÚErpDatabaseClient)Úapp)Úget_vision_system_prompt)ÚBoqRateBreakdownEngine)Úbuild_quynh_fallback_responseÚbuild_quynh_system_promptÚAuthorizationzBearer dev-test-tokenc                 ób	  — t          d¦  «        } | j        } |¦   «         }|s t          j        d¦  «        dz   dt	          j        ¦   «         v st          j        | ¦  «        rt          j        | ¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }t          t          j	        |¦  «        ¦  «        ‚dx}}|  
                    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}||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S )uy   Kiá»ƒm tra vÄƒn báº£n ThÃ´ng tÆ° 38/2026/TT-BXD Ä‘Ã£ Ä‘Æ°á»£c náº¡p Ä‘áº§y Ä‘á»§ vÃ o Knowledge Base theo chuáº©n Rule 4.zPKNOWLEDGE_BASE/LAW/THONG_TU/Thong_Tu_38_2026_TT_BXD_Dinh_Muc_Du_Toan_Xay_Dung.mduH   Tá»‡p ThÃ´ng tÆ° 38/2026/TT-BXD khÃ´ng tá»“n táº¡i trong KNOWLEDGE_BASE!zC
>assert %(py4)s
{%(py4)s = %(py2)s
{%(py2)s = %(py0)s.exists
}()
}Úkb_path©Úpy0Úpy2Úpy4Nzutf-8)Úencodingú38/2026/TT-BXD©Úin©z%(py1)s in %(py3)sÚcontent©Úpy1Úpy3úassert %(py5)sÚpy5úAC.22111úAC.22112úAC.11110õ	   cá»�c treÚLarsen)r   ÚexistsÚ
@pytest_arÚ_format_assertmsgÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanationÚ	read_textÚ_call_reprcompare)	r   Ú@py_assert1Ú@py_assert3Ú@py_format5r   Ú@py_assert0Ú@py_assert2Ú@py_format4Ú@py_format6s	            ú7C:\Projects\DSCons\tests\test_thong_tu_38_norm_rules.pyÚ8test_thong_tu_38_knowledge_base_file_exists_and_metadatar6      sÞ  € åØZñô €Gð Œ>ð ˆ>ˆ>ÑÔð Ðð õ ìð 	Sñô ð ñ ð õ ìñô ð ð õ ìð ñ ô ð õ ìð ñ ô ð ð õ ìð ñ ô õ ìð ñ ô ð ð ñ ð õ õ ìðñ ô ñ ô ð ð ð ð ð ð ×Ò¨ÐÑ1Ô1€GØÐ&Ð˜wÐ&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&Ð˜wÐ&Ñ&Ô&Õ&Ô&ÐÑ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&˜wÑ&Ô&Ð&Õ&Ô&˜wÑ&Ô&Ð&Ð&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&ØÐ ˆ:˜Ð Ð Ð Ð Õ Ô Ð Ð Ð Ð ˆ:˜Ð Ñ Ô Õ Ô ˆ:Ñ Ô Ð Õ Ô Ñ Ô Ð Ð Õ Ô ˜Ñ Ô Ð Õ Ô ˜Ñ Ô Ð Ð Ð Ð Ñ Ð Ð Ð Ð Ð Ñ Ð Õ Õ Ô Ð Ñ Ô Ñ Ô Ð Ð Ð Ð Ð ØÐ ˆ:˜Ð Ð Ð Ð Õ Ô Ð Ð Ð Ð ˆ:˜Ð Ñ Ô Õ Ô ˆ:Ñ Ô Ð Õ Ô Ñ Ô Ð Ð Õ Ô ˜Ñ Ô Ð Õ Ô ˜Ñ Ô Ð Ð Ð Ð Ñ Ð Ð Ð Ð Ð Ñ Ð Õ Õ Ô Ð Ñ Ô Ñ Ô Ð Ð Ð Ð Ð ØÐ ˆ:˜Ð Ð Ð Ð Õ Ô Ð Ð Ð Ð ˆ:˜Ð Ñ Ô Õ Ô ˆ:Ñ Ô Ð Õ Ô Ñ Ô Ð Ð Õ Ô ˜Ñ Ô Ð Õ Ô ˜Ñ Ô Ð Ð Ð Ð Ñ Ð Ð Ð Ð Ð Ñ Ð Õ Õ Ô Ð Ñ Ô Ñ Ô Ð Ð Ð Ð Ð ØÐ!ˆ;˜'Ð!Ð!Ð!Ð!Õ!Ô!Ð!Ð!Ð!Ð!ˆ;˜'Ð!Ñ!Ô!Õ!Ô!ˆ;Ñ!Ô!Ð!Õ!Ô!Ñ!Ô!Ð!Ð!Õ!Ô!˜'Ñ!Ô!Ð!Õ!Ô!˜'Ñ!Ô!Ð!Ð!Ð!Ð!Ñ!Ð!Ð!Ð!Ð!Ð!Ñ!Ð!Õ!Õ!Ô!Ð!Ñ!Ô!Ñ!Ô!Ð!Ð!Ð!Ð!Ð!ØÐˆ8�wÐÐÐÐÕÔÐÐÐÐˆ8�wÐÑÔÕÔˆ8ÑÔÐÕÔÑÔÐÐÕÔ�wÑÔÐÕÔ�wÑÔÐÐÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐó    c                 óÎ  — t          j        d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}||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„ |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          j        d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}||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}}t          j        d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 ¦   «         }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}}dS )!u‡   Kiá»ƒm tra Ä‘á»™ng cÆ¡ phÃ¢n rÃ£ Ä‘Æ¡n giÃ¡ tá»± Ä‘á»™ng gÃ¡n mÃ£ AC.22111 (Ã©p cá»«) vÃ  AC.22112 (nhá»• cá»«) theo TT 38/2026/TT-BXD.uI   Ã‰p cá»�c cá»« thÃ©p Larsen IV L=12m gia cá»‘ há»‘ mÃ³ng báº±ng bÃºa rungÚ
foundationÚmdg    €1÷@)Ú	item_nameÚcategoryÚunitÚtotal_unit_priceÚ	norm_coder   ©ú==©z%(py1)s == %(py4)s©r   r   úassert %(py6)sÚpy6NÚmaterial_cost_vndr   )ú>)z%(py1)s > %(py4)sÚlabor_cost_vndÚequipment_cost_vndÚmaterial_breakdownc              3  ó>   K  — | ]}d |d         v p	d|d         v V — ŒdS )zTHUE-CU-LARSENÚmaterial_coder"   Úmaterial_nameN© ©Ú.0Úms     r5   ú	<genexpr>zFtest_boq_breakdown_engine_larsen_sheet_piling_norms.<locals>.<genexpr>8   sO   è è € ð ð àð 	˜A˜oÔ.Ð.ÐP°(¸aÀÔ>PÐ2Pðð ð ð ð ð r7   ú,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}Úanyr   uL   Nhá»• cá»�c cá»« thÃ©p Larsen IV sau khi hoÃ n thÃ nh káº¿t cáº¥u há»‘ mÃ³ngg     ùå@r   u>   Ä�Ã³ng cá»�c tre tÆ°Æ¡i L=2.5m d>=60-80mm gia cá»‘ ná»�n mÃ³ngu   cá»�cg     Ó@r    c              3  ób   K  — | ]*}d |d         v pd|d                               ¦   «         v V — Œ+dS )zCOC-TRErL   r!   rM   N)ÚlowerrO   s     r5   rR   zFtest_boq_breakdown_engine_larsen_sheet_piling_norms.<locals>.<genexpr>Q   s[   è è € ð ð àð 	�Q�Ô'Ð'ÐT¨;¸!¸OÔ:L×:RÒ:RÑ:TÔ:TÐ+Tðð ð ð ð ð r7   )r	   Úbreakdown_item_rater$   r-   r)   r*   r+   rT   r&   r'   r(   )Úres_epr1   r/   r2   r0   Ú@py_format7Úmats_epr.   Úres_nhoÚres_treÚmats_tres              r5   Ú3test_boq_breakdown_engine_larsen_sheet_piling_normsr^   (   s$  € õ $Ô7Ø]ØØØ ð	ñ ô €Fð �+ÔÐ, *Ð,Ð *Ò,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,Ð *Ð,Ñ,Ô,Õ,Ô,ÐÑ,Ô,Õ,Ô, *Ñ,Ô,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,ØÐ%Ô&Ð*¨Ð*Ð&¨Ò*Ð*Ð*Ð*Õ*Ô*Ð*Ð*Ð*Ð*Ð&¨Ð*Ñ*Ô*Õ*Ô*Ð&Ñ*Ô*Õ*Ô*¨Ñ*Ô*Ð*Ð*Ñ*Ð*Ð*Ð*Ð*Ð*Ñ*Ð*Õ*Õ*Ô*Ð*Ñ*Ô*Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*ØÐ"Ô#Ð' aÐ'Ð# aÒ'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'Ð# aÐ'Ñ'Ô'Õ'Ô'Ð#Ñ'Ô'Õ'Ô' aÑ'Ô'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'ØÐ&Ô'Ð+¨!Ð+Ð'¨!Ò+Ð+Ð+Ð+Õ+Ô+Ð+Ð+Ð+Ð+Ð'¨!Ð+Ñ+Ô+Õ+Ô+Ð'Ñ+Ô+Õ+Ô+¨!Ñ+Ô+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+ð Ð)Ô*€Gðð àðñ ô ð �3ð ñ ô ð ð ð ð ð õ ìñô ð ð õ ìõ ñ ô ð õ ìõ ñ ô ð ð õ ìðñ ô õ ìðñ ô ð ð ñ ð õ õ ìðñ ô ñ ô ð ð ð ð ð õ %Ô8Ø`ØØØ ð	ñ ô €Gð �;ÔÐ- :Ð-Ð :Ò-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-Ð :Ð-Ñ-Ô-Õ-Ô-ÐÑ-Ô-Õ-Ô- :Ñ-Ô-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-ØÐ#Ô$Ð( qÐ(Ð$ qÒ(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(Ð$ qÐ(Ñ(Ô(Õ(Ô(Ð$Ñ(Ô(Õ(Ô( qÑ(Ô(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(ØÐ'Ô(Ð,¨1Ð,Ð(¨1Ò,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,Ð(¨1Ð,Ñ,Ô,Õ,Ô,Ð(Ñ,Ô,Õ,Ô,¨1Ñ,Ô,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,õ %Ô8ØRØØØ ð	ñ ô €Gð �;ÔÐ- :Ð-Ð :Ò-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-Ð :Ð-Ñ-Ô-Õ-Ô-ÐÑ-Ô-Õ-Ô- :Ñ-Ô-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-ØÐ+Ô,€Hðð àðñ ô ð �3ð ñ ô ð ð ð ð ð õ ìñô ð ð õ ìõ ñ ô ð õ ìõ ñ ô ð ð õ ìðñ ô õ ìðñ ô ð ð ñ ð õ õ ìðñ ô ñ ô ð ð ð ð ð ð ð r7   c                 ó(	  — t          ¦   «         } 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}|| 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}}t          ¦   «         }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S )u}   Kiá»ƒm tra System Prompt cá»§a AI Quá»³nh Ä‘Ã£ Ä‘Æ°á»£c tÃ­ch há»£p báº£ng tra cá»©u Ä‘á»‹nh má»©c ThÃ´ng tÆ° 38/2026/TT-BXD.u   ThÃ´ng tÆ° 38/2026/TT-BXDr   r   Úvision_promptr   r   r   Nr   r   r    u>   TUYá»†T Ä�á»�I KHÃ”NG DÃ™NG MÃƒ AC.11110 CHO Cá»ŒC Cá»ª LARSENÚtraining_prompt)
r   r$   r-   r)   r&   r'   r(   r*   r+   r   )r`   r1   r2   r3   r4   ra   s         r5   Ú4test_ai_quynh_system_prompts_grounded_in_thong_tu_38rb   W   su  € å,Ñ.Ô.€MØ&Ð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ØÐ&ˆ:˜Ð&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&ˆ:˜Ð&Ñ&Ô&Õ&Ô&ˆ:Ñ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&˜Ñ&Ô&Ð&Õ&Ô&˜Ñ&Ô&Ð&Ð&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&ØÐ&ˆ:˜Ð&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&ˆ:˜Ð&Ñ&Ô&Õ&Ô&ˆ:Ñ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&˜Ñ&Ô&Ð&Õ&Ô&˜Ñ&Ô&Ð&Ð&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&ØÐ&ˆ:˜Ð&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&ˆ:˜Ð&Ñ&Ô&Õ&Ô&ˆ:Ñ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&˜Ñ&Ô&Ð&Õ&Ô&˜Ñ&Ô&Ð&Ð&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&ØKÐ\ÐKÈ}Ð\Ð\Ð\Ð\Õ\Ô\Ð\Ð\Ð\Ð\ÐKÈ}Ð\Ñ\Ô\Õ\Ô\ÐKÑ\Ô\Ð\Õ\Ô\Ñ\Ô\Ð\Ð\Õ\Ô\È}Ñ\Ô\Ð\Õ\Ô\È}Ñ\Ô\Ð\Ð\Ð\Ð\Ñ\Ð\Ð\Ð\Ð\Ð\Ñ\Ð\Õ\Õ\Ô\Ð\Ñ\Ô\Ñ\Ô\Ð\Ð\Ð\Ð\Ð\å/Ñ1Ô1€OØ&Ð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Õ9Õ9Ô9Ð9Ñ9Ô9Ñ9Ô9Ð9Ð9Ð9Ð9Ð9ØÐ(ˆ:˜Ð(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(ˆ:˜Ð(Ñ(Ô(Õ(Ô(ˆ:Ñ(Ô(Ð(Õ(Ô(Ñ(Ô(Ð(Ð(Õ(Ô(˜Ñ(Ô(Ð(Õ(Ô(˜Ñ(Ô(Ð(Ð(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(r7   c            
     óh  — ddddddddd	d
œ	g} t          dd| 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         }||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 ¦   «         }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}}|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 ¦   «         }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}}dS )&us   Kiá»ƒm tra pháº£n há»“i hiá»‡u chá»‰nh cá»§a AI Quá»³nh khi nháº­n chá»‰ Ä‘áº¡o vá»� cá»« Larsen vÃ  ThÃ´ng tÆ° 38.zitem-1é   ú1.2r    õ2   Ã‰p cá»�c cá»« thÃ©p Larsen IV gia cá»‘ há»‘ mÃ³ngr9   ç     ¸ª@ç    €„þ@r:   )	ÚidÚ
item_orderÚwbs_coder?   r;   r<   ÚquantityÚunit_price_vndr=   uw   AC.11110 lÃ  Ä‘á»‹nh má»©c cá»�c tre, cá»« Larsen quy Ä‘á»‹nh táº¡i ThÃ´ng tÆ° 38/2026/TT-BXD lÃ  AC.22111 vÃ  AC.22112u   Ká»¹ SÆ° TrÆ°á»ŸngÚhydraulic_culvert)Úuser_messageÚcurrent_user_nameÚcurrent_itemsÚdrawing_typeu   ThÃ´ng tÆ° sá»‘ 38/2026/TT-BXDÚreply_messager   )z%(py1)s in %(py4)srC   rD   rE   Nr   Úsuggested_correctionsc              3  óH   K  — | ]}|                      d ¦  «        dk    V — ŒdS ©r?   r   N)Úget©rP   Úis     r5   rR   zQtest_ai_quynh_fallback_correction_learns_thong_tu_38_directive.<locals>.<genexpr>   s3   è è € ÐEÐE°Aˆq�uŠu�[Ñ!Ô! ZÒ/ÐEÐEÐEÐEÐEÐEr7   rS   rT   r   Úextracted_rules©ú>=)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)sÚlenÚrules)r   r   r   rE   zassert %(py8)sÚpy8c              3  ó>   K  — | ]}d |d         v p	d|d         v V — ŒdS )r   Úcorrection_ruler   NrN   )rP   Úrs     r5   rR   zQtest_ai_quynh_fallback_correction_learns_thong_tu_38_directive.<locals>.<genexpr>„   sQ   è è € ð ð àð 	˜AÐ/Ô0Ð0ÐV°JÀ!ÐDUÔBVÐ4Vðð ð ð ð ð r7   )r
   r$   r-   r)   r*   r+   rT   r&   r'   r(   r}   )Údummy_itemsÚrespr1   r/   r2   r0   rY   Úcorrectionsr.   r~   Ú@py_assert5Ú@py_assert4Ú@py_format9s                r5   Ú>test_ai_quynh_fallback_correction_learns_thong_tu_38_directiver‰   e   s¿  € ð ØØØ#ØMØ$ØØ&Øð
	
ð 
	
ð€Kõ )ð OØ.Ø!Ø(ð	ñ ô €Dð ,ÐD¨t°OÔ/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ÐDÐDÐDÐDÑDÐDÕDÕDÔDÐDÑDÔDÑDÔDÐDÐDÐDÐDÐDÐDÐDØÐ.˜˜oÔ.Ð.ˆ:Ð.Ð.Ð.Ð.Ð.Õ.Ô.Ð.Ð.Ð.Ð.ˆ:Ð.Ð.Ñ.Ô.Õ.Ô.ˆ:Ñ.Ô.Õ.Ô.Ð.Ñ.Ô.Ð.Ð.Ñ.Ð.Ð.Ð.Ð.Ð.Ñ.Ð.Õ.Õ.Ô.Ð.Ñ.Ô.Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.Ð.ð Ð.Ô/€KØEÐE¸ÐEÑEÔEÐE�3ÐEÑEÔEÐEÐEÐEÐEÐEÕEÔEÑEÔEÐEÐEÕEÔE�3ÑEÔEÐEÕEÔE�3ÑEÔEÐEÐEÕEÔEÐEÑEÔEÕEÔEÐEÑEÔEÐEÐEÑEÐEÕEÕEÔEÐEÑEÔEÑEÔEÐEÐEÐEÐEÐEð Ð"Ô#€EÝˆu‰:Œ:Ð˜Ðˆ:˜Š?ÐÐÐÕÔÐÐÐÐˆ:˜ÐÑÔÐÕÔÑÔÐÐÕÔ�3ÑÔÐÕÔ�3ÑÔÐÐÐÕÔÑÔÐÐÕÔˆuÑÔÐÕÔˆuÑÔÐÐÕÔˆ:ÑÔÕÔ˜ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐðð àðñ ô ð �3ð ñ ô ð ð ð ð ð õ ìñô ð ð õ ìõ ñ ô ð õ ìõ ñ ô ð ð õ ìðñ ô õ ìðñ ô ð ð ñ ð õ õ ìðñ ô ñ ô ð ð ð ð ð ð ð r7   c                 ó  — t          t          ¦  «        } t          ¦   «         }t          t	          j        ¦   «         ¦  «        }t          t	          j        ¦   «         ¦  «        }	 |                     |dddddœ¦  «         |                     ||dddd	d
ddddœ
¦  «         |                      d|› d�t          dddœ¬¦  «        }|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#}||
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*         }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/d0|	iz  }t#          t          j        |¦  «        ¦  «        ‚dx}x}x}}|                     |¦  «        }d1„ |D ¦   «         }t-          |¦  «        }|s•d2d3t          j        ¦   «         v st          j        t,          ¦  «        rt          j        t,          ¦  «        nd3t          j        |¦  «        t          j        |¦  «        d4œz  }t#          t          j        |¦  «        ¦  «        ‚dx}}|                     ¦   «         5 }|                     ¦   «         5 }|                     d5|f¦  «         |                     d6|f¦  «         |                     d7|f¦  «         |                     d8¦  «         |                     ¦   «          ddd¦  «         n# 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS # |                     ¦   «         5 }|                     ¦   «         5 }|                     d5|f¦  «         |                     d6|f¦  «         |                     d7|f¦  «         |                     d8¦  «         |                     ¦   «          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)9ut   Kiá»ƒm thá»­ API chat huáº¥n luyá»‡n AI Quá»³nh tiáº¿p thu quy táº¯c ThÃ´ng tÆ° 38/2026/TT-BXD vÃ  Rule 12 teardown.zDWG-TEST-TT38u&   Báº£n váº½ Cá»‘ng KÃªnh Thá»­ Nghiá»‡mrn   g    „×‡A)ri   Údrawing_codeÚdrawing_titlerr   Útotal_estimated_cost_vndrd   re   r    rf   r9   rg   rh   r:   )
ri   Ú
takeoff_idrj   rk   r?   r;   r<   rl   rm   r=   z/v1/takeoff/z/chat-trainu^   MÃ£ AC.11110 lÃ  cá»�c tre, cá»« Larsen pháº£i Ã¡p mÃ£ AC.22111 theo ThÃ´ng tÆ° 38/2026/TT-BXDT)ÚmessageÚ
auto_apply)ÚheadersÚjsonéÈ   r@   )z3%(py2)s
{%(py2)s = %(py0)s.status_code
} == %(py5)sÚpost_res)r   r   r   zassert %(py7)sÚpy7NÚstatusÚsuccessrB   rC   rD   rE   rs   r   r   Údatar   r   r   rt   r{   )z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} >= %(py7)sr}   )r   r   r   r•   zassert %(py9)sÚpy9c              3  ó.   K  — | ]}|d          dk    V — ŒdS rv   rN   rx   s     r5   rR   zCtest_api_chat_train_quynh_larsen_norm_correction.<locals>.<genexpr>¼   s+   è è € Ð?Ð?°A�1�[”> ZÒ/Ð?Ð?Ð?Ð?Ð?Ð?r7   rS   rT   r   z<DELETE FROM erp_drawing_takeoff_items WHERE takeoff_id = %s;z?DELETE FROM erp_ai_takeoff_chat_messages WHERE takeoff_id = %s;z/DELETE FROM erp_drawing_takeoffs WHERE id = %s;zwDELETE FROM erp_ai_takeoff_learned_rules WHERE learned_from_user LIKE '%TEST%' OR error_pattern LIKE '%DWG-TEST-TT38%';)r   r   r   ÚstrÚuuidÚuuid4Úcreate_drawing_takeoffÚcreate_drawing_takeoff_itemÚpostÚAUTH_HEADERSÚstatus_coder$   r-   r&   r'   r(   r)   r*   r+   r’   r}   Úlist_drawing_takeoff_itemsrT   Úget_connectionÚcursorÚexecuteÚcommit)ÚclientÚ
erp_clientrŽ   Úitem_idr”   r.   r‡   r/   r4   Ú@py_format8r˜   r1   r2   r0   rY   r3   Ú@py_assert6r†   Ú@py_format10ÚitemsÚconnÚcurs                         r5   Ú0test_api_chat_train_quynh_larsen_norm_correctionr±   Š   sÏ  € å�‰_Œ_€FÝ"Ñ$Ô$€Jå•T”Z‘\”\Ñ"Ô"€JÝ•$”*‘,”,ÑÔ€Gð>Ø×)Ò)à Ø /Ø!IØ 3Ø,6ðð ñ	
ô 	
ð 	
ð 	×.Ò.àØ(ØØ!Ø'ØQØ(Ø"Ø"*Øðð ñ	
ô 	
ð 	
ð  —;’;Ø2˜:Ð2Ð2Ð2Ý à{Ø"ðð ð ñ 
ô 
ˆð Ô#Ð* sÐ*Ð# sÒ*Ð*Ð*Ð*Õ*Ô*Ð*Ð*Ð*Ð*Ð# sÐ*Ñ*Ô*Ð*Õ*Ô*Ñ*Ô*Ð*Ð*Õ*Ô*ˆxÑ*Ô*Ð*Õ*Ô*ˆxÑ*Ô*Ð*Ð*Õ*Ô*Ð#Ñ*Ô*Õ*Ô* sÑ*Ô*Ð*Ð*Ñ*Ð*Ð*Ð*Ð*Ð*Ñ*Ð*Õ*Õ*Ô*Ð*Ñ*Ô*Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ø�}Š}‰ŒˆØ�HŒ~Ð* Ð*ˆ~ Ò*Ð*Ð*Ð*Õ*Ô*Ð*Ð*Ð*Ð*ˆ~ Ð*Ñ*Ô*Õ*Ô*ˆ~Ñ*Ô*Õ*Ô* Ñ*Ô*Ð*Ð*Ñ*Ð*Ð*Ð*Ð*Ð*Ñ*Ð*Õ*Õ*Ô*Ð*Ñ*Ô*Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*ØÐ&ˆ $Ð&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&ˆ $Ð&Ñ&Ô&Õ&Ô&ˆÑ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô& $Ñ&Ô&Ð&Õ&Ô& $Ñ&Ô&Ð&Ð&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&ØÐ/Ô0Ð6�sÐ0Ñ1Ô1Ð6°QÐ6Ð1°QÒ6Ð6Ð6Ð6Õ6Ô6Ð6Ð6Ð6Ð6Ð1°QÐ6Ñ6Ô6Ð6Õ6Ô6Ñ6Ô6Ð6Ð6Õ6Ô6�sÑ6Ô6Ð6Õ6Ô6�sÑ6Ô6Ð6Ð6Õ6Ô6Ð0Ñ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Ð6Ð6ð ×5Ò5°jÑAÔAˆØ?Ð?¸Ð?Ñ?Ô?Ð?�sÐ?Ñ?Ô?Ð?Ð?Ð?Ð?Ð?Õ?Ô?Ñ?Ô?Ð?Ð?Õ?Ô?�sÑ?Ô?Ð?Õ?Ô?�sÑ?Ô?Ð?Ð?Õ?Ô?Ð?Ñ?Ô?Õ?Ô?Ð?Ñ?Ô?Ð?Ð?Ñ?Ð?Õ?Õ?Ô?Ð?Ñ?Ô?Ñ?Ô?Ð?Ð?Ð?Ð?Ð?ð ×&Ò&Ñ(Ô(ð 	¨DØ—’‘”ð  #Ø—’ØRØ�Mñô ð ð —’ØUØ�Mñô ð ð —’ØEÈ
À}ñô ð ð —’ð Nñô ð ð —’‘”�ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	øˆZ×&Ò&Ñ(Ô(ð 	¨DØ—’‘”ð  #Ø—’ØRØ�Mñô ð ð —’ØUØ�Mñô ð ð —’ØEÈ
À}ñô ð ð —’ð Nñô ð ð —’‘”�ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	øøøs�   Á$PU ÒT6Ò#A/TÔT6ÔT"	Ô"T6Ô%T"	Ô&T6Ô6T:Ô=T:ÕXÕW?Õ-A/W(	×W?×(W,×,W?×/W,×0W?×3X×?XØXØXØX)Ú
__future__r   Úbuiltinsr&   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter$   rœ   Úpathlibr   Úfastapi.testclientr   Úapp.core.postgres.erp_clientr   Úapp.mainr   Ú.app.modules.takeoff.application.vision_promptsr   Ú:app.modules.takeoff.application.boq_rate_breakdown_servicer	   Ú0app.modules.takeoff.application.learning_promptsr
   r   r¡   r6   r^   rb   r‰   r±   rN   r7   r5   ú<module>r¾      s=  ðØ "Ð "Ð "Ð "Ð "Ð "ð Nà  € € € € € € € € € € € € €€€€Ø Ð Ð Ð Ð Ð à )Ð )Ð )Ð )Ð )Ð )à :Ð :Ð :Ð :Ð :Ð :Ø Ð Ð Ð Ð Ð Ø SÐ SÐ SÐ SÐ SÐ SØ ]Ð ]Ð ]Ð ]Ð ]Ð ]ðð ð ð ð ð ð ð ð
  Ð!8Ð9€ðð ð ð$,ð ,ð ,ð^)ð )ð )ð"ð "ð "ðJFð Fð Fð Fð Fr7   