§
    ¸¢›j0(  ã                  ó`   — d dl mZ d dlZd dlmZ  ej        e¦  «        Z G d„ d¦  «        ZdS )é    )ÚannotationsN)ÚAnyc                  ó:   — e Zd Z	 ddd„Z	 ddd„Z	 	 	 	 	 ddd„ZdS )ÚErpDocumentAuditMixinNÚ
project_idú
str | NoneÚreturnúdict[str, Any]c                ó
  — g }d}|r|dz  }|                      |¦  «         |                      ¦   «         5 }|                     ¦   «         5 }|                     ||¦  «         |                     ¦   «         pi }|                     d¦  «        pd}|                     d¦  «        pd}|                     d¦  «        pd}	|                     d¦  «        pd}
|                     d¦  «        pd}t          |                     d	¦  «        p|dk    rd
n|d
z  |z  ¦  «        }g }|dk    r|                      d|› d�¦  «         |	dk    r|                      d|	› d�¦  «         |
dk    r|                      d|
› d�¦  «         |dk    r|                      d¦  «         |||	|
||                     d¦  «        pd||dk    rdn	|dk    rdnd|dœ	cddd¦  «         cddd¦  «         S # 1 swxY w Y   	 ddd¦  «         dS # 1 swxY w Y   dS )uo   Tá»•ng há»£p vÃ  cháº¥m Ä‘iá»ƒm má»©c Ä‘á»™ sáºµn sÃ ng kiá»ƒm toÃ¡n/quyáº¿t toÃ¡n cá»§a há»“ sÆ¡ cÃ´ng trÃ¬nh.a  
            SELECT 
                COUNT(*) as total_active_documents,
                COUNT(*) FILTER (WHERE signature_status = 'fully_executed') as fully_executed_count,
                COUNT(*) FILTER (WHERE signature_status = 'signed_unsigned_seal') as missing_seal_count,
                COUNT(*) FILTER (WHERE signature_status = 'draft') as draft_count,
                COUNT(*) FILTER (WHERE signature_status = 'rejected_returned') as rejected_count,
                COUNT(*) FILTER (WHERE quarantine_status = 'quarantined') as quarantined_count,
                COUNT(*) FILTER (WHERE project_stage = 'stage_06_closeout') as closeout_count,
                AVG(audit_readiness_score) as avg_score
            FROM erp_documents
            WHERE is_active_version = TRUE
        z AND project_id = %sÚtotal_active_documentsr   Úfully_executed_countÚmissing_seal_countÚdraft_countÚquarantined_countÚ	avg_scoreéd   u   CÃ³ uB    vÄƒn báº£n Ä‘ang bá»‹ cÃ¡ch ly cáº§n tháº©m duyá»‡t giáº£i tá»�a.um    vÄƒn báº£n Ä‘Ã£ kÃ½ nhÆ°ng chÆ°a Ä‘Ã³ng dáº¥u Ä‘á»� (Cáº§n bá»• sung dáº¥u trÆ°á»›c khi ná»™p kiá»ƒm toÃ¡n).u?    vÄƒn báº£n cÃ²n á»Ÿ dáº¡ng Dá»± tháº£o / ChÆ°a trÃ¬nh duyá»‡t.u2   ChÆ°a cÃ³ vÄƒn báº£n nÃ o trong há»“ sÆ¡ dá»± Ã¡n.Úrejected_countéZ   ÚREADYé<   ÚNEEDS_REVIEWÚCRITICAL)	Útotal_documentsr   r   r   r   r   Úaudit_readiness_scoreÚreadiness_statusÚaudit_warning_notesN)ÚappendÚget_connectionÚcursorÚexecuteÚfetchoneÚgetÚint)Úselfr   ÚparamsÚsqlÚconnÚcurÚrowÚtotalÚfullyÚmissing_sealÚdraftsÚquarantinedÚscoreÚnotess                 úEC:\Projects\DSCons\app\core\postgres\clients\document_audit_client.pyÚget_audit_readiness_reportz0ErpDocumentAuditMixin.get_audit_readiness_report
   s!  € ð ˆðˆð ð 	&ØÐ)Ñ)ˆCØ�MŠM˜*Ñ%Ô%Ð%à× Ò Ñ"Ô"ð -	 dØ—’‘”ð , #Ø—’˜C Ñ(Ô(Ð(Ø—l’l‘n”nÐ*¨�àŸšÐ 8Ñ9Ô9Ð>¸Q�ØŸšÐ 6Ñ7Ô7Ð<¸1�Ø"ŸwšwÐ';Ñ<Ô<ÐAÀ�ØŸš Ñ/Ô/Ð4°1�Ø!ŸgšgÐ&9Ñ:Ô:Ð?¸a�õ Ø—G’G˜KÑ(Ô(ð FØ$¨šz˜z˜˜°¸±¸eÑ0Cñô �ð
 �Ø ’?�?Ø—L’LØn˜{ÐnÐnÐnñô ð ð   !Ò#Ð#Ø—L’Lð [˜|ð  [ð  [ð  [ñô ð ð ˜A’:�:Ø—L’LØf˜vÐfÐfÐfñô ð ð ˜A’:�:Ø—L’LÐ!UÑVÔVÐVð (-Ø,1Ø*6Ø#)Ø)4Ø&)§g¢gÐ.>Ñ&?Ô&?Ð&DÀ1Ø-2à ’{�{ð )0¨à,1°RªK¨K˜.˜.¸ZØ+0ðð ðA,ð ,ð ,ð ,ñ ,ô ,ð ,ð-	ð -	ð -	ð -	ñ -	ô -	ð -	ð -	ð,ð ,ð ,ð ,øøøð ,ð ,ð ,ð ,ð ,ð-	ð -	ð -	ñ -	ô -	ð -	ð -	ð -	ð -	ð -	ð -	ð -	øøøð -	ð -	ð -	ð -	ð -	ð -	s6   µG8Á
E<GÇG8ÇG#	Ç#G8Ç&G#	Ç'G8Ç8G<Ç?G<FÚdoc_idÚstrÚdelete_all_versionsÚboolc                óÜ  — |                       |¦  «        }|st          d|› d�¦  «        ‚|                     d¦  «        p|d         }d}g }|                      ¦   «         5 }|                     ¦   «         5 }|r|                     d||f¦  «         |                     ¦   «         D ]2}	|	                     d¦  «        r|                     |	d         ¦  «         Œ3|                     d||f¦  «         |j        }n¯|                     d¦  «        r|                     |d         ¦  «         |                     d	|f¦  «         |j        }|                     d
¦  «        rL|                     d|||f¦  «         | 	                    ¦   «         }
|
r|                     d|
d         f¦  «         | 
                    ¦   «          ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   |D ]÷}	 ddlm}  ||¦  «        }|                     ¦   «         r¿d|                     dd¦  «        v r§|                      ¦   «         5 }|                     ¦   «         5 }|                     d|f¦  «         | 	                    ¦   «         }|r"|d         dk    r|                     d¬¦  «         ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   Œè# t           $ r Y Œôw xY wdd|› d�|||dœS )uŠ  XÃ³a vÄƒn báº£n sai hoáº·c trÃ¹ng láº·p khá»�i há»‡ thá»‘ng.

        Args:
            doc_id: ID cá»§a vÄƒn báº£n cáº§n xÃ³a
            delete_all_versions: Náº¿u True, xÃ³a toÃ n bá»™ chÃ¹m phiÃªn báº£n (Root + Sub-versions).
                               Náº¿u False, chá»‰ xÃ³a phiÃªn báº£n hiá»‡n táº¡i vÃ  tá»± Ä‘á»™ng chuyá»ƒn active cho phiÃªn báº£n há»£p lá»‡ gáº§n nháº¥t.
        u%   KhÃ´ng tÃ¬m tháº¥y vÄƒn báº£n cÃ³ ID u    Ä‘á»ƒ xÃ³a.Úroot_document_idÚidr   zKSELECT file_path FROM erp_documents WHERE root_document_id = %s OR id = %s;Ú	file_pathzADELETE FROM erp_documents WHERE root_document_id = %s OR id = %s;z(DELETE FROM erp_documents WHERE id = %s;Úis_active_versiona  
                            SELECT id FROM erp_documents
                            WHERE (root_document_id = %s OR id = %s) AND id != %s
                            ORDER BY version_index DESC, created_at DESC
                            LIMIT 1;
                        zTUPDATE erp_documents SET is_active_version = TRUE, updated_at = NOW() WHERE id = %s;N)ÚPathzstorage/secure_vaultú\ú/z8SELECT count(*) FROM erp_documents WHERE file_path = %s;ÚcountT)Ú
missing_oku   Ä�Ã£ xÃ³a thÃ nh cÃ´ng u    báº£n ghi vÄƒn báº£n.)ÚsuccessÚmessageÚ
deleted_idÚdeleted_countr5   )Úget_documentÚ
ValueErrorr"   r   r   r    Úfetchallr   Úrowcountr!   ÚcommitÚpathlibr<   ÚexistsÚreplaceÚunlinkÚ	Exception)r$   r3   r5   ÚdocÚroot_idrD   Úfile_paths_to_cleanr'   r(   ÚrÚ	remainingÚfpathr<   ÚpÚusages                  r1   Údelete_documentz%ErpDocumentAuditMixin.delete_documentO   s_  € ð ×Ò Ñ'Ô'ˆØð 	[ÝÐYÀVÐYÐYÐYÑZÔZÐZà—'’'Ð,Ñ-Ô-Ð:°°T´ˆØˆØ)+Ðà× Ò Ñ"Ô"ð *	 dØ—’‘”ð ) #Ø&ð &à—K’KØeØ  'Ð*ñô ð ð !Ÿ\š\™^œ^ð Gð G˜ØŸ5š5 Ñ-Ô-ð GØ/×6Ò6°q¸´~ÑFÔFÐFøà—K’KØ[Ø  'Ð*ñô ð ð %(¤L�M�Mà—w’w˜{Ñ+Ô+ð EØ+×2Ò2°3°{Ô3CÑDÔDÐDà—K’KÐ JÈVÈIÑVÔVÐVØ$'¤L�Mð —w’wÐ2Ñ3Ô3ð ØŸšðð % g¨vÐ6ñô ð ð %(§L¢L¡N¤N˜	Ø$ð ØŸKšKØ vØ!*¨4¤Ð 2ñô ð ð
 —’‘”�ðS)ð )ð )ñ )ô )ð )ð )ð )ð )ð )ð )øøøð )ð )ð )ð )ð*	ð *	ð *	ñ *	ô *	ð *	ð *	ð *	ð *	ð *	ð *	øøøð *	ð *	ð *	ð *	ðZ )ð 	ð 	ˆEðØ(Ð(Ð(Ð(Ð(Ð(à�D˜‘K”K�Ø—8’8‘:”:ð 	:Ð"8¸E¿MºMÈ$ÐPSÑ<TÔ<TÐ"TÐ"TØ×,Ò,Ñ.Ô.ð :°$Ø!Ÿ[š[™]œ]ð :¨cØŸKšKØ ZØ!& ñô ð ð %(§L¢L¡N¤N˜EØ$ð :¨¨w¬¸1Ò)<Ð)<Ø !§¢°D Ñ 9Ô 9Ð 9ð:ð :ð :ñ :ô :ð :ð :ð :ð :ð :ð :øøøð :ð :ð :ð :ð:ð :ð :ñ :ô :ð :ð :ð :ð :ð :ð :øøøð :ð :ð :ð :øøõ ð ð ð Ø�ðøøøð ØV°ÐVÐVÐVØ Ø*Ø#6ð
ð 
ð 	
s“   Á GÁ5EGÆ:GÇG
	Ç
GÇG
	ÇGÇG!Ç$G!Ç-AKÈ>KÉAJ/Ê#KÊ/J3Ê3KÊ6J3Ê7KÊ:KËK
	Ë
KËK
	ËKË
KËKÚ	file_hashÚfilenameÚfile_size_bytesú
int | NoneÚdocument_codeúdict[str, Any] | Nonec                ó¶  — |                       ¦   «          g }g }|r*|                     d¦  «         |                     |¦  «         |rT|                     d¦  «        s?|                     d¦  «        s*|                     d¦  «         |                     |¦  «         |r4|r2|dk    r,|                     d¦  «         |                     ||g¦  «         |sdS dd	                     |¦  «        › d
�}|                      ¦   «         5 }	|	                     ¦   «         5 }
|
                     ||¦  «         |
                     ¦   «         }|rf|r| 	                    d¦  «        |k    rdn)|r| 	                    d¦  «        |k    rd|› d�nd|› d|› d�}||d<   |cddd¦  «         cddd¦  «         S 	 ddd¦  «         n# 1 swxY w Y   ddd¦  «         n# 1 swxY w Y   dS )ux   Kiá»ƒm tra vÃ  phÃ¡t hiá»‡n vÄƒn báº£n trÃ¹ng láº·p theo mÃ£ bÄƒm SHA-256, sá»‘ hiá»‡u hoáº·c tÃªn file & dung lÆ°á»£ng.zd.file_hash = %szTEMP-ÚAUTOzd.document_code = %sr   z2(d.document_title = %s AND d.file_size_bytes = %s)Nz”
            SELECT d.*, p.project_name
            FROM erp_documents d
            LEFT JOIN projects p ON d.project_id = p.id
            WHERE (z OR z`)
            ORDER BY d.is_active_version DESC, d.created_at DESC
            LIMIT 1;
        rX   u+   MÃ£ bÄƒm ná»™i dung file trÃ¹ng khá»›p 100%r\   u   Sá»‘ hiá»‡u vÄƒn báº£n 'u   ' Ä‘Ã£ tá»“n táº¡izFile 'u   ' cÃ³ cÃ¹ng dung lÆ°á»£ng (u#    bytes) Ä‘Ã£ cÃ³ trÃªn há»‡ thá»‘ngÚduplicate_reason)
Ú_ensure_document_columnsr   Ú
startswithÚextendÚjoinr   r   r    r!   r"   )r$   rX   rY   rZ   r\   r   Ú
conditionsr%   r&   r'   r(   r)   Ú
dup_reasons                r1   Úcheck_duplicate_documentz.ErpDocumentAuditMixin.check_duplicate_document¨   s  € ð 	×%Ò%Ñ'Ô'Ð'Øˆ
Øˆð ð 	%Ø×ÒÐ0Ñ1Ô1Ð1Ø�MŠM˜)Ñ$Ô$Ð$ð ð	)à!×,Ò,¨WÑ5Ô5ð	)ð "×,Ò,¨VÑ4Ô4ð	)ð
 ×ÒÐ4Ñ5Ô5Ð5Ø�MŠM˜-Ñ(Ô(Ð(ð ð 	7˜ð 	7¨O¸aÒ,?Ð,?Ø×ÒÐRÑSÔSÐSØ�MŠM˜8 _Ð5Ñ6Ô6Ð6àð 	Ø�4ðð —K’K 
Ñ+Ô+ð	ð ð ˆð × Ò Ñ"Ô"ð 	 dØ—’‘”ð  #Ø—’˜C Ñ(Ô(Ð(Ø—l’l‘n”n�Øð ð %ðØ),¯ª°Ñ)=Ô)=ÀÒ)JÐ)Jð FÐEð  -ðDà #§¢¨Ñ 8Ô 8¸MÒ IÐ Ið Y°}ÐXÐXÐXÐXð "D¨(ð  "Dð  "DÈð  "Dð  "Dð  "Dð ð /9�CÐ*Ñ+Øðð ð ð ñ ô ð ð	ð 	ð 	ð 	ñ 	ô 	ð 	ð 	ððð ð ñ ô ð ð ð ð ð ð øøøð ð ð ð ð	ð 	ð 	ñ 	ô 	ð 	ð 	ð 	ð 	ð 	ð 	øøøð 	ð 	ð 	ð 	ð" ˆts=   ÄGÄA:F7ÆGÆ+GÆ7F;	Æ;GÆ>F;	Æ?GÇGÇG)N)r   r   r	   r
   )F)r3   r4   r5   r6   r	   r
   )NNNNN)rX   r   rY   r   rZ   r[   r\   r   r   r   r	   r]   )Ú__name__Ú
__module__Ú__qualname__r2   rW   rg   © ó    r1   r   r   	   s„   € € € € € à'+ðCð Cð Cð Cð CðL 8=ðW
ð W
ð W
ð W
ð W
ðv !%Ø#Ø&*Ø$(Ø!%ð=ð =ð =ð =ð =ð =ð =rl   r   )	Ú
__future__r   ÚloggingÚtypingr   Ú	getLoggerrh   Úloggerr   rk   rl   r1   ú<module>rr      s€   ðØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ð Ð à	ˆÔ	˜8Ñ	$Ô	$€ð\ð \ð \ð \ð \ñ \ô \ð \ð \ð \rl   