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m	Z	m
Z
 ddlmZ d)d
dZd*ddZd+d,ddZd-ddZ			d.d/d'd(ZdS )0z@Score sales propensity from transcript + call analytics context.    )annotationsN)AnyDictListOptionalTuple)PropensityParametersHandlertextstrreturn	List[str]c                 C  s&   | sg S t dt| }dd |D S )Nz[\n,;|]+c                 S  s    g | ]}|  r|   qS  )striplower).0pr   r   =/home/aiteam/pcaa-dev/dashboard-backend/propensity_scoring.py
<listcomp>   s     z#_split_keywords.<locals>.<listcomp>)resplitr
   )r	   partsr   r   r   _split_keywords   s   r   haystackkeywordsmax_hitsintTuple[int, List[str]]c                 C  sX   g }| r|s
d|fS |   }|D ]}t||kr n|r%||v r%|| qt||fS )Nr   )r   lenappend)r   r   r   hitsr	   kwr   r   r   _count_keyword_hits   s   
r!   K   -   scorefloathot_minwarm_minc                 C  s   | |krdS | |krdS dS )Nhotwarmcoldr   )r$   r&   r'   r   r   r   _propensity_band    s
   r+   analytics_contextDict[str, Any]Dict[str, float]c                   s   i }t | dp	d }d|v rd|d< nd|v rd|d< t | dp%d  t fd	d
dD r8d|d< t | dp?d  }|rO|dvrOd|d< |S )N	sentiment positiveg      @
_sentimentnegativeg      call_purposec                 3  s    | ]}| v V  qd S )Nr   )r   wpurposer   r   	<genexpr>1   s    z!_context_boost.<locals>.<genexpr>)purchasebookingdemovisitquoteg      @_intentobjections_concerns>   n/anone-g      _objections)r
   getr   anyr   )r,   boostsr/   
objectionsr   r6   r   _context_boost(   s   
rH   bid
transcriptOptional[Dict[str, Any]]configOptional[Any]handler%Optional[PropensityParametersHandler]c              
   C  s  |pi }|pt |p
i }|  || }|sdS t|pd}t|dp&d}| d| }i }	i }
d}d}|D ]}|dpAd}tdt|d	pKd
}tdt|dpWd}t|dpad}t|dpjd}t|dpsd}t|dp|d}t|||\}}t|||\}}t	|td|| ||  }t|dpd
 }|dkrt|}t	||t|  }tt||dd|	|< ||d| d| d| dd|
|< ||7 }||7 }q9|dkrdS tt|| d }tdt	d|}|t|t|	t|
t|ddS ) zFReturn propensity scoring payload or None if no parameters configured.Nr0   summary
g        parameter_name	Parameter   	max_score
   max_keyword_hits   positive_keywordsnegative_keywordspositive_points_per_hit   negative_points_per_hitr   detection_modekeywordhybridT)r$   rU   
applicablezMatched z positive and z negative keyword(s) for .)positive_hitsnegative_hits	reasoningd   
keyword_v1)propensity_scorepropensity_bandpropensity_parameter_scorespropensity_parameter_detectionspropensity_total_possiblepropensity_model)r   ensure_tableget_parametersr
   rD   maxr   r   r!   minr   rH   sumvaluesroundr+   jsondumps)rI   rJ   r,   rL   rN   
parameterstranscript_textsummary_textcombined_textparameter_scoresparameter_detectionstotal_earnedtotal_possibleparamnamerU   r   pos_kwneg_kwpos_ptsneg_pts	pos_countpos_hits	neg_countneg_hitsearnedmoderF   rh   r   r   r   score_call_propensity;   sb   




r   )r	   r
   r   r   )r   r
   r   r   r   r   r   r   )r"   r#   )r$   r%   r&   r   r'   r   r   r
   )r,   r-   r   r.   )NNN)rI   r
   rJ   r
   r,   rK   rL   rM   rN   rO   r   rK   )__doc__
__future__r   ru   r   typingr   r   r   r   r   propensity_parameters_handlerr   r   r!   r+   rH   r   r   r   r   r   <module>   s    


