§
    •ž™jË  ã                  óÊ   — d dl mZ 	 d dlZd dlmc mZ d dlm	Z	 d dl
Z
d dlmZ d dlmZ d dlmZ d dlmZ d„ ej        e<    ee¦  «        Z e¦   «         Zd	„ Zd
„ Zd„ Zd„ ZdS )é    )ÚannotationsN)ÚDecimal)Ú
TestClient)Úapp)Úget_current_user)ÚBoQMaterialAllocationServicec                 ó   — dddddœS )Nzadmin-idzadmin@dscons.vnÚ
superadminu$   Ban Quáº£n Trá»‹ Há»‡ Thá»‘ng DSCons)ÚidÚemailÚroleÚ	full_name© r   ó    ú@C:\Projects\DSCons\tests\test_boq_material_allocation_service.pyú<lambda>r      s   € Ø
ØØØ7ð	6ð 6€ r   c                 ót  — t                                ¦   «         } t          | ¦  «        }d}||k    }|sòt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddt          j        ¦   «         v st          j        | ¦  «        rt          j        | ¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚d	x}x}}t                                d
d| ¬¦  «        }t          |¦  «        }d}||k    }|sòt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚d	x}x}}|D ]†}|d         }d}	||	k    }|slt          j        d|fd||	f¦  «        t          j        |¦  «        t          j        |	¦  «        dœz  }
dd|
iz  }t          t          j
        |¦  «        ¦  «        ‚d	x}x}}	Œ‡t                                dd| ¬¦  «        }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}}	Œ‡t                                dd| ¬¦  «        }t          |¦  «        }d}||k    }|sòt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddt          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚d	x}x}}|D �]í}g }|d         }d}||k    }|}|sQd}|d         }||v }|}|s?d }|j        }d!}d"} |||¦  «        }t          |¦  «        }|j        } |¦   «         }||v }|}|�s^t          j        d|fd#||f¦  «        t          j        |¦  «        t          j        |¦  «        d$œz  }d%d|iz  }|                     |¦  «         |�s»t          j        d&|fd'||f¦  «        t          j        |¦  «        t          j        |¦  «        d(œz  }d)d*|iz  }|                     |¦  «         |�sXt          j        d&|fd+||f¦  «        t          j        |¦  «        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        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        t          j        |¦  «        d.œ
z  }d/d0|iz  }|                     |¦  «         t          j        |d¦  «        i z  }d1d2|iz  }t          t          j
        |¦  «        ¦  «        ‚d	x}x}x}x}x}x}x}x}x}x}x}x}x}x}x}x}}�Œïd	S )3uY   Kiá»ƒm tra nháº­n diá»‡n quy cÃ¡ch ká»¹ thuáº­t Ä‘áº·c thÃ¹: DÃ¢n dá»¥ng vs Thá»§y lá»£i.r   ©ú>©z/%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} > %(py6)sÚlenÚactive_boqs©Úpy0Úpy1Úpy3Úpy6úassert %(py8)sÚpy8Nu   TÃ´n máº¡ mÃ u dÃ y 0.45 mmÚROOFING)Ú	item_nameÚmaterial_groupÚactive_boq_itemsé   )ú>=)z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)sÚcand_tonÚproject_codezDA-2608281122©ú==©z%(py1)s == %(py4)s©r   Úpy4úassert %(py6)sr   u   Gáº¡ch xÃ¢y khÃ´ng nungÚBRICKÚ	cand_gachu%   Rá»� Ä‘Ã¡ máº¡ káº½m bá»�c nhá»±a PVCÚ	WIRE_MESHÚ
cand_ro_daz
DA-2026-41ÚDADOu	   Ä‘a Ä‘á»™Úclient_nameÚ )z%(py3)s == %(py6)s)r   r   z%(py8)s©Úin)z%(py11)s in %(py14)s)Úpy11Úpy14z%(py16)sÚpy16)z±%(py19)s in %(py36)s
{%(py36)s = %(py34)s
{%(py34)s = %(py32)s
{%(py32)s = %(py21)s(%(py30)s
{%(py30)s = %(py24)s
{%(py24)s = %(py22)s.get
}(%(py26)s, %(py28)s)
})
}.lower
}()
}ÚstrÚc)
Úpy19Úpy21Úpy22Úpy24Úpy26Úpy28Úpy30Úpy32Úpy34Úpy36z%(py38)sÚpy38zassert %(py41)sÚpy41)ÚserviceÚget_project_boq_materialsr   Ú
@pytest_arÚ_call_reprcompareÚ@py_builtinsÚlocalsÚ_should_repr_global_nameÚ	_safereprÚAssertionErrorÚ_format_explanationÚdetermine_candidate_projectsÚgetr:   ÚlowerÚappendÚ_format_boolop) r   Ú@py_assert2Ú@py_assert5Ú@py_assert4Ú@py_format7Ú@py_format9r&   r;   Ú@py_assert0Ú@py_assert3Ú@py_format5r/   r1   Ú@py_assert1Ú@py_assert10Ú@py_assert13Ú@py_assert12Ú@py_assert18Ú@py_assert23Ú@py_assert25Ú@py_assert27Ú@py_assert29Ú@py_assert31Ú@py_assert33Ú@py_assert35Ú@py_assert20Ú@py_format15Ú@py_format17Ú@py_format37Ú@py_format39Ú@py_format40Ú@py_format42s                                    r   Ú%test_spec_matching_civil_vs_hydraulicrr      sP  € å×3Ò3Ñ5Ô5€KÝˆ{ÑÔÐ˜aÐÐ˜aÒÐÐÐÕÔÐÐÐÐÐ˜aÐÑÔÐÕÔÑÔÐÐÕÔ�3ÑÔÐÕÔ�3ÑÔÐÐÐÕÔÑÔÐÐÕÔˆ{ÑÔÐÕÔˆ{ÑÔÐÐÕÔÐÑÔÕÔ˜aÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐõ ×3Ò3Ø/Ø Ø$ð 4ñ ô €Hõ
 ˆx‰=Œ=Ð˜AÐˆ=˜AÒÐÐÐÕÔÐÐÐÐˆ=˜AÐÑÔÐÕÔÑÔÐÐÕÔ�3ÑÔÐÕÔ�3ÑÔÐÐÐÕÔÑÔÐÐÕÔˆxÑÔÐÕÔˆxÑÔÐÐÕÔˆ=ÑÔÕÔ˜AÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐØð 4ð 4ˆØ�Ô Ð3 OÐ3Ð  OÒ3Ð3Ð3Ð3Õ3Ô3Ð3Ð3Ð3Ð3Ð  OÐ3Ñ3Ô3Õ3Ô3Ð Ñ3Ô3Õ3Ô3 OÑ3Ô3Ð3Ð3Ñ3Ð3Ð3Ð3Ð3Ð3Ñ3Ð3Õ3Õ3Ô3Ð3Ñ3Ô3Ñ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3õ ×4Ò4Ø+ØØ$ð 5ñ ô €Iõ
 ˆy‰>Œ>Ð˜QÐˆ>˜QÒÐÐÐÕÔÐÐÐÐˆ>˜QÐÑÔÐÕÔÑÔÐÐÕÔ�3ÑÔÐÕÔ�3ÑÔÐÐÐÕÔÑÔÐÐÕÔˆyÑÔÐÕÔˆyÑÔÐÐÕÔˆ>ÑÔÕÔ˜QÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐØð 4ð 4ˆØ�Ô Ð3 OÐ3Ð  OÒ3Ð3Ð3Ð3Õ3Ô3Ð3Ð3Ð3Ð3Ð  OÐ3Ñ3Ô3Õ3Ô3Ð Ñ3Ô3Õ3Ô3 OÑ3Ô3Ð3Ð3Ñ3Ð3Ð3Ð3Ð3Ð3Ñ3Ð3Õ3Õ3Ô3Ð3Ñ3Ô3Ñ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3õ ×5Ò5Ø9Ø"Ø$ð 6ñ ô €Jõ
 ˆz‰?Œ?Ð˜aÐˆ?˜aÒÐÐÐÕÔÐÐÐÐˆ?˜aÐÑÔÐÕÔÑÔÐÐÕÔ�3ÑÔÐÕÔ�3ÑÔÐÐÐÕÔÑÔÐÐÕÔˆzÑÔÐÕÔˆzÑÔÐÐÕÔˆ?ÑÔÕÔ˜aÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐØð Hñ Hˆð 	Hð  	Hˆq�Ô ð  	H Lð  	HÐ  LÒ0ð  	Hð  	Hð  	Hð  	Hð  	H°Fð  	H¸aÀÔ>Oð  	H°FÐ>OÐ4Oð  	Hð  	Hð  	Hð  	Hð  	HÐS^ð  	HÐfgÔfkð  	HÐlyð  	HÐ{}ð  	HÐfkÐfkÐlyÐ{}Ñf~Ôf~ð  	HÕbeÐf~ÑbÔbð  	HÐbô  cFð  	Hð  cFð  cFñ  cHô  cHð  	HÐS^ð  cHð  THð  	Hð  	Hð  	Hð  	Hñ  	Hõ  	Hô  	Hð  	Hð  	Hð  	Hð  	HÐ  Lð  	Hñ  	Hô  	Hõ  	Hô  	HÐ ñ  	Hô  	Hõ  	Hô  	H Lñ  	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°FÐ>Oð  	Hñ  	Hô  	Hõ  	Hô  	H°Fñ  	Hô  	Hõ  	Hô  	HÐ>Oñ  	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ÐS^ð  cHð  	Hñ  	Hô  	Hõ  	Hô  	HÐS^ñ  	Hô  	Hð  	Hõ  	Hô  	Hñ  	Hô  	Hð  	Hð  	Hõ  	Hô  	HÕbeñ  	Hô  	Hð  	Hõ  	Hô  	HÕbeñ  	Hô  	Hð  	Hð  	Hð  	Hõ  	Hô  	Hñ  	Hô  	Hð  	Hð  	Hõ  	Hô  	HÐfgñ  	Hô  	Hð  	Hõ  	Hô  	HÐfgñ  	Hô  	Hð  	Hð  	Hõ  	Hô  	HÐfkñ  	Hô  	Hõ  	Hô  	HÐlyñ  	Hô  	Hõ  	Hô  	HÐ{}ñ  	Hô  	Hõ  	Hô  	HÐf~ñ  	Hô  	Hõ  	Hô  	HÐbñ  	Hô  	Hõ  	Hô  	Hð  cFñ  	Hô  	Hõ  	Hô  	Hð  cHñ  	Hô  	Hð  	Hð  	Hñ  	Hð  	Hð  	Hð  	Hð  	Hð  	Hñ  	Hð  	Hð  	H÷  	Hò  	Hð  	Hñ  	Hô  	Hð  	Hõ  	Hô  	Hð  	Hð  	Hñ  	Hô  	Hð  	Hñ  	Hð  	Hð  	Hð  	Hð  	Hð  	Hñ  	Hð  	Hõ  	Hõ  	Hô  	Hð  	Hñ  	Hô  	Hñ  	Hô  	Hð  	Hð  	Hð  	Hð  	Hð  	Hð  	Hð  	Hð  	Hð  	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r   c            	     óˆ  — dddt          d¦  «        t          d¦  «        t          d¦  «        dœdd	d
t          d¦  «        t          d¦  «        t          d¦  «        dœg} t          d¦  «        t          d¦  «        t          d¦  «        t          d¦  «        dœ}t                               || ¦  «        }t          |¦  «        }d}||k    }|sòt	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        t          ¦  «        rt	          j	        t          ¦  «        nddt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        t	          j	        |¦  «        dœz  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}}t          d„ |D ¦   «         ¦  «        }t          d„ |D ¦   «         ¦  «        }	|d         }
d}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	        |¦  «        dœz  }d d!|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}
x}x}}|	d         }
d}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	        |¦  «        dœz  }d d!|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}
x}x}}|d"         }
d#}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	        |¦  «        dœz  }d d!|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}
x}x}}|	d"         }
d$}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	        |¦  «        dœz  }d d!|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}
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S ),uf   Kiá»ƒm tra thuáº­t toÃ¡n phÃ¢n bá»• tá»· trá»�ng khi 1 dÃ²ng hÃ³a Ä‘Æ¡n giao cho nhiá»�u cÃ´ng trÃ¬nh.úboq-1úproj-1úDA-DAITHANGú100.0000z70.0000z30.0000)r   Ú
project_idr'   Úboq_quantityÚinvoiced_quantityÚremaining_quantityzboq-2zproj-2ú	DA-BENKEMz200.0000z130.0000z150000000.0000z12000000.0000z162000000.0000©ÚquantityÚamount_before_vat_vndÚvat_amount_vndÚtotal_item_amount_vndé   r(   ©z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)sr   Úallocationsr   r   r   Nc              3  ó2   K  — | ]}|d          dk    ¯|V — ŒdS )r'   rv   Nr   ©Ú.0Úas     r   ú	<genexpr>z0test_proportional_quota_split.<locals>.<genexpr>^   s1   è è € ÐPÐP˜¨Q¨~Ô->À-Ò-OÐ-O�1Ð-OÐ-OÐ-OÐ-OÐPÐPr   c              3  ó2   K  — | ]}|d          dk    ¯|V — ŒdS )r'   r|   Nr   r†   s     r   r‰   z0test_proportional_quota_split.<locals>.<genexpr>_   s1   è è € ÐNÐN˜¨Q¨~Ô->À+Ò-MÐ-M�1Ð-MÐ-MÐ-MÐ-MÐNÐNr   Úallocated_quantity)z0%(py1)s == %(py7)s
{%(py7)s = %(py3)s(%(py5)s)
}r   )r   r   Úpy5Úpy7úassert %(py9)sÚpy9Úallocated_total_amount_vndz48600000.0000z113400000.0000Údebit_accountz621_DA-DAITHANGr*   r+   r-   r   z621_DA-BENKEM)r   rH   Úcalculate_item_allocationsr   rJ   rK   rL   rM   rN   rO   rP   rQ   Únext)Úmock_candidatesÚitemr„   rW   rX   rY   rZ   r[   Úalloc_1Úalloc_2r\   Ú@py_assert6Ú@py_format8Ú@py_format10r]   r^   s                   r   Útest_proportional_quota_splitr›   >   s¡  € ð Ø"Ø)Ý# JÑ/Ô/Ý!(¨Ñ!3Ô!3Ý")¨)Ñ"4Ô"4ð	
ð 	
ð Ø"Ø'Ý# JÑ/Ô/Ý!(¨Ñ!4Ô!4Ý")¨)Ñ"4Ô"4ð	
ð 	
ð€Oõ( ˜JÑ'Ô'Ý!(Ð)9Ñ!:Ô!:Ý! /Ñ2Ô2Ý!(Ð)9Ñ!:Ô!:ð	ð €Dõ ×4Ò4°T¸?ÑKÔK€KÝˆ{ÑÔÐ ˜qÐ Ð˜qÒ Ð Ð Ð Õ Ô Ð Ð Ð Ð Ð˜qÐ Ñ Ô Ð Õ Ô Ñ Ô Ð Ð Õ Ô �3Ñ Ô Ð Õ Ô �3Ñ Ô Ð Ð Ð Õ Ô Ñ Ô Ð Ð Õ Ô ˆ{Ñ Ô Ð Õ Ô ˆ{Ñ Ô Ð Ð Õ Ô ÐÑ Ô Õ Ô ˜qÑ Ô Ð Ð Ñ Ð Ð Ð Ð Ð Ñ Ð Õ Õ Ô Ð Ñ Ô Ñ Ô Ð Ð Ð Ð Ð Ð Ð õ ÐPÐP˜kÐPÑPÔPÑPÔP€GÝÐNÐN˜kÐNÑNÔNÑNÔN€GàÐ'Ô(Ð>°IÐ>­G°IÑ,>Ô,>Ð>Ð(Ð,>Ò>Ð>Ð>Ð>Õ>Ô>Ð>Ð>Ð>Ð>Ð(Ð,>Ð>Ñ>Ô>Õ>Ô>Ð(Ñ>Ô>Ð>Õ>Ô>Ñ>Ô>Ð>Ð>Õ>Ô>­GÑ>Ô>Ð>Õ>Ô>­GÑ>Ô>Ð>Ð>Õ>Ô>°IÑ>Ô>Õ>Ô>Ð,>Ñ>Ô>Ð>Ð>Ñ>Ð>Ð>Ð>Ð>Ð>Ñ>Ð>Õ>Õ>Ô>Ð>Ñ>Ô>Ñ>Ô>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>ØÐ'Ô(Ð>°IÐ>­G°IÑ,>Ô,>Ð>Ð(Ð,>Ò>Ð>Ð>Ð>Õ>Ô>Ð>Ð>Ð>Ð>Ð(Ð,>Ð>Ñ>Ô>Õ>Ô>Ð(Ñ>Ô>Ð>Õ>Ô>Ñ>Ô>Ð>Ð>Õ>Ô>­GÑ>Ô>Ð>Õ>Ô>­GÑ>Ô>Ð>Ð>Õ>Ô>°IÑ>Ô>Õ>Ô>Ð,>Ñ>Ô>Ð>Ð>Ñ>Ð>Ð>Ð>Ð>Ð>Ñ>Ð>Õ>Õ>Ô>Ð>Ñ>Ô>Ñ>Ô>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>Ð>ØÐ/Ô0ÐL¸OÐLµG¸OÑ4LÔ4LÐLÐ0Ð4LÒLÐLÐLÐLÕLÔLÐLÐLÐLÐLÐ0Ð4LÐLÑLÔLÕLÔLÐ0ÑLÔLÐLÕLÔLÑLÔLÐLÐLÕLÔLµGÑLÔLÐLÕLÔLµGÑLÔLÐLÐLÕLÔL¸OÑLÔLÕLÔLÐ4LÑLÔLÐLÐLÑLÐLÐLÐLÐLÐLÑLÐLÕLÕLÔLÐLÑLÔLÑLÔLÐLÐLÐLÐLÐLÐLÐLÐLÐLØÐ/Ô0ÐMÐ<LÐMµGÐ<LÑ4MÔ4MÐMÐ0Ð4MÒMÐMÐMÐMÕMÔMÐMÐMÐMÐMÐ0Ð4MÐMÑMÔMÕMÔMÐ0ÑMÔMÐMÕMÔMÑMÔMÐMÐMÕMÔMµGÑMÔMÐMÕMÔMµGÑMÔMÐMÐMÕMÔMÐ<LÑMÔMÕMÔMÐ4MÑMÔMÐMÐMÑMÐMÐMÐMÐMÐMÑMÐMÕMÕMÔMÐMÑMÔMÑMÔMÐMÐMÐMÐMÐMÐMÐMÐMÐMØ�?Ô#Ð8Ð'8Ð8Ð#Ð'8Ò8Ð8Ð8Ð8Õ8Ô8Ð8Ð8Ð8Ð8Ð#Ð'8Ð8Ñ8Ô8Õ8Ô8Ð#Ñ8Ô8Õ8Ô8Ð'8Ñ8Ô8Ð8Ð8Ñ8Ð8Ð8Ð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Ð6Ð6r   c            	     óv  — dddt          d¦  «        t          d¦  «        t          d¦  «        t          d¦  «        dœg} t          d	¦  «        t          d
¦  «        t          d¦  «        t          d¦  «        dœ}t                               || ¦  «        }t          |¦  «        }d}||k    }|sòt	          j        d|fd||f¦  «        dt          j        ¦   «         v st	          j        t          ¦  «        rt	          j	        t          ¦  «        nddt          j        ¦   «         v st	          j        |¦  «        rt	          j	        |¦  «        ndt	          j	        |¦  «        t	          j	        |¦  «        dœz  }dd|iz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}}|d         d         }d}	||	u }|slt	          j        d|fd||	f¦  «        t	          j	        |¦  «        t	          j	        |	¦  «        dœz  }
dd|
iz  }t          t	          j        |¦  «        ¦  «        ‚dx}x}}	|d         d         }d }	||	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 )"uL   Kiá»ƒm tra hÃ ng rÃ o cáº£nh bÃ¡o vÆ°á»£t Ä‘á»‹nh má»©c dá»± toÃ¡n (> 105%).rt   ru   rv   rw   z90.0000z10.0000z3.00)r   rx   r'   ry   rz   r{   Úallowed_loss_percentz20.0000z20000000.0000z1600000.0000z21600000.0000r}   r$   r(   rƒ   r   r„   r   r   r   Nr   Ú
is_overrunT)Úis)z%(py1)s is %(py4)sr+   r-   r   Úoverrun_ratiogš™™™™™ñ?r*   )r   rH   r’   r   rJ   rK   rL   rM   rN   rO   rP   rQ   )r”   r•   r„   rW   rX   rY   rZ   r[   r\   r]   r^   s              r   Útest_boq_overrun_guardrailr¡   i   s  € ð Ø"Ø)Ý# JÑ/Ô/Ý!(¨Ñ!3Ô!3Ý")¨)Ñ"4Ô"4Ý$+¨F¡O¤Oð	
ð 	
ð
€Oõ ˜IÑ&Ô&Ý!(¨Ñ!9Ô!9Ý! .Ñ1Ô1Ý!(¨Ñ!9Ô!9ð	ð €Dõ ×4Ò4°T¸?ÑKÔK€KÝˆ{ÑÔÐ ˜qÐ Ð˜qÒ Ð Ð Ð Õ Ô Ð Ð Ð Ð Ð˜qÐ Ñ Ô Ð Õ Ô Ñ Ô Ð Ð Õ Ô �3Ñ Ô Ð Õ Ô �3Ñ Ô Ð Ð Ð Õ Ô Ñ Ô Ð Ð Õ Ô ˆ{Ñ Ô Ð Õ Ô ˆ{Ñ Ô Ð Ð Õ Ô ÐÑ Ô Õ Ô ˜qÑ Ô Ð Ð Ñ Ð Ð Ð Ð Ð Ñ Ð Õ Õ Ô Ð Ñ Ô Ñ Ô Ð Ð Ð Ð Ð Ð Ð Ø�qŒ>˜,Ô'Ð/¨4Ð/Ð'¨4Ð/Ð/Ð/Ð/Õ/Ô/Ð/Ð/Ð/Ð/Ð'¨4Ð/Ñ/Ô/Õ/Ô/Ð'Ñ/Ô/Õ/Ô/¨4Ñ/Ô/Ð/Ð/Ñ/Ð/Ð/Ð/Ð/Ð/Ñ/Ð/Õ/Õ/Ô/Ð/Ñ/Ô/Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ø�qŒ>˜/Ô*Ð1¨cÐ1Ð*¨cÒ1Ð1Ð1Ð1Õ1Ô1Ð1Ð1Ð1Ð1Ð*¨cÐ1Ñ1Ô1Õ1Ô1Ð*Ñ1Ô1Õ1Ô1¨cÑ1Ô1Ð1Ð1Ñ1Ð1Ð1Ð1Ð1Ð1Ñ1Ð1Õ1Õ1Ô1Ð1Ñ1Ô1Ñ1Ô1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1Ð1r   c                 óÐ  — t                                ¦   «         } t          | ¦  «        }d}||k    }|sòt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        nddt          j        ¦   «         v st          j        | ¦  «        rt          j        | ¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j
        |¦  «        ¦  «        ‚d	x}x}}t          | d         d
         ¦  «        }t                               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#d$|iz  }t          t          j
        |¦  «        ¦  «        ‚d	x}x}	x}}t                               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	S ))uA   Kiá»ƒm tra cÃ¡c REST API endpoints quáº£n lÃ½ vÃ  phÃ¢n bá»• BoQ.r   r   r   r   r   r   r   r   Nrx   z!/v1/erp/boq-allocations/projects/z
/materialséÈ   r(   )z3%(py2)s
{%(py2)s = %(py0)s.status_code
} == %(py5)sÚres_mat)r   Úpy2rŒ   zassert %(py7)sr�   ÚstatusÚsuccessr*   r+   r-   r   Ú	materialsr5   )z%(py1)s in %(py3)sÚmat_data)r   r   zassert %(py5)srŒ   )z/%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} > %(py7)s)r   r¥   r,   r�   rŽ   r�   z/v1/erp/boq-allocations/summaryÚres_sumÚprojects_summaryÚsum_data)rH   rI   r   rJ   rK   rL   rM   rN   rO   rP   rQ   r:   ÚclientrS   Ústatus_codeÚjson)r   rW   rX   rY   rZ   r[   Útest_proj_idr¤   r_   r]   Ú@py_format6r™   r©   r\   r^   Ú@py_format4r˜   rš   rª   r¬   s                       r   Ú!test_api_boq_allocation_endpointsr³   …   s?  € õ ×3Ò3Ñ5Ô5€KÝˆ{ÑÔÐ˜aÐÐ˜aÒÐÐÐÕÔÐÐÐÐÐ˜aÐÑÔÐÕÔÑÔÐÐÕÔ�3ÑÔÐÕÔ�3ÑÔÐÐÐÕÔÑÔÐÐÕÔˆ{ÑÔÐÕÔˆ{ÑÔÐÐÕÔÐÑÔÕÔ˜aÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐÝ�{ 1”~ lÔ3Ñ4Ô4€Lõ �jŠjÐU¸\ÐUÐUÐUÑVÔV€GØÔÐ% #Ð%Ð #Ò%Ð%Ð%Ð%Õ%Ô%Ð%Ð%Ð%Ð%Ð #Ð%Ñ%Ô%Ð%Õ%Ô%Ñ%Ô%Ð%Ð%Õ%Ô%ˆ7Ñ%Ô%Ð%Õ%Ô%ˆ7Ñ%Ô%Ð%Ð%Õ%Ô%ÐÑ%Ô%Õ%Ô% #Ñ%Ô%Ð%Ð%Ñ%Ð%Ð%Ð%Ð%Ð%Ñ%Ð%Õ%Õ%Ô%Ð%Ñ%Ô%Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Ð%Ð%Ø�|Š|‰~Œ~€HØ�HÔÐ* Ð*Ð Ò*Ð*Ð*Ð*Õ*Ô*Ð*Ð*Ð*Ð*Ð Ð*Ñ*Ô*Õ*Ô*ÐÑ*Ô*Õ*Ô* Ñ*Ô*Ð*Ð*Ñ*Ð*Ð*Ð*Ð*Ð*Ñ*Ð*Õ*Õ*Ô*Ð*Ñ*Ô*Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*ØÐ"ˆ;˜(Ð"Ð"Ð"Ð"Õ"Ô"Ð"Ð"Ð"Ð"ˆ;˜(Ð"Ñ"Ô"Õ"Ô"ˆ;Ñ"Ô"Ð"Õ"Ô"Ñ"Ô"Ð"Ð"Õ"Ô"˜(Ñ"Ô"Ð"Õ"Ô"˜(Ñ"Ô"Ð"Ð"Ð"Ð"Ñ"Ð"Ð"Ð"Ð"Ð"Ñ"Ð"Õ"Õ"Ô"Ð"Ñ"Ô"Ñ"Ô"Ð"Ð"Ð"Ð"Ð"Ø˜Ô$Ð)�3Ð$Ñ%Ô%Ð)¨Ð)Ð%¨Ò)Ð)Ð)Ð)Õ)Ô)Ð)Ð)Ð)Ð)Ð%¨Ð)Ñ)Ô)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô)�3Ñ)Ô)Ð)Õ)Ô)�3Ñ)Ô)Ð)Ð)Õ)Ô)Ð$Ñ)Ô)Õ)Ô)Ð%Ñ)Ô)Õ)Ô)¨Ñ)Ô)Ð)Ð)Ñ)Ð)Ð)Ð)Ð)Ð)Ñ)Ð)Õ)Õ)Ô)Ð)Ñ)Ô)Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ð)õ �jŠjÐ:Ñ;Ô;€GØÔÐ% #Ð%Ð #Ò%Ð%Ð%Ð%Õ%Ô%Ð%Ð%Ð%Ð%Ð #Ð%Ñ%Ô%Ð%Õ%Ô%Ñ%Ô%Ð%Ð%Õ%Ô%ˆ7Ñ%Ô%Ð%Õ%Ô%ˆ7Ñ%Ô%Ð%Ð%Õ%Ô%ÐÑ%Ô%Õ%Ô% #Ñ%Ô%Ð%Ð%Ñ%Ð%Ð%Ð%Ð%Ð%Ñ%Ð%Õ%Õ%Ô%Ð%Ñ%Ô%Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Ð%Ð%Ø�|Š|‰~Œ~€HØ�HÔÐ* Ð*Ð Ò*Ð*Ð*Ð*Õ*Ô*Ð*Ð*Ð*Ð*Ð Ð*Ñ*Ô*Õ*Ô*ÐÑ*Ô*Õ*Ô* Ñ*Ô*Ð*Ð*Ñ*Ð*Ð*Ð*Ð*Ð*Ñ*Ð*Õ*Õ*Ô*Ð*Ñ*Ô*Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*ØÐ)Ð Ð)Ð)Ð)Ð)Õ)Ô)Ð)Ð)Ð)Ð)Ð Ð)Ñ)Ô)Õ)Ô)ÐÑ)Ô)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô) Ñ)Ô)Ð)Õ)Ô) Ñ)Ô)Ð)Ð)Ð)Ð)Ñ)Ð)Ð)Ð)Ð)Ð)Ñ)Ð)Õ)Õ)Ô)Ð)Ñ)Ô)Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)r   )Ú
__future__r   ÚbuiltinsrL   Ú_pytest.assertion.rewriteÚ	assertionÚrewriterJ   Údecimalr   ÚpytestÚfastapi.testclientr   Úapp.mainr   Ú"app.modules.auth.presentation.authr   ÚSapp.modules.invoices.application.invoice_processing.boq_material_allocation_servicer   Údependency_overridesr­   rH   rr   r›   r¡   r³   r   r   r   ú<module>rÀ      s$  ðØ "Ð "Ð "Ð "Ð "Ð "ð Qà  € € € € € € € € € € € € Ð Ð Ð Ð Ð Ð Ø €€€Ø )Ð )Ð )Ð )Ð )Ð )à Ð Ð Ð Ð Ð Ø ?Ð ?Ð ?Ð ?Ð ?Ð ?ðð ð ð ð ð ð.ð .€Ô Ð)Ñ *ð 
ˆ�C‰Œ€Ø
&Ð
&Ñ
(Ô
(€ð!Hð !Hð !HðH(7ð (7ð (7ðV2ð 2ð 2ð8*ð *ð *ð *ð *r   