§
    Ô0šj]  ã                   óâ   — d Z ddlZddlmc mZ ddlZddlm	Z	 ddl
mZ ddlmZ ddlmZ  ej        d¬¦  «        d	„ ¦   «         Z ej        d¬¦  «        d
„ ¦   «         Zd„ Zd„ Zd„ Zd„ Zd„ ZdS )uÆ   Automated Regression Tests for AEC 3-Way Matching Engine (HÃ³a Ä�Æ¡n <-> Dá»± Ã�n WBS <-> GiÃ¡ Sá»Ÿ XÃ¢y Dá»±ng Háº£i PhÃ²ng).
Strict Zero-Tolerance Synthetic Data & Regression Gate 100% COMPLIANT.
é    N)Ú
TestClient)Ú
create_app)ÚAuthService)ÚAec3WayMatchingServiceÚmodule)Úscopec                  ó<   — t          ¦   «         } t          | ¦  «        S )N)r   r   )Úapps    ú9C:\Projects\DSCons\tests\test_aec_3way_matching_engine.pyÚ
app_clientr      s   € å
‰,Œ,€CÝ�c‰?Œ?Ðó    c                  ób   — t          ¦   «         } |                      ddddddœ¦  «        }dd|› �iS )	Nzadmin-idzdirector@dscons.vnÚ
superadminu   Nguyá»…n SÄ© SÆ¡nz$0753d827-90e1-4894-9c16-266ca572c5eb)ÚidÚemailÚroleÚ	full_nameÚ
company_idÚAuthorizationzBearer )r   Úcreate_jwt_token)ÚauthÚtokens     r   Úauth_headersr      sO   € å‰=Œ=€DØ×!Ò!ØØ%ØØ(Ø<ð#ð #ñ ô €Eð Ð. uÐ.Ð.Ð/Ð/r   c                  ó~  — t          ¦   «         } |                      ¦   «         }|d         }d}||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|d	         }d
}||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|d         }d}||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|d         }d}||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|d         d         }d}||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 )uH   Kiá»ƒm thá»­ tá»•ng há»£p KPI Ä‘á»‘i soÃ¡t 3 chiá»�u toÃ n há»‡ thá»‘ng.Útotal_invoiceséè  ©ú>=©z%(py1)s >= %(py4)s©Úpy1Úpy4úassert %(py6)sÚpy6NÚtotal_amount_vndl    _ % ©ú>©z%(py1)s > %(py4)sÚmatched_invoicesr   Úunmatched_invoicesÚprice_benchmarkÚaudited_items_count)r   Úget_matching_summaryÚ
@pytest_arÚ_call_reprcompareÚ	_safereprÚAssertionErrorÚ_format_explanation)ÚserviceÚsummaryÚ@py_assert0Ú@py_assert3Ú@py_assert2Ú@py_format5Ú@py_format7s          r   Útest_3way_matching_summaryr:       s|  € å$Ñ&Ô&€GØ×*Ò*Ñ,Ô,€GàÐ#Ô$Ð,¨Ð,Ð$¨Ò,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,Ð$¨Ð,Ñ,Ô,Õ,Ô,Ð$Ñ,Ô,Õ,Ô,¨Ñ,Ô,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,ØÐ%Ô&Ð7¨Ð7Ð&¨Ò7Ð7Ð7Ð7Õ7Ô7Ð7Ð7Ð7Ð7Ð&¨Ð7Ñ7Ô7Õ7Ô7Ð&Ñ7Ô7Õ7Ô7¨Ñ7Ô7Ð7Ð7Ñ7Ð7Ð7Ð7Ð7Ð7Ñ7Ð7Õ7Õ7Ô7Ð7Ñ7Ô7Ñ7Ô7Ð7Ð7Ð7Ð7Ð7Ð7Ð7ØÐ%Ô&Ð*¨Ð*Ð&¨Ò*Ð*Ð*Ð*Õ*Ô*Ð*Ð*Ð*Ð*Ð&¨Ð*Ñ*Ô*Õ*Ô*Ð&Ñ*Ô*Õ*Ô*¨Ñ*Ô*Ð*Ð*Ñ*Ð*Ð*Ð*Ð*Ð*Ñ*Ð*Õ*Õ*Ô*Ð*Ñ*Ô*Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*ØÐ'Ô(Ð,¨1Ð,Ð(¨1Ò,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,Ð(¨1Ð,Ñ,Ô,Õ,Ô,Ð(Ñ,Ô,Õ,Ô,¨1Ñ,Ô,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,ØÐ$Ô%Ð&;Ô<Ð@¸qÐ@Ð<¸qÒ@Ð@Ð@Ð@Õ@Ô@Ð@Ð@Ð@Ð@Ð<¸qÐ@Ñ@Ô@Õ@Ô@Ð<Ñ@Ô@Õ@Ô@¸qÑ@Ô@Ð@Ð@Ñ@Ð@Ð@Ð@Ð@Ð@Ñ@Ð@Õ@Õ@Ô@Ð@Ñ@Ô@Ñ@Ô@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@Ð@r   c                  óÞ  — t          ¦   «         } |                      dd¬¦  «        }|d         }d}||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }d	d
|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|d         }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         D ¦   «         }t          |¦  «        }|s•ddt          j	        ¦   «         v st          j
        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        t          j        |¦  «        dœz  }t          t          j        |¦  «        ¦  «        ‚dx}}dS )u=   Kiá»ƒm thá»­ danh sÃ¡ch hÃ³a Ä‘Æ¡n mua vÃ o vá»›i bá»™ lá»�c.ÚALLé
   )ÚstatusÚlimitÚtotalr   r   r   r    r#   r$   NÚinvoices©ú==©z0%(py4)s
{%(py4)s = %(py0)s(%(py2)s)
} == %(py7)sÚlen©Úpy0Úpy2r"   Úpy7úassert %(py9)sÚpy9Ú	UNMATCHEDé   c              3   ó*   K  — | ]}|d          du V — ŒdS )Úmatched_project_idN© )Ú.0Úinvs     r   ú	<genexpr>z6test_3way_matching_list_and_filters.<locals>.<genexpr>5   s-   è è € ÐVÐV°SˆsÐ'Ô(¨DÐ0ÐVÐVÐVÐVÐVÐVr   z,assert %(py4)s
{%(py4)s = %(py0)s(%(py2)s)
}Úall)rG   rH   r"   )r   Úlist_matching_invoicesr.   r/   r0   r1   r2   rE   Ú@py_builtinsÚlocalsÚ_should_repr_global_namerT   )r3   Úres_allr5   r6   r7   r8   r9   Ú@py_assert1Ú@py_assert6Ú@py_assert5Ú@py_format8Ú@py_format10Úres_unmatcheds                r   Ú#test_3way_matching_list_and_filtersr`   ,   s¯  € å$Ñ&Ô&€GØ×,Ò,°EÀÐ,ÑDÔD€GØ�7ÔÐ#˜tÐ#Ð˜tÒ#Ð#Ð#Ð#Õ#Ô#Ð#Ð#Ð#Ð#Ð˜tÐ#Ñ#Ô#Õ#Ô#ÐÑ#Ô#Õ#Ô#˜tÑ#Ô#Ð#Ð#Ñ#Ð#Ð#Ð#Ð#Ð#Ñ#Ð#Õ#Õ#Ô#Ð#Ñ#Ô#Ñ#Ô#Ð#Ð#Ð#Ð#Ð#Ð#Ð#Ø�zÔ"Ð)�3Ð"Ñ#Ô#Ð) rÐ)Ð# rÒ)Ð)Ð)Ð)Õ)Ô)Ð)Ð)Ð)Ð)Ð# rÐ)Ñ)Ô)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô)�3Ñ)Ô)Ð)Õ)Ô)�3Ñ)Ô)Ð)Ð)Õ)Ô)Ð"Ñ)Ô)Õ)Ô)Ð#Ñ)Ô)Õ)Ô) rÑ)Ô)Ð)Ð)Ñ)Ð)Ð)Ð)Ð)Ð)Ñ)Ð)Õ)Õ)Ô)Ð)Ñ)Ô)Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ð)ð ×2Ò2¸+ÈQÐ2ÑOÔO€MØVÐV¸MÈ*Ô<UÐVÑVÔVÐV�3ÐVÑVÔVÐVÐVÐVÐVÐVÕVÔVÑVÔVÐVÐVÕVÔV�3ÑVÔVÐVÕVÔV�3ÑVÔVÐVÐVÕVÔVÐVÑVÔVÕVÔVÐVÑVÔVÐVÐVÑVÐVÕVÕVÔVÐVÑVÔVÑVÔVÐVÐVÐVÐVÐVÐVÐVr   c                  óp  — t          ¦   «         } |                      dd¬¦  «        }|d         }d}||u }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd	|iz  }t          t          j        |¦  «        ¦  «        ‚d
x}x}}|d         }d}||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd	|iz  }t          t          j        |¦  «        ¦  «        ‚d
x}x}}|d         }d}||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd	|iz  }t          t          j        |¦  «        ¦  «        ‚d
x}x}}|d         }d}||k    }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd	|iz  }t          t          j        |¦  «        ¦  «        ‚d
x}x}}d}|d         }||v }|slt          j        d|fd||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd	|iz  }t          t          j        |¦  «        ¦  «        ‚d
x}x}}d
S )uc   Kiá»ƒm thá»­ thuáº­t toÃ¡n AI quÃ©t tá»± Ä‘á»™ng Ä‘á»‘i soÃ¡t hÃ ng loáº¡t á»Ÿ cháº¿ Ä‘á»™ Dry-Run.Téd   ©Údry_runÚ	max_itemsrd   ©Úis©z%(py1)s is %(py4)sr    r#   r$   NÚtotal_unmatched_scanned)ú<=)z%(py1)s <= %(py4)sÚmatched_countr   r&   r(   Úmatched_amount_vndé   Úpillar_breakdown©Úin)z%(py1)s in %(py4)s)r   Úbatch_auto_matchr.   r/   r0   r1   r2   )r3   Údry_resr5   r6   r7   r8   r9   s          r   Útest_3way_matching_dry_runrs   8   s{  € å$Ñ&Ô&€GØ×&Ò&¨t¸sÐ&ÑCÔC€Gà�9ÔÐ% Ð%Ð Ð%Ð%Ð%Ð%Õ%Ô%Ð%Ð%Ð%Ð%Ð Ð%Ñ%Ô%Õ%Ô%ÐÑ%Ô%Õ%Ô% Ñ%Ô%Ð%Ð%Ñ%Ð%Ð%Ð%Ð%Ð%Ñ%Ð%Õ%Õ%Ô%Ð%Ñ%Ô%Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Ð%Ð%ØÐ,Ô-Ð4°Ð4Ð-°Ò4Ð4Ð4Ð4Õ4Ô4Ð4Ð4Ð4Ð4Ð-°Ð4Ñ4Ô4Õ4Ô4Ð-Ñ4Ô4Õ4Ô4°Ñ4Ô4Ð4Ð4Ñ4Ð4Ð4Ð4Ð4Ð4Ñ4Ð4Õ4Õ4Ô4Ð4Ñ4Ô4Ñ4Ô4Ð4Ð4Ð4Ð4Ð4Ð4Ð4Ø�?Ô#Ð' aÐ'Ð# aÒ'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'Ð# aÐ'Ñ'Ô'Õ'Ô'Ð#Ñ'Ô'Õ'Ô' aÑ'Ô'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'ØÐ'Ô(Ð,¨1Ð,Ð(¨1Ò,Ð,Ð,Ð,Õ,Ô,Ð,Ð,Ð,Ð,Ð(¨1Ð,Ñ,Ô,Õ,Ô,Ð(Ñ,Ô,Õ,Ô,¨1Ñ,Ô,Ð,Ð,Ñ,Ð,Ð,Ð,Ð,Ð,Ñ,Ð,Õ,Õ,Ô,Ð,Ñ,Ô,Ñ,Ô,Ð,Ð,Ð,Ð,Ð,Ð,Ð,ØÐ+�Ð*Ô+Ð+ˆ1Ð+Ð+Ð+Ð+Ð+Õ+Ô+Ð+Ð+Ð+Ð+ˆ1Ð+Ð+Ñ+Ô+Õ+Ô+ˆ1Ñ+Ô+Õ+Ô+Ð+Ñ+Ô+Ð+Ð+Ñ+Ð+Ð+Ð+Ð+Ð+Ñ+Ð+Õ+Õ+Ô+Ð+Ñ+Ô+Ñ+Ô+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+Ð+r   c                 óœ  — |                       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}	|	|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|¬¦  «        }|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}}|d         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!}	|j
        } |¦   «         }|	|v }
|
s½t          j        d|
fd"|	|f¦  «        t          j        |	¦  «        d t	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd t          j        |¦  «        t          j        |¦  «        d#œz  }d$d%|iz  }t          t          j	        |¦  «        ¦  «        ‚d
x}	x}
x}}d&}	|j
        } |¦   «         }|	|v }
|
s½t          j        d|
fd"|	|f¦  «        t          j        |	¦  «        d t	          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd t          j        |¦  «        t          j        |¦  «        d#œz  }d$d%|iz  }t          t          j	        |¦  «        ¦  «        ‚d
x}	x}
x}}|                      d'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(}|	|u }
|
slt          j        d.|
fd/|	|f¦  «        t          j        |	¦  «        t          j        |¦  «        d0œz  }d1d2|iz  }t          t          j	        |¦  «        ¦  «        ‚d
x}	x}
}d
S )3uQ   Kiá»ƒm thá»­ cÃ¡c API routes 3-Way Matching vÃ  tháº©m tra giÃ¡ Sá»Ÿ XÃ¢y Dá»±ng.z&/v1/erp/invoices/3way-matching/summary©ÚheaderséÈ   rB   ©z3%(py2)s
{%(py2)s = %(py0)s.status_code
} == %(py5)sÚresp_sum©rG   rH   Úpy5úassert %(py7)srI   Nr   ro   ©z%(py1)s in %(py3)sÚdata_sum©r!   Úpy3úassert %(py5)sr{   r+   z6/v1/erp/invoices/3way-matching/list?status=ALL&limit=5Ú	resp_listrA   rM   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} == %(py6)srE   ©rG   r!   r€   r$   úassert %(py8)sÚpy8r   r   ú/v1/erp/invoices/3way-matching/z/audit-detailÚresp_detÚinvoice)zC%(py1)s in %(py7)s
{%(py7)s = %(py5)s
{%(py5)s = %(py3)s.json
}()
})r!   r€   r{   rI   rJ   rK   Úitemsz//v1/erp/invoices/3way-matching/batch-auto-matchTé2   rc   ©Újsonrv   Ú
resp_batchrd   rf   rh   r    r#   r$   )ÚgetÚstatus_coder.   r/   rV   rW   rX   r0   r1   r2   rŒ   rE   Úpost)r   r   ry   rZ   Ú@py_assert4r6   Ú@py_format6r]   r~   r5   r7   Ú@py_format4r‚   rA   r\   r9   Ú@py_format9Úfirst_idr‡   r[   r^   r�   r8   s                          r   Útest_3way_api_endpointsr–   D   sŽ	  € ð �~Š~ÐFÐP\ˆ~Ñ]Ô]€HØÔÐ& 3Ð&Ð 3Ò&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&Ð 3Ð&Ñ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&ˆ8Ñ&Ô&Ð&Õ&Ô&ˆ8Ñ&Ô&Ð&Ð&Õ&Ô&ÐÑ&Ô&Õ&Ô& 3Ñ&Ô&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ø�}Š}‰Œ€HØÐ'Ð˜xÐ'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'Ð˜xÐ'Ñ'Ô'Õ'Ô'ÐÑ'Ô'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'˜xÑ'Ô'Ð'Õ'Ô'˜xÑ'Ô'Ð'Ð'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'ØÐ(Ð Ð(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(Ð Ð(Ñ(Ô(Õ(Ô(ÐÑ(Ô(Ð(Õ(Ô(Ñ(Ô(Ð(Ð(Õ(Ô( Ñ(Ô(Ð(Õ(Ô( Ñ(Ô(Ð(Ð(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(ð —’ÐWÐam�ÑnÔn€IØÔ Ð' CÐ'Ð  CÒ'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'Ð  CÐ'Ñ'Ô'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'ˆ9Ñ'Ô'Ð'Õ'Ô'ˆ9Ñ'Ô'Ð'Ð'Õ'Ô'Ð Ñ'Ô'Õ'Ô' CÑ'Ô'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ø�~Š~ÑÔ 
Ô+€HÝˆx‰=Œ=Ð˜AÐˆ=˜AÒÐÐÐÕÔÐÐÐÐˆ=˜AÐÑÔÐÕÔÑÔÐÐÕÔ�3ÑÔÐÕÔ�3ÑÔÐÐÐÕÔÑÔÐÐÕÔˆxÑÔÐÕÔˆxÑÔÐÐÕÔˆ=ÑÔÕÔ˜AÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐð ˜Œ{˜4Ô €HØ�~Š~ÐWÀÐWÐWÐWÐamˆ~ÑnÔn€HØÔÐ& 3Ð&Ð 3Ò&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&Ð 3Ð&Ñ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&ˆ8Ñ&Ô&Ð&Õ&Ô&ˆ8Ñ&Ô&Ð&Ð&Õ&Ô&ÐÑ&Ô&Õ&Ô& 3Ñ&Ô&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&ØÐ'˜œÐ'˜˜™œÐ'ˆ9˜Ð'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'ˆ9˜Ð'Ñ'Ô'Õ'Ô'ˆ9Ñ'Ô'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'˜Ñ'Ô'Ð'Õ'Ô'˜Ñ'Ô'Ð'Ð'Õ'Ô'˜Ñ'Ô'Õ'Ô'˜Ñ'Ô'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ð'ØÐ%�h”mÐ%�m�m‘o”oÐ%ˆ7�oÐ%Ð%Ð%Ð%Õ%Ô%Ð%Ð%Ð%Ð%ˆ7�oÐ%Ñ%Ô%Õ%Ô%ˆ7Ñ%Ô%Ð%Õ%Ô%Ñ%Ô%Ð%Ð%Õ%Ô%�hÑ%Ô%Ð%Õ%Ô%�hÑ%Ô%Ð%Ð%Õ%Ô%�mÑ%Ô%Õ%Ô%�oÑ%Ô%Ð%Ð%Ñ%Ð%Ð%Ð%Ð%Ð%Ñ%Ð%Õ%Õ%Ô%Ð%Ñ%Ô%Ñ%Ô%Ð%Ð%Ð%Ð%Ð%Ð%Ð%Ð%Ð%ð —’Ø9Ø¨BÐ/Ð/Øð !ñ ô €Jð
 Ô!Ð( SÐ(Ð! SÒ(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(Ð! SÐ(Ñ(Ô(Ð(Õ(Ô(Ñ(Ô(Ð(Ð(Õ(Ô(ˆ:Ñ(Ô(Ð(Õ(Ô(ˆ:Ñ(Ô(Ð(Ð(Õ(Ô(Ð!Ñ(Ô(Õ(Ô( SÑ(Ô(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(Ø�?Š?ÑÔ˜YÔ'Ð/¨4Ð/Ð'¨4Ð/Ð/Ð/Ð/Õ/Ô/Ð/Ð/Ð/Ð/Ð'¨4Ð/Ñ/Ô/Õ/Ô/Ð'Ñ/Ô/Õ/Ô/¨4Ñ/Ô/Ð/Ð/Ñ/Ð/Ð/Ð/Ð/Ð/Ñ/Ð/Õ/Õ/Ô/Ð/Ñ/Ô/Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/r   c           	      óª  — t          ¦   «         }|                     ¦   «         }|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}}|j                             ¦   «         5 }	|	 	                    ¦   «         5 }
|
 
                    d	¦  «         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}}t          |d         d
         ¦  «        t          |d         d
         ¦  «        }}ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   |                      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}||v }|s—t          j        d |fd!||f¦  «        t          j        |¦  «        d"t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd"d#œz  }d$d%|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}d&}||v }|s—t          j        d |fd!||f¦  «        t          j        |¦  «        d"t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd"d#œz  }d$d%|iz  }t          t          j        |¦  «        ¦  «        ‚dx}}d'|d(d)d*d+œ|d,d-d.d+œgi}|                      d|› d�||¬/¦  «        }|j        }d}||k    }|sªt          j        d|fd||f¦  «        d0t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd0t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|                     ¦   «         }|d1         }d}||k    }|slt          j        d|fd2||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|d3         }d4}||k    }|slt          j        d|fd2||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|                      d|› d�|¬¦  «        }|j        }d}||k    }|sªt          j        d|fd||f¦  «        d5t          j        ¦   «         v st          j        |¦  «        rt          j        |¦  «        nd5t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}|                     ¦   «         }|d'         }t          |¦  «        }d}||k    }|sÇt          j        d|fd6||f¦  «        dt          j        ¦   «         v st          j        t          ¦  «        rt          j        t          ¦  «        ndt          j        |¦  «        t          j        |¦  «        t          j        |¦  «        d7œz  }d8d9|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}x}}|d3         }d4}||k    }|slt          j        d|fd2||f¦  «        t          j        |¦  «        t          j        |¦  «        dœz  }dd|iz  }t          t          j        |¦  «        ¦  «        ‚dx}x}}dS ):ud   Kiá»ƒm thá»­ toÃ n diá»‡n tÃ­nh nÄƒng 1 hÃ³a Ä‘Æ¡n nháº­p váº­t tÆ° phÃ¢n bá»• cho nhiá»�u dá»± Ã¡n.r   r   r&   r(   r    r#   r$   Nz>SELECT id FROM erp_invoices WHERE direction = 'input' LIMIT 1;r   z6SELECT id FROM projects ORDER BY project_code LIMIT 2;rm   r   )z0%(py3)s
{%(py3)s = %(py0)s(%(py1)s)
} >= %(py6)srE   Úp_rowsrƒ   r„   r…   é   r†   z/allocationsru   rw   rB   rx   Úresp_getrz   r|   rI   r%   ro   r}   Úget_datar   r�   r{   r‰   Úallocationsg      $@g    €O"Au   PhÃ¢n bá»• cÃ´ng trÃ¬nh 1)Ú
project_idÚallocated_quantityÚallocated_total_amount_vndÚnotesg      @g     jAu   PhÃ¢n bá»• cÃ´ng trÃ¬nh 2r‹   Ú	resp_postÚprojects_count)z%(py1)s == %(py4)sÚtotal_allocated_vndg    €„.AÚresp_verifyrD   rF   rJ   rK   )r   r-   r.   r/   r0   r1   r2   ÚdbÚget_connectionÚcursorÚexecuteÚstrÚfetchoneÚfetchallrE   rV   rW   rX   rŽ   r�   rŒ   r�   )r   r   r3   r4   r5   r6   r7   r8   r9   ÚconnÚcurÚinv_idr˜   r\   r‘   r”   Úp1_idÚp2_idrš   rZ   r’   r]   r›   r“   Úalloc_payloadr¡   Úpost_resr¤   Úverify_datar[   r^   s                                  r   Ú'test_multi_project_allocation_lifecycler´   d   sj  € å$Ñ&Ô&€GØ×*Ò*Ñ,Ô,€GØÐ#Ô$Ð( qÐ(Ð$ qÒ(Ð(Ð(Ð(Õ(Ô(Ð(Ð(Ð(Ð(Ð$ qÐ(Ñ(Ô(Õ(Ô(Ð$Ñ(Ô(Õ(Ô( qÑ(Ô(Ð(Ð(Ñ(Ð(Ð(Ð(Ð(Ð(Ñ(Ð(Õ(Õ(Ô(Ð(Ñ(Ô(Ñ(Ô(Ð(Ð(Ð(Ð(Ð(Ð(Ð(ð 
Œ×	"Ò	"Ñ	$Ô	$ð B¨¨d¯kªk©m¬mð B¸sØ�ŠÐTÑUÔUÐUÝ�S—\’\‘^”^ DÔ)Ñ*Ô*ˆØ�ŠÐLÑMÔMÐMØ—’‘”ˆÝ�6‰{Œ{Ð˜aÐˆ{˜aÒÐÐÐÕÔÐÐÐÐˆ{˜aÐÑÔÐÕÔÑÔÐÐÕÔ�sÑÔÐÕÔ�sÑÔÐÐÐÕÔÑÔÐÐÕÔ�6ÑÔÐÕÔ�6ÑÔÐÐÕÔˆ{ÑÔÕÔ˜aÑÔÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐÐÐÝ˜6 !œ9 Tœ?Ñ+Ô+­S°¸´¸4´Ñ-AÔ-AˆuˆðBð Bð Bñ Bô Bð Bð Bð Bð Bð Bð Bøøøð Bð Bð Bð Bð Bð Bð Bñ Bô Bð Bð Bð Bð Bð Bð Bøøøð Bð Bð Bð Bð �~Š~Ø>¨&Ð>Ð>Ð>Øð ñ ô €Hð ÔÐ& 3Ð&Ð 3Ò&Ð&Ð&Ð&Õ&Ô&Ð&Ð&Ð&Ð&Ð 3Ð&Ñ&Ô&Ð&Õ&Ô&Ñ&Ô&Ð&Ð&Õ&Ô&ˆ8Ñ&Ô&Ð&Õ&Ô&ˆ8Ñ&Ô&Ð&Ð&Õ&Ô&ÐÑ&Ô&Õ&Ô& 3Ñ&Ô&Ð&Ð&Ñ&Ð&Ð&Ð&Ð&Ð&Ñ&Ð&Õ&Õ&Ô&Ð&Ñ&Ô&Ñ&Ô&Ð&Ð&Ð&Ð&Ð&Ð&Ð&Ø�}Š}‰Œ€HØÐ)Ð Ð)Ð)Ð)Ð)Õ)Ô)Ð)Ð)Ð)Ð)Ð Ð)Ñ)Ô)Õ)Ô)ÐÑ)Ô)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô) Ñ)Ô)Ð)Õ)Ô) Ñ)Ô)Ð)Ð)Ð)Ð)Ñ)Ð)Ð)Ð)Ð)Ð)Ñ)Ð)Õ)Õ)Ô)Ð)Ñ)Ô)Ñ)Ô)Ð)Ð)Ð)Ð)Ð)ØÐˆ7�hÐÐÐÐÕÔÐÐÐÐˆ7�hÐÑÔÕÔˆ7ÑÔÐÕÔÑÔÐÐÕÔ�hÑÔÐÕÔ�hÑÔÐÐÐÐÑÐÐÐÐÐÑÐÕÕÔÐÑÔÑÔÐÐÐÐÐð 	à#Ø&*Ø.6Ø4ð	ð ð $Ø&)Ø.6Ø4ð	ð ð
ð€Mð  —’Ø>¨&Ð>Ð>Ð>ØØð  ñ ô €Ið
 Ô Ð' CÐ'Ð  CÒ'Ð'Ð'Ð'Õ'Ô'Ð'Ð'Ð'Ð'Ð  CÐ'Ñ'Ô'Ð'Õ'Ô'Ñ'Ô'Ð'Ð'Õ'Ô'ˆ9Ñ'Ô'Ð'Õ'Ô'ˆ9Ñ'Ô'Ð'Ð'Õ'Ô'Ð Ñ'Ô'Õ'Ô' CÑ'Ô'Ð'Ð'Ñ'Ð'Ð'Ð'Ð'Ð'Ñ'Ð'Õ'Õ'Ô'Ð'Ñ'Ô'Ñ'Ô'Ð'Ð'Ð'Ð'Ð'Ð'Ð'Ø�~Š~ÑÔ€HØÐ$Ô%Ð*¨Ð*Ð%¨Ò*Ð*Ð*Ð*Õ*Ô*Ð*Ð*Ð*Ð*Ð%¨Ð*Ñ*Ô*Õ*Ô*Ð%Ñ*Ô*Õ*Ô*¨Ñ*Ô*Ð*Ð*Ñ*Ð*Ð*Ð*Ð*Ð*Ñ*Ð*Õ*Õ*Ô*Ð*Ñ*Ô*Ñ*Ô*Ð*Ð*Ð*Ð*Ð*Ð*Ð*ØÐ)Ô*Ð7¨iÐ7Ð*¨iÒ7Ð7Ð7Ð7Õ7Ô7Ð7Ð7Ð7Ð7Ð*¨iÐ7Ñ7Ô7Õ7Ô7Ð*Ñ7Ô7Õ7Ô7¨iÑ7Ô7Ð7Ð7Ñ7Ð7Ð7Ð7Ð7Ð7Ñ7Ð7Õ7Õ7Ô7Ð7Ñ7Ô7Ñ7Ô7Ð7Ð7Ð7Ð7Ð7Ð7Ð7ð —.’.Ø>¨&Ð>Ð>Ð>Øð !ñ ô €Kð Ô"Ð) cÐ)Ð" cÒ)Ð)Ð)Ð)Õ)Ô)Ð)Ð)Ð)Ð)Ð" cÐ)Ñ)Ô)Ð)Õ)Ô)Ñ)Ô)Ð)Ð)Õ)Ô)ˆ;Ñ)Ô)Ð)Õ)Ô)ˆ;Ñ)Ô)Ð)Ð)Õ)Ô)Ð"Ñ)Ô)Õ)Ô) cÑ)Ô)Ð)Ð)Ñ)Ð)Ð)Ð)Ð)Ð)Ñ)Ð)Õ)Õ)Ô)Ð)Ñ)Ô)Ñ)Ô)Ð)Ð)Ð)Ð)Ð)Ð)Ð)Ø×"Ò"Ñ$Ô$€KØ˜=Ô)Ð/�3Ð)Ñ*Ô*Ð/¨aÐ/Ð*¨aÒ/Ð/Ð/Ð/Õ/Ô/Ð/Ð/Ð/Ð/Ð*¨aÐ/Ñ/Ô/Ð/Õ/Ô/Ñ/Ô/Ð/Ð/Õ/Ô/�3Ñ/Ô/Ð/Õ/Ô/�3Ñ/Ô/Ð/Ð/Õ/Ô/Ð)Ñ/Ô/Õ/Ô/Ð*Ñ/Ô/Õ/Ô/¨aÑ/Ô/Ð/Ð/Ñ/Ð/Ð/Ð/Ð/Ð/Ñ/Ð/Õ/Õ/Ô/Ð/Ñ/Ô/Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/ØÐ,Ô-Ð:°Ð:Ð-°Ò:Ð:Ð:Ð:Õ:Ô:Ð:Ð:Ð:Ð:Ð-°Ð:Ñ:Ô:Õ:Ô:Ð-Ñ:Ô:Õ:Ô:°Ñ:Ô:Ð:Ð:Ñ:Ð:Ð:Ð:Ð:Ð:Ñ:Ð:Õ:Õ:Ô:Ð:Ñ:Ô:Ñ:Ô:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:Ð:s7   Ã J%ÃF-JÊJ%ÊJ	ÊJ%ÊJ	ÊJ%Ê%J)Ê,J))Ú__doc__ÚbuiltinsrV   Ú_pytest.assertion.rewriteÚ	assertionÚrewriter.   ÚpytestÚfastapi.testclientr   Úapp.mainr   Ú)app.modules.auth.application.auth_servicer   Ú:app.modules.invoices.application.aec_3way_matching_servicer   Úfixturer   r   r:   r`   rs   r–   r´   rP   r   r   ú<module>rÀ      s.  ððð ð € € € € € € € € € € € € €€€€Ø )Ð )Ð )Ð )Ð )Ð )à Ð Ð Ð Ð Ð Ø AÐ AÐ AÐ AÐ AÐ AØ ]Ð ]Ð ]Ð ]Ð ]Ð ]ð €„�hÐÑÔðð ñ  Ôðð
 €„�hÐÑÔð	0ð 	0ñ  Ôð	0ð	Að 	Að 	Að	Wð 	Wð 	Wð	,ð 	,ð 	,ð0ð 0ð 0ð@<;ð <;ð <;ð <;ð <;r   