o
    «=)jÅ>  ã                   @  sè   d Z ddlmZ ddlZddlZddlmZmZmZ ddl	m
Z
 ddlmZ e e¡Zd;dd„Zd<dd„Zd=dd„Zd>dd„Zd?dd„Zd@dd„ZdAd!d"„ZdBd$d%„Z	dCdDd*d+„ZdEd1d2„Z		dFdGd6d7„ZdHd9d:„ZeZeZeZdS )IzV
LeadSquared activity push helpers shared by call_processor and orchestrate_pipeline.
é    )ÚannotationsN)ÚAnyÚDictÚOptional)ÚDatabaseHandler)ÚLeadSquaredServiceÚcallúDict[str, Any]ÚreturnÚstrc                 C  s¨   |   d¡pd ¡ }t|   d¡p|   d¡pdƒ ¡ }|r|S t|   d¡p$dƒ ¡ }t|   d¡p/dƒ ¡ }t|   d¡p:dƒ ¡ }|d	krF|rF|S |dkrN|rN|S |pS|pS|S )
NÚ	directionÚinboundÚcustomer_phoneÚcustomer_callinfoÚ ÚcalltoÚcallfromÚclicktocalldidÚoutbound)ÚgetÚlowerr   Ústrip)r   r   r   r   r   r   © r   úD/home/aiteam/pcaa-dev/dashboard-backend/leadsquared_activity_push.pyÚpick_customer_phone   s    r   Úrawc                 C  s^   |   d¡|   d¡p
d|   d¡pd|   d¡|   d¡|   d¡|   d¡|   d¡|   d¡|   d¡d	œ
S )
z?Shape a raw_calls row (from get_raw_call_details) for LSQ push.Úcallidr   r   Ú	agentnamer   Úagent_callinfor   Úcall_starttime)
r   r   r   r   r   r   r   r   r   r   )r   )r   r   r   r   Úcall_dict_for_lsq_push    s   ör    ÚpayloadÚpathr   c                 C  sD   t | tƒr|s	d S | }| d¡D ]}t |tƒs d S | |¡}q|S )NÚ.)Ú
isinstanceÚdictÚsplitr   )r!   r"   ÚcurrentÚpartr   r   r   Ú_extract_nested_value0   s   
r)   ÚanalysisÚ
source_keyc                   s  d‡ fdd„}d‡fdd„}ˆd	krt ˆ d
ƒ}|d ur|S t ˆ ˆƒ}|d ur(|S ˆ  d¡}t|tƒr@ˆdv r@||ƒ}|d ur@|S |ƒ }ˆdkrRt |dƒ}|d urR|S ˆdv rj| d¡}t|tƒrj||ƒ}|d urj|S dddddœ}	|	 ˆd¡D ]}
t ˆ |
ƒ}|d ur†|  S qwt |ˆƒS )Nr
   r	   c                    s\   t ˆ tƒr
ˆ  d¡nd } t | tƒr%zt | ¡} W n tjy$   d } Y nw t | tƒr,| S i S )NÚraw_response)r$   r%   r   r   ÚjsonÚloadsÚJSONDecodeError)r,   )r*   r   r   Ú_raw_response_payload<   s   
ÿz:_extract_lsq_activity_value.<locals>._raw_response_payloadÚprofiler   c                   s6   |   ˆ ¡}t|tƒr|  d¡p|  d¡p|  d¡S |S )NÚvalueÚsummaryÚevidence)r   r$   r%   )r1   Úprofile_value)r+   r   r   Ú_profile_valueE   s   

z3_extract_lsq_activity_value.<locals>._profile_valueÚsales_intentÚ	sentimentÚcustomer_profile>   ÚneedÚbudgetÚtimelineÚ	authorityÚcustomer_profile_summary)r3   Úoverall_summaryÚrich_summary)r>   )r8   r7   ÚintentÚcall_purpose)Úquality_score)r3   r>   r7   rC   r   )r
   r	   )r1   r	   r
   r   )r)   r   r$   r%   )r*   r   r+   r0   r6   r2   r9   r,   Úraw_profileÚaliasesÚaliasr   )r*   r+   r   Ú_extract_lsq_activity_value;   sH   	





ü
ÿ
rG   ÚvaluesúOptional[str]c                  G  s0   | D ]}|d u r	qt |ƒ ¡ }|r|  S qd S ©N)r   r   )rH   r2   Útextr   r   r   Ú_first_present_strt   s   ÿrL   r2   c                 C  s    t | ttfƒrtj| ddS | S )NF)Úensure_ascii)r$   r%   Úlistr-   Údumps)r2   r   r   r   Ú_lsq_activity_field_value~   s   rP   Útargetc                 C  sX   t | pdƒ ¡ }| ¡ }| d¡r$| ddd¡ ¡ r$d| ddd¡› S |dv r*dS |S )Nr   Úcustomfieldé   Ú
mx_Custom_>   rA   ÚeventdescriptionÚActivityNote)r   r   r   Ú
startswithÚreplaceÚisdigit)rQ   Úcompactr   r   r   r   Ú_normalize_lsq_activity_target„   s   r[   Úrecordc                 C  s<   t | tƒsd S t|  d¡|  d¡|  d¡|  d¡|  d¡ƒS )NÚ
ProspectIDÚLeadIdÚIdÚprospect_idÚlead_id)r$   r%   rL   r   )r\   r   r   r   Ú_lead_id_from_lsq_recordŽ   s   
ûrb   Úactivity_cfgr`   Úintegration_configúOptional[Dict[str, Any]]c                 C  sB  | r|   d¡s	d S t|   d¡ƒ}|sd S |t|ƒ ¡ rt|ƒn|dœ}t|   d¡ƒ}|r0||d< |   d¡p6i }t|tƒrPzt |¡}W n tjyO   i }Y nw g }	h d£}
t|t	ƒr| 
¡ D ]/\}}t|ƒ}|sjq_t|ƒ}t|||ƒ}|d u ryq_||
v r„t|ƒ||< q_|	 |t|ƒdœ¡ q_|	r•|	|d	< d
dlm} ||||ƒS )NÚenabledÚactivity_code)ÚRelatedProspectIdÚActivityEventÚschema_nameÚ
SchemaNameÚfield_mappings>   rV   ÚActivityDateTimeÚIncludeLeadScoreÚProcessFilesAsyncÚActivityOwnerEmailÚValidateDropDownOptions)rk   ÚValueÚFieldsr   )Úapply_lsq_agent_attribution)r   rL   r   rY   Úintr$   r-   r.   r/   r%   Úitemsr[   rG   rP   ÚappendÚlsq_activity_helpersrt   )rc   r*   r   r`   rd   rg   r!   rj   rl   ÚfieldsÚtop_level_targetsr+   Ú
target_keyrQ   r2   rt   r   r   r   Úbuild_lsq_activity_payloadš   sH   þ
ÿ
r|   Údbr   ÚbidÚphonesú	list[str]c                 C  sp   |D ]3}t |ƒ}|sq|  |d|¡}|sq| d¡pi }t | d¡| d¡| d¡| d¡ƒ}|r5|  S qd S )NÚleadsquaredÚlead_payloadr]   r^   r_   Úexternal_lead_id)rL   Úget_cached_crm_lead_by_phoner   )r}   r~   r   Ú	raw_phoneÚphoneÚcachedr!   ra   r   r   r   Ú_cached_lsq_prospect_idÕ   s$   üÿrˆ   Úservicer   úOptional[DatabaseHandler]c                 C  s˜  |  d¡|  d¡t|ƒ|  d¡|  d¡|  d¡g}g }tƒ }|D ]}t|ƒ}	|	r,|	|v r-q | |	¡ | |	¡ q |d urT|d urTt|||ƒ}
|
rTt d||  d¡¡ |
S t|  d¡ƒpat|  d¡ƒ}|D ]4}	|  	|	¡}|  d	¡r˜|  d
¡}t
|tƒr‰|r‰t|d ƒ}|rˆ|  S qdt
|tƒr˜t|ƒ}|r˜|  S qd|rÊ|  |¡}|  d	¡rÊ|  d
¡}t
|tƒr½|r½t|d ƒ}|r»|S d S t
|tƒrÊt|ƒ}|rÊ|S d S )Nr   r   r   r   r   z8[%s] Matched LeadSquared lead from cache by phone for %sr   Úcustomer_emailÚsuccessÚdatar   )r   r   ÚsetrL   Úaddrw   rˆ   ÚloggerÚinfoÚsearch_lead_by_phoner$   rN   rb   r%   Úsearch_lead_by_email)r‰   r   r*   r}   r~   Úphone_candidatesr   Úseenr…   r†   Ú	cached_idÚemailÚphone_resultr   ra   Úemail_resultr   r   r   Úresolve_lsq_prospect_idé   sb   ú



ÿ
€



ûrš   ÚNonec                 C  sŽ  |  | d¡pi }| d¡r| d¡sd S | d¡pi }| d¡s"d S | | d¡p)i }| d¡r4| d¡s6d S t|d |d | d¡d	}| d
¡pJi }t|tƒsRd S t| d¡| d¡t|ƒ| d¡| d¡ƒ}	t||||| d}
|
s¥d}t	 
d| | d¡¡ z|j| dd| d¡|	|d W d S  ty¤   t	 d| | d¡¡ Y d S w | ¡ D ]\}}zÏt||||
|d}|sâz|j| dd| d¡|	|
|dd W n tyß   t	 d| | d¡¡ Y nw W q©| |¡}| d¡r:t	 
d| | d¡|| d¡p| d¡pd ¡ pd¡ z|j| dd| d¡|	|
|| d ¡d!|| d"¡d# W nV ty9   t	 d| | d¡¡ Y nCw t	 d$| | d¡|| d%¡¡ z|j| dd&| d¡|	|
|| d ¡| d%¡|| d"¡d# W n ty{   t	 d| | d¡¡ Y nw W q© tyÄ } z:t	 d'| | d¡|¡ z|j| dd&| d¡|	|
|t|ƒd W n ty¹   t	 d| | d¡¡ Y nw W Y d }~q©d }~ww d S )(Nr   Ú	is_activeÚhas_credentialsÚconfigrf   Ú
access_keyÚ
secret_keyÚapi_host)rŸ   r    r¡   Ú
activitiesr   r   r   r   )r}   r~   z*No LeadSquared lead matched the call phonezP[%s] Skipping LeadSquared push for %s because no LSQ lead matched the call phoner   Úskipped)r~   ÚproviderÚstatusr   Ú
lead_phoneÚmessagez0[%s] Failed to write LeadSquared push log for %s)rd   z-Activity is disabled or missing activity code)r~   r¤   r¥   r   r¦   Úcrm_lead_idÚactivity_keyr§   rŒ   z<[%s] LeadSquared activity pushed for %s activity=%s agent=%sr   Ú
agent_namer   ú?Úpushedri   z(LeadSquared activity pushed successfullyr   )r~   r¤   r¥   r   r¦   r¨   r©   Úactivity_eventr§   Úpayload_previewÚresponse_previewz<[%s] LeadSquared activity push failed for %s activity=%s: %sr§   ÚfailedzD[%s] Exception while pushing LeadSquared activity for %s activity=%s)Úget_crm_integrationr   Úget_crm_credentialsr   r$   r%   rL   r   rš   r   r‘   Úlog_crm_pushÚ	ExceptionÚ	exceptionrv   r|   Úcreate_activityr   Úwarningr   )r~   r   r*   r}   Úintegrationrž   Úcredsr‰   r¢   r¦   r`   r§   r©   rc   r!   ÚresultÚexcr   r   r   Úpush_leadsquared_activities%  s  
ý
ûýú
þþ
ÿ
ø
ÿ
$û
õÿû
õÿ€ü
ø
ÿ€î»r¼   )r   r	   r
   r   )r   r	   r
   r	   )r!   r	   r"   r   r
   r   )r*   r	   r   r	   r+   r   r
   r   )rH   r   r
   rI   )r2   r   r
   r   )rQ   r   r
   r   )r\   r	   r
   rI   rJ   )rc   r	   r*   r	   r   r	   r`   r   rd   re   r
   re   )r}   r   r~   r   r   r€   r
   rI   )NN)r‰   r   r   r	   r*   r	   r}   rŠ   r~   rI   r
   rI   )
r~   r   r   r	   r*   r	   r}   r   r
   r›   )Ú__doc__Ú
__future__r   r-   ÚloggingÚtypingr   r   r   Ú
db_handlerr   Úleadsquared_servicer   Ú	getLoggerÚ__name__r   r   r    r)   rG   rL   rP   r[   rb   r|   rˆ   rš   r¼   Ú_lsq_build_activity_payloadÚ_lsq_resolve_prospect_idÚ_push_leadsquared_activitiesr   r   r   r   Ú<module>   s6    





9




û
;û
< 