§
    _ ’jî!  ã                  ó¾   — 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mZ ddiZe	j        d	„ ¦   «         Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )é    )ÚannotationsN)Ú
TestClient)ÚErpDatabaseClient)Úapp)ÚBENCHMARK_PRICESÚBoqRateBreakdownEngineÚAuthorizationzBearer dev-test-tokenc               #  ó¾  K  — t          ¦   «         } t          t          j        ¦   «         ¦  «        }t          t          j        ¦   «         ¦  «        }t          t          j        ¦   «         ¦  «        }t          t          j        ¦   «         ¦  «        }|                      |dddddœ¦  «         |                      ||dddd	d
ddddddœ¦  «         |                      ||dddddddddddœ¦  «         |                      ||dddddd d!d"d#d$dœ¦  «         ||||gd%œV — 	 |                      ¦   «         }|                     ¦   «         5 }|                     d&|f¦  «         |                     d'|f¦  «         | 	                    ¦   «          d d d ¦  «         n# 1 swxY w Y   | 
                    ¦   «          d S # t          $ r}t          d(|› �¦  «         Y d }~d S d }~ww xY w))NzTEST-DWG-001u%   Báº£n váº½ Cá»‘ng Há»™p ThÃ­ Nghiá»‡mÚHYDRAULIC_CULVERTg    *u…A)ÚidÚdrawing_codeÚdrawing_titleÚdrawing_typeÚtotal_estimated_cost_vndé   z1.1zAF.11110u)   BÃª tÃ´ng lÃ³t mÃ³ng cá»‘ng M150 Ä‘Ã¡ 1x2Úconcretez2.5 * 10.0 * 0.1Úm3g      @g    Ð3Ag    „×GA)r   Ú
takeoff_idÚ
item_orderÚwbs_codeÚ	norm_codeÚ	item_nameÚcategoryÚdimension_formulaÚunitÚquantityÚunit_price_vndÚtotal_amount_vndé   z1.2zAF.61110u   Cá»‘t thÃ©p cá»‘ng há»™p CB400Úrebarz
1.2 * 1.05õ   táº¥ng)\�Âõ(ô?ç    ¾˜rAg    ‰nwAé   z1.3zAF.81110u$   VÃ¡n khuÃ´n thÃ nh cá»‘ng phá»§ phimÚformworkz2 * (2.0 + 1.5) * 10.0Úm2g     €Q@g    @èAg    [pA)r   Úitem_idsz<DELETE FROM erp_drawing_takeoff_items WHERE takeoff_id = %s;z/DELETE FROM erp_drawing_takeoffs WHERE id = %s;zTeardown error: )r   ÚstrÚuuidÚuuid4Úcreate_drawing_takeoffÚcreate_drawing_takeoff_itemÚget_connectionÚcursorÚexecuteÚcommitÚcloseÚ	ExceptionÚprint)Úclientr   Ú	item_id_1Ú	item_id_2Ú	item_id_3ÚconnÚcurÚes           úDC:\Projects\DSCons\tests\test_boq_advanced_breakdown_and_variance.pyÚtest_takeoff_with_itemsr;      s­  è è € åÑ Ô €FÝ•T”Z‘\”\Ñ"Ô"€JÝ•D”J‘L”LÑ!Ô!€IÝ•D”J‘L”LÑ!Ô!€IÝ•D”J‘L”LÑ!Ô!€Ið ×!Ò!àØ*ØDØ/Ø(2ð	
ð 	
ñô ð ð ×&Ò&àØ$ØØØ#ØDØ"Ø!3ØØØ'Ø )ð	
ð 	
ñô ð ð" ×&Ò&àØ$ØØØ#Ø9ØØ!-ØØØ(Ø *ð	
ð 	
ñô ð ð" ×&Ò&àØ$ØØØ#Ø?Ø"Ø!9ØØØ&Ø *ð	
ð 	
ñô ð ð$ !Ø 	¨9Ð5ðð ð ð ð ð&Ø×$Ò$Ñ&Ô&ˆØ�[Š[‰]Œ]ð 	˜cØ�KŠKØNØ�ñô ð ð �KŠKØAÀJÀ=ñô ð ð �KŠK‰MŒMˆMð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð 	�
Š
‰ŒˆˆˆøÝð &ð &ð &ÝÐ$ Ð$Ð$Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Ð%Ð%øøøøð&øøøs=   Ä(F5 ÅAFÆF5 ÆFÆF5 ÆFÆF5 Æ5
GÆ?GÇG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         }t          |¦  «        }d}||k    }|sÇt          j        d|fd||f¦  «        dt          j	        ¦   «         v st          j
        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }	dd|	iz  }
t          t          j        |
¦  «        ¦  «        ‚dx}x}x}}t          d„ | d         D ¦   «         d¦  «        }d}||u}|s—t          j        d|fd||f¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}|d         }t          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 )$ut   Kiá»ƒm tra phÃ¢n rÃ£ Ä‘Æ¡n giÃ¡ bÃª tÃ´ng tuÃ¢n thá»§ CÃ¡t vÃ ng Háº£i PhÃ²ng 710k (Rule 11) vÃ  Ä‘Ã¡ 1x2, xi mÄƒng.u   BÃª tÃ´ng Ä‘Ã i mÃ³ng M250r   r   g    p™4A©r   r   r   Útotal_unit_priceÚmaterial_cost_vndr   ©ú>©z%(py1)s > %(py4)s©Úpy1Úpy4úassert %(py6)sÚpy6NÚlabor_cost_vndÚequipment_cost_vndÚmaterial_breakdownr#   ©ú>=)z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} >= %(py7)sÚlen©Úpy0Úpy2rE   Úpy7úassert %(py9)sÚpy9c              3  ó.   K  — | ]}d |d         v ¯|V — ŒdS )ÚCATÚmaterial_codeN© ©Ú.0Úms     r:   ú	<genexpr>z:test_boq_engine_rate_breakdown_concrete.<locals>.<genexpr>€   s1   è è € ÐMÐMˆq°¸!¸OÔ:LÐ1LÐ1LˆÐ1LÐ1LÐ1LÐ1LÐMÐMó    ©úis not©z%(py0)s is not %(py3)sÚsand_mat©rO   Úpy3úassert %(py5)sÚpy5r   ÚCAT_VANG_BETONG©ú==©z%(py1)s == %(py4)sg    àª%A)r   Úbreakdown_item_rateÚ
@pytest_arÚ_call_reprcompareÚ	_safereprÚAssertionErrorÚ_format_explanationrM   Ú@py_builtinsÚlocalsÚ_should_repr_global_nameÚnextr   )ÚresÚ@py_assert0Ú@py_assert3Ú@py_assert2Ú@py_format5Ú@py_format7Ú@py_assert1Ú@py_assert6Ú@py_assert5Ú@py_format8Ú@py_format10r`   Ú@py_format4Ú@py_format6s                 r:   Ú'test_boq_engine_rate_breakdown_concreter€   q   s~  € å
 Ô
4Ø.ØØØ"ð	ñ ô €Cð Ð"Ô#Ð' aÐ'Ð# aÒ'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'Ð# aÐ'Ñ'Ô'Õ'Ô'Ð#Ñ'Ô'Õ'Ô' aÑ'Ô'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'ØÐÔ Ð$ 1Ð$Ð  1Ò$Ð$Ð$Ð$Õ$Ô$Ð$Ð$Ð$Ð$Ð  1Ð$Ñ$Ô$Õ$Ô$Ð Ñ$Ô$Õ$Ô$ 1Ñ$Ô$Ð$Ð$Ñ$Ð$Ð$Ð$Ð$Ð$Ñ$Ð$Õ$Õ$Ô$Ð$Ñ$Ô$Ñ$Ô$Ð$Ð$Ð$Ð$Ð$Ð$Ð$ØÐ#Ô$Ð( qÐ(Ð$ qÒ(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(Ð$ qÐ(Ñ(Ô(Õ(Ô(Ð$Ñ(Ô(Õ(Ô( qÑ(Ô(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(ØÐ'Ô(Ð.�3Ð(Ñ)Ô)Ð.¨QÐ.Ð)¨QÒ.Ð.Ð.Ð.Õ.Ô.Ð.Ð.Ð.Ð.Ð)¨QÐ.Ñ.Ô.Ð.Õ.Ô.Ñ.Ô.Ð.Ð.Õ.Ô.�3Ñ.Ô.Ð.Õ.Ô.�3Ñ.Ô.Ð.Ð.Õ.Ô.Ð(Ñ.Ô.Õ.Ô.Ð)Ñ.Ô.Õ.Ô.¨QÑ.Ô.Ð.Ð.Ñ.Ð.Ð.Ð.Ð.Ð.Ñ.Ð.Õ.Õ.Ô.Ð.Ñ.Ô.Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.õ ØMÐM�CÐ,Ô-ÐMÑMÔMÈtñô €Hð  Ðˆ8˜4ÐÐÐÐÕÔÐÐÐÐˆ8˜4ÐÑÔÐÕÔÑÔÐÐÕÔˆ8ÑÔÐÕÔˆ8ÑÔÐÐÕÔ˜4ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØÐ$Ô%ÐLÕ)9Ð:KÔ)LÐLÐ%Ð)LÒLÐLÐLÐLÕLÔLÐLÐLÐLÐLÐ%Ð)LÐLÑLÔLÕLÔLÐ%ÑLÔLÕLÔLÐ)LÑLÔLÐLÐLÑLÐLÐLÐLÐLÐLÑLÐLÕLÕLÔLÐLÑLÔLÑLÔLÐLÐLÐLÐLÐLÐLÐLØÐ$Ô%Ð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Ð1Ð1r\   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}}t          d„ | d         D ¦   «         d¦  «        }d}||u}|s—t          j        d|fd||f¦  «        dt          j	        ¦   «         v st          j
        |¦  «        rt          j        |¦  «        ndt          j        |¦  «        dœz  }dd|iz  }	t          t          j        |	¦  «        ¦  «        ‚dx}}|d         }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 )uD   Kiá»ƒm tra phÃ¢n rÃ£ Ä‘Æ¡n giÃ¡ cá»‘t thÃ©p tuÃ¢n thá»§ ThÃ©p CB400.u   Cá»‘t thÃ©p dáº§m mÃ³ng CB400r    r!   r"   r=   r?   r   r@   rB   rC   rF   rG   Nc              3  ó.   K  — | ]}d |d         v ¯|V — ŒdS )ÚTHEPrV   NrW   rX   s     r:   r[   z7test_boq_engine_rate_breakdown_rebar.<locals>.<genexpr>‘   s1   è è € ÐNÐNˆq°¸1¸_Ô;MÐ1MÐ1MˆÐ1MÐ1MÐ1MÐ1MÐNÐNr\   rJ   r]   r_   Úthep_matra   rc   rd   r   g    \�mArf   rh   )r   ri   rj   rk   rl   rm   rn   rr   ro   rp   rq   )
rs   rt   ru   rv   rw   rx   r„   ry   r~   r   s
             r:   Ú$test_boq_engine_rate_breakdown_rebarr…   ‡   sn  € å
 Ô
4Ø1ØØØ#ð	ñ ô €Cð Ð"Ô#Ð' aÐ'Ð# aÒ'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'Ð# aÐ'Ñ'Ô'Õ'Ô'Ð#Ñ'Ô'Õ'Ô' aÑ'Ô'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'ÝØNÐN�CÐ,Ô-ÐNÑNÔNÐPTñô €Hð  Ðˆ8˜4ÐÐÐÐÕÔÐÐÐÐˆ8˜4ÐÑÔÐÕÔÑÔÐÐÕÔˆ8ÑÔÐÕÔˆ8ÑÔÐÐÕÔ˜4ÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØÐ$Ô%Ð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Ð3Ð3Ð3Ñ3Ð3Õ3Õ3Ô3Ð3Ñ3Ô3Ñ3Ô3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3Ð3r\   c            
     óN	  — t          j        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}d}||z  }d}	||	z  }
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        |¦  «        t          j        |	¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}x}x}x}	x}
x}}t          j        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}}t          j        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}x}}dS )uP   Kiá»ƒm tra tÃ­nh toÃ¡n sai lá»‡ch 3 cá»™t vÃ  phÃ¢n loáº¡i Variation Order (VO).g      Y@g     €X@)Údesign_quantityÚhsmt_quantityÚvariation_statusÚnormalrf   rh   rC   rF   rG   NÚvariance_quantityç       @Úvariance_percentageéd   r   )zU%(py1)s == %(py15)s
{%(py15)s = %(py3)s(((%(py5)s / %(py7)s) * %(py10)s), %(py13)s)
}Úround)rD   rb   rd   rQ   Úpy10Úpy13Úpy15zassert %(py17)sÚpy17g      ^@Úvo_increaseg      4@g      T@Úvo_decrease)z%(py1)s == -%(py4)súassert %(py7)srQ   )r   Úcompute_triple_variancerj   rk   rl   rm   rn   r�   ro   rp   rq   )Ú
res_normalrt   ru   rv   rw   rx   Ú@py_assert4rz   Ú@py_assert8Ú@py_assert9Ú@py_assert11Ú@py_assert12Ú@py_assert14Ú@py_format16Ú@py_format18Úres_increaseÚres_decreaser{   r   r|   s                       r:   Ú+test_boq_engine_triple_variance_calculationr£   —   sæ  € õ (Ô?Ø¨Tðñ ô €Jð Ð(Ô)Ð5¨XÐ5Ð)¨XÒ5Ð5Ð5Ð5Õ5Ô5Ð5Ð5Ð5Ð5Ð)¨XÐ5Ñ5Ô5Õ5Ô5Ð)Ñ5Ô5Õ5Ô5¨XÑ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ØÐ)Ô*Ð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ØÐ+Ô,ÐL°sÐL¸TÐL°s¸T±zÐLÀSÐL°zÀSÑ6HÐLÈ!ÐLµÐ6HÈ!Ñ0LÔ0LÐLÐ,Ð0LÒLÐLÐLÑLÕLÔLÐLÐLÐLÐLÐ,Ð0LÐ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°sÑLÔLÕLÔL¸TÑLÔLÕLÔLÀSÑLÔLÕLÔLÈ!ÑLÔLÕLÔLÐ0LÑLÔLÐLÐLÑLÐLÐLÐLÐLÐLÑLÐLÕLÕLÔLÐLÑLÔLÑLÔLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLÐLõ *ÔAØ¨Uðñ ô €Lð Ð*Ô+Ð<¨}Ð<Ð+¨}Ò<Ð<Ð<Ð<Õ<Ô<Ð<Ð<Ð<Ð<Ð+¨}Ð<Ñ<Ô<Õ<Ô<Ð+Ñ<Ô<Õ<Ô<¨}Ñ<Ô<Ð<Ð<Ñ<Ð<Ð<Ð<Ð<Ð<Ñ<Ð<Õ<Õ<Ô<Ð<Ñ<Ô<Ñ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<Ð<ØÐ-Ô.Ð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õ *ÔAØ¨Eðñ ô €Lð Ð*Ô+Ð<¨}Ð<Ð+¨}Ò<Ð<Ð<Ð<Õ<Ô<Ð<Ð<Ð<Ð<Ð+¨}Ð<Ñ<Ô<Õ<Ô<Ð+Ñ<Ô<Õ<Ô<¨}Ñ<Ô<Ð<Ð<Ñ<Ð<Ð<Ð<Ð<Ð<Ñ<Ð<Õ<Õ<Ô<Ð<Ñ<Ô<Ñ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<Ð<ØÐ-Ô.Ð7°4Ð7°4°%Ð7Ð.°%Ò7Ð7Ð7Ð7Õ7Ô7Ð7Ð7Ð7Ð7Ð.°%Ð7Ñ7Ô7Õ7Ô7Ð.Ñ7Ô7Õ7Ô7°4Ñ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Ð7r\   c                óº  — t          t          ¦  «        }| d         }|                     d|› d�t          ¬¦  «        }|j        }d}||k    }|sªt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        t          j
        |¦  «        d	œz  }d
d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|                     ¦   «         }	|	d         }
d}|
|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}
|
|	v }|s—t          j        d|fd|
|	f¦  «        t          j
        |
¦  «        dt          j        ¦   «         v st          j	        |	¦  «        rt          j
        |	¦  «        nddœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}
}|	d         d         }
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!         }
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 )"u8   Kiá»ƒm tra endpoint GET /v1/takeoff/{id}/rate-breakdown.r   ú/v1/takeoff/z/rate-breakdown©ÚheaderséÈ   rf   ©z3%(py2)s
{%(py2)s = %(py0)s.status_code
} == %(py5)srs   ©rO   rP   rd   r–   rQ   NÚstatusÚsuccessrh   rC   rF   rG   Úcountr#   Útotals)Úin)z%(py1)s in %(py3)sÚdata)rD   rb   rc   rd   Útotal_material_cost_vndr   r@   rB   Útotal_labor_cost_vndÚtotal_equipment_cost_vnd)r   r   ÚgetÚAUTH_HEADERSÚstatus_coderj   rk   ro   rp   rq   rl   rm   rn   Újson)r;   r3   r   rs   ry   r™   ru   r   r|   r°   rt   rv   rw   rx   r~   s                  r:   Útest_api_get_rate_breakdownr¸   °   s>  € å�‰_Œ_€FØ(¨Ô6€Jà
�*Š*Ð? JÐ?Ð?Ð?Íˆ*Ñ
VÔ
V€CØŒ?Ð!˜cÐ!ˆ?˜cÒ!Ð!Ð!Ð!Õ!Ô!Ð!Ð!Ð!Ð!ˆ?˜cÐ!Ñ!Ô!Ð!Õ!Ô!Ñ!Ô!Ð!Ð!Õ!Ô!ˆ3Ñ!Ô!Ð!Õ!Ô!ˆ3Ñ!Ô!Ð!Ð!Õ!Ô!ˆ?Ñ!Ô!Õ!Ô!˜cÑ!Ô!Ð!Ð!Ñ!Ð!Ð!Ð!Ð!Ð!Ñ!Ð!Õ!Õ!Ô!Ð!Ñ!Ô!Ñ!Ô!Ð!Ð!Ð!Ð!Ð!Ð!Ð!Ø�8Š8‰:Œ:€DØ�Œ>Ð&˜YÐ&ˆ>˜YÒ&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&ˆ>˜YÐ&Ñ&Ô&Õ&Ô&ˆ>Ñ&Ô&Õ&Ô&˜YÑ&Ô&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ø�Œ=Ð˜AÐˆ=˜AÒÐÐÐÕÔÐÐÐÐˆ=˜AÐÑÔÕÔˆ=ÑÔÕÔ˜AÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐØÐˆ8�tÐÐÐÐÕÔÐÐÐÐˆ8�tÐÑÔÕÔˆ8ÑÔÐÕÔÑÔÐÐÕÔ�tÑÔÐÕÔ�tÑÔÐÐÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐØ�Œ>Ð3Ô4Ð8°qÐ8Ð4°qÒ8Ð8Ð8Ð8Õ8Ô8Ð8Ð8Ð8Ð8Ð4°qÐ8Ñ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Ø�Œ>Ð0Ô1Ð5°AÐ5Ð1°AÒ5Ð5Ð5Ð5Õ5Ô5Ð5Ð5Ð5Ð5Ð1°AÐ5Ñ5Ô5Õ5Ô5Ð1Ñ5Ô5Õ5Ô5°AÑ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Ø�Œ>Ð4Ô5Ð9¸Ð9Ð5¸Ò9Ð9Ð9Ð9Õ9Ô9Ð9Ð9Ð9Ð9Ð5¸Ð9Ñ9Ô9Õ9Ô9Ð5Ñ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Ð9r\   c                óV
  — t          t          ¦  «        }| 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         }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}||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 �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}}|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S ).uj   Kiá»ƒm tra endpoint GET /v1/takeoff/{id}/triple-column-variance vÃ  PUT /v1/takeoff/items/{id}/quantities.r   r&   r   z/v1/takeoff/items/z/quantitiesrŒ   gÍÌÌÌÌÌ@)rˆ   Úactual_quantity)r§   r·   r¨   rf   r©   Úput_resrª   r–   rQ   NÚitemrˆ   )z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)sÚfloatrN   rR   rS   r‰   r”   rh   rC   rF   rG   r¥   z/triple-column-variancer¦   Úget_resr«   r¬   ÚsummaryÚvo_increase_items_countr   rK   )z%(py1)s >= %(py4)sÚhas_variation_ordersT)Úis)z%(py1)s is %(py4)s)r   r   Úputrµ   r¶   rj   rk   ro   rp   rq   rl   rm   rn   r·   r½   r´   )r;   r3   r   Úitem_idr»   ry   r™   ru   r   r|   Úupdated_itemrz   r{   r}   rt   rv   rw   rx   r¾   Úv_datas                       r:   Ú'test_api_get_triple_variance_and_updaterÇ   À   s(  € å�‰_Œ_€FØ(¨Ô6€JØ% jÔ1°!Ô4€Gð �jŠjØ1˜WÐ1Ð1Ð1ÝØ"°sÐ;Ð;ð ñ ô €Gð
 ÔÐ% #Ð%Ð #Ò%Ð%Ð%Ð%Õ%Ô%Ð%Ð%Ð%Ð%Ð #Ð%Ñ%Ô%Ð%Õ%Ô%Ñ%Ô%Ð%Ð%Õ%Ô%ˆ7Ñ%Ô%Ð%Õ%Ô%ˆ7Ñ%Ô%Ð%Ð%Õ%Ô%ÐÑ%Ô%Õ%Ô% #Ñ%Ô%Ð%Ð%Ñ%Ð%Ð%Ð%Ð%Ð%Ñ%Ð%Õ%Õ%Ô%Ð%Ñ%Ô%Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Ð%Ð%Ø—<’<‘>”> &Ô)€LØ˜oÔ.Ð6�5Ð.Ñ/Ô/Ð6°3Ð6Ð/°3Ò6Ð6Ð6Ð6Õ6Ô6Ð6Ð6Ð6Ð6Ð/°3Ð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Ð.Ñ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Ñ6Ô6Ñ6Ô6Ð6Ð6Ð6Ð6Ð6Ð6Ð6Ð6Ð6ØÐ*Ô+Ð<¨}Ð<Ð+¨}Ò<Ð<Ð<Ð<Õ<Ô<Ð<Ð<Ð<Ð<Ð+¨}Ð<Ñ<Ô<Õ<Ô<Ð+Ñ<Ô<Õ<Ô<¨}Ñ<Ô<Ð<Ð<Ñ<Ð<Ð<Ð<Ð<Ð<Ñ<Ð<Õ<Õ<Ô<Ð<Ñ<Ô<Ñ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<Ð<ð �jŠjØ:�zÐ:Ð:Ð:ÅLð ñ ô €Gð ÔÐ% #Ð%Ð #Ò%Ð%Ð%Ð%Õ%Ô%Ð%Ð%Ð%Ð%Ð #Ð%Ñ%Ô%Ð%Õ%Ô%Ñ%Ô%Ð%Ð%Õ%Ô%ˆ7Ñ%Ô%Ð%Õ%Ô%ˆ7Ñ%Ô%Ð%Ð%Õ%Ô%ÐÑ%Ô%Õ%Ô% #Ñ%Ô%Ð%Ð%Ñ%Ð%Ð%Ð%Ð%Ð%Ñ%Ð%Õ%Õ%Ô%Ð%Ñ%Ô%Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Ð%Ð%Ø�\Š\‰^Œ^€FØ�(ÔÐ(˜yÐ(Ð˜yÒ(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(Ð˜yÐ(Ñ(Ô(Õ(Ô(ÐÑ(Ô(Õ(Ô(˜yÑ(Ô(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ø�)ÔÐ6Ô7Ð<¸1Ð<Ð7¸1Ò<Ð<Ð<Ð<Õ<Ô<Ð<Ð<Ð<Ð<Ð7¸1Ð<Ñ<Ô<Õ<Ô<Ð7Ñ<Ô<Õ<Ô<¸1Ñ<Ô<Ð<Ð<Ñ<Ð<Ð<Ð<Ð<Ð<Ñ<Ð<Õ<Õ<Ô<Ð<Ñ<Ô<Ñ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ø�)ÔÐ3Ô4Ð<¸Ð<Ð4¸Ð<Ð<Ð<Ð<Õ<Ô<Ð<Ð<Ð<Ð<Ð4¸Ð<Ñ<Ô<Õ<Ô<Ð4Ñ<Ô<Õ<Ô<¸Ñ<Ô<Ð<Ð<Ñ<Ð<Ð<Ð<Ð<Ð<Ñ<Ð<Õ<Õ<Ô<Ð<Ñ<Ô<Ñ<Ô<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<Ð<r\   c                óx  — t          t          ¦  «        }| d         }|                     d|› d�t          ¬¦  «        }|j        }d}||k    }|sªt          j        d|fd||f¦  «        dt          j        ¦   «         v st          j	        |¦  «        rt          j
        |¦  «        ndt          j
        |¦  «        t          j
        |¦  «        d	œz  }d
d|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|                     ¦   «         }	|	d         }
d}|
|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 ¦   «         }d„ t          ||¦  «        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 ¦   «         }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 )uD   Kiá»ƒm tra endpoint POST /v1/takeoff/{id}/generate-material-request.r   r¥   z/generate-material-requestr¦   r¨   rf   r©   rs   rª   r–   rQ   Nr«   r¬   rh   rC   rF   rG   Úmaterials_countr   r@   rB   Útotal_material_budget_vndÚmaterial_schedulec                ó   — g | ]
}|d          ‘ŒS )Úmaterial_namerW   rX   s     r:   ú
<listcomp>z6test_api_generate_material_request.<locals>.<listcomp>í   s   € Ð6Ð6Ð6¨��?Ô#Ð6Ð6Ð6r\   c              3  ó8   K  — | ]\  }}d |v p	d|d         v V — ŒdS )u
   CÃ¡t vÃ ngrU   rV   NrW   ©rY   rZ   Únames      r:   r[   z5test_api_generate_material_request.<locals>.<genexpr>î   sN   è è € ð ð áˆAˆtð 	˜ÐÐ; ¨¨?Ô);Ð ;ðð ð ð ð ð r\   z,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}Úany)rO   rP   rE   c              3  ó8   K  — | ]\  }}d |v p	d|d         v V — ŒdS )u   ThÃ©prƒ   rV   NrW   rÐ   s      r:   r[   z5test_api_generate_material_request.<locals>.<genexpr>ò   sM   è è € ð ð áˆAˆtð 	�4ˆÐ7˜6 Q Ô%7Ð7ðð ð ð ð ð r\   )r   r   Úpostrµ   r¶   rj   rk   ro   rp   rq   rl   rm   rn   r·   ÚziprÒ   )r;   r3   r   rs   ry   r™   ru   r   r|   r°   rt   rv   rw   rx   ÚscheduleÚ	materialss                   r:   Ú"test_api_generate_material_requestrØ   Ý   s   € å�‰_Œ_€FØ(¨Ô6€Jà
�+Š+Ø=�zÐ=Ð=Ð=Å|ð ñ ô €Cð Œ?Ð!˜cÐ!ˆ?˜cÒ!Ð!Ð!Ð!Õ!Ô!Ð!Ð!Ð!Ð!ˆ?˜cÐ!Ñ!Ô!Ð!Õ!Ô!Ñ!Ô!Ð!Ð!Õ!Ô!ˆ3Ñ!Ô!Ð!Õ!Ô!ˆ3Ñ!Ô!Ð!Ð!Õ!Ô!ˆ?Ñ!Ô!Õ!Ô!˜cÑ!Ô!Ð!Ð!Ñ!Ð!Ð!Ð!Ð!Ð!Ñ!Ð!Õ!Õ!Ô!Ð!Ñ!Ô!Ñ!Ô!Ð!Ð!Ð!Ð!Ð!Ð!Ð!Ø�8Š8‰:Œ:€DØ�Œ>Ð&˜YÐ&ˆ>˜YÒ&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&ˆ>˜YÐ&Ñ&Ô&Õ&Ô&ˆ>Ñ&Ô&Õ&Ô&˜YÑ&Ô&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&ØÐ!Ô"Ð& QÐ&Ð" QÒ&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&Ð" QÐ&Ñ&Ô&Õ&Ô&Ð"Ñ&Ô&Õ&Ô& QÑ&Ô&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&ØÐ+Ô,Ð0¨qÐ0Ð,¨qÒ0Ð0Ð0Ð0Õ0Ô0Ð0Ð0Ð0Ð0Ð,¨qÐ0Ñ0Ô0Õ0Ô0Ð,Ñ0Ô0Õ0Ô0¨qÑ0Ô0Ð0Ð0Ñ0Ð0Ð0Ð0Ð0Ð0Ñ0Ð0Õ0Õ0Ô0Ð0Ñ0Ô0Ñ0Ô0Ð0Ð0Ð0Ð0Ð0Ð0Ð0ð Ð'Ô(€HØ6Ð6¨XÐ6Ñ6Ô6€Iðð å˜8 YÑ/Ô/ðñ ô ð �3ð ñ ô ð ð ð ð ð õ ìñô ð ð õ ìõ ñ ô ð õ ìõ ñ ô ð ð õ ìðñ ô õ ìðñ ô ð ð ñ ð õ õ ìðñ ô ñ ô ð ð ð ð ð ðð å˜8 YÑ/Ô/ðñ ô ð �3ð ñ ô ð ð ð ð ð õ ìñô ð ð õ ìõ ñ ô ð õ ìõ ñ ô ð ð õ ìðñ ô õ ìðñ ô ð ð ñ ð õ õ ìðñ ô ñ ô ð ð ð ð ð ð ð r\   )Ú
__future__r   Úbuiltinsro   Ú_pytest.assertion.rewriteÚ	assertionÚrewriterj   r(   ÚpytestÚfastapi.testclientr   Úapp.core.postgres.erp_clientr   Úapp.mainr   Ú:app.modules.takeoff.application.boq_rate_breakdown_servicer   r   rµ   Úfixturer;   r€   r…   r£   r¸   rÇ   rØ   rW   r\   r:   ú<module>rä      s6  ðØ "Ð "Ð "Ð "Ð "Ð "à xà  € € € € € € € € € € € € €€€€à €€€Ø )Ð )Ð )Ð )Ð )Ð )à :Ð :Ð :Ð :Ð :Ð :Ø Ð Ð Ð Ð Ð ðð ð ð ð ð ð ð ð
  Ð!8Ð9€ð „ðY&ð Y&ñ „ðY&ðx2ð 2ð 2ð,4ð 4ð 4ð 8ð 8ð 8ð2:ð :ð :ð =ð =ð =ð:ð ð ð ð r\   