Ë
    I»j
  ã                   óH   — d Z ddlmZ ddlmZmZmZ ddlmZ  G d„ d«      Z	y)z"AI job matching / recommendations.é    )Ú	JobStatus)ÚJobMatchItemÚJobMatchingRequestÚJobMatchingResponse)Úgenerate_jsonc                   ó   — e Zd Zdedefd„Zy)ÚJobMatchingServiceÚpayloadÚreturnc              ƒ   óˆ  ‡K  — d}d‰j                   › d‰j                  › d‰j                  › d‰j                  › d‰j                  › d‰j
                  xs ‰j                  › d‰j                  d d	 › d
‰j                  › �}dt        fˆfd„}t        |||¬«      ƒ d {  –—† \  }}}|j                  d«      xs g D �cg c]¿  }t        |t        «      r­|j                  d«      rœt        t        |j                  dd«      «      |j                  d«      |j                  d«      t        |j                  d«      xs g «      t        |j                  d«      xs g «      t        |j                  d«      xs g «      ¬«      ‘ŒÁ }	}t!        ‰j"                  ‰j                   t$        j&                  |d|› �|	¬«      S 7 �Œc c}w ­w)NzˆRank jobs for a candidate. Return JSON: {"recommendations":[{"job_id","title","match_score","reasons":[],"skill_overlap":[],"gaps":[]}]}zCandidate: z	
Skills: z
Experience years: z
Interests: z
Goals: z	
Resume: z

Catalog: é2   z
Limit: r   c                  ó  •— g } t        ‰	j                  d ‰	j                   «      D �]3  \  }}t        |t        «      sŒt        |j                  d«      xs |j                  d«      xs d|dz   › �«      }|j                  d«      }|j                  d«      xs g D �cg c]  }t        |«      ‘Œ }}‰	j                  D �cg c]	  }||v sŒ|‘Œ c}xs ‰	j                  d d }t        dd	d
t        |«      z  z   «      }| j                  ||t        |d«      d‰	j                  s‰	j                  rdndg||D �cg c]  }|‰	j                  vsŒ|‘Œ c}d d dœ«       �Œ6 | sddddg‰	j                  d d g dœg} d| iS c c}w c c}w c c}w )NÚjob_idÚidzjob-é   ÚtitleÚskillsé   gffffffî?gš™™™™™á?g{®Gáz´?z$Skill overlap with candidate profilez#Aligned with stated interests/goalszRole title proximityé   ©r   r   Úmatch_scoreÚreasonsÚskill_overlapÚgapszplaceholder-1zSuggested role matchg333333ã?u3   Insufficient catalog â€” return baseline suggestioné   Úrecommendations)Ú	enumerateÚjob_catalogÚlimitÚ
isinstanceÚdictÚstrÚgetr   ÚminÚlenÚappendÚroundÚ	interestsÚcareer_goals)
ÚrecsÚiÚjobr   r   ÚsÚ
job_skillsÚoverlapÚscorer
   s
            €ú3/var/www/html/TJ-AI/tj/app/services/job_matching.pyÚlocalz+JobMatchingService.recommend.<locals>.local   s¨  ø€ ØˆDÜ# G×$7Ñ$7¸¸'¿-¹-Ð$H×I‘��3Ü! #¤tÔ,ØÜ˜SŸW™W XÓ.ÒQ°#·'±'¸$³-ÒQÀTÈ!ÈaÉ%ÈÀ>ÓR�ØŸ™ Ó(�Ø/2¯w©w°xÓ/@Ò/FÀBÐ/FÓHÑ/F¨œc !�fÐ/F�
ÐHØ&-§n¢nÓH¡n ¸¸Zºš1 nÑHÒ^ÈGÏNÉNÐ[]Ð\]ÐL^�Ü˜D $¨´°G³Ñ)<Ñ"<Ó=�Ø—‘à"(Ø!&Ü',¨U°A£àBà&×0Ò0°G×4HÒ4Hñ Bà!7ð	$ð *1Ù,6Ó R©J q¸!À7Ç>Á>Ò:Q¢¨JÑ RÐSUÐTUÐ Vñöð Jñ. ð #2Ø!7Ø'*Ø$YÐ#ZØ)0¯©¸¸Ð);Ø "ñð	�ð & tÐ,Ð,ùò; IùÚHùò !Ss   ÂE;Â?	F Ã	F Ä6FÅ
F)ÚsystemÚuserÚlocal_factoryr   r   Ú r   r   r   r   r   r   zJob matching via )Úcorrelation_idÚcandidate_idÚstatusÚstubÚmessager   )r8   r   Úexperience_yearsr(   r)   Úresume_textÚresume_structuredr   r   r!   r   r#   r    r   r"   Úlistr   r7   r   Ú	SUCCEEDED)
Úselfr
   r3   r4   r2   Údatar:   ÚproviderÚrr   s
    `        r1   Ú	recommendzJobMatchingService.recommend	   sÐ  øè ø€ ðhð 	ð
 ˜'×.Ñ.Ð/¨z¸'¿.¹.Ð9Ið J!Ø!(×!9Ñ!9Ð :¸-È×HYÑHYÐGZð [Ø×*Ñ*Ð+¨:°g×6IÑ6IÒ6fÈW×MfÑMfÐ5gð hØ×+Ñ+¨C¨RÐ0Ð1°¸7¿=¹=¸/ðKð 	ð$	-”tõ $	-ôL &3Ø °Eô&
÷  
Ñˆˆd�Hð —h‘hÐ0Ó1Ò7°RÐ7ó
ñ 8�Ü˜!œTÔ" q§u¡u¨X¤ô Ü˜1Ÿ5™5 ¨2Ó.Ó/Ø—e‘e˜G“nØŸE™E -Ó0Ü˜QŸU™U 9Ó-Ò3°Ó4Ü" 1§5¡5¨Ó#9Ò#?¸RÓ@Ü˜!Ÿ%™% ›-Ò-¨2Ó.öð 8ð 	ð 
ô #Ø"×1Ñ1Ø ×-Ñ-Ü×&Ñ&ØØ'¨ zÐ2Ø+ô
ð 	
ð 
ûò
ùs%   ƒBGÂF:ÂGÂ>CF=Æ9GÆ=GN)Ú__name__Ú
__module__Ú__qualname__r   r   rE   © ó    r1   r	   r	      s   „ ðH
Ð'9ð H
Ð>Qô H
rJ   r	   N)
Ú__doc__Úapp.schemas.commonr   Úapp.schemas.job_matchingr   r   r   Úapp.services.ai_generater   r	   rI   rJ   r1   Ú<module>rO      s    ðÙ (å (ß ZÑ ZÝ 2÷I
ò I
rJ   