§
     ’jm^  ã                  óê   — 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  G d„ d	¦  «        Zd
ddœdd„Z G d„ d¦  «        Z G d„ de	j        ¦  «        Zdd„ZdS )é    )ÚannotationsN)Údeepcopy)ÚAny)Úpatch)ÚWorkflowReviewStartRequest)ÚWorkflowPersistenceServicec                  ó   — e Zd Zdd„ZdS )ÚFailingOperationalStateServiceÚreturnúdict[str, Any]c                ó    — t          d¦  «        ‚)Nzoperational-state-unavailable)ÚRuntimeError©Úselfs    ú=C:\Projects\DSCons\tests\test_workflow_persistence_support.pyÚget_company_operational_statez<FailingOperationalStateService.get_company_operational_state   s   € ÝÐ:Ñ;Ô;Ð;ó    N©r   r   )Ú__name__Ú
__module__Ú__qualname__r   © r   r   r
   r
      s(   € € € € € ð<ð <ð <ð <ð <ð <r   r
   zreview-1zRVW-PRJ-AGENT-20260101000000©Ú	review_idÚreview_coder   Ústrr   r   r   c                ó¼   — i 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d“dd“ddd g dd d!d"ddddi i i d#œgd$d%d&dddd'i ddii dd(œgd)d*id+œ¥S ),Nr   r   Úproject_codeúPRJ-001Úproject_nameu   Dá»± Ã¡n thá»­ nghiá»‡mÚdossier_scopeÚproject_dossierÚtrigger_sourceÚsystem_proactive_reviewÚinitiated_by_employee_codeúEMP-INITÚinitiated_by_employee_nameu   NgÆ°á»�i khá»Ÿi táº¡oÚlead_reviewer_employee_codeúEMP-LEADÚlead_reviewer_employee_nameõ   TrÆ°á»Ÿng nhÃ³mÚlead_agent_codeÚlegal_agentÚstatusÚ	in_reviewÚreview_reasonu   RÃ  soÃ¡t chá»§ Ä‘á»™ngÚreview_summaryÚassigned_departmentsÚopen_findings_countr   Úresolved_findings_countz2026-01-01T00:00:00Zz
snapshot-1Úinitial_baselineÚBaselineu   Tá»•ng quan ban Ä‘áº§u)Úsnapshot_idÚsnapshot_typeÚlabelÚsummaryÚcaptured_atÚcaptured_by_agent_codeÚcaptured_by_employee_codeÚcaptured_by_employee_nameÚdossier_stateÚmissing_matrixÚreadiness_summaryzaction-session-createdÚsession_createdÚagentu   Táº¡o phiÃªn rÃ  soÃ¡t©Ú	action_idÚaction_typeÚ
actor_typeÚactor_employee_codeÚactor_employee_nameÚactor_agent_codeÚaction_summaryÚbefore_stateÚafter_stateÚaction_payloadÚ
created_atÚworkflow_typeÚproactive_dossier_review)Úoverdue_assignments_countÚlast_reviewed_atÚ	closed_atÚfindingsÚ	snapshotsÚactionsÚmetadatar   r   s     r   Úmake_review_sessionrY      sl  € ð5Ø�Yð5à�{ð5ð 	˜	ð5ð 	Ð1ð	5ð
 	Ð*ð5ð 	Ð3ð5ð 	% jð5ð 	%Ð&=ð5ð 	& zð5ð 	&Ð'8ð5ð 	˜=ð5ð 	�+ð5ð 	Ð2ð5ð 	˜$ð5ð 	 ð5ð  	˜qð!5ð" 	" 1ð#5ð$ &'Ø2ØØð  ,Ø!3Ø#Ø3Ø5Ø*7Ø-7Ø->Ø!#Ø"$Ø%'ðð ð
ð" 6Ø0Ø%Ø'1Ø'8Ø$1Ø":Ø "Ø (¨+Ð6Ø"$Ø4ðð ð
ð %Ð&@ÐAði5ð 5ð 5ð 5r   c                  óŠ   — e Zd Zdd„Zdd„Zdd„Z	 d d!d„Z	 d d"d„Z	 d d#d„Z	 d d#d„Z		 d d#d„Z
	 d d"d„Zd$d„Zd$d„Z	 d%d&d„Zd	S )'ÚFakePostgresClientr   ÚNonec                óâ   — t          ¦   «         | _        d | _        g | _        g | _        g | _        g | _        g | _        g | _        g | _	        d| _
        g | _        g | _        g g g g g g dœ| _        d S )Nr   )Úcreate_dossier_review_sessionÚcreate_dossier_review_findingÚassign_dossier_review_findingÚ submit_dossier_review_supplementÚverify_dossier_review_findingÚclose_dossier_review_session)rY   ÚsessionÚcreated_review_payloadÚcreated_findings_payloadsÚcreated_assignments_payloadsÚsubmitted_supplements_payloadsÚverified_findings_payloadsÚclosed_review_payloadsÚupserted_sessionsÚappended_actionsÚtransaction_callsÚtransaction_connection_tokensÚtransaction_snapshotsÚreceived_connectionsr   s    r   Ú__init__zFakePostgresClient.__init__N   sŽ   € Ý*Ñ,Ô,ˆŒØ=AˆÔ#Ø?AˆÔ&ØBDˆÔ)ØDFˆÔ+Ø@BˆÔ'Ø<>ˆÔ#Ø79ˆÔØ68ˆÔØ!"ˆÔØ8:ˆÔ*Ø;=ˆÔ"à-/Ø-/Ø-/Ø02Ø-/Ø,.ð;
ð ;
ˆÔ!Ð!Ð!r   Úboolc                ó   — dS )NFr   r   s    r   Ú
is_enabledzFakePostgresClient.is_enabledd   s   € Øˆur   Ú	operationr   c           	     óš  — | xj         dz  c_         d| j         › �}| j                             |¦  «         t          | j        ¦  «        t          | j        ¦  «        t          | j        ¦  «        t          | j        ¦  «        t          | j        ¦  «        t          | j	        ¦  «        t          | j
        ¦  «        dœ}| j                             |¦  «         	  ||¦  «        S # t          $ r] |d         | _        |d         | _        |d         | _        |d         | _        |d         | _        |d	         | _	        |d
         | _
        ‚ w xY w)Né   ztx-conn-)rd   re   rf   rg   rh   ri   rj   rd   re   rf   rg   rh   ri   rj   )rm   rn   Úappendr   rd   re   rf   rg   rh   ri   rj   ro   Ú	Exception)r   ru   Úconnection_tokenÚsnapshots       r   Úrun_in_transactionz%FakePostgresClient.run_in_transactionh   sd  € ØÐÔ !Ñ#ÐÔØ> dÔ&<Ð>Ð>ÐØÔ*×1Ò1Ð2BÑCÔCÐCå ¤Ñ-Ô-Ý&.¨tÔ/JÑ&KÔ&KÝ)1°$Ô2PÑ)QÔ)QÝ,4°TÔ5VÑ,WÔ,WÝ.6ØÔ3ñ/ô /õ +3°4Ô3RÑ*SÔ*SÝ&.¨tÔ/JÑ&KÔ&Kð

ð 

ˆð 	Ô"×)Ò)¨(Ñ3Ô3Ð3ð	Ø�9Ð-Ñ.Ô.Ð.øÝð 
	ð 
	ð 
	Ø# IÔ.ˆDŒLØ*2Ð3KÔ*LˆDÔ'Ø-5Ð6QÔ-RˆDÔ*Ø08Ð9WÔ0XˆDÔ-Ø2:Ø0ô3ˆDÔ/ð /7Ð7SÔ.TˆDÔ+Ø*2Ð3KÔ*LˆDÔ'Øð
	øøøs   Ã
C# Ã#A'E
NÚpayloadr   Ú
connectionú
Any | Nonec                ó‚  — | j         d                              |¦  «         t          |¦  «        | _        |d         | j        d<   |d         | j        d<   t          |                     d¦  «        pg ¦  «        | j        d<   t          |                     d¦  «        pi ¦  «        | j        d<   t          | j        ¦  «        S )Nr^   r   r.   r2   rX   )rp   rx   r   re   rd   ÚlistÚget)r   r}   r~   s      r   r^   z0FakePostgresClient.create_dossier_review_session†   s¶   € ð 	Ô!Ð"AÔB×IÒIÈ*ÑUÔUÐUÝ&.¨wÑ&7Ô&7ˆÔ#Ø&-¨mÔ&<ˆŒ�]Ñ#Ø!(¨Ô!2ˆŒ�XÑÝ/3Ø�KŠKÐ.Ñ/Ô/Ð5°2ñ0
ô 0
ˆŒÐ+Ñ,õ $,¨G¯KªK¸
Ñ,CÔ,CÐ,IÀrÑ#JÔ#JˆŒ�ZÑ Ý˜œÑ%Ô%Ð%r   r   r   c           	     ó>  — | j         d                              |¦  «         dt          | j        d         ¦  «        dz   › �}i d|“d|d         “d|d         “d|d         “d	|d	         “d
|                     d
¦  «        “d|                     d¦  «        “d|                     d¦  «        “d|                     dd¦  «        “d|                     dd¦  «        “d|                     dd¦  «        “d|                     dd¦  «        “d|                     dd¦  «        “d|                     dd¦  «        “d|                     d¦  «        “dd“dd “d t          |                     d¦  «        pg ¦  «        g t          |                     d¦  «        pi ¦  «        dœ¥}| j                             t          |¦  «        ¦  «         | j        d                              |¦  «         t          d„ | j        d         D ¦   «         ¦  «        | j        d <   t          |¦  «        S )!Nr_   zfinding-rU   rw   Ú
finding_idÚfinding_codeÚfinding_groupÚfinding_typeÚtitleÚdescriptionÚdocument_typeÚdossier_stageÚseverityÚmediumÚimpact_levelÚresponsible_department_codeÚ	synthesisÚsupplement_statusÚ	requestedr.   ÚopenÚis_blockingFÚdue_dateÚdetected_atz2026-01-01T00:00:01ZÚresolved_atÚ	evidencesrX   )Úresolution_noter˜   ÚassignmentsrX   c              3  ó2   K  — | ]}|d          dk    ¯dV — ŒdS ©r.   Úresolvedrw   Nr   ©Ú.0Úitems     r   ú	<genexpr>zCFakePostgresClient.create_dossier_review_finding.<locals>.<genexpr>³   ó9   è è € ð 2
ð 2
Ø°d¸8´nÈ
Ò6RÐ6RˆAÐ6RÐ6RÐ6RÐ6Rð2
ð 2
r   r3   )rp   rx   Úlenrd   r‚   r   rf   Úsum)r   r   r}   r~   r„   Úfindings         r   r_   z0FakePostgresClient.create_dossier_review_finding“   s…  € ð 	Ô!Ð"AÔB×IÒIÈ*ÑUÔUÐUØC¥ D¤L°Ô$<Ñ =Ô =ÀÑ AÐCÐCˆ
ð
Ø˜*ð
à˜G NÔ3ð
ð ˜W _Ô5ð
ð ˜G NÔ3ð	
ð
 �W˜WÔ%ð
ð ˜7Ÿ;š; }Ñ5Ô5ð
ð ˜WŸ[š[¨Ñ9Ô9ð
ð ˜WŸ[š[¨Ñ9Ô9ð
ð ˜Ÿš J°Ñ9Ô9ð
ð ˜GŸKšK¨¸ÑAÔAð
ð *¨7¯;ª;Ø-¨{ñ,ô ,ð
ð   §¢Ð-@À+Ñ!NÔ!Nð
ð �g—k’k (¨FÑ3Ô3ð
ð  ˜7Ÿ;š; }°eÑ<Ô<ð!
ð" ˜Ÿš JÑ/Ô/ð#
ð$ Ð1ð%
ð& ˜4ð'
ð(  $Ý! '§+¢+¨kÑ":Ô":Ð"@¸bÑAÔAØÝ  §¢¨ZÑ!8Ô!8Ð!>¸BÑ?Ô?ð/
ð 
ð 
ˆð2 	Ô&×-Ò-­h°wÑ.?Ô.?Ñ@Ô@Ð@ØŒ�ZÔ ×'Ò'¨Ñ0Ô0Ð0Ý.1ð 2
ð 2
Øœ, zÔ2ð2
ñ 2
ô 2
ñ /
ô /
ˆŒÐ*Ñ+õ ˜Ñ Ô Ð r   r„   c                óÌ  — | j         d                              |¦  «         dt          | j        ¦  «        dz   › �}i 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t          |                     d¦  «        pi ¦  «        “}| j                             t          |¦  «        ¦  «         | j        d         D ]D}|d         |k    r6|d                              |¦  «         |                     dd¦  «        |d
<    nŒEt          d„ | j        d         D ¦   «         ¦  «        | j        d<   t          |¦  «        S )Nr`   zassignment-rw   Úassignment_idÚassigned_department_codeÚassigned_employee_codeÚassigned_employee_nameÚassigned_by_employee_codeÚassigned_by_employee_namer.   ÚpendingÚpriorityr�   r•   Úassignment_noteÚlatest_submission_noteÚaccepted_atÚsubmitted_atÚverified_atrT   ÚsubmissionsrX   rU   r„   rš   Úfinding_statusÚassignedc                ó   — h | ]
}|d          ’ŒS )r�   r   )rŸ   r¥   s     r   ú	<setcomp>zCFakePostgresClient.assign_dossier_review_finding.<locals>.<setcomp>Û   s.   € ð ð ð àð Ð5Ô6ðð ð r   r2   )rp   rx   r£   rg   r‚   r   rd   Úsorted)r   r   r„   r}   r~   r§   Ú
assignmentr¥   s           r   r`   z0FakePostgresClient.assign_dossier_review_finding¸   sd  € ð 	Ô!Ð"AÔB×IÒIÈ*ÑUÔUÐUØR¥c¨$Ô*KÑ&LÔ&LÈqÑ&PÐRÐRˆð
Ø˜]ð
à&¨Ð0JÔ(Kð
ð % g§k¢kÐ2JÑ&KÔ&Kð
ð % g§k¢kÐ2JÑ&KÔ&Kð	
ð
 (¨¯ªÐ5PÑ)QÔ)Qð
ð (¨¯ªÐ5PÑ)QÔ)Qð
ð �g—k’k (¨IÑ6Ô6ð
ð ˜Ÿš J°Ñ9Ô9ð
ð ˜Ÿš JÑ/Ô/ð
ð ˜wŸ{š{Ð+<Ñ=Ô=ð
ð % dð
ð ˜4ð
ð ˜Dð
ð ˜4ð
ð ˜ð
ð  ˜2ð!
ð" � §¢¨ZÑ!8Ô!8Ð!>¸BÑ?Ô?ð#
ˆ
ð& 	Ô)×0Ò0µ¸'Ñ1BÔ1BÑCÔCÐCØ”| JÔ/ð 	ð 	ˆGØ�|Ô$¨
Ò2Ð2Ø˜Ô&×-Ò-¨jÑ9Ô9Ð9Ø$+§K¢KÐ0@À*Ñ$MÔ$M�˜Ñ!Ø�ð 3õ 06ðð à#œ|¨JÔ7ðñ ô ñ0
ô 0
ˆŒÐ+Ñ,õ ˜
Ñ#Ô#Ð#r   c                ó  — | j         d                              |¦  «         | j                             ||t          |¦  «        dœ¦  «         | j        d         D ]}|d         |k    rd|d<    nŒdt          | j        ¦  «        › �|ddœS )	Nra   ©r   r„   r}   rU   r„   Ú	submittedr‘   zsubmission-)Úsubmission_idr„   r.   )rp   rx   rh   r   rd   r£   ©r   r   r„   r}   r~   r¥   s         r   ra   z3FakePostgresClient.submit_dossier_review_supplementâ   sÂ   € ð 	Ô!Ð"DÔE×LÒLÈZÑXÔXÐXØÔ+×2Ò2à&Ø(Ý# GÑ,Ô,ðð ñ	
ô 	
ð 	
ð ”| JÔ/ð 	ð 	ˆGØ�|Ô$¨
Ò2Ð2Ø/:�Ð+Ñ,Ø�ð 3ð V­3¨tÔ/RÑ+SÔ+SÐUÐUØ$Ø!ð
ð 
ð 	
r   c                óÜ  — | j         d                              |¦  «         | j                             ||t          |¦  «        dœ¦  «         | j        d         D ]7}|d         |k    r)d|d<   d|d<   d	|d
<   |                     d¦  «        |d<    nŒ8t          d„ | j        d         D ¦   «         ¦  «        | j        d<   t          d„ | j        d         D ¦   «         ¦  «        | j        d<   |ddœS )Nrb   r¼   rU   r„   r�   r.   Úacceptedr‘   z2026-01-01T00:00:03Zr—   r™   c              3  ó2   K  — | ]}|d          dk    ¯dV — ŒdS rœ   r   rž   s     r   r¡   zCFakePostgresClient.verify_dossier_review_finding.<locals>.<genexpr>  s9   è è € ð 6
ð 6
Ø°d¸8´nÈ
Ò6RÐ6RˆAÐ6RÐ6RÐ6RÐ6Rð6
ð 6
r   r4   c              3  ó2   K  — | ]}|d          dk    ¯dV — ŒdS rœ   r   rž   s     r   r¡   zCFakePostgresClient.verify_dossier_review_finding.<locals>.<genexpr>  r¢   r   r3   )r„   r.   )rp   rx   ri   r   rd   r‚   r¤   r¿   s         r   rb   z0FakePostgresClient.verify_dossier_review_findingû   sH  € ð 	Ô!Ð"AÔB×IÒIÈ*ÑUÔUÐUØÔ'×.Ò.à&Ø(Ý# GÑ,Ô,ðð ñ	
ô 	
ð 	
ð ”| JÔ/ð 	ð 	ˆGØ�|Ô$¨
Ò2Ð2Ø$.�˜Ñ!Ø/9�Ð+Ñ,Ø)?�˜Ñ&Ø-4¯[ª[Ð9JÑ-KÔ-K�Ð)Ñ*Ø�ð 3õ 36ð 6
ð 6
Øœ, zÔ2ð6
ñ 6
ô 6
ñ 3
ô 3
ˆŒÐ.Ñ/õ /2ð 2
ð 2
Øœ, zÔ2ð2
ñ 2
ô 2
ñ /
ô /
ˆŒÐ*Ñ+ð )°JÐ?Ð?Ð?r   c                óæ   — | j         d                              |¦  «         | j                             |t          |¦  «        dœ¦  «         d| j        d<   d| j        d<   t          | j        ¦  «        S )Nrc   )r   r}   Úclosedr.   z2026-01-01T00:00:04ZrT   )rp   rx   rj   r   rd   )r   r   r}   r~   s       r   rc   z/FakePostgresClient.close_dossier_review_session  sy   € ð 	Ô!Ð"@ÔA×HÒHÈÑTÔTÐTØÔ#×*Ò*Ø#µ¸Ñ0AÔ0AÐBÐBñ	
ô 	
ð 	
ð "*ˆŒ�XÑØ$:ˆŒ�[Ñ!Ý˜œÑ%Ô%Ð%r   c                ó¬   — | j                              t          |¦  «        ¦  «         dt          | j         ¦  «        › �|d         |d         |d         dœS )Nz	work-log-r.   r   Ú
shift_date)Úwork_log_session_idr.   r   rÇ   )rk   rx   r   r£   ©r   r}   s     r   Ú upsert_employee_work_log_sessionz3FakePostgresClient.upsert_employee_work_log_session$  s`   € ð 	Ô×%Ò%¥h¨wÑ&7Ô&7Ñ8Ô8Ð8à#L­s°4Ô3IÑ/JÔ/JÐ#LÐ#LØ˜hÔ'Ø# NÔ3Ø! ,Ô/ð	
ð 
ð 	
r   c                ó�   — | j                              t          |¦  «        ¦  «         dt          | j         ¦  «        › �|d         dœS )Nzwork-log-action-rÈ   )rE   rÈ   )rl   rx   r   r£   rÉ   s     r   Úappend_employee_work_log_actionz2FakePostgresClient.append_employee_work_log_action/  sQ   € ð 	Ô×$Ò$¥X¨gÑ%6Ô%6Ñ7Ô7Ð7àH­C°Ô0EÑ,FÔ,FÐHÐHØ#*Ð+@Ô#Að
ð 
ð 	
r   ú
str | Noner   úlist[dict[str, Any]]c                ó  — t          | j        ¦  «        }|d         r3|d         dk    r'd|d<   t          d„ |d         D ¦   «         ¦  «        |d<   |d                              dd	d
ddddi d|d         ii ddœ¦  «         |gS )NrU   r.   rÅ   r¶   c              3  ó2   K  — | ]}|d          dk    ¯dV — ŒdS rœ   r   rž   s     r   r¡   zCFakePostgresClient.fetch_dossier_review_sessions.<locals>.<genexpr>>  s9   è è € ð 1ð 1Ø°T¸(´^ÀzÒ5QÐ5Q�Ð5QÐ5QÐ5QÐ5Qð1ð 1r   r3   rW   zaction-finding-createdÚfinding_createdrC   r)   r+   r-   u   Ä�Ã£ ghi nháº­n findingz2026-01-01T00:00:02ZrD   )r   rd   r¤   rx   )r   r   r   rd   s       r   Úfetch_dossier_review_sessionsz0FakePostgresClient.fetch_dossier_review_sessions8  sÍ   € õ ˜4œ<Ñ(Ô(ˆØ�:Ôð 	 7¨8Ô#4¸Ò#@Ð#@Ø *ˆG�HÑÝ-0ð 1ð 1Ø% jÔ1ð1ñ 1ô 1ñ .ô .ˆGÐ)Ñ*ð 	�	Ô×!Ò!à5Ø0Ø%Ø'1Ø'8Ø$1Ø";Ø "Ø (¨'°(Ô*;Ð<Ø"$Ø4ðð ñ	
ô 	
ð 	
ð ˆyÐr   )r   r\   )r   rr   )ru   r   r   r   ©N©r}   r   r~   r   r   r   ©r   r   r}   r   r~   r   r   r   ©
r   r   r„   r   r}   r   r~   r   r   r   ©r}   r   r   r   ©NN©r   rÍ   r   rÍ   r   rÎ   )r   r   r   rq   rt   r|   r^   r_   r`   ra   rb   rc   rÊ   rÌ   rÒ   r   r   r   r[   r[   M   sY  € € € € € ð
ð 
ð 
ð 
ð,ð ð ð ðð ð ð ð> AEð&ð &ð &ð &ð &ð QUð#!ð #!ð #!ð #!ð #!ðT "&ð($ð ($ð ($ð ($ð ($ð^ "&ð
ð 
ð 
ð 
ð 
ð< "&ð@ð @ð @ð @ð @ð> QUð	&ð 	&ð 	&ð 	&ð 	&ð	
ð 	
ð 	
ð 	
ð
ð 
ð 
ð 
ð HLðð ð ð ð ð ð r   r[   c                  ó^   — e Zd Zedd„¦   «         Zedd„¦   «         Zedd„¦   «         Zdd
„ZdS )Ú"WorkflowPersistenceServiceTestBaser   r   c                 ó   — ddddœS )Nõ   AI PhÃ¡p cháº¿õ   ChuyÃªn viÃªn phÃ¡p cháº¿ AIr-   )Údisplay_nameÚ
role_titleÚ
agent_coder   r   r   r   Úmock_persona_payloadz7WorkflowPersistenceServiceTestBase.mock_persona_payloadT  s   € ð -Ø8Ø'ð
ð 
ð 	
r   c                 ó   — dddg dœS )NrÝ   rÞ   r-   )rß   rà   rá   Úescalation_targetsr   r   r   r   Úmock_policy_persona_payloadz>WorkflowPersistenceServiceTestBase.mock_policy_persona_payload\  s   € ð -Ø8Ø'Ø"$ð	
ð 
ð 	
r   r   c                 ó~   — t          j        ddddddddddd	d
dddœd	ddddddidœgdœgdddddddidœgdœ¦  «        S )Nr   r-   r)   r&   zF-001ÚlegalÚmissing_documentu$   Thiáº¿u quyáº¿t Ä‘á»‹nh phÃª duyá»‡tz
EMP-LAW-01Úhighz
2026-01-10r­   )r¨   r©   r®   r•   r.   u   Ä�ang xá»­ lÃ½rF   rÑ   )Úemployee_coderá   Údepartment_codeÚactionr.   rX   )r…   r†   r‡   rˆ   r�   rº   Úemployee_actionsz
EMP-OPS-01u#   Cáº­p nháº­t tiáº¿n Ä‘á»™ rÃ  soÃ¡tÚawaiting_assignmentrB   )r   r,   r(   r%   rU   Úparticipating_employees)r   Úmodel_validater   r   r   Ú"build_minimal_review_start_requestzEWorkflowPersistenceServiceTestBase.build_minimal_review_start_requeste  s¸   € å)Ô8à )Ø#0Ø/9Ø.8ð )0Ø)0Ø(:Ø!GØ7>à8?Ø6BØ(.Ø(4Ø&/ð'ð 'ð 2>Ø.;Ø3:Ø*PØ*:Ø-:Ð<MÐ,Nðð ð	-ðð ðð8 *6Ø&3Ø+2Ø"GØ"7Ø%2Ð4EÐ$Fðð ð	,ð?)ð )ñ+
ô +
ð +	
r   Úfailure_stepr   r\   c               ó  —  G d„ dt           ¦  «        } ||¦  «        }t          |¬¦  «        }t          d¦  «        5 }t          d¦  «        5 }|                      ¦   «         |_        |                      ¦   «         |_        |                      t          d¦  «        5  |                     |  	                    ¦   «         ¦  «         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 ¦  «         n# 1 swxY w Y   |  
                    |j        d¦  «         |  
                    |j        t          ¦   «         ¦  «         |  
                    |j        g ¦  «         |  
                    |j        g ¦  «         |  
                    |j        g ¦  «         |  
                    |j        g ¦  «         |  
                    |j        g ¦  «         |  
                    |j        g ¦  «         |  
                    |j        g ¦  «         |                      d|j        ¦  «         |                      t1          d	„ |j        D ¦   «         ¦  «        ¦  «         |                      t1          d
„ |j        D ¦   «         ¦  «        ¦  «         d S )Nc                  ó°   ‡ — e Zd Zdˆ fd„Zdd„Z	 ddˆ fd„Z	 dd ˆ fd„Z	 dd!ˆ fd„Z	 dd!ˆ fd„Z	 dd!ˆ fd„Z		 dd ˆ fd„Z
d"ˆ fd„Zd"ˆ fd„Z	 d#d$ˆ fd„Zˆ xZS )%ú‰WorkflowPersistenceServiceTestBase.assert_failed_transaction_leaves_no_post_commit_side_effects.<locals>.RollbackAtStepFakePostgresClientÚtarget_stepr   r   r\   c                ód   •— t          ¦   «                              ¦   «          || _        g | _        d S rÓ   )Úsuperrq   rö   Úcall_sequence)r   rö   Ú	__class__s     €r   rq   z’WorkflowPersistenceServiceTestBase.assert_failed_transaction_leaves_no_post_commit_side_effects.<locals>.RollbackAtStepFakePostgresClient.__init__˜  s/   ø€ Ý‘”× Ò Ñ"Ô"Ð"Ø#.�Ô Ø02�Ô"Ð"Ð"r   ÚstepÚmessagec                ón   — | j                              |¦  «         | j        |k    rt          |¦  «        ‚d S rÓ   )rù   rx   rö   r   )r   rû   rü   s      r   Ú_maybe_failz•WorkflowPersistenceServiceTestBase.assert_failed_transaction_leaves_no_post_commit_side_effects.<locals>.RollbackAtStepFakePostgresClient._maybe_fail�  s=   € ØÔ"×)Ò)¨$Ñ/Ô/Ð/ØÔ# tÒ+Ð+Ý& wÑ/Ô/Ð/ð ,Ð+r   Nr}   r   r~   r   c                óv   •— |                       dd¦  «         t          ¦   «                              ||¬¦  «        S )NÚcreate_sessionzcreate-session-failed©r~   )rþ   rø   r^   )r   r}   r~   rú   s      €r   r^   z§WorkflowPersistenceServiceTestBase.assert_failed_transaction_leaves_no_post_commit_side_effects.<locals>.RollbackAtStepFakePostgresClient.create_dossier_review_session¢  sC   ø€ ð × Ò Ð!1Ð3JÑKÔKÐKÝ‘w”w×<Ò<Ø¨
ð =ñ ô ð r   r   c                óŠ   •— |                       d|d         › �d¦  «         t          ¦   «                              |||¬¦  «        S )Nzcreate_finding:r…   zcreate-finding-failedr  )rþ   rø   r_   ©r   r   r}   r~   rú   s       €r   r_   z§WorkflowPersistenceServiceTestBase.assert_failed_transaction_leaves_no_post_commit_side_effects.<locals>.RollbackAtStepFakePostgresClient.create_dossier_review_findingª  sZ   ø€ ð × Ò Ø? g¨nÔ&=Ð?Ð?ÐAXñô ð õ ‘w”w×<Ò<Ø˜w°:ð =ñ ô ð r   r„   c                ó€   •— |                       d|› �d¦  «         t          ¦   «                              ||||¬¦  «        S )Nzassign_finding:zassign-finding-failedr  )rþ   rø   r`   ©r   r   r„   r}   r~   rú   s        €r   r`   z§WorkflowPersistenceServiceTestBase.assert_failed_transaction_leaves_no_post_commit_side_effects.<locals>.RollbackAtStepFakePostgresClient.assign_dossier_review_finding·  óW   ø€ ð × Ò Ø2 jÐ2Ð2Ð4Kñô ð õ ‘w”w×<Ò<Ø˜z¨7¸zð =ñ ô ð r   c                ó€   •— |                       d|› �d¦  «         t          ¦   «                              ||||¬¦  «        S )Nzsubmit_finding:zsubmit-finding-failedr  )rþ   rø   ra   r  s        €r   ra   zªWorkflowPersistenceServiceTestBase.assert_failed_transaction_leaves_no_post_commit_side_effects.<locals>.RollbackAtStepFakePostgresClient.submit_dossier_review_supplementÅ  sX   ø€ ð × Ò Ø2 jÐ2Ð2Ð4Kñô ð õ ‘w”w×?Ò?Ø˜z¨7¸zð @ñ ô ð r   c                ó€   •— |                       d|› �d¦  «         t          ¦   «                              ||||¬¦  «        S )Nzverify_finding:zverify-finding-failedr  )rþ   rø   rb   r  s        €r   rb   z§WorkflowPersistenceServiceTestBase.assert_failed_transaction_leaves_no_post_commit_side_effects.<locals>.RollbackAtStepFakePostgresClient.verify_dossier_review_findingÓ  r  r   c                óx   •— |                       dd¦  «         t          ¦   «                              |||¬¦  «        S )NÚclose_sessionzclose-session-failedr  )rþ   rø   rc   r  s       €r   rc   z¦WorkflowPersistenceServiceTestBase.assert_failed_transaction_leaves_no_post_commit_side_effects.<locals>.RollbackAtStepFakePostgresClient.close_dossier_review_sessioná  sD   ø€ ð × Ò  Ð2HÑIÔIÐIÝ‘w”w×;Ò;Ø˜w°:ð <ñ ô ð r   c                óŒ   •— | j                              d|d         › �¦  «         t          ¦   «                              |¦  «        S )Núupsert_work_log_session:rê   )rù   rx   rø   rÊ   ©r   r}   rú   s     €r   rÊ   zªWorkflowPersistenceServiceTestBase.assert_failed_transaction_leaves_no_post_commit_side_effects.<locals>.RollbackAtStepFakePostgresClient.upsert_employee_work_log_sessionì  sJ   ø€ ð Ô"×)Ò)ØI¨w°Ô/GÐIÐIñô ð õ ‘w”w×?Ò?ÀÑHÔHÐHr   c                óŒ   •— | j                              d|d         › �¦  «         t          ¦   «                              |¦  «        S )Núappend_work_log_action:rÈ   )rù   rx   rø   rÌ   r  s     €r   rÌ   z©WorkflowPersistenceServiceTestBase.assert_failed_transaction_leaves_no_post_commit_side_effects.<locals>.RollbackAtStepFakePostgresClient.append_employee_work_log_actionô  sK   ø€ ð Ô"×)Ò)ØN¨gÐ6KÔ.LÐNÐNñô ð õ ‘w”w×>Ò>¸wÑGÔGÐGr   rÍ   r   rÎ   c                ó|   •— | j                              d¦  «         t          ¦   «                              ||¦  «        S )NÚfetch_review_session)rù   rx   rø   rÒ   )r   r   r   rú   s      €r   rÒ   z§WorkflowPersistenceServiceTestBase.assert_failed_transaction_leaves_no_post_commit_side_effects.<locals>.RollbackAtStepFakePostgresClient.fetch_dossier_review_sessionsü  s7   ø€ ð Ô"×)Ò)Ð*@ÑAÔAÐAÝ‘w”w×<Ò<¸YÈÑUÔUÐUr   )rö   r   r   r\   )rû   r   rü   r   r   r\   rÓ   rÔ   rÕ   rÖ   r×   rØ   rÙ   )r   r   r   rq   rþ   r^   r_   r`   ra   rb   rc   rÊ   rÌ   rÒ   Ú__classcell__)rú   s   @r   Ú RollbackAtStepFakePostgresClientrõ   —  sÀ  ø€ € € € € ð3ð 3ð 3ð 3ð 3ð 3ð
0ð 0ð 0ð 0ð IMðð ð ð ð ð ð ð *.ð	ð ð ð ð ð ð ð$ *.ðð ð ð ð ð ð ð& *.ðð ð ð ð ð ð ð& *.ðð ð ð ð ð ð ð$ *.ð		ð 	ð 	ð 	ð 	ð 	ð 	ðIð Ið Ið Ið Ið IðHð Hð Hð Hð Hð Hð PTðVð Vð Vð Vð Vð Vð Vð Vð Vð Vð Vr   r  )Úpostgres_clientzEapp.modules.core.application.workflow_persistence_service.get_personaz@app.modules.core.application.workflow_policy_service.get_personaz-failedrw   r  c              3  ó@   K  — | ]}|                      d ¦  «        V — ŒdS )r  N©Ú
startswithrž   s     r   r¡   zrWorkflowPersistenceServiceTestBase.assert_failed_transaction_leaves_no_post_commit_side_effects.<locals>.<genexpr>  sC   è è € ð ð àð —’Ð :Ñ;Ô;ðð ð ð ð ð r   c              3  ó@   K  — | ]}|                      d ¦  «        V — ŒdS )r  Nr  rž   s     r   r¡   zrWorkflowPersistenceServiceTestBase.assert_failed_transaction_leaves_no_post_commit_side_effects.<locals>.<genexpr>"  sC   è è € ð ð àð —’Ð 9Ñ:Ô:ðð ð ð ð ð r   )r[   r   r   râ   Úreturn_valuerå   ÚassertRaisesRegexr   Ústart_review_runrñ   ÚassertEqualrm   rd   rY   rf   rg   rh   ri   rj   rk   rl   ÚassertNotInrù   ÚassertFalseÚany)r   rò   r  Úfake_postgresÚserviceÚmock_get_personaÚmock_policy_get_personas          r   Ú<assert_failed_transaction_leaves_no_post_commit_side_effectsz_WorkflowPersistenceServiceTestBase.assert_failed_transaction_leaves_no_post_commit_side_effects”  s®  € ði	Vð i	Vð i	Vð i	Vð i	VÕ/Añ i	Vô i	Vð i	VðV 9Ð8¸ÑFÔFˆÝ,¸]ÐKÑKÔKˆåØWñô ð	Tð "ÝØRñô ð		Tð )à,0×,EÒ,EÑ,GÔ,GÐÔ)Ø37×3SÒ3SÑ3UÔ3UÐ#Ô0Ø×'Ò'­°iÑ@Ô@ð Tð TØ×(Ò(¨×)PÒ)PÑ)RÔ)RÑSÔSÐSðTð Tð Tñ Tô Tð Tð Tð Tð Tð Tð Tøøøð Tð Tð Tð Tð	Tð 	Tð 	Tñ 	Tô 	Tð 	Tð 	Tð 	Tð 	Tð 	Tð 	Tøøøð 	Tð 	Tð 	Tð 	Tð 	Tð 	Tð 	Tñ 	Tô 	Tð 	Tð 	Tð 	Tð 	Tð 	Tð 	Tøøøð 	Tð 	Tð 	Tð 	Tð 	×Ò˜Ô8¸!Ñ<Ô<Ð<Ø×Ò˜Ô.Õ0CÑ0EÔ0EÑFÔFÐFØ×Ò˜Ô@À"ÑEÔEÐEØ×Ò˜ÔCÀRÑHÔHÐHØ×Ò˜ÔEÀrÑJÔJÐJØ×Ò˜ÔAÀ2ÑFÔFÐFØ×Ò˜Ô=¸rÑBÔBÐBØ×Ò˜Ô8¸"Ñ=Ô=Ð=Ø×Ò˜Ô7¸Ñ<Ô<Ð<Ø×ÒÐ/°Ô1LÑMÔMÐMØ×ÒÝð ð à)Ô7ðñ ô ñ ô ñ	
ô 	
ð 	
ð 	×ÒÝð ð à)Ô7ðñ ô ñ ô ñ	
ô 	
ð 	
ð 	
ð 	
sZ   ¾C>ÁAC'Â(CÃC'ÃCÃC'ÃCÃC'ÃC>Ã'C+	Ã+C>Ã.C+	Ã/C>Ã>DÄDNr   )r   r   )rò   r   r   r\   )r   r   r   Ústaticmethodrâ   rå   rñ   r$  r   r   r   rÛ   rÛ   S  s�   € € € € € Øð
ð 
ð 
ñ „\ð
ð ð
ð 
ð 
ñ „\ð
ð ð,
ð ,
ð ,
ñ „\ð,
ð\R
ð R
ð R
ð R
ð R
ð R
r   rÛ   Ú	test_caseúunittest.TestCaseÚvaluer\   c                óV   — |                       t          j        d|¦  «        ¦  «         d S )Nz ^RVW-PRJ-001-LEGAL_AGENT-\d{14}$)Ú
assertTrueÚreÚmatch)r&  r(  s     r   Úassert_review_code_patternr-  )  s)   € Ø×Ò�œÐ"EÀuÑMÔMÑNÔNÐNÐNÐNr   )r   r   r   r   r   r   )r&  r'  r(  r   r   r\   )Ú
__future__r   ÚbuiltinsÚ@py_builtinsÚ_pytest.assertion.rewriteÚ	assertionÚrewriteÚ
@pytest_arr+  ÚunittestÚcopyr   Útypingr   Úunittest.mockr   Úapp.models.schemasr   Ú9app.modules.core.application.workflow_persistence_servicer   r
   rY   r[   ÚTestCaserÛ   r-  r   r   r   ú<module>r<     sw  ðØ "Ð "Ð "Ð "Ð "Ð "à  € € € € € € € € € € € € €	€	€	€	Ø €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à 9Ð 9Ð 9Ð 9Ð 9Ð 9Ø `Ð `Ð `Ð `Ð `Ð `ð<ð <ð <ð <ð <ñ <ô <ð <ð #Ð7Uð8ð 8ð 8ð 8ð 8ð 8ðvCð Cð Cð Cð Cñ Cô Cð CðLS
ð S
ð S
ð S
ð S
¨Ô):ñ S
ô S
ð S
ðlOð Oð Oð Oð Oð Or   