§
    Ò¡’jÚC  ã                  óè   — 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
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  e e¦   «         ¦  «        Zd	d
iZ e¦   «         Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )uk   Automated test suite for AI Quá»³nh Takeoff Training, Experience Memory Bank, and Full State Price Catalog.é    )ÚannotationsN)Ú
TestClient)ÚErpDatabaseClient)Ú
create_app)ÚDrawingTakeoffService)ÚStatePriceSyncServiceÚAuthorizationzBearer dev-test-tokenc                 ó  — t          ¦   «         } |                      ¦   «         }d}||k    }|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	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         }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         }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}||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 )&uo   Kiá»ƒm thá»­ kho dá»¯ liá»‡u Báº£ng giÃ¡ cÃ´ng bá»‘ Sá»Ÿ XÃ¢y dá»±ng Háº£i PhÃ²ng Ä‘áº§y Ä‘á»§ 100+ danh má»¥c.r   ©ú>)z%(py0)s > %(py3)sÚcount©Úpy0Úpy3úassert %(py5)sÚpy5Nú2026-08ÚHAI_PHONG_KHU_VUC_2éô  )Úpublish_periodÚregion_codeÚlimitÚtotal_itemséF   ©ú>=©z%(py1)s >= %(py4)s©Úpy1Úpy4úassert %(py6)sÚpy6Úitems)z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} >= %(py7)sÚlen©r   Úpy2r    Úpy7úassert %(py9)sÚpy9Úgroup_statsé
   c                ó   — h | ]
}|d          ’ŒS )Úmaterial_group© )Ú.0Úgs     úCC:\Projects\DSCons\tests\test_ai_quynh_learning_and_state_prices.pyú	<setcomp>z9test_state_price_full_catalog_and_seed.<locals>.<setcomp>#   s   € ÐHÐHÐH¨A�AÐ&Ô'ÐHÐHÐHó    Ú	AGGREGATE©Úin)z%(py1)s in %(py3)sÚgroups_found)r   r   ÚSTEELÚEQUIPMENT_SHIFTÚLABORÚCEMENT)r   Úseed_official_state_pricesÚ
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanationÚget_full_state_price_catalogr$   )Úsvcr   Ú@py_assert2Ú@py_assert1Ú@py_format4Ú@py_format6ÚcatalogÚ@py_assert0Ú@py_assert3Ú@py_format5Ú@py_format7Ú@py_assert6Ú@py_assert5Ú@py_format8Ú@py_format10r7   s                   r1   Ú&test_state_price_full_catalog_and_seedrT      s¨  € å
Ñ
!Ô
!€CØ×*Ò*Ñ,Ô,€EØÐˆ5�1Š9ÐÐÐÕÔÐÐÐÐˆ5�1ÐÑÔÐÕÔÑÔÐÐÕÔˆ5ÑÔÐÕÔˆ5ÑÔÐÐÕÔ�1ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐð ×.Ò.Ø Ð.CÈ3ð /ñ ô €Gð �=Ô!Ð' RÐ'Ð! RÒ'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'Ð! RÐ'Ñ'Ô'Õ'Ô'Ð!Ñ'Ô'Õ'Ô' RÑ'Ô'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ø�wÔÐ&�3ÐÑ Ô Ð& BÐ&Ð  BÒ&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&Ð  BÐ&Ñ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&�3Ñ&Ô&Ð&Õ&Ô&�3Ñ&Ô&Ð&Ð&Õ&Ô&ÐÑ&Ô&Õ&Ô&Ð Ñ&Ô&Õ&Ô& BÑ&Ô&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ø�}Ô%Ð,�3Ð%Ñ&Ô&Ð,¨"Ð,Ð&¨"Ò,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,Ð&¨"Ð,Ñ,Ô,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô,�3Ñ,Ô,Ð,Õ,Ô,�3Ñ,Ô,Ð,Ð,Õ,Ô,Ð%Ñ,Ô,Õ,Ô,Ð&Ñ,Ô,Õ,Ô,¨"Ñ,Ô,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ð,ð IÐH°¸Ô1GÐHÑHÔH€LØÐ&ˆ;˜,Ð&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&ˆ;˜,Ð&Ñ&Ô&Õ&Ô&ˆ;Ñ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&˜,Ñ&Ô&Ð&Õ&Ô&˜,Ñ&Ô&Ð&Ð&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&ØÐ"ˆ7�lÐ"Ð"Ð"Ð"Õ"Ô"Ð"Ð"Ð"Ð"ˆ7�lÐ"Ñ"Ô"Õ"Ô"ˆ7Ñ"Ô"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"�lÑ"Ô"Ð"Õ"Ô"�lÑ"Ô"Ð"Ð"Ð"Ð"Ñ"Ð"Ð"Ð"Ð"Ð"Ñ"Ð"Õ"Õ"Ô"Ð"Ñ"Ô"Ñ"Ô"Ð"Ð"Ð"Ð"Ð"ØÐ,Ð Ð,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,Ð Ð,Ñ,Ô,Õ,Ô,ÐÑ,Ô,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô, Ñ,Ô,Ð,Õ,Ô, Ñ,Ô,Ð,Ð,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,ØÐ"ˆ7�lÐ"Ð"Ð"Ð"Õ"Ô"Ð"Ð"Ð"Ð"ˆ7�lÐ"Ñ"Ô"Õ"Ô"ˆ7Ñ"Ô"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"�lÑ"Ô"Ð"Õ"Ô"�lÑ"Ô"Ð"Ð"Ð"Ð"Ñ"Ð"Ð"Ð"Ð"Ð"Ñ"Ð"Õ"Õ"Ô"Ð"Ñ"Ô"Ñ"Ô"Ð"Ð"Ð"Ð"Ð"ØÐ#ˆ8�|Ð#Ð#Ð#Ð#Õ#Ô#Ð#Ð#Ð#Ð#ˆ8�|Ð#Ñ#Ô#Õ#Ô#ˆ8Ñ#Ô#Ð#Õ#Ô#Ñ#Ô#Ð#Ð#Õ#Ô#�|Ñ#Ô#Ð#Õ#Ô#�|Ñ#Ô#Ð#Ð#Ð#Ð#Ñ#Ð#Ð#Ð#Ð#Ð#Ñ#Ð#Õ#Õ#Ô#Ð#Ñ#Ô#Ñ#Ô#Ð#Ð#Ð#Ð#Ð#Ð#Ð#r3   c                 ó<  — t          ¦   «         } |                      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}}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}}t          j        t          j        |¦  «        ¦  «        }
|
j        }|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         }|j        }t%          |¦  «        }||v }|sÚt          j        d|fd||f¦  «        t          j        |¦  «        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}x}}d }|d!         }|j        }t%          |¦  «        }||v }|sÚt          j        d|fd||f¦  «        t          j        |¦  «        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}x}}|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 )%uh   Kiá»ƒm thá»­ tÃ­nh nÄƒng xuáº¥t Báº£ng giÃ¡ Sá»Ÿ XÃ¢y dá»±ng Háº£i PhÃ²ng ra file Excel (.xlsx) chuáº©n.r   r   N©úis not©z%(py0)s is not %(py3)sÚexcel_bytesr   r   r   éÐ  r   )z/%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} > %(py6)sr$   ©r   r   r   r"   úassert %(py8)sÚpy8zGia_SXD_2026-08©ú==)z-%(py2)s
{%(py2)s = %(py0)s.title
} == %(py5)sÚws©r   r&   r   úassert %(py7)sr'   u&   CÃ”NG TY TNHH XÃ‚Y Dá»°NG Ä�á»ŠNH SÆ NÚA1r5   )zK%(py1)s in %(py9)s
{%(py9)s = %(py3)s(%(py7)s
{%(py7)s = %(py5)s.value
})
}Ústr)r   r   r   r'   r)   zassert %(py11)sÚpy11u4   Báº¢NG Ä�Æ N GIÃ� Váº¬T LIá»†U XÃ‚Y Dá»°NG & CA MÃ�YÚA2é2   r   )z/%(py2)s
{%(py2)s = %(py0)s.max_row
} >= %(py5)s)r   Ú!export_full_state_prices_to_excelr=   r>   r?   r@   rA   rB   rC   rD   r$   ÚopenpyxlÚload_workbookÚioÚBytesIOÚactiveÚtitleÚvaluerd   Úmax_row)rF   rY   rG   rH   rI   rJ   rQ   Ú@py_assert4rO   Ú@py_format9Úwbr`   rM   rR   rL   rP   Ú@py_assert8rS   Ú@py_format12s                      r1   Ú&test_export_full_state_prices_to_excelrv   +   s5  € å
Ñ
!Ô
!€CØ×7Ò7ØÐ(ñô €Kð #Ð"ˆ;˜dÐ"Ð"Ð"Ð"Õ"Ô"Ð"Ð"Ð"Ð"ˆ;˜dÐ"Ñ"Ô"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"ˆ;Ñ"Ô"Ð"Õ"Ô"ˆ;Ñ"Ô"Ð"Ð"Õ"Ô"˜dÑ"Ô"Ð"Ð"Ñ"Ð"Ð"Ð"Ð"Ð"Ñ"Ð"Õ"Õ"Ô"Ð"Ñ"Ô"Ñ"Ô"Ð"Ð"Ð"Ð"Ð"Ýˆ{ÑÔÐ"˜dÐ"Ð˜dÒ"Ð"Ð"Ð"Õ"Ô"Ð"Ð"Ð"Ð"Ð˜dÐ"Ñ"Ô"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"�3Ñ"Ô"Ð"Õ"Ô"�3Ñ"Ô"Ð"Ð"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"ˆ{Ñ"Ô"Ð"Õ"Ô"ˆ{Ñ"Ô"Ð"Ð"Õ"Ô"ÐÑ"Ô"Õ"Ô"˜dÑ"Ô"Ð"Ð"Ñ"Ð"Ð"Ð"Ð"Ð"Ñ"Ð"Õ"Õ"Ô"Ð"Ñ"Ô"Ñ"Ô"Ð"Ð"Ð"Ð"Ð"Ð"Ð"õ 
Ô	¥¤
¨;Ñ 7Ô 7Ñ	8Ô	8€BØ	Œ€BØŒ8Ð(Ð(Ð(ˆ8Ð(Ò(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(ˆ8Ð(Ð(Ñ(Ô(Ð(Õ(Ô(Ñ(Ô(Ð(Ð(Õ(Ô(ˆ2Ñ(Ô(Ð(Õ(Ô(ˆ2Ñ(Ô(Ð(Ð(Õ(Ô(ˆ8Ñ(Ô(Õ(Ô(Ð(Ñ(Ô(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ø3ÐJ¸2¸d¼8ÐJ¸8¼>ÐJµs¸>Ñ7JÔ7JÐJÐ3Ð7JÐJÐJÐJÐJÕJÔJÐJÐJÐJÐJÐ3Ð7JÐJÑJÔJÕJÔJÐ3ÑJÔJÐJÕJÔJÑJÔJÐJÐJÕJÔJµsÑJÔJÐJÕJÔJµsÑJÔJÐJÐJÕJÔJ¸8ÑJÔJÕJÔJ¸>ÑJÔJÕJÔJÐ7JÑJÔJÐJÐJÑJÐJÐJÐJÐJÐJÑJÐJÕJÕJÔJÐJÑJÔJÑJÔJÐJÐJÐJÐJÐJÐJÐJÐJÐJÐJÐJØAÐXÈÈDÌÐXÈÌÐXÅSÈÑEXÔEXÐXÐAÐEXÐXÐXÐXÐXÕXÔXÐXÐXÐXÐXÐAÐEXÐXÑXÔXÕXÔXÐAÑXÔXÐXÕXÔXÑXÔXÐXÐXÕXÔXÅSÑXÔXÐXÕXÔXÅSÑXÔXÐXÐXÕXÔXÈÑXÔXÕXÔXÈÑXÔXÕXÔXÐEXÑXÔXÐXÐXÑXÐXÐXÐXÐXÐXÑXÐXÕXÕXÔXÐXÑXÔXÑXÔXÐXÐXÐXÐXÐXÐXÐXÐXÐXÐXÐXØŒ:Ð˜Ðˆ:˜ÒÐÐÐÕÔÐÐÐÐˆ:˜ÐÑÔÐÕÔÑÔÐÐÕÔˆ2ÑÔÐÕÔˆ2ÑÔÐÐÕÔˆ:ÑÔÕÔ˜ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐÐÐr3   c            	     ó‚  — 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         }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}|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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#d$|j        dfi}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         }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"                               ¦   «         5 }|                     ¦   «         5 }|                     d-¦  «         |                     ¦   «          d
d
d
¦  «         n# 1 swxY w Y   d
d
d
¦  «         n# 1 swxY w Y   n‹# t"                               ¦   «         5 }|                     ¦   «         5 }|                     d-¦  «         |                     ¦   «          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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         }d0}||k    }|slt	          j        d|fd||f¦  «        t	          j	        |¦  «        t	          j	        |¦  «        dœz  }	dd|	iz  }
t          t	          j        |
¦  «        ¦  «        ‚d
x}x}}d
S )1uN   Kiá»ƒm thá»­ cÃ¡c API endpoints cá»§a Báº£ng giÃ¡ cÃ´ng bá»‘ Sá»Ÿ XÃ¢y Dá»±ng.zJ/v1/material-prices/full-catalog?period=2026-08&region=HAI_PHONG_KHU_VUC_2©ÚheaderséÈ   r^   ©z3%(py2)s
{%(py2)s = %(py0)s.status_code
} == %(py5)sÚresra   rb   r'   NÚstatusÚsuccess©z%(py1)s == %(py4)sr   r!   r"   Údatar   rg   r   r   zO/v1/material-prices/export-full-excel?period=2026-08&region=HAI_PHONG_KHU_VUC_2Ú	res_excelzAapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheetzcontent-typer5   ©z%(py1)s in %(py4)srZ   r   )zL%(py5)s
{%(py5)s = %(py0)s(%(py3)s
{%(py3)s = %(py1)s.content
})
} > %(py8)sr$   )r   r   r   r   r]   zassert %(py10)sÚpy10Úfilezphu_luc_558_sxd_test.xlsxr   r   uP   ThÃ´ng bÃ¡o sá»‘ 558/TB-SXD ngÃ y 07/08/2026 cá»§a Sá»Ÿ XÃ¢y dá»±ng Háº£i PhÃ²ng)ÚperiodÚregionÚdocument_referencez(/v1/material-prices/import-appendix-file)Úfilesr€   ry   Ú
res_importÚtotal_importedzPDELETE FROM erp_state_published_prices WHERE material_code LIKE 'TBG-IMP-TEST%';z'/v1/material-prices/sync-from-price-refÚres_syncr   )ÚclientÚgetÚAUTH_HEADERSÚstatus_coder=   r>   r?   r@   rA   rB   rC   rD   Újsonry   Úcontentr$   ÚpostÚerp_pg_clientÚget_connectionÚcursorÚexecuteÚcommit)r|   rH   rq   rM   rJ   rR   Ú	json_datarL   rG   rN   rO   r�   Ú@py_assert7rP   rr   Ú@py_format11rˆ   r€   r‰   Úimport_dataÚconnÚcurr‹   Ú	sync_datas                           r1   Ú0test_api_material_prices_full_catalog_and_exportrŸ   =   s�  € õ �*Š*ØTÝð ñ ô €Cð Œ?Ð!˜cÐ!ˆ?˜cÒ!Ð!Ð!Ð!Õ!Ô!Ð!Ð!Ð!Ð!ˆ?˜cÐ!Ñ!Ô!Ð!Õ!Ô!Ñ!Ô!Ð!Ð!Õ!Ô!ˆ3Ñ!Ô!Ð!Õ!Ô!ˆ3Ñ!Ô!Ð!Ð!Õ!Ô!ˆ?Ñ!Ô!Õ!Ô!˜cÑ!Ô!Ð!Ð!Ñ!Ð!Ð!Ð!Ð!Ð!Ñ!Ð!Õ!Õ!Ô!Ð!Ñ!Ô!Ñ!Ô!Ð!Ð!Ð!Ð!Ð!Ð!Ð!Ø—’‘
”
€IØ�XÔÐ+ )Ð+Ð )Ò+Ð+Ð+Ð+Õ+Ô+Ð+Ð+Ð+Ð+Ð )Ð+Ñ+Ô+Õ+Ô+ÐÑ+Ô+Õ+Ô+ )Ñ+Ô+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ø�VÔ˜]Ô+Ð1¨rÐ1Ð+¨rÒ1Ð1Ð1Ð1Õ1Ô1Ð1Ð1Ð1Ð1Ð+¨rÐ1Ñ1Ô1Õ1Ô1Ð+Ñ1Ô1Õ1Ô1¨rÑ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õ —
’
ØYÝð ñ ô €Ið Ô Ð' CÐ'Ð  CÒ'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'Ð  CÐ'Ñ'Ô'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'ˆ9Ñ'Ô'Ð'Õ'Ô'ˆ9Ñ'Ô'Ð'Ð'Õ'Ô'Ð Ñ'Ô'Õ'Ô' CÑ'Ô'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'àKðàÔ˜^Ô,ðØKØ,ð	-ðð ð õ ìðð ð ð ØKØ,ðñ ô õ ìð 	Lñô õ ìð -ñô ð ð ñ ð ð ð ð ð ñ ð õ õ ìðñ ô ñ ô ð ð ð ð ð ð ð ð Ô Ð(�3Ð Ñ!Ô!Ð( DÐ(Ð! DÒ(Ð(Ð(Ñ(Õ(Ô(Ð(Ð(Ð(Ð(Ð! DÐ(Ñ(Ô(Ð(Õ(Ô(Ñ(Ô(Ð(Ð(Õ(Ô(�3Ñ(Ô(Ð(Õ(Ô(�3Ñ(Ô(Ð(Ð(Ð(Õ(Ô(Ñ(Ô(Ð(Ð(Õ(Ô(ˆyÑ(Ô(Ð(Õ(Ô(ˆyÑ(Ô(Ð(Ð(Õ(Ô(Ð Ñ(Ô(Õ(Ô(Ð!Ñ(Ô(Õ(Ô( DÑ(Ô(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ð(ðàØ+ØÔ!ØSðð
ˆð  Ø+Ø"tð
ð 
ˆõ
 —[’[Ø6ØØÝ ð	 !ñ 
ô 
ˆ
ð Ô%Ð,¨Ð,Ð%¨Ò,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,Ð%¨Ð,Ñ,Ô,Ð,Õ,Ô,Ñ,Ô,Ð,Ð,Õ,Ô,ˆzÑ,Ô,Ð,Õ,Ô,ˆzÑ,Ô,Ð,Ð,Õ,Ô,Ð%Ñ,Ô,Õ,Ô,¨Ñ,Ô,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,Ø —o’oÑ'Ô'ˆØ˜8Ô$Ð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Õ1Õ1Ô1Ð1Ñ1Ô1Ñ1Ô1Ð1Ð1Ð1Ð1Ð1Ð1Ð1ØÐ+Ô,Ð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õ ×)Ò)Ñ+Ô+ð 	¨tØ—’‘”ð  #Ø—’Øfñô ð ð —’‘”�ð	ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	øø�]×)Ò)Ñ+Ô+ð 	¨tØ—’‘”ð  #Ø—’Øfñô ð ð —’‘”�ð	ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	øøøõ �{Š{Ø1½<ð ñ ô €Hð ÔÐ& 3Ð&Ð 3Ò&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&Ð 3Ð&Ñ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&ˆ8Ñ&Ô&Ð&Õ&Ô&ˆ8Ñ&Ô&Ð&Ð&Õ&Ô&ÐÑ&Ô&Õ&Ô& 3Ñ&Ô&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ø—’‘”€IØ�XÔÐ+ )Ð+Ð )Ò+Ð+Ð+Ð+Õ+Ô+Ð+Ð+Ð+Ð+Ð )Ð+Ñ+Ô+Õ+Ô+ÐÑ+Ô+Õ+Ô+ )Ñ+Ô+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ø�]Ô#Ð* sÐ*Ð# sÒ*Ð*Ð*Ð*Õ*Ô*Ð*Ð*Ð*Ð*Ð# sÐ*Ñ*Ô*Õ*Ô*Ð#Ñ*Ô*Õ*Ô* sÑ*Ô*Ð*Ð*Ñ*Ð*Ð*Ð*Ð*Ð*Ñ*Ð*Õ*Õ*Ô*Ð*Ñ*Ô*Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ð*s‹   ÒH\6 Û\*Û*\Ü\*Ü\	Ü\*Ü\	Ü\*Ü*\.Ü1\.Ü6^>Ý^2Ý%*^	Þ^2Þ^Þ^2Þ"^Þ#^2Þ&^>Þ2^6Þ6^>Þ9^6Þ:^>c                 óî	  ‡— dddddddœ} t                                | ¦  «        }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}}t          |d         ¦  «        Št                                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}}
ˆf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                                ‰¦  «        }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}}t                                ¦   «         }ˆ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}x}}dS )&uV   Kiá»ƒm thá»­ CRUD cho Kho tri thá»©c quy táº¯c rÃºt kinh nghiá»‡m (AI QS Memory Bank).u<   Test: Báº¯t buá»™c trá»« Ä‘áº§u cá»�c BTCT trong Ä‘Ã i mÃ³ngÚSTRUCTURAL_CONCRETEÚCONCRETE_VOLUMEuN   BÃ³c bÃª tÃ´ng Ä‘Ã i mÃ³ng chÆ°a trá»« thá»ƒ tÃ­ch 0.1m cá»�c cáº¯m vÃ o Ä‘Ã iu9   Láº¥y V_Ä‘Ã i - (Sá»‘_cá»�c * Tiáº¿t_diá»‡n_cá»�c * 0.1m)u   Ká»¹ SÆ° TrÆ°á»Ÿng QS (Test)©Ú
rule_titleÚdrawing_typeÚrule_categoryÚtrigger_patternÚcorrection_directiveÚcreated_by_roleNrV   rX   Ú
saved_ruler   r   r   Úid©r¥   c              3  óJ   •K  — | ]}t          |d          ¦  «        ‰k    V — ŒdS ©r«   N©rd   ©r/   ÚrÚrule_ids     €r1   ú	<genexpr>z3test_ai_quynh_learned_rules_crud.<locals>.<genexpr>‘   s2   øè è € Ð6Ð6¨1�s�1�T”7‰|Œ|˜wÒ&Ð6Ð6Ð6Ð6Ð6Ð6r3   z,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}Úany)r   r&   r    z/v1/takeoff/learned-rules/listrx   rz   r^   r{   Úres_listra   rb   r'   c              3  óJ   •K  — | ]}t          |d          ¦  «        ‰k    V — ŒdS r®   r¯   r°   s     €r1   r³   z3test_ai_quynh_learned_rules_crud.<locals>.<genexpr>–   s2   øè è € ÐHÐH¨1�s�1�T”7‰|Œ|˜wÒ&ÐHÐHÐHÐHÐHÐHr3   r€   T©Úis)z%(py0)s is %(py3)sÚdeletedc              3  óJ   •K  — | ]}t          |d          ¦  «        ‰k    V — ŒdS r®   r¯   r°   s     €r1   r³   z3test_ai_quynh_learned_rules_crud.<locals>.<genexpr>ž   s2   øè è € Ð@Ð@¨q•3�q˜”w‘<”< 7Ò*Ð@Ð@Ð@Ð@Ð@Ð@r3   z0assert not %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
})r“   Úsave_takeoff_learned_ruler=   r>   r?   r@   rA   rB   rC   rD   rd   Úlist_takeoff_learned_rulesr´   rŒ   r�   rŽ   r�   r�   Údelete_takeoff_learned_rule)Úrule_payloadrª   rG   rH   rI   rJ   ÚrulesrM   rN   rµ   rq   rR   r¹   Úrules_afterrQ   r²   s                  @r1   Ú test_ai_quynh_learned_rules_crudrÁ   €   s^  ø€ ð UØ-Ø*ØkØ [Ø9ðð €Lõ ×8Ò8¸ÑFÔF€JØ!Ð!ˆ:˜TÐ!Ð!Ð!Ð!Õ!Ô!Ð!Ð!Ð!Ð!ˆ:˜TÐ!Ñ!Ô!Ð!Õ!Ô!Ñ!Ô!Ð!Ð!Õ!Ô!ˆ:Ñ!Ô!Ð!Õ!Ô!ˆ:Ñ!Ô!Ð!Ð!Õ!Ô!˜TÑ!Ô!Ð!Ð!Ñ!Ð!Ð!Ð!Ð!Ð!Ñ!Ð!Õ!Õ!Ô!Ð!Ñ!Ô!Ñ!Ô!Ð!Ð!Ð!Ð!Ð!Ý�*˜TÔ"Ñ#Ô#€Gõ ×4Ò4ÐBWÐ4ÑXÔX€EØ6Ð6Ð6Ð6°Ð6Ñ6Ô6Ð6�3Ð6Ñ6Ô6Ð6Ð6Ð6Ð6Ð6Õ6Ô6Ñ6Ô6Ð6Ð6Õ6Ô6�3Ñ6Ô6Ð6Õ6Ô6�3Ñ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Ð6Ð6õ �zŠzÐ:ÅLˆzÑQÔQ€HØÔÐ& 3Ð&Ð 3Ò&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&Ð 3Ð&Ñ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&ˆ8Ñ&Ô&Ð&Õ&Ô&ˆ8Ñ&Ô&Ð&Ð&Õ&Ô&ÐÑ&Ô&Õ&Ô& 3Ñ&Ô&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&ØHÐHÐHÐH°·²±´ÀÔ0GÐHÑHÔHÐH�3ÐHÑHÔHÐHÐHÐHÐHÐHÕHÔHÑHÔHÐHÐHÕHÔH�3ÑHÔHÐHÕHÔH�3Ñ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õ ×7Ò7¸Ñ@Ô@€GØÐˆ7�dˆ?ÐÐÐÕÔÐÐÐÐˆ7�dÐÑÔÐÕÔÑÔÐÐÕÔˆ7ÑÔÐÕÔˆ7ÑÔÐÐÕÔ�dÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐõ  ×:Ò:Ñ<Ô<€KØ@Ð@Ð@Ð@°KÐ@Ñ@Ô@Ð@�sÐ@Ñ@Ô@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Õ@Ô@Ñ@Ô@Ð@Ð@Õ@Ô@�sÑ@Ô@Ð@Õ@Ô@�sÑ@Ô@Ð@Ð@Õ@Ô@Ð@Ñ@Ô@Õ@Ô@Ð@Ñ@Ô@Ð@Ð@Ñ@Ð@Õ@Õ@Ô@Ð@Ñ@Ô@Ñ@Ô@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@r3   c            	     óÂ  — t                                ¦   «         5 } |                      ¦   «         5 }|                     d¦  «         t	          |                     ¦   «         d         ¦  «        }|                     d|f¦  «         |                      ¦   «          ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   	 d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}}|                     ¦   «         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         }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}||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	|› 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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}||u}|s—t          j        d0|fd1||f¦  «        d2t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd2t          j        |¦  «        d3œz  }d4d5|iz  }t#          t          j        |¦  «        ¦  «        ‚dx}}|d6         }t/          |¦  «        }d}||k    }|sÇt          j        d|fd||f¦  «        d7t          j        ¦   «         v st          j        t.          ¦  «        rt          j        t.          ¦  «        nd7t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        d œz  }	d!d"|	iz  }t#          t          j        |¦  «        ¦  «        ‚dx}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}}t                                |¦  «        }d}||u}|s—t          j        d0|fd1||f¦  «        d2t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd2t          j        |¦  «        d3œz  }d4d5|iz  }t#          t          j        |¦  «        ¦  «        ‚dx}}|d6         }t/          |¦  «        }d}||k    }|sÇt          j        d|fd||f¦  «        d7t          j        ¦   «         v st          j        t.          ¦  «        rt          j        t.          ¦  «        nd7t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        d œz  }	d!d"|	iz  }t#          t          j        |¦  «        ¦  «        ‚dx}x}x}}t                                ¦   «         5 } |                      ¦   «         5 }|                     d8|d9f¦  «         |                     d:|f¦  «         |                     d;|f¦  «         |                     d<|f¦  «         |                      ¦   «          ddd¦  «         n# 1 swxY w Y   ddd¦  «         dS # 1 swxY w Y   dS # t                                ¦   «         5 } |                      ¦   «         5 }|                     d8|d9f¦  «         |                     d:|f¦  «         |                     d;|f¦  «         |                     d<|f¦  «         |                      ¦   «          ddd¦  «         n# 1 swxY w Y   ddd¦  «         w # 1 swxY w Y   w xY w)=us   Kiá»ƒm thá»­ luá»“ng chat huáº¥n luyá»‡n AI Quá»³nh, lÆ°u tin nháº¯n vÃ  Ã¡p dá»¥ng khá»‘i lÆ°á»£ng hiá»‡u chá»‰nh.uÔ  
                INSERT INTO erp_drawing_takeoffs (
                    id, drawing_code, drawing_title, drawing_type, file_url, takeoff_status,
                    total_estimated_cost_vnd, total_concrete_volume_m3, total_formwork_area_m2,
                    total_rebar_weight_tons, total_earthwork_volume_m3, confidence_score,
                    created_at, updated_at
                ) VALUES (
                    gen_random_uuid(), 'TEST-DWG-001', 'Báº£n váº½ mÃ³ng thá»­ nghiá»‡m', 'STRUCTURAL_CONCRETE', '/static/uploads/drawings/test.dwg', 'completed',
                    100000000.0, 50.0, 120.0,
                    4.5, 80.0, 0.95,
                    NOW(), NOW()
                ) RETURNING id;
            r«   uã  
                INSERT INTO erp_drawing_takeoff_items (
                    id, takeoff_id, item_order, wbs_code, norm_code, item_name,
                    category, dimension_formula, unit, quantity, unit_price_vnd, total_amount_vnd, created_at
                ) VALUES (
                    gen_random_uuid(), %s, 1, '1.1', 'AF.11110', 'BÃª tÃ´ng Ä‘Ã i mÃ³ng M300',
                    'concrete', '10*5*1', 'm3', 50.0, 1500000.0, 75000000.0, NOW()
                );
            Nu’   Khá»‘i lÆ°á»£ng bÃª tÃ´ng Ä‘Ã i mÃ³ng bá»‹ thá»«a, pháº£i lÃ  45 m3 chá»© khÃ´ng pháº£i 50 m3. NgoÃ i ra bá»• sung vÃ¡n khuÃ´n Ä‘Ã i mÃ³ng 110 m2.Tu   Ká»¹ SÆ° TrÆ°á»Ÿng QS)Úfeedback_messageÚauto_apply_correctionsÚsender_roleú/v1/takeoff/z/chat-train)r�   ry   rz   r^   r{   Úres_chatra   rb   r'   r€   u   Quá»³nhÚai_responser5   r‚   r   r!   r"   Úsuggested_boq_itemsr   r   )z/%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} > %(py7)sr$   r%   r(   r)   Úapplied_to_takeoffr·   )z%(py1)s is %(py4)sz/chat-historyrx   Úres_histé   r   ©z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)sÚmessagesr[   r\   r]   rV   rX   Útakeoff_recordr   r   r   Útotal_concrete_volume_m3ÚfloatzXDELETE FROM erp_ai_takeoff_learned_rules WHERE takeoff_id = %s OR error_pattern LIKE %s;z%45 m3%z?DELETE FROM erp_ai_takeoff_chat_messages WHERE takeoff_id = %s;ú<DELETE FROM erp_drawing_takeoff_items WHERE takeoff_id = %s;ú/DELETE FROM erp_drawing_takeoffs WHERE id = %s;)r“   r”   r•   r–   rd   Úfetchoner—   rŒ   r’   rŽ   r�   r=   r>   r?   r@   rA   rB   rC   rD   r�   r$   r�   Úget_drawing_takeoffrÑ   )rœ   r�   Ú
takeoff_idÚchat_reqrÇ   rH   rq   rM   rJ   rR   Ú	chat_datarL   rG   rN   rO   rP   rQ   rS   rË   rÎ   rr   rÏ   rI   s                          r1   Ú.test_ai_quynh_chat_train_and_apply_correctionsrÙ   ¡   s›  € õ 
×	%Ò	%Ñ	'Ô	'ð ¨4Ø�[Š[‰]Œ]ð 	˜cØ�KŠKð ñ ô ð õ ˜SŸ\š\™^œ^¨DÔ1Ñ2Ô2ˆJð �KŠKðð �ñô ð ð �KŠK‰MŒMˆMð;	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð@6ð !uØ&*Ø2ð
ð 
ˆõ
 —;’;Ø2˜:Ð2Ð2Ð2¸Í<ð ñ 
ô 
ˆð Ô#Ð* sÐ*Ð# sÒ*Ð*Ð*Ð*Õ*Ô*Ð*Ð*Ð*Ð*Ð# sÐ*Ñ*Ô*Ð*Õ*Ô*Ñ*Ô*Ð*Ð*Õ*Ô*ˆxÑ*Ô*Ð*Õ*Ô*ˆxÑ*Ô*Ð*Ð*Õ*Ô*Ð#Ñ*Ô*Õ*Ô* sÑ*Ô*Ð*Ð*Ñ*Ð*Ð*Ð*Ð*Ð*Ñ*Ð*Õ*Õ*Ô*Ð*Ñ*Ô*Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ø—M’M‘O”O FÔ+ˆ	ØÐ4˜I mÔ4Ð4ˆyÐ4Ð4Ð4Ð4Ð4Õ4Ô4Ð4Ð4Ð4Ð4ˆyÐ4Ð4Ñ4Ô4Õ4Ô4ˆyÑ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Ô3Ð8�sÐ3Ñ4Ô4Ð8°qÐ8Ð4°qÒ8Ð8Ð8Ð8Õ8Ô8Ð8Ð8Ð8Ð8Ð4°qÐ8Ñ8Ô8Ð8Õ8Ô8Ñ8Ô8Ð8Ð8Õ8Ô8�sÑ8Ô8Ð8Õ8Ô8�sÑ8Ô8Ð8Ð8Õ8Ô8Ð3Ñ8Ô8Õ8Ô8Ð4Ñ8Ô8Õ8Ô8°qÑ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ØÐ-Ô.Ð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Ð6Ð6Ñ6Ð6Õ6Õ6Ô6Ð6Ñ6Ô6Ñ6Ô6Ð6Ð6Ð6Ð6Ð6Ð6Ð6õ —:’:Ø4˜:Ð4Ð4Ð4½lð ñ 
ô 
ˆð Ô#Ð* sÐ*Ð# sÒ*Ð*Ð*Ð*Õ*Ô*Ð*Ð*Ð*Ð*Ð# sÐ*Ñ*Ô*Ð*Õ*Ô*Ñ*Ô*Ð*Ð*Õ*Ô*ˆxÑ*Ô*Ð*Õ*Ô*ˆxÑ*Ô*Ð*Ð*Õ*Ô*Ð#Ñ*Ô*Õ*Ô* sÑ*Ô*Ð*Ð*Ñ*Ð*Ð*Ð*Ð*Ð*Ñ*Ð*Õ*Õ*Ô*Ð*Ñ*Ô*Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*Ø—=’=‘?”? 6Ô*ˆÝ�8‰}Œ}Ð! Ð!ˆ} Ò!Ð!Ð!Ð!Õ!Ô!Ð!Ð!Ð!Ð!ˆ} Ð!Ñ!Ô!Ð!Õ!Ô!Ñ!Ô!Ð!Ð!Õ!Ô!�sÑ!Ô!Ð!Õ!Ô!�sÑ!Ô!Ð!Ð!Ð!Õ!Ô!Ñ!Ô!Ð!Ð!Õ!Ô!�8Ñ!Ô!Ð!Õ!Ô!�8Ñ!Ô!Ð!Ð!Õ!Ô!ˆ}Ñ!Ô!Õ!Ô! Ñ!Ô!Ð!Ð!Ñ!Ð!Ð!Ð!Ð!Ð!Ñ!Ð!Õ!Õ!Ô!Ð!Ñ!Ô!Ñ!Ô!Ð!Ð!Ð!Ð!Ð!Ð!Ð!õ '×:Ò:¸:ÑFÔFˆØ%)Ð)ˆ~ TÐ)Ð)Ð)Ð)Õ)Ô)Ð)Ð)Ð)Ð)ˆ~ TÐ)Ñ)Ô)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô)ˆ~Ñ)Ô)Ð)Õ)Ô)ˆ~Ñ)Ô)Ð)Ð)Õ)Ô) TÑ)Ô)Ð)Ð)Ñ)Ð)Ð)Ð)Ð)Ð)Ñ)Ð)Õ)Õ)Ô)Ð)Ñ)Ô)Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Ø#Ð$>Ô?ÐD�uÐ?Ñ@Ô@ÐDÀ1ÐDÐ@À1ÒDÐDÐDÐDÕDÔDÐDÐDÐDÐDÐ@À1ÐDÑDÔDÐDÕDÔDÑDÔDÐDÐDÕDÔD�uÑDÔDÐDÕDÔD�uÑDÔDÐDÐDÕDÔDÐ?ÑDÔDÕDÔDÐ@ÑDÔDÕDÔDÀ1Ñ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Ý�8‰}Œ}Ð! Ð!ˆ} Ò!Ð!Ð!Ð!Õ!Ô!Ð!Ð!Ð!Ð!ˆ} Ð!Ñ!Ô!Ð!Õ!Ô!Ñ!Ô!Ð!Ð!Õ!Ô!�sÑ!Ô!Ð!Õ!Ô!�sÑ!Ô!Ð!Ð!Ð!Õ!Ô!Ñ!Ô!Ð!Ð!Õ!Ô!�8Ñ!Ô!Ð!Õ!Ô!�8Ñ!Ô!Ð!Ð!Õ!Ô!ˆ}Ñ!Ô!Õ!Ô! Ñ!Ô!Ð!Ð!Ñ!Ð!Ð!Ð!Ð!Ð!Ñ!Ð!Õ!Õ!Ô!Ð!Ñ!Ô!Ñ!Ô!Ð!Ð!Ð!Ð!Ð!Ð!Ð!õ '×:Ò:¸:ÑFÔFˆØ%)Ð)ˆ~ TÐ)Ð)Ð)Ð)Õ)Ô)Ð)Ð)Ð)Ð)ˆ~ TÐ)Ñ)Ô)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô)ˆ~Ñ)Ô)Ð)Õ)Ô)ˆ~Ñ)Ô)Ð)Ð)Õ)Ô) TÑ)Ô)Ð)Ð)Ñ)Ð)Ð)Ð)Ð)Ð)Ñ)Ð)Õ)Õ)Ô)Ð)Ñ)Ô)Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Ø#Ð$>Ô?ÐD�uÐ?Ñ@Ô@ÐDÀ1ÐDÐ@À1ÒDÐDÐDÐDÕDÔDÐDÐDÐDÐDÐ@À1ÐDÑDÔDÐDÕDÔDÑDÔDÐDÐDÕDÔD�uÑDÔDÐDÕDÔD�uÑDÔDÐDÐDÕDÔDÐ?ÑDÔDÕDÔDÐ@ÑDÔDÕDÔDÀ1Ñ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õ ×)Ò)Ñ+Ô+ð 	¨tØ—’‘”ð  #Ø—’ØnØ Ð+ñô ð ð —’ØUØ�Mñô ð ð —’ØRØ�Mñô ð ð —’ØEÈ
À}ñô ð ð —’‘”�ð!ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	ø�]×)Ò)Ñ+Ô+ð 	¨tØ—’‘”ð  #Ø—’ØnØ Ð+ñô ð ð —’ØUØ�Mñô ð ð —’ØRØ�Mñô ð ð —’ØEÈ
À}ñô ð ð —’‘”�ð!ð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	øøøsÂ   šB:¯A(B#ÂB:Â#B'	Â'B:Â*B'	Â+B:Â:B>ÃB>Ãe7l élé+A2k)ëlë)k-	ë-lë0k-	ë1lìlìlìoì(oì=A2n;	î/oî;n?î?oïn?ïoïoïoïoïoïoc            	     óœ  — dddddddœ} 	 t                                | ¦  «        }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}}g }|j
        }d} ||¦  «        }|}|sd}	|	}t          |¦  «        }
d}|
|k    }|�s�ddt	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }|                     |¦  «         |s.ddt          j        |	¦  «        iz  }|                     |¦  «         t          j        |d¦  «        i z  }t          j        d|fd|
|f¦  «        dt	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nd|t          j        |
¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}x}x}x}x}	x}
x}}t          |d         ¦  «        }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t          j        |¦  «        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}x}}g }|j
        }d} ||¦  «        }|}|sd}	|	}t          |¦  «        }
d#}|
|k    }|�s�dd$t	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd$t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }|                     |¦  «         |s.ddt          j        |	¦  «        iz  }|                     |¦  «         t          j        |d¦  «        i z  }t          j        d|fd|
|f¦  «        dt	          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nd|t          j        |
¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}x}x}x}x}	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        |¦  «        d0œz  }d1d2|iz  }t          t          j	        |¦  «        ¦  «        ‚dx}x}}t                                ¦   «         5 }|                     ¦   «         5 }|                     d3d4¦  «         |                     ¦   «          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 # t                                ¦   «         5 }|                     ¦   «         5 }|                     d3d4¦  «         |                     ¦   «          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)5uU   Kiá»ƒm thá»­ cÆ¡ cháº¿ chá»‘ng trÃ¹ng láº·p vÃ  gá»™p tri thá»©c cá»§a AI Quá»³nh QS.u*   Quy táº¯c kiá»ƒm tra thÃ©p Ä‘Ã i mÃ³ng D22r¡   ÚREBARuA   BÃ³c thiáº¿u thÃ©p Ä‘ai tÄƒng cÆ°á»�ng cá»™t Ä‘Ã i mÃ³ng D22 a150uO   Báº¯t buá»™c bá»• sung thÃ©p Ä‘ai tÄƒng cÆ°á»�ng D22 a150 cho má»�i Ä‘Ã i mÃ³ngu*   Ká»¹ SÆ° TrÆ°á»Ÿng QS (Deduplication Test)r£   NrV   rX   Úrule1r   r   r   Úapply_counté   z>%(py9)s
{%(py9)s = %(py5)s
{%(py5)s = %(py3)s.get
}(%(py7)s)
})r   r   r'   r)   z%(py12)sÚpy12r   )z4%(py17)s
{%(py17)s = %(py0)s(%(py15)s)
} >= %(py20)sÚint)r   Úpy15Úpy17Úpy20zassert %(py22)sÚpy22r«   r^   )z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py6)srd   Úr1_id)r   r&   r    r"   r\   r]   rÌ   Úrule2z%/v1/takeoff/learned-rules/deduplicaterx   rz   r{   Ú	res_dedupra   rb   r'   r}   r~   r   r   r!   r"   zEDELETE FROM erp_ai_takeoff_learned_rules WHERE error_pattern LIKE %s;)z
%D22 a150%)r“   r»   r=   r>   r?   r@   rA   rB   rC   rD   r�   rà   ÚappendÚ_format_booloprd   rŒ   r’   rŽ   r�   r�   r”   r•   r–   r—   )r¾   rÜ   rG   rH   rI   rJ   rq   rP   rt   Ú@py_assert11Ú@py_assert16Ú@py_assert19Ú@py_assert18rS   Ú@py_format13Ú@py_format14Ú@py_format21Ú@py_format23rå   ræ   rM   rQ   rO   rr   rç   rR   rL   rN   rœ   r�   s                                 r1   Ú4test_ai_quynh_learned_rules_deduplication_and_upsertrò   ý   s3
  € ð CØ-Ø Ø^Ø qØGðð €Lðå×7Ò7¸ÑEÔEˆØ Ð ˆu˜DÐ Ð Ð Ð Õ Ô Ð Ð Ð Ð ˆu˜DÐ Ñ Ô Ð Õ Ô Ñ Ô Ð Ð Õ Ô ˆuÑ Ô Ð Õ Ô ˆuÑ Ô Ð Ð Õ Ô ˜DÑ Ô Ð Ð Ñ Ð Ð Ð Ð Ð Ñ Ð Õ Õ Ô Ð Ñ Ô Ñ Ô Ð Ð Ð Ð Ð Ø6Ð6�5”9Ð6˜]Ð6�9�9˜]Ñ+Ô+Ð6Ð+Ð6Ð+Ð6¨qÐ6¨qÐ6�sÐ6Ñ1Ô1Ð6°QÐ6Ð1°QÒ6Ð6Ð6Ñ6Ð6Ð6Õ6Ô6Ñ6Ô6Ð6Ð6Õ6Ô6�5Ñ6Ô6Ð6Õ6Ô6�5Ñ6Ô6Ð6Ð6Õ6Ô6�9Ñ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¨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Ð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Ô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Ð6Ð6Ð6Ð6Ð6Ð6Ð6Ð6Ð6Ð6Ý�E˜$”KÑ Ô ˆõ ×7Ò7¸ÑEÔEˆØ˜”;Ð(�s�;ÑÔÐ(Ð 5Ò(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(Ð 5Ð(Ñ(Ô(Ð(Õ(Ô(Ñ(Ô(Ð(Ð(Õ(Ô(�sÑ(Ô(Ð(Õ(Ô(�sÑ(Ô(Ð(Ð(Õ(Ô(�;Ñ(Ô(Õ(Ô(ÐÑ(Ô(Ð(Õ(Ô(Ñ(Ô(Ð(Ð(Õ(Ô( 5Ñ(Ô(Ð(Õ(Ô( 5Ñ(Ô(Ð(Ð(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ø6Ð6�5”9Ð6˜]Ð6�9�9˜]Ñ+Ô+Ð6Ð+Ð6Ð+Ð6¨qÐ6¨qÐ6�sÐ6Ñ1Ô1Ð6°QÐ6Ð1°QÒ6Ð6Ð6Ñ6Ð6Ð6Õ6Ô6Ñ6Ô6Ð6Ð6Õ6Ô6�5Ñ6Ô6Ð6Õ6Ô6�5Ñ6Ô6Ð6Ð6Õ6Ô6�9Ñ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¨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Ð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Ô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Ð6Ð6Ð6Ð6Ð6Ð6Ð6Ð6Ð6Ð6õ —K’KØ3½\ð  ñ 
ô 
ˆ	ð Ô$Ð+¨Ð+Ð$¨Ò+Ð+Ð+Ð+Õ+Ô+Ð+Ð+Ð+Ð+Ð$¨Ð+Ñ+Ô+Ð+Õ+Ô+Ñ+Ô+Ð+Ð+Õ+Ô+ˆyÑ+Ô+Ð+Õ+Ô+ˆyÑ+Ô+Ð+Ð+Õ+Ô+Ð$Ñ+Ô+Õ+Ô+¨Ñ+Ô+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ø�~Š~ÑÔ Ô)Ð6¨YÐ6Ð)¨YÒ6Ð6Ð6Ð6Õ6Ô6Ð6Ð6Ð6Ð6Ð)¨YÐ6Ñ6Ô6Õ6Ô6Ð)Ñ6Ô6Õ6Ô6¨YÑ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õ ×)Ò)Ñ+Ô+ð 	¨tØ—’‘”ð  #Ø—’Ø[Ø#ñô ð ð —’‘”�ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	ø�]×)Ò)Ñ+Ô+ð 	¨tØ—’‘”ð  #Ø—’Ø[Ø#ñô ð ð —’‘”�ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	øøøsŠ   ‹\-_ Ý^5Ý&+^Þ^5Þ^!	Þ!^5Þ$^!	Þ%^5Þ5^9Þ<^9ßaß`?ß1+`(	à`?à(`,à,`?à/`,à0`?à3aà?aáaáaáac                 óz  — t          ¦   «         } 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¬¦  «        }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         }	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}
|	|
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(}||z  }t          |¦  «        }|	|k    }|sÚt          j        d|fd)|	|f¦  «        t          j        |	¦  «        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}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}}
t                               ¦   «         5 }|                     ¦   «         5 }|                     d0¦  «         t!          |                     ¦   «         d1         ¦  «        }|                     d2|f¦  «         |                     ¦   «          ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   	 t&                               d3|› d4�t*          ¬5¦  «        }|j        }d6}||k    }
|
sªt          j        d|
fd7||f¦  «        d8t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd8t          j        |¦  «        t          j        |¦  «        d9œ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                               |¦  «        }t          |¦  «        }d}||k    }|sòt          j        d|fd@||f¦  «        dt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddAt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndAt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}}|d         d#         }t3          |¦  «        }
d(}|
|k    }|sÇt          j        d|fdB|
|f¦  «        dCt          j        ¦   «         v st          j        t2          ¦  «        rt          j        t2          ¦  «        ndCt          j        |¦  «        t          j        |
¦  «        t          j        |¦  «        dDœz  }dEdF|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}
x}}|d         d&         }t3          |¦  «        }
d?}|
|k    }|sÇt          j        d|fdB|
|f¦  «        dCt          j        ¦   «         v st          j        t2          ¦  «        rt          j        t2          ¦  «        ndCt          j        |¦  «        t          j        |
¦  «        t          j        |¦  «        dDœz  }dEdF|iz  }t          t          j
        |¦  «        ¦  «        ‚dx}x}
x}}t                               ¦   «         5 }|                     ¦   «         5 }|                     dG|f¦  «         |                     dH|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 # t                               ¦   «         5 }|                     ¦   «         5 }|                     dG|f¦  «         |                     dH|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)Iu�   Kiá»ƒm thá»­ tá»± Ä‘á»™ng khá»›p ná»‘i Ä‘Æ¡n giÃ¡ Sá»Ÿ XÃ¢y Dá»±ng 2026 vÃ  tá»· lá»‡ Ä‘Æ¡n vá»‹ 100m3 (Triá»‡t tiÃªu sai sá»‘ lÃ m trÃ²n 100x).rÞ   z2.6zAB.1111u#   Ä�Ã o váº­n chuyá»ƒn Ä‘áº¥t cáº¥p IÚ100m3g\�Âõ()@r   )Ú
item_orderÚwbs_codeÚ	norm_codeÚ	item_nameÚunitÚquantityÚunit_price_vndÚtotal_amount_vndrÌ   z2.7zAB.2222u#   Váº­n chuyá»ƒn bÃ¹n, Ä‘áº¥t cáº¥p Ié   z3.1zAF.1111u   BÃª tÃ´ng lÃ³t mÃ³ng M100Úm3g      .@Úhydraulic_culvertr¬   r   rÍ   r$   Ú	processedr[   r\   r]   Nrù   r^   r   r   r!   r"   rû   g    €ORAr   rü   g    8œŒAg    8œ\A)z>%(py1)s == %(py10)s
{%(py10)s = %(py3)s((%(py5)s * %(py7)s))
}Úround)r   r   r   r'   rƒ   zassert %(py12)srß   g    �0Ag    n
nAuÒ  
                INSERT INTO erp_drawing_takeoffs (
                    id, drawing_code, drawing_title, drawing_type, file_url, takeoff_status,
                    total_estimated_cost_vnd, total_concrete_volume_m3, total_formwork_area_m2,
                    total_rebar_weight_tons, total_earthwork_volume_m3, confidence_score,
                    created_at, updated_at
                ) VALUES (
                    gen_random_uuid(), 'TEST-DWG-SCALE', 'Báº£n váº½ kiá»ƒm thá»­ scale 100m3', 'hydraulic_culvert', '/static/uploads/drawings/test_scale.pdf', 'completed',
                    0.0, 0.0, 0.0,
                    0.0, 0.0, 0.95,
                    NOW(), NOW()
                ) RETURNING id;
            r«   uó  
                INSERT INTO erp_drawing_takeoff_items (
                    id, takeoff_id, item_order, wbs_code, norm_code, item_name,
                    category, dimension_formula, unit, quantity, unit_price_vnd, total_amount_vnd, created_at
                ) VALUES (
                    gen_random_uuid(), %s, 1, '2.6', 'AB.1111', 'Váº­n chuyá»ƒn bÃ¹n, Ä‘áº¥t cáº¥p I',
                    'earthwork', '12.555 100m3', '100m3', 12.555, 75000.0, 941625.0, NOW()
                );
            rÆ   z/reapply-rules-and-pricesrx   rz   r{   Úres_reapplyra   rb   r'   r}   r~   Útotal_estimated_cost_vndg   9s–A)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sÚupdated_db_items)z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)srÑ   r%   r(   r)   rÒ   rÓ   )r   Ú$apply_learned_rules_and_state_pricesr$   r=   r>   r?   r@   rA   rB   rC   rD   r  r“   r”   r•   r–   rd   rÔ   r—   rŒ   r’   rŽ   r�   r�   Úlist_drawing_takeoff_itemsrÑ   )rF   Ú	raw_itemsr   rG   rQ   rq   rO   rr   Úitem_daorL   rM   rN   Úitem_vcrP   rt   Ú@py_assert9rš   rî   Úitem_btrœ   r�   Útk_idr  rH   rJ   rR   Úres_datar  rS   s                                r1   Ú-test_ai_quynh_unit_scaling_and_sxd_price_syncr  %  s)  € å
Ñ
!Ô
!€Cð
 ØØ"Ø>ØØØØ !ð		
ð 		
ð ØØ"Ø>ØØØØ !ð		
ð 		
ð ØØ"Ø4ØØØØ !ð		
ð 		
ð+€IðD ×8Ò8ØÐ 3ð 9ñ ô €Iõ ˆy‰>Œ>Ð˜QÐˆ>˜QÒÐÐÐÕÔÐÐÐÐˆ>˜QÐÑÔÐÕÔÑÔÐÐÕÔ�3ÑÔÐÕÔ�3ÑÔÐÐÐÕÔÑÔÐÐÕÔˆyÑÔÐÕÔˆyÑÔÐÐÕÔˆ>ÑÔÕÔ˜QÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐà˜Œ|€HØ�FÔÐ&˜wÐ&Ð˜wÒ&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&Ð˜wÐ&Ñ&Ô&Õ&Ô&ÐÑ&Ô&Õ&Ô&˜wÑ&Ô&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&àÐ!Ô"ðØ&/ðØ" iÒ/ðð ð õ ìðð ð ð Ø" iðñ ô õ ìð 	#ñô õ ìð '0ñô ð ð ñ ð ð ð ð ð ñ ð õ õ ìðñ ô ñ ô ð ð ð ð ð ð ð ð Ð&Ô'Ð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Ð5Ð5Ð5Ñ5Ð5Õ5Õ5Ô5Ð5Ñ5Ô5Ñ5Ô5Ð5Ð5Ð5Ð5Ð5Ð5Ð5ð ˜Œl€GØ�6Œ?Ð%˜gÐ%ˆ?˜gÒ%Ð%Ð%Ð%Õ%Ô%Ð%Ð%Ð%Ð%ˆ?˜gÐ%Ñ%Ô%Õ%Ô%ˆ?Ñ%Ô%Õ%Ô%˜gÑ%Ô%Ð%Ð%Ñ%Ð%Ð%Ð%Ð%Ð%Ñ%Ð%Õ%Õ%Ô%Ð%Ñ%Ô%Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Ð%Ð%ØÐ#Ô$Ð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Õ1Õ1Ô1Ð1Ñ1Ô1Ñ1Ô1Ð1Ð1Ð1Ð1Ð1Ð1Ð1ØÐ%Ô&ÐC°ÐC¸ÐC°¸Ñ0BÐC­%Ð0BÑ*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Ð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Ð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ÐCÐCÐCð ˜Œl€GØÐ#Ô$Ð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Õ1Õ1Ô1Ð1Ñ1Ô1Ñ1Ô1Ð1Ð1Ð1Ð1Ð1Ð1Ð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Ð4Ð4Ñ4Ð4Õ4Õ4Ô4Ð4Ñ4Ô4Ñ4Ô4Ð4Ð4Ð4Ð4Ð4Ð4Ð4õ 
×	%Ò	%Ñ	'Ô	'ð ¨4Ø�[Š[‰]Œ]ð 	˜cØ�KŠKð ñ ô ð õ ˜Ÿš™œ tÔ,Ñ-Ô-ˆEà�KŠKðð �ñô ð ð �KŠK‰MŒMˆMð9	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð>Ý—k’kØ;˜5Ð;Ð;Ð;Å\ð "ñ 
ô 
ˆð Ô&Ð-¨#Ð-Ð&¨#Ò-Ð-Ð-Ð-Õ-Ô-Ð-Ð-Ð-Ð-Ð&¨#Ð-Ñ-Ô-Ð-Õ-Ô-Ñ-Ô-Ð-Ð-Õ-Ô-ˆ{Ñ-Ô-Ð-Õ-Ô-ˆ{Ñ-Ô-Ð-Ð-Õ-Ô-Ð&Ñ-Ô-Õ-Ô-¨#Ñ-Ô-Ð-Ð-Ñ-Ð-Ð-Ð-Ð-Ð-Ñ-Ð-Õ-Õ-Ô-Ð-Ñ-Ô-Ñ-Ô-Ð-Ð-Ð-Ð-Ð-Ð-Ð-Ø×#Ò#Ñ%Ô%ˆØ˜Ô!Ð. YÐ.Ð! YÒ.Ð.Ð.Ð.Õ.Ô.Ð.Ð.Ð.Ð.Ð! YÐ.Ñ.Ô.Õ.Ô.Ð!Ñ.Ô.Õ.Ô. YÑ.Ô.Ð.Ð.Ñ.Ð.Ð.Ð.Ð.Ð.Ñ.Ð.Õ.Õ.Ô.Ð.Ñ.Ô.Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.Ð.ØÐ2Ô3ÐA°zÐAÐ3°zÒAÐAÐAÐAÕAÔAÐAÐAÐAÐAÐ3°zÐAÑAÔAÕAÔAÐ3ÑAÔAÕAÔA°zÑ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õ )×CÒCÀEÑJÔJÐÝÐ#Ñ$Ô$Ð)¨Ð)Ð$¨Ò)Ð)Ð)Ð)Õ)Ô)Ð)Ð)Ð)Ð)Ð$¨Ð)Ñ)Ô)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô)�sÑ)Ô)Ð)Õ)Ô)�sÑ)Ô)Ð)Ð)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô)Ð#Ñ)Ô)Ð)Õ)Ô)Ð#Ñ)Ô)Ð)Ð)Õ)Ô)Ð$Ñ)Ô)Õ)Ô)¨Ñ)Ô)Ð)Ð)Ñ)Ð)Ð)Ð)Ð)Ð)Ñ)Ð)Õ)Õ)Ô)Ð)Ñ)Ô)Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ø% aÔ(Ð)9Ô:ÐH�uÐ:Ñ;Ô;ÐH¸yÐHÐ;¸yÒHÐHÐHÐHÕHÔHÐHÐHÐHÐHÐ;¸yÐHÑHÔHÐHÕHÔHÑHÔHÐHÐHÕHÔH�uÑHÔHÐHÕHÔH�uÑHÔHÐHÐHÕHÔHÐ:ÑHÔHÕHÔHÐ;ÑHÔHÕHÔH¸yÑ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Ø% aÔ(Ð);Ô<ÐK�uÐ<Ñ=Ô=ÐKÀÐKÐ=ÀÒKÐKÐKÐKÕKÔKÐKÐKÐKÐKÐ=ÀÐKÑKÔKÐKÕKÔKÑKÔKÐKÐKÕKÔK�uÑKÔKÐKÕKÔK�uÑ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ÔKÑKÔKÐKÐKÐKÐKÐKÐKÐKÐKÐKõ ×)Ò)Ñ+Ô+ð 	¨tØ—’‘”ð  #Ø—’ØRØ�Hñô ð ð —’ÐMÐPUÈxÑXÔXÐXØ—’‘”�ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	ð 	ø�]×)Ò)Ñ+Ô+ð 	¨tØ—’‘”ð  #Ø—’ØRØ�Hñô ð ð —’ÐMÐPUÈxÑXÔXÐXØ—’‘”�ðð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	øøøsÄ   Ø2[ÙA(Z;Ú/[Ú;Z?	Ú?[ÛZ?	Û[Û[Û[ÛTr ðrð%Aq4ñ(rñ4q8	ñ8rñ;q8	ñ<ròròròt:ò3t.óAt	ôt.ôtôt.ôtôt.ô"t:ô.t2ô2t:ô5t2ô6t:)Ú__doc__Ú
__future__r   Úbuiltinsr?   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter=   rk   ri   Úfastapi.testclientr   Úapp.core.postgres.erp_clientr   Úapp.mainr   Ú7app.modules.takeoff.application.drawing_takeoff_servicer   Ú:app.modules.inventory.application.state_price_sync_servicer   rŒ   rŽ   r“   rT   rv   rŸ   rÁ   rÙ   rò   r  r.   r3   r1   ú<module>r     sV  ðØ qÐ qà "Ð "Ð "Ð "Ð "Ð "à  € € € € € € € € € € € € €	€	€	€	à €€€Ø )Ð )Ð )Ð )Ð )Ð )à :Ð :Ð :Ð :Ð :Ð :Ø Ð Ð Ð Ð Ð Ø YÐ YÐ YÐ YÐ YÐ YØ \Ð \Ð \Ð \Ð \Ð \à	ˆ�J�J‘L”LÑ	!Ô	!€ØÐ!8Ð9€Ø!Ð!Ñ#Ô#€ð$ð $ð $ð.ð ð ð$@+ð @+ð @+ðFAð Að AðBYð Yð Yðx%ð %ð %ðPwð wð wð wð wr3   