§
    ÔŸ’jW  ã                  ó¦   — d dl mZ d dlZd dlmZ d dlmZmZmZm	Z	m
Z
 ddlmZ ddlmZ ddlmZ  ej        d	¦  «        Z G d
„ deee¦  «        ZdS )é    )ÚannotationsN)ÚPath)ÚDossierCoverageResponseÚRemediationBuildRequestÚRemediationBuildResponseÚRemediationGapsResponseÚRemediationListResponseé   )ÚServiceCoverageHelpersMixin)ÚServiceDelegatesMixin)ÚServiceHelpersMixinzdscons.remediation.planningc                  óL   — e Zd ZdZ	 	 ddd
„Z	 	 	 ddd„Zdd„Z	 dd d„Zd!d„ZdS )"ÚRemediationPlanningServiceuR   Dá»‹ch vá»¥ láº­p káº¿ hoáº¡ch kháº¯c phá»¥c vÃ  bÃ¹ Ä‘áº¯p há»“ sÆ¡ cÃ´ng trÃ¬nh.Nú)tmp/hd2026_project_coverage_manifest.jsonÚpostgres_clientúPostgresClient | NoneÚmanifest_pathú
str | PathÚreturnÚNonec                óX   — |pt          ¦   «         | _        t          |¦  «        | _        d S )N)ÚPostgresClientÚ_postgres_clientr   Ú_manifest_path)Úselfr   r   s      ú?C:\Projects\DSCons\app\services\remediation_planning\service.pyÚ__init__z#RemediationPlanningService.__init__   s-   € ð
 !0Ð Cµ>Ñ3CÔ3CˆÔÝ" =Ñ1Ô1ˆÔÐÐó    Úproject_codeú
str | NoneÚ	review_idÚfinding_coder	   c                ó4  — |                       |¬¦  «        \  }}}}|                      ¦   «         \  }}	}
g }|D ]ë}|r)t          |                     d¦  «        pd¦  «        |k    rŒ-|                      |                     d¦  «        ¦  «        D ]•}|r)t          |                     d¦  «        pd¦  «        |k    rŒ-|                      |||||	|
|                     t          |                     d¦  «        pd¦  «        ¦  «        ¬¦  «        }|�|                     |¦  «         Œ–Œì|}|s|st          |¦  «        rd	}n|st          |¦  «        s|pd
}t          |||p|	ot          |¦  «        |  
                    |t          |¦  «        r|
nd¦  «        ¬¦  «        S )u"   Tráº£ danh sÃ¡ch remediation plan.©r   r!   Ú Úfindingsr"   r   ©ÚsessionÚfindingÚsourceÚsource_used_fallbackÚcoverage_used_fallbackÚcoverage_messageÚcoverage_projectNu[   KhÃ´ng tÃ¬m tháº¥y open findings cÃ³ document_type phÃ¹ há»£p Ä‘á»ƒ láº­p remediation plan.uD   ChÆ°a cÃ³ dossier review sessions Ä‘á»ƒ suy diá»…n remediation plan.©Úitemsr*   Úused_fallbackÚmessage)Ú_load_sessionsÚ _load_coverage_index_with_statusÚstrÚgetÚ_ensure_listÚ_build_plan_from_findingÚappendÚanyr	   ÚboolÚ_merge_messages)r   r   r!   r"   Úsessionsr*   r1   r2   Úcoverage_indexr,   r-   r0   r(   r)   ÚplanÚresponse_messages                   r   Ú
list_plansz%RemediationPlanningService.list_plans$   s  € ð 48×3FÒ3FØ%ð 4Gñ 4
ô 4
Ñ0ˆ�&˜-¨ð ×1Ò1Ñ3Ô3ñ 	AˆÐ.Ð0@ð ˆØð 	'ð 	'ˆGØð �S §¢¨[Ñ!9Ô!9Ð!?¸RÑ@Ô@ÀIÒMÐMØØ×,Ò,¨W¯[ª[¸Ñ-DÔ-DÑEÔEð 'ð '�à ðå˜GŸKšK¨Ñ7Ô7Ð=¸2Ñ>Ô>À,ÒNÐNàØ×4Ò4Ø#Ø#Ø!Ø)6Ø+AØ%5Ø%3×%7Ò%7Ý˜GŸKšK¨Ñ7Ô7Ð=¸2Ñ>Ô>ñ&ô &ð 5ñ 
ô 
�ð Ð#Ø—L’L Ñ&Ô&Ð&øð%'ð& #ÐØð 	˜]ð 	­s°8©}¬}ð 	Ø|ÐÐØð 	�s 8™}œ}ð 	àð ZØYð õ 'ØØØ'ÐSÐ,BÐ,RÅtÈEÁ{Ä{Ø×(Ò(Ø µd¸5±k´kÐ"KÐ"2Ð"2Àtñô ð	
ñ 
ô 
ð 	
r   Úpayloadr   r   c                óÂ  — |                       |j        ¬¦  «        \  }}}}|                      ¦   «         \  }}}|D ]ú}	|j        r.t	          |	                     d¦  «        pd¦  «        |j        k    rŒ7|                      |	                     d¦  «        ¦  «        D ]š}
|                      |
|¬¦  «        sŒ|                      |	|
|||||                     t	          |	                     d¦  «        pd¦  «        ¦  «        ¬¦  «        }|€Œnt          |||p||  
                    ||¦  «        ¬	¦  «        c c S Œût          d||p||  
                    |pd
|¦  «        ¬	¦  «        S )u   Build má»™t plan cá»¥ thá»ƒ.r$   r!   r%   r&   )r)   rB   r   r'   N)Úitemr*   r1   r2   uC   KhÃ´ng tÃ¬m tháº¥y finding phÃ¹ há»£p Ä‘á»ƒ build remediation plan.)r3   r   r4   Úreview_session_idr5   r6   r7   Ú_matches_build_requestr8   r   r<   )r   rB   r=   r*   r1   r2   r>   r,   r-   r(   r)   r?   s               r   Ú
build_planz%RemediationPlanningService.build_planY   s×  € à37×3FÒ3FØ Ô-ð 4Gñ 4
ô 4
Ñ0ˆ�&˜-¨ð ×1Ò1Ñ3Ô3ñ 	AˆÐ.Ð0@ð  ð 	ð 	ˆGàÔ)ðå˜Ÿš KÑ0Ô0Ð6°BÑ7Ô7¸7Ô;TÒTÐTàØ×,Ò,¨W¯[ª[¸Ñ-DÔ-DÑEÔEð ð �Ø×2Ò2¸7ÈGÐ2ÑTÔTð ØØ×4Ò4Ø#Ø#Ø!Ø)6Ø+AØ%5Ø%3×%7Ò%7Ý˜GŸKšK¨Ñ7Ô7Ð=¸2Ñ>Ô>ñ&ô &ð 5ñ 
ô 
�ð �<ØÝ/ØØ!Ø"/Ð"IÐ3IØ ×0Ò0°Ð:JÑKÔKð	ñ ô ð ð ð ð ð ð!õ, (ØØØ'ÐAÐ+AØ×(Ò(ØÐ`Ð`Ø ñô ð	
ñ 
ô 
ð 	
r   r   c                óº   ‡ — ‰                       ||¬¦  «        }ˆ fd„|j        D ¦   «         }|j        }|s|j        s|pd}t	          ||j        |j        |¬¦  «        S )u   Liá»‡t kÃª gap chuáº©n hÃ³a.)r   r!   c                ó:   •— g | ]}‰                      |¦  «        ‘ŒS © )Ú_build_gap_item)Ú.0r?   r   s     €r   ú
<listcomp>z8RemediationPlanningService.list_gaps.<locals>.<listcomp>Œ   s'   ø€ ÐMÐMÐM°�×%Ò% dÑ+Ô+ÐMÐMÐMr   u'   KhÃ´ng cÃ³ remediation gaps Ä‘ang má»Ÿ.r/   )rA   r0   r2   r1   r   r*   )r   r   r!   Úplans_responser0   r2   s   `     r   Ú	list_gapsz$RemediationPlanningService.list_gaps‡   s†   ø€ ð Ÿš°lÈi˜ÑXÔXˆØMÐMÐMÐM¸Ô8LÐMÑMÔMˆØ Ô(ˆØð 	K˜^Ô9ð 	KØÐJÐ!JˆGÝ&ØØ!Ô(Ø(Ô6Øð	
ñ 
ô 
ð 	
r   r5   r   c           
     ó   ‡— 	 |                       ¦   «         }n1# t          $ r$}|                      ‰d|› �¬¦  «        cY d}~S d}~ww xY w|                      |                     d¦  «        ¦  «        }t          ˆfd„|D ¦   «         d¦  «        }|€|                      ‰d‰› d�¬¦  «        S t          t          |                     d¦  «        p‰¦  «        t          |                     d	¦  «        pd
¦  «        pdt          | j        ¦  «        t          |                     d¦  «        pd
¦  «        pd|  	                    |¦  «        ddd¬¦  «        S )u   Ä�á»�c coverage cá»§a project.u[   KhÃ´ng thá»ƒ náº¡p coverage manifest; tráº£ fallback coverage rá»—ng an toÃ n. Chi tiáº¿t: )r   r2   NÚprojectsc              3  óü   •K  — | ]v}t          |                     d ¦  «        pd¦  «                             ¦   «                              ¦   «         ‰                     ¦   «                              ¦   «         k    ¯r|V — ŒwdS )r   r%   N)r5   r6   ÚstripÚlower)rL   rD   r   s     €r   ú	<genexpr>zBRemediationPlanningService.get_project_coverage.<locals>.<genexpr>¢   s�   øè è € ð ð àÝ�t—x’x Ñ/Ô/Ð5°2Ñ6Ô6×<Ò<Ñ>Ô>×DÒDÑFÔFØ×%Ò%Ñ'Ô'×-Ò-Ñ/Ô/ò0ð 0ð ð0ð 0ð 0ð 0ðð r   u6   KhÃ´ng tÃ¬m tháº¥y coverage manifest cho project_code=u*   ; tráº£ fallback coverage rá»—ng an toÃ n.r   Úingest_batchr%   Úgenerated_atÚmanifestFuA   Coverage manifest Ä‘Æ°á»£c náº¡p tá»« káº¿t quáº£ ingest HD-2026.)r   rV   r   rW   Úprojectr*   r1   r2   )
Ú_load_coverage_manifestÚ
ValueErrorÚ)_build_fallback_project_coverage_responser7   r6   Únextr   r5   r   Ú_coverage_project_payload)r   r   rX   ÚexcÚproject_rowsÚmatcheds    `    r   Úget_project_coveragez/RemediationPlanningService.get_project_coverage—   s½  ø€ ð	Ø×3Ò3Ñ5Ô5ˆHˆHøÝð 	ð 	ð 	Ø×AÒAØ)Ø{ÐvyÐ{Ð{ð Bñ ô ð ð ð ð ð ð øøøøð	øøøð
 ×(Ò(¨¯ª°jÑ)AÔ)AÑBÔBˆÝðð ð ð à(ðñ ô ð ñ
ô 
ˆð ˆ?Ø×AÒAØ)ð JÐQ]ð  Jð  Jð  Jð Bñ ô ð õ 'Ý˜WŸ[š[¨Ñ8Ô8ÐH¸LÑIÔIÝ˜XŸ\š\¨.Ñ9Ô9Ð?¸RÑ@Ô@ÐHÀDÝ˜dÔ1Ñ2Ô2Ý˜XŸ\š\¨.Ñ9Ô9Ð?¸RÑ@Ô@ÐHÀDØ×2Ò2°7Ñ;Ô;ØØØWð	
ñ 	
ô 	
ð 		
s   ƒ ˜
A¢A»AÁA)Nr   )r   r   r   r   r   r   )NNN)r   r    r!   r    r"   r    r   r	   )rB   r   r   r   )NN)r   r    r!   r    r   r   )r   r5   r   r   )	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   rA   rG   rO   rb   rJ   r   r   r   r      s¬   € € € € € ð
 ]Ð\ð 26Ø$Oð2ð 2ð 2ð 2ð 2ð $(Ø $Ø#'ð	3
ð 3
ð 3
ð 3
ð 3
ðj,
ð ,
ð ,
ð ,
ð^ HLð
ð 
ð 
ð 
ð 
ð !
ð !
ð !
ð !
ð !
ð !
r   r   )Ú
__future__r   ÚloggingÚpathlibr   Úapp.models.schemasr   r   r   r   r	   Úservice_coverage_helpersr   Úservice_delegatesr   Úservice_helpersr   Ú	getLoggerÚloggerr   rJ   r   r   ú<module>rp      s	  ðØ "Ð "Ð "Ð "Ð "Ð "à €€€Ø Ð Ð Ð Ð Ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ð BÐ AÐ AÐ AÐ AÐ AØ 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0à	ˆÔ	Ð8Ñ	9Ô	9€ðc
ð c
ð c
ð c
ð c
ØØØñc
ô c
ð c
ð c
ð c
r   