o
     á¡hB1  ã                   @  sà   d dl mZ d dlZd dlmZmZmZmZ d dlmZm	Z	m
Z
 d dlmZ eƒ Zdd„ Zd5dd„Zd6dd„Zd7dd„Zd8dd„Zd9dd„Zd:d;dd„Zd<d!d"„Zd9d#d$„Zd=d>d)d*„Zd9d+d,„Zd-Zd9d.d/„Zd?d@d3d4„ZdS )Aé    )ÚannotationsN)ÚAnyÚDictÚListÚTuple)ÚdatetimeÚtimezoneÚdate)Ú
get_clientc                   C  s   t  tj¡ ¡ S ©N)r   Únowr   ÚutcÚ	isoformat© r   r   ú'/var/www/html/bot/app/sync2/pipeline.pyÚ_now_iso   s   r   ÚsÚstrÚreturnc                 C  s   t  dd| pd¡ ¡ S )Nú\s+Ú )ÚreÚsubÚupper©r   r   r   r   Ú
_norm_name   s   r   Úsetc                 C  s   t dd„ t d| p
d¡D ƒƒS )Nc                 S  s   g | ]}|r|‘qS r   r   )Ú.0Útr   r   r   Ú
<listcomp>   ó    z _dept_tokens.<locals>.<listcomp>u   [\/\s>\-Â·]r   )r   r   Úsplitr   r   r   r   Ú_dept_tokens   s   r"   ÚaÚbÚfloatc                 C  s*   | s|sdS t | |@ ƒtdt | |B ƒƒ S )Nç        é   )ÚlenÚmax)r#   r$   r   r   r   Ú_jaccard   s   r*   c                   sd   t  dd| pd¡‰ t  dd|pd¡‰ˆ rˆsdS ˆ ˆkrdS g d¢}t‡ ‡fdd„|D ƒƒr0dS dS )	Nr   r   r&   ç      ð?)u	   ì‚¬ë¬´ê´€u	   ì„œê¸°ê´€u	   ì£¼ë¬´ê´€u   êµ­ìž¥u   ê³¼ìž¥u   ì‹¤ìž¥c                 3  s     | ]}|ˆ v o|ˆv V  qd S r   r   )r   Úk©ÚAÚBr   r   Ú	<genexpr>"   s   € z"_pos_similarity.<locals>.<genexpr>g333333ã?)r   r   Úany)r#   r$   Úkeysr   r-   r   Ú_pos_similarity   s    r3   Úbatch_idc                 C  s   t  d¡ | ddœ¡ ¡  d S )NÚingest_batchesÚRUNNING)r4   Ústatus)ÚsbÚtableÚinsertÚexecute)r4   r   r   r   Ústart_batch%   s   
ÿ
r<   Ú	COMPLETEDÚsource_summaryúDict[str, int] | Nonec                 C  s.   t  d¡ tƒ ||pi dœ¡ d| ¡ ¡  d S )Nr5   )Úfinished_atr7   r>   r4   )r8   r9   Úupdater   Úeqr;   )r4   r7   r>   r   r   r   Úfinish_batch*   s
   
þrC   ÚrowsúList[Dict[str, Any]]c                 C  sz   g }|D ](}|  | |d | d¡pd ¡ | d¡| d¡| d¡| d¡| d¡d	œ¡ q|r;t d
¡ |¡ ¡  d S d S )NÚsourceÚnamer   Ú
departmentÚpositionÚphoneÚtaskÚraw)r4   rF   rG   rH   rI   rJ   rK   rL   Ústaging_gov_staff)ÚappendÚgetÚstripr8   r9   r:   r;   )r4   rD   ÚpayloadÚrr   r   r   Úingest_staging1   s   
ø
ÿrS   c                   sÆ  t  d¡ d¡ d| ¡ ¡ jpg }t  d¡ d¡ ¡ jpg }t  d¡ d¡ ¡ jp*g }i }|D ]}| |d g ¡ |¡ q/g }|D ]‘}t|d ƒ}| 	d	¡pOd
 
¡ ‰ t| 	d¡pYd
ƒ}	| 	d¡pad
}
|D ]m}t|d ƒ|kroqdd}ˆ r‡t‡ fdd„| 	|d g ¡D ƒƒr‡d}n7d}d}| 	|d g ¡D ]}t|t|	t| 	d¡p d
ƒƒƒ}t|t|
| 	d¡ƒƒ}q“ttd|d |d  ƒdƒ}|dkrÑ| | |d |d |i dœ¡ qdqA|rát  d¡ |¡ ¡  d S d S )NrM   Ú*r4   Úperson_registryzperson_id,canonical_nameÚgov_staff_currentÚ	person_idrG   rJ   r   rH   rI   Úcanonical_namer&   c                 3  s"    | ]}ˆ |  d ¡pdkV  qdS )rJ   r   N©rO   )r   Úx©Ús_phoner   r   r0   Y   s   €  z#build_candidates.<locals>.<genexpr>r+   gÍÌÌÌÌÌì?g      à?gš™™™™™Ù?é   Ú
staging_id)r4   r^   Úcandidate_person_idÚscoreÚfeaturesÚmatch_candidates)r8   r9   ÚselectrB   r;   ÚdataÚ
setdefaultrN   r   rO   rP   r"   r1   r)   r*   r3   ÚroundÚminr:   )r4   ÚstÚpersonsÚcurrentÚcurrent_by_personrR   Úcandsr   Ús_name_normÚs_deptÚs_posÚpr`   Ú	best_deptÚbest_posrZ   r   r[   r   Úbuild_candidatesB   sJ   "&û€íÿrs   ç333333ë?çš™™™™™¹?ÚhiÚmarginc              	   C  sx  t  d¡ d¡ d| ¡ d¡jddd ¡ jpg }i }|D ]}| |d g ¡ |¡ qt  d¡ d¡ d| ¡ ¡ jp;g }d	d
„ |D ƒ}g }| 	¡ D ]A\}	}
|
d }t
|d ƒ}t|
ƒdkret
|
d d ƒnd}||kr|| |kr| | |	|d d|dœ¡ qI| | |	d d|dœ¡ qIt| ¡ ƒ}|D ]}||vr¤| | |d dddœ¡ q“|r¸|D ]}t  d¡j|dd ¡  q©d S d S )Nrb   rT   r4   r^   r`   T)ÚdescrM   c                 S  s   g | ]}|d  ‘qS ©r^   r   ©r   rR   r   r   r   r   }   r    zauto_decide.<locals>.<listcomp>r   r'   r&   r_   ÚAUTO)r4   r^   rW   Údecisionr`   ÚPENDINGr+   Úmatch_decisionszbatch_id,staging_id©Úon_conflict)r8   r9   rc   rB   Úorderr;   rd   re   rN   Úitemsr%   r(   r   r2   Úupsert)r4   rv   rw   rD   Ú
by_stagingrR   Úst_rowsÚ
all_st_idsÚ	decisionsr^   rl   ÚtopÚ	top_scoreÚsecondÚstaged_with_candsÚsidÚdr   r   r   Úauto_decideq   s`   ÿþþ" 
û
û	û€ýrŽ   c              
   C  s–   t  d¡ d¡ d| ¡ ¡ jpg }g }|D ]%}t  d¡ d|d i¡ ¡ j}|d d }| | |d	 |d
dddœ¡ q|rIt  d¡ |¡ ¡  d S d S )NrM   rT   r4   rU   rX   rG   r   rW   r^   r{   r+   Ú	bootstrap)r4   r^   rW   r|   r`   Ú	rationaler~   )r8   r9   rc   rB   r;   rd   r:   rN   )r4   rh   Údecsr   rR   Úpidr   r   r   Úseed_batch_as_newª   s    "
úÿr“   Tc                 C  sJ  t  d¡ d¡ d| ¡ ¡ jpg }dd„ |D ƒ}t  d¡ d¡ d| ¡ ¡ jp(g }t  d¡ d¡ ¡ jp5g }dd„ |D ƒ}d2dd„}g }g }tƒ }	|D ]ý}
|
d dvrTqK| |
d ¡}|s^qK|
 d¡}|szt  d¡ d|d i¡ ¡ j}|d d }t  d¡ 	dt
ƒ i¡ d|¡ ¡  ||d f}|	 |¡ | |¡}||d | d¡| d¡| d¡| d¡| d¡d| t
ƒ dœ
}g }|d u rÄdg}ne| d¡pÊd | d¡pÐd kr×| d!¡ | d¡pÝd | d¡pãd krê| d"¡ | d¡pðd | d¡pöd krý| d#¡ | d¡pd | d¡pd kr| d$¡ | d¡pd | d¡p!d kr)| d%¡ | | ||d |r8d& |¡nd'||ƒ||ƒd(œ¡ | |¡ qK| ¡ D ]6\\}}}| d)¡r‚||f|	vr‚| | ||d*||ƒd+d+d+d+d+d+d,œd(œ¡ | i |¥d-t
ƒ d.œ¥¡ qM|r‘t  d/¡ |¡ ¡  |D ]}t  d¡j|d0d1 ¡  q“d S )3NrM   rT   r4   c                 S  s   i | ]}|d  |“qS ry   r   rz   r   r   r   Ú
<dictcomp>Á   s    z#apply_decisions.<locals>.<dictcomp>r~   rV   c                 S  s   i | ]}|d  |d f|“qS )rW   rF   r   rz   r   r   r   r”   Å   s    rZ   údict | Noner   Údictc                 S  sV   | pi } |   d¡p
d|   d¡pd|   d¡pd|   d¡pd|   d¡p"d|   d¡p(ddœS )	NrF   ú-rH   rI   rG   rJ   rK   ©rF   rH   rI   rG   rJ   rK   rY   )rZ   r   r   r   Ú	fill_fullÇ   s   úz"apply_decisions.<locals>.fill_fullr|   )r{   ÚMANUALr^   rW   rU   rX   rG   r   Úlast_seen_atrF   rH   rI   rJ   rK   T)
rW   rF   rG   rH   rI   rJ   rK   Ú	is_activeÚlast_seen_batchÚ
updated_atÚNEWr   ÚMOVEÚCHANGE_POSITIONÚCHANGE_PHONEÚCHANGE_TASKÚCHANGE_NAMEú,Ú	NO_CHANGE)r4   rW   rF   Ú
event_typeÚprevÚnextrœ   ÚDEPARTEDr—   r˜   F)rœ   rž   Úgov_staff_eventszperson_id,sourcer   )rZ   r•   r   r–   )r8   r9   rc   rB   r;   rd   r   rO   r:   rA   r   ÚaddrN   Újoinr‚   rƒ   )r4   r…   Úst_by_idr‘   Úcurr_allÚcurr_keyr™   ÚeventsÚupsertsÚseenr   r   r’   rR   Úkeyr¨   Únext_rowÚkindsÚsrcÚrowr   r   r   Úapply_decisions¾   s–   ""

"

ö


"
"
ú	þú€ÿr¹   éˆ  ÚlimitÚintc              
   C  sL  zt  d¡ d¡ dd¡ | ¡ ¡ j}|rdd„ |D ƒW S W n	 ty'   Y nw z4t  d¡ d¡ | ¡ ¡ j}|r[g }|D ]}| d| 	d	¡| 	d
¡| 	d¡| 	d¡|dœ¡ q=|W S W n	 tye   Y nw z5t  d¡ d¡ | ¡ ¡ j}|r™g }|D ]}| d| 	d	¡| 	d
¡| 	d¡| 	d¡|dœ¡ q{|W S W g S  ty¥   Y g S w )NÚ	gov_staffzname,department,position,phonerF   ÚMOTIEc                 S  s    g | ]}d di|¥d|i¥‘qS )rF   r¾   rL   r   rz   r   r   r   r   0  s     z,load_motie_from_existing.<locals>.<listcomp>Úmotie_org_peoplerT   rG   rH   rI   rJ   )rF   rG   rH   rI   rJ   rL   Ú	motie_org)
r8   r9   rc   rB   r»   r;   rd   Ú	ExceptionrN   rO   )r»   rd   rD   rR   r   r   r   Úload_motie_from_existing+  s\   $ÿÿ
úõÿ
úõýýrÂ   )r   r   r   r   )r   r   r   r   )r#   r   r$   r   r   r%   )r#   r   r$   r   r   r%   )r4   r   )r=   N)r4   r   r>   r?   )r4   r   rD   rE   )rt   ru   )r4   r   rv   r%   rw   r%   )rº   )r»   r¼   r   rE   )Ú
__future__r   r   Útypingr   r   r   r   r   r   r	   Úapp.services.supabase_servicer
   r8   r   r   r"   r*   r3   r<   rC   rS   rs   rŽ   r“   ÚNAME_CHANGED_AS_NEWr¹   rÂ   r   r   r   r   Ú<module>   s(   






/
9
m