
    I{j\-                    (   S r SSKJr  SSKrSSKrSSKJr  SSKJr  SSK	J
r
  SSKJr  SSKJr  SS	KJr  SS
KJr  SSKJrJrJrJr  SSKJr  SSKJrJr  SSKJrJ r   SSK!J"r"J#r#J$r$  SSK%J&r&J'r'  \r(Sr)SSS jjr*SS jr+SS jr,          SS jr-g)uI   Agents document generation: Word/PDF template → file → folders table.    )annotationsN)Path)Any)Session)DocumentsClass)FolderClass)settings)AgentDocumentTemplateModel)FAMILIA_DOCUMENT_IDbuild_familia_pie360_contextis_familia_document'merge_pie360_fallback_into_replacements)agents_storage)fill_familia_templatevalidate_docx)link_folder_to_family_report persist_family_report_from_agent)!PSYCHOPED_CONTENT_CONTROL_ALIASESPSYCHOPED_DOCUMENT_ID normalize_psychoped_replacements)#link_folder_to_psychoped_evaluationpersist_psychoped_from_agent)u+   Haz clic o pulse aquí para escribir texto.z Click or tap here to enter text.c                N    [        U5      (       a  [        X5      $ [        X5      $ N)r   r   _basic_student_context)db
student_iddocument_ids      ]C:\Users\jesus\Desktop\proyecto_pie360\backend\app\backend\classes\agents_document_service.py_student_contextr    -   s#    ;''+B;;!"11    c                   SSK JnJnJn  U R	                  U5      R                  UR                  U:H  5      R                  5       nU R	                  U5      R                  UR                  U:H  5      R                  5       nU R	                  U5      R                  UR                  U:H  5      R                  UR                  R                  5       5      R                  5       nU(       a#  UR                  =(       d    SR                  5       OSnU(       a#  UR                  =(       d    SR                  5       OSn	U(       a#  UR                  =(       d    SR                  5       OSn
U SU	 SU
 3R                  5       nUUUU(       a#  UR                  =(       d    SR                  5       OSU(       a  [!        USS 5      OS U(       a  [!        USS 5      OS U(       a  [!        USS 5      S.$ S S.$ )	Nr   )StudentAcademicInfoModelStudentModelStudentPersonalInfoModel  	school_id	course_idperiod_year)r   student_namestudent_fullnameidentification_numberr(   r)   r*   )app.backend.db.models.pie_corer#   r$   r%   queryfilteridfirstr   order_bydescnamesstripfather_lastnamemother_lastnamer-   getattr)r   r   r#   r$   r%   studentpersonalacademicr5   fathermother	full_names               r   r   r   3   s     hh|$++LOOz,IJPPRG
)*	(33zA	B	  	)*	(33zA	B	*--224	5		  /7X^^!r((*BE9Ah&&,"335rF9Ah&&,"335rF'6(!F8,224I %S[("@"@"FB!M!M!Oac<CWWk48=EWX{D94@Gwwt<  NR r!   c                   U R                   =(       d    SR                  SS5      R                  S5      nU R                  =(       d    SR	                  5       nUS;  a  Sn[        U R                  5      n[        R                  " 5       /n [        [        R                  5      nUR                  5       [        R                  " 5       :w  a  UR                  U5        / nU H  nU(       a  UR                  Xq-  5        UR                  S5       Vs/ s H  o(       d  M  UPM     n	n[        U	5      S:  d  MW  XyS   -  U	S   -  U	S	   -  n
UR                  U
S
-  [!        U5      -  SU 3-  5        M     [        R                  " 5       S-  nUR#                  5       (       a  UR%                  5        H  nUR#                  5       (       d  M  UR%                  5        HY  nUR#                  5       (       d  M  US
-  [!        U5      -  SU 3-  nUR'                  5       (       d  MH  UR                  U5        M[     M     [)        5       nU H]  n [!        U5      R	                  5       nUU;   a  M%  UR+                  U5        UR'                  5       (       a  UR                  5       s  $ M_     g! [         a     GNf = fs  snf ! [         a     M  f = f)uR   Resuelve la plantilla en disco; prueba rutas alternativas si la registrada falló.r&   \/docx>   pdfrC      r         
documentoszformato.agentsN)template_pathreplacelstripformat_typelowerintr   storage	files_dirr   r	   resolveappend	Exceptionsplitlenstris_diriterdiris_filesetadd)templaterelextdoc_idrootsalt
candidatesrootpparts
agent_rootagents_rootcustomer_dir	agent_dirhitseencandkeys                     r   _resolve_template_absolutero   U   sn   !!'R
0
0s
;
B
B3
GC)6
0
0
2C
/!%%&F !E8%%&;;=G--//LL  Jdj)IIcN0NqaN0u:?a583eAh>Jj<7#f+E(SVRWHXXY  ##%0K'//1L&&(()113	 '')),.V<#?OO;;==%%c* 4 2 UD	d)//#Cd{HHSM||~~||~%   I   16  		s7   AJ+ 
J<J<K.5K+
J98J9
KKc                   [         R                  " 5       UR                  =(       d    SR                  SS5      R	                  S5      -  n[        U5      nUc$  SSUR                   SUR                   SU S3S	S
.$  [        UR                  [         R                  " 5       5      5      R                  SS5      nU(       aO  XaR                  =(       d    SR                  SS5      :w  a'  Xal        U R                  U5        U R                  5         [        X[        UR                  5      5      n[        [        UR                  5      5      (       a  [!        X75      nO([        UR                  5      ["        :X  a  [%        X75      n['        [(        R                  5      S-  S-  nUR+                  SSS9  UR-                  S5      =(       d    SR                  SS5      n	UR.                  R1                  5       n
SUR                   SU S[2        R4                  " 5       R6                  S S  SU
 3nX-  nU
S:X  a  [        UR                  5      [8        :X  a  [;        UUUUS9nO[<        R>                  " X\5        [A        [B        5      SS.n[        UR                  5      ["        :X  a	  [D        US'   [F        RH                  " [        U5      U[        U5      40 UD6nUR-                  S5      S:w  a  [K        U5      (       d  SSS.nUR-                  S5      S:X  a  U$ OU
S:X  a  0 nURM                  5        H:  u  nnUb  [        U5      OSnUUSU S3'   UUS U S!3'   UUS"U S#3'   UUS$U S%3'   M<     [F        RN                  " [        U5      U[        UR                  5      U[        U5      5      nUR-                  S5      S:X  a  U$ UR-                  S&5      =(       d    UnOSS'U
 3S.$ [Q        U 5      RS                  U[        UR                  5      UUR-                  S(5      UR-                  S)5      UR-                  S*5      S+9n[U        U[V        5      (       a  UR-                  S5      S:X  a  U$ S nS n[        UR                  5      [8        :X  ah  [Y        U UUUS9nUR-                  S5      S:X  a  SS,UR-                  S-S.5       3US/.$ UR-                  S05      n[[        U UR-                  S05      U5        O[        UR                  5      ["        :X  ag  []        U UUUS9nUR-                  S5      S:X  a  SS1UR-                  S-S.5       3US/.$ UR-                  S05      n[_        U UR-                  S05      U5        [U        U[V        5      (       a  UR-                  S05      OS nU(       a  S2U 3OS nS3S4UUUUR                  UR                  UR.                  UUU[a        U=(       d    U5      S5.$ ! [         a     GNf = f)6Nr&   rA   rB   erroru-   No se encontró la plantilla en el servidor (z, document_id=z). Ruta esperada: u   . Ve a Agente → Documentos, selecciona ese documento y vuelve a subir el modelo (.docx o .pdf). Si ya la subiste, abre un chat nuevo e inténtalo otra vez.i  )statusmessagehttp_statussystemstudentsT)parentsexist_okr,   
estudianter'   _agentv2_   .rC   )student_context)remove_literal_stringspreserve_empty_content_controlscontent_control_tag_aliasesrr   z7The generated Word file is corrupt. Check the template.)rr   rs   rD   {}[]z<<z>>z{{z}}filenamezUnsupported format: r(   r)   r*   )r   r   	file_pathr(   r)   r*   zSThe Word file was generated but the form could not be saved to the student record: rs   zunknown error)rr   rs   r   r1   zeThe Word file was generated but the psychopedagogical form could not be saved to the student record: z/files/system/students/successzDocument generated and saved.)rr   rs   r   downloadUrlfolderId
documentIddocumentName
formatType	studentIdfamilyReportIdpsychopedEvaluationId
formFilled)1rP   rQ   rJ   rK   rL   ro   document_namer   rW   relative_tor\   commitrT   r    rO   r   r   r   r   r   r	   mkdirgetrM   rN   uuiduuid4hex_FAMILIA_DOCUMENT_IDr   shutilcopy2list_WORD_PLACEHOLDERSr   r   fill_docx_formr   items_generate_pdf_from_templater   store
isinstancedictr   r   r   r   bool)r   r]   r   replacementsexpectedtemplate_absrel_okstudent_ctx
output_dirsafe_studentr_   r   output_pathresultfill_kwargstag_maprn   valuevalfolder_resultfamily_report_idpsychoped_evaluation_id	fr_result	pe_result	folder_iddownload_urls                             r   generate_and_save_documentr      s    !!#x'='='C&L&LTSV&W&^&^_b&ccH-h7L**+>(:N:N9O P""* ,hh 

 
	
\--g.?.?.ABCKKDRUVf!7!7!=2 F FtS QQ%+"FF8IIK #23x7K7K3LMK3x33455>|Y	X!!	"&;	;7Rh(()H4zAJTD1OO$67G<PPQTVYZL



$
$
&C(../qAdjjl>N>NrPQ>R=SSTUXTYZH'K
f}x##$(<<* +	F LL3*./A*B37+K 8''(,AA5 9: $22K K  	F zz(#w.}[7Q7Q%X ::h7*M +	"$&,,.JC % 1#e*rC$'GbRL!"%GauAJ$'GbRL!(+Gd3%t$% /  ;;$$%
O
 ::h7*M::j)5X!0DSE.JKKO)),,-//+.//+.OOM2 * M -&&=+<+<X+F'+Q#'*.
8 $884'	
	 =="g-!''0}}Y'P&QS %  %==.$R):):4)@BRS	X!!	"&;	;0'	
	 =="g-!77@}}YP_7`6ac %  #,--"5+!!$')@	
 ,6mT+J+J!!$'PTI;C,XJ7L2#** ..***!8+F/FG u  s   >BW; ;
X	X	r   )r   r   r   rO   r   z
int | Nonereturndict[str, Any])r   r   r   rO   r   r   )r]   r
   r   zPath | None)
r   r   r]   r
   r   rO   r   zdict[str, str]r   r   ).__doc__
__future__r   r   r   pathlibr   typingr   sqlalchemy.ormr   #app.backend.classes.documents_classr   /app.backend.classes.student_document_file_classr   app.backend.core.configr	   &app.backend.db.models.agents_documentsr
   'app.backend.utils.agents_familia_pie360r   r   r   r   app.backend.utilsr   rP   %app.backend.utils.agents_familia_fillr   r   ,app.backend.utils.agents_family_report_storer   r   'app.backend.utils.agents_psychoped_fillr   r   r   /app.backend.utils.agents_psychoped_report_storer   r   r   r   r    r   ro   r    r!   r   <module>r      s    O "     " > G , M  8 V 

 +  2D1hcc(c c !	c
 cr!   