§
    ÔŸ’jª  ã                  ód   — d 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l
mZ  G d„ d¦  «        Zd	S )
z@Generate dossier gap and readiness reports from stored metadata.é    )Úannotations)Údefaultdict)ÚAny)Úget_readiness_rulesÚget_stage_requirements)ÚQdrantStorec                  ó:   — e Zd ZdZdd„Zdd
„Zdd„Zdd„Zdd„ZdS )ÚDossierReportServicez7Build gap-analysis and readiness reports for a project.Úqdrant_storer   ÚreturnÚNonec                ó`   — || _         t          ¦   «         | _        t          ¦   «         | _        d S )N)Ú_qdrant_storer   Ú_stage_requirementsr   Ú_readiness_rules)Úselfr   s     ú9C:\Projects\DSCons\app\services\dossier_report_service.pyÚ__init__zDossierReportService.__init__   s,   € Ø)ˆÔÝ#9Ñ#;Ô#;ˆÔ Ý 3Ñ 5Ô 5ˆÔÐÐó    Úproject_codeÚstrúdict[str, Any]c                ó  — d}d}d}	 |                       |¦  «        }n## t          $ r}g }d}d}d|› d�}Y d}~nd}~ww xY wt          t          ¦  «        }t	          ¦   «         }i }	|D �]#}
t          |
                     d	i ¦  «        pi ¦  «        }t          |                     d
d¦  «        pd¦  «        }t          |                     dd¦  «        pd¦  «        }t          |                     dd¦  «        pd¦  «        }|r'|r%|||         vr||                              |¦  «         |r| 	                    |¦  «         |rJ||	vrF||||                     d¦  «        |                     d¦  «        |                     dd¦  «        dœ|	|<   �Œ%i }g }| j
                             ¦   «         D ]f\  }}g }|D ]W}|d         }||vrI|                     |¦  «         |                     d¦  «        r|                     |||d         dœ¦  «         ŒX|||<   Œg|                      |¦  «        }||||d„ t          |                     ¦   «         ¦  «        D ¦   «         |	d„ |                     ¦   «         D ¦   «         |||                      ||¦  «        dœ
S )zAReturn a combined gap and readiness report for the given project.ÚqdrantFuV   Dossier readiness report Ä‘Æ°á»£c tá»•ng há»£p tá»« metadata Ä‘Ã£ ingest trong Qdrant.ÚfallbackTu2   KhÃ´ng thá»ƒ táº£i dossier documents tá»« Qdrant: u"   ; tráº£ bÃ¡o cÃ¡o rá»—ng an toÃ n.NÚmetadataÚ	doc_stageÚ Údocument_typeÚsource_filenameÚ
doc_familyÚ	task_typeÚreadiness_weightç        )r   r    r   r!   r"   r#   ÚcriticalÚlabel)r   r   r&   c                ó4   — i | ]\  }}|t          |¦  «        “ŒS © )Úsorted)Ú.0ÚstageÚ	doc_typess      r   ú
<dictcomp>z=DossierReportService.build_project_report.<locals>.<dictcomp>\   s6   € ð "ð "ð "á$�E˜9ð •v˜iÑ(Ô(ð"ð "ð "r   c                ó.   — i | ]\  }}|d „ |D ¦   «         “ŒS )c                ó>   — g | ]}|d          |d         |d         dœ‘ŒS )r   r&   r%   )r   r&   r%   r(   )r*   Úitems     r   ú
<listcomp>zHDossierReportService.build_project_report.<locals>.<dictcomp>.<listcomp>b   sH   € ð ð ð ð ð	 *.¨oÔ)>Ø!% g¤Ø$(¨Ô$4ðð ðð ð r   r(   )r*   r+   Úitemss      r   r-   z=DossierReportService.build_project_report.<locals>.<dictcomp>a   sL   € ð 
"ð 
"ð 
"ñ !�E˜5ð ð ð ð !&ðñ ô ð
"ð 
"ð 
"r   )
r   ÚsourceÚused_fallbackÚmessageÚdocuments_presentÚdocument_indexÚdocuments_missingÚcritical_missingÚ	readinessÚsummary)Ú_load_project_documentsÚ	Exceptionr   ÚlistÚsetÚdictÚgetr   ÚappendÚaddr   r2   Ú_build_readinessr)   Ú_build_summary)r   r   r3   r4   r5   Ú	documentsÚexcÚpresent_by_stageÚpresent_doc_typesr7   r0   r   r   r   r    Úmissing_by_stager9   r+   ÚrequirementsÚstage_missingÚrequirementr:   s                         r   Úbuild_project_reportz)DossierReportService.build_project_report   sT  € àˆØˆàdð 	ð	sØ×4Ò4°\ÑBÔBˆIˆIøÝð 	sð 	sð 	sØˆIØˆFØ ˆMØrÈ3ÐrÐrÐrˆGˆGˆGˆGˆGˆGøøøøð		søøøõ 2=½TÑ1BÔ1BÐÝ&)¡e¤eÐØ46ˆàð 	ñ 	ˆDÝ˜DŸHšH Z°Ñ4Ô4Ð:¸Ñ;Ô;ˆHÝ˜HŸLšL¨°bÑ9Ô9Ð?¸RÑ@Ô@ˆIÝ §¢¨_¸bÑ AÔ AÐ GÀRÑHÔHˆMÝ! (§,¢,Ð/@À"Ñ"EÔ"EÐ"KÈÑLÔLˆOð ðBà!ðBð "Ð)9¸)Ô)DÐDÐDà  Ô+×2Ò2°=ÑAÔAÐAàð 5Ø!×%Ò% mÑ4Ô4Ð4àð  °nÐ!DÐ!Dà%2Ø'6Ø!*Ø"*§,¢,¨|Ñ"<Ô"<Ø!)§¢¨kÑ!:Ô!:Ø(0¯ªÐ5GÈÑ(MÔ(Mð1ð 1�˜}Ñ-ùð =?ÐØ13Ðà#'Ô#;×#AÒ#AÑ#CÔ#Cð 	4ð 	4ÑˆE�<Ø24ˆMØ+ð ð �Ø +¨OÔ <�Ø Ð(9Ð9Ð9Ø!×(Ò(¨Ñ5Ô5Ð5Ø"—’ zÑ2Ô2ð Ø(×/Ò/à-2Ø1>Ø)4°WÔ)=ðð ñô ð øð '4Ð˜UÑ#Ð#à×)Ò)Ð*;Ñ<Ô<ˆ	ð )ØØ*Øð"ð "å(.Ð/?×/EÒ/EÑ/GÔ/GÑ(HÔ(Hð"ñ "ô "ð -ð
"ð 
"ð %5×$:Ò$:Ñ$<Ô$<ð
"ñ 
"ô 
"ð !1Ø"Ø×*Ò*¨9Ð6FÑGÔGð/
ð 
ð 	
s   ˆ ž
>¨9¹>úlist[dict[str, Any]]c                ób  — | j                              dd|i¬¦  «        }g }t          ¦   «         }|D ]}}t          |                     di ¦  «        pi ¦  «        }t          |                     dd¦  «        pd¦  «        }|r||v rŒS|                     |¦  «         |                     |¦  «         Œ~|S )z0Load all matching project documents from Qdrant.iô  r   )ÚlimitÚfiltersr   r   r   )r   Úscrollr?   r@   rA   r   rC   rB   )r   r   ÚresultsÚ
normalizedÚseen_doc_typesr0   r   r   s           r   r<   z,DossierReportService._load_project_documentsq   sÏ   € àÔ$×+Ò+ØØ# \Ð2ð ,ñ 
ô 
ˆð ,.ˆ
Ý#&¡5¤5ˆàð 	$ð 	$ˆDÝ˜DŸHšH Z°Ñ4Ô4Ð:¸Ñ;Ô;ˆHÝ §¢¨_¸bÑ AÔ AÐ GÀRÑHÔHˆMØ ð  M°^Ð$CÐ$CØØ×Ò˜}Ñ-Ô-Ð-Ø×Ò˜dÑ#Ô#Ð#Ð#àÐr   rI   úset[str]údict[str, dict[str, Any]]c                ó(  ‡— i }| j                              ¦   «         D ]t\  }}ˆfd„|D ¦   «         }t          |¦  «        }|t          |¦  «        z
  }|rt          ||z  d¦  «        nd}|sd}	n|dk    rd}	nd}	|	|||t          |¦  «        |dœ||<   Œu|S )	z2Calculate readiness state for key business stages.c                ó   •— g | ]}|‰v¯|‘Œ	S r(   r(   )r*   Údoc_typerI   s     €r   r1   z9DossierReportService._build_readiness.<locals>.<listcomp>‹   s/   ø€ ð ð ð àØÐ#4Ð4Ð4ð à4Ð4Ð4r   é   r$   Úreadyr   ÚblockedÚpartial)ÚstatusÚscoreÚrequired_countÚavailable_countÚmissing_countÚblocking_items)r   r2   ÚlenÚround)
r   rI   Úoutputr+   Úrequired_doc_typesÚmissingÚtotalÚ	availablera   r`   s
    `        r   rD   z%DossierReportService._build_readiness„   së   ø€ ð -/ˆà)-Ô)>×)DÒ)DÑ)FÔ)Fð 	ð 	Ñ%ˆEÐ%ðð ð ð à 2ðñ ô ˆGõ
 Ð*Ñ+Ô+ˆEØ¥ G¡¤Ñ,ˆIØ38ÐA•E˜) eÑ+¨QÑ/Ô/Ð/¸cˆEàð #Ø ��Ø˜a’�Ø"��à"�ð !ØØ"'Ø#,Ý!$ W¡¤Ø")ðð ˆF�5‰MˆMð ˆr   r:   r9   c                ó  — |                      di ¦  «                              dd¦  «        |                      di ¦  «                              dd¦  «        |                      di ¦  «                              dd¦  «        t          |¦  «        dœS )z"Build a short operational summary.Úcontractingr`   ÚunknownÚpaymentÚfinalization)Úcontracting_statusÚpayment_statusÚfinalization_statusÚcritical_missing_count)rA   rf   )r   r:   r9   s      r   rE   z#DossierReportService._build_summary¦   s�   € ð #,§-¢-°¸rÑ"BÔ"B×"FÒ"FØ˜)ñ#ô #ð (Ÿmšm¨I°rÑ:Ô:×>Ò>¸xÈÑSÔSØ#,§=¢=°ÀÑ#DÔ#D×#HÒ#HØ˜)ñ$ô $õ '*Ð*:Ñ&;Ô&;ð	
ð 	
ð 		
r   N)r   r   r   r   )r   r   r   r   )r   r   r   rO   )rI   rW   r   rX   )r:   rX   r9   rO   r   r   )	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   rN   r<   rD   rE   r(   r   r   r
   r
      s„   € € € € € ØAÐAð6ð 6ð 6ð 6ð
[
ð [
ð [
ð [
ðzð ð ð ð& ð  ð  ð  ðD
ð 
ð 
ð 
ð 
ð 
r   r
   N)ry   Ú
__future__r   Úcollectionsr   Útypingr   Úapp.services.dossier_rulesr   r   Úapp.services.qdrant_storer   r
   r(   r   r   ú<module>r      s§   ðØ FÐ Fà "Ð "Ð "Ð "Ð "Ð "à #Ð #Ð #Ð #Ð #Ð #Ø Ð Ð Ð Ð Ð à RÐ RÐ RÐ RÐ RÐ RÐ RÐ RØ 1Ð 1Ð 1Ð 1Ð 1Ð 1ði
ð i
ð i
ð i
ð i
ñ i
ô i
ð i
ð i
ð i
r   